]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.simulation.export;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.List;\r
5 \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
24 \r
25 /**\r
26  * This query finds CSV item datas\r
27  *\r
28  * @author toni.kalajainen@semantum.fi\r
29  */\r
30 public class CSVItemsQuery implements Read<List<CSVItemsQuery.CSVItem>> {\r
31         \r
32         String contentUri;\r
33         \r
34         /**\r
35          * Create query using content uris.\r
36          * \r
37          * Label format, use ""\r
38          * \r
39          * @param contentUris uri to Chart or Subscription\r
40          */\r
41         public CSVItemsQuery(String contentUri) {\r
42                 this.contentUri = contentUri;\r
43         }\r
44         \r
45         @Override\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
49                 \r
50                 Layer0 L0 = Layer0.getInstance(graph);\r
51                 ModelingResources MOD = ModelingResources.getInstance(graph);  \r
52                 \r
53                 List<Resource> subscriptionItems = new ArrayList<Resource>();\r
54                 \r
55                 if ( graph.isInstanceOf(resource, MOD.Subscription ) ) {\r
56                         subscriptionItems.addAll( graph.syncRequest( new ObjectsWithType(resource, L0.ConsistsOf, MOD.Subscription_Item) ) );\r
57                 } else {\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
62                         }\r
63                 }\r
64                 \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
73                                 \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
77                         \r
78 //            Resource experiment = graph.syncRequest(new PossibleExperiment(subscriptionItem));\r
79 //            String runIdentifier = ""; // experiment.getIdentifier();\r
80                         \r
81                         item.variableReference = rvi.toPossibleString(graph, configuration);\r
82             if (item.variableReference == null) continue;\r
83 \r
84                 item.label = removeVariablePrefixPath( item.variableReference );                                \r
85                 item.unit = graph.getPossibleRelatedValue( subscriptionItem, MOD.Subscription_Item_Unit, Bindings.STRING );\r
86                 result.add( item );\r
87                 }\r
88                                 \r
89                 return result;\r
90         }\r
91         \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
98             return rvi;\r
99         int prevSlash = rvi.lastIndexOf('/', propIndex);\r
100         if (prevSlash == -1)\r
101             return rvi;\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
105     }\r
106         \r
107     static Pair<String, Integer> attributeKey(String key, int start) {\r
108         int iy = key.lastIndexOf('/');\r
109         boolean isIndexed = iy >= start;\r
110         if (isIndexed) {\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
114         }\r
115         return Pair.make(key.substring(start), null);\r
116     }\r
117     \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
123     }\r
124     \r
125 }\r
126 \r