package org.simantics.district.network.visualisations.triggers; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.simantics.NameLabelUtil; import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.NamedResource; import org.simantics.db.common.request.ObjectsWithSupertype; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.layer0.Layer0; import org.simantics.scl.compiler.top.ValueNotFound; import org.simantics.scl.osgi.SCLOsgi; import org.simantics.scl.runtime.SCLContext; import org.simantics.scl.runtime.tuple.Tuple0; import org.simantics.structural.stubs.StructuralResource2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class VisualisationTriggersContributions { private static final Logger LOGGER = LoggerFactory.getLogger(VisualisationTriggersContributions.class); private static final String VISUALISATIONS_TRIGGERS_MODULE = "VisualisationTriggers"; private static final String VISUALISATION_TRIGGER_CONTRIBUTION = "visualisationTriggers"; public static Map> visualisationTriggers(ReadGraph graph) throws DatabaseException { List sharedOntologies = Simantics.applySCL("Simantics/SharedOntologies", "getSharedOntologies", graph, Tuple0.INSTANCE); Map> results = new HashMap<>(); Layer0 L0 = Layer0.getInstance(graph); Object oldGraph = SCLContext.getCurrent().get("graph"); try { SCLContext.getCurrent().put("graph", graph); for (Resource sharedOntology : sharedOntologies) { Collection userComponents = graph.syncRequest(new ObjectsWithSupertype(sharedOntology, Layer0.getInstance(graph).ConsistsOf, StructuralResource2.getInstance(graph).Component)); for (Resource userComponent : userComponents) { NamedResource moduleType = new NamedResource(NameLabelUtil.modalName(graph, userComponent), userComponent); List visualisationTriggerContributions = visualisationTriggerContribution(graph, moduleType); if (visualisationTriggerContributions != null) results.put(moduleType.getName(), visualisationTriggerContributions); } } } finally { SCLContext.getCurrent().put("graph", oldGraph); } return results; } private static List visualisationTriggerContribution(ReadGraph graph, NamedResource moduleType) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); Resource sclModule = Layer0Utils.getPossibleChild(graph, moduleType.getResource(), L0.SCLModule, VISUALISATIONS_TRIGGERS_MODULE); if (sclModule != null) { String moduleURI = graph.getURI(sclModule); try { List result = (List) SCLOsgi.MODULE_REPOSITORY.getValue(moduleURI, VISUALISATION_TRIGGER_CONTRIBUTION); return result; } catch (ValueNotFound e) { LOGGER.error("Could not find contributions for module {} and expression {}", moduleURI, VISUALISATION_TRIGGER_CONTRIBUTION, e); } } return null; } }