X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fscl%2FGraphModuleSourceRepository.java;h=a70844cd375c8956adb593cb71406e92d782e963;hp=10a217b9da073918575c19bacf98f2925619688e;hb=4af526406642ed67a61c7cae4edc673a21aec8f5;hpb=1b4d8b692f40d946deb5db8280eb4ca5b36a75a7 diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphModuleSourceRepository.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphModuleSourceRepository.java index 10a217b9d..a70844cd3 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphModuleSourceRepository.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphModuleSourceRepository.java @@ -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 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 { + static class ModuleListener implements SyncListener, 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 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 { 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 getAllModules(ReadGraph graph) throws DatabaseException { + THashSet result = new THashSet(); + 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 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 procedure) { - THashSet moduleURIs; + THashSet moduleURIs = null; try { - moduleURIs = Simantics.getSession().syncRequest(new Read>() { + moduleURIs = Simantics.getAvailableRequestProcessor().syncRequest(new Read>() { @Override public THashSet perform(ReadGraph graph) throws DatabaseException { - THashSet result = new THashSet(); - 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 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); } }