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