1 package org.simantics.simulation.export;
\r
3 import java.util.ArrayList;
\r
4 import java.util.List;
\r
6 import org.simantics.databoard.Bindings;
\r
7 import org.simantics.databoard.Databoard;
\r
8 import org.simantics.databoard.accessor.reference.ChildReference;
\r
9 import org.simantics.databoard.accessor.reference.IndexReference;
\r
10 import org.simantics.databoard.binding.Binding;
\r
11 import org.simantics.db.ReadGraph;
\r
12 import org.simantics.db.Resource;
\r
13 import org.simantics.db.common.request.ObjectsWithType;
\r
14 import org.simantics.db.common.request.PossibleObjectWithType;
\r
15 import org.simantics.db.exception.DatabaseException;
\r
16 import org.simantics.db.layer0.request.PossibleModel;
\r
17 import org.simantics.db.layer0.variable.RVI;
\r
18 import org.simantics.db.layer0.variable.Variable;
\r
19 import org.simantics.db.layer0.variable.Variables;
\r
20 import org.simantics.db.request.Read;
\r
21 import org.simantics.layer0.Layer0;
\r
22 import org.simantics.modeling.ModelingResources;
\r
23 import org.simantics.utils.datastructures.Pair;
\r
26 * This query finds CSV item datas
\r
28 * @author toni.kalajainen@semantum.fi
\r
30 public class CSVItemsQuery implements Read<List<CSVItemsQuery.CSVItem>> {
\r
35 * Create query using content uris.
\r
37 * Label format, use ""
\r
39 * @param contentUris uri to Chart or Subscription
\r
41 public CSVItemsQuery(String contentUri) {
\r
42 this.contentUri = contentUri;
\r
46 public List<CSVItem> perform(ReadGraph graph) throws DatabaseException {
\r
47 List<CSVItem> result = new ArrayList<CSVItem>();
\r
48 Resource resource = graph.getResource(contentUri);
\r
50 Layer0 L0 = Layer0.getInstance(graph);
\r
51 ModelingResources MOD = ModelingResources.getInstance(graph);
\r
53 List<Resource> subscriptionItems = new ArrayList<Resource>();
\r
55 if ( graph.isInstanceOf(resource, MOD.Subscription ) ) {
\r
56 subscriptionItems.addAll( graph.syncRequest( new ObjectsWithType(resource, L0.ConsistsOf, MOD.Subscription_Item) ) );
\r
58 // This is probably Chart. This plugin doesn't have dependency to Chart plugin
\r
59 // We can follow HasSubscriptionItem relation anyway.
\r
60 for (Resource possibleItem : graph.getObjects( resource, L0.ConsistsOf )) {
\r
61 subscriptionItems.addAll( graph.syncRequest( new ObjectsWithType(possibleItem, L0.IsRelatedTo, MOD.Subscription_Item) ));
\r
65 for ( Resource subscriptionItem : subscriptionItems ) {
\r
66 Resource model = graph.syncRequest( new PossibleModel(subscriptionItem) );
\r
67 Resource subscription = graph.syncRequest( new PossibleObjectWithType(subscriptionItem, L0.PartOf, MOD.Subscription) );
\r
68 if (subscription == null) continue;
\r
69 Variable configuration = Variables.getPossibleConfigurationContext(graph, subscription);
\r
70 if (configuration == null) continue;
\r
71 CSVItem item = new CSVItem();
\r
72 if ( model != null) item.modelUri = graph.getURI( model );
\r
74 Binding rviBinding = graph.getService(Databoard.class).getBindingUnchecked( RVI.class );
\r
75 RVI rvi = graph.getPossibleRelatedValue(subscriptionItem, MOD.Subscription_Item_VariableId, rviBinding);
\r
76 if (rvi == null) continue;
\r
78 // Resource experiment = graph.syncRequest(new PossibleExperiment(subscriptionItem));
\r
79 // String runIdentifier = ""; // experiment.getIdentifier();
\r
81 item.variableReference = rvi.toPossibleString(graph, configuration);
\r
82 if (item.variableReference == null) continue;
\r
84 item.label = removeVariablePrefixPath( item.variableReference );
\r
85 item.unit = graph.getPossibleRelatedValue( subscriptionItem, MOD.Subscription_Item_Unit, Bindings.STRING );
\r
92 static String removeVariablePrefixPath(String rvi) {
\r
93 // Apros-specific logics:
\r
94 // 1. remove path prefix
\r
95 // 2. change IndexReferences (i-N) into "(N+1)" Apros-style indexing
\r
96 int propIndex = rvi.indexOf('#');
\r
97 if (propIndex == -1)
\r
99 int prevSlash = rvi.lastIndexOf('/', propIndex);
\r
100 if (prevSlash == -1)
\r
102 Pair<String, Integer> attrKey = attributeKey(rvi, propIndex + 1);
\r
103 return rvi.substring(prevSlash + 1, propIndex + 1) + attrKey.first
\r
104 + (attrKey.second != null ? "(" + (attrKey.second + 1) + ")" : "");
\r
107 static Pair<String, Integer> attributeKey(String key, int start) {
\r
108 int iy = key.lastIndexOf('/');
\r
109 boolean isIndexed = iy >= start;
\r
111 ChildReference child = ChildReference.parsePath(key.substring(iy + 1));
\r
112 if (child instanceof IndexReference)
\r
113 return Pair.make(key.substring(start, iy), ((IndexReference) child).getIndex());
\r
115 return Pair.make(key.substring(start), null);
\r
118 public static class CSVItem {
\r
119 public String modelUri;
\r
120 public String label;
\r
121 public String variableReference;
\r
122 public String unit;
\r