package org.simantics.district.network; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; import org.simantics.databoard.Bindings; import org.simantics.datatypes.literal.RGB; import org.simantics.datatypes.literal.RGB.Integer; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.common.procedure.adapter.TransientCacheListener; import org.simantics.db.common.request.IndexRoot; import org.simantics.db.common.request.ResourceRead; import org.simantics.db.common.utils.OrderedSetUtils; import org.simantics.db.exception.BindingException; import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.ManyObjectsForFunctionalRelationException; import org.simantics.db.exception.ServiceException; import org.simantics.db.indexing.IndexUtils; import org.simantics.db.layer0.QueryIndexUtils; import org.simantics.db.layer0.request.PossibleVariable; import org.simantics.db.layer0.variable.Variable; import org.simantics.diagram.stubs.DiagramResource; import org.simantics.diagram.synchronization.graph.DiagramGraphUtil; import org.simantics.diagram.synchronization.graph.layer.GraphLayer; import org.simantics.diagram.synchronization.graph.layer.IGraphLayerUtil; import org.simantics.district.network.ontology.DistrictNetworkResource; import org.simantics.district.network.visualisations.DynamicVisualisationsContributions; import org.simantics.district.network.visualisations.model.ColorBarOptions; import org.simantics.district.network.visualisations.model.ColorBarOptions.ColorBarsLocation; import org.simantics.district.network.visualisations.model.ColorBarOptions.ColorBarsSize; import org.simantics.district.network.visualisations.model.DynamicColorContribution; import org.simantics.district.network.visualisations.model.DynamicColorMap; import org.simantics.district.network.visualisations.model.DynamicSizeContribution; import org.simantics.district.network.visualisations.model.DynamicSizeMap; import org.simantics.district.network.visualisations.model.SizeBarOptions; import org.simantics.district.network.visualisations.model.SizeBarOptions.SizeBarsLocation; import org.simantics.district.network.visualisations.model.SizeBarOptions.SizeBarsSize; import org.simantics.layer0.Layer0; import org.simantics.maps.elevation.server.SingletonTiffTileInterface; import org.simantics.maps.elevation.server.prefs.MapsElevationServerPreferences; import org.simantics.modeling.ModelingResources; import org.simantics.modeling.adapters.NewCompositeActionFactory; import org.simantics.operation.Layer0X; import org.simantics.utils.datastructures.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DistrictNetworkUtil { private static final Logger LOGGER = LoggerFactory.getLogger(DistrictNetworkUtil.class); public static Resource createEdge(WriteGraph graph, Resource composite, double[] detailedGeometryCoords) throws DatabaseException { return createEdge(graph, composite, graph.getPossibleObject(composite, DistrictNetworkResource.getInstance(graph).EdgeDefaultMapping), detailedGeometryCoords); } public static Resource createEdge(WriteGraph graph, Resource composite, Resource mapping, double[] detailedGeometryCoords) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); if (mapping == null) { mapping = graph.getSingleObject(composite, DN.EdgeDefaultMapping); } Resource edge = graph.newResource(); graph.claim(edge, L0.InstanceOf, DN.Edge); graph.claim(edge, DN.HasMapping, null, mapping); OrderedSetUtils.addFirst(graph, composite, edge); graph.claim(composite, L0.ConsistsOf, L0.PartOf, edge); claimFreshElementName(graph, composite, edge); // We need to put GraphLayer to newLayers so... for (Resource layer : graph.getObjects(composite, DiagramResource.getInstance(graph).HasLayer)) { IGraphLayerUtil layerUtil = graph.adapt(graph.getSingleObject(layer, Layer0.getInstance(graph).InstanceOf), IGraphLayerUtil.class); GraphLayer gl = layerUtil.loadLayer(graph, layer); gl.forEachTag(tag -> { DiagramGraphUtil.tag(graph, edge, tag, true); }); } // add detailed geometry (if any) graph.claimLiteral(edge, DN.Edge_HasGeometry, detailedGeometryCoords, Bindings.DOUBLE_ARRAY); return edge; } /** * @param graph * @param composite * @param coords * @param elevation Double.MAX_VALUE to fetch elevation from elevation server (if enabled and has data) * @return * @throws DatabaseException */ public static Resource createVertex(WriteGraph graph, Resource composite, double[] coords, double elevation) throws DatabaseException { Resource defaultVertexMapping = graph.getPossibleObject(composite, DistrictNetworkResource.getInstance(graph).VertexDefaultMapping); return createVertex(graph, composite, coords, elevation, defaultVertexMapping); } /** * @param graph * @param composite * @param coords * @param elevation Double.MAX_VALUE to fetch elevation from elevation server (if enabled and has data) * @param mapping * @return * @throws DatabaseException */ public static Resource createVertex(WriteGraph graph, Resource composite, double[] coords, double elevation, Resource mapping) throws DatabaseException { // Double.MAX_VALUE is our secret to lookup elevation from elevation server if (elevation == Double.MAX_VALUE) { // ok, resolve from server or default to 0 if (MapsElevationServerPreferences.useElevationServer()) { // ok! we use new elevation API to resolve possible elevations for the starting points try { elevation = SingletonTiffTileInterface.lookup(coords[1], coords[0]).doubleValue(); } catch (Exception ee) { LOGGER.error("Could not get elevation from tiff interface", ee); } } else { elevation = 0; } } Layer0 L0 = Layer0.getInstance(graph); DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); DiagramResource DIA = DiagramResource.getInstance(graph); Resource vertex = graph.newResource(); graph.claim(vertex, L0.InstanceOf, DN.Vertex); graph.claimLiteral(vertex, DIA.HasLocation, coords); graph.claimLiteral(vertex, DN.Vertex_HasElevation, elevation, Bindings.DOUBLE); graph.claim(vertex, DN.HasMapping, null, mapping); OrderedSetUtils.add(graph, composite, vertex); graph.claim(composite, L0.ConsistsOf, L0.PartOf, vertex); claimFreshElementName(graph, composite, vertex); // We need to put GraphLayer to newLayers so... for (Resource layer : graph.getObjects(composite, DiagramResource.getInstance(graph).HasLayer)) { IGraphLayerUtil layerUtil = graph.adapt(graph.getSingleObject(layer, Layer0.getInstance(graph).InstanceOf), IGraphLayerUtil.class); GraphLayer gl = layerUtil.loadLayer(graph, layer); gl.forEachTag(tag -> { DiagramGraphUtil.tag(graph, vertex, tag, true); }); } return vertex; } public static Resource joinVertices(WriteGraph graph, Collection vertices) throws DatabaseException { if (vertices.isEmpty()) throw new IllegalArgumentException("vertices-collection should not be empty for joining vertices!"); DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); Iterator verticeIterator = vertices.iterator(); Resource master = verticeIterator.next(); while (verticeIterator.hasNext()) { Resource slave = verticeIterator.next(); Resource composite = graph.getSingleObject(slave, Layer0.getInstance(graph).PartOf); Collection startVertexEdges = graph.getObjects(slave, DN.HasStartVertex_Inverse); for (Resource startVertexEdge : startVertexEdges) { graph.deny(startVertexEdge, DN.HasStartVertex); graph.claim(startVertexEdge, DN.HasStartVertex, master); } Collection endVertexEdges = graph.getObjects(slave, DN.HasEndVertex_Inverse); for (Resource endVertexEdge : endVertexEdges) { graph.deny(endVertexEdge, DN.HasEndVertex); graph.claim(endVertexEdge, DN.HasEndVertex, master); } OrderedSetUtils.remove(graph, composite, slave); // Remove ConsistsOf statement graph.deny(composite, Layer0.getInstance(graph).ConsistsOf, slave); } return master; } public static double calculateDistance(ReadGraph graph, Resource startVertex, Resource endVertex) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); Resource startComposite = graph.getSingleObject(startVertex, L0.PartOf); Resource endComposite = graph.getSingleObject(endVertex, L0.PartOf); if (!startComposite.equalsResource(endComposite)) { throw new DatabaseException("Can not calculate distance between vertices on different composites! " + startVertex + " -> " + endVertex); } Resource crs = graph.getSingleObject(startComposite, DistrictNetworkResource.getInstance(graph).HasSpatialRefSystem); CRS crsClass = graph.adapt(crs, CRS.class); double[] startCoords = graph.getRelatedValue2(startVertex, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY); double[] endCoords = graph.getRelatedValue2(endVertex, DiagramResource.getInstance(graph).HasLocation, Bindings.DOUBLE_ARRAY); return crsClass.calculateDistance(startCoords, endCoords); } public static final String claimFreshElementName(WriteGraph graph, Resource diagram, Resource element) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); DiagramResource DIA = DiagramResource.getInstance(graph); // Get name prefix from diagram String namePrefix = graph.getPossibleRelatedValue2(diagram, Layer0X.getInstance(graph).HasGeneratedNamePrefix); if (namePrefix == null) namePrefix = ""; // Give running name to element and increment the counter attached to the diagram. Long l = graph.getPossibleRelatedValue(diagram, DIA.HasModCount, Bindings.LONG); if (l == null) l = Long.valueOf(0L); String name = namePrefix + l.toString(); graph.claimLiteral(element, L0.HasName, name, Bindings.STRING); graph.claimLiteral(diagram, DIA.HasModCount, ++l, Bindings.LONG); return name; } public static Resource getDiagramElement(ReadGraph graph, Resource component) throws DatabaseException { if (component == null) return null; DiagramResource DIA = DiagramResource.getInstance(graph); if (graph.isInstanceOf(component, DIA.Element)) return component; ModelingResources MOD = ModelingResources.getInstance(graph); Resource element = graph.getPossibleObject(component, MOD.ComponentToElement); return element != null && graph.isInstanceOf(element, DIA.Element) ? element : null; } public static Resource getMappedElement(ReadGraph graph, Resource element) throws DatabaseException { if (element == null) return null; DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); return graph.getPossibleObject(element, DN.MappedComponent); } public static Resource getMappedComponent(ReadGraph graph, Resource element) throws DatabaseException { if (element == null) return null; Resource mappedElement = getMappedElement(graph, element); if (mappedElement == null) return null; ModelingResources MOD = ModelingResources.getInstance(graph); return graph.getPossibleObject(mappedElement, MOD.ElementToComponent); } public static Resource getMappedComponentCached(ReadGraph graph, Resource vertex) throws DatabaseException { return graph.syncRequest(new MappedComponentRequest(vertex), TransientCacheListener.instance()); } public static Resource getMappedDNElement(ReadGraph graph, Resource element) throws DatabaseException { if (element == null) return null; DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); return graph.getPossibleObject(element, DN.MappedFromElement); } public static Variable toMappedConfigurationModule(ReadGraph graph, Resource input) throws DatabaseException { if (input == null) return null; DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); if (graph.isInstanceOf(input, DN.Element)) { Resource mappedElement = getMappedElement(graph, input); if (mappedElement == null) return null; ModelingResources MOD = ModelingResources.getInstance(graph); Resource mappedComponent = graph.getPossibleObject(mappedElement, MOD.ElementToComponent); if (mappedComponent == null) return null; return graph.syncRequest(new PossibleVariable(mappedComponent)); } return null; } public static void toggleDrawMap(WriteGraph graph, Resource diagram) throws ManyObjectsForFunctionalRelationException, BindingException, ServiceException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); Boolean current = graph.getPossibleRelatedValue(diagram, DN.Diagram_drawMapEnabled, Bindings.BOOLEAN); if (current == null) current = true; graph.claimLiteral(diagram, DN.Diagram_drawMapEnabled, !current, Bindings.BOOLEAN); } public static Boolean drawMapEnabled(ReadGraph graph, Resource diagram) throws ManyObjectsForFunctionalRelationException, BindingException, ServiceException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); Boolean current = graph.getPossibleRelatedValue(diagram, DN.Diagram_drawMapEnabled, Bindings.BOOLEAN); return current != null ? current : true; } public static void changeMapBackgroundColor(WriteGraph graph, Resource diagram, Integer integer) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); graph.claimLiteral(diagram, DN.Diagram_backgroundColor, integer, Bindings.getBindingUnchecked(RGB.Integer.class)); } public static Boolean trackChangesEnabled(ReadGraph graph, Resource diagram) throws DatabaseException { if (diagram != null && graph.hasStatement(diagram)) { return Boolean.TRUE.equals(graph.getPossibleRelatedValue(diagram, DistrictNetworkResource.getInstance(graph).Diagram_trackChangesEnabled)); } else { return false; } } public static RGB.Integer backgroundColor(ReadGraph graph, Resource diagram) throws DatabaseException { return graph.getPossibleRelatedValue(diagram, DistrictNetworkResource.getInstance(graph).Diagram_backgroundColor, Bindings.getBindingUnchecked(RGB.Integer.class)); } public static Resource createNetworkDiagram(WriteGraph graph, Resource target, Resource compositeType, String defaultName, Resource defaultEdgeMapping, Resource defaultVertexMapping, Resource rightClickVertexMapping, Resource leftClickVertexMapping, Resource crs) throws DatabaseException { Resource composite = NewCompositeActionFactory.createComposite(graph, target, defaultName, compositeType); DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); Resource diagram = graph.getSingleObject(composite, ModelingResources.getInstance(graph).CompositeToDiagram); graph.claim(diagram, DN.EdgeDefaultMapping, defaultEdgeMapping); graph.claim(diagram, DN.VertexDefaultMapping, defaultVertexMapping); graph.claim(diagram, DN.RightClickDefaultMapping, rightClickVertexMapping); graph.claim(diagram, DN.LeftClickDefaultMapping, leftClickVertexMapping); graph.claim(diagram, DN.HasSpatialRefSystem, crs); // Generated name prefix from composite name String compositeName = graph.getRelatedValue2(composite, Layer0.getInstance(graph).HasName, Bindings.STRING); graph.claimLiteral(diagram, Layer0X.getInstance(graph).HasGeneratedNamePrefix, "N" + compositeName.substring(compositeName.length() - 1, compositeName.length())); return composite; } public static final class MappedComponentRequest extends ResourceRead { public MappedComponentRequest(Resource element) { super(element); } @Override public Resource perform(ReadGraph graph) throws DatabaseException { return getMappedComponent(graph, resource); } } public static class ResourceVertex { public final boolean isConsumer; public final Resource vertex; public final double[] coords; public ResourceVertex(Resource vertex, double[] coords, boolean isConsumer) { this.vertex = vertex; this.coords = coords; this.isConsumer = isConsumer; } } public static void changeMappingType(WriteGraph graph, Resource newMapping, List elements) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); for (Resource element : elements) { graph.deny(element, DN.HasMapping); graph.claim(element, DN.HasMapping, newMapping); } } public static Stream findDNElementsById(ReadGraph graph, Resource context, String idToFind) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); return IndexUtils.findByType(graph, graph.syncRequest(new IndexRoot(context)), DN.Element ).stream().filter(element -> { try { String id = graph.getPossibleRelatedValue(element, DN.HasId, Bindings.STRING); return id != null && id.contains(idToFind); } catch (DatabaseException e) { LOGGER.error("Could not read id for element {]", element, e); return false; } }); } public static Resource findDNElementById(ReadGraph graph, Resource context, String idToFind) throws DatabaseException { List elements = findDNElementsById(graph, context, idToFind).collect(Collectors.toList()); if (elements.size() == 1) { return elements.iterator().next(); } return null; } public static List findDNElementByXYCoordinates(ReadGraph graph, Resource context, double lat, double lon, double padding) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); DiagramResource DIA = DiagramResource.getInstance(graph); List results = new ArrayList<>(); Collection vertices = IndexUtils.findByType(graph, graph.syncRequest(new IndexRoot(context)), DN.Vertex); Rectangle2D rect = new Rectangle2D.Double(lat, lon, padding, padding); for (Resource vertex : vertices) { double[] location = graph.getRelatedValue(vertex, DIA.HasLocation, Bindings.DOUBLE_ARRAY); if (rect.contains(location[0], location[1])) { results.add(vertex); } } return results; } public static ColorBarOptions colorBarOptions(ReadGraph graph, Resource visualisation) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); if (visualisation != null) { String colorBarLocation = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ColorBarLocation, Bindings.STRING); String colorBarSize = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ColorBarSize, Bindings.STRING); Boolean show = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ShowColorBars, Bindings.BOOLEAN); Boolean showTicks = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ShowColorBarTicks, Bindings.BOOLEAN); Boolean useGradients = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_UseColorBarGradients, Bindings.BOOLEAN); if (colorBarLocation != null) { return new ColorBarOptions() .showColorBars(show != null ? show : false) .showColorBarsTicks(showTicks != null ? showTicks : false) .useGradients(useGradients != null ? useGradients : false) .withLocation(ColorBarsLocation.valueOf(colorBarLocation)) .withSize(ColorBarsSize.valueOf(colorBarSize)); } } return ColorBarOptions.useDefault(); } public static void setColorBarOptions(WriteGraph graph, Resource visualisation, ColorBarOptions options) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ColorBarLocation, options.getLocation().toString(), Bindings.STRING); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ColorBarSize, options.getSize().toString(), Bindings.STRING); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ShowColorBars, options.isShowColorBars(), Bindings.BOOLEAN); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ShowColorBarTicks, options.isShowColorBarsTicks(), Bindings.BOOLEAN); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_UseColorBarGradients, options.isUseGradients(), Bindings.BOOLEAN); } public static Resource createVisualisation(WriteGraph graph, Resource parent, String visualisationName) throws DatabaseException { Resource vf = getOrCreateVisualisationsFolder(graph, parent); Layer0 L0 = Layer0.getInstance(graph); DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); Resource visualisation = graph.newResource(); graph.claim(visualisation, L0.InstanceOf, DN.Diagram_Visualisations); graph.claimLiteral(visualisation, L0.HasName, visualisationName); graph.claim(vf, DN.Diagram_hasVisualisation, visualisation); return visualisation; } public static Resource getOrCreateVisualisationsFolder(WriteGraph graph, Resource model) throws DatabaseException { Resource rf = getVisualisationFolder(graph, model); if (rf == null) { Layer0 L0 = Layer0.getInstance(graph); DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); rf = graph.newResource(); graph.claim(rf, L0.InstanceOf, null, DN.VisualisationsFolder); graph.claimLiteral(rf, L0.HasName, L0.NameOf, L0.String, UUID.randomUUID().toString(), Bindings.STRING); graph.claim(model, L0.ConsistsOf, L0.PartOf, rf); } return rf; } public static Resource getVisualisationFolder(ReadGraph graph, Resource model) throws DatabaseException { List visualisationsFolders = QueryIndexUtils.searchByType(graph, model, DistrictNetworkResource.getInstance(graph).VisualisationsFolder); if (visualisationsFolders.size() > 0) return visualisationsFolders.get(0); return null; } public static SizeBarOptions sizeBarOptions(ReadGraph graph, Resource visualisation) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); if (visualisation != null) { String sizeBarLocation = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_SizeBarLocation, Bindings.STRING); String sizeBarSize = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_SizeBarSize, Bindings.STRING); Boolean show = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ShowSizeBars, Bindings.BOOLEAN); Boolean showTicks = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_ShowSizeBarTicks, Bindings.BOOLEAN); Boolean useGradients = graph.getPossibleRelatedValue(visualisation, DN.Diagram_Visualisations_UseSizeBarGradients, Bindings.BOOLEAN); if (sizeBarLocation != null) { return new SizeBarOptions() .showSizeBars(show != null ? show : false) .showSizeBarsTicks(showTicks != null ? showTicks : false) .useGradients(useGradients != null ? useGradients : false) .withLocation(SizeBarsLocation.valueOf(sizeBarLocation)) .withSize(SizeBarsSize.valueOf(sizeBarSize)); } } return SizeBarOptions.useDefault(); } public static void setSizeBarOptions(WriteGraph graph, Resource visualisation, SizeBarOptions options) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_SizeBarLocation, options.getLocation().toString(), Bindings.STRING); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_SizeBarSize, options.getSize().toString(), Bindings.STRING); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ShowSizeBars, options.isShowSizeBars(), Bindings.BOOLEAN); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_ShowSizeBarTicks, options.isShowSizeBarsTicks(), Bindings.BOOLEAN); graph.claimLiteral(visualisation, DN.Diagram_Visualisations_UseSizeBarGradients, options.isUseGradients(), Bindings.BOOLEAN); } public static Map colorContributions(ReadGraph graph, Resource visualisation) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); if (visualisation == null) { return Collections.emptyMap(); } Map contributions = new HashMap<>(); Map colorMaps = DynamicVisualisationsContributions.dynamicColorMaps(graph); Collection colorContributions = graph.getObjects(visualisation, DN.Diagram_Visualisations_colorContributions); for (Resource colorContribution : colorContributions) { String ucName = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionContributorName, Bindings.STRING); String label = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionLabel, Bindings.STRING); String moduleName = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionModuleName, Bindings.STRING); String attributeName = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionModuleAttribute, Bindings.STRING); String unit = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionUnit, Bindings.STRING); Double variableGain = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionVariableGain, Bindings.DOUBLE); Double variableBias = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionVariableBias, Bindings.DOUBLE); String dynamicColorMap = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultColorMap, Bindings.STRING); Double defaultMin = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultMin, Bindings.DOUBLE); Double defaultMax = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultMax, Bindings.DOUBLE); Boolean used = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionUsed, Bindings.BOOLEAN); Boolean useDefault = graph.getRelatedValue(colorContribution, DN.Diagram_Visualisations_colorContributionUseDefault, Bindings.BOOLEAN); DynamicColorContribution dynamicColorContribution = new DynamicColorContribution(label, moduleName, attributeName, unit, variableGain, variableBias, colorMaps.get(dynamicColorMap), defaultMin, defaultMax); dynamicColorContribution.setUsed(used != null ? used : false); dynamicColorContribution.setUseDefault(useDefault != null ? useDefault : false); contributions.put(ucName, dynamicColorContribution); } return contributions; } public static void setColorContributions(WriteGraph graph, Resource visualisation, List> collect) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); Layer0 L0 = Layer0.getInstance(graph); graph.deny(visualisation, DN.Diagram_Visualisations_colorContributions); for (Pair coll : collect) { Resource colorContribution = graph.newResource(); graph.claim(colorContribution, L0.InstanceOf, DN.Diagram_Visualisations_ColorContribution); graph.claimLiteral(colorContribution, L0.HasName, coll.first); DynamicColorContribution contr = coll.second; graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionContributorName, coll.first, Bindings.STRING); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionLabel, contr.getLabel(), Bindings.STRING); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionModuleName, contr.getModuleName(), Bindings.STRING); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionModuleAttribute, contr.getAttributeName(), Bindings.STRING); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionUnit, contr.getUnit(), Bindings.STRING); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionVariableGain, contr.getVariableGain(), Bindings.DOUBLE); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionVariableBias, contr.getVariableBias(), Bindings.DOUBLE); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultColorMap, contr.getDefaultColorMap().getLabel(), Bindings.STRING); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultMin, contr.getDefaultMin(), Bindings.DOUBLE); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionDefaultMax, contr.getDefaultMax(), Bindings.DOUBLE); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionUsed, contr.isUsed(), Bindings.BOOLEAN); graph.claimLiteral(colorContribution, DN.Diagram_Visualisations_colorContributionUseDefault, contr.isUseDefault(), Bindings.BOOLEAN); graph.claim(visualisation, DN.Diagram_Visualisations_colorContributions, colorContribution); } } public static Map sizeContributions(ReadGraph graph, Resource visualisation) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); if (visualisation == null) { return Collections.emptyMap(); } Map contributions = new HashMap<>(); Map sizeMaps = DynamicVisualisationsContributions.dynamicSizeMaps(graph); Collection sizeContributions = graph.getObjects(visualisation, DN.Diagram_Visualisations_sizeContributions); for (Resource sizeContribution : sizeContributions) { String ucName = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionContributorName, Bindings.STRING); String label = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionLabel, Bindings.STRING); String moduleName = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionModuleName, Bindings.STRING); String attributeName = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionModuleAttribute, Bindings.STRING); String unit = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionUnit, Bindings.STRING); Double variableGain = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionVariableGain, Bindings.DOUBLE); Double variableBias = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionVariableBias, Bindings.DOUBLE); String dynamicSizeMap = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionDefaultSizeMap, Bindings.STRING); Double defaultMin = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionDefaultMin, Bindings.DOUBLE); Double defaultMax = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionDefaultMax, Bindings.DOUBLE); Boolean used = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionUsed, Bindings.BOOLEAN); Boolean useDefault = graph.getRelatedValue(sizeContribution, DN.Diagram_Visualisations_sizeContributionUseDefault, Bindings.BOOLEAN); DynamicSizeContribution dsc = new DynamicSizeContribution(label, moduleName, attributeName, unit, variableGain, variableBias, sizeMaps.get(dynamicSizeMap), defaultMin, defaultMax); dsc.setUsed(used != null ? used : false); dsc.setUseDefault(useDefault != null ? useDefault : false); contributions.put(ucName, dsc); } return contributions; } public static void setSizeContributions(WriteGraph graph, Resource visualisation, List> collect) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); Layer0 L0 = Layer0.getInstance(graph); graph.deny(visualisation, DN.Diagram_Visualisations_sizeContributions); for (Pair coll : collect) { Resource sizeContribution = graph.newResource(); graph.claim(sizeContribution, L0.InstanceOf, DN.Diagram_Visualisations_SizeContribution); graph.claimLiteral(sizeContribution, L0.HasName, coll.first); DynamicSizeContribution contr = coll.second; graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionContributorName, coll.first, Bindings.STRING); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionLabel, contr.getLabel(), Bindings.STRING); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionModuleName, contr.getModuleName(), Bindings.STRING); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionModuleAttribute, contr.getAttributeName(), Bindings.STRING); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionUnit, contr.getUnit(), Bindings.STRING); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionVariableGain, contr.getVariableGain(), Bindings.DOUBLE); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionVariableBias, contr.getVariableBias(), Bindings.DOUBLE); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionDefaultSizeMap, contr.getDefaultSizeMap().getLabel(), Bindings.STRING); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionDefaultMin, contr.getDefaultMin(), Bindings.DOUBLE); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionDefaultMax, contr.getDefaultMax(), Bindings.DOUBLE); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionUsed, contr.isUsed(), Bindings.BOOLEAN); graph.claimLiteral(sizeContribution, DN.Diagram_Visualisations_sizeContributionUseDefault, contr.isUseDefault(), Bindings.BOOLEAN); graph.claim(visualisation, DN.Diagram_Visualisations_sizeContributions, sizeContribution); } } public static void setActiveVisualisation(WriteGraph graph, Resource diagram, Resource visualisationTemplate) throws DatabaseException { DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); graph.deny(diagram, DN.Diagram_hasActiveVisualisation); graph.claim(diagram, DN.Diagram_hasActiveVisualisation, visualisationTemplate); } }