]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.simulation/src/org/simantics/simulation/export/CSVItemsQuery.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.simulation / src / org / simantics / simulation / export / CSVItemsQuery.java
diff --git a/bundles/org.simantics.simulation/src/org/simantics/simulation/export/CSVItemsQuery.java b/bundles/org.simantics.simulation/src/org/simantics/simulation/export/CSVItemsQuery.java
new file mode 100644 (file)
index 0000000..86bd1a8
--- /dev/null
@@ -0,0 +1,126 @@
+package org.simantics.simulation.export;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.Databoard;\r
+import org.simantics.databoard.accessor.reference.ChildReference;\r
+import org.simantics.databoard.accessor.reference.IndexReference;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.ObjectsWithType;\r
+import org.simantics.db.common.request.PossibleObjectWithType;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.request.PossibleModel;\r
+import org.simantics.db.layer0.variable.RVI;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.modeling.ModelingResources;\r
+import org.simantics.utils.datastructures.Pair;\r
+\r
+/**\r
+ * This query finds CSV item datas\r
+ *\r
+ * @author toni.kalajainen@semantum.fi\r
+ */\r
+public class CSVItemsQuery implements Read<List<CSVItemsQuery.CSVItem>> {\r
+       \r
+       String contentUri;\r
+       \r
+       /**\r
+        * Create query using content uris.\r
+        * \r
+        * Label format, use ""\r
+        * \r
+        * @param contentUris uri to Chart or Subscription\r
+        */\r
+       public CSVItemsQuery(String contentUri) {\r
+               this.contentUri = contentUri;\r
+       }\r
+       \r
+       @Override\r
+       public List<CSVItem> perform(ReadGraph graph) throws DatabaseException {\r
+               List<CSVItem> result = new ArrayList<CSVItem>();\r
+               Resource resource = graph.getResource(contentUri);\r
+               \r
+               Layer0 L0 = Layer0.getInstance(graph);\r
+               ModelingResources MOD = ModelingResources.getInstance(graph);  \r
+               \r
+               List<Resource> subscriptionItems = new ArrayList<Resource>();\r
+               \r
+               if ( graph.isInstanceOf(resource, MOD.Subscription ) ) {\r
+                       subscriptionItems.addAll( graph.syncRequest( new ObjectsWithType(resource, L0.ConsistsOf, MOD.Subscription_Item) ) );\r
+               } else {\r
+                       // This is probably Chart. This plugin doesn't have dependency to Chart plugin\r
+                       // We can follow HasSubscriptionItem relation anyway.\r
+                       for (Resource possibleItem : graph.getObjects( resource, L0.ConsistsOf )) {\r
+                               subscriptionItems.addAll( graph.syncRequest( new ObjectsWithType(possibleItem, L0.IsRelatedTo, MOD.Subscription_Item) ));\r
+                       }\r
+               }\r
+               \r
+               for ( Resource subscriptionItem : subscriptionItems ) {\r
+                       Resource model = graph.syncRequest( new PossibleModel(subscriptionItem) );\r
+                       Resource subscription = graph.syncRequest( new PossibleObjectWithType(subscriptionItem, L0.PartOf, MOD.Subscription) );\r
+                       if (subscription == null) continue;\r
+                       Variable configuration = Variables.getPossibleConfigurationContext(graph, subscription);\r
+                       if (configuration == null) continue;\r
+                       CSVItem item = new CSVItem();\r
+                       if ( model != null) item.modelUri = graph.getURI( model );\r
+                               \r
+                       Binding rviBinding = graph.getService(Databoard.class).getBindingUnchecked( RVI.class );\r
+            RVI rvi = graph.getPossibleRelatedValue(subscriptionItem, MOD.Subscription_Item_VariableId, rviBinding);\r
+            if (rvi == null) continue;                     \r
+                       \r
+//            Resource experiment = graph.syncRequest(new PossibleExperiment(subscriptionItem));\r
+//            String runIdentifier = ""; // experiment.getIdentifier();\r
+                       \r
+                       item.variableReference = rvi.toPossibleString(graph, configuration);\r
+            if (item.variableReference == null) continue;\r
+\r
+               item.label = removeVariablePrefixPath( item.variableReference );                                \r
+               item.unit = graph.getPossibleRelatedValue( subscriptionItem, MOD.Subscription_Item_Unit, Bindings.STRING );\r
+               result.add( item );\r
+               }\r
+                               \r
+               return result;\r
+       }\r
+       \r
+    static String removeVariablePrefixPath(String rvi) {\r
+        // Apros-specific logics:\r
+        //   1. remove path prefix\r
+        //   2. change IndexReferences (i-N) into "(N+1)" Apros-style indexing\r
+        int propIndex = rvi.indexOf('#');\r
+        if (propIndex == -1)\r
+            return rvi;\r
+        int prevSlash = rvi.lastIndexOf('/', propIndex);\r
+        if (prevSlash == -1)\r
+            return rvi;\r
+        Pair<String, Integer> attrKey = attributeKey(rvi, propIndex + 1);\r
+        return rvi.substring(prevSlash + 1, propIndex + 1) + attrKey.first\r
+                + (attrKey.second != null ? "(" + (attrKey.second + 1) + ")" : "");\r
+    }\r
+       \r
+    static Pair<String, Integer> attributeKey(String key, int start) {\r
+        int iy = key.lastIndexOf('/');\r
+        boolean isIndexed = iy >= start;\r
+        if (isIndexed) {\r
+            ChildReference child = ChildReference.parsePath(key.substring(iy + 1));\r
+            if (child instanceof IndexReference)\r
+                return Pair.make(key.substring(start, iy), ((IndexReference) child).getIndex());\r
+        }\r
+        return Pair.make(key.substring(start), null);\r
+    }\r
+    \r
+    public static class CSVItem {\r
+       public String modelUri;\r
+       public String label;\r
+       public String variableReference;\r
+       public String unit;\r
+    }\r
+    \r
+}\r
+\r