X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.db%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fdb%2FSCLFunctions.java;h=aae7a89a26da69df9dc3e40360729ec673b754ed;hb=refs%2Fchanges%2F35%2F1235%2F4;hp=da88b72c063ab2bb2862156f1f39afe5058839c9;hpb=b499fdaf906ac65f88496a4e5a28a92df4a6eb6d;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java b/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java index da88b72c0..aae7a89a2 100644 --- a/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java +++ b/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java @@ -13,6 +13,7 @@ import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; import org.simantics.db.common.request.BinaryRead; import org.simantics.db.common.request.DelayedWriteRequest; import org.simantics.db.common.request.ReadRequest; +import org.simantics.db.common.request.UnaryRead; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.common.request.WriteResultRequest; import org.simantics.db.exception.DatabaseException; @@ -53,25 +54,19 @@ public class SCLFunctions { } public static void asyncRead(final Function f) throws DatabaseException { - final SCLContext context = SCLContext.getCurrent(); - Object graph = context.get(GRAPH); - if (graph != null) { - f.apply(Tuple0.INSTANCE); - } else { - Simantics.getSession().asyncRequest(new ReadRequest() { - @Override - public void run(ReadGraph graph) throws DatabaseException { - SCLContext.push(context); - ReadGraph oldGraph = (ReadGraph)context.put(GRAPH, graph); - try { - f.apply(Tuple0.INSTANCE); - } finally { - context.put(GRAPH, oldGraph); - SCLContext.pop(); - } + final SCLContext context = SCLContext.createDerivedContext(); + Simantics.getSession().asyncRequest(new ReadRequest() { + @Override + public void run(ReadGraph graph) throws DatabaseException { + SCLContext.push(context); + context.put(GRAPH, graph); + try { + f.apply(Tuple0.INSTANCE); + } finally { + SCLContext.pop(); } - }); - } + } + }); } public static T syncRead(final Function f) throws DatabaseException { @@ -97,25 +92,19 @@ public class SCLFunctions { } public static void asyncWrite(final Function f) throws DatabaseException { - final SCLContext context = SCLContext.getCurrent(); - Object graph = context.get(GRAPH); - if (graph != null) { - f.apply(Tuple0.INSTANCE); - } else { - Simantics.getSession().asyncRequest(new WriteRequest() { - @Override - public void perform(WriteGraph graph) throws DatabaseException { - SCLContext.push(context); - ReadGraph oldGraph = (ReadGraph)context.put(GRAPH, graph); - try { - f.apply(Tuple0.INSTANCE); - } finally { - context.put(GRAPH, oldGraph); - SCLContext.pop(); - } + SCLContext context = SCLContext.createDerivedContext(); + Simantics.getSession().asyncRequest(new WriteRequest() { + @Override + public void perform(WriteGraph graph) throws DatabaseException { + SCLContext.push(context); + context.put(GRAPH, graph); + try { + f.apply(Tuple0.INSTANCE); + } finally { + SCLContext.pop(); } - }); - } + } + }); } public static T syncWrite(final Function f) throws DatabaseException { @@ -275,43 +264,17 @@ public class SCLFunctions { } - private static class Subquery implements Read { - Function q; + private static class Subquery extends UnaryRead { public Subquery(Function q) { - this.q = q; + super(q); } @Override public Object perform(ReadGraph graph) throws DatabaseException { - SCLContext sclContext = SCLContext.getCurrent(); - Object oldGraph = sclContext.put("graph", graph); - try { - return q.apply(Tuple0.INSTANCE); - } catch (Throwable e) { - if(e instanceof DatabaseException) - throw (DatabaseException)e; - else - throw new DatabaseException(e); - } finally { - sclContext.put("graph", oldGraph); - } + return Simantics.applySCLRead(graph, parameter, Tuple0.INSTANCE); } - @Override - public int hashCode() { - return q.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if(this == obj) - return true; - if(obj == null || obj.getClass() != getClass()) - return false; - Subquery other = (Subquery)obj; - return q.equals(other.q); - } } public static Object subquery(ReadGraph graph, Function q) throws DatabaseException { @@ -324,15 +287,14 @@ public class SCLFunctions { public static void subqueryL(ReadGraph graph, Function query, Function executeCallback, Function1 exceptionCallback, Function1 isDisposedCallback) throws DatabaseException { graph.asyncRequest(new Subquery(query), new SyncListenerAdapter() { - @Override - public void execute(ReadGraph graph, Object result) { - executeCallback.apply(result); + public void execute(ReadGraph graph, Object result) throws DatabaseException { + Simantics.applySCLRead(graph, executeCallback, result); } @Override - public void exception(ReadGraph graph, Throwable t) { - exceptionCallback.apply(t); + public void exception(ReadGraph graph, Throwable t) throws DatabaseException { + Simantics.applySCLRead(graph, exceptionCallback, t); } @Override