From 165a995bf446be802c4623b46706a257a5367c69 Mon Sep 17 00:00:00 2001 From: jsimomaa Date: Mon, 15 Jun 2020 12:01:09 +0300 Subject: [PATCH 01/16] Add missing visualization trigger code gitlab #91 Change-Id: I99e6c8f256fb4de4cc84e83599f951be8238694e --- .../ui/nodes/DistrictNetworkEdgeNode.java | 8 ++ .../ui/nodes/DistrictNetworkVertexNode.java | 9 ++- ...istrictFinderVisualisationParticipant.java | 18 +++++ .../META-INF/MANIFEST.MF | 3 +- .../District/VisualisationTriggers.scl | 5 ++ .../triggers/VisualisationTrigger.java | 46 ++++++++++++ .../VisualisationTriggerComponent.java | 30 ++++++++ .../VisualisationTriggersContributions.java | 73 +++++++++++++++++++ 8 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 org.simantics.district.network/scl/Simantics/District/VisualisationTriggers.scl create mode 100644 org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTrigger.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggerComponent.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggersContributions.java diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java index 4d460f5d..27032028 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java @@ -40,6 +40,7 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection private Color color; private Double stroke; private transient Color dynamicColor = null; + private transient Color eventColor = null; // Dimensions for shut-off valve symbol private static final double left = -0.25; @@ -112,6 +113,7 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection } g2d.setColor(dynamicColor != null ? dynamicColor : color); + g2d.setColor(eventColor != null ? eventColor : g2d.getColor()); g2d.setStroke(bs); g2d.draw(path); @@ -269,6 +271,12 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection this.dynamicColor = color; } + @PropertySetter(value = "eventColor") + public void setEventColor(Color color) { + this.eventColor = color; + } + + @PropertySetter(value = "arrowLength") public void setArrowLength(Double length) { // find if there is a child deferred arrow node diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java index 4ea8bbf1..8742fa92 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java @@ -46,6 +46,7 @@ public class DistrictNetworkVertexNode extends G2DParentNode implements ISelecti private Color color; private transient Color dynamicColor; + private transient Color eventColor; private Rectangle2D bounds; private transient Point2D point; @@ -93,7 +94,7 @@ public class DistrictNetworkVertexNode extends G2DParentNode implements ISelecti } Color oldColor = g2d.getColor(); - Color newColor = dynamicColor != null ? dynamicColor : color; + Color newColor = eventColor != null ? eventColor : dynamicColor != null ? dynamicColor : color; boolean changeColor = !oldColor.equals(newColor); double scaleRecip = viewScaleRecip * nodeSize; @@ -243,6 +244,11 @@ public class DistrictNetworkVertexNode extends G2DParentNode implements ISelecti this.dynamicColor = color; } + @PropertySetter(value = "eventColor") + public void setEventColor(Color colorr) { + this.eventColor = colorr; + } + @PropertySetter(value = "hidden") public void setHidden(Boolean value) { this.hidden = value; @@ -279,4 +285,5 @@ public class DistrictNetworkVertexNode extends G2DParentNode implements ISelecti child.setPoints(points); } } + } diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DistrictFinderVisualisationParticipant.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DistrictFinderVisualisationParticipant.java index 5f689de9..a88d7ba9 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DistrictFinderVisualisationParticipant.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DistrictFinderVisualisationParticipant.java @@ -17,12 +17,14 @@ import org.simantics.g2d.canvas.ICanvasContext; import org.simantics.g2d.diagram.participant.AbstractDiagramParticipant; import org.simantics.g2d.element.IElement; import org.simantics.scenegraph.g2d.G2DParentNode; +import org.simantics.scl.runtime.tuple.Tuple2; import org.simantics.utils.datastructures.hints.IHintContext.Key; import org.simantics.utils.datastructures.hints.IHintContext.KeyOf; public class DistrictFinderVisualisationParticipant extends AbstractDiagramParticipant { private static final String TOPIC = "org/simantics/district/selection/elementQuerySelection"; + private static final String TOPIC2 = "org/simantics/district/visualisationTrigger"; private IEventBroker broker; @@ -56,6 +58,22 @@ public class DistrictFinderVisualisationParticipant extends AbstractDiagramParti } } }); + broker.subscribe(TOPIC2, event -> { + Tuple2 data = (Tuple2) event.getProperty(IEventBroker.DATA); + Resource resource = (Resource) data.c0; + Color colorr = (Color) data.c1; + IElement element = DiagramNodeUtil.findElement(ctx, resource); + final G2DParentNode node = element.getHint(DistrictNetworkEdgeElement.KEY_DN_EDGE_NODE); + if (node != null) { + // color is a bit special - if not present then reset with null value + ((DistrictNetworkEdgeNode) node).setEventColor(colorr); + node.repaint(); + } else { + final G2DParentNode vertexNode = element.getHint(DistrictNetworkVertexElement.KEY_DN_VERTEX_NODE); + ((DistrictNetworkVertexNode) vertexNode).setEventColor(colorr); + vertexNode.repaint(); + } + }); } @Override diff --git a/org.simantics.district.network/META-INF/MANIFEST.MF b/org.simantics.district.network/META-INF/MANIFEST.MF index f5976e26..79671648 100644 --- a/org.simantics.district.network/META-INF/MANIFEST.MF +++ b/org.simantics.district.network/META-INF/MANIFEST.MF @@ -27,4 +27,5 @@ Export-Package: org.simantics.district.network, org.simantics.district.network.changeset, org.simantics.district.network.profile, org.simantics.district.network.visualisations, - org.simantics.district.network.visualisations.model + org.simantics.district.network.visualisations.model, + org.simantics.district.network.visualisations.triggers diff --git a/org.simantics.district.network/scl/Simantics/District/VisualisationTriggers.scl b/org.simantics.district.network/scl/Simantics/District/VisualisationTriggers.scl new file mode 100644 index 00000000..3eea008e --- /dev/null +++ b/org.simantics.district.network/scl/Simantics/District/VisualisationTriggers.scl @@ -0,0 +1,5 @@ +importJava "org.simantics.district.network.visualisations.triggers.VisualisationTrigger" where + data VisualisationTrigger + + @JavaName "" + visualisationTriggerContribution :: String -> String -> Double -> String -> VisualisationTrigger \ No newline at end of file diff --git a/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTrigger.java b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTrigger.java new file mode 100644 index 00000000..7a9614e5 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTrigger.java @@ -0,0 +1,46 @@ +package org.simantics.district.network.visualisations.triggers; + +import java.awt.Color; + +public class VisualisationTrigger { + + private String moduleName; + private String attributeName; + private double threshold; + private Color color; + + public VisualisationTrigger(String moduleName, String attributeName, double threshold, String colorHex) { + this.moduleName = moduleName; + this.attributeName = attributeName; + this.threshold = threshold; + this.color = hex2Rgb(colorHex); + } + + public String getModuleName() { + return moduleName; + } + + public String getAttributeName() { + return attributeName; + } + + public double getThreshold() { + return threshold; + } + + public Color getColor() { + return color; + } + + /** + * + * @param colorStr e.g. "#FFFFFF" + * @return + */ + private static Color hex2Rgb(String colorStr) { + return new Color( + Integer.valueOf( colorStr.substring( 1, 3 ), 16 ), + Integer.valueOf( colorStr.substring( 3, 5 ), 16 ), + Integer.valueOf( colorStr.substring( 5, 7 ), 16 ) ); + } +} diff --git a/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggerComponent.java b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggerComponent.java new file mode 100644 index 00000000..b18fede4 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggerComponent.java @@ -0,0 +1,30 @@ +package org.simantics.district.network.visualisations.triggers; + +import org.simantics.db.Resource; +import org.simantics.structural.synchronization.base.ComponentBase; + +public class VisualisationTriggerComponent { + + private Resource element; + private ComponentBase component; + private VisualisationTrigger trigger; + + public VisualisationTriggerComponent(Resource element, ComponentBase component, VisualisationTrigger activeTrigger) { + this.element = element; + this.component = component; + this.trigger = activeTrigger; + } + + public Resource getElement() { + return element; + } + + public ComponentBase getComponent() { + return component; + } + + public VisualisationTrigger getTrigger() { + return trigger; + } + +} diff --git a/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggersContributions.java b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggersContributions.java new file mode 100644 index 00000000..8120a973 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggersContributions.java @@ -0,0 +1,73 @@ +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; + } + +} + -- 2.45.2 From 752dc5d524bc31567892121e3a37d14523109cc3 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Mon, 15 Jun 2020 13:49:10 +0300 Subject: [PATCH 02/16] Amendment to 165a995bf446be802c4623b46706a257a5367c69 gitlab #91 --- .../network/ui/nodes/DistrictNetworkEdgeNode.java | 1 - .../network/ui/nodes/DistrictNetworkVertexNode.java | 8 ++++---- .../DistrictFinderVisualisationParticipant.java | 6 +++--- .../triggers/VisualisationTrigger.java | 8 ++++---- .../triggers/VisualisationTriggerComponent.java | 4 ++-- .../triggers/VisualisationTriggersContributions.java | 12 ++++++------ 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java index 27032028..0e5f3022 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkEdgeNode.java @@ -276,7 +276,6 @@ public class DistrictNetworkEdgeNode extends G2DParentNode implements ISelection this.eventColor = color; } - @PropertySetter(value = "arrowLength") public void setArrowLength(Double length) { // find if there is a child deferred arrow node diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java index 8742fa92..feb217b0 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkVertexNode.java @@ -245,10 +245,10 @@ public class DistrictNetworkVertexNode extends G2DParentNode implements ISelecti } @PropertySetter(value = "eventColor") - public void setEventColor(Color colorr) { - this.eventColor = colorr; - } - + public void setEventColor(Color colorr) { + this.eventColor = colorr; + } + @PropertySetter(value = "hidden") public void setHidden(Boolean value) { this.hidden = value; diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DistrictFinderVisualisationParticipant.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DistrictFinderVisualisationParticipant.java index a88d7ba9..5eb30444 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DistrictFinderVisualisationParticipant.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DistrictFinderVisualisationParticipant.java @@ -59,9 +59,9 @@ public class DistrictFinderVisualisationParticipant extends AbstractDiagramParti } }); broker.subscribe(TOPIC2, event -> { - Tuple2 data = (Tuple2) event.getProperty(IEventBroker.DATA); - Resource resource = (Resource) data.c0; - Color colorr = (Color) data.c1; + Tuple2 data = (Tuple2) event.getProperty(IEventBroker.DATA); + Resource resource = (Resource) data.c0; + Color colorr = (Color) data.c1; IElement element = DiagramNodeUtil.findElement(ctx, resource); final G2DParentNode node = element.getHint(DistrictNetworkEdgeElement.KEY_DN_EDGE_NODE); if (node != null) { diff --git a/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTrigger.java b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTrigger.java index 7a9614e5..f0953d19 100644 --- a/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTrigger.java +++ b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTrigger.java @@ -27,11 +27,11 @@ public class VisualisationTrigger { public double getThreshold() { return threshold; } - + public Color getColor() { - return color; - } - + return color; + } + /** * * @param colorStr e.g. "#FFFFFF" diff --git a/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggerComponent.java b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggerComponent.java index b18fede4..6502fe9f 100644 --- a/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggerComponent.java +++ b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggerComponent.java @@ -16,8 +16,8 @@ public class VisualisationTriggerComponent { } public Resource getElement() { - return element; - } + return element; + } public ComponentBase getComponent() { return component; diff --git a/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggersContributions.java b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggersContributions.java index 8120a973..1cab0bf9 100644 --- a/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggersContributions.java +++ b/org.simantics.district.network/src/org/simantics/district/network/visualisations/triggers/VisualisationTriggersContributions.java @@ -27,20 +27,20 @@ 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); @@ -53,7 +53,7 @@ public class VisualisationTriggersContributions { } 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); -- 2.45.2 From ade944a1d12ca6b83f3ec4d87b7f97fc7d05f770 Mon Sep 17 00:00:00 2001 From: jsimomaa Date: Tue, 28 Jul 2020 13:57:49 +0300 Subject: [PATCH 03/16] Finder visualisation coloring to diagram & checkbox for enable/disable gitlab #86 Change-Id: I5ef0badf730300778b8ae6ff7c73eeb158fd66d1 --- .../selection/ui/ElementSelectorTableUI.java | 96 ++++++++++++------- .../ui/parts/ElementSelectionView.java | 41 +++++++- 2 files changed, 100 insertions(+), 37 deletions(-) diff --git a/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectorTableUI.java b/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectorTableUI.java index 4603eb8e..79602077 100644 --- a/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectorTableUI.java +++ b/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectorTableUI.java @@ -6,13 +6,15 @@ import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.resource.ResourceManager; +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; @@ -36,7 +38,7 @@ public class ElementSelectorTableUI extends Composite { private static final Logger LOGGER = LoggerFactory.getLogger(ElementSelectorTableUI.class); - private TableViewer viewer; + private CheckboxTableViewer viewer; private ElementSelectionView view; @@ -44,24 +46,40 @@ public class ElementSelectorTableUI extends Composite { public ElementSelectorTableUI(Composite parent, int style, ElementSelectionView view) { super(parent, style); - + resourceManager = new LocalResourceManager(JFaceResources.getResources(), this); - + this.view = view; - + parent.setLayout(new FillLayout()); - // GridDataFactory.fillDefaults().grab(true, true).applyTo(this); - // GridLayoutFactory.fillDefaults().numColumns(1).applyTo(this); + // GridDataFactory.fillDefaults().grab(true, true).applyTo(this); + // GridLayoutFactory.fillDefaults().numColumns(1).applyTo(this); this.setLayout(new FillLayout()); viewer = createViewer(); addSelectionListener(); + addCheckStateListener(); setContentProvider(); createSelectorListener(parent); enableToolTips(); configureTable(); } + private void addCheckStateListener() { + viewer.addCheckStateListener(new ICheckStateListener() { + + @Override + public void checkStateChanged(CheckStateChangedEvent event) { + boolean checked = event.getChecked(); + if (checked) { + view.performSelection(getDisplay(), (ElementSelector) event.getElement()); + } else { + view.clearResultVisualisation((ElementSelector) event.getElement()); + } + } + }); + } + public Table getTable() { return viewer.getTable(); } @@ -71,17 +89,18 @@ public class ElementSelectorTableUI extends Composite { return selection != null ? (ElementSelector) selection.getFirstElement() : null; } - private TableViewer createViewer() { - return new TableViewer(this, SWT.FULL_SELECTION | SWT.SINGLE); + private CheckboxTableViewer createViewer() { + return CheckboxTableViewer.newCheckList(this, SWT.FULL_SELECTION | SWT.SINGLE); } private void configureTable() { - Table table = viewer.getTable(); + Table table = getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); createNameColumn(); createQueryColumn(); + //createQueryActiveColumn(); } private void enableToolTips() { @@ -94,8 +113,8 @@ public class ElementSelectorTableUI extends Composite { public Object[] getElements(Object inputElement) { if (inputElement == null || !(inputElement instanceof Collection)) return new Object[0]; - - return ((Collection)inputElement).toArray(); + + return ((Collection) inputElement).toArray(); } }); } @@ -111,18 +130,18 @@ public class ElementSelectorTableUI extends Composite { ElementSelector selector = (ElementSelector) element; return " " + selector.getName(); } - + @Override public Image getImage(Object element) { ElementSelector selector = (ElementSelector) element; float[] color = selector.getColor(); if (color == null) return null; - + RGB rgb = ElementSelectionTools.literalToColor(color).getRgb(); - + PaletteData paletteData = new PaletteData(new RGB[] { new RGB(255, 255, 255), rgb }); - + // Create image with a colored horizontal bar // TODO: Indicate line width Image image = resourceManager.createImage(ImageDescriptor.createFromImageDataProvider(zoom -> { @@ -134,10 +153,10 @@ public class ElementSelectorTableUI extends Composite { imageData.setPixel(x, y, 1); } } - + return imageData; })); - + return image; } }); @@ -160,23 +179,24 @@ public class ElementSelectorTableUI extends Composite { } private void createSelectorListener(Composite parent) { - Simantics.getSession().asyncRequest(new ElementSelectionTools.SelectionsRequest(), new SyncListenerAdapter>() { - public void execute(ReadGraph graph, Collection result) { - parent.getDisplay().asyncExec(() -> { - viewer.setInput(result); - }); - } + Simantics.getSession().asyncRequest(new ElementSelectionTools.SelectionsRequest(), + new SyncListenerAdapter>() { + public void execute(ReadGraph graph, Collection result) { + parent.getDisplay().asyncExec(() -> { + viewer.setInput(result); + }); + } - @Override - public void exception(ReadGraph graph, Throwable t) throws DatabaseException { - LOGGER.error("Error getting element selector list", t); - } + @Override + public void exception(ReadGraph graph, Throwable t) throws DatabaseException { + LOGGER.error("Error getting element selector list", t); + } - @Override - public boolean isDisposed() { - return ElementSelectorTableUI.this.isDisposed(); - } - }); + @Override + public boolean isDisposed() { + return ElementSelectorTableUI.this.isDisposed(); + } + }); } private void addSelectionListener() { @@ -189,8 +209,16 @@ public class ElementSelectorTableUI extends Composite { IStructuredSelection selection = (IStructuredSelection) event.getViewer().getSelection(); Display display = event.getViewer().getControl().getDisplay(); ElementSelector query = (ElementSelector) selection.getFirstElement(); - + view.performSelection(display, query); + + viewer.setChecked(selection.getFirstElement(), true); } } + + @Override + public void dispose() { + view.dispose(); + super.dispose(); + } } diff --git a/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/parts/ElementSelectionView.java b/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/parts/ElementSelectionView.java index 16e6bb15..31d1c6e3 100644 --- a/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/parts/ElementSelectionView.java +++ b/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/parts/ElementSelectionView.java @@ -1,9 +1,13 @@ package org.simantics.district.selection.ui.parts; +import java.awt.Color; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import javax.annotation.PostConstruct; import javax.inject.Inject; @@ -34,6 +38,7 @@ import org.simantics.db.layer0.SelectionHints; import org.simantics.db.layer0.request.ActiveModels; import org.simantics.db.request.Read; import org.simantics.district.network.ui.DistrictNetworkUIUtil; +import org.simantics.district.network.ui.participants.DistrictFinderVisualisationParticipant; import org.simantics.district.selection.ElementSelector; import org.simantics.district.selection.ElementSelector.DiagramGenerator; import org.simantics.district.selection.ElementSelector.ExplicitGenerator; @@ -41,6 +46,7 @@ import org.simantics.district.selection.ElementSelector.PropertySelector; import org.simantics.district.selection.ElementSelector.SelectionResult; import org.simantics.district.selection.ui.ElementSelectionTools; import org.simantics.district.selection.ui.ElementSelectorTableUI; +import org.simantics.scl.runtime.tuple.Tuple2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -123,18 +129,28 @@ public class ElementSelectionView { public void setFocus() { table.setFocus(); } - + public ElementSelector getSelectedItem() { return table.getSelectedItem(); } + + private Map resultCache = new HashMap<>(); public void performSelection(Display display, ElementSelector query) { try { Collection models = Simantics.getSession().syncRequest(new ActiveModels(Simantics.getProjectResource())); final Resource model = models.isEmpty() ? null : models.iterator().next(); + Tuple2 selectionResult = resultCache.get(query); + if (selectionResult != null) { + // clear existing result and visualisation + clearResultVisualisation(query); + } + SelectionResult result = performQuery(query, model); + resultCache.put(query, new Tuple2(result, model)); + if (result.tailCount != result.tailSize) { showArbitraryResultWarning(query, result); } @@ -143,20 +159,32 @@ public class ElementSelectionView { openDiagramWithSelection(display, result); } - StructuredSelection selection = makeSelection(model, result); + StructuredSelection selection = makeSelection(model, result, query.getColor()); selectionService.setPostSelection(selection); sendSelectionEvent(selection); } catch (DatabaseException e) { LOGGER.error("Element selection query failed", e); } } + + public void clearResultVisualisation(ElementSelector query) { + Tuple2 selectionResult = resultCache.get(query); + if (selectionResult != null) { + SelectionResult result = (SelectionResult) selectionResult.c0; + Resource model = (Resource) selectionResult.c1; + eventBroker.send(SELECTION_EVENT_ID, makeSelection(model, result, null)); + } + } - private StructuredSelection makeSelection(final Resource model, SelectionResult result) { + private StructuredSelection makeSelection(final Resource model, SelectionResult result, float[] fs) { return new StructuredSelection(result.elements.stream() .map(p0 -> { AdaptableHintContext selectionElement = new ElementSelectionTools.SelectionElement(SelectionHints.STD_KEYS); selectionElement.setHint(SelectionHints.KEY_MAIN, p0); selectionElement.setHint(SelectionHints.KEY_MODEL, model); + if (fs != null) { + selectionElement.setHint(DistrictFinderVisualisationParticipant.COLOR_KEY, new Color(fs[2], fs[1], fs[0], fs[3])); + } return selectionElement; }) .toArray()); @@ -191,4 +219,11 @@ public class ElementSelectionView { }); return result; } + + public void dispose() { + for (Entry entry : resultCache.entrySet()) { + ElementSelector query = entry.getKey(); + clearResultVisualisation(query); + } + } } -- 2.45.2 From 40d019be6ff00ecec1c3250a03bb5c046ad98182 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Tue, 28 Jul 2020 15:20:54 +0300 Subject: [PATCH 04/16] Fixed broken icon references from District Finder UI contributions gitlab #86 Change-Id: I72636e52f2c63403260e70ab7f3fba84277b95a7 (cherry picked from commit 80aef302ef8e28f72e861c93ac71421f289af8c0) --- org.simantics.district.selection.ui/fragment.e4xmi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/org.simantics.district.selection.ui/fragment.e4xmi b/org.simantics.district.selection.ui/fragment.e4xmi index b58825a1..130192a2 100644 --- a/org.simantics.district.selection.ui/fragment.e4xmi +++ b/org.simantics.district.selection.ui/fragment.e4xmi @@ -1,7 +1,7 @@ - + View categoryTag:District @@ -10,8 +10,8 @@ - - + + -- 2.45.2 From 96d2122ccc3a7d3503d0bf2ab121eb8fd2186323 Mon Sep 17 00:00:00 2001 From: jsimomaa Date: Wed, 12 Aug 2020 17:35:56 +0300 Subject: [PATCH 05/16] TechTypeTable features Squashed cherry pick of change ids * I552cfac33369bf960342836428bc005ed3b1505f * I24f2b651176a7b9aa8b8871cf8e49473350d9193 * I37e9db42c3e7b4a95ba12bed87107cddccd66bc1 * Iee2cae3751983d059216fea7ec11fd47a9e9dda4 * Iba22b4ea4db7a772664e2b76ab44a88a70ea8e80 * I7f7dd9aae0d90b00250ecf42e01ce566e57544d0 * I8550ac1edb7d650211c51ce6379487788001569c * Ia5ac3f513adfd57d4a2e499c9a7dd4ef77355e9f gitlab #93 Change-Id: I33967fb28b9ec41364d68787c359d6c363089b65 --- .../district/imports/DistrictImportUtils.java | 13 +- .../graph/DistrictNetworkTechType.pgraph | 23 ++ .../ontology/DistrictNetworkResource.java | 24 ++ .../fragment.e4xmi | 4 +- org.simantics.district.network.ui/plugin.xml | 4 + .../ui/table/ImportTechTypeCSVHandler.java | 54 +++++ .../adapters/TechTypeEditorAdapter.java | 79 ++++++ ...TechTypeColumnHeaderTableDataProvider.java | 33 +++ .../TechTypeRowHeaderTableDataProvider.java | 33 +++ .../ui/techtype/table/TechTypeTable.java | 224 ++++++++++++++++++ .../table/TechTypeTableDataProvider.java | 161 +++++++++++++ .../table/TechTypeTableSortModel.java | 127 ++++++++++ .../ui/techtype/table/TechTypeTableUI.java | 11 + .../ui/techtype/table/TechTypeTableView.java | 96 ++++++++ .../META-INF/MANIFEST.MF | 8 +- .../build.properties | 3 +- org.simantics.district.network/plugin.xml | 12 + .../scl/Simantics/District/TechType.scl | 7 + .../district/network/DistrictNetworkUtil.java | 59 +++++ .../network/techtype/TechTypeUtils.java | 207 ++++++++++++++++ .../requests/PossibleTechTypeItem.java | 30 +++ .../requests/PossibleTechTypeTable.java | 33 +++ .../requests/PossibleTechTypeTableData.java | 23 ++ .../techtype/requests/TechTypeTableData.java | 97 ++++++++ .../requests/TechTypeTableKeyName.java | 33 +++ .../techtype/requests/WriteTechTypeTable.java | 45 ++++ .../network/techtype/variable/Functions.java | 59 +++++ 27 files changed, 1494 insertions(+), 8 deletions(-) create mode 100644 org.simantics.district.network.ontology/graph/DistrictNetworkTechType.pgraph create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/table/ImportTechTypeCSVHandler.java create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/adapters/TechTypeEditorAdapter.java create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeColumnHeaderTableDataProvider.java create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeRowHeaderTableDataProvider.java create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTable.java create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableDataProvider.java create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableSortModel.java create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableUI.java create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableView.java create mode 100644 org.simantics.district.network/plugin.xml create mode 100644 org.simantics.district.network/scl/Simantics/District/TechType.scl create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeUtils.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeItem.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeTable.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeTableData.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableKeyName.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/requests/WriteTechTypeTable.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/variable/Functions.java diff --git a/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java b/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java index 836ebd02..1ff69279 100644 --- a/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java +++ b/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java @@ -1,6 +1,8 @@ package org.simantics.district.imports; import java.io.IOException; +import java.io.Reader; +import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -64,7 +66,7 @@ public class DistrictImportUtils { public static Map readCSVHeader(Path source, CSVFormat format, boolean firstAsHeader) throws IOException { if (firstAsHeader) format = format.withFirstRecordAsHeader(); - try (CSVParser parser = format.parse(Files.newBufferedReader(source))) { + try (CSVParser parser = format.parse(Files.newBufferedReader(source, Charset.defaultCharset()))) { return parser.getHeaderMap(); } } @@ -105,11 +107,16 @@ public class DistrictImportUtils { } public static void consumeCSV(Path source, char delim, boolean firstAsHeader, Function consumer) throws IOException { - CSVFormat format = CSVFormat.newFormat(delim); + consumeCSV(Files.newBufferedReader(source), delim, firstAsHeader, consumer); + } + + public static void consumeCSV(Reader reader, char delim, boolean firstAsHeader, + Function consumer) throws IOException { + CSVFormat format = CSVFormat.newFormat(delim).withQuote('"'); if (firstAsHeader) { format = format.withFirstRecordAsHeader(); } - try (CSVParser parser = format.parse(Files.newBufferedReader(source))) { + try (CSVParser parser = format.parse(reader)) { Iterator records = parser.iterator(); while (records.hasNext()) { Boolean cont = consumer.apply(records.next()); diff --git a/org.simantics.district.network.ontology/graph/DistrictNetworkTechType.pgraph b/org.simantics.district.network.ontology/graph/DistrictNetworkTechType.pgraph new file mode 100644 index 00000000..96865b34 --- /dev/null +++ b/org.simantics.district.network.ontology/graph/DistrictNetworkTechType.pgraph @@ -0,0 +1,23 @@ +L0 = +STR = +SEL = + +DN = + +TT = DN.TechType : L0.Library + +table = TT.TechTypeTable -- table.HasData L0.String + + // Link to corresponding component type + >-- table.HasComponentType STR.ComponentType + +TT.Functions : L0.Library +TT.Functions.techTypeCodeValueAccessor : L0.ExternalValue + L0.HasValueType "ValueAccessor" + +TT.TechTypeCodeParameterType : SEL.GenericParameterType + @L0.assert L0.valueAccessor TT.Functions.techTypeCodeValueAccessor diff --git a/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java b/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java index d12c2755..1b4d4e24 100644 --- a/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java +++ b/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java @@ -376,6 +376,14 @@ public class DistrictNetworkResource { public final Resource SupplyConnectionType; public final Resource SupplyInConnectionType; public final Resource SupplyOutConnectionType; + public final Resource TechType; + public final Resource TechType_Functions; + public final Resource TechType_Functions_techTypeCodeValueAccessor; + public final Resource TechType_TechTypeCodeParameterType; + public final Resource TechType_TechTypeTable; + public final Resource TechType_TechTypeTable_HasComponentType; + public final Resource TechType_TechTypeTable_HasData; + public final Resource TechType_TechTypeTable_HasData_Inverse; public final Resource Vertex; public final Resource VertexDefaultMapping; public final Resource VertexDefaultMapping_Inverse; @@ -828,6 +836,14 @@ public class DistrictNetworkResource { public static final String SupplyConnectionType = "http://www.simantics.org/DistrictNetwork-1.0/SupplyConnectionType"; public static final String SupplyInConnectionType = "http://www.simantics.org/DistrictNetwork-1.0/SupplyInConnectionType"; public static final String SupplyOutConnectionType = "http://www.simantics.org/DistrictNetwork-1.0/SupplyOutConnectionType"; + public static final String TechType = "http://www.simantics.org/DistrictNetwork-1.0/TechType"; + public static final String TechType_Functions = "http://www.simantics.org/DistrictNetwork-1.0/TechType/Functions"; + public static final String TechType_Functions_techTypeCodeValueAccessor = "http://www.simantics.org/DistrictNetwork-1.0/TechType/Functions/techTypeCodeValueAccessor"; + public static final String TechType_TechTypeCodeParameterType = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeCodeParameterType"; + public static final String TechType_TechTypeTable = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeTable"; + public static final String TechType_TechTypeTable_HasComponentType = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeTable/HasComponentType"; + public static final String TechType_TechTypeTable_HasData = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeTable/HasData"; + public static final String TechType_TechTypeTable_HasData_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeTable/HasData/Inverse"; public static final String Vertex = "http://www.simantics.org/DistrictNetwork-1.0/Vertex"; public static final String VertexDefaultMapping = "http://www.simantics.org/DistrictNetwork-1.0/VertexDefaultMapping"; public static final String VertexDefaultMapping_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/VertexDefaultMapping/Inverse"; @@ -1290,6 +1306,14 @@ public class DistrictNetworkResource { SupplyConnectionType = getResourceOrNull(graph, URIs.SupplyConnectionType); SupplyInConnectionType = getResourceOrNull(graph, URIs.SupplyInConnectionType); SupplyOutConnectionType = getResourceOrNull(graph, URIs.SupplyOutConnectionType); + TechType = getResourceOrNull(graph, URIs.TechType); + TechType_Functions = getResourceOrNull(graph, URIs.TechType_Functions); + TechType_Functions_techTypeCodeValueAccessor = getResourceOrNull(graph, URIs.TechType_Functions_techTypeCodeValueAccessor); + TechType_TechTypeCodeParameterType = getResourceOrNull(graph, URIs.TechType_TechTypeCodeParameterType); + TechType_TechTypeTable = getResourceOrNull(graph, URIs.TechType_TechTypeTable); + TechType_TechTypeTable_HasComponentType = getResourceOrNull(graph, URIs.TechType_TechTypeTable_HasComponentType); + TechType_TechTypeTable_HasData = getResourceOrNull(graph, URIs.TechType_TechTypeTable_HasData); + TechType_TechTypeTable_HasData_Inverse = getResourceOrNull(graph, URIs.TechType_TechTypeTable_HasData_Inverse); Vertex = getResourceOrNull(graph, URIs.Vertex); VertexDefaultMapping = getResourceOrNull(graph, URIs.VertexDefaultMapping); VertexDefaultMapping_Inverse = getResourceOrNull(graph, URIs.VertexDefaultMapping_Inverse); diff --git a/org.simantics.district.network.ui/fragment.e4xmi b/org.simantics.district.network.ui/fragment.e4xmi index c199a959..89afdc5d 100644 --- a/org.simantics.district.network.ui/fragment.e4xmi +++ b/org.simantics.district.network.ui/fragment.e4xmi @@ -16,7 +16,7 @@ - + @@ -49,6 +49,6 @@ - + diff --git a/org.simantics.district.network.ui/plugin.xml b/org.simantics.district.network.ui/plugin.xml index cee0a77f..3b8bf45c 100644 --- a/org.simantics.district.network.ui/plugin.xml +++ b/org.simantics.district.network.ui/plugin.xml @@ -80,6 +80,10 @@ priority="300" class="org.simantics.district.network.ui.OpenDiagramFromNetworkElementAdapter"> + + diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/table/ImportTechTypeCSVHandler.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/table/ImportTechTypeCSVHandler.java new file mode 100644 index 00000000..4f833fca --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/table/ImportTechTypeCSVHandler.java @@ -0,0 +1,54 @@ +package org.simantics.district.network.ui.table; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Shell; +import org.simantics.district.imports.DistrictImportUtils; +import org.simantics.district.network.ui.techtype.table.TechTypeTableView; +import org.simantics.utils.ui.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ImportTechTypeCSVHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(ImportTechTypeCSVHandler.class); + + @Inject + EPartService partService; + + @Execute + public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell s) { + // here we can import based on the current CSV table data + + FileDialog dialog = new FileDialog(s); + String path = dialog.open(); + try { + if (path != null) { + + Path p = Paths.get(path); + if (Files.exists(p)) { + @SuppressWarnings("unused") + Map readCSVHeader = DistrictImportUtils.readCSVHeader(p, ';', true); + TechTypeTableView.table.setTechTypePath(path); + } else { + LOGGER.warn("Path does not exist even though path != null: {}", p); + } + } else { + LOGGER.error("Invalid file path given {}", path); + } + } catch (Exception e) { + LOGGER.error("Could not read file {}", path, e); + ExceptionUtils.logAndShowError("Could not read file " + path + " : " + e.getMessage(), e); + } + } +} diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/adapters/TechTypeEditorAdapter.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/adapters/TechTypeEditorAdapter.java new file mode 100644 index 00000000..5ebe6ed4 --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/adapters/TechTypeEditorAdapter.java @@ -0,0 +1,79 @@ +package org.simantics.district.network.ui.techtype.adapters; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.PlatformUI; +import org.simantics.Simantics; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ReadRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.district.network.ui.techtype.table.TechTypeTableView; +import org.simantics.ui.utils.ResourceAdaptionUtils; +import org.simantics.ui.workbench.editor.AbstractResourceEditorAdapter; +import org.simantics.ui.workbench.editor.EditorAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Reino Ruusu + */ +public class TechTypeEditorAdapter extends AbstractResourceEditorAdapter implements EditorAdapter { + + private static final Logger LOGGER = LoggerFactory.getLogger(TechTypeEditorAdapter.class); + + public TechTypeEditorAdapter() throws MalformedURLException, IOException { + super("Tech Type Table View"); + setIcon(ImageDescriptor.createFromURL(FileLocator.resolve(new URL("platform:/plugin/com.famfamfam.silk/icons/table.png")))); //$NON-NLS-1$ + } + + @Override + public boolean canHandle(ReadGraph graph, Object input) throws DatabaseException { + Resource r = ResourceAdaptionUtils.toSingleResource(input); + if (r == null) + return false; + return graph.isInstanceOf(r, DistrictNetworkResource.getInstance(graph).TechType_TechTypeTable); + } + + @Override + public void openEditor(Resource table) throws Exception { + IEclipseContext eclipseContext = PlatformUI.getWorkbench().getService(IEclipseContext.class); + if (eclipseContext == null) { + LOGGER.error("No Eclipse context available"); + return; + } + + eclipseContext = eclipseContext.getActiveLeaf(); + EPartService partService = eclipseContext.get(EPartService.class); + if (partService == null) + return; + + partService.showPart(TechTypeTableView.ID, PartState.ACTIVATE); + + try { + Simantics.getSession().syncRequest(new ReadRequest() { + @Override + public void run(ReadGraph graph) throws DatabaseException { + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + Resource componentType = graph.getPossibleObject(table, DN.TechType_TechTypeTable_HasComponentType); + String data = graph.getPossibleRelatedValue2(table, DN.TechType_TechTypeTable_HasData); + + TechTypeTableView.table.getDisplay().asyncExec(() -> { + TechTypeTableView.table.setComponentType(componentType); + TechTypeTableView.table.setTechTypeData(data); + }); + } + }); + } catch (DatabaseException e) { + LOGGER.error("Failed to read tech type table {}", table, e); + } + } +} diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeColumnHeaderTableDataProvider.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeColumnHeaderTableDataProvider.java new file mode 100644 index 00000000..9b632192 --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeColumnHeaderTableDataProvider.java @@ -0,0 +1,33 @@ +package org.simantics.district.network.ui.techtype.table; + +import org.eclipse.nebula.widgets.nattable.data.IDataProvider; + +public class TechTypeColumnHeaderTableDataProvider implements IDataProvider { + + private TechTypeTableDataProvider bodyDataProvider; + + public TechTypeColumnHeaderTableDataProvider(TechTypeTableDataProvider bodyDataProvider) { + this.bodyDataProvider = bodyDataProvider; + } + + @Override + public Object getDataValue(int columnIndex, int rowIndex) { + return bodyDataProvider.getHeaderValue(columnIndex); + } + + @Override + public void setDataValue(int columnIndex, int rowIndex, Object newValue) { + + } + + @Override + public int getColumnCount() { + return bodyDataProvider.getColumnCount(); + } + + @Override + public int getRowCount() { + return 1; + } + +} diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeRowHeaderTableDataProvider.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeRowHeaderTableDataProvider.java new file mode 100644 index 00000000..4d21bd55 --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeRowHeaderTableDataProvider.java @@ -0,0 +1,33 @@ +package org.simantics.district.network.ui.techtype.table; + +import org.eclipse.nebula.widgets.nattable.data.IDataProvider; + +public class TechTypeRowHeaderTableDataProvider implements IDataProvider { + + protected final IDataProvider bodyDataProvider; + + public TechTypeRowHeaderTableDataProvider(IDataProvider bodyDataProvider) { + this.bodyDataProvider = bodyDataProvider; + } + + @Override + public int getColumnCount() { + return 1; + } + + @Override + public int getRowCount() { + return this.bodyDataProvider.getRowCount(); + } + + @Override + public Object getDataValue(int columnIndex, int rowIndex) { + return Integer.valueOf(rowIndex + 1); + } + + @Override + public void setDataValue(int columnIndex, int rowIndex, Object newValue) { + throw new UnsupportedOperationException(); + } + +} diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTable.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTable.java new file mode 100644 index 00000000..0c44bff0 --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTable.java @@ -0,0 +1,224 @@ +package org.simantics.district.network.ui.techtype.table; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.stream.Collectors; + +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.layout.GridLayoutFactory; +import org.eclipse.nebula.widgets.nattable.NatTable; +import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration; +import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; +import org.eclipse.nebula.widgets.nattable.copy.command.CopyDataCommandHandler; +import org.eclipse.nebula.widgets.nattable.data.IDataProvider; +import org.eclipse.nebula.widgets.nattable.freeze.CompositeFreezeLayer; +import org.eclipse.nebula.widgets.nattable.freeze.FreezeLayer; +import org.eclipse.nebula.widgets.nattable.grid.GridRegion; +import org.eclipse.nebula.widgets.nattable.grid.data.DefaultCornerDataProvider; +import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer; +import org.eclipse.nebula.widgets.nattable.grid.layer.CornerLayer; +import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultColumnHeaderDataLayer; +import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultRowHeaderDataLayer; +import org.eclipse.nebula.widgets.nattable.grid.layer.GridLayer; +import org.eclipse.nebula.widgets.nattable.grid.layer.RowHeaderLayer; +import org.eclipse.nebula.widgets.nattable.group.ColumnGroupHeaderLayer; +import org.eclipse.nebula.widgets.nattable.group.ColumnGroupModel; +import org.eclipse.nebula.widgets.nattable.hideshow.ColumnHideShowLayer; +import org.eclipse.nebula.widgets.nattable.hover.HoverLayer; +import org.eclipse.nebula.widgets.nattable.hover.config.BodyHoverStylingBindings; +import org.eclipse.nebula.widgets.nattable.layer.DataLayer; +import org.eclipse.nebula.widgets.nattable.layer.ILayer; +import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer; +import org.eclipse.nebula.widgets.nattable.reorder.RowReorderLayer; +import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; +import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer; +import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Text; +import org.simantics.Simantics; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.district.network.techtype.requests.WriteTechTypeTable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TechTypeTable extends Composite { + + private final static Logger LOGGER = LoggerFactory.getLogger(TechTypeTable.class); + + NatTable table; + private TechTypeTableDataProvider bodyDataProvider; + DataLayer bodyDataLayer; + private IConfigRegistry summaryConfigRegistry; + private IUniqueIndexLayer summaryRowLayer; + private ViewportLayer viewportLayer; + private CompositeFreezeLayer compositeFreezeLayer; + private FreezeLayer freezeLayer; + // private TableDataSortModel sortModel; + private ColumnHideShowLayer columnHideShowLayer; + private ColumnGroupModel columnGroupModel = new ColumnGroupModel(); + private TechTypeColumnHeaderTableDataProvider columnHeaderDataProvider; + Clipboard cpb; + public SelectionLayer selectionLayer; + private TechTypeTableSortModel sortModel; + + private Resource componentType; + + public TechTypeTable(Composite parent, int style, Resource componentType, String data) { + super(parent, style); + this.componentType = componentType; + + defaultInitializeUI(data); + } + + private void defaultInitializeUI(String data) { + GridDataFactory.fillDefaults().grab(true, true).applyTo(this); + GridLayoutFactory.fillDefaults().numColumns(1).applyTo(this); + + Composite filterComposite = new Composite(this, SWT.NONE); + GridDataFactory.fillDefaults().grab(true, false).applyTo(filterComposite); + GridLayoutFactory.fillDefaults().numColumns(1).applyTo(filterComposite); + + createFilterBar(filterComposite); + + Composite tableComposite = new Composite(this, SWT.NONE); + GridDataFactory.fillDefaults().grab(true, true).applyTo(tableComposite); + GridLayoutFactory.fillDefaults().numColumns(1).applyTo(tableComposite); + + createTable(tableComposite, data); + } + + private void createFilterBar(Composite filterComposite) { + + Text filterText = new Text(filterComposite, SWT.BORDER); + GridDataFactory.fillDefaults().grab(true, true).applyTo(filterText); + filterText.addModifyListener(new ModifyListener() { + + @Override + public void modifyText(ModifyEvent e) { + System.out.println("text modified"); + bodyDataProvider.setFilter(filterText.getText()); + table.refresh(true); + } + }); + + } + + private void createTable(Composite parent, String data) { + + // build the body layer stack + // Usually you would create a new layer stack by extending + // AbstractIndexLayerTransform and + // setting the ViewportLayer as underlying layer. But in this case using the + // ViewportLayer + // directly as body layer is also working. + bodyDataProvider = new TechTypeTableDataProvider(data); + bodyDataLayer = new DataLayer(bodyDataProvider); + + RowReorderLayer rowReorderLayer = new RowReorderLayer( + columnHideShowLayer = new ColumnHideShowLayer(bodyDataLayer)); + + HoverLayer hoverLayer = new HoverLayer(rowReorderLayer, false); + // we need to ensure that the hover styling is removed when the mouse + // cursor moves out of the cell area + hoverLayer.addConfiguration(new BodyHoverStylingBindings(hoverLayer)); + + selectionLayer = new SelectionLayer(hoverLayer); + + viewportLayer = new ViewportLayer(selectionLayer); + viewportLayer.setRegionName(GridRegion.BODY); + freezeLayer = new FreezeLayer(selectionLayer); + compositeFreezeLayer = new CompositeFreezeLayer(freezeLayer, viewportLayer, selectionLayer); + + // build the column header layer + columnHeaderDataProvider = new TechTypeColumnHeaderTableDataProvider(bodyDataProvider); + DataLayer columnHeaderDataLayer = new DefaultColumnHeaderDataLayer(columnHeaderDataProvider); + columnHeaderDataLayer.setRowsResizableByDefault(false); + columnHeaderDataLayer.setColumnsResizableByDefault(true); + ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, compositeFreezeLayer, + selectionLayer); + ColumnGroupHeaderLayer columnGroupHeaderLayer = new ColumnGroupHeaderLayer(columnHeaderLayer, selectionLayer, + columnGroupModel); + columnGroupHeaderLayer.setCalculateHeight(true); + SortHeaderLayer columnSortHeaderLayer = new SortHeaderLayer<>(columnGroupHeaderLayer, + sortModel = new TechTypeTableSortModel(bodyDataProvider)); + + // build the row header layer + IDataProvider rowHeaderDataProvider = new TechTypeRowHeaderTableDataProvider(bodyDataProvider); + DataLayer rowHeaderDataLayer = new DefaultRowHeaderDataLayer(rowHeaderDataProvider); + rowHeaderDataLayer.setRowsResizableByDefault(false); + rowHeaderDataLayer.setColumnsResizableByDefault(false); + RowHeaderLayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, compositeFreezeLayer, selectionLayer); + + // build the corner layer + IDataProvider cornerDataProvider = new DefaultCornerDataProvider(columnHeaderDataProvider, + rowHeaderDataProvider); + DataLayer cornerDataLayer = new DataLayer(cornerDataProvider); + ILayer cornerLayer = new CornerLayer(cornerDataLayer, rowHeaderLayer, columnSortHeaderLayer); + + // build the grid layer + GridLayer gridLayer = new GridLayer(compositeFreezeLayer, columnSortHeaderLayer, rowHeaderLayer, cornerLayer); + + table = new NatTable(parent, NatTable.DEFAULT_STYLE_OPTIONS | SWT.BORDER, gridLayer, false); + GridDataFactory.fillDefaults().grab(true, true).applyTo(table); + + // Register a CopyDataCommandHandler that also copies the headers and + // uses the configured IDisplayConverters + CopyDataCommandHandler copyHandler = new CopyDataCommandHandler(selectionLayer, columnHeaderDataLayer, + rowHeaderDataLayer); + copyHandler.setCopyFormattedText(true); + gridLayer.registerCommandHandler(copyHandler); + + // initialize paste handler with SWT clipboard + cpb = new Clipboard(getDisplay()); + // PasteDataCommandHandler pasteHandler = new + // PasteDataCommandHandler(bodyDataProvider, bodyDataLayer, selectionLayer, + // cpb); + // bodyDataLayer.registerCommandHandler(pasteHandler); + + table.addConfiguration(new DefaultNatTableStyleConfiguration()); + // table.addConfiguration(new EditingSupportConfiguration(bodyDataProvider)); + table.configure(); + } + + @Override + public void dispose() { + cpb.dispose(); + super.dispose(); + } + + public void setTechTypePath(String path) { + String data; + try { + data = Files.lines(Paths.get(path), Charset.defaultCharset()).collect(Collectors.joining("\n")); + } catch (IOException e) { + LOGGER.error("Failed to read contents of file '{}' as {}", path, Charset.defaultCharset(), e); + return; + } + + try { + Simantics.getSession().syncRequest(new WriteTechTypeTable(componentType, data)); + } catch (DatabaseException e) { + LOGGER.error("Failed to write tech type table data to model", e); + } + + setTechTypeData(data); + } + + public void setTechTypeData(String data) { + bodyDataProvider.setData(data); + table.refresh(true); + } + + public void setComponentType(Resource componentType) { + this.componentType = componentType; + } + +} + diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableDataProvider.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableDataProvider.java new file mode 100644 index 00000000..850cc39f --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableDataProvider.java @@ -0,0 +1,161 @@ +package org.simantics.district.network.ui.techtype.table; + +import java.io.IOException; +import java.io.StringReader; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.csv.CSVRecord; +import org.eclipse.nebula.widgets.nattable.data.IDataProvider; +import org.simantics.district.imports.DistrictImportUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TechTypeTableDataProvider implements IDataProvider { + + @SuppressWarnings("unused") + private final static Logger LOGGER = LoggerFactory.getLogger(TechTypeTableDataProvider.class); + + private List records = new ArrayList<>(); + private List filteredRecords = new ArrayList<>(); + private String filter = ""; + private List variables = null; + private List headers = null; + + public TechTypeTableDataProvider(String data) { + // load csv + setData(data); + } + + public String getVariableName(int columnIndex) { + return variables != null && columnIndex < variables.size() ? variables.get(columnIndex) : null; + } + + public int getVariableIndex(String variableName) { + return variables != null ? variables.indexOf(variableName) : -1; + } + + public String getHeaderValue(int columnIndex) { + if (headers == null) { + return ""; + } + return headers.get(columnIndex); + } + + @Override + public Object getDataValue(int columnIndex, int rowIndex) { + return filteredRecords.get(rowIndex).get(columnIndex); + } + + @Override + public void setDataValue(int columnIndex, int rowIndex, Object newValue) { + + } + + @Override + public int getColumnCount() { + if (records.isEmpty()) { + return 0; + } + return records.get(0).size(); + } + + @Override + public int getRowCount() { + return filteredRecords.size() - 1; + } + + public boolean isEditable(int columnIndex, int rowIndex) { + return false; + } + + public void setFilter(String text) { + this.filter = text.toLowerCase(); + + filteredRecords = records.stream().filter(record -> { + for (int i = 0; i < record.size(); i++) { + String columnContent = record.get(i); + if (columnContent.toLowerCase().contains(filter)) { + return true; + } + } + return false; + }).collect(Collectors.toList()); + } + + /** + * Read a CSV file into table contents. + * + * Set path to null to create an empty table. + * + * @param path The path of the CSV file to be read. + */ + public void setPath(String path) { + records.clear(); + filteredRecords.clear(); + if (path != null) { + Path techTypeCsv = Paths.get(path); + try { + DistrictImportUtils.consumeCSV(techTypeCsv, ';', false, record -> { + records.add(record); + return true; + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + + setFilter(""); + } + + /** + * Set table data contents to a given string of CSV data. + * + * Set 'data' to null to create an empty table. + * + * @param data The CSV data to be shown in the table. + */ + public void setData(String data) { + records.clear(); + filteredRecords.clear(); + if (data != null) { + long ncommas = data.chars().filter(c -> c == ',').count(); + long nsemis = data.chars().filter(c -> c == ';').count(); + char delim = nsemis > ncommas ? ';' : ','; + StringReader reader = new StringReader(data); + try { + DistrictImportUtils.consumeCSV(reader, delim, false, record -> { + records.add(record); + return true; + }); + } catch (IOException e) { + LOGGER.error("Error reading CSV file", e); + return; + } + + CSVRecord header = records.remove(0); + CSVRecord units = records.remove(0); + + variables = new ArrayList<>(); + headers = new ArrayList<>(); + + Iterator it = header.iterator(); + Iterator uit = units.iterator(); + + while (it.hasNext()) { + String variable = it.next().trim(); + String unit = uit.hasNext() ? uit.next().trim() : null; + + variables.add(variable); + headers.add(variable + (unit != null && !unit.isEmpty() && !(unit.startsWith("(") && unit.endsWith(")")) ? " [" + unit + "]" : "")); + } + } + + setFilter(""); + } + +} \ No newline at end of file diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableSortModel.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableSortModel.java new file mode 100644 index 00000000..f6a02f4a --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableSortModel.java @@ -0,0 +1,127 @@ +package org.simantics.district.network.ui.techtype.table; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.eclipse.nebula.widgets.nattable.sort.ISortModel; +import org.eclipse.nebula.widgets.nattable.sort.SortDirectionEnum; +import org.simantics.utils.strings.AlphanumComparator; + +public class TechTypeTableSortModel implements ISortModel { + + private static final SortDirectionEnum[] NO_DIRECTIONS = {}; + private static final boolean[] NO_BOOLEANS = {}; + + /** + * Array that contains the sort direction for every column. + * Needed to access the current sort state of a column. + */ + protected SortDirectionEnum[] sortDirections = NO_DIRECTIONS; + + /** + * Array that contains the sorted flags for every column. + * Needed to access the current sort state of a column. + */ + protected boolean[] sorted = NO_BOOLEANS; + + /** + * As this implementation only supports single column sorting, + * this property contains the the column index of the column that + * is currently used for sorting. + * Initial value = -1 for no sort column + */ + protected int currentSortColumn = -1; + + /** + * As this implementation only supports single column sorting, + * this property contains the current sort direction of the column that + * is currently used for sorting. + */ + protected SortDirectionEnum currentSortDirection = SortDirectionEnum.ASC; + + private TechTypeTableDataProvider bodyDataProvider; + + public TechTypeTableSortModel(TechTypeTableDataProvider bodyDataProvider) { + this.bodyDataProvider = bodyDataProvider; + } + + + @Override + public List getSortedColumnIndexes() { + List indexes = new ArrayList(); + if (currentSortColumn > -1) { + indexes.add(Integer.valueOf(currentSortColumn)); + } + return indexes; + } + + @Override + public boolean isColumnIndexSorted(int columnIndex) { + if (sorted.length <= columnIndex) + return false; + return sorted[columnIndex]; + } + + @Override + public SortDirectionEnum getSortDirection(int columnIndex) { + if (sortDirections.length <= columnIndex) + return SortDirectionEnum.NONE; + return sortDirections[columnIndex]; + } + + @Override + public int getSortOrder(int columnIndex) { + return 0; + } + + @Override + public List getComparatorsForColumnIndex(int columnIndex) { + return Collections.singletonList(AlphanumComparator.COMPARATOR); + } + + @Override + public Comparator getColumnComparator(int columnIndex) { + return AlphanumComparator.COMPARATOR; + } + + @Override + public void sort(int columnIndex, SortDirectionEnum sortDirection, boolean accumulate) { + + if (!isColumnIndexSorted(columnIndex)) { + clear(); + } + int columnCount = bodyDataProvider.getColumnCount(); + sortDirections = ensureArraySize(sortDirections, columnCount, SortDirectionEnum.class, SortDirectionEnum.NONE); + + + sortDirections[columnIndex] = sortDirection; + sorted[columnIndex] = !sortDirection.equals(SortDirectionEnum.NONE); + currentSortColumn = columnIndex; + currentSortDirection = sortDirection; + } + + @Override + public void clear() { + Arrays.fill(this.sortDirections, SortDirectionEnum.NONE); + Arrays.fill(this.sorted, false); + this.currentSortColumn = -1; + this.currentSortDirection = SortDirectionEnum.NONE; + } + + @SuppressWarnings("unchecked") + public static T[] ensureArraySize(T[] array, int l, Class clazz, T defaultValue) { + boolean fill = true; + if (array == null || array.length != l) { + array = (T[]) Array.newInstance(clazz, l); + fill = defaultValue != null; + } + if (fill) + Arrays.fill(array, defaultValue); + return array; + } + +} diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableUI.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableUI.java new file mode 100644 index 00000000..7cfa44d1 --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableUI.java @@ -0,0 +1,11 @@ +package org.simantics.district.network.ui.techtype.table; + +import org.eclipse.swt.widgets.Composite; + +public class TechTypeTableUI extends Composite { + + public TechTypeTableUI(Composite parent, int style) { + super(parent, style); + } + +} diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableView.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableView.java new file mode 100644 index 00000000..15b31784 --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableView.java @@ -0,0 +1,96 @@ +package org.simantics.district.network.ui.techtype.table; + + +import java.util.List; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.inject.Inject; + +import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.e4.ui.model.application.commands.MCommand; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem; +import org.eclipse.e4.ui.model.application.ui.menu.MMenuFactory; +import org.eclipse.e4.ui.model.application.ui.menu.MToolBar; +import org.eclipse.e4.ui.workbench.modeling.ESelectionService; +import org.eclipse.swt.widgets.Composite; +import org.simantics.Simantics; +import org.simantics.db.Resource; +import org.simantics.db.common.NamedResource; +import org.simantics.db.common.procedure.adapter.TransientCacheListener; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.request.PossibleActiveModel; +import org.simantics.db.layer0.request.PossibleResource; +import org.simantics.district.network.DistrictNetworkUtil; +import org.simantics.district.network.techtype.requests.PossibleTechTypeTableData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TechTypeTableView { + + private final static Logger LOGGER = LoggerFactory.getLogger(TechTypeTableView.class); + + public static final String ID = "org.simantics.district.network.ui.techtype.table.techtypeTableView"; + + @Inject ESelectionService selectionService; + + public static TechTypeTable table; + + @Inject + public void init(MPart part, MApplication app) { + MToolBar toolBar = MMenuFactory.INSTANCE.createToolBar(); + toolBar.setToBeRendered(true); + toolBar.getChildren().add(createImportCSVDataToolItem(app)); + part.setToolbar(toolBar); + } + + private MHandledToolItem createImportCSVDataToolItem(MApplication app) { + MHandledToolItem createHandledToolItem = MMenuFactory.INSTANCE.createHandledToolItem(); + // Command is contributed via fragment + MCommand command = app.getCommand("org.simantics.district.network.ui.command.importtechtypecsv"); + createHandledToolItem.setCommand(command); //$NON-NLS-1$ + createHandledToolItem.setLabel("Import Tech Type"); + createHandledToolItem.setIconURI("platform:/plugin/com.famfamfam.silk/icons/table_edit.png"); //$NON-NLS-1$ + return createHandledToolItem; + } + + @PostConstruct + public void postConstruct(Composite parent) { + Resource pipe = null; + try { + List componentTypes = DistrictNetworkUtil.getDistrictComponents(); + + pipe = componentTypes.stream() + .filter(r -> r.getName().toLowerCase().contains("pipe")) + .map(r -> r.getResource()) + .findFirst().orElse(null); + + if (pipe == null) { + pipe = Simantics.getSession().syncRequest(new PossibleResource("http://DistrictComponents@C/dh_pipe@1")); + } + } catch (DatabaseException e) { + LOGGER.error("Failed to read district component types for active model", e); + } + + LOGGER.debug("Pipe component type is {}", pipe); + + String data = null; + try { + Resource model = Simantics.getSession().syncRequest(new PossibleActiveModel(Simantics.getProjectResource())); + if (model != null) + data = Simantics.getSession().syncRequest(new PossibleTechTypeTableData(model, pipe), TransientCacheListener.instance()); + } catch (DatabaseException e) { + LOGGER.error("Failed to read tech type table data for {}", pipe, e); + } + + table = new TechTypeTable(parent, 0, pipe, data); + } + + @PreDestroy + public void dispose() { + table.dispose(); + table = null; + } + +} diff --git a/org.simantics.district.network/META-INF/MANIFEST.MF b/org.simantics.district.network/META-INF/MANIFEST.MF index 79671648..022a0cfa 100644 --- a/org.simantics.district.network/META-INF/MANIFEST.MF +++ b/org.simantics.district.network/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Simantics District Network -Bundle-SymbolicName: org.simantics.district.network +Bundle-SymbolicName: org.simantics.district.network;singleton:=true Bundle-Version: 1.0.0.qualifier Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: org.simantics.db, @@ -22,10 +22,14 @@ Require-Bundle: org.simantics.db, org.simantics.scl.osgi, org.eclipse.collections.eclipse-collections, org.eclipse.collections.eclipse-collections-api, - org.simantics.structural.synchronization.client + org.simantics.structural.synchronization.client, + org.apache.commons.csv Export-Package: org.simantics.district.network, org.simantics.district.network.changeset, org.simantics.district.network.profile, + org.simantics.district.network.techtype, + org.simantics.district.network.techtype.requests, + org.simantics.district.network.techtype.variable, org.simantics.district.network.visualisations, org.simantics.district.network.visualisations.model, org.simantics.district.network.visualisations.triggers diff --git a/org.simantics.district.network/build.properties b/org.simantics.district.network/build.properties index 21a6c989..1ae7e4e9 100644 --- a/org.simantics.district.network/build.properties +++ b/org.simantics.district.network/build.properties @@ -3,4 +3,5 @@ output.. = bin/ bin.includes = META-INF/,\ .,\ adapters.xml,\ - scl/ + scl/,\ + plugin.xml diff --git a/org.simantics.district.network/plugin.xml b/org.simantics.district.network/plugin.xml new file mode 100644 index 00000000..b8e40a32 --- /dev/null +++ b/org.simantics.district.network/plugin.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/org.simantics.district.network/scl/Simantics/District/TechType.scl b/org.simantics.district.network/scl/Simantics/District/TechType.scl new file mode 100644 index 00000000..9b6ddeb9 --- /dev/null +++ b/org.simantics.district.network/scl/Simantics/District/TechType.scl @@ -0,0 +1,7 @@ +import "Simantics/DB" + +importJava "org.simantics.district.network.techtype.TechTypeUtils" where + "Update component properties from tech type table: `updateComponent component`" + updateComponent :: Resource -> () + "Reset all components to values in a tech type table: `resetComponents table`" + resetComponents :: Resource -> () diff --git a/org.simantics.district.network/src/org/simantics/district/network/DistrictNetworkUtil.java b/org.simantics.district.network/src/org/simantics/district/network/DistrictNetworkUtil.java index 2bb29660..85ebd06c 100644 --- a/org.simantics.district.network/src/org/simantics/district/network/DistrictNetworkUtil.java +++ b/org.simantics.district.network/src/org/simantics/district/network/DistrictNetworkUtil.java @@ -3,8 +3,12 @@ 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.Comparator; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -13,12 +17,16 @@ 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.RequestProcessor; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; +import org.simantics.db.common.NamedResource; import org.simantics.db.common.procedure.adapter.TransientCacheListener; import org.simantics.db.common.request.BinaryRead; import org.simantics.db.common.request.IndexRoot; import org.simantics.db.common.request.ObjectsWithType; +import org.simantics.db.common.request.PossibleChild; +import org.simantics.db.common.request.PossibleIndexRoot; import org.simantics.db.common.request.ResourceRead; import org.simantics.db.common.utils.OrderedSetUtils; import org.simantics.db.exception.BindingException; @@ -26,6 +34,8 @@ 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.PossibleActiveModel; import org.simantics.db.layer0.request.PossibleVariable; import org.simantics.db.layer0.variable.Variable; import org.simantics.diagram.stubs.DiagramResource; @@ -466,4 +476,53 @@ public class DistrictNetworkUtil { } } + public static class DistrictComponentListRequest extends ResourceRead> { + protected DistrictComponentListRequest(Resource model) { + super(model); + } + + @Override + public List perform(ReadGraph graph) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + + Resource model = this.resource; + + Set componentTypes = new HashSet<>(); + Collection mappings = QueryIndexUtils.searchByType(graph, model, DN.Mapping_Base); + for (Resource r : mappings) { + String componentType = graph.getPossibleRelatedValue2(r, DN.Mapping_ComponentType); + if (componentType != null) { + Resource root = graph.syncRequest(new PossibleIndexRoot(r)); + if (root != null) { + Resource type = graph.syncRequest(new PossibleChild(root, componentType)); + if (type != null) + componentTypes.add(type); + } + } + } + + List result = new ArrayList(componentTypes.size()); + for (Resource r : componentTypes) { + String name = graph.getPossibleRelatedValue(r, L0.HasName); + result.add(new NamedResource(name, r)); + } + + result.sort(Comparator.comparing(NamedResource::getName)); + return result; + } + } + + public static List getDistrictComponents() throws DatabaseException { + return getDistrictComponents(Simantics.getSession()); + } + + public static List getDistrictComponents(RequestProcessor session) throws DatabaseException { + Resource model = session.syncRequest(new PossibleActiveModel(Simantics.getProjectResource())); + if (model == null) + return Collections.emptyList(); + + return session.syncRequest(new DistrictComponentListRequest(model), TransientCacheListener.instance()); + } + } diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeUtils.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeUtils.java new file mode 100644 index 00000000..7a25ff84 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeUtils.java @@ -0,0 +1,207 @@ +package org.simantics.district.network.techtype; + +import java.util.Collection; +import java.util.Map; + +import org.simantics.Simantics; +import org.simantics.databoard.Bindings; +import org.simantics.databoard.binding.NumberBinding; +import org.simantics.databoard.binding.error.BindingException; +import org.simantics.databoard.type.Datatype; +import org.simantics.databoard.type.NumberType; +import org.simantics.databoard.type.StringType; +import org.simantics.db.ReadGraph; +import org.simantics.db.RequestProcessor; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.procedure.adapter.TransientCacheListener; +import org.simantics.db.common.request.PossibleIndexRoot; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.QueryIndexUtils; +import org.simantics.db.layer0.request.PossibleVariable; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.district.network.techtype.requests.PossibleTechTypeItem; +import org.simantics.district.network.techtype.requests.PossibleTechTypeTable; +import org.simantics.district.network.techtype.requests.TechTypeTableKeyName; +import org.simantics.scl.runtime.SCLContext; +import org.simantics.structural.stubs.StructuralResource2; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TechTypeUtils { + + final static Logger LOGGER = LoggerFactory.getLogger(TechTypeUtils.class); + + public static String DEFAULT_KEY_NAME = "pipeCode"; + + /** + * Execute a cached query for a possible tech type table item in a table with a given item key. + * + * Result is null, if no such item was found. + * + * @param session A request processor on which to run the query + * @param itemCode A key value, such as a pipe code + * @throws DatabaseException + */ + public static Map getTableItem(RequestProcessor session, Resource table, String itemCode) throws DatabaseException { + return session.syncRequest(new PossibleTechTypeItem(table, itemCode), TransientCacheListener.instance()); + } + + /** + * Get a single row in a tech type table for a given item code + * + * Result is null, if no such item was found. + * + * @param table A TechTypeTable resource + * @param itemCode A key value, such as a pipe code + * @return A map from property name to value + * @throws DatabaseException + */ + public static Map getTableItem(Resource table, String itemCode) throws DatabaseException { + Object graph = SCLContext.getCurrent().get("graph"); + if (graph != null && graph instanceof ReadGraph) + return getTableItem((ReadGraph) graph, table, itemCode); + else + return getTableItem(Simantics.getSession(), table, itemCode); + } + + /** + * Reset all components that address the given tech type table to the table values. + * + * @param table A tech type table + * @throws DatabaseException + */ + public static void resetComponents(Resource table) throws DatabaseException { + Simantics.getSession().syncRequest(new WriteRequest() { + @Override + public void perform(WriteGraph graph) throws DatabaseException { + Resource model = graph.syncRequest(new PossibleIndexRoot(table), TransientCacheListener.instance()); + if (model == null) + return; + + Resource type = graph.getPossibleObject(table, DistrictNetworkResource.getInstance(graph).TechType_TechTypeTable_HasComponentType); + if (type == null) + return; + + Collection components = QueryIndexUtils.searchByType(graph, model, type); + for (Resource component : components) { + updateComponent(graph, component, table); + } + } + }); + } + + /** + * Update property values of a component based on the values in an associated tech type table, if any + * + * @param graph A write access interface to the graph database + * @param component A structural component + * @throws DatabaseException + */ + public static void updateComponent(WriteGraph graph, Resource component) throws DatabaseException { + StructuralResource2 STR = StructuralResource2.getInstance(graph); + + Resource type = graph.getSingleType(component, STR.Component); + Resource model = graph.syncRequest(new PossibleIndexRoot(component)); + if (model == null) { + LOGGER.info("updateComponent: No model for {}", component); + return; + } + + Resource table = graph.syncRequest(new PossibleTechTypeTable(model, type), TransientCacheListener.instance()); + if (table == null) { + LOGGER.info("updateComponent: No tech type table for {} in {}", type, model); + return; + } + + updateComponent(graph, component, table); + } + + /** + * Update property values of a component based on the values in an associated tech type table, if any + * + * @param component A structural component + * @throws DatabaseException + */ + public static void updateComponent(Resource component) throws DatabaseException { + if (LOGGER.isTraceEnabled()) + LOGGER.trace("updateComponent({})", component); + + Simantics.getSession().syncRequest(new WriteRequest() { + @Override + public void perform(WriteGraph graph) throws DatabaseException { + updateComponent(graph, component); + } + }); + } + + /** + * Update a single component's property values to those selected from a tech + * type table + * + * @param graph A write interface to the db + * @param component The component to be updated + * @param table A tech type table + * @throws DatabaseException + */ + public static void updateComponent(WriteGraph graph, Resource component, Resource table) + throws DatabaseException { + if (LOGGER.isTraceEnabled()) + LOGGER.trace("updateComponent(graph, {}, {}), component, table)"); + + Variable v = graph.syncRequest(new PossibleVariable(component)); + if (v == null) { + LOGGER.info("No variable found for {}", component); + return; + } + + String keyProp = getKeyPropertyName(graph, table); + String itemCode = v.getPropertyValue(graph, keyProp); + + Map map = graph.syncRequest(new PossibleTechTypeItem(table, itemCode), TransientCacheListener.instance()); + if (map == null) { + LOGGER.info("No entry found for \"{}\" in tech type table {}", itemCode, table); + return; + } + + for (String key : map.keySet()) { + // Don't write the key property + if (key.equals(DEFAULT_KEY_NAME)) + continue; + + Variable prop = v.getPossibleProperty(graph, key); + if (prop == null) continue; + + Datatype dt = prop.getPossibleDatatype(graph); + if (dt == null) continue; + + String value = map.get(key); + if (dt instanceof NumberType) { + try { + Double num = Double.valueOf(value.replace(",", ".")); + NumberBinding binding = Bindings.getBinding(dt); + prop.setValue(graph, binding.create(num)); + } catch (NumberFormatException e) { + // Revert to asserted value + Resource pred = prop.getPossiblePredicateResource(graph); + if (pred != null) + graph.deny(component, pred); + } catch (BindingException e) { + LOGGER.error("Failed to get binding for datatype {}", dt, e); + } + } else if (dt instanceof StringType) { + prop.setValue(graph, value); + } else { + LOGGER.warn("updateComponent: Unsupported property type {}", dt); + } + } + } + + public static String getKeyPropertyName(ReadGraph graph, Resource table) throws DatabaseException { + String name = graph.syncRequest(new TechTypeTableKeyName(table), TransientCacheListener.instance()); + if (name == null) name = "_" + DEFAULT_KEY_NAME; + return name; + } +} diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeItem.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeItem.java new file mode 100644 index 00000000..05e43087 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeItem.java @@ -0,0 +1,30 @@ +package org.simantics.district.network.techtype.requests; + +import java.util.Map; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.procedure.adapter.TransientCacheListener; +import org.simantics.db.common.request.BinaryRead; +import org.simantics.db.exception.DatabaseException; + +/** + * Query for a possible tech type table item in a table with a given item key. + * + * Results in null, if no such item was found. + */ +public class PossibleTechTypeItem extends BinaryRead> { + + public PossibleTechTypeItem(Resource table, String itemCode) { + super(table, itemCode); + } + + @Override + public Map perform(ReadGraph graph) throws DatabaseException { + Resource table = this.parameter; + String itemCode = this.parameter2; + + Map> map = graph.syncRequest(new TechTypeTableData(table), TransientCacheListener.instance()); + return map.get(itemCode); + } +} \ No newline at end of file diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeTable.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeTable.java new file mode 100644 index 00000000..68fc12f1 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeTable.java @@ -0,0 +1,33 @@ +package org.simantics.district.network.techtype.requests; + +import java.util.Collection; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ResourceRead2; +import org.simantics.db.exception.DatabaseException; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.layer0.Layer0; + +public class PossibleTechTypeTable extends ResourceRead2 { + public PossibleTechTypeTable(Resource model, Resource componentType) { + super(model, componentType); + } + + @Override + public Resource perform(ReadGraph graph) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + + Collection children = graph.getObjects(resource, L0.ConsistsOf); + for (Resource child : children) { + if (!graph.isInstanceOf(child, DN.TechType_TechTypeTable)) + continue; + + if (graph.hasStatement(child, DN.TechType_TechTypeTable_HasComponentType, resource2)) + return child; + } + + return null; + } +} \ No newline at end of file diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeTableData.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeTableData.java new file mode 100644 index 00000000..8dd88666 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeTableData.java @@ -0,0 +1,23 @@ +package org.simantics.district.network.techtype.requests; + +import org.simantics.databoard.Bindings; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.procedure.adapter.TransientCacheListener; +import org.simantics.db.common.request.ResourceRead2; +import org.simantics.db.exception.DatabaseException; +import org.simantics.district.network.ontology.DistrictNetworkResource; + +public class PossibleTechTypeTableData extends ResourceRead2 { + public PossibleTechTypeTableData(Resource model, Resource componentType) { + super(model, componentType); + } + + @Override + public String perform(ReadGraph graph) throws DatabaseException { + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + + Resource ttt = graph.syncRequest(new PossibleTechTypeTable(resource, resource2), TransientCacheListener.instance()); + return ttt != null ? graph.getPossibleRelatedValue2(ttt, DN.TechType_TechTypeTable_HasData, Bindings.STRING) : null; + } +} diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java new file mode 100644 index 00000000..2ff575b7 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java @@ -0,0 +1,97 @@ +package org.simantics.district.network.techtype.requests; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.district.network.techtype.TechTypeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TechTypeTableData extends ResourceRead>> { + + private final static Logger LOGGER = LoggerFactory.getLogger(TechTypeTableData.class); + + protected TechTypeTableData(Resource table) { + super(table); + } + + @Override + public Map> perform(ReadGraph graph) throws DatabaseException { + Resource table = this.resource; + + String data = graph.getRelatedValue2(table, + DistrictNetworkResource.getInstance(graph).TechType_TechTypeTable_HasData); + if (data == null) + return Collections.emptyMap(); + + String keyName = TechTypeUtils.getKeyPropertyName(graph, table); + if (keyName.startsWith("_")) + keyName = keyName.substring(1); + + Map> map = new HashMap<>(); + + long ncommas = data.chars().filter(c -> c == ',').count(); + long nsemis = data.chars().filter(c -> c == ';').count(); + char delim = nsemis > ncommas ? ';' : ','; + StringReader reader = new StringReader(data); + + List records = new ArrayList<>(); + try { + CSVFormat format = CSVFormat.newFormat(delim).withQuote('"'); + try (CSVParser parser = format.parse(reader)) { + Iterator it = parser.iterator(); + while (it.hasNext()) { + records.add(it.next()); + } + } + } catch (IOException e) { + LOGGER.error("Error reading CSV data", e); + return Collections.emptyMap(); + } + + CSVRecord header = records.remove(0); + records.remove(0); // Eliminate units row + + int keyIndex = 0; + for (int i = 0; i < header.size(); i++) { + if (header.get(i).equals(keyName)) { + keyIndex = i; + break; + } + } + + for (CSVRecord r : records) { + String key = r.get(keyIndex).intern(); + if (key == null) + continue; + + Map valueMap = new HashMap<>(); + map.put(key, valueMap); + + Iterator h = header.iterator(); + Iterator v = r.iterator(); + + while (h.hasNext() && v.hasNext()) { + String name = h.next().intern(); + String value = v.next(); + valueMap.put(name, value); + } + } + + return map; + } +} \ No newline at end of file diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableKeyName.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableKeyName.java new file mode 100644 index 00000000..86b7d720 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableKeyName.java @@ -0,0 +1,33 @@ +package org.simantics.district.network.techtype.requests; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.layer0.Layer0; + +public class TechTypeTableKeyName extends ResourceRead { + + public TechTypeTableKeyName(Resource table) { + super(table); + } + + @Override + public String perform(ReadGraph graph) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + + Resource type = graph.getPossibleObject(resource, DN.TechType_TechTypeTable_HasComponentType); + if (type != null) { + for (Resource r : graph.getObjects(type, L0.DomainOf)) { + Resource accessor = graph.getPossibleObject(r, L0.valueAccessor); + if (accessor.equals(DN.TechType_Functions_techTypeCodeValueAccessor)) { + return graph.getRelatedValue2(r, L0.HasName); + } + } + } + + return null; + } +} \ No newline at end of file diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/WriteTechTypeTable.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/WriteTechTypeTable.java new file mode 100644 index 00000000..1f85c5a4 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/WriteTechTypeTable.java @@ -0,0 +1,45 @@ +package org.simantics.district.network.techtype.requests; + +import java.util.UUID; + +import org.simantics.Simantics; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.procedure.adapter.TransientCacheListener; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.request.PossibleActiveModel; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.layer0.Layer0; + +public final class WriteTechTypeTable extends WriteRequest { + private final String data; + private final Resource componentType; + + public WriteTechTypeTable(Resource componentType, String data) { + this.data = data; + this.componentType = componentType; + } + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + + Resource model = graph.syncRequest(new PossibleActiveModel(Simantics.getProjectResource())); + if (model == null) + throw new DatabaseException("No active model for storing tech type data"); + + Resource ttt = graph.syncRequest(new PossibleTechTypeTable(model, componentType), TransientCacheListener.instance()); + + if (ttt == null) { + ttt = graph.newResource(); + graph.claim(ttt, L0.InstanceOf, DN.TechType_TechTypeTable); + graph.claimLiteral(ttt, L0.HasName, UUID.randomUUID().toString()); + graph.claim(model, L0.ConsistsOf, ttt); + graph.claim(ttt, DN.TechType_TechTypeTable_HasComponentType, componentType); + } + + graph.claimLiteral(ttt, DN.TechType_TechTypeTable_HasData, data); + } +} \ No newline at end of file diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/variable/Functions.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/variable/Functions.java new file mode 100644 index 00000000..beb92684 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/variable/Functions.java @@ -0,0 +1,59 @@ +package org.simantics.district.network.techtype.variable; + +import org.simantics.databoard.binding.Binding; +import org.simantics.databoard.type.Datatype; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.ValueAccessor; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.district.network.techtype.TechTypeUtils; +import org.simantics.scl.reflection.annotations.SCLValue; +import org.simantics.structural.stubs.StructuralResource2; + +public class Functions { + @SCLValue(type = "ValueAccessor") + public static final ValueAccessor techTypeCodeValueAccessor = new ValueAccessor() { + + @Override + public Object getValue(ReadGraph graph, Variable context) throws DatabaseException { + return org.simantics.db.layer0.function.All.standardValueAccessor.getValue(graph, context); + } + + @Override + public Object getValue(ReadGraph graph, Variable context, Binding binding) throws DatabaseException { + return org.simantics.db.layer0.function.All.standardValueAccessor.getValue(graph, context, binding); + } + + @Override + public void setValue(WriteGraph graph, Variable context, Object value) throws DatabaseException { + org.simantics.db.layer0.function.All.standardValueAccessor.setValue(graph, context, value); + + updateComponentProperties(graph, context, value); + } + + @Override + public void setValue(WriteGraph graph, Variable context, Object value, Binding binding) + throws DatabaseException { + org.simantics.db.layer0.function.All.standardValueAccessor.setValue(graph, context, value, binding); + + updateComponentProperties(graph, context, value); + } + + @Override + public Datatype getDatatype(ReadGraph graph, Variable context) throws DatabaseException { + return org.simantics.db.layer0.function.All.standardValueAccessor.getDatatype(graph, context); + } + + }; + + protected static void updateComponentProperties(WriteGraph graph, Variable context, Object value) throws DatabaseException { + Variable component = context.getParent(graph); + Resource type = component.getPossibleType(graph, StructuralResource2.getInstance(graph).Component); + if (type == null) + return; + + TechTypeUtils.updateComponent(graph, component.getRepresents(graph)); + } +} -- 2.45.2 From 99bc656915a53349cf33f66bfcb2ccdedc92cea1 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Thu, 10 Sep 2020 21:47:25 +0300 Subject: [PATCH 06/16] Use org.apache.commons.csv from platform's external dependencies Remove commons-csv-1.4 JAR from org.simantics.district.imports in favor of commons-csv 1.6 from platform externals. gitlab #93 Change-Id: I4016fcf2f39d45b1ce599682aa7d7112621a5a12 --- org.simantics.district.feature/feature.xml | 7 +++++++ org.simantics.district.imports/.classpath | 1 - .../META-INF/MANIFEST.MF | 8 +++----- org.simantics.district.imports/build.properties | 2 -- .../lib/commons-csv-1.4-sources.jar | Bin 45056 -> 0 bytes .../lib/commons-csv-1.4.jar | Bin 39978 -> 0 bytes 6 files changed, 10 insertions(+), 8 deletions(-) delete mode 100644 org.simantics.district.imports/lib/commons-csv-1.4-sources.jar delete mode 100644 org.simantics.district.imports/lib/commons-csv-1.4.jar diff --git a/org.simantics.district.feature/feature.xml b/org.simantics.district.feature/feature.xml index c27c5d6d..4f50ad33 100644 --- a/org.simantics.district.feature/feature.xml +++ b/org.simantics.district.feature/feature.xml @@ -91,4 +91,11 @@ version="0.0.0" unpack="false"/> + + diff --git a/org.simantics.district.imports/.classpath b/org.simantics.district.imports/.classpath index ac0cdbaf..ac001674 100644 --- a/org.simantics.district.imports/.classpath +++ b/org.simantics.district.imports/.classpath @@ -6,7 +6,6 @@ - diff --git a/org.simantics.district.imports/META-INF/MANIFEST.MF b/org.simantics.district.imports/META-INF/MANIFEST.MF index 747c33cb..1fc6b8e6 100644 --- a/org.simantics.district.imports/META-INF/MANIFEST.MF +++ b/org.simantics.district.imports/META-INF/MANIFEST.MF @@ -10,8 +10,6 @@ Require-Bundle: org.simantics.db, org.simantics.district.network.ontology, org.simantics.district.network, org.simantics.diagram.ontology, - org.slf4j.api -Export-Package: org.apache.commons.csv, - org.simantics.district.imports -Bundle-ClassPath: lib/commons-csv-1.4.jar, - . + org.slf4j.api, + org.apache.commons.csv;visibility:=reexport +Export-Package: org.simantics.district.imports diff --git a/org.simantics.district.imports/build.properties b/org.simantics.district.imports/build.properties index 4e38199d..e4774e93 100644 --- a/org.simantics.district.imports/build.properties +++ b/org.simantics.district.imports/build.properties @@ -1,6 +1,4 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ - .,\ - lib/commons-csv-1.4.jar,\ scl/ diff --git a/org.simantics.district.imports/lib/commons-csv-1.4-sources.jar b/org.simantics.district.imports/lib/commons-csv-1.4-sources.jar deleted file mode 100644 index baf9b88fcb5a03b999a306455c1c62d4c276ac12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45056 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 diff --git a/org.simantics.district.imports/lib/commons-csv-1.4.jar b/org.simantics.district.imports/lib/commons-csv-1.4.jar deleted file mode 100644 index e9eb0bd35ccf5876b3d2f1fce3afecdfc3cd12b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39978 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 -- 2.45.2 From e336c755bb084fde3c26d711710b54b02ae423f5 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Fri, 11 Sep 2020 00:06:58 +0300 Subject: [PATCH 07/16] Prevent leakage of OSGI service references gitlab #95 Change-Id: I7dfa5f7f21664e248be73f60927b8e2b6eee294f (cherry picked from commit c3fe71cfddafe8288d9242f9c1eef98cf5c5ecd3) --- .../simantics/maps/eclipse/EclipseProxyUtil.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/org.simantics.district.maps/src/org/simantics/maps/eclipse/EclipseProxyUtil.java b/org.simantics.district.maps/src/org/simantics/maps/eclipse/EclipseProxyUtil.java index 601a82f7..9e58c69d 100644 --- a/org.simantics.district.maps/src/org/simantics/maps/eclipse/EclipseProxyUtil.java +++ b/org.simantics.district.maps/src/org/simantics/maps/eclipse/EclipseProxyUtil.java @@ -42,13 +42,17 @@ public class EclipseProxyUtil implements IProxyUtil { return null; IProxyService service = bc.getService(ref); - if (service != null && service.isProxiesEnabled()) { - IProxyData proxyData = service.getProxyData(IProxyData.HTTP_PROXY_TYPE); - if (proxyData != null && proxyData.getHost() != null) { - return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyData.getHost(), proxyData.getPort())); + try { + if (service != null && service.isProxiesEnabled()) { + IProxyData proxyData = service.getProxyData(IProxyData.HTTP_PROXY_TYPE); + if (proxyData != null && proxyData.getHost() != null) { + return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyData.getHost(), proxyData.getPort())); + } } + return null; + } finally { + bc.ungetService(ref); } - return null; } } -- 2.45.2 From b6510fa970a0ae75b0ab67c73d034e8076a4644b Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Wed, 22 Apr 2020 10:38:06 +0300 Subject: [PATCH 08/16] Set license/copyright information for district features Used EPL 2.0 for license and THTH ry as vendor. gitlab #83 Change-Id: I75739448ed900a80f7a882da7551e1dc0f9a8a58 (cherry picked from commit 4ad7f53b7ed5bcd782ca39020e5e662d8d4c67a1) --- LICENSE | 415 ++++++++++-------- org.simantics.district.feature/feature.xml | 329 ++++++++++++-- .../feature.xml | 298 ++++++++++++- .../feature.xml | 295 ++++++++++++- org.simantics.district.ui.feature/feature.xml | 299 ++++++++++++- org.simantics.maps.server.feature/feature.xml | 307 ++++++++++++- 6 files changed, 1711 insertions(+), 232 deletions(-) diff --git a/LICENSE b/LICENSE index 3260e4f2..e23ece2c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,204 +1,277 @@ -Eclipse Public License - v 1.0 +Eclipse Public License - v 2.0 -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: -a) in the case of the initial Contributor, the initial code and documentation - distributed under this Agreement, and -b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and - where such changes and/or additions to the Program originate from and are - distributed by that particular Contributor. A Contribution 'originates' - from a Contributor if it was added to the Program by such Contributor - itself or anyone acting on such Contributor's behalf. Contributions do not - include additions to the Program which: (i) are separate modules of - software distributed in conjunction with the Program under their own - license agreement, and (ii) are not derivative works of the Program. + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. -"Contributor" means any person or entity that distributes the Program. +"Contributor" means any person or entity that Distributes the Program. -"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. -"Program" means the Contributions distributed in accordance with this +"Program" means the Contributions Distributed in accordance with this Agreement. -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. 2. GRANT OF RIGHTS - a) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free copyright license to - reproduce, prepare derivative works of, publicly display, publicly - perform, distribute and sublicense the Contribution of such Contributor, - if any, and such derivative works, in source code and object code form. - b) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free patent license under - Licensed Patents to make, use, sell, offer to sell, import and otherwise - transfer the Contribution of such Contributor, if any, in source code and - object code form. This patent license shall apply to the combination of - the Contribution and the Program if, at the time the Contribution is - added by the Contributor, such addition of the Contribution causes such - combination to be covered by the Licensed Patents. The patent license - shall not apply to any other combinations which include the Contribution. - No hardware per se is licensed hereunder. - c) Recipient understands that although each Contributor grants the licenses - to its Contributions set forth herein, no assurances are provided by any - Contributor that the Program does not infringe the patent or other - intellectual property rights of any other entity. Each Contributor - disclaims any liability to Recipient for claims brought by any other - entity based on infringement of intellectual property rights or - otherwise. As a condition to exercising the rights and licenses granted - hereunder, each Recipient hereby assumes sole responsibility to secure - any other intellectual property rights needed, if any. For example, if a - third party patent license is required to allow Recipient to distribute - the Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - d) Each Contributor represents that to its knowledge it has sufficient - copyright rights in its Contribution, if any, to grant the copyright - license set forth in this Agreement. + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). 3. REQUIREMENTS -A Contributor may choose to distribute the Program in object code form under -its own license agreement, provided that: - - a) it complies with the terms and conditions of this Agreement; and - b) its license agreement: - i) effectively disclaims on behalf of all Contributors all warranties - and conditions, express and implied, including warranties or - conditions of title and non-infringement, and implied warranties or - conditions of merchantability and fitness for a particular purpose; - ii) effectively excludes on behalf of all Contributors all liability for - damages, including direct, indirect, special, incidental and - consequential damages, such as lost profits; - iii) states that any provisions which differ from this Agreement are - offered by that Contributor alone and not by any other party; and - iv) states that source code for the Program is available from such - Contributor, and informs licensees how to obtain it in a reasonable - manner on or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - - a) it must be made available under this Agreement; and - b) a copy of this Agreement must be included with each copy of the Program. - Contributors may not remove or alter any copyright notices contained - within the Program. - -Each Contributor must identify itself as the originator of its Contribution, -if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. 4. COMMERCIAL DISTRIBUTION -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, -if a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits and -other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such Commercial -Contributor in connection with its distribution of the Program in a commercial -product offering. The obligations in this section do not apply to any claims -or Losses relating to any actual or alleged intellectual property -infringement. In order to qualify, an Indemnified Contributor must: -a) promptly notify the Commercial Contributor in writing of such claim, and -b) allow the Commercial Contributor to control, and cooperate with the -Commercial Contributor in, the defense and any related settlement -negotiations. The Indemnified Contributor may participate in any such claim at -its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If -that Commercial Contributor then makes performance claims, or offers -warranties related to Product X, those performance claims and warranties are -such Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a -court requires any other Contributor to pay any damages as a result, the -Commercial Contributor must pay those damages. +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. 5. NO WARRANTY -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using -and distributing the Program and assumes all risks associated with its -exercise of rights under this Agreement , including but not limited to the -risks and costs of program errors, compliance with applicable laws, damage to -or loss of data, programs or equipment, and unavailability or interruption of -operations. +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION -LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this Agreement, and without further action by the -parties hereto, such provision shall be reformed to the minimum extent -necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted -under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue -and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to -time. No one other than the Agreement Steward has the right to modify this -Agreement. The Eclipse Foundation is the initial Agreement Steward. The -Eclipse Foundation may assign the responsibility to serve as the Agreement -Steward to a suitable separate entity. Each new version of the Agreement will -be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version of the -Agreement is published, Contributor may elect to distribute the Program -(including its Contributions) under the new version. Except as expressly -stated in Sections 2(a) and 2(b) above, Recipient receives no rights or -licenses to the intellectual property of any Contributor under this Agreement, -whether expressly, by implication, estoppel or otherwise. All rights in the -Program not expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + You may add additional accurate notices of copyright ownership. \ No newline at end of file diff --git a/org.simantics.district.feature/feature.xml b/org.simantics.district.feature/feature.xml index 4f50ad33..90ffeb7b 100644 --- a/org.simantics.district.feature/feature.xml +++ b/org.simantics.district.feature/feature.xml @@ -2,20 +2,309 @@ + version="1.0.0.qualifier" + provider-name="THTH ry"> - - [Enter Feature Description here.] + + District modelling base feature - - [Enter Copyright Description here.] + + Copyright (c) 2017 Association for Decentralized Information +Management in Industry THTH ry. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License +v2.0 which accompanies this distribution, and is available at +https://www.eclipse.org/legal/epl-2.0/ +Contributors: +VTT - initial API and implementation +Fortum - continued development - - [Enter License Description here.] + + Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + + - - - - - - - - + version="1.0.0.qualifier" + provider-name="THTH ry"> - - [Enter Feature Description here.] + + District region modelling support feature - - [Enter Copyright Description here.] + + Copyright (c) 2017 Association for Decentralized Information +Management in Industry THTH ry. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License +v2.0 which accompanies this distribution, and is available at +https://www.eclipse.org/legal/epl-2.0/ +Contributors: +Fortum - initial API and implementation - - [Enter License Description here.] + + Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. - - [Enter Feature Description here.] + + District model routing service API and UI. - - [Enter Copyright Description here.] + + Copyright (c) 2018 Association for Decentralized Information +Management in Industry THTH ry. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License +v2.0 which accompanies this distribution, and is available at +https://www.eclipse.org/legal/epl-2.0/ +Contributors: +Fortum - initial API and implementation - - [Enter License Description here.] + + Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + version="1.0.0.qualifier" + provider-name="THTH ry"> - - [Enter Feature Description here.] + + Simantics District modelling base UI features. - - [Enter Copyright Description here.] + + Copyright (c) 2016 Association for Decentralized Information +Management in Industry THTH ry. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License +v2.0 which accompanies this distribution, and is available at +https://www.eclipse.org/legal/epl-2.0/ +Contributors: +VTT - initial API and implementation +Fortum - continued development - - [Enter License Description here.] + + Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + label="Local Map Server" + version="1.0.0.qualifier" + provider-name="THTH ry"> - - [Enter Feature Description here.] + + Local map tile server for district modelling. - - [Enter Copyright Description here.] + + Copyright (c) 2017 Association for Decentralized Information +Management in Industry THTH ry. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License +v2.0 which accompanies this distribution, and is available at +https://www.eclipse.org/legal/epl-2.0/ +Contributors: +VTT - initial API and implementation +Fortum - continued development - - [Enter License Description here.] + + Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + + -- 2.45.2 From 409a4eae1c3d040c1900a6e514981dd6e71df600 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Fri, 11 Sep 2020 12:00:01 +0300 Subject: [PATCH 09/16] Amendment to 99bc6569 gitlab #93 --- org.simantics.district.imports/build.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/org.simantics.district.imports/build.properties b/org.simantics.district.imports/build.properties index e4774e93..a4fd10d4 100644 --- a/org.simantics.district.imports/build.properties +++ b/org.simantics.district.imports/build.properties @@ -1,4 +1,5 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ + .,\ scl/ -- 2.45.2 From 7d3e650a2d3891988e7d0ef83fcb3b283a226d09 Mon Sep 17 00:00:00 2001 From: Reino Ruusu Date: Mon, 14 Sep 2020 17:12:37 +0300 Subject: [PATCH 10/16] Tech type table content validation gitlab #96 Change-Id: Icbb92e366748d8de9205cd29487d03eaacb5e7a4 --- .../fragment.e4xmi | 2 + .../ui/techtype/table/TechTypeTable.java | 111 ++++++++++++++- .../ui/techtype/table/TechTypeTableView.java | 36 +++-- .../table/ValidateTechTypeTableHandler.java | 42 ++++++ .../techtype/TechTypeValidationUtils.java | 132 ++++++++++++++++++ .../requests/PossibleTechTypeKeyName.java | 29 ++++ .../techtype/requests/TechTypeTableData.java | 2 +- .../requests/TechTypeTableKeyName.java | 14 +- 8 files changed, 339 insertions(+), 29 deletions(-) create mode 100644 org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/ValidateTechTypeTableHandler.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeValidationUtils.java create mode 100644 org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeKeyName.java diff --git a/org.simantics.district.network.ui/fragment.e4xmi b/org.simantics.district.network.ui/fragment.e4xmi index 89afdc5d..1ea9c909 100644 --- a/org.simantics.district.network.ui/fragment.e4xmi +++ b/org.simantics.district.network.ui/fragment.e4xmi @@ -17,6 +17,7 @@ + @@ -50,5 +51,6 @@ + diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTable.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTable.java index 0c44bff0..8ee627a5 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTable.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTable.java @@ -4,11 +4,14 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.Set; import java.util.stream.Collectors; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.nebula.widgets.nattable.NatTable; +import org.eclipse.nebula.widgets.nattable.config.AbstractRegistryConfiguration; +import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes; import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.copy.command.CopyDataCommandHandler; @@ -31,9 +34,15 @@ import org.eclipse.nebula.widgets.nattable.hover.config.BodyHoverStylingBindings import org.eclipse.nebula.widgets.nattable.layer.DataLayer; import org.eclipse.nebula.widgets.nattable.layer.ILayer; import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer; +import org.eclipse.nebula.widgets.nattable.layer.LabelStack; +import org.eclipse.nebula.widgets.nattable.layer.cell.IConfigLabelAccumulator; import org.eclipse.nebula.widgets.nattable.reorder.RowReorderLayer; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer; +import org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes; +import org.eclipse.nebula.widgets.nattable.style.DisplayMode; +import org.eclipse.nebula.widgets.nattable.style.Style; +import org.eclipse.nebula.widgets.nattable.util.GUIHelper; import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.Clipboard; @@ -43,13 +52,20 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; import org.simantics.Simantics; import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.request.PossibleActiveModel; +import org.simantics.district.network.techtype.requests.PossibleTechTypeKeyName; +import org.simantics.district.network.techtype.requests.PossibleTechTypeTable; import org.simantics.district.network.techtype.requests.WriteTechTypeTable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TechTypeTable extends Composite { + private static final String INVALID_LABEL = "INVALID"; + private final static Logger LOGGER = LoggerFactory.getLogger(TechTypeTable.class); NatTable table; @@ -69,10 +85,14 @@ public class TechTypeTable extends Composite { private TechTypeTableSortModel sortModel; private Resource componentType; + private Resource tableResource; + + protected Set validationResult; - public TechTypeTable(Composite parent, int style, Resource componentType, String data) { + public TechTypeTable(Composite parent, int style, Resource componentType, Resource tableResource, String data) { super(parent, style); this.componentType = componentType; + this.tableResource = tableResource; defaultInitializeUI(data); } @@ -120,7 +140,7 @@ public class TechTypeTable extends Composite { // directly as body layer is also working. bodyDataProvider = new TechTypeTableDataProvider(data); bodyDataLayer = new DataLayer(bodyDataProvider); - + RowReorderLayer rowReorderLayer = new RowReorderLayer( columnHideShowLayer = new ColumnHideShowLayer(bodyDataLayer)); @@ -167,6 +187,21 @@ public class TechTypeTable extends Composite { table = new NatTable(parent, NatTable.DEFAULT_STYLE_OPTIONS | SWT.BORDER, gridLayer, false); GridDataFactory.fillDefaults().grab(true, true).applyTo(table); + + // Show entries labeled "INVALID" with red text + table.addConfiguration(new AbstractRegistryConfiguration() { + @Override + public void configureRegistry(IConfigRegistry configRegistry) { + Style cellStyle = new Style(); + cellStyle.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, GUIHelper.COLOR_RED); + configRegistry.registerConfigAttribute( + CellConfigAttributes.CELL_STYLE, + cellStyle, + DisplayMode.NORMAL, + INVALID_LABEL + ); + } + }); // Register a CopyDataCommandHandler that also copies the headers and // uses the configured IDisplayConverters @@ -187,6 +222,18 @@ public class TechTypeTable extends Composite { table.configure(); } + private static String getKeyColumnName(Resource componentType) { + String keyName = null; + if (componentType != null) { + try { + keyName = Simantics.getSession().syncRequest(new PossibleTechTypeKeyName(componentType)); + } catch (DatabaseException e) { + LOGGER.error("Failed to read possible tech type key name for {}", componentType, e); + } + } + return keyName.startsWith("_") ? keyName.substring(1) : keyName; + } + @Override public void dispose() { cpb.dispose(); @@ -203,12 +250,22 @@ public class TechTypeTable extends Composite { } try { - Simantics.getSession().syncRequest(new WriteTechTypeTable(componentType, data)); + Simantics.getSession().syncRequest(new WriteRequest() { + @Override + public void perform(WriteGraph graph) throws DatabaseException { + graph.syncRequest(new WriteTechTypeTable(componentType, data)); + Resource model = graph.syncRequest(new PossibleActiveModel(Simantics.getProjectResource())); + if (model != null) { + tableResource = graph.syncRequest(new PossibleTechTypeTable(model, componentType)); + } + } + }); } catch (DatabaseException e) { LOGGER.error("Failed to write tech type table data to model", e); } setTechTypeData(data); + setValidationResult(null); } public void setTechTypeData(String data) { @@ -220,5 +277,51 @@ public class TechTypeTable extends Composite { this.componentType = componentType; } -} + /** + * Set results of a validation operation + * + * Invalid entries are designated by a string of the form "/". + * + * This method must be called in the SWT thread. + * + * @param result A set of strings representing invalid entries + */ + public void setValidationResult(Set result) { + if (result != null && result.isEmpty()) + result = null; + + this.validationResult = result; + if (result != null) { + String keyName = getKeyColumnName(componentType); + + bodyDataLayer.setConfigLabelAccumulator(new IConfigLabelAccumulator() { + @Override + public void accumulateConfigLabels(LabelStack configLabels, int columnPosition, int rowPosition) { + if (keyName != null) { + int keyColumn = bodyDataProvider.getVariableIndex(keyName); + if (keyColumn >= 0) { + String key = (String) bodyDataProvider.getDataValue(keyColumn, rowPosition); + String columnName = bodyDataProvider.getVariableName(columnPosition); + + if (validationResult.contains(key + "/" + columnName)) { + configLabels.addLabel(INVALID_LABEL); + } + } + } + } + }); + } else { + bodyDataLayer.setConfigLabelAccumulator(null); + } + + table.refresh(); + } + /** + * Get a resource representation of the currently open table, or null if + * table is not stored in the model. + */ + public Resource getCurrentTable() { + return tableResource; + } +} diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableView.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableView.java index 15b31784..6c25251c 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableView.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/TechTypeTableView.java @@ -21,8 +21,8 @@ import org.simantics.db.common.NamedResource; import org.simantics.db.common.procedure.adapter.TransientCacheListener; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.request.PossibleActiveModel; -import org.simantics.db.layer0.request.PossibleResource; import org.simantics.district.network.DistrictNetworkUtil; +import org.simantics.district.network.techtype.requests.PossibleTechTypeTable; import org.simantics.district.network.techtype.requests.PossibleTechTypeTableData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,9 +42,20 @@ public class TechTypeTableView { MToolBar toolBar = MMenuFactory.INSTANCE.createToolBar(); toolBar.setToBeRendered(true); toolBar.getChildren().add(createImportCSVDataToolItem(app)); + toolBar.getChildren().add(createValidateTableToolItem(app)); part.setToolbar(toolBar); } + private MHandledToolItem createValidateTableToolItem(MApplication app) { + MHandledToolItem createHandledToolItem = MMenuFactory.INSTANCE.createHandledToolItem(); + // Command is contributed via fragment + MCommand command = app.getCommand("org.simantics.district.network.ui.command.validatetechtypetable"); + createHandledToolItem.setCommand(command); //$NON-NLS-1$ + createHandledToolItem.setLabel("Validate Tech Type Table"); + createHandledToolItem.setIconURI("platform:/plugin/com.famfamfam.silk/icons/accept.png"); //$NON-NLS-1$ + return createHandledToolItem; + } + private MHandledToolItem createImportCSVDataToolItem(MApplication app) { MHandledToolItem createHandledToolItem = MMenuFactory.INSTANCE.createHandledToolItem(); // Command is contributed via fragment @@ -65,10 +76,6 @@ public class TechTypeTableView { .filter(r -> r.getName().toLowerCase().contains("pipe")) .map(r -> r.getResource()) .findFirst().orElse(null); - - if (pipe == null) { - pipe = Simantics.getSession().syncRequest(new PossibleResource("http://DistrictComponents@C/dh_pipe@1")); - } } catch (DatabaseException e) { LOGGER.error("Failed to read district component types for active model", e); } @@ -76,15 +83,20 @@ public class TechTypeTableView { LOGGER.debug("Pipe component type is {}", pipe); String data = null; - try { - Resource model = Simantics.getSession().syncRequest(new PossibleActiveModel(Simantics.getProjectResource())); - if (model != null) - data = Simantics.getSession().syncRequest(new PossibleTechTypeTableData(model, pipe), TransientCacheListener.instance()); - } catch (DatabaseException e) { - LOGGER.error("Failed to read tech type table data for {}", pipe, e); + Resource tableResource = null; + if (pipe != null) { + try { + Resource model = Simantics.getSession().syncRequest(new PossibleActiveModel(Simantics.getProjectResource())); + if (model != null) { + tableResource = Simantics.getSession().syncRequest(new PossibleTechTypeTable(model, pipe), TransientCacheListener.instance()); + data = Simantics.getSession().syncRequest(new PossibleTechTypeTableData(model, pipe), TransientCacheListener.instance()); + } + } catch (DatabaseException e) { + LOGGER.error("Failed to read tech type table data for {}", pipe, e); + } } - table = new TechTypeTable(parent, 0, pipe, data); + table = new TechTypeTable(parent, 0, pipe, tableResource, data); } @PreDestroy diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/ValidateTechTypeTableHandler.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/ValidateTechTypeTableHandler.java new file mode 100644 index 00000000..8438fd7b --- /dev/null +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/techtype/table/ValidateTechTypeTableHandler.java @@ -0,0 +1,42 @@ +package org.simantics.district.network.ui.techtype.table; + +import java.util.Set; + +import javax.inject.Named; + +import org.eclipse.e4.core.di.annotations.CanExecute; +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.widgets.Shell; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.district.network.techtype.TechTypeValidationUtils; +import org.simantics.utils.ui.ExceptionUtils; + +public class ValidateTechTypeTableHandler { + @CanExecute + public boolean canExecute() { + return TechTypeTableView.table.getCurrentTable() != null; + } + + @Execute + public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell s) { + Resource table = TechTypeTableView.table.getCurrentTable(); + if (table == null) + return; + + Set result; + try { + result = TechTypeValidationUtils.validateTechTypeTable(table); + } catch (DatabaseException e) { + ExceptionUtils.logAndShowError("Tech type table validation failed", e); + return; + } + + TechTypeTableView.table.setValidationResult(result); + + MessageDialog.openInformation(s, "Validation result", result.isEmpty() ? + "No invalid values found" : result.size() + " invalid values found"); + } +} diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeValidationUtils.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeValidationUtils.java new file mode 100644 index 00000000..a82f65a6 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeValidationUtils.java @@ -0,0 +1,132 @@ +package org.simantics.district.network.techtype; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.simantics.Simantics; +import org.simantics.databoard.binding.NumberBinding; +import org.simantics.databoard.binding.error.BindingException; +import org.simantics.databoard.type.Datatype; +import org.simantics.databoard.type.NumberType; +import org.simantics.databoard.util.Range; +import org.simantics.databoard.util.RangeException; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.procedure.adapter.TransientCacheListener; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.common.request.UniqueRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.request.PropertyInfo; +import org.simantics.db.layer0.request.PropertyInfoRequest; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.district.network.techtype.requests.TechTypeTableData; +import org.simantics.layer0.Layer0; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TechTypeValidationUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(TechTypeValidationUtils.class); + + /** + * Return a set of invalid tech type table entries. + * + * The tech type table values are validated against any limits that have been + * defined for associated component type properties. + * + * Invalid entries are designated by strings of the form "/". + * + * @param table A tech type table resource + * @return A set of labels for invalid values + * @throws DatabaseException + */ + public static Set validateTechTypeTable(Resource table) throws DatabaseException { + LOGGER.trace("Validating resource table {}", table); + + // Use a unique read - we don't want to pollute the cache with this + return Simantics.getSession().syncRequest(new UniqueRead>() { + @Override + public Set perform(ReadGraph graph) throws DatabaseException { + Resource type = graph.getPossibleObject(table, DistrictNetworkResource.getInstance(graph).TechType_TechTypeTable_HasComponentType); + if (type == null) + return Collections.emptySet(); + + Map props = graph.syncRequest(new PropertyInfoMapOfType(type), TransientCacheListener.instance()); + Set result = new HashSet<>(); + + Map> data = graph.syncRequest(new TechTypeTableData(table), TransientCacheListener.instance()); + for (String code : data.keySet()) { + LOGGER.trace(" type code {}", code); + Map values = data.get(code); + for (String propertyName : values.keySet()) { + PropertyInfo info = props.get(propertyName); + + // Allow property names to start with an underscore + if (info == null) + info = props.get("_" + propertyName); + + if (info == null) { + LOGGER.trace(" {} - no property", propertyName); + continue; + } + + Datatype dt = info.requiredDatatype; + if (dt == null || !(dt instanceof NumberType)) + continue; // Only check ranges of numerical properties + + String range = dt.metadata.get("range"); + if (range != null) { + Range rng; + try { + rng = Range.valueOf(range); + } catch (RangeException e1) { + LOGGER.error("Invalid range string {} for property {}", range, propertyName, e1); + continue; + } + + String valueString = values.get(propertyName).replace(",", "."); + try { + Double num = Double.valueOf(valueString); + NumberBinding binding = (NumberBinding)info.defaultBinding; + Number value = (Number) binding.create(num); + + if (!rng.contains(value)) { + LOGGER.trace(" {} - range violation {} / {}", propertyName, valueString, range); + result.add(code + "/" + propertyName); + } else { + LOGGER.trace(" {} - valid value {} / {}", propertyName, valueString, range); + } + } catch (NumberFormatException e) { + // Nothing to do here, treat non-numeric strings as missing values + LOGGER.trace(" {} - no value {} / {}", propertyName, valueString, range); + } catch (BindingException e) { + LOGGER.error("Binding error for property {}", propertyName, e); + } + } + } + } + + return result; + } + }); + } + + private static class PropertyInfoMapOfType extends ResourceRead> { + protected PropertyInfoMapOfType(Resource type) { + super(type); + } + + @Override + public Map perform(ReadGraph graph) throws DatabaseException { + Map result = new HashMap(); + for (Resource prop : graph.getObjects(resource, Layer0.getInstance(graph).DomainOf)) { + PropertyInfo info = graph.syncRequest(new PropertyInfoRequest(prop), TransientCacheListener.instance()); + result.put(info.name, info); + } + + return result; + } + } +} diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeKeyName.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeKeyName.java new file mode 100644 index 00000000..bd4b7216 --- /dev/null +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/PossibleTechTypeKeyName.java @@ -0,0 +1,29 @@ +package org.simantics.district.network.techtype.requests; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.layer0.Layer0; + +public class PossibleTechTypeKeyName extends ResourceRead { + public PossibleTechTypeKeyName(Resource componentType) { + super(componentType); + } + + @Override + public String perform(ReadGraph graph) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + + for (Resource r : graph.getObjects(resource, L0.DomainOf)) { + Resource accessor = graph.getPossibleObject(r, L0.valueAccessor); + if (accessor.equals(DN.TechType_Functions_techTypeCodeValueAccessor)) { + return graph.getRelatedValue2(r, L0.HasName); + } + } + + return null; + } +} diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java index 2ff575b7..4afe5bde 100644 --- a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java @@ -25,7 +25,7 @@ public class TechTypeTableData extends ResourceRead { @@ -15,19 +15,9 @@ public class TechTypeTableKeyName extends ResourceRead { @Override public String perform(ReadGraph graph) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); Resource type = graph.getPossibleObject(resource, DN.TechType_TechTypeTable_HasComponentType); - if (type != null) { - for (Resource r : graph.getObjects(type, L0.DomainOf)) { - Resource accessor = graph.getPossibleObject(r, L0.valueAccessor); - if (accessor.equals(DN.TechType_Functions_techTypeCodeValueAccessor)) { - return graph.getRelatedValue2(r, L0.HasName); - } - } - } - - return null; + return type != null ? graph.syncRequest(new PossibleTechTypeKeyName(type), TransientCacheListener.instance()) : null; } } \ No newline at end of file -- 2.45.2 From 5043d4722c818b6ddb953a70a94960a071abee4d Mon Sep 17 00:00:00 2001 From: Reino Ruusu Date: Fri, 18 Sep 2020 16:05:11 +0300 Subject: [PATCH 11/16] Remove generated code from repository Change-Id: I855f6b87cb631d02491558ede8b3f537753aea1f --- .../district/network/ontology/.gitignore | 1 + .../ontology/DistrictNetworkResource.java | 1429 ----------------- 2 files changed, 1 insertion(+), 1429 deletions(-) create mode 100644 org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/.gitignore delete mode 100644 org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java diff --git a/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/.gitignore b/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/.gitignore new file mode 100644 index 00000000..ffa369bd --- /dev/null +++ b/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/.gitignore @@ -0,0 +1 @@ +/DistrictNetworkResource.java diff --git a/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java b/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java deleted file mode 100644 index 1b4d4e24..00000000 --- a/org.simantics.district.network.ontology/src/org/simantics/district/network/ontology/DistrictNetworkResource.java +++ /dev/null @@ -1,1429 +0,0 @@ -package org.simantics.district.network.ontology; - -import org.simantics.db.RequestProcessor; -import org.simantics.db.Resource; -import org.simantics.db.ReadGraph; -import org.simantics.db.request.Read; -import org.simantics.db.Session; -import org.simantics.db.exception.DatabaseException; -import org.simantics.db.service.QueryControl; - -public class DistrictNetworkResource { - - public final Resource ActionContext; - public final Resource ActionContext_newDiagramContribution; - public final Resource Actions; - public final Resource AddLayerToDNDiagramTemplate; - public final Resource BrowseContext; - public final Resource Composite; - public final Resource Connection; - public final Resource ConnectionLineStyle; - public final Resource Diagram; - public final Resource Diagram_DefaultPipeTechTypeId; - public final Resource Diagram_DefaultPipeTechTypeId_Inverse; - public final Resource Diagram_MappedDiagram; - public final Resource Diagram_MappedFromDiagram; - public final Resource Diagram_Visualisations; - public final Resource Diagram_Visualisations_ArrowContribution; - public final Resource Diagram_Visualisations_ColorBarLocation; - public final Resource Diagram_Visualisations_ColorBarLocation_Inverse; - public final Resource Diagram_Visualisations_ColorBarSize; - public final Resource Diagram_Visualisations_ColorBarSize_Inverse; - public final Resource Diagram_Visualisations_ColorContribution; - public final Resource Diagram_Visualisations_DisabledUpdates; - public final Resource Diagram_Visualisations_DisabledUpdates_Inverse; - public final Resource Diagram_Visualisations_DynamicSymbolsProducers; - public final Resource Diagram_Visualisations_DynamicSymbolsProducers_Inverse; - public final Resource Diagram_Visualisations_DynamicSymbolsPumpingStations; - public final Resource Diagram_Visualisations_DynamicSymbolsPumpingStations_Inverse; - public final Resource Diagram_Visualisations_DynamicSymbolsShutoffValves; - public final Resource Diagram_Visualisations_DynamicSymbolsShutoffValves_Inverse; - public final Resource Diagram_Visualisations_DynamicSymbolsValves; - public final Resource Diagram_Visualisations_DynamicSymbolsValves_Inverse; - public final Resource Diagram_Visualisations_HideConsumers; - public final Resource Diagram_Visualisations_HideConsumers_Inverse; - public final Resource Diagram_Visualisations_HideEdges; - public final Resource Diagram_Visualisations_HideEdges_Inverse; - public final Resource Diagram_Visualisations_HidePoints; - public final Resource Diagram_Visualisations_HidePoints_Inverse; - public final Resource Diagram_Visualisations_HideProducers; - public final Resource Diagram_Visualisations_HideProducers_Inverse; - public final Resource Diagram_Visualisations_HidePumpingStations; - public final Resource Diagram_Visualisations_HidePumpingStations_Inverse; - public final Resource Diagram_Visualisations_HideValves; - public final Resource Diagram_Visualisations_HideValves_Inverse; - public final Resource Diagram_Visualisations_Interval; - public final Resource Diagram_Visualisations_Interval_Inverse; - public final Resource Diagram_Visualisations_KeyVariableEdgeHover; - public final Resource Diagram_Visualisations_KeyVariableEdgeHover_Inverse; - public final Resource Diagram_Visualisations_KeyVariableVertexHover; - public final Resource Diagram_Visualisations_KeyVariableVertexHover_Inverse; - public final Resource Diagram_Visualisations_ResetVisualisation; - public final Resource Diagram_Visualisations_ResetVisualisation_Inverse; - public final Resource Diagram_Visualisations_ShowColorBarTicks; - public final Resource Diagram_Visualisations_ShowColorBarTicks_Inverse; - public final Resource Diagram_Visualisations_ShowColorBars; - public final Resource Diagram_Visualisations_ShowColorBars_Inverse; - public final Resource Diagram_Visualisations_ShowSizeBarTicks; - public final Resource Diagram_Visualisations_ShowSizeBarTicks_Inverse; - public final Resource Diagram_Visualisations_ShowSizeBars; - public final Resource Diagram_Visualisations_ShowSizeBars_Inverse; - public final Resource Diagram_Visualisations_SizeBarLocation; - public final Resource Diagram_Visualisations_SizeBarLocation_Inverse; - public final Resource Diagram_Visualisations_SizeBarSize; - public final Resource Diagram_Visualisations_SizeBarSize_Inverse; - public final Resource Diagram_Visualisations_SizeContribution; - public final Resource Diagram_Visualisations_StaticPropertiesConsumers; - public final Resource Diagram_Visualisations_StaticPropertiesConsumers_Inverse; - public final Resource Diagram_Visualisations_StaticPropertiesNetworkBranches; - public final Resource Diagram_Visualisations_StaticPropertiesNetworkBranches_Inverse; - public final Resource Diagram_Visualisations_StaticPropertiesPoints; - public final Resource Diagram_Visualisations_StaticPropertiesPoints_Inverse; - public final Resource Diagram_Visualisations_UseColorBarGradients; - public final Resource Diagram_Visualisations_UseColorBarGradients_Inverse; - public final Resource Diagram_Visualisations_UseSizeBarGradients; - public final Resource Diagram_Visualisations_UseSizeBarGradients_Inverse; - public final Resource Diagram_Visualisations_arrowContributionContributorName; - public final Resource Diagram_Visualisations_arrowContributionContributorName_Inverse; - public final Resource Diagram_Visualisations_arrowContributionLabel; - public final Resource Diagram_Visualisations_arrowContributionLabel_Inverse; - public final Resource Diagram_Visualisations_arrowContributionModuleAttribute; - public final Resource Diagram_Visualisations_arrowContributionModuleAttribute_Inverse; - public final Resource Diagram_Visualisations_arrowContributionModuleName; - public final Resource Diagram_Visualisations_arrowContributionModuleName_Inverse; - public final Resource Diagram_Visualisations_arrowContributionUseDefault; - public final Resource Diagram_Visualisations_arrowContributionUseDefault_Inverse; - public final Resource Diagram_Visualisations_arrowContributionUsed; - public final Resource Diagram_Visualisations_arrowContributionUsed_Inverse; - public final Resource Diagram_Visualisations_arrowContributionVariableBias; - public final Resource Diagram_Visualisations_arrowContributionVariableBias_Inverse; - public final Resource Diagram_Visualisations_arrowContributionVariableGain; - public final Resource Diagram_Visualisations_arrowContributionVariableGain_Inverse; - public final Resource Diagram_Visualisations_arrowContributions; - public final Resource Diagram_Visualisations_arrowContributions_Inverse; - public final Resource Diagram_Visualisations_colorContributionContributorName; - public final Resource Diagram_Visualisations_colorContributionContributorName_Inverse; - public final Resource Diagram_Visualisations_colorContributionDefaultColorMap; - public final Resource Diagram_Visualisations_colorContributionDefaultColorMap_Inverse; - public final Resource Diagram_Visualisations_colorContributionDefaultMax; - public final Resource Diagram_Visualisations_colorContributionDefaultMax_Inverse; - public final Resource Diagram_Visualisations_colorContributionDefaultMin; - public final Resource Diagram_Visualisations_colorContributionDefaultMin_Inverse; - public final Resource Diagram_Visualisations_colorContributionLabel; - public final Resource Diagram_Visualisations_colorContributionLabel_Inverse; - public final Resource Diagram_Visualisations_colorContributionModuleAttribute; - public final Resource Diagram_Visualisations_colorContributionModuleAttribute_Inverse; - public final Resource Diagram_Visualisations_colorContributionModuleName; - public final Resource Diagram_Visualisations_colorContributionModuleName_Inverse; - public final Resource Diagram_Visualisations_colorContributionUnit; - public final Resource Diagram_Visualisations_colorContributionUnit_Inverse; - public final Resource Diagram_Visualisations_colorContributionUseDefault; - public final Resource Diagram_Visualisations_colorContributionUseDefault_Inverse; - public final Resource Diagram_Visualisations_colorContributionUsed; - public final Resource Diagram_Visualisations_colorContributionUsed_Inverse; - public final Resource Diagram_Visualisations_colorContributionVariableBias; - public final Resource Diagram_Visualisations_colorContributionVariableBias_Inverse; - public final Resource Diagram_Visualisations_colorContributionVariableGain; - public final Resource Diagram_Visualisations_colorContributionVariableGain_Inverse; - public final Resource Diagram_Visualisations_colorContributions; - public final Resource Diagram_Visualisations_colorContributions_Inverse; - public final Resource Diagram_Visualisations_sizeContributionContributorName; - public final Resource Diagram_Visualisations_sizeContributionContributorName_Inverse; - public final Resource Diagram_Visualisations_sizeContributionDefaultMax; - public final Resource Diagram_Visualisations_sizeContributionDefaultMax_Inverse; - public final Resource Diagram_Visualisations_sizeContributionDefaultMin; - public final Resource Diagram_Visualisations_sizeContributionDefaultMin_Inverse; - public final Resource Diagram_Visualisations_sizeContributionDefaultSizeMap; - public final Resource Diagram_Visualisations_sizeContributionDefaultSizeMap_Inverse; - public final Resource Diagram_Visualisations_sizeContributionLabel; - public final Resource Diagram_Visualisations_sizeContributionLabel_Inverse; - public final Resource Diagram_Visualisations_sizeContributionModuleAttribute; - public final Resource Diagram_Visualisations_sizeContributionModuleAttribute_Inverse; - public final Resource Diagram_Visualisations_sizeContributionModuleName; - public final Resource Diagram_Visualisations_sizeContributionModuleName_Inverse; - public final Resource Diagram_Visualisations_sizeContributionUnit; - public final Resource Diagram_Visualisations_sizeContributionUnit_Inverse; - public final Resource Diagram_Visualisations_sizeContributionUseDefault; - public final Resource Diagram_Visualisations_sizeContributionUseDefault_Inverse; - public final Resource Diagram_Visualisations_sizeContributionUsed; - public final Resource Diagram_Visualisations_sizeContributionUsed_Inverse; - public final Resource Diagram_Visualisations_sizeContributionVariableBias; - public final Resource Diagram_Visualisations_sizeContributionVariableBias_Inverse; - public final Resource Diagram_Visualisations_sizeContributionVariableGain; - public final Resource Diagram_Visualisations_sizeContributionVariableGain_Inverse; - public final Resource Diagram_Visualisations_sizeContributions; - public final Resource Diagram_Visualisations_sizeContributions_Inverse; - public final Resource Diagram_backgroundColor; - public final Resource Diagram_backgroundColor_Inverse; - public final Resource Diagram_drawMapEnabled; - public final Resource Diagram_drawMapEnabled_Inverse; - public final Resource Diagram_hasActiveVisualisation; - public final Resource Diagram_hasActiveVisualisation_Inverse; - public final Resource Diagram_hasVisualisation; - public final Resource Diagram_hasVisualisation_Inverse; - public final Resource Diagram_splitToMultipleEnabled; - public final Resource Diagram_splitToMultipleEnabled_Inverse; - public final Resource Diagram_trackChangesEnabled; - public final Resource Diagram_trackChangesEnabled_Inverse; - public final Resource DistrictNetworkStaticInfoStyle; - public final Resource DistrictNodeGroup; - public final Resource DistrictNodeGroup_hasComponentTypeName; - public final Resource DistrictNodeGroup_hasComponentTypeName_Inverse; - public final Resource EPSG_4326; - public final Resource Edge; - public final Resource EdgeDefaultMapping; - public final Resource EdgeDefaultMapping_Inverse; - public final Resource EdgeMappingParameterType; - public final Resource Edge_HasDiameter; - public final Resource Edge_HasDiameter_Inverse; - public final Resource Edge_HasElevation; - public final Resource Edge_HasElevation_Inverse; - public final Resource Edge_HasFlowArea; - public final Resource Edge_HasFlowArea_Inverse; - public final Resource Edge_HasGeometry; - public final Resource Edge_HasGeometry_Inverse; - public final Resource Edge_HasKReturn; - public final Resource Edge_HasKReturn_Inverse; - public final Resource Edge_HasKSupply; - public final Resource Edge_HasKSupply_Inverse; - public final Resource Edge_HasLength; - public final Resource Edge_HasLength_Inverse; - public final Resource Edge_HasNominalMassFlow; - public final Resource Edge_HasNominalMassFlow_Inverse; - public final Resource Edge_HasOuterDiameter; - public final Resource Edge_HasOuterDiameter_Inverse; - public final Resource Edge_HasTGround; - public final Resource Edge_HasTGround_Inverse; - public final Resource Edge_HasType; - public final Resource Edge_HasType_Inverse; - public final Resource Element; - public final Resource ElevationRectangleStyle; - public final Resource Functions; - public final Resource Functions_compositeInstantiator; - public final Resource Functions_constantOne; - public final Resource Functions_convertToValue; - public final Resource Functions_defaultEdgeMappingModifier; - public final Resource Functions_defaultVertexMappingModifier; - public final Resource Functions_enumerationValues; - public final Resource Functions_hasNominalMassFlowValue; - public final Resource Functions_mappingModifier; - public final Resource Groups; - public final Resource Groups_EdgeGroup; - public final Resource Groups_ElementGroup; - public final Resource Groups_VertexGroup; - public final Resource HasEndVertex; - public final Resource HasEndVertex_Inverse; - public final Resource HasId; - public final Resource HasId_Inverse; - public final Resource HasInLayerTag; - public final Resource HasInLayerTag_Inverse; - public final Resource HasMapping; - public final Resource HasMapping_Inverse; - public final Resource HasRegion; - public final Resource HasRegion_Inverse; - public final Resource HasSRID; - public final Resource HasSRID_Inverse; - public final Resource HasSRTEXT; - public final Resource HasSRTEXT_Inverse; - public final Resource HasSpatialRefSystem; - public final Resource HasSpatialRefSystem_Inverse; - public final Resource HasStartVertex; - public final Resource HasStartVertex_Inverse; - public final Resource HasSymbolFunction; - public final Resource HasSymbolFunction_Inverse; - public final Resource Images; - public final Resource Images_MapImage; - public final Resource InLayer; - public final Resource Layer; - public final Resource LeftClickDefaultMapping; - public final Resource LeftClickDefaultMapping_Inverse; - public final Resource MappedComponent; - public final Resource MappedFromElement; - public final Resource Mapping; - public final Resource MappingParameterType; - public final Resource Mapping_Base; - public final Resource Mapping_ComponentType; - public final Resource Mapping_ComponentType_Inverse; - public final Resource Mapping_EdgeMapping; - public final Resource Mapping_EdgeMapping_DiameterAttribute; - public final Resource Mapping_EdgeMapping_DiameterAttribute_Inverse; - public final Resource Mapping_EdgeMapping_ElevationAttribute; - public final Resource Mapping_EdgeMapping_ElevationAttribute_Inverse; - public final Resource Mapping_EdgeMapping_FlowAreaAttribute; - public final Resource Mapping_EdgeMapping_FlowAreaAttribute_Inverse; - public final Resource Mapping_EdgeMapping_KReturnAttribute; - public final Resource Mapping_EdgeMapping_KReturnAttribute_Inverse; - public final Resource Mapping_EdgeMapping_KSupplyAttribute; - public final Resource Mapping_EdgeMapping_KSupplyAttribute_Inverse; - public final Resource Mapping_EdgeMapping_LengthAttribute; - public final Resource Mapping_EdgeMapping_LengthAttribute_Inverse; - public final Resource Mapping_EdgeMapping_NominalMassFlowAttribute; - public final Resource Mapping_EdgeMapping_NominalMassFlowAttribute_Inverse; - public final Resource Mapping_EdgeMapping_OuterDiameterAttribute; - public final Resource Mapping_EdgeMapping_OuterDiameterAttribute_Inverse; - public final Resource Mapping_EdgeMapping_PipeTypeAttribute; - public final Resource Mapping_EdgeMapping_PipeTypeAttribute_Inverse; - public final Resource Mapping_EdgeMapping_TGroundAttribute; - public final Resource Mapping_EdgeMapping_TGroundAttribute_Inverse; - public final Resource Mapping_Id; - public final Resource Mapping_Id_Inverse; - public final Resource Mapping_InputTerminal; - public final Resource Mapping_InputTerminal_Inverse; - public final Resource Mapping_OutputTerminal; - public final Resource Mapping_OutputTerminal_Inverse; - public final Resource Mapping_Region; - public final Resource Mapping_Region_Inverse; - public final Resource Mapping_Terminal; - public final Resource Mapping_TerminalPair; - public final Resource Mapping_Terminals; - public final Resource Mapping_Terminals_Inverse; - public final Resource Mapping_VertexMapping; - public final Resource Mapping_VertexMapping_AddressAttribute; - public final Resource Mapping_VertexMapping_AddressAttribute_Inverse; - public final Resource Mapping_VertexMapping_DeltaPressureAttribute; - public final Resource Mapping_VertexMapping_DeltaPressureAttribute_Inverse; - public final Resource Mapping_VertexMapping_DeltaTemperatureAttribute; - public final Resource Mapping_VertexMapping_DeltaTemperatureAttribute_Inverse; - public final Resource Mapping_VertexMapping_ElevationAltAttribute; - public final Resource Mapping_VertexMapping_ElevationAltAttribute_Inverse; - public final Resource Mapping_VertexMapping_ElevationAttribute; - public final Resource Mapping_VertexMapping_ElevationAttribute_Inverse; - public final Resource Mapping_VertexMapping_FlowAreaAttribute; - public final Resource Mapping_VertexMapping_FlowAreaAttribute_Inverse; - public final Resource Mapping_VertexMapping_FrequencyConverterControlledAttribute; - public final Resource Mapping_VertexMapping_FrequencyConverterControlledAttribute_Inverse; - public final Resource Mapping_VertexMapping_HeadPumpMaximumAttribute; - public final Resource Mapping_VertexMapping_HeadPumpMaximumAttribute_Inverse; - public final Resource Mapping_VertexMapping_HeadPumpNominalAttribute; - public final Resource Mapping_VertexMapping_HeadPumpNominalAttribute_Inverse; - public final Resource Mapping_VertexMapping_HeatLoadDsAttribute; - public final Resource Mapping_VertexMapping_HeatLoadDsAttribute_Inverse; - public final Resource Mapping_VertexMapping_HeatPowerAttribute; - public final Resource Mapping_VertexMapping_HeatPowerAttribute_Inverse; - public final Resource Mapping_VertexMapping_InternalValveMeasurementAttribute; - public final Resource Mapping_VertexMapping_InternalValveMeasurementAttribute_Inverse; - public final Resource Mapping_VertexMapping_MassFlowAttribute; - public final Resource Mapping_VertexMapping_MassFlowAttribute_Inverse; - public final Resource Mapping_VertexMapping_MaximumHeadMAttribute; - public final Resource Mapping_VertexMapping_MaximumHeadMAttribute_Inverse; - public final Resource Mapping_VertexMapping_NominalFlowAttribute; - public final Resource Mapping_VertexMapping_NominalFlowAttribute_Inverse; - public final Resource Mapping_VertexMapping_NominalHeadBAttribute; - public final Resource Mapping_VertexMapping_NominalHeadBAttribute_Inverse; - public final Resource Mapping_VertexMapping_NominalHeadMAttribute; - public final Resource Mapping_VertexMapping_NominalHeadMAttribute_Inverse; - public final Resource Mapping_VertexMapping_NominalMassFlowAttribute; - public final Resource Mapping_VertexMapping_NominalMassFlowAttribute_Inverse; - public final Resource Mapping_VertexMapping_NominalPressureLossAttribute; - public final Resource Mapping_VertexMapping_NominalPressureLossAttribute_Inverse; - public final Resource Mapping_VertexMapping_OpeningTimeAttribute; - public final Resource Mapping_VertexMapping_OpeningTimeAttribute_Inverse; - public final Resource Mapping_VertexMapping_PeakPowerAttribute; - public final Resource Mapping_VertexMapping_PeakPowerAttribute_Inverse; - public final Resource Mapping_VertexMapping_PumpInReturnLineAttribute; - public final Resource Mapping_VertexMapping_PumpInReturnLineAttribute_Inverse; - public final Resource Mapping_VertexMapping_PumpMassFlowNominalAttribute; - public final Resource Mapping_VertexMapping_PumpMassFlowNominalAttribute_Inverse; - public final Resource Mapping_VertexMapping_PumpMeMaxAttribute; - public final Resource Mapping_VertexMapping_PumpMeMaxAttribute_Inverse; - public final Resource Mapping_VertexMapping_PumpMeMinAttribute; - public final Resource Mapping_VertexMapping_PumpMeMinAttribute_Inverse; - public final Resource Mapping_VertexMapping_PumpSpeedMaxAttribute; - public final Resource Mapping_VertexMapping_PumpSpeedMaxAttribute_Inverse; - public final Resource Mapping_VertexMapping_PumpSpeedMinAttribute; - public final Resource Mapping_VertexMapping_PumpSpeedMinAttribute_Inverse; - public final Resource Mapping_VertexMapping_ReturnPressureAttribute; - public final Resource Mapping_VertexMapping_ReturnPressureAttribute_Inverse; - public final Resource Mapping_VertexMapping_ReturnTemperatureAttribute; - public final Resource Mapping_VertexMapping_ReturnTemperatureAttribute_Inverse; - public final Resource Mapping_VertexMapping_SupplyPressureAttribute; - public final Resource Mapping_VertexMapping_SupplyPressureAttribute_Inverse; - public final Resource Mapping_VertexMapping_SupplyTemperatureAttribute; - public final Resource Mapping_VertexMapping_SupplyTemperatureAttribute_Inverse; - public final Resource Mapping_VertexMapping_ValveMeMaxAttribute; - public final Resource Mapping_VertexMapping_ValveMeMaxAttribute_Inverse; - public final Resource Mapping_VertexMapping_ValveMeMinAttribute; - public final Resource Mapping_VertexMapping_ValveMeMinAttribute_Inverse; - public final Resource Mapping_VertexMapping_ValveMinPositionAttribute; - public final Resource Mapping_VertexMapping_ValveMinPositionAttribute_Inverse; - public final Resource Mapping_VertexMapping_ValveOutletModeAttribute; - public final Resource Mapping_VertexMapping_ValveOutletModeAttribute_Inverse; - public final Resource Mapping_VertexMapping_ValvePositionAttribute; - public final Resource Mapping_VertexMapping_ValvePositionAttribute_Inverse; - public final Resource Mapping_VertexMapping_ValvePressLossNominalAttribute; - public final Resource Mapping_VertexMapping_ValvePressLossNominalAttribute_Inverse; - public final Resource Mapping_VertexMapping_ValveReturnLineAttribute; - public final Resource Mapping_VertexMapping_ValveReturnLineAttribute_Inverse; - public final Resource Mapping_VertexMapping_VelocityAttribute; - public final Resource Mapping_VertexMapping_VelocityAttribute_Inverse; - public final Resource Mapping_VertexMapping_VolFlowAttribute; - public final Resource Mapping_VertexMapping_VolFlowAttribute_Inverse; - public final Resource Mapping_VertexMapping_XAttribute; - public final Resource Mapping_VertexMapping_XAttribute_Inverse; - public final Resource Mapping_VertexMapping_YAttribute; - public final Resource Mapping_VertexMapping_YAttribute_Inverse; - public final Resource Mapping_VertexMapping_dpAttribute; - public final Resource Mapping_VertexMapping_dpAttribute_Inverse; - public final Resource Mapping_VertexMapping_dtAttribute; - public final Resource Mapping_VertexMapping_dtAttribute_Inverse; - public final Resource ReturnConnectionType; - public final Resource ReturnInConnectionType; - public final Resource ReturnOutConnectionType; - public final Resource RightClickDefaultMapping; - public final Resource RightClickDefaultMapping_Inverse; - public final Resource SCLMain; - public final Resource SpatialRefSystem; - public final Resource SupplyConnectionType; - public final Resource SupplyInConnectionType; - public final Resource SupplyOutConnectionType; - public final Resource TechType; - public final Resource TechType_Functions; - public final Resource TechType_Functions_techTypeCodeValueAccessor; - public final Resource TechType_TechTypeCodeParameterType; - public final Resource TechType_TechTypeTable; - public final Resource TechType_TechTypeTable_HasComponentType; - public final Resource TechType_TechTypeTable_HasData; - public final Resource TechType_TechTypeTable_HasData_Inverse; - public final Resource Vertex; - public final Resource VertexDefaultMapping; - public final Resource VertexDefaultMapping_Inverse; - public final Resource VertexMappingParameterType; - public final Resource VertexSymbolStyle; - public final Resource Vertex_HasAddress; - public final Resource Vertex_HasAddress_Inverse; - public final Resource Vertex_HasAltElevation; - public final Resource Vertex_HasAltElevation_Inverse; - public final Resource Vertex_HasDeltaPressure; - public final Resource Vertex_HasDeltaPressure_Inverse; - public final Resource Vertex_HasDeltaTemperature; - public final Resource Vertex_HasDeltaTemperature_Inverse; - public final Resource Vertex_HasElevation; - public final Resource Vertex_HasElevation_Inverse; - public final Resource Vertex_HasFlowArea; - public final Resource Vertex_HasFlowArea_Inverse; - public final Resource Vertex_HasFrequencyConverterControlled; - public final Resource Vertex_HasFrequencyConverterControlled_Inverse; - public final Resource Vertex_HasHeadPumpMaximum; - public final Resource Vertex_HasHeadPumpMaximum_Inverse; - public final Resource Vertex_HasHeadPumpNominal; - public final Resource Vertex_HasHeadPumpNominal_Inverse; - public final Resource Vertex_HasHeatLoadDs; - public final Resource Vertex_HasHeatLoadDs_Inverse; - public final Resource Vertex_HasHeatPower; - public final Resource Vertex_HasHeatPower_Inverse; - public final Resource Vertex_HasInternalValveMeasurement; - public final Resource Vertex_HasInternalValveMeasurement_Inverse; - public final Resource Vertex_HasMassFlow; - public final Resource Vertex_HasMassFlow_Inverse; - public final Resource Vertex_HasMaximumHeadM; - public final Resource Vertex_HasMaximumHeadM_Inverse; - public final Resource Vertex_HasNominalFlow; - public final Resource Vertex_HasNominalFlow_Inverse; - public final Resource Vertex_HasNominalHeadB; - public final Resource Vertex_HasNominalHeadB_Inverse; - public final Resource Vertex_HasNominalHeadM; - public final Resource Vertex_HasNominalHeadM_Inverse; - public final Resource Vertex_HasNominalPressureLoss; - public final Resource Vertex_HasNominalPressureLoss_Inverse; - public final Resource Vertex_HasOpeningTime; - public final Resource Vertex_HasOpeningTime_Inverse; - public final Resource Vertex_HasPeakPower; - public final Resource Vertex_HasPeakPower_Inverse; - public final Resource Vertex_HasPumpInReturnLine; - public final Resource Vertex_HasPumpInReturnLine_Inverse; - public final Resource Vertex_HasPumpMassFlowNominal; - public final Resource Vertex_HasPumpMassFlowNominal_Inverse; - public final Resource Vertex_HasPumpMeMax; - public final Resource Vertex_HasPumpMeMax_Inverse; - public final Resource Vertex_HasPumpMeMin; - public final Resource Vertex_HasPumpMeMin_Inverse; - public final Resource Vertex_HasPumpSpeedMax; - public final Resource Vertex_HasPumpSpeedMax_Inverse; - public final Resource Vertex_HasPumpSpeedMin; - public final Resource Vertex_HasPumpSpeedMin_Inverse; - public final Resource Vertex_HasReturnPressure; - public final Resource Vertex_HasReturnPressure_Inverse; - public final Resource Vertex_HasReturnTemperature; - public final Resource Vertex_HasReturnTemperature_Inverse; - public final Resource Vertex_HasSupplyPressure; - public final Resource Vertex_HasSupplyPressure_Inverse; - public final Resource Vertex_HasSupplyTemperature; - public final Resource Vertex_HasSupplyTemperature_Inverse; - public final Resource Vertex_HasValveMeMax; - public final Resource Vertex_HasValveMeMax_Inverse; - public final Resource Vertex_HasValveMeMin; - public final Resource Vertex_HasValveMeMin_Inverse; - public final Resource Vertex_HasValveMinPosition; - public final Resource Vertex_HasValveMinPosition_Inverse; - public final Resource Vertex_HasValveOutletMode; - public final Resource Vertex_HasValveOutletMode_Inverse; - public final Resource Vertex_HasValvePosition; - public final Resource Vertex_HasValvePosition_Inverse; - public final Resource Vertex_HasValvePressLossNominal; - public final Resource Vertex_HasValvePressLossNominal_Inverse; - public final Resource Vertex_HasValveReturnLine; - public final Resource Vertex_HasValveReturnLine_Inverse; - public final Resource Vertex_HasVelocity; - public final Resource Vertex_HasVelocity_Inverse; - public final Resource Vertex_HasVolFlow; - public final Resource Vertex_HasVolFlow_Inverse; - public final Resource VisualisationsFolder; - - public static class URIs { - public static final String ActionContext = "http://www.simantics.org/DistrictNetwork-1.0/ActionContext"; - public static final String ActionContext_newDiagramContribution = "http://www.simantics.org/DistrictNetwork-1.0/ActionContext/newDiagramContribution"; - public static final String Actions = "http://www.simantics.org/DistrictNetwork-1.0/Actions"; - public static final String AddLayerToDNDiagramTemplate = "http://www.simantics.org/DistrictNetwork-1.0/AddLayerToDNDiagramTemplate"; - public static final String BrowseContext = "http://www.simantics.org/DistrictNetwork-1.0/BrowseContext"; - public static final String Composite = "http://www.simantics.org/DistrictNetwork-1.0/Composite"; - public static final String Connection = "http://www.simantics.org/DistrictNetwork-1.0/Connection"; - public static final String ConnectionLineStyle = "http://www.simantics.org/DistrictNetwork-1.0/ConnectionLineStyle"; - public static final String Diagram = "http://www.simantics.org/DistrictNetwork-1.0/Diagram"; - public static final String Diagram_DefaultPipeTechTypeId = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/DefaultPipeTechTypeId"; - public static final String Diagram_DefaultPipeTechTypeId_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/DefaultPipeTechTypeId/Inverse"; - public static final String Diagram_MappedDiagram = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/MappedDiagram"; - public static final String Diagram_MappedFromDiagram = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/MappedFromDiagram"; - public static final String Diagram_Visualisations = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations"; - public static final String Diagram_Visualisations_ArrowContribution = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ArrowContribution"; - public static final String Diagram_Visualisations_ColorBarLocation = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ColorBarLocation"; - public static final String Diagram_Visualisations_ColorBarLocation_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ColorBarLocation/Inverse"; - public static final String Diagram_Visualisations_ColorBarSize = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ColorBarSize"; - public static final String Diagram_Visualisations_ColorBarSize_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ColorBarSize/Inverse"; - public static final String Diagram_Visualisations_ColorContribution = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ColorContribution"; - public static final String Diagram_Visualisations_DisabledUpdates = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DisabledUpdates"; - public static final String Diagram_Visualisations_DisabledUpdates_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DisabledUpdates/Inverse"; - public static final String Diagram_Visualisations_DynamicSymbolsProducers = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DynamicSymbolsProducers"; - public static final String Diagram_Visualisations_DynamicSymbolsProducers_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DynamicSymbolsProducers/Inverse"; - public static final String Diagram_Visualisations_DynamicSymbolsPumpingStations = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DynamicSymbolsPumpingStations"; - public static final String Diagram_Visualisations_DynamicSymbolsPumpingStations_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DynamicSymbolsPumpingStations/Inverse"; - public static final String Diagram_Visualisations_DynamicSymbolsShutoffValves = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DynamicSymbolsShutoffValves"; - public static final String Diagram_Visualisations_DynamicSymbolsShutoffValves_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DynamicSymbolsShutoffValves/Inverse"; - public static final String Diagram_Visualisations_DynamicSymbolsValves = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DynamicSymbolsValves"; - public static final String Diagram_Visualisations_DynamicSymbolsValves_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/DynamicSymbolsValves/Inverse"; - public static final String Diagram_Visualisations_HideConsumers = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HideConsumers"; - public static final String Diagram_Visualisations_HideConsumers_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HideConsumers/Inverse"; - public static final String Diagram_Visualisations_HideEdges = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HideEdges"; - public static final String Diagram_Visualisations_HideEdges_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HideEdges/Inverse"; - public static final String Diagram_Visualisations_HidePoints = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HidePoints"; - public static final String Diagram_Visualisations_HidePoints_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HidePoints/Inverse"; - public static final String Diagram_Visualisations_HideProducers = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HideProducers"; - public static final String Diagram_Visualisations_HideProducers_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HideProducers/Inverse"; - public static final String Diagram_Visualisations_HidePumpingStations = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HidePumpingStations"; - public static final String Diagram_Visualisations_HidePumpingStations_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HidePumpingStations/Inverse"; - public static final String Diagram_Visualisations_HideValves = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HideValves"; - public static final String Diagram_Visualisations_HideValves_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/HideValves/Inverse"; - public static final String Diagram_Visualisations_Interval = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/Interval"; - public static final String Diagram_Visualisations_Interval_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/Interval/Inverse"; - public static final String Diagram_Visualisations_KeyVariableEdgeHover = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/KeyVariableEdgeHover"; - public static final String Diagram_Visualisations_KeyVariableEdgeHover_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/KeyVariableEdgeHover/Inverse"; - public static final String Diagram_Visualisations_KeyVariableVertexHover = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/KeyVariableVertexHover"; - public static final String Diagram_Visualisations_KeyVariableVertexHover_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/KeyVariableVertexHover/Inverse"; - public static final String Diagram_Visualisations_ResetVisualisation = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ResetVisualisation"; - public static final String Diagram_Visualisations_ResetVisualisation_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ResetVisualisation/Inverse"; - public static final String Diagram_Visualisations_ShowColorBarTicks = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ShowColorBarTicks"; - public static final String Diagram_Visualisations_ShowColorBarTicks_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ShowColorBarTicks/Inverse"; - public static final String Diagram_Visualisations_ShowColorBars = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ShowColorBars"; - public static final String Diagram_Visualisations_ShowColorBars_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ShowColorBars/Inverse"; - public static final String Diagram_Visualisations_ShowSizeBarTicks = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ShowSizeBarTicks"; - public static final String Diagram_Visualisations_ShowSizeBarTicks_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ShowSizeBarTicks/Inverse"; - public static final String Diagram_Visualisations_ShowSizeBars = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ShowSizeBars"; - public static final String Diagram_Visualisations_ShowSizeBars_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/ShowSizeBars/Inverse"; - public static final String Diagram_Visualisations_SizeBarLocation = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/SizeBarLocation"; - public static final String Diagram_Visualisations_SizeBarLocation_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/SizeBarLocation/Inverse"; - public static final String Diagram_Visualisations_SizeBarSize = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/SizeBarSize"; - public static final String Diagram_Visualisations_SizeBarSize_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/SizeBarSize/Inverse"; - public static final String Diagram_Visualisations_SizeContribution = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/SizeContribution"; - public static final String Diagram_Visualisations_StaticPropertiesConsumers = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/StaticPropertiesConsumers"; - public static final String Diagram_Visualisations_StaticPropertiesConsumers_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/StaticPropertiesConsumers/Inverse"; - public static final String Diagram_Visualisations_StaticPropertiesNetworkBranches = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/StaticPropertiesNetworkBranches"; - public static final String Diagram_Visualisations_StaticPropertiesNetworkBranches_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/StaticPropertiesNetworkBranches/Inverse"; - public static final String Diagram_Visualisations_StaticPropertiesPoints = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/StaticPropertiesPoints"; - public static final String Diagram_Visualisations_StaticPropertiesPoints_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/StaticPropertiesPoints/Inverse"; - public static final String Diagram_Visualisations_UseColorBarGradients = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/UseColorBarGradients"; - public static final String Diagram_Visualisations_UseColorBarGradients_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/UseColorBarGradients/Inverse"; - public static final String Diagram_Visualisations_UseSizeBarGradients = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/UseSizeBarGradients"; - public static final String Diagram_Visualisations_UseSizeBarGradients_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/UseSizeBarGradients/Inverse"; - public static final String Diagram_Visualisations_arrowContributionContributorName = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionContributorName"; - public static final String Diagram_Visualisations_arrowContributionContributorName_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionContributorName/Inverse"; - public static final String Diagram_Visualisations_arrowContributionLabel = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionLabel"; - public static final String Diagram_Visualisations_arrowContributionLabel_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionLabel/Inverse"; - public static final String Diagram_Visualisations_arrowContributionModuleAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionModuleAttribute"; - public static final String Diagram_Visualisations_arrowContributionModuleAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionModuleAttribute/Inverse"; - public static final String Diagram_Visualisations_arrowContributionModuleName = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionModuleName"; - public static final String Diagram_Visualisations_arrowContributionModuleName_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionModuleName/Inverse"; - public static final String Diagram_Visualisations_arrowContributionUseDefault = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionUseDefault"; - public static final String Diagram_Visualisations_arrowContributionUseDefault_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionUseDefault/Inverse"; - public static final String Diagram_Visualisations_arrowContributionUsed = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionUsed"; - public static final String Diagram_Visualisations_arrowContributionUsed_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionUsed/Inverse"; - public static final String Diagram_Visualisations_arrowContributionVariableBias = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionVariableBias"; - public static final String Diagram_Visualisations_arrowContributionVariableBias_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionVariableBias/Inverse"; - public static final String Diagram_Visualisations_arrowContributionVariableGain = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionVariableGain"; - public static final String Diagram_Visualisations_arrowContributionVariableGain_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributionVariableGain/Inverse"; - public static final String Diagram_Visualisations_arrowContributions = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributions"; - public static final String Diagram_Visualisations_arrowContributions_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/arrowContributions/Inverse"; - public static final String Diagram_Visualisations_colorContributionContributorName = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionContributorName"; - public static final String Diagram_Visualisations_colorContributionContributorName_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionContributorName/Inverse"; - public static final String Diagram_Visualisations_colorContributionDefaultColorMap = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionDefaultColorMap"; - public static final String Diagram_Visualisations_colorContributionDefaultColorMap_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionDefaultColorMap/Inverse"; - public static final String Diagram_Visualisations_colorContributionDefaultMax = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionDefaultMax"; - public static final String Diagram_Visualisations_colorContributionDefaultMax_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionDefaultMax/Inverse"; - public static final String Diagram_Visualisations_colorContributionDefaultMin = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionDefaultMin"; - public static final String Diagram_Visualisations_colorContributionDefaultMin_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionDefaultMin/Inverse"; - public static final String Diagram_Visualisations_colorContributionLabel = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionLabel"; - public static final String Diagram_Visualisations_colorContributionLabel_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionLabel/Inverse"; - public static final String Diagram_Visualisations_colorContributionModuleAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionModuleAttribute"; - public static final String Diagram_Visualisations_colorContributionModuleAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionModuleAttribute/Inverse"; - public static final String Diagram_Visualisations_colorContributionModuleName = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionModuleName"; - public static final String Diagram_Visualisations_colorContributionModuleName_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionModuleName/Inverse"; - public static final String Diagram_Visualisations_colorContributionUnit = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionUnit"; - public static final String Diagram_Visualisations_colorContributionUnit_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionUnit/Inverse"; - public static final String Diagram_Visualisations_colorContributionUseDefault = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionUseDefault"; - public static final String Diagram_Visualisations_colorContributionUseDefault_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionUseDefault/Inverse"; - public static final String Diagram_Visualisations_colorContributionUsed = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionUsed"; - public static final String Diagram_Visualisations_colorContributionUsed_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionUsed/Inverse"; - public static final String Diagram_Visualisations_colorContributionVariableBias = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionVariableBias"; - public static final String Diagram_Visualisations_colorContributionVariableBias_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionVariableBias/Inverse"; - public static final String Diagram_Visualisations_colorContributionVariableGain = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionVariableGain"; - public static final String Diagram_Visualisations_colorContributionVariableGain_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributionVariableGain/Inverse"; - public static final String Diagram_Visualisations_colorContributions = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributions"; - public static final String Diagram_Visualisations_colorContributions_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/colorContributions/Inverse"; - public static final String Diagram_Visualisations_sizeContributionContributorName = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionContributorName"; - public static final String Diagram_Visualisations_sizeContributionContributorName_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionContributorName/Inverse"; - public static final String Diagram_Visualisations_sizeContributionDefaultMax = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionDefaultMax"; - public static final String Diagram_Visualisations_sizeContributionDefaultMax_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionDefaultMax/Inverse"; - public static final String Diagram_Visualisations_sizeContributionDefaultMin = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionDefaultMin"; - public static final String Diagram_Visualisations_sizeContributionDefaultMin_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionDefaultMin/Inverse"; - public static final String Diagram_Visualisations_sizeContributionDefaultSizeMap = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionDefaultSizeMap"; - public static final String Diagram_Visualisations_sizeContributionDefaultSizeMap_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionDefaultSizeMap/Inverse"; - public static final String Diagram_Visualisations_sizeContributionLabel = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionLabel"; - public static final String Diagram_Visualisations_sizeContributionLabel_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionLabel/Inverse"; - public static final String Diagram_Visualisations_sizeContributionModuleAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionModuleAttribute"; - public static final String Diagram_Visualisations_sizeContributionModuleAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionModuleAttribute/Inverse"; - public static final String Diagram_Visualisations_sizeContributionModuleName = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionModuleName"; - public static final String Diagram_Visualisations_sizeContributionModuleName_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionModuleName/Inverse"; - public static final String Diagram_Visualisations_sizeContributionUnit = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionUnit"; - public static final String Diagram_Visualisations_sizeContributionUnit_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionUnit/Inverse"; - public static final String Diagram_Visualisations_sizeContributionUseDefault = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionUseDefault"; - public static final String Diagram_Visualisations_sizeContributionUseDefault_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionUseDefault/Inverse"; - public static final String Diagram_Visualisations_sizeContributionUsed = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionUsed"; - public static final String Diagram_Visualisations_sizeContributionUsed_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionUsed/Inverse"; - public static final String Diagram_Visualisations_sizeContributionVariableBias = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionVariableBias"; - public static final String Diagram_Visualisations_sizeContributionVariableBias_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionVariableBias/Inverse"; - public static final String Diagram_Visualisations_sizeContributionVariableGain = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionVariableGain"; - public static final String Diagram_Visualisations_sizeContributionVariableGain_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributionVariableGain/Inverse"; - public static final String Diagram_Visualisations_sizeContributions = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributions"; - public static final String Diagram_Visualisations_sizeContributions_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/Visualisations/sizeContributions/Inverse"; - public static final String Diagram_backgroundColor = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/backgroundColor"; - public static final String Diagram_backgroundColor_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/backgroundColor/Inverse"; - public static final String Diagram_drawMapEnabled = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/drawMapEnabled"; - public static final String Diagram_drawMapEnabled_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/drawMapEnabled/Inverse"; - public static final String Diagram_hasActiveVisualisation = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/hasActiveVisualisation"; - public static final String Diagram_hasActiveVisualisation_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/hasActiveVisualisation/Inverse"; - public static final String Diagram_hasVisualisation = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/hasVisualisation"; - public static final String Diagram_hasVisualisation_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/hasVisualisation/Inverse"; - public static final String Diagram_splitToMultipleEnabled = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/splitToMultipleEnabled"; - public static final String Diagram_splitToMultipleEnabled_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/splitToMultipleEnabled/Inverse"; - public static final String Diagram_trackChangesEnabled = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/trackChangesEnabled"; - public static final String Diagram_trackChangesEnabled_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Diagram/trackChangesEnabled/Inverse"; - public static final String DistrictNetworkStaticInfoStyle = "http://www.simantics.org/DistrictNetwork-1.0/DistrictNetworkStaticInfoStyle"; - public static final String DistrictNodeGroup = "http://www.simantics.org/DistrictNetwork-1.0/DistrictNodeGroup"; - public static final String DistrictNodeGroup_hasComponentTypeName = "http://www.simantics.org/DistrictNetwork-1.0/DistrictNodeGroup/hasComponentTypeName"; - public static final String DistrictNodeGroup_hasComponentTypeName_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/DistrictNodeGroup/hasComponentTypeName/Inverse"; - public static final String EPSG_4326 = "http://www.simantics.org/DistrictNetwork-1.0/EPSG_4326"; - public static final String Edge = "http://www.simantics.org/DistrictNetwork-1.0/Edge"; - public static final String EdgeDefaultMapping = "http://www.simantics.org/DistrictNetwork-1.0/EdgeDefaultMapping"; - public static final String EdgeDefaultMapping_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/EdgeDefaultMapping/Inverse"; - public static final String EdgeMappingParameterType = "http://www.simantics.org/DistrictNetwork-1.0/EdgeMappingParameterType"; - public static final String Edge_HasDiameter = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasDiameter"; - public static final String Edge_HasDiameter_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasDiameter/Inverse"; - public static final String Edge_HasElevation = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasElevation"; - public static final String Edge_HasElevation_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasElevation/Inverse"; - public static final String Edge_HasFlowArea = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasFlowArea"; - public static final String Edge_HasFlowArea_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasFlowArea/Inverse"; - public static final String Edge_HasGeometry = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasGeometry"; - public static final String Edge_HasGeometry_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasGeometry/Inverse"; - public static final String Edge_HasKReturn = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasKReturn"; - public static final String Edge_HasKReturn_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasKReturn/Inverse"; - public static final String Edge_HasKSupply = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasKSupply"; - public static final String Edge_HasKSupply_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasKSupply/Inverse"; - public static final String Edge_HasLength = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasLength"; - public static final String Edge_HasLength_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasLength/Inverse"; - public static final String Edge_HasNominalMassFlow = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasNominalMassFlow"; - public static final String Edge_HasNominalMassFlow_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasNominalMassFlow/Inverse"; - public static final String Edge_HasOuterDiameter = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasOuterDiameter"; - public static final String Edge_HasOuterDiameter_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasOuterDiameter/Inverse"; - public static final String Edge_HasTGround = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasTGround"; - public static final String Edge_HasTGround_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasTGround/Inverse"; - public static final String Edge_HasType = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasType"; - public static final String Edge_HasType_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Edge/HasType/Inverse"; - public static final String Element = "http://www.simantics.org/DistrictNetwork-1.0/Element"; - public static final String ElevationRectangleStyle = "http://www.simantics.org/DistrictNetwork-1.0/ElevationRectangleStyle"; - public static final String Functions = "http://www.simantics.org/DistrictNetwork-1.0/Functions"; - public static final String Functions_compositeInstantiator = "http://www.simantics.org/DistrictNetwork-1.0/Functions/compositeInstantiator"; - public static final String Functions_constantOne = "http://www.simantics.org/DistrictNetwork-1.0/Functions/constantOne"; - public static final String Functions_convertToValue = "http://www.simantics.org/DistrictNetwork-1.0/Functions/convertToValue"; - public static final String Functions_defaultEdgeMappingModifier = "http://www.simantics.org/DistrictNetwork-1.0/Functions/defaultEdgeMappingModifier"; - public static final String Functions_defaultVertexMappingModifier = "http://www.simantics.org/DistrictNetwork-1.0/Functions/defaultVertexMappingModifier"; - public static final String Functions_enumerationValues = "http://www.simantics.org/DistrictNetwork-1.0/Functions/enumerationValues"; - public static final String Functions_hasNominalMassFlowValue = "http://www.simantics.org/DistrictNetwork-1.0/Functions/hasNominalMassFlowValue"; - public static final String Functions_mappingModifier = "http://www.simantics.org/DistrictNetwork-1.0/Functions/mappingModifier"; - public static final String Groups = "http://www.simantics.org/DistrictNetwork-1.0/Groups"; - public static final String Groups_EdgeGroup = "http://www.simantics.org/DistrictNetwork-1.0/Groups/EdgeGroup"; - public static final String Groups_ElementGroup = "http://www.simantics.org/DistrictNetwork-1.0/Groups/ElementGroup"; - public static final String Groups_VertexGroup = "http://www.simantics.org/DistrictNetwork-1.0/Groups/VertexGroup"; - public static final String HasEndVertex = "http://www.simantics.org/DistrictNetwork-1.0/HasEndVertex"; - public static final String HasEndVertex_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasEndVertex_Inverse"; - public static final String HasId = "http://www.simantics.org/DistrictNetwork-1.0/HasId"; - public static final String HasId_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasId/Inverse"; - public static final String HasInLayerTag = "http://www.simantics.org/DistrictNetwork-1.0/HasInLayerTag"; - public static final String HasInLayerTag_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasInLayerTag/Inverse"; - public static final String HasMapping = "http://www.simantics.org/DistrictNetwork-1.0/HasMapping"; - public static final String HasMapping_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasMapping/Inverse"; - public static final String HasRegion = "http://www.simantics.org/DistrictNetwork-1.0/HasRegion"; - public static final String HasRegion_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasRegion/Inverse"; - public static final String HasSRID = "http://www.simantics.org/DistrictNetwork-1.0/HasSRID"; - public static final String HasSRID_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasSRID/Inverse"; - public static final String HasSRTEXT = "http://www.simantics.org/DistrictNetwork-1.0/HasSRTEXT"; - public static final String HasSRTEXT_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasSRTEXT/Inverse"; - public static final String HasSpatialRefSystem = "http://www.simantics.org/DistrictNetwork-1.0/HasSpatialRefSystem"; - public static final String HasSpatialRefSystem_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasSpatialRefSystem/Inverse"; - public static final String HasStartVertex = "http://www.simantics.org/DistrictNetwork-1.0/HasStartVertex"; - public static final String HasStartVertex_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasStartVertex_Inverse"; - public static final String HasSymbolFunction = "http://www.simantics.org/DistrictNetwork-1.0/HasSymbolFunction"; - public static final String HasSymbolFunction_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/HasSymbolFunction/Inverse"; - public static final String Images = "http://www.simantics.org/DistrictNetwork-1.0/Images"; - public static final String Images_MapImage = "http://www.simantics.org/DistrictNetwork-1.0/Images/MapImage"; - public static final String InLayer = "http://www.simantics.org/DistrictNetwork-1.0/InLayer"; - public static final String Layer = "http://www.simantics.org/DistrictNetwork-1.0/Layer"; - public static final String LeftClickDefaultMapping = "http://www.simantics.org/DistrictNetwork-1.0/LeftClickDefaultMapping"; - public static final String LeftClickDefaultMapping_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/LeftClickDefaultMapping/Inverse"; - public static final String MappedComponent = "http://www.simantics.org/DistrictNetwork-1.0/MappedComponent"; - public static final String MappedFromElement = "http://www.simantics.org/DistrictNetwork-1.0/MappedFromElement"; - public static final String Mapping = "http://www.simantics.org/DistrictNetwork-1.0/Mapping"; - public static final String MappingParameterType = "http://www.simantics.org/DistrictNetwork-1.0/MappingParameterType"; - public static final String Mapping_Base = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/Base"; - public static final String Mapping_ComponentType = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/ComponentType"; - public static final String Mapping_ComponentType_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/ComponentType/Inverse"; - public static final String Mapping_EdgeMapping = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping"; - public static final String Mapping_EdgeMapping_DiameterAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/DiameterAttribute"; - public static final String Mapping_EdgeMapping_DiameterAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/DiameterAttribute/Inverse"; - public static final String Mapping_EdgeMapping_ElevationAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/ElevationAttribute"; - public static final String Mapping_EdgeMapping_ElevationAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/ElevationAttribute/Inverse"; - public static final String Mapping_EdgeMapping_FlowAreaAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/FlowAreaAttribute"; - public static final String Mapping_EdgeMapping_FlowAreaAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/FlowAreaAttribute/Inverse"; - public static final String Mapping_EdgeMapping_KReturnAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/KReturnAttribute"; - public static final String Mapping_EdgeMapping_KReturnAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/KReturnAttribute/Inverse"; - public static final String Mapping_EdgeMapping_KSupplyAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/KSupplyAttribute"; - public static final String Mapping_EdgeMapping_KSupplyAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/KSupplyAttribute/Inverse"; - public static final String Mapping_EdgeMapping_LengthAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/LengthAttribute"; - public static final String Mapping_EdgeMapping_LengthAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/LengthAttribute/Inverse"; - public static final String Mapping_EdgeMapping_NominalMassFlowAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/NominalMassFlowAttribute"; - public static final String Mapping_EdgeMapping_NominalMassFlowAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/NominalMassFlowAttribute/Inverse"; - public static final String Mapping_EdgeMapping_OuterDiameterAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/OuterDiameterAttribute"; - public static final String Mapping_EdgeMapping_OuterDiameterAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/OuterDiameterAttribute/Inverse"; - public static final String Mapping_EdgeMapping_PipeTypeAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/PipeTypeAttribute"; - public static final String Mapping_EdgeMapping_PipeTypeAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/PipeTypeAttribute/Inverse"; - public static final String Mapping_EdgeMapping_TGroundAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/TGroundAttribute"; - public static final String Mapping_EdgeMapping_TGroundAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/EdgeMapping/TGroundAttribute/Inverse"; - public static final String Mapping_Id = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/Id"; - public static final String Mapping_Id_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/Id/Inverse"; - public static final String Mapping_InputTerminal = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/InputTerminal"; - public static final String Mapping_InputTerminal_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/InputTerminal/Inverse"; - public static final String Mapping_OutputTerminal = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/OutputTerminal"; - public static final String Mapping_OutputTerminal_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/OutputTerminal/Inverse"; - public static final String Mapping_Region = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/Region"; - public static final String Mapping_Region_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/Region/Inverse"; - public static final String Mapping_Terminal = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/Terminal"; - public static final String Mapping_TerminalPair = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/TerminalPair"; - public static final String Mapping_Terminals = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/Terminals"; - public static final String Mapping_Terminals_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/Terminals/Inverse"; - public static final String Mapping_VertexMapping = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping"; - public static final String Mapping_VertexMapping_AddressAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/AddressAttribute"; - public static final String Mapping_VertexMapping_AddressAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/AddressAttribute/Inverse"; - public static final String Mapping_VertexMapping_DeltaPressureAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/DeltaPressureAttribute"; - public static final String Mapping_VertexMapping_DeltaPressureAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/DeltaPressureAttribute/Inverse"; - public static final String Mapping_VertexMapping_DeltaTemperatureAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/DeltaTemperatureAttribute"; - public static final String Mapping_VertexMapping_DeltaTemperatureAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/DeltaTemperatureAttribute/Inverse"; - public static final String Mapping_VertexMapping_ElevationAltAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ElevationAltAttribute"; - public static final String Mapping_VertexMapping_ElevationAltAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ElevationAltAttribute/Inverse"; - public static final String Mapping_VertexMapping_ElevationAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ElevationAttribute"; - public static final String Mapping_VertexMapping_ElevationAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ElevationAttribute/Inverse"; - public static final String Mapping_VertexMapping_FlowAreaAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/FlowAreaAttribute"; - public static final String Mapping_VertexMapping_FlowAreaAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/FlowAreaAttribute/Inverse"; - public static final String Mapping_VertexMapping_FrequencyConverterControlledAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/FrequencyConverterControlledAttribute"; - public static final String Mapping_VertexMapping_FrequencyConverterControlledAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/FrequencyConverterControlledAttribute/Inverse"; - public static final String Mapping_VertexMapping_HeadPumpMaximumAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/HeadPumpMaximumAttribute"; - public static final String Mapping_VertexMapping_HeadPumpMaximumAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/HeadPumpMaximumAttribute/Inverse"; - public static final String Mapping_VertexMapping_HeadPumpNominalAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/HeadPumpNominalAttribute"; - public static final String Mapping_VertexMapping_HeadPumpNominalAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/HeadPumpNominalAttribute/Inverse"; - public static final String Mapping_VertexMapping_HeatLoadDsAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/HeatLoadDsAttribute"; - public static final String Mapping_VertexMapping_HeatLoadDsAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/HeatLoadDsAttribute/Inverse"; - public static final String Mapping_VertexMapping_HeatPowerAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/HeatPowerAttribute"; - public static final String Mapping_VertexMapping_HeatPowerAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/HeatPowerAttribute/Inverse"; - public static final String Mapping_VertexMapping_InternalValveMeasurementAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/InternalValveMeasurementAttribute"; - public static final String Mapping_VertexMapping_InternalValveMeasurementAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/InternalValveMeasurementAttribute/Inverse"; - public static final String Mapping_VertexMapping_MassFlowAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/MassFlowAttribute"; - public static final String Mapping_VertexMapping_MassFlowAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/MassFlowAttribute/Inverse"; - public static final String Mapping_VertexMapping_MaximumHeadMAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/MaximumHeadMAttribute"; - public static final String Mapping_VertexMapping_MaximumHeadMAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/MaximumHeadMAttribute/Inverse"; - public static final String Mapping_VertexMapping_NominalFlowAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalFlowAttribute"; - public static final String Mapping_VertexMapping_NominalFlowAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalFlowAttribute/Inverse"; - public static final String Mapping_VertexMapping_NominalHeadBAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalHeadBAttribute"; - public static final String Mapping_VertexMapping_NominalHeadBAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalHeadBAttribute/Inverse"; - public static final String Mapping_VertexMapping_NominalHeadMAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalHeadMAttribute"; - public static final String Mapping_VertexMapping_NominalHeadMAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalHeadMAttribute/Inverse"; - public static final String Mapping_VertexMapping_NominalMassFlowAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalMassFlowAttribute"; - public static final String Mapping_VertexMapping_NominalMassFlowAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalMassFlowAttribute/Inverse"; - public static final String Mapping_VertexMapping_NominalPressureLossAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalPressureLossAttribute"; - public static final String Mapping_VertexMapping_NominalPressureLossAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/NominalPressureLossAttribute/Inverse"; - public static final String Mapping_VertexMapping_OpeningTimeAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/OpeningTimeAttribute"; - public static final String Mapping_VertexMapping_OpeningTimeAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/OpeningTimeAttribute/Inverse"; - public static final String Mapping_VertexMapping_PeakPowerAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PeakPowerAttribute"; - public static final String Mapping_VertexMapping_PeakPowerAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PeakPowerAttribute/Inverse"; - public static final String Mapping_VertexMapping_PumpInReturnLineAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpInReturnLineAttribute"; - public static final String Mapping_VertexMapping_PumpInReturnLineAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpInReturnLineAttribute/Inverse"; - public static final String Mapping_VertexMapping_PumpMassFlowNominalAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpMassFlowNominalAttribute"; - public static final String Mapping_VertexMapping_PumpMassFlowNominalAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpMassFlowNominalAttribute/Inverse"; - public static final String Mapping_VertexMapping_PumpMeMaxAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpMeMaxAttribute"; - public static final String Mapping_VertexMapping_PumpMeMaxAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpMeMaxAttribute/Inverse"; - public static final String Mapping_VertexMapping_PumpMeMinAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpMeMinAttribute"; - public static final String Mapping_VertexMapping_PumpMeMinAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpMeMinAttribute/Inverse"; - public static final String Mapping_VertexMapping_PumpSpeedMaxAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpSpeedMaxAttribute"; - public static final String Mapping_VertexMapping_PumpSpeedMaxAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpSpeedMaxAttribute/Inverse"; - public static final String Mapping_VertexMapping_PumpSpeedMinAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpSpeedMinAttribute"; - public static final String Mapping_VertexMapping_PumpSpeedMinAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/PumpSpeedMinAttribute/Inverse"; - public static final String Mapping_VertexMapping_ReturnPressureAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ReturnPressureAttribute"; - public static final String Mapping_VertexMapping_ReturnPressureAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ReturnPressureAttribute/Inverse"; - public static final String Mapping_VertexMapping_ReturnTemperatureAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ReturnTemperatureAttribute"; - public static final String Mapping_VertexMapping_ReturnTemperatureAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ReturnTemperatureAttribute/Inverse"; - public static final String Mapping_VertexMapping_SupplyPressureAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/SupplyPressureAttribute"; - public static final String Mapping_VertexMapping_SupplyPressureAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/SupplyPressureAttribute/Inverse"; - public static final String Mapping_VertexMapping_SupplyTemperatureAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/SupplyTemperatureAttribute"; - public static final String Mapping_VertexMapping_SupplyTemperatureAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/SupplyTemperatureAttribute/Inverse"; - public static final String Mapping_VertexMapping_ValveMeMaxAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveMeMaxAttribute"; - public static final String Mapping_VertexMapping_ValveMeMaxAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveMeMaxAttribute/Inverse"; - public static final String Mapping_VertexMapping_ValveMeMinAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveMeMinAttribute"; - public static final String Mapping_VertexMapping_ValveMeMinAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveMeMinAttribute/Inverse"; - public static final String Mapping_VertexMapping_ValveMinPositionAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveMinPositionAttribute"; - public static final String Mapping_VertexMapping_ValveMinPositionAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveMinPositionAttribute/Inverse"; - public static final String Mapping_VertexMapping_ValveOutletModeAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveOutletModeAttribute"; - public static final String Mapping_VertexMapping_ValveOutletModeAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveOutletModeAttribute/Inverse"; - public static final String Mapping_VertexMapping_ValvePositionAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValvePositionAttribute"; - public static final String Mapping_VertexMapping_ValvePositionAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValvePositionAttribute/Inverse"; - public static final String Mapping_VertexMapping_ValvePressLossNominalAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValvePressLossNominalAttribute"; - public static final String Mapping_VertexMapping_ValvePressLossNominalAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValvePressLossNominalAttribute/Inverse"; - public static final String Mapping_VertexMapping_ValveReturnLineAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveReturnLineAttribute"; - public static final String Mapping_VertexMapping_ValveReturnLineAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/ValveReturnLineAttribute/Inverse"; - public static final String Mapping_VertexMapping_VelocityAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/VelocityAttribute"; - public static final String Mapping_VertexMapping_VelocityAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/VelocityAttribute/Inverse"; - public static final String Mapping_VertexMapping_VolFlowAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/VolFlowAttribute"; - public static final String Mapping_VertexMapping_VolFlowAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/VolFlowAttribute/Inverse"; - public static final String Mapping_VertexMapping_XAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/XAttribute"; - public static final String Mapping_VertexMapping_XAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/XAttribute/Inverse"; - public static final String Mapping_VertexMapping_YAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/YAttribute"; - public static final String Mapping_VertexMapping_YAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/YAttribute/Inverse"; - public static final String Mapping_VertexMapping_dpAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/dpAttribute"; - public static final String Mapping_VertexMapping_dpAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/dpAttribute/Inverse"; - public static final String Mapping_VertexMapping_dtAttribute = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/dtAttribute"; - public static final String Mapping_VertexMapping_dtAttribute_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Mapping/VertexMapping/dtAttribute/Inverse"; - public static final String ReturnConnectionType = "http://www.simantics.org/DistrictNetwork-1.0/ReturnConnectionType"; - public static final String ReturnInConnectionType = "http://www.simantics.org/DistrictNetwork-1.0/ReturnInConnectionType"; - public static final String ReturnOutConnectionType = "http://www.simantics.org/DistrictNetwork-1.0/ReturnOutConnectionType"; - public static final String RightClickDefaultMapping = "http://www.simantics.org/DistrictNetwork-1.0/RightClickDefaultMapping"; - public static final String RightClickDefaultMapping_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/RightClickDefaultMapping/Inverse"; - public static final String SCLMain = "http://www.simantics.org/DistrictNetwork-1.0/SCLMain"; - public static final String SpatialRefSystem = "http://www.simantics.org/DistrictNetwork-1.0/SpatialRefSystem"; - public static final String SupplyConnectionType = "http://www.simantics.org/DistrictNetwork-1.0/SupplyConnectionType"; - public static final String SupplyInConnectionType = "http://www.simantics.org/DistrictNetwork-1.0/SupplyInConnectionType"; - public static final String SupplyOutConnectionType = "http://www.simantics.org/DistrictNetwork-1.0/SupplyOutConnectionType"; - public static final String TechType = "http://www.simantics.org/DistrictNetwork-1.0/TechType"; - public static final String TechType_Functions = "http://www.simantics.org/DistrictNetwork-1.0/TechType/Functions"; - public static final String TechType_Functions_techTypeCodeValueAccessor = "http://www.simantics.org/DistrictNetwork-1.0/TechType/Functions/techTypeCodeValueAccessor"; - public static final String TechType_TechTypeCodeParameterType = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeCodeParameterType"; - public static final String TechType_TechTypeTable = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeTable"; - public static final String TechType_TechTypeTable_HasComponentType = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeTable/HasComponentType"; - public static final String TechType_TechTypeTable_HasData = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeTable/HasData"; - public static final String TechType_TechTypeTable_HasData_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/TechType/TechTypeTable/HasData/Inverse"; - public static final String Vertex = "http://www.simantics.org/DistrictNetwork-1.0/Vertex"; - public static final String VertexDefaultMapping = "http://www.simantics.org/DistrictNetwork-1.0/VertexDefaultMapping"; - public static final String VertexDefaultMapping_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/VertexDefaultMapping/Inverse"; - public static final String VertexMappingParameterType = "http://www.simantics.org/DistrictNetwork-1.0/VertexMappingParameterType"; - public static final String VertexSymbolStyle = "http://www.simantics.org/DistrictNetwork-1.0/VertexSymbolStyle"; - public static final String Vertex_HasAddress = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasAddress"; - public static final String Vertex_HasAddress_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasAddress/Inverse"; - public static final String Vertex_HasAltElevation = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasAltElevation"; - public static final String Vertex_HasAltElevation_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasAltElevation/Inverse"; - public static final String Vertex_HasDeltaPressure = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasDeltaPressure"; - public static final String Vertex_HasDeltaPressure_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasDeltaPressure/Inverse"; - public static final String Vertex_HasDeltaTemperature = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasDeltaTemperature"; - public static final String Vertex_HasDeltaTemperature_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasDeltaTemperature/Inverse"; - public static final String Vertex_HasElevation = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasElevation"; - public static final String Vertex_HasElevation_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasElevation/Inverse"; - public static final String Vertex_HasFlowArea = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasFlowArea"; - public static final String Vertex_HasFlowArea_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasFlowArea/Inverse"; - public static final String Vertex_HasFrequencyConverterControlled = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasFrequencyConverterControlled"; - public static final String Vertex_HasFrequencyConverterControlled_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasFrequencyConverterControlled/Inverse"; - public static final String Vertex_HasHeadPumpMaximum = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasHeadPumpMaximum"; - public static final String Vertex_HasHeadPumpMaximum_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasHeadPumpMaximum/Inverse"; - public static final String Vertex_HasHeadPumpNominal = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasHeadPumpNominal"; - public static final String Vertex_HasHeadPumpNominal_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasHeadPumpNominal/Inverse"; - public static final String Vertex_HasHeatLoadDs = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasHeatLoadDs"; - public static final String Vertex_HasHeatLoadDs_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasHeatLoadDs/Inverse"; - public static final String Vertex_HasHeatPower = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasHeatPower"; - public static final String Vertex_HasHeatPower_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasHeatPower/Inverse"; - public static final String Vertex_HasInternalValveMeasurement = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasInternalValveMeasurement"; - public static final String Vertex_HasInternalValveMeasurement_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasInternalValveMeasurement/Inverse"; - public static final String Vertex_HasMassFlow = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasMassFlow"; - public static final String Vertex_HasMassFlow_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasMassFlow/Inverse"; - public static final String Vertex_HasMaximumHeadM = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasMaximumHeadM"; - public static final String Vertex_HasMaximumHeadM_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasMaximumHeadM/Inverse"; - public static final String Vertex_HasNominalFlow = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasNominalFlow"; - public static final String Vertex_HasNominalFlow_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasNominalFlow/Inverse"; - public static final String Vertex_HasNominalHeadB = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasNominalHeadB"; - public static final String Vertex_HasNominalHeadB_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasNominalHeadB/Inverse"; - public static final String Vertex_HasNominalHeadM = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasNominalHeadM"; - public static final String Vertex_HasNominalHeadM_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasNominalHeadM/Inverse"; - public static final String Vertex_HasNominalPressureLoss = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasNominalPressureLoss"; - public static final String Vertex_HasNominalPressureLoss_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasNominalPressureLoss/Inverse"; - public static final String Vertex_HasOpeningTime = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasOpeningTime"; - public static final String Vertex_HasOpeningTime_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasOpeningTime/Inverse"; - public static final String Vertex_HasPeakPower = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPeakPower"; - public static final String Vertex_HasPeakPower_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPeakPower/Inverse"; - public static final String Vertex_HasPumpInReturnLine = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpInReturnLine"; - public static final String Vertex_HasPumpInReturnLine_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpInReturnLine/Inverse"; - public static final String Vertex_HasPumpMassFlowNominal = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpMassFlowNominal"; - public static final String Vertex_HasPumpMassFlowNominal_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpMassFlowNominal/Inverse"; - public static final String Vertex_HasPumpMeMax = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpMeMax"; - public static final String Vertex_HasPumpMeMax_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpMeMax/Inverse"; - public static final String Vertex_HasPumpMeMin = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpMeMin"; - public static final String Vertex_HasPumpMeMin_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpMeMin/Inverse"; - public static final String Vertex_HasPumpSpeedMax = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpSpeedMax"; - public static final String Vertex_HasPumpSpeedMax_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpSpeedMax/Inverse"; - public static final String Vertex_HasPumpSpeedMin = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpSpeedMin"; - public static final String Vertex_HasPumpSpeedMin_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasPumpSpeedMin/Inverse"; - public static final String Vertex_HasReturnPressure = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasReturnPressure"; - public static final String Vertex_HasReturnPressure_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasReturnPressure/Inverse"; - public static final String Vertex_HasReturnTemperature = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasReturnTemperature"; - public static final String Vertex_HasReturnTemperature_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasReturnTemperature/Inverse"; - public static final String Vertex_HasSupplyPressure = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasSupplyPressure"; - public static final String Vertex_HasSupplyPressure_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasSupplyPressure/Inverse"; - public static final String Vertex_HasSupplyTemperature = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasSupplyTemperature"; - public static final String Vertex_HasSupplyTemperature_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasSupplyTemperature/Inverse"; - public static final String Vertex_HasValveMeMax = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveMeMax"; - public static final String Vertex_HasValveMeMax_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveMeMax/Inverse"; - public static final String Vertex_HasValveMeMin = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveMeMin"; - public static final String Vertex_HasValveMeMin_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveMeMin/Inverse"; - public static final String Vertex_HasValveMinPosition = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveMinPosition"; - public static final String Vertex_HasValveMinPosition_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveMinPosition/Inverse"; - public static final String Vertex_HasValveOutletMode = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveOutletMode"; - public static final String Vertex_HasValveOutletMode_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveOutletMode/Inverse"; - public static final String Vertex_HasValvePosition = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValvePosition"; - public static final String Vertex_HasValvePosition_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValvePosition/Inverse"; - public static final String Vertex_HasValvePressLossNominal = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValvePressLossNominal"; - public static final String Vertex_HasValvePressLossNominal_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValvePressLossNominal/Inverse"; - public static final String Vertex_HasValveReturnLine = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveReturnLine"; - public static final String Vertex_HasValveReturnLine_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasValveReturnLine/Inverse"; - public static final String Vertex_HasVelocity = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasVelocity"; - public static final String Vertex_HasVelocity_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasVelocity/Inverse"; - public static final String Vertex_HasVolFlow = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasVolFlow"; - public static final String Vertex_HasVolFlow_Inverse = "http://www.simantics.org/DistrictNetwork-1.0/Vertex/HasVolFlow/Inverse"; - public static final String VisualisationsFolder = "http://www.simantics.org/DistrictNetwork-1.0/VisualisationsFolder"; - } - - public static Resource getResourceOrNull(ReadGraph graph, String uri) { - try { - return graph.getResource(uri); - } catch(DatabaseException e) { - System.err.println(e.getMessage()); - return null; - } - } - - public DistrictNetworkResource(ReadGraph graph) { - ActionContext = getResourceOrNull(graph, URIs.ActionContext); - ActionContext_newDiagramContribution = getResourceOrNull(graph, URIs.ActionContext_newDiagramContribution); - Actions = getResourceOrNull(graph, URIs.Actions); - AddLayerToDNDiagramTemplate = getResourceOrNull(graph, URIs.AddLayerToDNDiagramTemplate); - BrowseContext = getResourceOrNull(graph, URIs.BrowseContext); - Composite = getResourceOrNull(graph, URIs.Composite); - Connection = getResourceOrNull(graph, URIs.Connection); - ConnectionLineStyle = getResourceOrNull(graph, URIs.ConnectionLineStyle); - Diagram = getResourceOrNull(graph, URIs.Diagram); - Diagram_DefaultPipeTechTypeId = getResourceOrNull(graph, URIs.Diagram_DefaultPipeTechTypeId); - Diagram_DefaultPipeTechTypeId_Inverse = getResourceOrNull(graph, URIs.Diagram_DefaultPipeTechTypeId_Inverse); - Diagram_MappedDiagram = getResourceOrNull(graph, URIs.Diagram_MappedDiagram); - Diagram_MappedFromDiagram = getResourceOrNull(graph, URIs.Diagram_MappedFromDiagram); - Diagram_Visualisations = getResourceOrNull(graph, URIs.Diagram_Visualisations); - Diagram_Visualisations_ArrowContribution = getResourceOrNull(graph, URIs.Diagram_Visualisations_ArrowContribution); - Diagram_Visualisations_ColorBarLocation = getResourceOrNull(graph, URIs.Diagram_Visualisations_ColorBarLocation); - Diagram_Visualisations_ColorBarLocation_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_ColorBarLocation_Inverse); - Diagram_Visualisations_ColorBarSize = getResourceOrNull(graph, URIs.Diagram_Visualisations_ColorBarSize); - Diagram_Visualisations_ColorBarSize_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_ColorBarSize_Inverse); - Diagram_Visualisations_ColorContribution = getResourceOrNull(graph, URIs.Diagram_Visualisations_ColorContribution); - Diagram_Visualisations_DisabledUpdates = getResourceOrNull(graph, URIs.Diagram_Visualisations_DisabledUpdates); - Diagram_Visualisations_DisabledUpdates_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_DisabledUpdates_Inverse); - Diagram_Visualisations_DynamicSymbolsProducers = getResourceOrNull(graph, URIs.Diagram_Visualisations_DynamicSymbolsProducers); - Diagram_Visualisations_DynamicSymbolsProducers_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_DynamicSymbolsProducers_Inverse); - Diagram_Visualisations_DynamicSymbolsPumpingStations = getResourceOrNull(graph, URIs.Diagram_Visualisations_DynamicSymbolsPumpingStations); - Diagram_Visualisations_DynamicSymbolsPumpingStations_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_DynamicSymbolsPumpingStations_Inverse); - Diagram_Visualisations_DynamicSymbolsShutoffValves = getResourceOrNull(graph, URIs.Diagram_Visualisations_DynamicSymbolsShutoffValves); - Diagram_Visualisations_DynamicSymbolsShutoffValves_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_DynamicSymbolsShutoffValves_Inverse); - Diagram_Visualisations_DynamicSymbolsValves = getResourceOrNull(graph, URIs.Diagram_Visualisations_DynamicSymbolsValves); - Diagram_Visualisations_DynamicSymbolsValves_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_DynamicSymbolsValves_Inverse); - Diagram_Visualisations_HideConsumers = getResourceOrNull(graph, URIs.Diagram_Visualisations_HideConsumers); - Diagram_Visualisations_HideConsumers_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_HideConsumers_Inverse); - Diagram_Visualisations_HideEdges = getResourceOrNull(graph, URIs.Diagram_Visualisations_HideEdges); - Diagram_Visualisations_HideEdges_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_HideEdges_Inverse); - Diagram_Visualisations_HidePoints = getResourceOrNull(graph, URIs.Diagram_Visualisations_HidePoints); - Diagram_Visualisations_HidePoints_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_HidePoints_Inverse); - Diagram_Visualisations_HideProducers = getResourceOrNull(graph, URIs.Diagram_Visualisations_HideProducers); - Diagram_Visualisations_HideProducers_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_HideProducers_Inverse); - Diagram_Visualisations_HidePumpingStations = getResourceOrNull(graph, URIs.Diagram_Visualisations_HidePumpingStations); - Diagram_Visualisations_HidePumpingStations_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_HidePumpingStations_Inverse); - Diagram_Visualisations_HideValves = getResourceOrNull(graph, URIs.Diagram_Visualisations_HideValves); - Diagram_Visualisations_HideValves_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_HideValves_Inverse); - Diagram_Visualisations_Interval = getResourceOrNull(graph, URIs.Diagram_Visualisations_Interval); - Diagram_Visualisations_Interval_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_Interval_Inverse); - Diagram_Visualisations_KeyVariableEdgeHover = getResourceOrNull(graph, URIs.Diagram_Visualisations_KeyVariableEdgeHover); - Diagram_Visualisations_KeyVariableEdgeHover_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_KeyVariableEdgeHover_Inverse); - Diagram_Visualisations_KeyVariableVertexHover = getResourceOrNull(graph, URIs.Diagram_Visualisations_KeyVariableVertexHover); - Diagram_Visualisations_KeyVariableVertexHover_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_KeyVariableVertexHover_Inverse); - Diagram_Visualisations_ResetVisualisation = getResourceOrNull(graph, URIs.Diagram_Visualisations_ResetVisualisation); - Diagram_Visualisations_ResetVisualisation_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_ResetVisualisation_Inverse); - Diagram_Visualisations_ShowColorBarTicks = getResourceOrNull(graph, URIs.Diagram_Visualisations_ShowColorBarTicks); - Diagram_Visualisations_ShowColorBarTicks_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_ShowColorBarTicks_Inverse); - Diagram_Visualisations_ShowColorBars = getResourceOrNull(graph, URIs.Diagram_Visualisations_ShowColorBars); - Diagram_Visualisations_ShowColorBars_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_ShowColorBars_Inverse); - Diagram_Visualisations_ShowSizeBarTicks = getResourceOrNull(graph, URIs.Diagram_Visualisations_ShowSizeBarTicks); - Diagram_Visualisations_ShowSizeBarTicks_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_ShowSizeBarTicks_Inverse); - Diagram_Visualisations_ShowSizeBars = getResourceOrNull(graph, URIs.Diagram_Visualisations_ShowSizeBars); - Diagram_Visualisations_ShowSizeBars_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_ShowSizeBars_Inverse); - Diagram_Visualisations_SizeBarLocation = getResourceOrNull(graph, URIs.Diagram_Visualisations_SizeBarLocation); - Diagram_Visualisations_SizeBarLocation_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_SizeBarLocation_Inverse); - Diagram_Visualisations_SizeBarSize = getResourceOrNull(graph, URIs.Diagram_Visualisations_SizeBarSize); - Diagram_Visualisations_SizeBarSize_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_SizeBarSize_Inverse); - Diagram_Visualisations_SizeContribution = getResourceOrNull(graph, URIs.Diagram_Visualisations_SizeContribution); - Diagram_Visualisations_StaticPropertiesConsumers = getResourceOrNull(graph, URIs.Diagram_Visualisations_StaticPropertiesConsumers); - Diagram_Visualisations_StaticPropertiesConsumers_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_StaticPropertiesConsumers_Inverse); - Diagram_Visualisations_StaticPropertiesNetworkBranches = getResourceOrNull(graph, URIs.Diagram_Visualisations_StaticPropertiesNetworkBranches); - Diagram_Visualisations_StaticPropertiesNetworkBranches_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_StaticPropertiesNetworkBranches_Inverse); - Diagram_Visualisations_StaticPropertiesPoints = getResourceOrNull(graph, URIs.Diagram_Visualisations_StaticPropertiesPoints); - Diagram_Visualisations_StaticPropertiesPoints_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_StaticPropertiesPoints_Inverse); - Diagram_Visualisations_UseColorBarGradients = getResourceOrNull(graph, URIs.Diagram_Visualisations_UseColorBarGradients); - Diagram_Visualisations_UseColorBarGradients_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_UseColorBarGradients_Inverse); - Diagram_Visualisations_UseSizeBarGradients = getResourceOrNull(graph, URIs.Diagram_Visualisations_UseSizeBarGradients); - Diagram_Visualisations_UseSizeBarGradients_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_UseSizeBarGradients_Inverse); - Diagram_Visualisations_arrowContributionContributorName = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionContributorName); - Diagram_Visualisations_arrowContributionContributorName_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionContributorName_Inverse); - Diagram_Visualisations_arrowContributionLabel = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionLabel); - Diagram_Visualisations_arrowContributionLabel_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionLabel_Inverse); - Diagram_Visualisations_arrowContributionModuleAttribute = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionModuleAttribute); - Diagram_Visualisations_arrowContributionModuleAttribute_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionModuleAttribute_Inverse); - Diagram_Visualisations_arrowContributionModuleName = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionModuleName); - Diagram_Visualisations_arrowContributionModuleName_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionModuleName_Inverse); - Diagram_Visualisations_arrowContributionUseDefault = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionUseDefault); - Diagram_Visualisations_arrowContributionUseDefault_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionUseDefault_Inverse); - Diagram_Visualisations_arrowContributionUsed = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionUsed); - Diagram_Visualisations_arrowContributionUsed_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionUsed_Inverse); - Diagram_Visualisations_arrowContributionVariableBias = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionVariableBias); - Diagram_Visualisations_arrowContributionVariableBias_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionVariableBias_Inverse); - Diagram_Visualisations_arrowContributionVariableGain = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionVariableGain); - Diagram_Visualisations_arrowContributionVariableGain_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributionVariableGain_Inverse); - Diagram_Visualisations_arrowContributions = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributions); - Diagram_Visualisations_arrowContributions_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_arrowContributions_Inverse); - Diagram_Visualisations_colorContributionContributorName = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionContributorName); - Diagram_Visualisations_colorContributionContributorName_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionContributorName_Inverse); - Diagram_Visualisations_colorContributionDefaultColorMap = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionDefaultColorMap); - Diagram_Visualisations_colorContributionDefaultColorMap_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionDefaultColorMap_Inverse); - Diagram_Visualisations_colorContributionDefaultMax = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionDefaultMax); - Diagram_Visualisations_colorContributionDefaultMax_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionDefaultMax_Inverse); - Diagram_Visualisations_colorContributionDefaultMin = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionDefaultMin); - Diagram_Visualisations_colorContributionDefaultMin_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionDefaultMin_Inverse); - Diagram_Visualisations_colorContributionLabel = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionLabel); - Diagram_Visualisations_colorContributionLabel_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionLabel_Inverse); - Diagram_Visualisations_colorContributionModuleAttribute = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionModuleAttribute); - Diagram_Visualisations_colorContributionModuleAttribute_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionModuleAttribute_Inverse); - Diagram_Visualisations_colorContributionModuleName = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionModuleName); - Diagram_Visualisations_colorContributionModuleName_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionModuleName_Inverse); - Diagram_Visualisations_colorContributionUnit = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionUnit); - Diagram_Visualisations_colorContributionUnit_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionUnit_Inverse); - Diagram_Visualisations_colorContributionUseDefault = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionUseDefault); - Diagram_Visualisations_colorContributionUseDefault_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionUseDefault_Inverse); - Diagram_Visualisations_colorContributionUsed = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionUsed); - Diagram_Visualisations_colorContributionUsed_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionUsed_Inverse); - Diagram_Visualisations_colorContributionVariableBias = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionVariableBias); - Diagram_Visualisations_colorContributionVariableBias_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionVariableBias_Inverse); - Diagram_Visualisations_colorContributionVariableGain = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionVariableGain); - Diagram_Visualisations_colorContributionVariableGain_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributionVariableGain_Inverse); - Diagram_Visualisations_colorContributions = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributions); - Diagram_Visualisations_colorContributions_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_colorContributions_Inverse); - Diagram_Visualisations_sizeContributionContributorName = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionContributorName); - Diagram_Visualisations_sizeContributionContributorName_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionContributorName_Inverse); - Diagram_Visualisations_sizeContributionDefaultMax = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionDefaultMax); - Diagram_Visualisations_sizeContributionDefaultMax_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionDefaultMax_Inverse); - Diagram_Visualisations_sizeContributionDefaultMin = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionDefaultMin); - Diagram_Visualisations_sizeContributionDefaultMin_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionDefaultMin_Inverse); - Diagram_Visualisations_sizeContributionDefaultSizeMap = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionDefaultSizeMap); - Diagram_Visualisations_sizeContributionDefaultSizeMap_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionDefaultSizeMap_Inverse); - Diagram_Visualisations_sizeContributionLabel = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionLabel); - Diagram_Visualisations_sizeContributionLabel_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionLabel_Inverse); - Diagram_Visualisations_sizeContributionModuleAttribute = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionModuleAttribute); - Diagram_Visualisations_sizeContributionModuleAttribute_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionModuleAttribute_Inverse); - Diagram_Visualisations_sizeContributionModuleName = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionModuleName); - Diagram_Visualisations_sizeContributionModuleName_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionModuleName_Inverse); - Diagram_Visualisations_sizeContributionUnit = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionUnit); - Diagram_Visualisations_sizeContributionUnit_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionUnit_Inverse); - Diagram_Visualisations_sizeContributionUseDefault = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionUseDefault); - Diagram_Visualisations_sizeContributionUseDefault_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionUseDefault_Inverse); - Diagram_Visualisations_sizeContributionUsed = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionUsed); - Diagram_Visualisations_sizeContributionUsed_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionUsed_Inverse); - Diagram_Visualisations_sizeContributionVariableBias = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionVariableBias); - Diagram_Visualisations_sizeContributionVariableBias_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionVariableBias_Inverse); - Diagram_Visualisations_sizeContributionVariableGain = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionVariableGain); - Diagram_Visualisations_sizeContributionVariableGain_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributionVariableGain_Inverse); - Diagram_Visualisations_sizeContributions = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributions); - Diagram_Visualisations_sizeContributions_Inverse = getResourceOrNull(graph, URIs.Diagram_Visualisations_sizeContributions_Inverse); - Diagram_backgroundColor = getResourceOrNull(graph, URIs.Diagram_backgroundColor); - Diagram_backgroundColor_Inverse = getResourceOrNull(graph, URIs.Diagram_backgroundColor_Inverse); - Diagram_drawMapEnabled = getResourceOrNull(graph, URIs.Diagram_drawMapEnabled); - Diagram_drawMapEnabled_Inverse = getResourceOrNull(graph, URIs.Diagram_drawMapEnabled_Inverse); - Diagram_hasActiveVisualisation = getResourceOrNull(graph, URIs.Diagram_hasActiveVisualisation); - Diagram_hasActiveVisualisation_Inverse = getResourceOrNull(graph, URIs.Diagram_hasActiveVisualisation_Inverse); - Diagram_hasVisualisation = getResourceOrNull(graph, URIs.Diagram_hasVisualisation); - Diagram_hasVisualisation_Inverse = getResourceOrNull(graph, URIs.Diagram_hasVisualisation_Inverse); - Diagram_splitToMultipleEnabled = getResourceOrNull(graph, URIs.Diagram_splitToMultipleEnabled); - Diagram_splitToMultipleEnabled_Inverse = getResourceOrNull(graph, URIs.Diagram_splitToMultipleEnabled_Inverse); - Diagram_trackChangesEnabled = getResourceOrNull(graph, URIs.Diagram_trackChangesEnabled); - Diagram_trackChangesEnabled_Inverse = getResourceOrNull(graph, URIs.Diagram_trackChangesEnabled_Inverse); - DistrictNetworkStaticInfoStyle = getResourceOrNull(graph, URIs.DistrictNetworkStaticInfoStyle); - DistrictNodeGroup = getResourceOrNull(graph, URIs.DistrictNodeGroup); - DistrictNodeGroup_hasComponentTypeName = getResourceOrNull(graph, URIs.DistrictNodeGroup_hasComponentTypeName); - DistrictNodeGroup_hasComponentTypeName_Inverse = getResourceOrNull(graph, URIs.DistrictNodeGroup_hasComponentTypeName_Inverse); - EPSG_4326 = getResourceOrNull(graph, URIs.EPSG_4326); - Edge = getResourceOrNull(graph, URIs.Edge); - EdgeDefaultMapping = getResourceOrNull(graph, URIs.EdgeDefaultMapping); - EdgeDefaultMapping_Inverse = getResourceOrNull(graph, URIs.EdgeDefaultMapping_Inverse); - EdgeMappingParameterType = getResourceOrNull(graph, URIs.EdgeMappingParameterType); - Edge_HasDiameter = getResourceOrNull(graph, URIs.Edge_HasDiameter); - Edge_HasDiameter_Inverse = getResourceOrNull(graph, URIs.Edge_HasDiameter_Inverse); - Edge_HasElevation = getResourceOrNull(graph, URIs.Edge_HasElevation); - Edge_HasElevation_Inverse = getResourceOrNull(graph, URIs.Edge_HasElevation_Inverse); - Edge_HasFlowArea = getResourceOrNull(graph, URIs.Edge_HasFlowArea); - Edge_HasFlowArea_Inverse = getResourceOrNull(graph, URIs.Edge_HasFlowArea_Inverse); - Edge_HasGeometry = getResourceOrNull(graph, URIs.Edge_HasGeometry); - Edge_HasGeometry_Inverse = getResourceOrNull(graph, URIs.Edge_HasGeometry_Inverse); - Edge_HasKReturn = getResourceOrNull(graph, URIs.Edge_HasKReturn); - Edge_HasKReturn_Inverse = getResourceOrNull(graph, URIs.Edge_HasKReturn_Inverse); - Edge_HasKSupply = getResourceOrNull(graph, URIs.Edge_HasKSupply); - Edge_HasKSupply_Inverse = getResourceOrNull(graph, URIs.Edge_HasKSupply_Inverse); - Edge_HasLength = getResourceOrNull(graph, URIs.Edge_HasLength); - Edge_HasLength_Inverse = getResourceOrNull(graph, URIs.Edge_HasLength_Inverse); - Edge_HasNominalMassFlow = getResourceOrNull(graph, URIs.Edge_HasNominalMassFlow); - Edge_HasNominalMassFlow_Inverse = getResourceOrNull(graph, URIs.Edge_HasNominalMassFlow_Inverse); - Edge_HasOuterDiameter = getResourceOrNull(graph, URIs.Edge_HasOuterDiameter); - Edge_HasOuterDiameter_Inverse = getResourceOrNull(graph, URIs.Edge_HasOuterDiameter_Inverse); - Edge_HasTGround = getResourceOrNull(graph, URIs.Edge_HasTGround); - Edge_HasTGround_Inverse = getResourceOrNull(graph, URIs.Edge_HasTGround_Inverse); - Edge_HasType = getResourceOrNull(graph, URIs.Edge_HasType); - Edge_HasType_Inverse = getResourceOrNull(graph, URIs.Edge_HasType_Inverse); - Element = getResourceOrNull(graph, URIs.Element); - ElevationRectangleStyle = getResourceOrNull(graph, URIs.ElevationRectangleStyle); - Functions = getResourceOrNull(graph, URIs.Functions); - Functions_compositeInstantiator = getResourceOrNull(graph, URIs.Functions_compositeInstantiator); - Functions_constantOne = getResourceOrNull(graph, URIs.Functions_constantOne); - Functions_convertToValue = getResourceOrNull(graph, URIs.Functions_convertToValue); - Functions_defaultEdgeMappingModifier = getResourceOrNull(graph, URIs.Functions_defaultEdgeMappingModifier); - Functions_defaultVertexMappingModifier = getResourceOrNull(graph, URIs.Functions_defaultVertexMappingModifier); - Functions_enumerationValues = getResourceOrNull(graph, URIs.Functions_enumerationValues); - Functions_hasNominalMassFlowValue = getResourceOrNull(graph, URIs.Functions_hasNominalMassFlowValue); - Functions_mappingModifier = getResourceOrNull(graph, URIs.Functions_mappingModifier); - Groups = getResourceOrNull(graph, URIs.Groups); - Groups_EdgeGroup = getResourceOrNull(graph, URIs.Groups_EdgeGroup); - Groups_ElementGroup = getResourceOrNull(graph, URIs.Groups_ElementGroup); - Groups_VertexGroup = getResourceOrNull(graph, URIs.Groups_VertexGroup); - HasEndVertex = getResourceOrNull(graph, URIs.HasEndVertex); - HasEndVertex_Inverse = getResourceOrNull(graph, URIs.HasEndVertex_Inverse); - HasId = getResourceOrNull(graph, URIs.HasId); - HasId_Inverse = getResourceOrNull(graph, URIs.HasId_Inverse); - HasInLayerTag = getResourceOrNull(graph, URIs.HasInLayerTag); - HasInLayerTag_Inverse = getResourceOrNull(graph, URIs.HasInLayerTag_Inverse); - HasMapping = getResourceOrNull(graph, URIs.HasMapping); - HasMapping_Inverse = getResourceOrNull(graph, URIs.HasMapping_Inverse); - HasRegion = getResourceOrNull(graph, URIs.HasRegion); - HasRegion_Inverse = getResourceOrNull(graph, URIs.HasRegion_Inverse); - HasSRID = getResourceOrNull(graph, URIs.HasSRID); - HasSRID_Inverse = getResourceOrNull(graph, URIs.HasSRID_Inverse); - HasSRTEXT = getResourceOrNull(graph, URIs.HasSRTEXT); - HasSRTEXT_Inverse = getResourceOrNull(graph, URIs.HasSRTEXT_Inverse); - HasSpatialRefSystem = getResourceOrNull(graph, URIs.HasSpatialRefSystem); - HasSpatialRefSystem_Inverse = getResourceOrNull(graph, URIs.HasSpatialRefSystem_Inverse); - HasStartVertex = getResourceOrNull(graph, URIs.HasStartVertex); - HasStartVertex_Inverse = getResourceOrNull(graph, URIs.HasStartVertex_Inverse); - HasSymbolFunction = getResourceOrNull(graph, URIs.HasSymbolFunction); - HasSymbolFunction_Inverse = getResourceOrNull(graph, URIs.HasSymbolFunction_Inverse); - Images = getResourceOrNull(graph, URIs.Images); - Images_MapImage = getResourceOrNull(graph, URIs.Images_MapImage); - InLayer = getResourceOrNull(graph, URIs.InLayer); - Layer = getResourceOrNull(graph, URIs.Layer); - LeftClickDefaultMapping = getResourceOrNull(graph, URIs.LeftClickDefaultMapping); - LeftClickDefaultMapping_Inverse = getResourceOrNull(graph, URIs.LeftClickDefaultMapping_Inverse); - MappedComponent = getResourceOrNull(graph, URIs.MappedComponent); - MappedFromElement = getResourceOrNull(graph, URIs.MappedFromElement); - Mapping = getResourceOrNull(graph, URIs.Mapping); - MappingParameterType = getResourceOrNull(graph, URIs.MappingParameterType); - Mapping_Base = getResourceOrNull(graph, URIs.Mapping_Base); - Mapping_ComponentType = getResourceOrNull(graph, URIs.Mapping_ComponentType); - Mapping_ComponentType_Inverse = getResourceOrNull(graph, URIs.Mapping_ComponentType_Inverse); - Mapping_EdgeMapping = getResourceOrNull(graph, URIs.Mapping_EdgeMapping); - Mapping_EdgeMapping_DiameterAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_DiameterAttribute); - Mapping_EdgeMapping_DiameterAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_DiameterAttribute_Inverse); - Mapping_EdgeMapping_ElevationAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_ElevationAttribute); - Mapping_EdgeMapping_ElevationAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_ElevationAttribute_Inverse); - Mapping_EdgeMapping_FlowAreaAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_FlowAreaAttribute); - Mapping_EdgeMapping_FlowAreaAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_FlowAreaAttribute_Inverse); - Mapping_EdgeMapping_KReturnAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_KReturnAttribute); - Mapping_EdgeMapping_KReturnAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_KReturnAttribute_Inverse); - Mapping_EdgeMapping_KSupplyAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_KSupplyAttribute); - Mapping_EdgeMapping_KSupplyAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_KSupplyAttribute_Inverse); - Mapping_EdgeMapping_LengthAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_LengthAttribute); - Mapping_EdgeMapping_LengthAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_LengthAttribute_Inverse); - Mapping_EdgeMapping_NominalMassFlowAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_NominalMassFlowAttribute); - Mapping_EdgeMapping_NominalMassFlowAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_NominalMassFlowAttribute_Inverse); - Mapping_EdgeMapping_OuterDiameterAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_OuterDiameterAttribute); - Mapping_EdgeMapping_OuterDiameterAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_OuterDiameterAttribute_Inverse); - Mapping_EdgeMapping_PipeTypeAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_PipeTypeAttribute); - Mapping_EdgeMapping_PipeTypeAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_PipeTypeAttribute_Inverse); - Mapping_EdgeMapping_TGroundAttribute = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_TGroundAttribute); - Mapping_EdgeMapping_TGroundAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_EdgeMapping_TGroundAttribute_Inverse); - Mapping_Id = getResourceOrNull(graph, URIs.Mapping_Id); - Mapping_Id_Inverse = getResourceOrNull(graph, URIs.Mapping_Id_Inverse); - Mapping_InputTerminal = getResourceOrNull(graph, URIs.Mapping_InputTerminal); - Mapping_InputTerminal_Inverse = getResourceOrNull(graph, URIs.Mapping_InputTerminal_Inverse); - Mapping_OutputTerminal = getResourceOrNull(graph, URIs.Mapping_OutputTerminal); - Mapping_OutputTerminal_Inverse = getResourceOrNull(graph, URIs.Mapping_OutputTerminal_Inverse); - Mapping_Region = getResourceOrNull(graph, URIs.Mapping_Region); - Mapping_Region_Inverse = getResourceOrNull(graph, URIs.Mapping_Region_Inverse); - Mapping_Terminal = getResourceOrNull(graph, URIs.Mapping_Terminal); - Mapping_TerminalPair = getResourceOrNull(graph, URIs.Mapping_TerminalPair); - Mapping_Terminals = getResourceOrNull(graph, URIs.Mapping_Terminals); - Mapping_Terminals_Inverse = getResourceOrNull(graph, URIs.Mapping_Terminals_Inverse); - Mapping_VertexMapping = getResourceOrNull(graph, URIs.Mapping_VertexMapping); - Mapping_VertexMapping_AddressAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_AddressAttribute); - Mapping_VertexMapping_AddressAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_AddressAttribute_Inverse); - Mapping_VertexMapping_DeltaPressureAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_DeltaPressureAttribute); - Mapping_VertexMapping_DeltaPressureAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_DeltaPressureAttribute_Inverse); - Mapping_VertexMapping_DeltaTemperatureAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_DeltaTemperatureAttribute); - Mapping_VertexMapping_DeltaTemperatureAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_DeltaTemperatureAttribute_Inverse); - Mapping_VertexMapping_ElevationAltAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ElevationAltAttribute); - Mapping_VertexMapping_ElevationAltAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ElevationAltAttribute_Inverse); - Mapping_VertexMapping_ElevationAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ElevationAttribute); - Mapping_VertexMapping_ElevationAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ElevationAttribute_Inverse); - Mapping_VertexMapping_FlowAreaAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_FlowAreaAttribute); - Mapping_VertexMapping_FlowAreaAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_FlowAreaAttribute_Inverse); - Mapping_VertexMapping_FrequencyConverterControlledAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_FrequencyConverterControlledAttribute); - Mapping_VertexMapping_FrequencyConverterControlledAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_FrequencyConverterControlledAttribute_Inverse); - Mapping_VertexMapping_HeadPumpMaximumAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_HeadPumpMaximumAttribute); - Mapping_VertexMapping_HeadPumpMaximumAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_HeadPumpMaximumAttribute_Inverse); - Mapping_VertexMapping_HeadPumpNominalAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_HeadPumpNominalAttribute); - Mapping_VertexMapping_HeadPumpNominalAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_HeadPumpNominalAttribute_Inverse); - Mapping_VertexMapping_HeatLoadDsAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_HeatLoadDsAttribute); - Mapping_VertexMapping_HeatLoadDsAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_HeatLoadDsAttribute_Inverse); - Mapping_VertexMapping_HeatPowerAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_HeatPowerAttribute); - Mapping_VertexMapping_HeatPowerAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_HeatPowerAttribute_Inverse); - Mapping_VertexMapping_InternalValveMeasurementAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_InternalValveMeasurementAttribute); - Mapping_VertexMapping_InternalValveMeasurementAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_InternalValveMeasurementAttribute_Inverse); - Mapping_VertexMapping_MassFlowAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_MassFlowAttribute); - Mapping_VertexMapping_MassFlowAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_MassFlowAttribute_Inverse); - Mapping_VertexMapping_MaximumHeadMAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_MaximumHeadMAttribute); - Mapping_VertexMapping_MaximumHeadMAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_MaximumHeadMAttribute_Inverse); - Mapping_VertexMapping_NominalFlowAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalFlowAttribute); - Mapping_VertexMapping_NominalFlowAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalFlowAttribute_Inverse); - Mapping_VertexMapping_NominalHeadBAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalHeadBAttribute); - Mapping_VertexMapping_NominalHeadBAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalHeadBAttribute_Inverse); - Mapping_VertexMapping_NominalHeadMAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalHeadMAttribute); - Mapping_VertexMapping_NominalHeadMAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalHeadMAttribute_Inverse); - Mapping_VertexMapping_NominalMassFlowAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalMassFlowAttribute); - Mapping_VertexMapping_NominalMassFlowAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalMassFlowAttribute_Inverse); - Mapping_VertexMapping_NominalPressureLossAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalPressureLossAttribute); - Mapping_VertexMapping_NominalPressureLossAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_NominalPressureLossAttribute_Inverse); - Mapping_VertexMapping_OpeningTimeAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_OpeningTimeAttribute); - Mapping_VertexMapping_OpeningTimeAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_OpeningTimeAttribute_Inverse); - Mapping_VertexMapping_PeakPowerAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PeakPowerAttribute); - Mapping_VertexMapping_PeakPowerAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PeakPowerAttribute_Inverse); - Mapping_VertexMapping_PumpInReturnLineAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpInReturnLineAttribute); - Mapping_VertexMapping_PumpInReturnLineAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpInReturnLineAttribute_Inverse); - Mapping_VertexMapping_PumpMassFlowNominalAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpMassFlowNominalAttribute); - Mapping_VertexMapping_PumpMassFlowNominalAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpMassFlowNominalAttribute_Inverse); - Mapping_VertexMapping_PumpMeMaxAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpMeMaxAttribute); - Mapping_VertexMapping_PumpMeMaxAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpMeMaxAttribute_Inverse); - Mapping_VertexMapping_PumpMeMinAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpMeMinAttribute); - Mapping_VertexMapping_PumpMeMinAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpMeMinAttribute_Inverse); - Mapping_VertexMapping_PumpSpeedMaxAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpSpeedMaxAttribute); - Mapping_VertexMapping_PumpSpeedMaxAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpSpeedMaxAttribute_Inverse); - Mapping_VertexMapping_PumpSpeedMinAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpSpeedMinAttribute); - Mapping_VertexMapping_PumpSpeedMinAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_PumpSpeedMinAttribute_Inverse); - Mapping_VertexMapping_ReturnPressureAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ReturnPressureAttribute); - Mapping_VertexMapping_ReturnPressureAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ReturnPressureAttribute_Inverse); - Mapping_VertexMapping_ReturnTemperatureAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ReturnTemperatureAttribute); - Mapping_VertexMapping_ReturnTemperatureAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ReturnTemperatureAttribute_Inverse); - Mapping_VertexMapping_SupplyPressureAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_SupplyPressureAttribute); - Mapping_VertexMapping_SupplyPressureAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_SupplyPressureAttribute_Inverse); - Mapping_VertexMapping_SupplyTemperatureAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_SupplyTemperatureAttribute); - Mapping_VertexMapping_SupplyTemperatureAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_SupplyTemperatureAttribute_Inverse); - Mapping_VertexMapping_ValveMeMaxAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveMeMaxAttribute); - Mapping_VertexMapping_ValveMeMaxAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveMeMaxAttribute_Inverse); - Mapping_VertexMapping_ValveMeMinAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveMeMinAttribute); - Mapping_VertexMapping_ValveMeMinAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveMeMinAttribute_Inverse); - Mapping_VertexMapping_ValveMinPositionAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveMinPositionAttribute); - Mapping_VertexMapping_ValveMinPositionAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveMinPositionAttribute_Inverse); - Mapping_VertexMapping_ValveOutletModeAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveOutletModeAttribute); - Mapping_VertexMapping_ValveOutletModeAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveOutletModeAttribute_Inverse); - Mapping_VertexMapping_ValvePositionAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValvePositionAttribute); - Mapping_VertexMapping_ValvePositionAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValvePositionAttribute_Inverse); - Mapping_VertexMapping_ValvePressLossNominalAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValvePressLossNominalAttribute); - Mapping_VertexMapping_ValvePressLossNominalAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValvePressLossNominalAttribute_Inverse); - Mapping_VertexMapping_ValveReturnLineAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveReturnLineAttribute); - Mapping_VertexMapping_ValveReturnLineAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_ValveReturnLineAttribute_Inverse); - Mapping_VertexMapping_VelocityAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_VelocityAttribute); - Mapping_VertexMapping_VelocityAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_VelocityAttribute_Inverse); - Mapping_VertexMapping_VolFlowAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_VolFlowAttribute); - Mapping_VertexMapping_VolFlowAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_VolFlowAttribute_Inverse); - Mapping_VertexMapping_XAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_XAttribute); - Mapping_VertexMapping_XAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_XAttribute_Inverse); - Mapping_VertexMapping_YAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_YAttribute); - Mapping_VertexMapping_YAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_YAttribute_Inverse); - Mapping_VertexMapping_dpAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_dpAttribute); - Mapping_VertexMapping_dpAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_dpAttribute_Inverse); - Mapping_VertexMapping_dtAttribute = getResourceOrNull(graph, URIs.Mapping_VertexMapping_dtAttribute); - Mapping_VertexMapping_dtAttribute_Inverse = getResourceOrNull(graph, URIs.Mapping_VertexMapping_dtAttribute_Inverse); - ReturnConnectionType = getResourceOrNull(graph, URIs.ReturnConnectionType); - ReturnInConnectionType = getResourceOrNull(graph, URIs.ReturnInConnectionType); - ReturnOutConnectionType = getResourceOrNull(graph, URIs.ReturnOutConnectionType); - RightClickDefaultMapping = getResourceOrNull(graph, URIs.RightClickDefaultMapping); - RightClickDefaultMapping_Inverse = getResourceOrNull(graph, URIs.RightClickDefaultMapping_Inverse); - SCLMain = getResourceOrNull(graph, URIs.SCLMain); - SpatialRefSystem = getResourceOrNull(graph, URIs.SpatialRefSystem); - SupplyConnectionType = getResourceOrNull(graph, URIs.SupplyConnectionType); - SupplyInConnectionType = getResourceOrNull(graph, URIs.SupplyInConnectionType); - SupplyOutConnectionType = getResourceOrNull(graph, URIs.SupplyOutConnectionType); - TechType = getResourceOrNull(graph, URIs.TechType); - TechType_Functions = getResourceOrNull(graph, URIs.TechType_Functions); - TechType_Functions_techTypeCodeValueAccessor = getResourceOrNull(graph, URIs.TechType_Functions_techTypeCodeValueAccessor); - TechType_TechTypeCodeParameterType = getResourceOrNull(graph, URIs.TechType_TechTypeCodeParameterType); - TechType_TechTypeTable = getResourceOrNull(graph, URIs.TechType_TechTypeTable); - TechType_TechTypeTable_HasComponentType = getResourceOrNull(graph, URIs.TechType_TechTypeTable_HasComponentType); - TechType_TechTypeTable_HasData = getResourceOrNull(graph, URIs.TechType_TechTypeTable_HasData); - TechType_TechTypeTable_HasData_Inverse = getResourceOrNull(graph, URIs.TechType_TechTypeTable_HasData_Inverse); - Vertex = getResourceOrNull(graph, URIs.Vertex); - VertexDefaultMapping = getResourceOrNull(graph, URIs.VertexDefaultMapping); - VertexDefaultMapping_Inverse = getResourceOrNull(graph, URIs.VertexDefaultMapping_Inverse); - VertexMappingParameterType = getResourceOrNull(graph, URIs.VertexMappingParameterType); - VertexSymbolStyle = getResourceOrNull(graph, URIs.VertexSymbolStyle); - Vertex_HasAddress = getResourceOrNull(graph, URIs.Vertex_HasAddress); - Vertex_HasAddress_Inverse = getResourceOrNull(graph, URIs.Vertex_HasAddress_Inverse); - Vertex_HasAltElevation = getResourceOrNull(graph, URIs.Vertex_HasAltElevation); - Vertex_HasAltElevation_Inverse = getResourceOrNull(graph, URIs.Vertex_HasAltElevation_Inverse); - Vertex_HasDeltaPressure = getResourceOrNull(graph, URIs.Vertex_HasDeltaPressure); - Vertex_HasDeltaPressure_Inverse = getResourceOrNull(graph, URIs.Vertex_HasDeltaPressure_Inverse); - Vertex_HasDeltaTemperature = getResourceOrNull(graph, URIs.Vertex_HasDeltaTemperature); - Vertex_HasDeltaTemperature_Inverse = getResourceOrNull(graph, URIs.Vertex_HasDeltaTemperature_Inverse); - Vertex_HasElevation = getResourceOrNull(graph, URIs.Vertex_HasElevation); - Vertex_HasElevation_Inverse = getResourceOrNull(graph, URIs.Vertex_HasElevation_Inverse); - Vertex_HasFlowArea = getResourceOrNull(graph, URIs.Vertex_HasFlowArea); - Vertex_HasFlowArea_Inverse = getResourceOrNull(graph, URIs.Vertex_HasFlowArea_Inverse); - Vertex_HasFrequencyConverterControlled = getResourceOrNull(graph, URIs.Vertex_HasFrequencyConverterControlled); - Vertex_HasFrequencyConverterControlled_Inverse = getResourceOrNull(graph, URIs.Vertex_HasFrequencyConverterControlled_Inverse); - Vertex_HasHeadPumpMaximum = getResourceOrNull(graph, URIs.Vertex_HasHeadPumpMaximum); - Vertex_HasHeadPumpMaximum_Inverse = getResourceOrNull(graph, URIs.Vertex_HasHeadPumpMaximum_Inverse); - Vertex_HasHeadPumpNominal = getResourceOrNull(graph, URIs.Vertex_HasHeadPumpNominal); - Vertex_HasHeadPumpNominal_Inverse = getResourceOrNull(graph, URIs.Vertex_HasHeadPumpNominal_Inverse); - Vertex_HasHeatLoadDs = getResourceOrNull(graph, URIs.Vertex_HasHeatLoadDs); - Vertex_HasHeatLoadDs_Inverse = getResourceOrNull(graph, URIs.Vertex_HasHeatLoadDs_Inverse); - Vertex_HasHeatPower = getResourceOrNull(graph, URIs.Vertex_HasHeatPower); - Vertex_HasHeatPower_Inverse = getResourceOrNull(graph, URIs.Vertex_HasHeatPower_Inverse); - Vertex_HasInternalValveMeasurement = getResourceOrNull(graph, URIs.Vertex_HasInternalValveMeasurement); - Vertex_HasInternalValveMeasurement_Inverse = getResourceOrNull(graph, URIs.Vertex_HasInternalValveMeasurement_Inverse); - Vertex_HasMassFlow = getResourceOrNull(graph, URIs.Vertex_HasMassFlow); - Vertex_HasMassFlow_Inverse = getResourceOrNull(graph, URIs.Vertex_HasMassFlow_Inverse); - Vertex_HasMaximumHeadM = getResourceOrNull(graph, URIs.Vertex_HasMaximumHeadM); - Vertex_HasMaximumHeadM_Inverse = getResourceOrNull(graph, URIs.Vertex_HasMaximumHeadM_Inverse); - Vertex_HasNominalFlow = getResourceOrNull(graph, URIs.Vertex_HasNominalFlow); - Vertex_HasNominalFlow_Inverse = getResourceOrNull(graph, URIs.Vertex_HasNominalFlow_Inverse); - Vertex_HasNominalHeadB = getResourceOrNull(graph, URIs.Vertex_HasNominalHeadB); - Vertex_HasNominalHeadB_Inverse = getResourceOrNull(graph, URIs.Vertex_HasNominalHeadB_Inverse); - Vertex_HasNominalHeadM = getResourceOrNull(graph, URIs.Vertex_HasNominalHeadM); - Vertex_HasNominalHeadM_Inverse = getResourceOrNull(graph, URIs.Vertex_HasNominalHeadM_Inverse); - Vertex_HasNominalPressureLoss = getResourceOrNull(graph, URIs.Vertex_HasNominalPressureLoss); - Vertex_HasNominalPressureLoss_Inverse = getResourceOrNull(graph, URIs.Vertex_HasNominalPressureLoss_Inverse); - Vertex_HasOpeningTime = getResourceOrNull(graph, URIs.Vertex_HasOpeningTime); - Vertex_HasOpeningTime_Inverse = getResourceOrNull(graph, URIs.Vertex_HasOpeningTime_Inverse); - Vertex_HasPeakPower = getResourceOrNull(graph, URIs.Vertex_HasPeakPower); - Vertex_HasPeakPower_Inverse = getResourceOrNull(graph, URIs.Vertex_HasPeakPower_Inverse); - Vertex_HasPumpInReturnLine = getResourceOrNull(graph, URIs.Vertex_HasPumpInReturnLine); - Vertex_HasPumpInReturnLine_Inverse = getResourceOrNull(graph, URIs.Vertex_HasPumpInReturnLine_Inverse); - Vertex_HasPumpMassFlowNominal = getResourceOrNull(graph, URIs.Vertex_HasPumpMassFlowNominal); - Vertex_HasPumpMassFlowNominal_Inverse = getResourceOrNull(graph, URIs.Vertex_HasPumpMassFlowNominal_Inverse); - Vertex_HasPumpMeMax = getResourceOrNull(graph, URIs.Vertex_HasPumpMeMax); - Vertex_HasPumpMeMax_Inverse = getResourceOrNull(graph, URIs.Vertex_HasPumpMeMax_Inverse); - Vertex_HasPumpMeMin = getResourceOrNull(graph, URIs.Vertex_HasPumpMeMin); - Vertex_HasPumpMeMin_Inverse = getResourceOrNull(graph, URIs.Vertex_HasPumpMeMin_Inverse); - Vertex_HasPumpSpeedMax = getResourceOrNull(graph, URIs.Vertex_HasPumpSpeedMax); - Vertex_HasPumpSpeedMax_Inverse = getResourceOrNull(graph, URIs.Vertex_HasPumpSpeedMax_Inverse); - Vertex_HasPumpSpeedMin = getResourceOrNull(graph, URIs.Vertex_HasPumpSpeedMin); - Vertex_HasPumpSpeedMin_Inverse = getResourceOrNull(graph, URIs.Vertex_HasPumpSpeedMin_Inverse); - Vertex_HasReturnPressure = getResourceOrNull(graph, URIs.Vertex_HasReturnPressure); - Vertex_HasReturnPressure_Inverse = getResourceOrNull(graph, URIs.Vertex_HasReturnPressure_Inverse); - Vertex_HasReturnTemperature = getResourceOrNull(graph, URIs.Vertex_HasReturnTemperature); - Vertex_HasReturnTemperature_Inverse = getResourceOrNull(graph, URIs.Vertex_HasReturnTemperature_Inverse); - Vertex_HasSupplyPressure = getResourceOrNull(graph, URIs.Vertex_HasSupplyPressure); - Vertex_HasSupplyPressure_Inverse = getResourceOrNull(graph, URIs.Vertex_HasSupplyPressure_Inverse); - Vertex_HasSupplyTemperature = getResourceOrNull(graph, URIs.Vertex_HasSupplyTemperature); - Vertex_HasSupplyTemperature_Inverse = getResourceOrNull(graph, URIs.Vertex_HasSupplyTemperature_Inverse); - Vertex_HasValveMeMax = getResourceOrNull(graph, URIs.Vertex_HasValveMeMax); - Vertex_HasValveMeMax_Inverse = getResourceOrNull(graph, URIs.Vertex_HasValveMeMax_Inverse); - Vertex_HasValveMeMin = getResourceOrNull(graph, URIs.Vertex_HasValveMeMin); - Vertex_HasValveMeMin_Inverse = getResourceOrNull(graph, URIs.Vertex_HasValveMeMin_Inverse); - Vertex_HasValveMinPosition = getResourceOrNull(graph, URIs.Vertex_HasValveMinPosition); - Vertex_HasValveMinPosition_Inverse = getResourceOrNull(graph, URIs.Vertex_HasValveMinPosition_Inverse); - Vertex_HasValveOutletMode = getResourceOrNull(graph, URIs.Vertex_HasValveOutletMode); - Vertex_HasValveOutletMode_Inverse = getResourceOrNull(graph, URIs.Vertex_HasValveOutletMode_Inverse); - Vertex_HasValvePosition = getResourceOrNull(graph, URIs.Vertex_HasValvePosition); - Vertex_HasValvePosition_Inverse = getResourceOrNull(graph, URIs.Vertex_HasValvePosition_Inverse); - Vertex_HasValvePressLossNominal = getResourceOrNull(graph, URIs.Vertex_HasValvePressLossNominal); - Vertex_HasValvePressLossNominal_Inverse = getResourceOrNull(graph, URIs.Vertex_HasValvePressLossNominal_Inverse); - Vertex_HasValveReturnLine = getResourceOrNull(graph, URIs.Vertex_HasValveReturnLine); - Vertex_HasValveReturnLine_Inverse = getResourceOrNull(graph, URIs.Vertex_HasValveReturnLine_Inverse); - Vertex_HasVelocity = getResourceOrNull(graph, URIs.Vertex_HasVelocity); - Vertex_HasVelocity_Inverse = getResourceOrNull(graph, URIs.Vertex_HasVelocity_Inverse); - Vertex_HasVolFlow = getResourceOrNull(graph, URIs.Vertex_HasVolFlow); - Vertex_HasVolFlow_Inverse = getResourceOrNull(graph, URIs.Vertex_HasVolFlow_Inverse); - VisualisationsFolder = getResourceOrNull(graph, URIs.VisualisationsFolder); - } - - public static DistrictNetworkResource getInstance(ReadGraph graph) { - Session session = graph.getSession(); - DistrictNetworkResource ret = session.peekService(DistrictNetworkResource.class); - if(ret == null) { - QueryControl qc = graph.getService(QueryControl.class); - ret = new DistrictNetworkResource(qc.getIndependentGraph(graph)); - session.registerService(DistrictNetworkResource.class, ret); - } - return ret; - } - - public static DistrictNetworkResource getInstance(RequestProcessor session) throws DatabaseException { - DistrictNetworkResource ret = session.peekService(DistrictNetworkResource.class); - if(ret == null) { - ret = session.syncRequest(new Read() { - public DistrictNetworkResource perform(ReadGraph graph) throws DatabaseException { - QueryControl qc = graph.getService(QueryControl.class); - return new DistrictNetworkResource(qc.getIndependentGraph(graph)); - } - }); - session.registerService(DistrictNetworkResource.class, ret); - } - return ret; - } - -} - -- 2.45.2 From e24f9c8b8be3db87e940f48d88985fe929779dd9 Mon Sep 17 00:00:00 2001 From: Reino Ruusu Date: Fri, 18 Sep 2020 15:59:29 +0300 Subject: [PATCH 12/16] Connections between mapping Relations and element properties gitlab #97 Change-Id: Ie65c3ca037b0519162d2db4a8dc1a811cdb3671e --- .../graph/DistrictNetwork.pgraph | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph b/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph index 06c6b048..94680d73 100644 --- a/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph +++ b/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph @@ -389,6 +389,8 @@ DN.Mapping.Base -- DN.Mapping.Terminals --> DN.Mapping.TerminalPair -- DN.Mapping.VertexMapping.ElevationAttribute --> L0.String -- DN.Mapping.VertexMapping.ElevationAltAttribute --> L0.String -- DN.Mapping.VertexMapping.SupplyTemperatureAttribute --> L0.String -- DN.Mapping.VertexMapping.ReturnTemperatureAttribute --> L0.String -- DN.Mapping.VertexMapping.SupplyPressureAttribute --> L0.String -- DN.Mapping.VertexMapping.ReturnPressureAttribute --> L0.String -- DN.Mapping.VertexMapping.DeltaPressureAttribute --> L0.String -- DN.Mapping.VertexMapping.DeltaTemperatureAttribute --> L0.String -- DN.Mapping.VertexMapping.XAttribute --> L0.String -- DN.Mapping.VertexMapping.YAttribute --> L0.String -- DN.Mapping.VertexMapping.dpAttribute --> L0.String -- DN.Mapping.VertexMapping.dtAttribute --> L0.String -- DN.Mapping.VertexMapping.HeatPowerAttribute --> L0.String -- DN.Mapping.VertexMapping.PeakPowerAttribute --> L0.String -- DN.Mapping.VertexMapping.NominalHeadMAttribute --> L0.String -- DN.Mapping.VertexMapping.NominalHeadBAttribute --> L0.String -- DN.Mapping.VertexMapping.NominalFlowAttribute --> L0.String -- DN.Mapping.VertexMapping.MaximumHeadMAttribute --> L0.String -- DN.Mapping.VertexMapping.HeatLoadDsAttribute --> L0.String -- DN.Mapping.VertexMapping.AddressAttribute --> L0.String -- DN.Mapping.VertexMapping.MassFlowAttribute --> L0.String -- DN.Mapping.VertexMapping.VolFlowAttribute --> L0.String -- DN.Mapping.VertexMapping.VelocityAttribute --> L0.String -- DN.Mapping.VertexMapping.FlowAreaAttribute --> L0.String -- DN.Mapping.VertexMapping.ValvePositionAttribute --> L0.String -- DN.Mapping.VertexMapping.NominalPressureLossAttribute --> L0.String -- DN.Mapping.VertexMapping.NominalMassFlowAttribute --> L0.String -- DN.Mapping.VertexMapping.HeadPumpMaximumAttribute --> L0.String -- DN.Mapping.VertexMapping.HeadPumpNominalAttribute --> L0.String -- DN.Mapping.VertexMapping.FrequencyConverterControlledAttribute --> L0.String -- DN.Mapping.VertexMapping.InternalValveMeasurementAttribute --> L0.String -- DN.Mapping.VertexMapping.PumpInReturnLineAttribute --> L0.String -- DN.Mapping.VertexMapping.PumpMassFlowNominalAttribute --> L0.String -- DN.Mapping.VertexMapping.PumpMeMaxAttribute --> L0.String -- DN.Mapping.VertexMapping.PumpMeMinAttribute --> L0.String -- DN.Mapping.VertexMapping.PumpSpeedMaxAttribute --> L0.String -- DN.Mapping.VertexMapping.PumpSpeedMinAttribute --> L0.String -- DN.Mapping.VertexMapping.ValveReturnLineAttribute --> L0.String -- DN.Mapping.VertexMapping.ValveMeMaxAttribute --> L0.String -- DN.Mapping.VertexMapping.ValveMeMinAttribute --> L0.String -- DN.Mapping.VertexMapping.ValveMinPositionAttribute --> L0.String -- DN.Mapping.VertexMapping.ValveOutletModeAttribute --> L0.String -- DN.Mapping.VertexMapping.ValvePressLossNominalAttribute --> L0.String -- DN.Mapping.VertexMapping.OpeningTimeAttribute --> L0.String -- DN.Mapping.EdgeMapping.LengthAttribute --> L0.String -- DN.Mapping.EdgeMapping.DiameterAttribute --> L0.String -- DN.Mapping.EdgeMapping.OuterDiameterAttribute --> L0.String -- DN.Mapping.EdgeMapping.NominalMassFlowAttribute --> L0.String -- DN.Mapping.EdgeMapping.FlowAreaAttribute --> L0.String -- DN.Mapping.EdgeMapping.KReturnAttribute --> L0.String -- DN.Mapping.EdgeMapping.KSupplyAttribute --> L0.String -- DN.Mapping.EdgeMapping.TGroundAttribute --> L0.String -- DN.Mapping.EdgeMapping.ElevationAttribute --> L0.String -- DN.Mapping.EdgeMapping.PipeTypeAttribute --> L0.String Date: Fri, 18 Sep 2020 16:00:16 +0300 Subject: [PATCH 13/16] New properties for Edge elements gitlab #99 Change-Id: I3d934ffd74549890bc1be1b54022f65971376a42 --- .../graph/DistrictNetwork.pgraph | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph b/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph index 94680d73..7c205df8 100644 --- a/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph +++ b/org.simantics.district.network.ontology/graph/DistrictNetwork.pgraph @@ -151,6 +151,22 @@ DN.Edge -- DN.Edge.HasType @defProperty "Pipe Type" L0.String + >-- DN.Edge.HasPipeCode + @defProperty "Pipe Code" L0.String + >-- DN.Edge.HasInstallationYear + @defProperty "Installation Year" L0.Integer + >-- DN.Edge.HasWallThickness + @defProperty "Wall Thickness" L0.Double + >-- DN.Edge.HasInsulationConductivity + @defProperty "Insulation Conductivity" L0.Double + >-- DN.Edge.HasPipeSizeDN + @defProperty "Pipe Size DN" L0.Integer + >-- DN.Edge.HasRoughness + @defProperty "Roughness" L0.Double + >-- DN.Edge.HasStructure + @defProperty "Structure" L0.String + >-- DN.Edge.HasInsulationClass + @defProperty "Insulation Class" L0.String @L0.assert DN.Edge.HasDiameter 100.0 @L0.assert DN.Edge.HasOuterDiameter 125.0 @@ -514,6 +530,22 @@ DN.Mapping.EdgeMapping -- DN.Mapping.EdgeMapping.PipeTypeAttribute --> L0.String -- DN.Mapping.EdgeMapping.PipeCodeAttribute --> L0.String -- DN.Mapping.EdgeMapping.InstallationYearAttribute --> L0.String -- DN.Mapping.EdgeMapping.WallThicknessAttribute --> L0.String -- DN.Mapping.EdgeMapping.InsulationConductivityAttribute --> L0.String -- DN.Mapping.EdgeMapping.PipeSizeDNAttribute --> L0.String -- DN.Mapping.EdgeMapping.RoughnessAttribute --> L0.String -- DN.Mapping.EdgeMapping.StructureAttribute --> L0.String -- DN.Mapping.EdgeMapping.InsulationClassAttribute --> L0.String Date: Fri, 18 Sep 2020 17:20:40 +0300 Subject: [PATCH 14/16] Trim whitespace from tech type table data gitlab #93 Change-Id: I72cf316d3e99b35fdfa12e404e62a41a3e1858cf --- .../network/techtype/requests/TechTypeTableData.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java index 4afe5bde..cbedd1ac 100644 --- a/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/requests/TechTypeTableData.java @@ -75,7 +75,7 @@ public class TechTypeTableData extends ResourceRead v = r.iterator(); while (h.hasNext() && v.hasNext()) { - String name = h.next().intern(); - String value = v.next(); + String name = h.next().trim().intern(); + String value = v.next().trim(); valueMap.put(name, value); } } -- 2.45.2 From 86e40ae0b4e8690c828e11bb4da99650dcee2016 Mon Sep 17 00:00:00 2001 From: Reino Ruusu Date: Fri, 18 Sep 2020 17:21:29 +0300 Subject: [PATCH 15/16] Utilities for resetting map diagram element to tech type data gitlab #98 Change-Id: I996dc6d89c44a8082460e60a86cdb1357838b9f2 --- .../scl/Simantics/District/TechType.scl | 2 + .../network/techtype/TechTypeUtils.java | 111 ++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/org.simantics.district.network/scl/Simantics/District/TechType.scl b/org.simantics.district.network/scl/Simantics/District/TechType.scl index 9b6ddeb9..18663b85 100644 --- a/org.simantics.district.network/scl/Simantics/District/TechType.scl +++ b/org.simantics.district.network/scl/Simantics/District/TechType.scl @@ -5,3 +5,5 @@ importJava "org.simantics.district.network.techtype.TechTypeUtils" where updateComponent :: Resource -> () "Reset all components to values in a tech type table: `resetComponents table`" resetComponents :: Resource -> () + "Reset all map diagram elements to values in a tech type table: `resetMapElements table`" + resetMapElements :: Resource -> () diff --git a/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeUtils.java b/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeUtils.java index 7a25ff84..66280d12 100644 --- a/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeUtils.java +++ b/org.simantics.district.network/src/org/simantics/district/network/techtype/TechTypeUtils.java @@ -1,7 +1,9 @@ package org.simantics.district.network.techtype; import java.util.Collection; +import java.util.HashMap; import java.util.Map; +import java.util.Objects; import org.simantics.Simantics; import org.simantics.databoard.Bindings; @@ -20,11 +22,15 @@ import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.QueryIndexUtils; import org.simantics.db.layer0.request.PossibleVariable; +import org.simantics.db.layer0.request.PropertyInfo; +import org.simantics.db.layer0.request.PropertyInfoRequest; import org.simantics.db.layer0.variable.Variable; import org.simantics.district.network.ontology.DistrictNetworkResource; import org.simantics.district.network.techtype.requests.PossibleTechTypeItem; import org.simantics.district.network.techtype.requests.PossibleTechTypeTable; +import org.simantics.district.network.techtype.requests.TechTypeTableData; import org.simantics.district.network.techtype.requests.TechTypeTableKeyName; +import org.simantics.layer0.Layer0; import org.simantics.scl.runtime.SCLContext; import org.simantics.structural.stubs.StructuralResource2; import org.slf4j.Logger; @@ -93,6 +99,111 @@ public class TechTypeUtils { }); } + /** + * Reset all components that address the given tech type table to the table values. + * + * @param table A tech type table + * @throws DatabaseException + */ + public static void resetMapElements(Resource table) throws DatabaseException { + Simantics.getSession().syncRequest(new WriteRequest() { + @Override + public void perform(WriteGraph graph) throws DatabaseException { + Resource model = graph.syncRequest(new PossibleIndexRoot(table), TransientCacheListener.instance()); + if (model == null) + return; + + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + Resource type = graph.getPossibleObject(table, DN.TechType_TechTypeTable_HasComponentType); + if (type == null) + return; + + Layer0 L0 = Layer0.getInstance(graph); + String typeName = graph.getRelatedValue2(type, L0.HasName); + + Resource mapping = null; + for (Resource m : QueryIndexUtils.searchByType(graph, model, DN.Mapping_Base)) { + String name = graph.getRelatedValue2(m, DN.Mapping_ComponentType); + if (Objects.equals(name, typeName)) { + mapping = m; + break; + } + } + + if (mapping == null) { + LOGGER.warn("No mapping found for component type {}", type); + return; + } + + Map properties = new HashMap<>(); + Resource mappingType = graph.getSingleType(mapping, DN.Mapping_Base); + Collection mappingRelations = graph.getObjects(mappingType, L0.DomainOf); + for (Resource r : mappingRelations) { + String propertyName = graph.getPossibleRelatedValue2(mapping, r); + if (propertyName == null) + continue; + + Resource relation = graph.getPossibleObject(r, DN.Mapping_HasPropertyRelation); + if (relation == null) + continue; + + properties.put(propertyName, graph.syncRequest(new PropertyInfoRequest(relation))); + } + + Map> data = graph.syncRequest(new TechTypeTableData(table), TransientCacheListener.instance()); + String keyName = graph.syncRequest(new TechTypeTableKeyName(table), TransientCacheListener.instance()); + Resource keyRelation = properties.get(keyName).predicate; + + if (keyRelation == null) { + LOGGER.warn("No relation mapped to property {} found in {} mapping", keyName, mapping); + return; + } + + Resource elementType = graph.isInstanceOf(mapping, DN.Mapping_EdgeMapping) ? DN.Edge : + graph.isInstanceOf(mapping, DN.Mapping_VertexMapping) ? DN.Vertex : + DN.Element; + + Collection elements = QueryIndexUtils.searchByType(graph, model, elementType); + for (Resource element : elements) { + Resource elementMapping = graph.getPossibleObject(element, DN.HasMapping); + if (!mapping.equals(elementMapping)) + continue; + + String key = graph.getPossibleRelatedValue2(element, keyRelation); + Map values = data.get(key); + if (values == null) { + LOGGER.info("Key {} no found in tech type table {}", key, table); + continue; + } + + for (Map.Entry entry : values.entrySet()) { + PropertyInfo prop = properties.get(entry.getKey()); + if (prop == null) + continue; + + String value = entry.getValue(); + Datatype dt = prop.requiredDatatype; + if (dt instanceof NumberType) { + try { + Object num = ((NumberBinding)prop.defaultBinding).create(value.replace(",", ".")); + graph.claimLiteral(element, prop.predicate, prop.literalRange, num, prop.defaultBinding); + } catch (NumberFormatException e) { + // Revert to asserted value + graph.deny(element, prop.predicate); + } catch (BindingException e) { + LOGGER.error("Failed to get binding for datatype {}", dt, e); + } + } else if (dt instanceof StringType) { + graph.claimLiteral(element, prop.predicate, prop.literalRange, value, Bindings.STRING); + } else { + LOGGER.warn("updateComponent: Unsupported property type {}", dt); + } + } + } + } + }); + } + /** * Update property values of a component based on the values in an associated tech type table, if any * -- 2.45.2 From b94bd42a5509cd29fe13caf9fe9176b410684b7f Mon Sep 17 00:00:00 2001 From: Reino Ruusu Date: Mon, 21 Sep 2020 16:49:32 +0300 Subject: [PATCH 16/16] Support for new edge properties in district import wizard gitlab #99 Change-Id: Ief14e7e33c24680c0b2aac7fb3a9c02d67138684 --- .../imports/ui/CSVImportWizardPage.java | 662 +++--------------- .../scl/Simantics/District/Import.scl | 8 + .../district/imports/CSVImportModel.java | 63 ++ .../district/imports/DistrictImportUtils.java | 31 + 4 files changed, 182 insertions(+), 582 deletions(-) diff --git a/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java b/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java index beb56be1..5db45815 100644 --- a/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java +++ b/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.Consumer; import org.apache.commons.csv.CSVRecord; import org.eclipse.jface.dialogs.IPageChangeProvider; @@ -91,6 +92,13 @@ public class CSVImportWizardPage extends WizardPage { private DynamicComboFieldEditor endYCoordSelector; private DynamicComboFieldEditor endZValueSelector; private DynamicComboFieldEditor detailedGeometrySelector; + private DynamicComboFieldEditor pipeCodeSelector; + private DynamicComboFieldEditor installationYearSelector; + private DynamicComboFieldEditor wallThicknessSelector; + private DynamicComboFieldEditor insulationConductivitySelector; + private DynamicComboFieldEditor pipeSizeDNSelector; + private DynamicComboFieldEditor roughnessSelector; + private DynamicComboFieldEditor structureSelector; private Text edgeConnectionPadding; @@ -315,615 +323,98 @@ public class CSVImportWizardPage extends WizardPage { private void createCommonIndexMappingField(Group parent) { - componentMappingSelector = new DynamicComboFieldEditor("componentMapping", "Apros component mapping", parent); - componentMappingSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setComponentMappingIndex(Integer.parseInt(componentMappingSelector.getValue())); - validatePageComplete(); - } - }); + componentMappingSelector = createComboField("componentMapping", "Apros component mapping", model::setComponentMappingIndex, parent); - idSelector = new DynamicComboFieldEditor("id", "ID", parent); - idSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setIdIndex(Integer.parseInt(idSelector.getValue())); - validatePageComplete(); - } - }); - regionSelector = new DynamicComboFieldEditor("regionValue", "Region", parent); - regionSelector.addComboListener(new SelectionListener() { + idSelector = createComboField("id", "ID", model::setIdIndex, parent); + regionSelector = createComboField("regionValue", "Region", model::setRegionIndex, parent); + } + private DynamicComboFieldEditor createComboField(String name, String label, Consumer setter, Group parent) { + DynamicComboFieldEditor selector = new DynamicComboFieldEditor(name, label, parent); + createSelectionListener(selector, setter); + return selector; + } + + private void createSelectionListener(DynamicComboFieldEditor editor, Consumer setter) { + editor.addComboListener(new SelectionListener() { + @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } - + @Override public void widgetDefaultSelected(SelectionEvent e) { - model.setRegionIndex(Integer.parseInt(regionSelector.getValue())); + setter.accept(Integer.parseInt(editor.getValue())); validatePageComplete(); } }); } private void createVertexIndexMappingField(Group parent) { - xCoordSelector = new DynamicComboFieldEditor("xCoord", "X Coordinate", parent); - xCoordSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setXCoordIndex(Integer.parseInt(xCoordSelector.getValue())); - validatePageComplete(); - } - }); - - yCoordSelector = new DynamicComboFieldEditor("yCoord", "Y Coordinate", parent); - yCoordSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setYCoordIndex(Integer.parseInt(yCoordSelector.getValue())); - validatePageComplete(); - } - }); - zValueSelector = new DynamicComboFieldEditor("zValue", "Z Value", parent); - zValueSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setZCoordIndex(Integer.parseInt(zValueSelector.getValue())); - validatePageComplete(); - } - }); + xCoordSelector = createComboField("xCoord", "X Coordinate", model::setXCoordIndex, parent); - altElevationValueSelector = new DynamicComboFieldEditor("altElevation", "Alternative Elevation", parent); - altElevationValueSelector.addComboListener(new SelectionListener() { + yCoordSelector = createComboField("yCoord", "Y Coordinate", model::setYCoordIndex, parent); + zValueSelector = createComboField("zValue", "Z Value", model::setZCoordIndex, parent); - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setAltElevationIndex(Integer.parseInt(altElevationValueSelector.getValue())); - validatePageComplete(); - } - }); + altElevationValueSelector = createComboField("altElevation", "Alternative Elevation", model::setAltElevationIndex, parent); - supplyTempValueSelector = new DynamicComboFieldEditor("tempValue", "Supply Temperature value", parent); - supplyTempValueSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setSupplyTempIndex(Integer.parseInt(supplyTempValueSelector.getValue())); - validatePageComplete(); - } - }); - returnTempValueSelector = new DynamicComboFieldEditor("returnTempValue", "Return Temperature value", parent); - returnTempValueSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setReturnTempIndex(Integer.parseInt(returnTempValueSelector.getValue())); - validatePageComplete(); - } - }); - supplyPressureValueSelector = new DynamicComboFieldEditor("pressureValue", "Supply Pressure value", parent); - supplyPressureValueSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setSupplyPressureIndex(Integer.parseInt(supplyPressureValueSelector.getValue())); - validatePageComplete(); - } - }); - returnPressureValueSelector = new DynamicComboFieldEditor("returnPressureValue", "Return Pressure value", parent); - returnPressureValueSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setReturnPressureIndex(Integer.parseInt(returnPressureValueSelector.getValue())); - validatePageComplete(); - } - }); - dpSelector = new DynamicComboFieldEditor("dpValue", "Delta pressure ", parent); - dpSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setDeltaPressureIndex(Integer.parseInt(dpSelector.getValue())); - validatePageComplete(); - } - }); - dtSelector = new DynamicComboFieldEditor("dtValue", "Delta temperature ", parent); - dtSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setDeltaTemperatureIndex(Integer.parseInt(dtSelector.getValue())); - validatePageComplete(); - } - }); - heatPowerSelector = new DynamicComboFieldEditor("heatPowerValue", "Heat Power", parent); - heatPowerSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setHeatPowerIndex(Integer.parseInt(heatPowerSelector.getValue())); - validatePageComplete(); - } - }); - peakPowerSelector = new DynamicComboFieldEditor("peakPowerValue", "Peak Power", parent); - peakPowerSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setPeakPowerIndex(Integer.parseInt(peakPowerSelector.getValue())); - validatePageComplete(); - } - }); + supplyTempValueSelector = createComboField("tempValue", "Supply Temperature value", model::setSupplyTempIndex, parent); + returnTempValueSelector = createComboField("returnTempValue", "Return Temperature value", model::setReturnTempIndex, parent); + supplyPressureValueSelector = createComboField("pressureValue", "Supply Pressure value", model::setSupplyPressureIndex, parent); + returnPressureValueSelector = createComboField("returnPressureValue", "Return Pressure value", model::setReturnPressureIndex, parent); + dpSelector = createComboField("dpValue", "Delta pressure ", model::setDeltaPressureIndex, parent); + dtSelector = createComboField("dtValue", "Delta temperature ", model::setDeltaTemperatureIndex, parent); + heatPowerSelector = createComboField("heatPowerValue", "Heat Power", model::setHeatPowerIndex, parent); + peakPowerSelector = createComboField("peakPowerValue", "Peak Power", model::setPeakPowerIndex, parent); - nominalHeadMSelector = new DynamicComboFieldEditor("nominalHeadMValue", "nominalHeadM", parent); - nominalHeadMSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setNominalHeadMIndex(Integer.parseInt(nominalHeadMSelector.getValue())); - validatePageComplete(); - } - }); - nominalHeadBSelector = new DynamicComboFieldEditor("nominalHeadBValue", "nominalHeadB", parent); - nominalHeadBSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setNominalHeadBIndex(Integer.parseInt(nominalHeadBSelector.getValue())); - validatePageComplete(); - } - }); - nominalFlowSelector = new DynamicComboFieldEditor("nominalFlowValue", "nominalFlow", parent); - nominalFlowSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setNominalFlowIndex(Integer.parseInt(nominalFlowSelector.getValue())); - validatePageComplete(); - } - }); - - maximumHeadMSelector = new DynamicComboFieldEditor("maximumHeadMValue", "maximumHeadM", parent); - maximumHeadMSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setMaximumHeadMIndex(Integer.parseInt(maximumHeadMSelector.getValue())); - validatePageComplete(); - } - }); - heatLoadDsSelector = new DynamicComboFieldEditor("heatLoadDsValue", "heatLoadDs", parent); - heatLoadDsSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setHeatLoadDsIndex(Integer.parseInt(heatLoadDsSelector.getValue())); - validatePageComplete(); - } - }); - massFlowSelector = new DynamicComboFieldEditor("massFlowValue", "massFlow", parent); - massFlowSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setMassFlowIndex(Integer.parseInt(massFlowSelector.getValue())); - validatePageComplete(); - } - }); - volFlowSelector = new DynamicComboFieldEditor("volFlowValue", "volFlow", parent); - volFlowSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setVolFlowIndex(Integer.parseInt(volFlowSelector.getValue())); - validatePageComplete(); - } - }); - velocitySelector = new DynamicComboFieldEditor("velocityValue", "velocity", parent); - velocitySelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setVelocityIndex(Integer.parseInt(velocitySelector.getValue())); - validatePageComplete(); - } - }); - flowAreaSelector = new DynamicComboFieldEditor("flowAreaValue", "flowArea", parent); - flowAreaSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setFlowAreaIndex(Integer.parseInt(flowAreaSelector.getValue())); - validatePageComplete(); - } - }); - nominalPressureLossSelector = new DynamicComboFieldEditor("nominalPressureLossValue", "nominalPressureLoss", parent); - nominalPressureLossSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setNominalPressureLossIndex(Integer.parseInt(nominalPressureLossSelector.getValue())); - validatePageComplete(); - } - }); - valvePositionSelector = new DynamicComboFieldEditor("valvePositionSelectorValue", "valvePositionSelector", parent); - valvePositionSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setValvePositionIndex(Integer.parseInt(valvePositionSelector.getValue())); - validatePageComplete(); - } - }); - addressSelector = new DynamicComboFieldEditor("addressValue", "addressSelector", parent); - addressSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setAddressIndex(Integer.parseInt(addressSelector.getValue())); - validatePageComplete(); - } - }); + nominalHeadMSelector = createComboField("nominalHeadMValue", "nominalHeadM", model::setNominalHeadMIndex, parent); + nominalHeadBSelector = createComboField("nominalHeadBValue", "nominalHeadB", model::setNominalHeadBIndex, parent); + nominalFlowSelector = createComboField("nominalFlowValue", "nominalFlow", model::setNominalFlowIndex, parent); + + maximumHeadMSelector = createComboField("maximumHeadMValue", "maximumHeadM", model::setMaximumHeadMIndex, parent); + heatLoadDsSelector = createComboField("heatLoadDsValue", "heatLoadDs", model::setHeatLoadDsIndex, parent); + massFlowSelector = createComboField("massFlowValue", "massFlow", model::setMassFlowIndex, parent); + volFlowSelector = createComboField("volFlowValue", "volFlow", model::setVolFlowIndex, parent); + velocitySelector = createComboField("velocityValue", "velocity", model::setVelocityIndex, parent); + flowAreaSelector = createComboField("flowAreaValue", "flowArea", model::setFlowAreaIndex, parent); + nominalPressureLossSelector = createComboField("nominalPressureLossValue", "nominalPressureLoss", model::setNominalPressureLossIndex, parent); + valvePositionSelector = createComboField("valvePositionSelectorValue", "valvePositionSelector", model::setValvePositionIndex, parent); + addressSelector = createComboField("addressValue", "addressSelector", model::setAddressIndex, parent); } - + private void createEdgeIndexMappingField(Group parent) { // Composite paddingComposite = new Composite(parent, SWT.NONE); // GridLayoutFactory.fillDefaults().numColumns(2).applyTo(paddingComposite); + startXCoordSelector = createComboField("startxCoord", "Start X Coordinate", model::setStartXCoordIndex, parent); + startYCoordSelector = createComboField("startyCoord", "Start Y Coordinate", model::setStartYCoordIndex, parent); + startZValueSelector = createComboField("startzValue", "Start Z Value", model::setStartZCoordIndex, parent); - startXCoordSelector = new DynamicComboFieldEditor("startxCoord", "Start X Coordinate", parent); - startXCoordSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setStartXCoordIndex(Integer.parseInt(startXCoordSelector.getValue())); - validatePageComplete(); - } - }); - - startYCoordSelector = new DynamicComboFieldEditor("startyCoord", "Start Y Coordinate", parent); - startYCoordSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setStartYCoordIndex(Integer.parseInt(startYCoordSelector.getValue())); - validatePageComplete(); - } - }); - startZValueSelector = new DynamicComboFieldEditor("startzValue", "Start Z Value", parent); - startZValueSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setStartZCoordIndex(Integer.parseInt(startZValueSelector.getValue())); - validatePageComplete(); - } - }); + endXCoordSelector = createComboField("endxCoord", "End X Coordinate", model::setEndXCoordIndex, parent); + endYCoordSelector = createComboField("endyCoord", "End Y Coordinate", model::setEndYCoordIndex, parent); + endZValueSelector = createComboField("endzValue", "End Z Value", model::setEndZCoordIndex, parent); - endXCoordSelector = new DynamicComboFieldEditor("endxCoord", "End X Coordinate", parent); - endXCoordSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setEndXCoordIndex(Integer.parseInt(endXCoordSelector.getValue())); - validatePageComplete(); - } - }); - - endYCoordSelector = new DynamicComboFieldEditor("endyCoord", "End Y Coordinate", parent); - endYCoordSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setEndYCoordIndex(Integer.parseInt(endYCoordSelector.getValue())); - validatePageComplete(); - } - }); - endZValueSelector = new DynamicComboFieldEditor("endzValue", "End Z Value", parent); - endZValueSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setEndZCoordIndex(Integer.parseInt(endZValueSelector.getValue())); - validatePageComplete(); - } - }); - detailedGeometrySelector = new DynamicComboFieldEditor("detailedGeometryValue", "Geometry", parent); - detailedGeometrySelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.detailedGeometryIndex(Integer.parseInt(detailedGeometrySelector.getValue())); - validatePageComplete(); - } - }); - diameterSelector = new DynamicComboFieldEditor("diameterValue", "Diameter value", parent); - diameterSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setDiameterIndex(Integer.parseInt(diameterSelector.getValue())); - validatePageComplete(); - } - }); - outerDiameterSelector = new DynamicComboFieldEditor("outerDiameterValue", "Outer Diameter value", parent); - outerDiameterSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setOuterDiameterIndex(Integer.parseInt(outerDiameterSelector.getValue())); - validatePageComplete(); - } - }); - nominalMassFlowSelector = new DynamicComboFieldEditor("nominalMassFlowValue", "Nominal Mass Flow", parent); - nominalMassFlowSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setNominalMassFlowIndex(Integer.parseInt(nominalMassFlowSelector.getValue())); - validatePageComplete(); - } - }); - edgeFlowAreaSelector = new DynamicComboFieldEditor("edgeFlowAreaValue", "Flow Area", parent); - edgeFlowAreaSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setEdgeFlowAreaIndex(Integer.parseInt(edgeFlowAreaSelector.getValue())); - validatePageComplete(); - } - }); - kReturnSelector = new DynamicComboFieldEditor("kReturnValue", "K Return", parent); - kReturnSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setKReturnIndex(Integer.parseInt(kReturnSelector.getValue())); - validatePageComplete(); - } - }); - kSupplySelector = new DynamicComboFieldEditor("kSupplyValue", "K Supply", parent); - kSupplySelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setKSupplyIndex(Integer.parseInt(kSupplySelector.getValue())); - validatePageComplete(); - } - }); - tGroundSelector = new DynamicComboFieldEditor("tGroundValue", "Temperature Ground", parent); - tGroundSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setTGroundIndex(Integer.parseInt(tGroundSelector.getValue())); - validatePageComplete(); - } - }); - lengthSelector = new DynamicComboFieldEditor("lengthValue", "lengthSelector", parent); - lengthSelector.addComboListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - widgetDefaultSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - model.setLengthIndex(Integer.parseInt(lengthSelector.getValue())); - validatePageComplete(); - } - }); + pipeCodeSelector = createComboField("pipeCodeValue", "Pipe Code", model::setPipeCodeIndex, parent); + + detailedGeometrySelector = createComboField("detailedGeometryValue", "Geometry", model::detailedGeometryIndex, parent); + diameterSelector = createComboField("diameterValue", "Diameter value", model::setDiameterIndex, parent); + outerDiameterSelector = createComboField("outerDiameterValue", "Outer Diameter value", model::setOuterDiameterIndex, parent); + nominalMassFlowSelector = createComboField("nominalMassFlowValue", "Nominal Mass Flow", model::setNominalMassFlowIndex, parent); + edgeFlowAreaSelector = createComboField("edgeFlowAreaValue", "Flow Area", model::setEdgeFlowAreaIndex, parent); + kReturnSelector = createComboField("kReturnValue", "K Return", model::setKReturnIndex, parent); + kSupplySelector = createComboField("kSupplyValue", "K Supply", model::setKSupplyIndex, parent); + tGroundSelector = createComboField("tGroundValue", "Temperature Ground", model::setTGroundIndex, parent); + lengthSelector = createComboField("lengthValue", "lengthSelector", model::setLengthIndex, parent); + + pipeSizeDNSelector = createComboField("pipeSizeDNValue", "Pipe Size DN", model::setPipeSizeDNIndex, parent); + structureSelector = createComboField("structureValue", "Structure", model::setStructureIndex, parent); + installationYearSelector = createComboField("installationYearValue", "Installation Year", model::setInstallationYearIndex, parent); + wallThicknessSelector = createComboField("wallThicknessValue", "Wall Thickness", model::setWallThicknessIndex, parent); + insulationConductivitySelector = createComboField("insulationConductivityValue", "Insulation Conductivity", model::setInsulationConductivityIndex, parent); + roughnessSelector = createComboField("roughnessValue", "Roughness", model::setRoughnessIndex, parent); } private void updateCombos() { @@ -957,6 +448,7 @@ public class CSVImportWizardPage extends WizardPage { endYCoordSelector.updateCombo(namesAndValues); startZValueSelector.updateCombo(namesAndValues); endZValueSelector.updateCombo(namesAndValues); + pipeCodeSelector.updateCombo(namesAndValues); detailedGeometrySelector.updateCombo(namesAndValues); diameterSelector.updateCombo(namesAndValues); outerDiameterSelector.updateCombo(namesAndValues); @@ -966,6 +458,12 @@ public class CSVImportWizardPage extends WizardPage { kSupplySelector.updateCombo(namesAndValues); tGroundSelector.updateCombo(namesAndValues); lengthSelector.updateCombo(namesAndValues); + pipeSizeDNSelector.updateCombo(namesAndValues); + structureSelector.updateCombo(namesAndValues); + installationYearSelector.updateCombo(namesAndValues); + wallThicknessSelector.updateCombo(namesAndValues); + insulationConductivitySelector.updateCombo(namesAndValues); + roughnessSelector.updateCombo(namesAndValues); } private void updateVertexCombos(String[][] namesAndValues) { diff --git a/org.simantics.district.imports/scl/Simantics/District/Import.scl b/org.simantics.district.imports/scl/Simantics/District/Import.scl index 483887a3..d182e261 100644 --- a/org.simantics.district.imports/scl/Simantics/District/Import.scl +++ b/org.simantics.district.imports/scl/Simantics/District/Import.scl @@ -36,6 +36,14 @@ importJava "org.simantics.district.imports.CSVImportModel" where setEdgePadding :: CSVImportModel -> Double -> () setPipeTypeIndex :: CSVImportModel -> Integer -> () + setPipeCodeIndex :: CSVImportModel -> Integer -> () + setInstallationYearIndex :: CSVImportModel -> Integer -> () + setWallThicknessIndex :: CSVImportModel -> Integer -> () + setInsulationConductivityIndex :: CSVImportModel -> Integer -> () + setPipeSizeDNIndex :: CSVImportModel -> Integer -> () + setRoughnessIndex :: CSVImportModel -> Integer -> () + setStructureIndex :: CSVImportModel -> Integer -> () + // Common setSourceCRS :: CSVImportModel -> String -> () setIdIndex :: CSVImportModel -> Integer -> () diff --git a/org.simantics.district.imports/src/org/simantics/district/imports/CSVImportModel.java b/org.simantics.district.imports/src/org/simantics/district/imports/CSVImportModel.java index ffcf5ae9..ac422300 100644 --- a/org.simantics.district.imports/src/org/simantics/district/imports/CSVImportModel.java +++ b/org.simantics.district.imports/src/org/simantics/district/imports/CSVImportModel.java @@ -76,6 +76,13 @@ public class CSVImportModel { private int peakPowerIndex = -1; private int regionIndex = -1; private int pipeTypeIndex = -1; + private int pipeCodeIndex = -1; + private int installationYearIndex = -1; + private int wallThicknessIndex = -1; + private int insulationConductivityIndex = -1; + private int pipeSizeDNIndex = -1; + private int roughnessIndex = -1; + private int structureIndex = -1; // Third page @@ -536,4 +543,60 @@ public class CSVImportModel { public void setPipeTypeIndex(int pipeTypeIndex) { this.pipeTypeIndex = pipeTypeIndex; } + + public int getPipeCodeIndex() { + return pipeCodeIndex; + } + + public void setPipeCodeIndex(int pipeCodeIndex) { + this.pipeCodeIndex = pipeCodeIndex; + } + + public int getInstallationYearIndex() { + return installationYearIndex; + } + + public void setInstallationYearIndex(int installationYearIndex) { + this.installationYearIndex = installationYearIndex; + } + + public int getWallThicknessIndex() { + return wallThicknessIndex; + } + + public void setWallThicknessIndex(int wallThicknessIndex) { + this.wallThicknessIndex = wallThicknessIndex; + } + + public int getInsulationConductivityIndex() { + return insulationConductivityIndex; + } + + public void setInsulationConductivityIndex(int insulationConductivityIndex) { + this.insulationConductivityIndex = insulationConductivityIndex; + } + + public int getPipeSizeDNIndex() { + return pipeSizeDNIndex; + } + + public void setPipeSizeDNIndex(int pipeSizeDNIndex) { + this.pipeSizeDNIndex = pipeSizeDNIndex; + } + + public int getRoughnessIndex() { + return roughnessIndex; + } + + public void setRoughnessIndex(int roughnessIndex) { + this.roughnessIndex = roughnessIndex; + } + + public int getStructureIndex() { + return structureIndex; + } + + public void setStructureIndex(int structureIndex) { + this.structureIndex = structureIndex; + } } diff --git a/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java b/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java index 1ff69279..522fd66e 100644 --- a/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java +++ b/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java @@ -387,6 +387,13 @@ public class DistrictImportUtils { int detailedGeometryIndex = model.getDetailedGeometryIndex(); int regionIndex = model.getRegionIndex(); int pipeTypeIndex = model.getPipeTypeIndex(); + int pipeCodeIndex = model.getPipeCodeIndex(); + int installationYearIndex = model.getInstallationYearIndex(); + int wallThicknessIndex = model.getWallThicknessIndex(); + int insulationConductivityIndex = model.getInsulationConductivityIndex(); + int pipeSizeDNIndex = model.getPipeSizeDNIndex(); + int roughnessIndex = model.getRoughnessIndex(); + int structureIndex = model.getStructureIndex(); int mappingColumn = model.getComponentMappingIndex(); int idColumn = model.getIdIndex(); @@ -482,6 +489,13 @@ public class DistrictImportUtils { writeStringValue(graph, row, regionIndex, edge, DN.HasRegion); writeStringValue(graph, row, pipeTypeIndex, edge, DN.Edge_HasType); writeDoubleArrayFromString(graph, row, detailedGeometryIndex, edge, DN.Edge_HasGeometry, actualTransform); + writeStringValue(graph, row, pipeCodeIndex, edge, DN.Edge_HasPipeCode); + writeIntegerValue(graph, row, installationYearIndex, edge, DN.Edge_HasInstallationYear); + writeValue(graph, row, wallThicknessIndex, edge, DN.Edge_HasWallThickness); + writeValue(graph, row, insulationConductivityIndex, edge, DN.Edge_HasInsulationConductivity); + writeIntegerValue(graph, row, pipeSizeDNIndex, edge, DN.Edge_HasPipeSizeDN); + writeValue(graph, row, roughnessIndex, edge, DN.Edge_HasRoughness); + writeStringValue(graph, row, structureIndex, edge, DN.Edge_HasStructure); } } return true; @@ -521,6 +535,23 @@ public class DistrictImportUtils { } } + private static void writeIntegerValue(WriteGraph graph, CSVRecord row, int index, Resource subject, Resource relation) throws DatabaseException { + if (index != -1) { + String stringValue = row.get(index); + if (!stringValue.isEmpty()) { + try { + if (stringValue.startsWith("\"") && stringValue.endsWith("\"")) { + stringValue = stringValue.substring(1, stringValue.length() - 1); + } + graph.claimLiteral(subject, relation, Integer.parseInt(stringValue), Bindings.INTEGER); + } catch (NumberFormatException e) { + LOGGER.error("Could not parse {} {} {} {}", row, index, subject, relation, e); + //throw new DatabaseException(e); + } + } + } + } + private static void writeStringValue(WriteGraph graph, CSVRecord row, int index, Resource subject, Resource relation) throws DatabaseException { if (index != -1) { String stringValue = row.get(index); -- 2.45.2