]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/ModelInstances.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / request / ModelInstances.java
1 package org.simantics.db.layer0.request;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Collections;\r
5 import java.util.HashMap;\r
6 import java.util.Map;\r
7 \r
8 import org.simantics.databoard.Bindings;\r
9 import org.simantics.db.ReadGraph;\r
10 import org.simantics.db.Resource;\r
11 import org.simantics.db.common.request.PossibleIndexRoot;\r
12 import org.simantics.db.common.request.ResourceRead2;\r
13 import org.simantics.db.exception.DatabaseException;\r
14 import org.simantics.db.layer0.adapter.Instances;\r
15 import org.simantics.layer0.Layer0;\r
16 import org.simantics.simulation.ontology.SimulationResource;\r
17 \r
18 /**\r
19  * Returns a Name->Resource map for instances of given type in a given model.\r
20  * \r
21  * Uses Dependencies-index for obtaining instances. Uses L0.HasName for\r
22  * obtaining name.\r
23  * \r
24  * @author Antti Villberg\r
25  */\r
26 public class ModelInstances extends ResourceRead2<Map<String, Resource>> {\r
27 \r
28     /**\r
29      * @parameter modelPart is a Resource with URI under a model e.g. model can\r
30      *            be found using L0.PartOf\r
31      * @parameter type is the type to search instances for. The query returns\r
32      *            properly all instances of all subtypes.\r
33      */\r
34     public ModelInstances(Resource modelPart, Resource type) {\r
35         super(modelPart, type);\r
36     }\r
37 \r
38     private Resource getModel(ReadGraph graph) throws DatabaseException {\r
39         SimulationResource SIMU = SimulationResource.getInstance(graph);\r
40         if (graph.isInstanceOf(resource, SIMU.Model)) {\r
41             return resource;\r
42         } else {\r
43             return graph.sync(new PossibleIndexRoot(resource));\r
44         }\r
45     }\r
46 \r
47     @Override\r
48     public Map<String, Resource> perform(ReadGraph graph) throws DatabaseException {\r
49 \r
50         Layer0 L0 = Layer0.getInstance(graph);\r
51 \r
52         Instances query = graph.adapt(resource2, Instances.class);\r
53         if (query == null)\r
54             return Collections.emptyMap();\r
55 \r
56         Resource model = getModel(graph);\r
57         if(model == null)\r
58             return Collections.emptyMap();\r
59         Collection<Resource> queryResult = query.find(graph, model);\r
60         if (queryResult.isEmpty())\r
61             return Collections.emptyMap();\r
62 \r
63         Map<String, Resource> result = new HashMap<String, Resource>(queryResult.size());\r
64         for(Resource instance : queryResult) {\r
65             String name = graph.getRelatedValue(instance, L0.HasName, Bindings.STRING);\r
66             result.put(name, instance);\r
67         }\r
68         return result;\r
69 \r
70     }\r
71 \r
72 }\r