]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphModuleSourceRepository.java
Guard graph SCL module compilation
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / scl / GraphModuleSourceRepository.java
index 10a217b9da073918575c19bacf98f2925619688e..a70844cd375c8956adb593cb71406e92d782e963 100644 (file)
@@ -5,7 +5,6 @@ import java.util.Collection;
 
 import org.simantics.Simantics;
 import org.simantics.db.ReadGraph;
-import org.simantics.db.RequestProcessorSpecific;
 import org.simantics.db.Resource;
 import org.simantics.db.WriteGraph;
 import org.simantics.db.common.request.UnaryRead;
@@ -13,56 +12,67 @@ import org.simantics.db.common.request.WriteRequest;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.procedure.SyncListener;
 import org.simantics.db.request.Read;
+import org.simantics.db.request.ReadExt;
+import org.simantics.db.request.RequestFlags;
 import org.simantics.layer0.Layer0;
 import org.simantics.modeling.ModelingUtils;
+import org.simantics.modeling.internal.Activator;
+import org.simantics.modeling.scl.ontologymodule.OntologyModuleSourceRepository;
+import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidatorFactory;
 import org.simantics.scl.compiler.module.repository.UpdateListener;
+import org.simantics.scl.compiler.module.repository.UpdateListener.Observable;
 import org.simantics.scl.compiler.source.ModuleSource;
 import org.simantics.scl.compiler.source.StringModuleSource;
 import org.simantics.scl.compiler.source.repository.ModuleSourceRepository;
+import org.simantics.scl.osgi.internal.OsgiJavaReferenceValidatorFactory;
 import org.simantics.scl.runtime.SCLContext;
-import org.simantics.structural2.utils.StructuralUtils;
 import org.simantics.scl.runtime.tuple.Tuple0;
+import org.simantics.structural2.utils.StructuralUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import gnu.trove.procedure.TObjectProcedure;
 import gnu.trove.set.hash.THashSet;
 
 public enum GraphModuleSourceRepository implements ModuleSourceRepository {
-    INSTANCE;
+    INSTANCE; 
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(OntologyModuleSourceRepository.class);
+
+    private static final OsgiJavaReferenceValidatorFactory REFERENCE_VALIDATOR_FACTORY = new OsgiJavaReferenceValidatorFactory(Activator.getContext().getBundle());
 
     @Override
     public ModuleSource getModuleSource(final String moduleName, UpdateListener listener) {
         if(!moduleName.startsWith("http://"))
-            return null;
-
-        Object graph = SCLContext.getCurrent().get("graph");
-        RequestProcessorSpecific requestProcessor;
-        if(graph instanceof ReadGraph)
-            requestProcessor = (ReadGraph)graph;
-        else
-            requestProcessor = Simantics.getSession();
+            return null; // Don't do a graph request if this cannot be a resource
 
         Read<ModuleSource> request = new ReadModuleSource(moduleName);
 
         try {
             if(listener != null)
-                return requestProcessor.syncRequest(request, new ModuleListener(listener, moduleName));
+                return Simantics.getAvailableRequestProcessor().syncRequest(request, new ModuleListener(listener, moduleName));
             else
-                return requestProcessor.syncRequest(request);
+                return Simantics.getAvailableRequestProcessor().syncRequest(request);
         } catch (DatabaseException e) {
-            e.printStackTrace();
+            LOGGER.error("Failed to read graph module {}.",  moduleName, e);
             return null;
         }
     }
 
-    static class ModuleListener implements SyncListener<ModuleSource> {
+    static class ModuleListener implements SyncListener<ModuleSource>, Observable {
         UpdateListener listener;
         boolean alreadyExecutedOnce;
         final String moduleName;
         public ModuleListener(UpdateListener listener, String moduleName) {
             this.listener = listener;
+            this.listener.addObservable(this);
             this.moduleName = moduleName;
         }
         @Override
+        public void removeListener(UpdateListener listener) {
+            this.listener = null;
+        }
+        @Override
         public boolean isDisposed() {
             return listener == null;
         }
@@ -89,10 +99,15 @@ public enum GraphModuleSourceRepository implements ModuleSourceRepository {
         @Override
         public void exception(ReadGraph graph, Throwable t)
                 throws DatabaseException {
-            t.printStackTrace();
+            LOGGER.error("Could not listen {}", this, t);
             if(alreadyExecutedOnce && listener != null)
                 fireUpdate(graph);
         }
+
+        @Override
+        public String toString() {
+            return moduleName + " " + listener + " (" + alreadyExecutedOnce + ") [" + getClass().toString() + "]";
+        }
     };
     
     public static class GraphModuleSource extends StringModuleSource {
@@ -114,11 +129,39 @@ public enum GraphModuleSourceRepository implements ModuleSourceRepository {
             try {
                 Simantics.getSession().syncRequest(new WriteModuleSource(getModuleName(), newSourceText));
             } catch (DatabaseException e) {
-                e.printStackTrace();
+                LOGGER.error("Could not update {} with newSourceText {}", this, newSourceText);
             }
         }
+        
+        @Override
+        public JavaReferenceValidatorFactory getJavaReferenceValidatorFactory() {
+            return REFERENCE_VALIDATOR_FACTORY;
+        }
     }
 
+    static class PossibleResourceIU extends UnaryRead<String,Resource> implements ReadExt {
+
+        public PossibleResourceIU(String parameter) {
+            super(parameter);
+        }
+
+        @Override
+        public Resource perform(ReadGraph graph) throws DatabaseException {
+            return graph.getPossibleResource(parameter);
+        }
+
+        @Override
+        public boolean isImmutable(ReadGraph graph) throws DatabaseException {
+            return false;
+        }
+
+        @Override
+        public int getType() {
+            return RequestFlags.IMMEDIATE_UPDATE;
+        }
+        
+    }
+    
     static class ReadModuleSource extends UnaryRead<String, ModuleSource> {
         public ReadModuleSource(String moduleName) {
             super(moduleName);
@@ -126,7 +169,7 @@ public enum GraphModuleSourceRepository implements ModuleSourceRepository {
 
         @Override
         public ModuleSource perform(ReadGraph graph) throws DatabaseException {
-            Resource moduleResource = graph.getPossibleResource(parameter);
+            Resource moduleResource = graph.syncRequest(new PossibleResourceIU(parameter));
             if(moduleResource == null)
                 return null;
             Layer0 L0 = Layer0.getInstance(graph);
@@ -159,36 +202,44 @@ public enum GraphModuleSourceRepository implements ModuleSourceRepository {
         }
     }
 
+    private THashSet<String> getAllModules(ReadGraph graph) throws DatabaseException {
+        THashSet<String> result = new THashSet<String>(); 
+        Resource projectResource = Simantics.getProjectResource();
+        Layer0 L0 = Layer0.getInstance(graph);
+        for(Resource model : graph.getObjects(projectResource, L0.ConsistsOf)) {
+            if(graph.isInstanceOf(model, L0.IndexRoot)) {
+                for(Resource module : ModelingUtils.searchByType(graph, model, L0.SCLModule))
+                    result.add(graph.getURI(module));
+            }
+        }
+        
+        Collection<Resource> ontologies = Simantics.applySCL("Simantics/SharedOntologies", "getSharedOntologies", graph, Tuple0.INSTANCE);
+        for (Resource ontology : ontologies) {
+            for(Resource module : ModelingUtils.searchByType(graph, ontology, L0.SCLModule))
+                try {
+                    result.add(graph.getURI(module));
+                } catch(DatabaseException e) {
+                    LOGGER.error("Failed to find uri for " + module + ".");
+                }
+        }
+        
+        return result;
+    }
+    
     @Override
     public void forAllModules(TObjectProcedure<String> procedure) {
-        THashSet<String> moduleURIs;
+        THashSet<String> moduleURIs = null;
         try {
-            moduleURIs = Simantics.getSession().syncRequest(new Read<THashSet<String>>() {
+            moduleURIs = Simantics.getAvailableRequestProcessor().syncRequest(new Read<THashSet<String>>() {
                 @Override
                 public THashSet<String> perform(ReadGraph graph)
                         throws DatabaseException {
-                    THashSet<String> result = new THashSet<String>(); 
-                    Resource projectResource = Simantics.getProjectResource();
-                    Layer0 L0 = Layer0.getInstance(graph);
-                    for(Resource model : graph.getObjects(projectResource, L0.ConsistsOf)) {
-                        if(graph.isInstanceOf(model, L0.IndexRoot)) {
-                            for(Resource module : ModelingUtils.searchByType(graph, model, L0.SCLModule))
-                                result.add(graph.getURI(module));
-                        }
-                    }
-                    
-                    Collection<Resource> ontologies = Simantics.applySCL("Simantics/SharedOntologies", "getSharedOntologies", graph, Tuple0.INSTANCE);
-                    for (Resource ontology : ontologies) {
-                        for(Resource module : ModelingUtils.searchByType(graph, ontology, L0.SCLModule))
-                            result.add(graph.getURI(module));
-                    }
-                    
-                    return result;
+                    return getAllModules(graph);
                 }
             });
             moduleURIs.forEach(procedure);
         } catch (DatabaseException e) {
-            e.printStackTrace();
+            LOGGER.error("Could not execute procedure {} for all modules {}", procedure, String.valueOf(moduleURIs), e);
         }
     }