]> gerrit.simantics Code Review - simantics/sysdyn.git/commitdiff
Unit equivalents to Sysdyn unit parser (refs #4628).
authormiettinen <miettinen@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Fri, 17 Jan 2014 06:28:17 +0000 (06:28 +0000)
committermiettinen <miettinen@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Fri, 17 Jan 2014 06:28:17 +0000 (06:28 +0000)
Allow %, $, £, and euro symbols, as well as greek letters in unit parser (refs #4425).

git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@28650 ac1ea38d-2e2b-0410-8846-a27921b304fc

26 files changed:
org.simantics.sysdyn.ontology/graph.tg
org.simantics.sysdyn.ontology/graph/Validation.pgraph
org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java
org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java
org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/EquivalentUnitsWidget.java [new file with mode: 0644]
org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java
org.simantics.sysdyn/src/org/simantics/sysdyn/TestParser.java
org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNode.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jjt
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/AddOp.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Arithmetic.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/ArrayDefinition.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/ComponentReferenceFull.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Divide.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Factor.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/ForIndex.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/FunctionCall.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/IfThenElse.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Multiplication.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Power.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/RelOp.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Relation.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Term.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/UnitResult.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Value.java

index 27edbee88049cbfcdf0649ef11d89f8fc0a5b046..afa595a6e4d2dfbdce0ff3b4c4f8fb787af6c971 100644 (file)
Binary files a/org.simantics.sysdyn.ontology/graph.tg and b/org.simantics.sysdyn.ontology/graph.tg differ
index 6d4fb228c232eb0e960154b9513fb5197cca9581..cfa53e0be33a6f7b629e1451096ea8923c31b470 100644 (file)
@@ -34,7 +34,6 @@ VALIDATIONS.Units.unitValidator : L0.Function
 VALIDATIONS.Units.moduleInterfaceExtension : L0.Function\r
 \r
 \r
-\r
 SYSDYN.Variable\r
     @VALIDATIONS.constraint\r
         VALIDATIONS.ExpressionConstraint\r
@@ -67,11 +66,15 @@ SYSDYN.Variable
         VALIDATIONS.Dependencies.missingDependencyValidator  \r
         VALIDATIONS.Functions.baseRealizationFunction \r
 \r
+VALIDATIONS.Units.UnitIssueSource\r
+    >-- VALIDATIONS.Units.UnitIssueSource.allowEquivalents >-- L0.Boolean <R L0.HasProperty : L0.FunctionalRelation\r
+\r
 SYSDYN.Component\r
     @VALIDATIONS.listeningConstraint\r
         VALIDATIONS.UnitConstraint\r
         VALIDATIONS.Units.UnitIssueSource\r
             @L0.assert L0.HasName "UnitIssueSource"\r
+            @L0.assert VALIDATIONS.Units.UnitIssueSource.allowEquivalents L0.True\r
             L0.Asserts _ : L0.Assertion\r
                 L0.HasPredicate ISSUE.Sources.DependencyTracker.HasExtension\r
                 L0.HasObject VALIDATIONS.Units.moduleInterfaceExtension\r
index d5f9e0c517dbb5fc02698206d8c07b57c8e00e72..4c872803d52546f308316a0fbe079a2480b4d55a 100644 (file)
@@ -716,6 +716,8 @@ public class SysdynResource {
     public final Resource Validations_UnitWarning;\r
     public final Resource Validations_Units;\r
     public final Resource Validations_Units_UnitIssueSource;\r
+    public final Resource Validations_Units_UnitIssueSource_allowEquivalents;\r
+    public final Resource Validations_Units_UnitIssueSource_allowEquivalents_Inverse;\r
     public final Resource Validations_Units_moduleInputUnitWarningDescription;\r
     public final Resource Validations_Units_moduleInterfaceExtension;\r
     public final Resource Validations_Units_moduleOutputUnitWarningDescription;\r
@@ -1479,6 +1481,8 @@ public class SysdynResource {
         public static final String Validations_UnitWarning = "http://www.simantics.org/Sysdyn-1.1/Validations/UnitWarning";\r
         public static final String Validations_Units = "http://www.simantics.org/Sysdyn-1.1/Validations/Units";\r
         public static final String Validations_Units_UnitIssueSource = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/UnitIssueSource";\r
+        public static final String Validations_Units_UnitIssueSource_allowEquivalents = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/UnitIssueSource/allowEquivalents";\r
+        public static final String Validations_Units_UnitIssueSource_allowEquivalents_Inverse = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/UnitIssueSource/allowEquivalents/Inverse";\r
         public static final String Validations_Units_moduleInputUnitWarningDescription = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/moduleInputUnitWarningDescription";\r
         public static final String Validations_Units_moduleInterfaceExtension = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/moduleInterfaceExtension";\r
         public static final String Validations_Units_moduleOutputUnitWarningDescription = "http://www.simantics.org/Sysdyn-1.1/Validations/Units/moduleOutputUnitWarningDescription";\r
@@ -2252,6 +2256,8 @@ public class SysdynResource {
         Validations_UnitWarning = getResourceOrNull(graph, URIs.Validations_UnitWarning);\r
         Validations_Units = getResourceOrNull(graph, URIs.Validations_Units);\r
         Validations_Units_UnitIssueSource = getResourceOrNull(graph, URIs.Validations_Units_UnitIssueSource);\r
+        Validations_Units_UnitIssueSource_allowEquivalents = getResourceOrNull(graph, URIs.Validations_Units_UnitIssueSource_allowEquivalents);\r
+        Validations_Units_UnitIssueSource_allowEquivalents_Inverse = getResourceOrNull(graph, URIs.Validations_Units_UnitIssueSource_allowEquivalents_Inverse);\r
         Validations_Units_moduleInputUnitWarningDescription = getResourceOrNull(graph, URIs.Validations_Units_moduleInputUnitWarningDescription);\r
         Validations_Units_moduleInterfaceExtension = getResourceOrNull(graph, URIs.Validations_Units_moduleInterfaceExtension);\r
         Validations_Units_moduleOutputUnitWarningDescription = getResourceOrNull(graph, URIs.Validations_Units_moduleOutputUnitWarningDescription);\r
index 5195293275d1e3286a31899d196f91711257ec79..e1efedb3dd4a196836d16a947cb562bfadc671c1 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2010, 2012 Association for Decentralized Information Management in\r
+ * Copyright (c) 2010, 2012, 2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -43,6 +43,7 @@ import org.simantics.issues.ontology.IssueResource;
 import org.simantics.layer0.Layer0;\r
 import org.simantics.operation.Layer0X;\r
 import org.simantics.sysdyn.SysdynResource;\r
+import org.simantics.sysdyn.ui.properties.widgets.EquivalentUnitsWidget;\r
 import org.simantics.sysdyn.ui.properties.widgets.factories.ComboStringPropertyModifier;\r
 import org.simantics.sysdyn.ui.properties.widgets.factories.DoublePropertyFactory;\r
 import org.simantics.sysdyn.ui.properties.widgets.factories.DoublePropertyModifier;\r
@@ -52,17 +53,19 @@ import org.simantics.sysdyn.ui.properties.widgets.factories.ModelNameInputValida
  * Tab displaying configuration properties. Displayed for model and configuration.\r
  * \r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class ConfigurationTab extends AdjustableTab {\r
 \r
-       ScrolledComposite sc;\r
-       Composite composite;\r
-       Label nameLabel, startTimeLabel, stopTimeLabel, stepLengthLabel, \r
+       private ScrolledComposite sc;\r
+       private Composite composite;\r
+       private Label nameLabel, startTimeLabel, stopTimeLabel, stepLengthLabel, \r
                outputIntervalLabel, methodLabel, toleranceLabel, variableFilterLabel;\r
-       TrackedText name, startTime, stopTime, stepLength, outputInterval, tolerance, variableFilter;\r
-       TrackedCombo method, timeUnit;\r
-       Button validateUnits;\r
+       private TrackedText name, startTime, stopTime, stepLength, outputInterval, tolerance, variableFilter;\r
+       private TrackedCombo method, timeUnit;\r
+       private Button validateUnits;\r
+       private EquivalentUnitsWidget equivalentUnitsWidget;\r
     /**\r
      * Modifier for modifying model labels\r
      * @author Teemu Lempinen\r
@@ -200,9 +203,24 @@ public class ConfigurationTab extends AdjustableTab {
                 if(result == null)\r
                     result = false;\r
                 graph.claimLiteral(unitIssueSource, ISSUE.IssueSource_active, Boolean.FALSE.equals(result));\r
+                \r
+                // Enable or disable the Unit Equivalents button based if\r
+                // unit validation is enabled or not.\r
+                final boolean enabled = !result;\r
+                if (!equivalentUnitsWidget.getWidget().isDisposed())\r
+                       equivalentUnitsWidget.getWidget().getDisplay().asyncExec(new Runnable() {\r
+                                               \r
+                                               @Override\r
+                                               public void run() {\r
+                                                       if(!equivalentUnitsWidget.getWidget().isDisposed())\r
+                                                               equivalentUnitsWidget.getWidget().setEnabled(enabled);\r
+                                               }\r
+                                       });\r
+\r
             }\r
             \r
         });\r
+        equivalentUnitsWidget = new EquivalentUnitsWidget(composite, support, 0);\r
         \r
         timeUnit = new TrackedCombo(composite, support, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);\r
         timeUnit.setItemFactory(new ReadFactoryImpl<Resource, Map<String,Object>>() {\r
diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/EquivalentUnitsWidget.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/EquivalentUnitsWidget.java
new file mode 100644 (file)
index 0000000..1310655
--- /dev/null
@@ -0,0 +1,143 @@
+/*******************************************************************************\r
+ * Copyright (c) 2014 Association for Decentralized Information Management in\r
+ * Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.sysdyn.ui.properties.widgets;\r
+\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.simantics.browsing.ui.swt.widgets.impl.SelectionListenerImpl;\r
+import org.simantics.browsing.ui.swt.widgets.impl.Widget;\r
+import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.PossibleObjectWithType;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.management.ISessionContext;\r
+import org.simantics.issues.ontology.IssueResource;\r
+import org.simantics.operation.Layer0X;\r
+import org.simantics.sysdyn.SysdynResource;\r
+import org.simantics.utils.ui.ISelectionUtils;\r
+\r
+/**\r
+ * Widget for equivalent units selection.\r
+ * @author Tuomas Miettinen\r
+ *\r
+ */\r
+public class EquivalentUnitsWidget implements Widget{\r
+\r
+    Resource model = null; \r
+    org.simantics.browsing.ui.swt.widgets.Button unitEquivalents;\r
+    \r
+    public EquivalentUnitsWidget(Composite parent, WidgetSupport support, int style) {\r
+        support.register(this);\r
+        unitEquivalents = new org.simantics.browsing.ui.swt.widgets.Button(parent, support, style |= SWT.CHECK);\r
+        unitEquivalents.setText("Unit equivalents");\r
+        unitEquivalents.getWidget().setToolTipText("Supported equivalent units:\n" +\r
+                       "$, $s, dollar, dollars, usd\n"+\r
+                       "\u20ac, \u20acs, eur, euro, euros, e, ecu\n"+\r
+                       "£, £s, pound, pounds, gbp\n"+\r
+                       "Unit, Units\n"+\r
+                       "Person, People, Persons\n"+\r
+                       "second, seconds, sec, s\n"+\r
+                       "minute, minutes, min\n"+\r
+                       "hour, hours, h, hr\n"+\r
+                       "day, days, d\n"+\r
+                       "month, months, mon, mth, mo, mos\n"+\r
+                       "year, years, a, y, yr");\r
+        \r
+    }\r
+\r
+    @Override\r
+    public void setInput(ISessionContext context, Object input) {\r
+        if(input instanceof ISelection) {\r
+            ISelection selection = (ISelection)input;\r
+            if(selection instanceof IStructuredSelection) {\r
+                Resource resource = ISelectionUtils.filterSingleSelection(selection, Resource.class);\r
+                if(resource != null) {\r
+                    model = resource;\r
+                }\r
+            }\r
+        }\r
+        \r
+        if(model == null) return;\r
+        \r
+        try {\r
+            context.getSession().syncRequest(new ReadRequest() {\r
+                \r
+                @Override\r
+                public void run(ReadGraph graph) throws DatabaseException {\r
+                       // Determine if unit validation is enabled.\r
+                       SysdynResource sr = SysdynResource.getInstance(graph);\r
+                    final Resource unitIssueSource = graph.syncRequest(\r
+                            new PossibleObjectWithType(model, \r
+                                    Layer0X.getInstance(graph).Activates, \r
+                                    sr.Validations_Units_UnitIssueSource));\r
+                    IssueResource ISSUE = IssueResource.getInstance(graph);\r
+                    final Boolean issueSource_active = graph.getPossibleRelatedValue(unitIssueSource, ISSUE.IssueSource_active, Bindings.BOOLEAN);\r
+                    \r
+                    Boolean result = false;\r
+                    if(unitIssueSource != null) {\r
+                       result = graph.getPossibleRelatedValue(unitIssueSource, sr.Validations_Units_UnitIssueSource_allowEquivalents, Bindings.BOOLEAN);\r
+                    }\r
+\r
+                    final boolean enable = result;\r
+                    final Button button = getWidget();\r
+                    button.getDisplay().asyncExec(new Runnable() {\r
+                        \r
+                        @Override\r
+                        public void run() {\r
+                            if(button.isDisposed()) return;\r
+                            \r
+                            // Is unit validation is enabled, enable the button.\r
+                            getWidget().setEnabled(unitIssueSource!=null && issueSource_active);\r
+                            if(Boolean.TRUE.equals(enable))\r
+                               button.setSelection(true);\r
+                            else\r
+                                button.setSelection(false);\r
+                        }\r
+                    });                        \r
+                }\r
+            });\r
+        } catch (DatabaseException e) {\r
+            e.printStackTrace();\r
+        }\r
+        \r
+        unitEquivalents.addSelectionListener(new SelectionListenerImpl<Resource>(context) {\r
+\r
+            @Override\r
+            public void apply(WriteGraph graph, Resource model) throws DatabaseException {\r
+               SysdynResource sr = SysdynResource.getInstance(graph);\r
+                Resource unitIssueSource = graph.syncRequest(\r
+                        new PossibleObjectWithType(model, \r
+                                Layer0X.getInstance(graph).Activates, \r
+                                sr.Validations_Units_UnitIssueSource));\r
+                if(unitIssueSource == null)\r
+                    return;\r
+                \r
+                Boolean result = graph.getPossibleRelatedValue(unitIssueSource, sr.Validations_Units_UnitIssueSource_allowEquivalents, Bindings.BOOLEAN);\r
+                if(result == null)\r
+                    result = false;\r
+                graph.claimLiteral(unitIssueSource, sr.Validations_Units_UnitIssueSource_allowEquivalents, Boolean.FALSE.equals(result));\r
+            }\r
+        });\r
+    }\r
+    \r
+    public Button getWidget() {\r
+        return unitEquivalents.getWidget();\r
+    }\r
+\r
+}\r
index 24e3c80c9074a8cddce41c771e6686a79efdcf65..ff07b3949f83e6e4c18f36145d52d8a34b6bbd01 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.ui.validation;\r
 \r
@@ -36,6 +37,7 @@ import org.simantics.sysdyn.manager.SysdynModelManager;
 import org.simantics.sysdyn.representation.IndependentVariable;\r
 import org.simantics.sysdyn.representation.expressions.IExpression;\r
 import org.simantics.sysdyn.representation.utils.UnitUtils;\r
+import org.simantics.sysdyn.utils.ModelUtils;\r
 \r
 public class UnitFunction {\r
 \r
@@ -113,6 +115,7 @@ public class UnitFunction {
         if(configuration == null)\r
             return Collections.emptyList();\r
 \r
+        SysdynModel model = ModelUtils.getModel(graph, module);\r
         String result = null;\r
         ArrayList<Issue> issues = new ArrayList<Issue>();\r
         for(Resource outputRelation : graph.getObjects(module, SR.Variable_isTailOf)) {\r
@@ -123,7 +126,7 @@ public class UnitFunction {
                     continue;\r
                 String left = graph.getPossibleRelatedValue(output, SR.Variable_unit);\r
                 String right = graph.getPossibleRelatedValue(reference, SR.Variable_unit);\r
-                result = UnitUtils.matchUnits(left, right);\r
+                result = UnitUtils.matchUnits(left, right, UnitUtils.allowEquivalents(graph, model));\r
                 if(result != null)\r
                     issues.add(new ModuleStandardIssue(SR.Validations_ModuleOutputUnitWarning, module, output, reference));\r
             }\r
@@ -136,7 +139,7 @@ public class UnitFunction {
                     continue;\r
                 String left = graph.getPossibleRelatedValue(variable, SR.Variable_unit);\r
                 String right = graph.getPossibleRelatedValue(reference, SR.Variable_unit);\r
-                result = UnitUtils.matchUnits(left, right);\r
+                result = UnitUtils.matchUnits(left, right, UnitUtils.allowEquivalents(graph, model));\r
                 if(result != null)\r
                     issues.add(new ModuleStandardIssue(SR.Validations_ModuleInputUnitWarning, module, variable, reference));\r
             }\r
@@ -226,7 +229,8 @@ public class UnitFunction {
         if(right == null || right.isEmpty())\r
             return "No unit defined for " + NameUtils.getSafeName(graph, rightResource);\r
         \r
-        String result = UnitUtils.matchUnits(left, right);\r
+        SysdynModel model = ModelUtils.getModel(graph, leftResource);\r
+        String result = UnitUtils.matchUnits(left, right, UnitUtils.allowEquivalents(graph, model));\r
         \r
         if(result != null)\r
             result = prefix + result + suffix;\r
index f12f82819a0127becd1a83a801b7abeec7814b21..953938329faf4869a411b007fdb8b5212821c04e 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn;\r
 \r
@@ -28,24 +29,25 @@ public class TestParser {
     public static void main(String[] args) {\r
 \r
         HashMap<String, String> units = new HashMap<String, String>();\r
-        \r
-        doScenario(scenario1(units), units);\r
-        doScenario(scenario2(units), units);\r
-        doScenario(scenario3(units), units);\r
-        doScenario(scenario4(units), units);\r
-        doScenario(scenario5(units), units);\r
-        doScenario(scenario6(units), units);\r
-        doScenario(scenario7(units), units);\r
-        doScenario(scenario8(units), units);\r
-        doScenario(scenario9(units), units);\r
-        doScenario(scenario10(units), units);\r
-        doScenario(scenario11(units), units);\r
-        doScenario(scenario12(units), units);\r
-        doScenario(scenario13(units), units);\r
+        boolean allowEquivalents = true;\r
+        \r
+        doScenario(scenario1(units), units, allowEquivalents);\r
+        doScenario(scenario2(units), units, allowEquivalents);\r
+        doScenario(scenario3(units), units, allowEquivalents);\r
+        doScenario(scenario4(units), units, allowEquivalents);\r
+        doScenario(scenario5(units), units, allowEquivalents);\r
+        doScenario(scenario6(units), units, allowEquivalents);\r
+        doScenario(scenario7(units), units, allowEquivalents);\r
+        doScenario(scenario8(units), units, allowEquivalents);\r
+        doScenario(scenario9(units), units, allowEquivalents);\r
+        doScenario(scenario10(units), units, allowEquivalents);\r
+        doScenario(scenario11(units), units, allowEquivalents);\r
+        doScenario(scenario12(units), units, allowEquivalents);\r
+        doScenario(scenario13(units), units, allowEquivalents);\r
 \r
     }\r
     \r
-    private static void doScenario(String expression, HashMap<String, String> units) {\r
+    private static void doScenario(String expression, HashMap<String, String> units, boolean allowEquivalents) {\r
         System.out.println("-----------------------------------");\r
         System.out.println("Expression: " + expression);\r
         System.out.println("Units: ");\r
@@ -58,7 +60,7 @@ public class TestParser {
             UnitCheckingNode node = (UnitCheckingNode) parser.expr();\r
             \r
             try {\r
-                UnitResult u = node.getUnits(units);\r
+                UnitResult u = node.getUnits(units, allowEquivalents);\r
                 System.out.println("Result: " + u.getCleanFullUnit());\r
             } catch (UnitCheckingException e) {\r
                 e.printStackTrace();\r
index 758cc8b2d52dd69f4ffe187c1d4b2158c9d2eedf..4949b478c87490769e1a396422553e956836e382 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.representation.utils;\r
 \r
@@ -16,12 +17,15 @@ import java.util.HashMap;
 import java.util.HashSet;\r
 import java.util.Set;\r
 \r
+import org.simantics.databoard.Bindings;\r
 import org.simantics.db.ReadGraph;\r
 import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.PossibleObjectWithType;\r
 import org.simantics.db.exception.DatabaseException;\r
 import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;\r
 import org.simantics.db.exception.ServiceException;\r
 import org.simantics.db.layer0.request.PossibleModel;\r
+import org.simantics.operation.Layer0X;\r
 import org.simantics.sysdyn.SysdynResource;\r
 import org.simantics.sysdyn.manager.SysdynModel;\r
 import org.simantics.sysdyn.representation.Configuration;\r
@@ -48,10 +52,12 @@ public class UnitUtils {
             HashMap<String, String> units = UnitUtils.findUnits(graph, model, configuration, components);\r
             \r
             try {\r
-                node.getUnits(units);\r
+                node.getUnits(units, allowEquivalents(graph, model));\r
             } catch (UnitCheckingException e) {\r
                 return e.getMessage();\r
-            }\r
+            } catch (DatabaseException e) {\r
+                               e.printStackTrace();\r
+                       }\r
             \r
         } catch (ParseException e) {\r
             e.printStackTrace();\r
@@ -59,6 +65,30 @@ public class UnitUtils {
         return null;\r
     }\r
     \r
+    /**\r
+     * Determine if the Unit Equivalents checkbox is selected \r
+     * @param graph\r
+     * @param model SysdynModel of which configuration is queried\r
+     * @return true iff equivalent units are allowed\r
+     * @throws DatabaseException\r
+     */\r
+    public static boolean allowEquivalents(ReadGraph graph, SysdynModel model) throws DatabaseException {\r
+       Resource modelResource = graph.syncRequest(new PossibleModel(model.getConfigurationResource()));\r
+               SysdynResource sr = SysdynResource.getInstance(graph);\r
+        Resource unitIssueSource = graph.syncRequest(\r
+                new PossibleObjectWithType(modelResource, \r
+                        Layer0X.getInstance(graph).Activates, \r
+                        sr.Validations_Units_UnitIssueSource));\r
+        if(unitIssueSource == null)\r
+            return false;\r
+        \r
+        Boolean result = graph.getPossibleRelatedValue(unitIssueSource, sr.Validations_Units_UnitIssueSource_allowEquivalents, Bindings.BOOLEAN);\r
+        if(result == null)\r
+            result = false;\r
+        \r
+        return result;\r
+    }\r
+    \r
     public static String matchUnits(ReadGraph graph, SysdynModel model, Configuration configuration, String unit, String expression) {\r
         if(unit == null)\r
             return "Unit not defined";\r
@@ -77,14 +107,17 @@ public class UnitUtils {
             leftReader.close();\r
             \r
             try {\r
-                UnitResult rightUnits = right.getUnits(units);\r
-                UnitResult leftUnits = left.getUnits(null);\r
+               boolean allowEquivalents = allowEquivalents(graph, model);\r
+                UnitResult rightUnits = right.getUnits(units, allowEquivalents);\r
+                UnitResult leftUnits = left.getUnits(null, allowEquivalents);\r
                 \r
                 if(!rightUnits.equals(leftUnits))\r
                     return leftUnits.getCleanFullUnit() + " != " + rightUnits.getCleanFullUnit();\r
             } catch (UnitCheckingException e) {\r
                 return e.getMessage();\r
-            }\r
+            } catch (DatabaseException e) {\r
+                               e.printStackTrace();\r
+                       }\r
             \r
         } catch (ParseException e) {\r
             e.printStackTrace();\r
@@ -180,7 +213,7 @@ public class UnitUtils {
     }\r
     \r
     \r
-    public static String matchUnits(String left, String right) throws DatabaseException {\r
+    public static String matchUnits(String left, String right, boolean allowEquivalents) throws DatabaseException {\r
         if(left == null || right == null || left.isEmpty() || right.isEmpty())\r
             return "No unit defined";\r
         \r
@@ -197,8 +230,8 @@ public class UnitUtils {
             rightReader.close();\r
 \r
             try {\r
-                UnitResult leftUnits = leftNode.getUnits(null);\r
-                UnitResult rightUnits = rightNode.getUnits(null);\r
+                UnitResult leftUnits = leftNode.getUnits(null, allowEquivalents);\r
+                UnitResult rightUnits = rightNode.getUnits(null, allowEquivalents);\r
 \r
                 if(!rightUnits.equals(leftUnits))\r
                     return leftUnits.getCleanFullUnit() + " != " + rightUnits.getCleanFullUnit();\r
index 399d04d844f07b0ef95fb4de8cb1569ebbe3b869..2233c88e113f23636f3f430190d74d193c53c3c3 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser;\r
 \r
@@ -22,15 +23,15 @@ public class UnitCheckingNode extends SimpleNode {
         super(id);\r
     }\r
 \r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException{\r
-        UnitResult result = new UnitResult();\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException{\r
+        UnitResult result = new UnitResult(allowEquivalents);\r
 \r
         if(jjtGetNumChildren() == 0){\r
             String node = printNode();\r
             result.append(node);\r
         } else {\r
             for(int i = 0; i < jjtGetNumChildren(); i++) {\r
-                result.appendResult(((UnitCheckingNode)jjtGetChild(i)).getUnits(units));\r
+                result.appendResult(((UnitCheckingNode)jjtGetChild(i)).getUnits(units, allowEquivalents));\r
             }\r
         }\r
         return result; \r
index 60acd1a6d63ef19f81af24ef6355521bd627ed7e..8227241b9bdcf549f95b5d1df42c18a3b73ff374 100644 (file)
@@ -44,7 +44,7 @@ TOKEN:
 | "*" | "/" | ".*" | "./"\r
 | "^" | ".^"\r
 | "=" | ":=" \r
-| <IDENT: ["a"-"z","A"-"Z","_","\u20ac"] (["a"-"z","A"-"Z","_","\u20ac","0"-"9"])* >\r
+| <IDENT: ["a"-"z","A"-"Z","_","\u20ac","$","£","%","\u0391"-"\u03c9","µ"] (["a"-"z","A"-"Z","_","\u20ac","$","£","%","\u0391"-"\u03c9","µ","0"-"9"])* >\r
 | <STRING: "\"" (~["\"", "\\", "\n"] | "\\" ~["\n"])* "\"">\r
     { matchedToken.image = matchedToken.image.substring(1,matchedToken.image.length()-1); }\r
 | <UNSIGNED_INTEGER: (["0"-"9"])+ >\r
index 9c3374c8398a706bf9bdf6ea0f267fe4f74e216a..026b8a1c95f44e1a9612ad1f6259912c40b00bab 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -20,6 +21,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class AddOp extends UnitCheckingNode {\r
@@ -29,8 +31,8 @@ public class AddOp extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = super.getUnits(units);\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = super.getUnits(units, allowEquivalents);\r
         result.setUnitType(UnitType.OPERATOR);\r
         return result;\r
     }\r
index d844bb7ce77b1bc96b4996c3089ce94fc497363a..396bcb1d220a94e4c40f3fd299640831088653bc 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -20,6 +21,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class Arithmetic extends UnitCheckingNode {\r
@@ -30,8 +32,8 @@ public class Arithmetic extends UnitCheckingNode {
 \r
 \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = new UnitResult();\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = new UnitResult(allowEquivalents);\r
 \r
         UnitCheckingNode base = null;\r
         UnitCheckingNode operator = null;\r
@@ -39,12 +41,12 @@ public class Arithmetic extends UnitCheckingNode {
 \r
         for(int i = 0; i < jjtGetNumChildren(); i++) {\r
             candidateNode = ((UnitCheckingNode)jjtGetChild(i));\r
-            UnitResult candidateUnits = candidateNode.getUnits(units);\r
+            UnitResult candidateUnits = candidateNode.getUnits(units, allowEquivalents);\r
             if(candidateUnits.getUnitType() == UnitType.OPERATOR) {\r
                 continue;\r
             } else if(base == null || result.getUnitType() == UnitType.SCALAR || result.getUnitType() == UnitType.ANY) {\r
                 base = ((UnitCheckingNode)jjtGetChild(i));\r
-                result.appendResult(base.getUnits(units));\r
+                result.appendResult(base.getUnits(units, allowEquivalents));\r
                 continue;\r
             } else if(candidateUnits.getUnitType() == UnitType.SCALAR) {\r
                 continue;\r
index 4b46e7180b3abe64a28ae794b82fbc1038ea7a4a..7b300b218c01a165a07e50799b95803cb9f5df09 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -21,6 +22,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class ArrayDefinition extends UnitCheckingNode {\r
@@ -31,8 +33,8 @@ public class ArrayDefinition extends UnitCheckingNode {
 \r
 \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = new UnitResult();\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = new UnitResult(allowEquivalents);\r
         result.setUnitType(UnitType.SCALAR);\r
 \r
         UnitCheckingNode base = null;\r
@@ -41,13 +43,13 @@ public class ArrayDefinition extends UnitCheckingNode {
             FunctionArguments functionArguments = (FunctionArguments) jjtGetChild(0);\r
 \r
             for(UnitCheckingNode candidateNode : gatherExpressions(functionArguments, new ArrayList<UnitCheckingNode>())) {\r
-                UnitResult candidateUnits = candidateNode.getUnits(units);\r
+                UnitResult candidateUnits = candidateNode.getUnits(units, allowEquivalents);\r
                 if(candidateUnits.getUnitType() == UnitType.SCALAR) {\r
                     continue;\r
                 } else if(base == null) {\r
                     base = candidateNode;\r
                     UnitType oldUnitType = result.getUnitType();\r
-                    result.appendResult(base.getUnits(units));\r
+                    result.appendResult(base.getUnits(units, allowEquivalents));\r
 \r
                     /*\r
                      * Make sure unit type persist\r
index f539928289428659932e263700174cfc294367ea..c110fcb28b4446d7a664bfcaef9f07f74617c9cc 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -23,6 +24,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class ComponentReferenceFull extends UnitCheckingNode {\r
@@ -31,12 +33,12 @@ public class ComponentReferenceFull extends UnitCheckingNode {
         super(id);\r
     }\r
 \r
-    protected UnitResult parseUnits(String units) {\r
+    protected UnitResult parseUnits(String units, boolean allowEquivalents) {\r
         StringReader sr = new StringReader(units);\r
         UnitParser parser = new UnitParser(sr);\r
         try {\r
             UnitCheckingNode node = (UnitCheckingNode) parser.expr();\r
-            return node.getUnits(null);\r
+            return node.getUnits(null, allowEquivalents);\r
         } catch (ParseException e) {\r
             e.printStackTrace();\r
         } catch (UnitCheckingException e) {\r
@@ -46,11 +48,11 @@ public class ComponentReferenceFull extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
         String node = printNode();\r
         \r
         if("dmnl".equals(node)) {\r
-            UnitResult result = new UnitResult();\r
+            UnitResult result = new UnitResult(allowEquivalents);\r
             result.setUnitType(UnitType.DMNL);\r
             return result;\r
         }\r
@@ -59,10 +61,10 @@ public class ComponentReferenceFull extends UnitCheckingNode {
             if(!units.containsKey(node) || units.get(node) == null)\r
                 throw new UnitCheckingException("No units defined for " + node);\r
             else {\r
-                return parseUnits(units.get(node));\r
+                return parseUnits(units.get(node), allowEquivalents);\r
             }\r
         } else {\r
-            UnitResult result = new UnitResult();\r
+            UnitResult result = new UnitResult(allowEquivalents);\r
             result.addDivident(node);\r
             result.append(node);\r
             return result; \r
index 4c2ec48e28c3c46988dcea93c7c844a8a089ec61..2c090ea2431508660aeea0cdeccb1005ed766fa8 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -20,6 +21,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class Divide extends UnitCheckingNode {\r
@@ -29,8 +31,8 @@ public class Divide extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = super.getUnits(units);\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = super.getUnits(units, allowEquivalents);\r
         result.setUnitType(UnitType.OPERATOR);\r
         return result;\r
     }\r
index 6e5b1fe876b06592f387d387d74bd7b5e706a6fa..369f67b635bcbc6f548c89a144f9e590f6d2b6d7 100644 (file)
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -31,8 +32,8 @@ public class Factor extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = new UnitResult();\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = new UnitResult(allowEquivalents);\r
         \r
         UnitCheckingNode current = null;\r
         UnitCheckingNode operator = null;\r
@@ -40,10 +41,10 @@ public class Factor extends UnitCheckingNode {
         \r
         for(int i = 0; i < jjtGetNumChildren(); i++) {\r
             current = ((UnitCheckingNode)jjtGetChild(i));\r
-            UnitResult currentUnits = current.getUnits(units);\r
+            UnitResult currentUnits = current.getUnits(units, allowEquivalents);\r
 \r
             if(currentUnits.getUnitType() == UnitType.ANY) {\r
-                result = new UnitResult();\r
+                result = new UnitResult(allowEquivalents);\r
                 result.setUnitType(UnitType.ANY);\r
                 return result;\r
             } else if(currentUnits.getUnitType() == UnitType.OPERATOR) {\r
@@ -58,7 +59,7 @@ public class Factor extends UnitCheckingNode {
                     UnitType unitType = currentUnits.getUnitType();\r
                     if(unitType == UnitType.SCALAR) {\r
                        int exponent;\r
-                       UnitResult baseUnits = base.getUnits(units);\r
+                       UnitResult baseUnits = base.getUnits(units, allowEquivalents);\r
                        try {\r
                                exponent = Integer.valueOf(currentUnits.getFullUnit());\r
                        } catch (NumberFormatException e) {\r
index 0d934f12ee90f0d2a26e88a488828fffc9633de5..4a185f7bff7fd064cd070f67f39ba7d526310bc1 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -19,6 +20,7 @@ import org.simantics.sysdyn.unitParser.UnitCheckingNode;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class ForIndex extends UnitCheckingNode {\r
@@ -28,8 +30,8 @@ public class ForIndex extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        return new UnitResult();\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        return new UnitResult(allowEquivalents);\r
     }\r
 \r
 }\r
index e165cc561a4c637b5606f8de0a231ee6978df22b..a99be2ec70d594ca9898b61e3d8f3be319b49192 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -20,6 +21,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class FunctionCall extends UnitCheckingNode {\r
@@ -29,8 +31,8 @@ public class FunctionCall extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = new UnitResult();\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = new UnitResult(allowEquivalents);\r
         result.setUnitType(UnitType.ANY);\r
         return result;\r
     }\r
index 3529a15e9b34807bfc33e2012e168d1434acec8f..4234acaa9d4e0dd36c29694af195c25ee6e25d8f 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -19,6 +20,7 @@ import org.simantics.sysdyn.unitParser.UnitCheckingNode;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class IfThenElse extends UnitCheckingNode {\r
@@ -29,14 +31,14 @@ public class IfThenElse extends UnitCheckingNode {
     \r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
         UnitResult base = null;\r
         UnitCheckingNode baseNode = null;\r
         UnitCheckingNode candidateNode = null;\r
         \r
         for(int i = 0; i < jjtGetNumChildren(); i++) {\r
             candidateNode = ((UnitCheckingNode)jjtGetChild(i));\r
-            UnitResult candidateUnits = candidateNode.getUnits(units);\r
+            UnitResult candidateUnits = candidateNode.getUnits(units, allowEquivalents);\r
             \r
             if(!(candidateNode instanceof Condition)) {\r
                 \r
index 53cdc78385a5c3fa0758f998de1bc785ed06a7fd..43b13aaeb0363ee3195adcb8793ab74bc147dc56 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -20,6 +21,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class Multiplication extends UnitCheckingNode {\r
@@ -29,8 +31,8 @@ public class Multiplication extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = super.getUnits(units);\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = super.getUnits(units, allowEquivalents);\r
         result.setUnitType(UnitType.OPERATOR);\r
         return result;\r
     }\r
index 147994610ffa621b7783906c8064e41fc6da111b..ab1d9adfcd062206f410b1dfc7338917799d827f 100644 (file)
@@ -29,8 +29,8 @@ public class Power extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = super.getUnits(units);\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = super.getUnits(units, allowEquivalents);\r
         result.setUnitType(UnitType.OPERATOR);\r
         return result;\r
     }\r
index 57098ba14d64a4eae244f88cf90d2f9a18a10fa4..d7a62adebd579da71f99065612365010272f9363 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -20,6 +21,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class RelOp extends UnitCheckingNode {\r
@@ -29,8 +31,8 @@ public class RelOp extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = super.getUnits(units);\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = super.getUnits(units, allowEquivalents);\r
         result.setUnitType(UnitType.OPERATOR);\r
         return result;\r
     }\r
index 6d8711c117ee6a89952507317b7867c97fa32c6c..2fd22f3bf27946f5f843b96498406933e5664ea3 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -19,6 +20,7 @@ import org.simantics.sysdyn.unitParser.UnitCheckingNode;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class Relation extends UnitCheckingNode {\r
@@ -28,8 +30,8 @@ public class Relation extends UnitCheckingNode {
     }\r
 \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = new UnitResult();\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = new UnitResult(allowEquivalents);\r
         \r
         UnitCheckingNode base = null;\r
         UnitCheckingNode operator = null;\r
@@ -40,14 +42,14 @@ public class Relation extends UnitCheckingNode {
             base = ((UnitCheckingNode)jjtGetChild(1));\r
             \r
         if(base instanceof Arithmetic) {\r
-            result.appendResult(base.getUnits(units));\r
+            result.appendResult(base.getUnits(units, allowEquivalents));\r
 \r
             for(int i = 2; i < jjtGetNumChildren(); i = i + 2) {\r
                 candidateNode = ((UnitCheckingNode)jjtGetChild(i));\r
 \r
                 if(!(candidateNode instanceof Value)) {\r
                     operator = ((UnitCheckingNode)jjtGetChild(i-1));\r
-                    UnitResult candidateUnits = candidateNode.getUnits(units);\r
+                    UnitResult candidateUnits = candidateNode.getUnits(units, allowEquivalents);\r
                     if(!result.equals(candidateUnits)) {\r
                         result.equals(candidateUnits);\r
                         throw new UnitCheckingException("Not equals exception: " +\r
index 77f9c4093f80be2f776237c8d8ebf2383d271a9f..344cf7eb5462d0628505f9fa3dffdc097a775169 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -21,6 +22,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class Term extends UnitCheckingNode {\r
@@ -30,8 +32,8 @@ public class Term extends UnitCheckingNode {
     }\r
     \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = new UnitResult();\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = new UnitResult(allowEquivalents);\r
         \r
         UnitCheckingNode current = null;\r
         UnitCheckingNode operator = null;\r
@@ -39,10 +41,10 @@ public class Term extends UnitCheckingNode {
         \r
         for(int i = 0; i < jjtGetNumChildren(); i++) {\r
             current = ((UnitCheckingNode)jjtGetChild(i));\r
-            UnitResult currentUnits = current.getUnits(units);\r
+            UnitResult currentUnits = current.getUnits(units, allowEquivalents);\r
 \r
             if(currentUnits.getUnitType() == UnitType.ANY) {\r
-                result = new UnitResult();\r
+                result = new UnitResult(allowEquivalents);\r
                 result.setUnitType(UnitType.ANY);\r
                 return result;\r
             } else if(currentUnits.getUnitType() == UnitType.OPERATOR) {\r
index 72fcb73d8c5dc5ba50e121f7a36f394a74bd4cda..74cf4dd95fcd18c4e9792d6adc28c3f6092e8728 100644 (file)
@@ -28,6 +28,7 @@ import java.util.Iterator;
  * clean representation of the unit. ( e.g. m * s / m  -> s )\r
  * \r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class UnitResult {\r
@@ -39,7 +40,47 @@ public class UnitResult {
     private StringBuilder fullUnit = new StringBuilder();\r
     private UnitType unitType;\r
     \r
-    public UnitResult() {\r
+    // Equivalent forms of units:\r
+    private final Equivalent[] EQUIVALENTS = {\r
+               new Equivalent("$","$s","dollar","dollars","usd"),\r
+               new Equivalent("\u20ac","\u20acs","eur","euro","euros","e","ecu"),\r
+               new Equivalent("£","£s","pound","pounds","gbp"),\r
+               new Equivalent("Unit","Units"),\r
+               new Equivalent("Person","People","Persons"),\r
+               new Equivalent("second","seconds","sec","s"),\r
+               new Equivalent("minute","minutes","min"),\r
+               new Equivalent("hour","hours","h","hr"),\r
+               new Equivalent("day","days","d"),\r
+               new Equivalent("month","months","mon","mth","mo","mos"),\r
+               new Equivalent("year","years","a","y","yr")\r
+               };\r
+       private boolean allowEquivalents;\r
+    \r
+    private class Equivalent {\r
+       public ArrayList<String> forms;\r
+       \r
+       Equivalent(String ... forms) {\r
+               this.forms = new ArrayList<String>();\r
+               for (String f : forms)\r
+                       this.forms.add(f);\r
+       }\r
+       \r
+       public boolean contains(String form) {\r
+               for (String f : forms)\r
+                       if (f.equalsIgnoreCase(form))\r
+                               return true;\r
+               return false;\r
+       }\r
+       \r
+       public String getDefault() {\r
+               if (forms.size() > 0)\r
+                       return forms.get(0);\r
+               else return null;\r
+       }\r
+    }\r
+    \r
+    public UnitResult(boolean allowEquivalents) {\r
+       this.allowEquivalents = allowEquivalents;\r
         setUnitType(UnitType.NORMAL);\r
     }\r
     \r
@@ -159,6 +200,22 @@ public class UnitResult {
         if(copyDividers1.size() != copyDividers2.size())\r
             return false;\r
         \r
+        if (allowEquivalents) {\r
+                   // Replace and sort all once again.\r
+                   for(int i = 0; i < copyDividents1.size(); i++) {\r
+                       copyDividents1.set(i, getDefaultForm(copyDividents1.get(i)));\r
+                       copyDividents2.set(i, getDefaultForm(copyDividents2.get(i)));\r
+                       Collections.sort(copyDividents1);\r
+                       Collections.sort(copyDividents2);\r
+                   }\r
+                   for(int i = 0; i < copyDividers1.size(); i++) {\r
+                       copyDividers1.set(i, getDefaultForm(copyDividers1.get(i)));\r
+                       copyDividers2.set(i, getDefaultForm(copyDividers2.get(i)));\r
+                       Collections.sort(copyDividers1);\r
+                       Collections.sort(copyDividers2);\r
+                   }\r
+        }\r
+        \r
         for(int i = 0; i < copyDividents1.size(); i++) {\r
             String a = copyDividents1.get(i);\r
             String b = copyDividents2.get(i);\r
@@ -166,7 +223,6 @@ public class UnitResult {
                 return false;\r
             }\r
         }\r
-        \r
         for(int i = 0; i < copyDividers1.size(); i++) {\r
             String a = copyDividers1.get(i);\r
             String b = copyDividers2.get(i);\r
@@ -178,7 +234,19 @@ public class UnitResult {
         return true;\r
     }\r
     \r
-    public void reduceUnitLists(ArrayList<String> originalDividents, ArrayList<String> copyDividents, ArrayList<String> copyDividers) {\r
+    /**\r
+     * Get the default form of a unit (e.g. dollars -> $).\r
+     * @param unit\r
+     * @return default form of unit\r
+     */\r
+    private String getDefaultForm(String unit) {\r
+       for (Equivalent e : EQUIVALENTS)\r
+               if (e.contains(unit))\r
+                       return e.getDefault();\r
+       return unit;\r
+       }\r
+\r
+       public void reduceUnitLists(ArrayList<String> originalDividents, ArrayList<String> copyDividents, ArrayList<String> copyDividers) {\r
         for(String s : originalDividents) {\r
             if(copyDividers.contains(s)) {\r
                 copyDividers.remove(s);\r
index 1ba0fc005e4ab7407e66354705d953267177bb81..7e26c56910f8251649fac9598bbe672e323e239a 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Copyright (c) 2013 Association for Decentralized Information Management in\r
+ * Copyright (c) 2013-2014 Association for Decentralized Information Management in\r
  * Industry THTH ry.\r
  * All rights reserved. This program and the accompanying materials\r
  * are made available under the terms of the Eclipse Public License v1.0\r
@@ -8,6 +8,7 @@
  *\r
  * Contributors:\r
  *     Semantum Oy - initial API and implementation\r
+ *     VTT Technical Research Centre of Finland\r
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser.nodes;\r
 \r
@@ -20,6 +21,7 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
  * @author Teemu Lempinen\r
+ * @author Tuomas Miettinen\r
  *\r
  */\r
 public class Value extends UnitCheckingNode {\r
@@ -29,8 +31,8 @@ public class Value extends UnitCheckingNode {
     }\r
 \r
     @Override\r
-    public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
-        UnitResult result = super.getUnits(units);\r
+    public UnitResult getUnits(HashMap<String, String> units, boolean allowEquivalents) throws UnitCheckingException {\r
+        UnitResult result = super.getUnits(units, allowEquivalents);\r
         result.setUnitType(UnitType.SCALAR);\r
         return result;\r
     }\r