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