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=00df313ad4e34eaed68253b4ccc93640f52d1c79;hb=f377d6a9b29b3a15bc85b7735ec483d70c185a6e;hp=77f6a6f11ee1e298c1fa104d3fa0b6ef4f97ff3b;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;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 77f6a6f11..00df313ad 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 @@ -2,6 +2,7 @@ package org.simantics.scl.db; import java.io.IOException; +import org.cojen.classfile.TypeDesc; import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; @@ -21,6 +22,14 @@ import org.simantics.db.service.ClusterControl; import org.simantics.db.service.SerialisationSupport; import org.simantics.db.service.VirtualGraphSupport; import org.simantics.layer0.utils.triggers.IActivationManager; +import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification; +import org.simantics.scl.compiler.errors.Failable; +import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator; +import org.simantics.scl.compiler.module.Module; +import org.simantics.scl.compiler.module.repository.ImportFailureException; +import org.simantics.scl.compiler.runtime.RuntimeEnvironment; +import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.osgi.SCLOsgi; import org.simantics.scl.runtime.SCLContext; import org.simantics.scl.runtime.function.Function; import org.simantics.scl.runtime.function.Function1; @@ -263,4 +272,75 @@ public class SCLFunctions { return graph.syncRequest(new SCLUnaryRead(fn, value), TransientCacheAsyncListener.instance()); } + + private static class Subquery implements Read { + Function q; + + public Subquery(Function q) { + this.q = 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); + } + } + + @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 { + return graph.syncRequest(new Subquery(q)); + } + + public static Object subqueryC(ReadGraph graph, Function q) throws DatabaseException { + return graph.syncRequest(new Subquery(q), TransientCacheAsyncListener.instance()); + } + + public static Object possibleFromDynamic(Type expectedType, String moduleName, Object value) { + + try { + + + Failable failable = SCLOsgi.MODULE_REPOSITORY.getModule(moduleName); + Module module = failable.getResult(); + + RuntimeEnvironment env = SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment( + EnvironmentSpecification.of(moduleName, ""), module.getParentClassLoader()); + + JavaTypeTranslator tr = new JavaTypeTranslator(env.getEnvironment()); + TypeDesc desc = tr.toTypeDesc(expectedType); + String className = desc.getFullName(); + Class clazz = env.getMutableClassLoader().loadClass(className); + if (!clazz.isAssignableFrom(value.getClass())) + return null; + + } catch (ImportFailureException | ClassNotFoundException e) { + } + return value; + } + }