]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/EnvironmentRequest.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / EnvironmentRequest.java
index 2e37adee82f5fa26c98b68e767e3fe9bb346481c..edb40f642ad20a984d9cb8ba38523f31b7857620 100644 (file)
@@ -4,10 +4,12 @@ import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.common.request.ParametrizedPrimitiveRead;
 import org.simantics.db.common.request.UnaryRead;
+import org.simantics.db.common.utils.CommonDBUtils;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.layer0.internal.SimanticsInternal;
 import org.simantics.db.procedure.Listener;
 import org.simantics.db.request.Read;
+import org.simantics.layer0.Layer0;
 import org.simantics.scl.compiler.environment.Environment;
 import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;
 import org.simantics.scl.compiler.module.repository.ImportFailureException;
@@ -15,11 +17,14 @@ import org.simantics.scl.compiler.module.repository.UpdateListener;
 import org.simantics.scl.osgi.SCLOsgi;
 import org.simantics.scl.runtime.SCLContext;
 import org.simantics.utils.datastructures.Pair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Finds the environment of a model or other index root.
  */
 public abstract class EnvironmentRequest extends UnaryRead<Resource, Pair<EnvironmentSpecification, Environment>> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(EnvironmentRequest.class);
 
     public EnvironmentRequest(Resource parameter) {
         super(parameter);
@@ -78,6 +83,7 @@ public abstract class EnvironmentRequest extends UnaryRead<Resource, Pair<Enviro
                         }
                     });
                 } catch (DatabaseException e) {
+                    LOGGER.error("Finding environment failed", e);
                     callback.exception(e);
                     return;
                 }
@@ -86,6 +92,7 @@ public abstract class EnvironmentRequest extends UnaryRead<Resource, Pair<Enviro
                         environmentSpecification, listener);
             callback.execute(env);
         } catch (ImportFailureException e) {
+            LOGGER.error("Finding environment failed", e);
             callback.exception(new DatabaseException(e));
         }
 
@@ -98,46 +105,57 @@ public abstract class EnvironmentRequest extends UnaryRead<Resource, Pair<Enviro
                 "Builtin", "",
                 "StandardLibrary", "");
         fillEnvironmentSpecification(environmentSpecification);
-        Resource mainModule = Layer0Utils.getPossibleChild(graph, parameter, getRootModuleName());
+        Resource mainModule = CommonDBUtils.getPossibleChild(graph, parameter, getRootModuleName());
         String mainModuleUri;
         if(mainModule != null) {
             mainModuleUri = graph.getURI(mainModule);
             environmentSpecification.importModule(mainModuleUri, "");
+            Layer0 L0 = Layer0.getInstance(graph);
+            for(Resource l : graph.getObjects(parameter, L0.IsLinkedTo)) {
+                mainModule = CommonDBUtils.getPossibleChild(graph, l, "SCLMain");
+                if(mainModule != null)
+                    environmentSpecification.importModule(graph.getURI(mainModule), "");
+            }
         }
         else
             mainModuleUri = graph.getURI(parameter) + "/#"; // Add something dummy to the model uri that cannot be in a real URI
 
-        return Pair.make(environmentSpecification, graph.syncRequest(new ParametrizedPrimitiveRead<String, Environment>(mainModuleUri) {
-
-            UpdateListenerImpl sclListener;
-
-            @Override
-            public void register(ReadGraph graph, Listener<Environment> procedure) {
-
-                SCLContext context = SCLContext.getCurrent();
-                Object oldGraph = context.put("graph", graph);
-                try {
-
-                    if(procedure.isDisposed()) {
-                        getEnvironment(environmentSpecification, procedure, null);
-                    } else {
-                        sclListener = new UpdateListenerImpl(environmentSpecification, procedure);
-                        sclListener.notifyAboutUpdate();
+        try {
+            return Pair.make(environmentSpecification, graph.syncRequest(new ParametrizedPrimitiveRead<String, Environment>(mainModuleUri) {
+    
+                UpdateListenerImpl sclListener;
+    
+                @Override
+                public void register(ReadGraph graph, Listener<Environment> procedure) {
+    
+                    SCLContext context = SCLContext.getCurrent();
+                    Object oldGraph = context.put("graph", graph);
+                    try {
+    
+                        if(procedure.isDisposed()) {
+                            getEnvironment(environmentSpecification, procedure, null);
+                        } else {
+                            sclListener = new UpdateListenerImpl(environmentSpecification, procedure);
+                            sclListener.notifyAboutUpdate();
+                        }
+    
+                    } finally {
+                        context.put("graph", oldGraph);
                     }
-
-                } finally {
-                    context.put("graph", oldGraph);
+    
                 }
-
-            }
-
-            @Override
-            public void unregistered() {
-                if(sclListener != null)
-                    sclListener.stopListening();
-            }
-
-        }));
+    
+                @Override
+                public void unregistered() {
+                    if(sclListener != null)
+                        sclListener.stopListening();
+                }
+    
+            }));
+        } catch(DatabaseException e) {
+            LOGGER.error("Environment request failed", e);
+            throw e;
+        }
     }
 
     @Override