--- /dev/null
+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