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;
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.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;
}
@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 {
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 ReadModuleSource extends UnaryRead<String, ModuleSource> {
}
}
+ 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);
}
}