From f8fc63e6b7e8d56d0dd4cfefb7d8b24fc12bf9a0 Mon Sep 17 00:00:00 2001 From: lempinen Date: Mon, 6 May 2013 10:24:16 +0000 Subject: [PATCH] Unit validation for module interfaces (refs #4268) git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@27310 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 150852 -> 151735 bytes .../graph/Sysdyn.pgraph | 16 +- .../graph/Validation.pgraph | 29 ++- .../org/simantics/sysdyn/SysdynResource.java | 18 ++ org.simantics.sysdyn.ui/META-INF/MANIFEST.MF | 3 +- .../profiles/IssueDecorationStyle.java | 2 +- .../sysdyn/ui/project/SysdynProject.java | 33 +-- .../ui/properties/ConfigurationTab.java | 3 + .../ui/properties/InputVariableTab.java | 14 ++ .../properties/widgets/UnitComboWidget.java | 95 ++++++++ .../simantics/sysdyn/ui/utils/ModelUtils.java | 4 +- .../ui/validation/ModuleStandardIssue.java | 37 ++++ .../sysdyn/ui/validation/UnitFunction.java | 206 +++++++++++++++--- .../representation/utils/UnitUtils.java | 34 +++ 14 files changed, 436 insertions(+), 58 deletions(-) create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/UnitComboWidget.java create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/ModuleStandardIssue.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index da045bf5c53e1de49b6f71151085794afeb91645..87734e2663aa803cc9f3f1f9c9b7222b11d033bc 100644 GIT binary patch literal 151735 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 L>v8nFtakq&bEpb5 literal 150852 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 Q!bO0|I@+qzi?Wpbf0($G`v3p{ diff --git a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph index 9f646f05..54d927db 100644 --- a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph @@ -88,8 +88,8 @@ SYSDYN.DefaultRealization -- SYSDYN.Variable.type --> L0.String -- SYSDYN.Variable.expressions --> SYSDYN.Expressions -- SYSDYN.Variable.expressionList --> L0.List -- SYSDYN.Module.redeclaration --> SYSDYN.Redeclaration -- SYSDYN.Module.parameterOverride --> SYSDYN.Module.ParameterOverride L0X = ISSUE = SYSDYN = +STR = VALIDATIONS = SYSDYN.Validations : L0.Library @@ -27,9 +28,12 @@ VALIDATIONS.Expressions.expressionValidator : L0.Function VALIDATIONS.Enumerations : L0.Library VALIDATIONS.Enumerations.enumerationIndexValidator : L0.Function -// ENUMERATIONS +// UNITS VALIDATIONS.Units : L0.Library VALIDATIONS.Units.unitValidator : L0.Function +VALIDATIONS.Units.moduleInterfaceExtension : L0.Function + + SYSDYN.Variable @VALIDATIONS.constraint @@ -62,15 +66,18 @@ SYSDYN.Variable @L0.assert L0.HasName "MissingDependencyConnectionsIssueSource" VALIDATIONS.Dependencies.missingDependencyValidator VALIDATIONS.Functions.baseRealizationFunction - -SYSDYN.IndependentVariable + +SYSDYN.Component @VALIDATIONS.listeningConstraint VALIDATIONS.UnitConstraint VALIDATIONS.Units.UnitIssueSource @L0.assert L0.HasName "UnitIssueSource" + L0.Asserts _ : L0.Assertion + L0.HasPredicate ISSUE.Sources.DependencyTracker.HasExtension + L0.HasObject VALIDATIONS.Units.moduleInterfaceExtension VALIDATIONS.Units.unitValidator VALIDATIONS.Functions.baseRealizationFunction - + VALIDATIONS.ExpressionIssue @VALIDATIONS.issue ISSUE.Severity.Error @@ -134,6 +141,19 @@ VALIDATIONS.UnitWarning L0.HasValueType "String" VALIDATIONS.Functions.path +VALIDATIONS.ModuleInputUnitWarning + @VALIDATIONS.issue + ISSUE.Severity.Warning + VALIDATIONS.Units.moduleInputUnitWarningDescription : L0.Function + L0.HasValueType "String" + VALIDATIONS.Functions.path + +VALIDATIONS.ModuleOutputUnitWarning + @VALIDATIONS.issue + ISSUE.Severity.Warning + VALIDATIONS.Units.moduleOutputUnitWarningDescription : L0.Function + L0.HasValueType "String" + VALIDATIONS.Functions.path // IssueSource template VALIDATIONS.constraint : L0.Template @@ -151,7 +171,6 @@ VALIDATIONS.constraint : L0.Template L0.Asserts _ : L0.Assertion L0.HasPredicate ISSUE.Sources.DependencyTracker.HasBaseFunction L0.HasObject %baseFunction - VALIDATIONS.listeningConstraint : L0.Template @template %type %constraint %source %validator %baseFunction diff --git a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java index 2109bb0b..e972eab9 100644 --- a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java +++ b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java @@ -321,6 +321,7 @@ public class SysdynResource { public final Resource Charts_SensitivityPlot; public final Resource Cloud; public final Resource CloudSymbol; + public final Resource Component; public final Resource Configuration; public final Resource ConfigurationDiagram; public final Resource ConfigurationDiagramTemplate; @@ -643,6 +644,8 @@ public class SysdynResource { public final Resource Validations_Issue_stringContexts_Inverse; public final Resource Validations_MissingDependencyConstraint; public final Resource Validations_MissingLinkIssue; + public final Resource Validations_ModuleInputUnitWarning; + public final Resource Validations_ModuleOutputUnitWarning; public final Resource Validations_NoSuchVariableIssue; public final Resource Validations_RangeIssue; public final Resource Validations_RangeWarning; @@ -650,6 +653,9 @@ public class SysdynResource { public final Resource Validations_UnitWarning; public final Resource Validations_Units; public final Resource Validations_Units_UnitIssueSource; + public final Resource Validations_Units_moduleInputUnitWarningDescription; + public final Resource Validations_Units_moduleInterfaceExtension; + public final Resource Validations_Units_moduleOutputUnitWarningDescription; public final Resource Validations_Units_unitValidator; public final Resource Validations_Units_unitWarningDescription; public final Resource Validations_UnusedDependencyIssue; @@ -1015,6 +1021,7 @@ public class SysdynResource { public static final String Charts_SensitivityPlot = "http://www.simantics.org/Sysdyn-1.1/Charts/SensitivityPlot"; public static final String Cloud = "http://www.simantics.org/Sysdyn-1.1/Cloud"; public static final String CloudSymbol = "http://www.simantics.org/Sysdyn-1.1/CloudSymbol"; + public static final String Component = "http://www.simantics.org/Sysdyn-1.1/Component"; public static final String Configuration = "http://www.simantics.org/Sysdyn-1.1/Configuration"; public static final String ConfigurationDiagram = "http://www.simantics.org/Sysdyn-1.1/ConfigurationDiagram"; public static final String ConfigurationDiagramTemplate = "http://www.simantics.org/Sysdyn-1.1/ConfigurationDiagramTemplate"; @@ -1337,6 +1344,8 @@ public class SysdynResource { public static final String Validations_Issue_stringContexts_Inverse = "http://www.simantics.org/Sysdyn-1.1/Validations/Issue/stringContexts/Inverse"; public static final String Validations_MissingDependencyConstraint = "http://www.simantics.org/Sysdyn-1.1/Validations/MissingDependencyConstraint"; public static final String Validations_MissingLinkIssue = "http://www.simantics.org/Sysdyn-1.1/Validations/MissingLinkIssue"; + public static final String Validations_ModuleInputUnitWarning = "http://www.simantics.org/Sysdyn-1.1/Validations/ModuleInputUnitWarning"; + public static final String Validations_ModuleOutputUnitWarning = "http://www.simantics.org/Sysdyn-1.1/Validations/ModuleOutputUnitWarning"; public static final String Validations_NoSuchVariableIssue = "http://www.simantics.org/Sysdyn-1.1/Validations/NoSuchVariableIssue"; public static final String Validations_RangeIssue = "http://www.simantics.org/Sysdyn-1.1/Validations/RangeIssue"; public static final String Validations_RangeWarning = "http://www.simantics.org/Sysdyn-1.1/Validations/RangeWarning"; @@ -1344,6 +1353,9 @@ public class SysdynResource { public static final String Validations_UnitWarning = "http://www.simantics.org/Sysdyn-1.1/Validations/UnitWarning"; public static final String Validations_Units = "http://www.simantics.org/Sysdyn-1.1/Validations/Units"; public static final String Validations_Units_UnitIssueSource = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/UnitIssueSource"; + public static final String Validations_Units_moduleInputUnitWarningDescription = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/moduleInputUnitWarningDescription"; + public static final String Validations_Units_moduleInterfaceExtension = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/moduleInterfaceExtension"; + public static final String Validations_Units_moduleOutputUnitWarningDescription = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/moduleOutputUnitWarningDescription"; public static final String Validations_Units_unitValidator = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/unitValidator"; public static final String Validations_Units_unitWarningDescription = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/unitWarningDescription"; public static final String Validations_UnusedDependencyIssue = "http://www.simantics.org/Sysdyn-1.1/Validations/UnusedDependencyIssue"; @@ -1719,6 +1731,7 @@ public class SysdynResource { Charts_SensitivityPlot = getResourceOrNull(graph, URIs.Charts_SensitivityPlot); Cloud = getResourceOrNull(graph, URIs.Cloud); CloudSymbol = getResourceOrNull(graph, URIs.CloudSymbol); + Component = getResourceOrNull(graph, URIs.Component); Configuration = getResourceOrNull(graph, URIs.Configuration); ConfigurationDiagram = getResourceOrNull(graph, URIs.ConfigurationDiagram); ConfigurationDiagramTemplate = getResourceOrNull(graph, URIs.ConfigurationDiagramTemplate); @@ -2041,6 +2054,8 @@ public class SysdynResource { Validations_Issue_stringContexts_Inverse = getResourceOrNull(graph, URIs.Validations_Issue_stringContexts_Inverse); Validations_MissingDependencyConstraint = getResourceOrNull(graph, URIs.Validations_MissingDependencyConstraint); Validations_MissingLinkIssue = getResourceOrNull(graph, URIs.Validations_MissingLinkIssue); + Validations_ModuleInputUnitWarning = getResourceOrNull(graph, URIs.Validations_ModuleInputUnitWarning); + Validations_ModuleOutputUnitWarning = getResourceOrNull(graph, URIs.Validations_ModuleOutputUnitWarning); Validations_NoSuchVariableIssue = getResourceOrNull(graph, URIs.Validations_NoSuchVariableIssue); Validations_RangeIssue = getResourceOrNull(graph, URIs.Validations_RangeIssue); Validations_RangeWarning = getResourceOrNull(graph, URIs.Validations_RangeWarning); @@ -2048,6 +2063,9 @@ public class SysdynResource { Validations_UnitWarning = getResourceOrNull(graph, URIs.Validations_UnitWarning); Validations_Units = getResourceOrNull(graph, URIs.Validations_Units); Validations_Units_UnitIssueSource = getResourceOrNull(graph, URIs.Validations_Units_UnitIssueSource); + Validations_Units_moduleInputUnitWarningDescription = getResourceOrNull(graph, URIs.Validations_Units_moduleInputUnitWarningDescription); + Validations_Units_moduleInterfaceExtension = getResourceOrNull(graph, URIs.Validations_Units_moduleInterfaceExtension); + Validations_Units_moduleOutputUnitWarningDescription = getResourceOrNull(graph, URIs.Validations_Units_moduleOutputUnitWarningDescription); Validations_Units_unitValidator = getResourceOrNull(graph, URIs.Validations_Units_unitValidator); Validations_Units_unitWarningDescription = getResourceOrNull(graph, URIs.Validations_Units_unitWarningDescription); Validations_UnusedDependencyIssue = getResourceOrNull(graph, URIs.Validations_UnusedDependencyIssue); diff --git a/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF b/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF index 37de08ac..e4d2ebbc 100644 --- a/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF +++ b/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF @@ -55,7 +55,8 @@ Require-Bundle: org.simantics.layer0.utils;bundle-version="0.6.2", org.simantics.scenegraph.swing;bundle-version="1.0.0", org.eclipse.nebula.widgets.tablecombo;bundle-version="1.0.0", org.simantics.fmu;bundle-version="1.0.0", - org.simantics.jfreechart;bundle-version="1.0.0" + org.simantics.jfreechart;bundle-version="1.0.0", + org.simantics.db.indexing;bundle-version="1.1.0" Bundle-Activator: org.simantics.sysdyn.ui.Activator Bundle-ActivationPolicy: lazy Export-Package: org.simantics.sysdyn.ui.browser.nodes diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements/profiles/IssueDecorationStyle.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements/profiles/IssueDecorationStyle.java index a0289d2d..e3db689f 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements/profiles/IssueDecorationStyle.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements/profiles/IssueDecorationStyle.java @@ -127,7 +127,7 @@ public class IssueDecorationStyle extends StyleBase { list = graph.getPossibleObject(issueResource, ISSUE.Issue_HasContexts); List contexts = ListUtils.toList(graph, list); if(!contexts.isEmpty()) { - if(ListUtils.toList(graph, list).get(0).equals(component)) { + if(ListUtils.toList(graph, list).subList(0, 1).contains(component)) { return new IssueResult(severity, transform); } } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java index 8d5befed..2664e975 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java @@ -21,21 +21,19 @@ import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Session; import org.simantics.db.WriteGraph; -import org.simantics.db.common.changeset.GenericChangeListener; import org.simantics.db.common.request.ReadRequest; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.adapter.RuntimeValuations; import org.simantics.db.layer0.adapter.TrendVariable; -import org.simantics.db.layer0.genericrelation.DependenciesRelation.DependencyChangesRequest; -import org.simantics.db.layer0.genericrelation.DependencyChanges; import org.simantics.db.layer0.service.ActivationManager; import org.simantics.db.request.Read; import org.simantics.db.service.GraphChangeListenerSupport; import org.simantics.db.service.VirtualGraphSupport; +import org.simantics.fmu.FMUControlJNI; import org.simantics.issues.common.IssueUtils; import org.simantics.layer0.Layer0; -import org.simantics.fmu.FMUControlJNI; +import org.simantics.modeling.ModelingUtils; import org.simantics.modeling.services.CaseInsensitiveComponentNamingStrategy2; import org.simantics.modeling.services.ComponentNamingStrategy; import org.simantics.project.IProject; @@ -248,20 +246,23 @@ public class SysdynProject extends AbstractProjectFeature { public void onActivated(final ReadGraph graph, final IProject project) throws DatabaseException { - GraphChangeListenerSupport changeSupport = graph.getService(GraphChangeListenerSupport.class); - changeSupport.addMetadataListener(new GenericChangeListener() { - - @Override - public void onEvent(ReadGraph graph, DependencyChanges event) throws DatabaseException { - - WriteGraph w = (WriteGraph)graph; - w.addMetadata(event); - - } - - }); +// GraphChangeListenerSupport changeSupport = graph.getService(GraphChangeListenerSupport.class); +// changeSupport.addMetadataListener(new GenericChangeListener() { +// +// @Override +// public void onEvent(ReadGraph graph, DependencyChanges event) throws DatabaseException { +// +// WriteGraph w = (WriteGraph)graph; +// w.addMetadata(event); +// +// } +// +// }); IssueUtils.listenActiveProjectIssueSources(graph, project.get()); + + ModelingUtils.trackDependencies(graph); + } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java index 4758261b..477c6086 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java @@ -210,6 +210,9 @@ public class ConfigurationTab extends LabelPropertyTabContributor { new PossibleObjectWithType(model, Layer0X.getInstance(graph).Activates, SysdynResource.getInstance(graph).Validations_Units_UnitIssueSource)); + if(unitIssueSource == null) + return false; + Boolean result = graph.getPossibleRelatedValue(unitIssueSource, IssueResource.getInstance(graph).IssueSource_active, Bindings.BOOLEAN); return Boolean.TRUE.equals(result); } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/InputVariableTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/InputVariableTab.java index 9578e18b..5cccc191 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/InputVariableTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/InputVariableTab.java @@ -35,6 +35,7 @@ import org.simantics.db.management.ISessionContext; import org.simantics.layer0.Layer0; import org.simantics.sysdyn.SysdynResource; import org.simantics.sysdyn.ui.properties.widgets.IsOutputWidget; +import org.simantics.sysdyn.ui.properties.widgets.UnitComboWidget; import org.simantics.sysdyn.ui.properties.widgets.factories.DoublePropertyFactory; import org.simantics.sysdyn.ui.properties.widgets.factories.DoublePropertyModifier; import org.simantics.sysdyn.ui.properties.widgets.factories.VariableNamePropertyModifier; @@ -76,6 +77,19 @@ public class InputVariableTab extends LabelPropertyTabContributor { defaultValue.setInputValidator(new DoubleValidator()); GridDataFactory.fillDefaults().grab(true, false).applyTo(defaultValue.getWidget()); + + Composite unitComposite = new Composite(composite, SWT.NONE); + GridDataFactory.fillDefaults().applyTo(unitComposite); + GridLayoutFactory.fillDefaults().numColumns(2).applyTo(unitComposite); + + label = new Label(unitComposite, SWT.NULL ); + label.setText("Unit:"); + GridDataFactory.fillDefaults().applyTo(label); + + TrackedCombo unitCombo = new UnitComboWidget(unitComposite, support, SWT.DROP_DOWN | SWT.BORDER); + GridDataFactory.fillDefaults().grab(true, false).applyTo(unitCombo.getWidget()); + + Composite variabilityComposite = new Composite(composite, SWT.NONE); GridDataFactory.fillDefaults().grab(false, true).applyTo(variabilityComposite); GridLayoutFactory.fillDefaults().numColumns(2).applyTo(variabilityComposite); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/UnitComboWidget.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/UnitComboWidget.java new file mode 100644 index 00000000..d2a770fc --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/UnitComboWidget.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright (c) 2013 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 v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Semantum Oy - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.properties.widgets; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.swt.widgets.Composite; +import org.simantics.browsing.ui.swt.widgets.TrackedCombo; +import org.simantics.browsing.ui.swt.widgets.impl.ComboModifyListenerImpl; +import org.simantics.browsing.ui.swt.widgets.impl.ReadFactoryImpl; +import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.layer0.Layer0; +import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.manager.SysdynModel; +import org.simantics.sysdyn.manager.SysdynModelManager; + +public class UnitComboWidget extends TrackedCombo { + + public UnitComboWidget(Composite parent, WidgetSupport support, int style) { + super(parent, support, style); + + + // Add all units used in the model to the unit combo + setItemFactory(new ReadFactoryImpl>() { + + @Override + public Map perform(ReadGraph graph, final Resource input) throws DatabaseException { + Map map = new HashMap(); + + SysdynResource sr = SysdynResource.getInstance(graph); + Layer0 l0 = Layer0.getInstance(graph); + Resource model = graph.getPossibleObject(input, l0.PartOf); + if (model != null) { + Collection variables = graph.getObjects(model, l0.ConsistsOf); + for(Resource v : variables) { + Object unit = graph.getPossibleRelatedValue(v, sr.Variable_unit); + if (unit != null && !map.keySet().contains(unit)) { + map.put((String)unit, (String)unit); + + } + } + } + return map; + } + }); + + // Set initial selection of unit combo + setSelectionFactory(new ReadFactoryImpl() { + + @Override + public String perform(ReadGraph graph, final Resource input) throws DatabaseException { + String unit = graph.getPossibleRelatedValue(input, SysdynResource.getInstance(graph).Variable_unit); + if(unit == null) + return ""; + else + return unit; + } + }); + + // Modify unit + addModifyListener(new ComboModifyListenerImpl() { + + @Override + public void applyText(WriteGraph graph, Resource input, String text) throws DatabaseException { + graph.denyValue(input, SysdynResource.getInstance(graph).Variable_unit); + graph.claimLiteral(input, SysdynResource.getInstance(graph).Variable_unit, text); + + Resource conf = graph.getPossibleObject(input, Layer0.getInstance(graph).PartOf); + SysdynModelManager smm = SysdynModelManager.getInstance(graph.getSession()); + SysdynModel sm = smm.getModel(graph, conf); + sm.getMapping().domainModified(input); + sm.update(graph); + } + }); + + } + + + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java index 8e4833b3..f9e47fef 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java @@ -103,8 +103,8 @@ public class ModelUtils { L0X.IsActivatedBy, model, l0.PartOf, model, IssueResource.getInstance(g).IssueSource_active, false - ); - + ); + Resource conf = GraphUtils.create2(g, sr.Configuration, l0.PartOf, model, diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/ModuleStandardIssue.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/ModuleStandardIssue.java new file mode 100644 index 00000000..4cbdf730 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/ModuleStandardIssue.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2013 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 v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Semantum Oy - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.validation; + +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.issue.StandardIssue; +import org.simantics.db.exception.DatabaseException; +import org.simantics.issues.ontology.IssueResource; + +public class ModuleStandardIssue extends StandardIssue { + + public ModuleStandardIssue(Resource type, Resource ... contexts) { + super(type, contexts); + } + + @Override + public void writeAdditionalContext(WriteGraph graph, Resource issue) throws DatabaseException { + super.writeAdditionalContext(graph, issue); + + if(contexts.length >= 2) { + IssueResource IR = IssueResource.getInstance(graph); + // Input / output context + graph.claim(issue, IR.Issue_HasContext, IR.Issue_HasContext_Inverse, contexts[1]); + } + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java index f8e5839b..c01fbadf 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java @@ -12,14 +12,19 @@ package org.simantics.sysdyn.ui.validation; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import org.simantics.Simantics; import org.simantics.db.Issue; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.issue.StandardIssue; +import org.simantics.db.common.request.ObjectsWithType; import org.simantics.db.common.utils.ListUtils; +import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.variable.Variable; import org.simantics.issues.common.IssueUtils; @@ -30,40 +35,49 @@ import org.simantics.sysdyn.manager.SysdynModel; import org.simantics.sysdyn.manager.SysdynModelManager; import org.simantics.sysdyn.representation.IndependentVariable; import org.simantics.sysdyn.representation.expressions.IExpression; +import org.simantics.sysdyn.representation.utils.UnitUtils; public class UnitFunction { - + @SCLValue(type = "ReadGraph -> Resource -> [Issue]") - public static List unitValidator(ReadGraph graph, Resource independentVariable) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); + public static List unitValidator(ReadGraph graph, Resource component) throws DatabaseException { SysdynResource SR = SysdynResource.getInstance(graph); - - - if(independentVariable == null) + if(graph.isInstanceOf(component, SR.Variable)) + return variableValidator(graph, component); + else if(graph.isInstanceOf(component, SR.Module)) + return moduleValidator(graph, component); + else return Collections.emptyList(); - - Resource configuration = graph.getPossibleObject(independentVariable, L0.PartOf); + } + + private static List variableValidator(ReadGraph graph, Resource variable) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + SysdynResource SR = SysdynResource.getInstance(graph); + + Resource configuration = graph.getPossibleObject(variable, L0.PartOf); if(configuration == null) return Collections.emptyList(); - + // Make sure unit updates are listened to - Resource unitResource = graph.getPossibleObject(independentVariable, SR.Variable_unit); - String unit = graph.getPossibleRelatedValue(independentVariable, SR.Variable_unit); + String unit = graph.getPossibleRelatedValue(variable, SR.Variable_unit); if(unit == null || unit.trim().length() == 0) - return Collections.singletonList(new StandardIssue(SR.Validations_UnitWarning, independentVariable)); - - Resource expressionList = graph.getPossibleObject(independentVariable, SR.Variable_expressionList); + return Collections.singletonList(new StandardIssue(SR.Validations_UnitWarning, variable)); + + if(!graph.isInstanceOf(variable, SR.IndependentVariable)) + return Collections.emptyList(); + Resource expressionList = graph.getPossibleObject(variable, SR.Variable_expressionList); + if(expressionList == null) return Collections.emptyList(); - + SysdynModelManager smm = SysdynModelManager.getInstance(graph.getSession()); SysdynModel sm = smm.getModel(graph, configuration); - sm.getMapping().domainModified(independentVariable); + sm.getMapping().domainModified(variable); sm.update(graph); - Object var = sm.getMapping().get(independentVariable); + Object var = sm.getMapping().get(variable); ArrayList issues = new ArrayList(); @@ -71,54 +85,196 @@ public class UnitFunction { for(Resource r : graph.getObjects(expression, SR.Expression_equation)) { graph.getValue(r); } - + sm.getMapping().domainModified(expression); sm.update(graph); - + Object expr = sm.getMapping().get(expression); if(expr != null && var != null && expr instanceof IExpression && var instanceof IndependentVariable) { String result = ((IExpression)expr).validateUnits(graph, sm); if(result != null) { - Issue issue = new StandardIssue(SR.Validations_UnitWarning, independentVariable, expression, unitResource); + Issue issue = new StandardIssue(SR.Validations_UnitWarning, variable, expression, graph.getPossibleObject(variable, SR.Variable_unit)); issues.add(issue); } } } + return issues; + } + + private static List moduleValidator(ReadGraph graph, Resource module) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + SysdynResource SR = SysdynResource.getInstance(graph); + + if(module == null) + return Collections.emptyList(); + + Resource configuration = graph.getPossibleObject(module, L0.PartOf); + if(configuration == null) + return Collections.emptyList(); + String result = null; + ArrayList issues = new ArrayList(); + for(Resource outputRelation : graph.getObjects(module, SR.Variable_isTailOf)) { + Resource reference = graph.getPossibleObject(outputRelation, SR.Dependency_refersTo); + if(reference != null) { + Resource output = graph.getPossibleObject(outputRelation, SR.Variable_HasHead); + String left = graph.getPossibleRelatedValue(output, SR.Variable_unit); + String right = graph.getPossibleRelatedValue(reference, SR.Variable_unit); + result = UnitUtils.matchUnits(left, right); + if(result != null) + issues.add(new ModuleStandardIssue(SR.Validations_ModuleOutputUnitWarning, module, output, reference)); + } + } + for(Resource inputRelation : graph.getObjects(module, SR.Variable_isHeadOf)) { + Resource reference = graph.getPossibleObject(inputRelation, SR.Dependency_refersTo); + if(reference != null) { + Resource variable = graph.getPossibleObject(inputRelation, SR.Variable_HasTail); + String left = graph.getPossibleRelatedValue(variable, SR.Variable_unit); + String right = graph.getPossibleRelatedValue(reference, SR.Variable_unit); + result = UnitUtils.matchUnits(left, right); + if(result != null) + issues.add(new ModuleStandardIssue(SR.Validations_ModuleInputUnitWarning, module, variable, reference)); + } + } return issues; } + @SCLValue(type = "ReadGraph -> Resource -> Variable -> String") public static String unitWarningDescription(ReadGraph graph, Resource converter, Variable property) throws DatabaseException { List contexts = IssueUtils.getContextsForProperty(graph, property); - + if(contexts.size() == 0) return "Error, No contexts"; - + Resource variable = contexts.get(0); String unit = graph.getPossibleRelatedValue(variable, SysdynResource.getInstance(graph).Variable_unit); if(unit == null || unit.length() == 0) return "No unit defined"; + if(contexts.size() < 2) + return "Error, not enough contexts"; + Layer0 L0 = Layer0.getInstance(graph); Resource configuration = graph.getPossibleObject(variable, L0.PartOf); if(configuration == null) return "Error, No Confiugration"; - + SysdynModelManager smm = SysdynModelManager.getInstance(graph.getSession()); SysdynModel sm = smm.getModel(graph, configuration); - + SysdynResource SR = SysdynResource.getInstance(graph); for(Resource r : graph.getObjects(contexts.get(1), SR.Expression_equation)) { graph.getValue(r); } - + Object expr = sm.getMapping().get(contexts.get(1)); String result = ((IExpression)expr).validateUnits(graph, sm); + return result; } + @SCLValue(type = "ReadGraph -> Resource -> Variable -> String") + public static String moduleOutputUnitWarningDescription(ReadGraph graph, Resource converter, Variable property) throws DatabaseException { + List contexts = IssueUtils.getContextsForProperty(graph, property); + + if(contexts.size() < 3) + return "Error, No contexts"; + + Resource output = contexts.get(1); + Resource reference = contexts.get(2); + + return moduleInterfaceDescription(graph, output, reference, "Module output has different unit. (", ")"); + + } + + @SCLValue(type = "ReadGraph -> Resource -> Variable -> String") + public static String moduleInputUnitWarningDescription(ReadGraph graph, Resource converter, Variable property) throws DatabaseException { + List contexts = IssueUtils.getContextsForProperty(graph, property); + + if(contexts.size() < 3) + return "Error, No contexts"; + + Resource output = contexts.get(1); + Resource reference = contexts.get(2); + + return moduleInterfaceDescription(graph, output, reference, "Module input has different unit. (", ")"); + + } + + private static String moduleInterfaceDescription(ReadGraph graph, Resource leftResource, Resource rightResource, String prefix, String suffix) throws DatabaseException { + if(leftResource == null) + return "Erroneus error: left == null"; + + if(rightResource == null) + return "Erroneus error: right == null"; + + SysdynResource SR = SysdynResource.getInstance(graph); + + String left = graph.getPossibleRelatedValue(leftResource, SR.Variable_unit); + if(left == null || left.isEmpty()) + return "No unit defined for " + NameUtils.getSafeName(graph, leftResource); + + String right = graph.getPossibleRelatedValue(rightResource, SR.Variable_unit); + if(right == null || right.isEmpty()) + return "No unit defined for " + NameUtils.getSafeName(graph, rightResource); + + String result = UnitUtils.matchUnits(left, right); + + if(result != null) + result = prefix + result + suffix; + + return result; + } + + + + + @SCLValue(type = "ReadGraph -> [Resource] -> [Resource]") + public static List moduleInterfaceExtension(ReadGraph graph, List rs) throws DatabaseException { + SysdynResource SR = SysdynResource.getInstance(graph); + + HashSet components = new HashSet(); + HashSet searchedModuleTypes = new HashSet(); + for(Resource r : rs) { + if(!graph.isInstanceOf(r, SR.Variable)) + continue; + + if(graph.isInstanceOf(r, SR.Input)) { + Resource connection = graph.getPossibleObject(r, SR.Variable_isHeadOf); + if(connection != null) + components.add(graph.getPossibleObject(connection, SR.Variable_HasTail)); + } + + for(Resource connection : graph.getObjects(r, SR.Variable_isTailOf)) { + Resource head = graph.getPossibleObject(connection, SR.Variable_HasHead); + if(graph.isInstanceOf(head, SR.Module)) { + components.add(head); + } + } + + Layer0 L0 = Layer0.getInstance(graph); + Resource configuration = graph.getPossibleObject(r, L0.PartOf); + Resource possibleModule = graph.getPossibleObject(configuration, L0.PartOf); + if(graph.isInheritedFrom(possibleModule, SR.Module) && !searchedModuleTypes.contains(possibleModule)) { + searchedModuleTypes.add(possibleModule); + for(Resource model : graph.syncRequest(new ObjectsWithType(Simantics.getProject().get(), L0.ConsistsOf, SR.SysdynModel))) { + Collection found = org.simantics.db.indexing.IndexUtils.findByType(graph, model, possibleModule); + components.addAll(found); + } + } + + } + + if(!components.isEmpty()) { + rs.addAll(components); + } + + return rs; + + } + } \ No newline at end of file diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java index 668c83fe..732509d9 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java @@ -18,6 +18,7 @@ import java.util.Set; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.ManyObjectsForFunctionalRelationException; import org.simantics.db.exception.ServiceException; import org.simantics.simulation.ontology.SimulationResource; @@ -175,5 +176,38 @@ public class UnitUtils { } } } + + + public static String matchUnits(String left, String right) throws DatabaseException { + if(left == null || right == null || left.isEmpty() || right.isEmpty()) + return "No unit defined"; + + try { + + StringReader leftReader = new StringReader(left); + UnitParser leftParser = new UnitParser(leftReader); + UnitCheckingNode leftNode = (UnitCheckingNode) leftParser.expr(); + leftReader.close(); + + StringReader rightReader = new StringReader(right); + UnitParser rightParser = new UnitParser(rightReader); + UnitCheckingNode rightNode = (UnitCheckingNode) rightParser.expr(); + rightReader.close(); + + try { + UnitResult leftUnits = leftNode.getUnits(null); + UnitResult rightUnits = rightNode.getUnits(null); + + if(!rightUnits.equals(leftUnits)) + return leftUnits.getCleanFullUnit() + " != " + rightUnits.getCleanFullUnit(); + } catch (UnitCheckingException e) { + return e.getMessage(); + } + + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } } -- 2.47.1