]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphModuleSourceRepository.java
Better error reporting when graph module does not have URI
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / scl / GraphModuleSourceRepository.java
index 07af09e557109046575ee8556abf20c5cca6ec84..3d767f520250e4c8d343fb55256183fd52bc4934 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;
@@ -15,42 +14,44 @@ import org.simantics.db.procedure.SyncListener;
 import org.simantics.db.request.Read;
 import org.simantics.layer0.Layer0;
 import org.simantics.modeling.ModelingUtils;
+import org.simantics.modeling.internal.Activator;
+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.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;
         }
     }
@@ -66,7 +67,7 @@ public enum GraphModuleSourceRepository implements ModuleSourceRepository {
         }
         @Override
         public void removeListener(UpdateListener listener) {
-            listener = null;
+            this.listener = null;
         }
         @Override
         public boolean isDisposed() {
@@ -123,6 +124,11 @@ public enum GraphModuleSourceRepository implements ModuleSourceRepository {
                 e.printStackTrace();
             }
         }
+        
+        @Override
+        public JavaReferenceValidatorFactory getJavaReferenceValidatorFactory() {
+            return REFERENCE_VALIDATOR_FACTORY;
+        }
     }
 
     static class ReadModuleSource extends UnaryRead<String, ModuleSource> {
@@ -165,31 +171,38 @@ 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;
         try {
-            moduleURIs = Simantics.getSession().syncRequest(new Read<THashSet<String>>() {
+            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);