]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/MappedTypeGroup.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / MappedTypeGroup.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.adapter;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Arrays;\r
16 import java.util.Collection;\r
17 import java.util.Collections;\r
18 import java.util.HashSet;\r
19 import java.util.List;\r
20 import java.util.Set;\r
21 \r
22 import org.simantics.databoard.Bindings;\r
23 import org.simantics.db.ReadGraph;\r
24 import org.simantics.db.RequestProcessor;\r
25 import org.simantics.db.Resource;\r
26 import org.simantics.db.common.primitiverequest.OrderedSet;\r
27 import org.simantics.db.common.procedure.wrapper.SetListenerToSingleSetListener;\r
28 import org.simantics.db.common.request.BinaryRead;\r
29 import org.simantics.db.exception.DatabaseException;\r
30 import org.simantics.db.procedure.SetListener;\r
31 import org.simantics.diagram.stubs.DiagramResource;\r
32 import org.simantics.layer0.Layer0;\r
33 import org.simantics.modeling.ModelingResources;\r
34 import org.simantics.scenegraph.profile.Group;\r
35 \r
36 /**\r
37  * @author Tuukka Lehtonen\r
38  */\r
39 public class MappedTypeGroup implements Group {\r
40 \r
41     private final List<Resource> types;\r
42     private final String         name;\r
43 \r
44     public MappedTypeGroup(String name, Resource type) {\r
45         this(name);\r
46     }\r
47 \r
48     public MappedTypeGroup(String name, Resource... types) {\r
49         this.types = Arrays.asList(types);\r
50         this.name = name;\r
51     }\r
52 \r
53     /**\r
54      * Initialize TypeGroup from a DIAGRAM.Group instance.\r
55      * \r
56      * @param graph\r
57      * @param group\r
58      * @throws DatabaseException\r
59      */\r
60     public MappedTypeGroup(ReadGraph graph, final Resource group) throws DatabaseException {\r
61         Layer0 L0 = Layer0.getInstance(graph);\r
62         DiagramResource DIA = DiagramResource.getInstance(graph);\r
63 \r
64         this.name = graph.getPossibleRelatedValue(group, L0.HasName, Bindings.STRING);\r
65         this.types = new ArrayList<Resource>();\r
66         this.types.addAll(graph.getObjects(group, DIA.TypeGroup_HasType));\r
67         \r
68     }\r
69 \r
70     @Override\r
71     public void trackItems(RequestProcessor processor, final Resource runtimeDiagram, final SetListener<Resource> listener) {\r
72         if (types.isEmpty()) {\r
73             System.out.println("MappedTypeGroup has no types!");\r
74             return;\r
75         }\r
76 \r
77         processor.asyncRequest(new BinaryRead<Resource, Collection<Resource>, Collection<Resource>>(runtimeDiagram, types) {\r
78 \r
79             @Override\r
80             public Set<Resource> perform(ReadGraph graph) throws DatabaseException {\r
81                 HashSet<Resource> result = new HashSet<Resource>();\r
82 \r
83                 Resource realDiagram = graph.getPossibleObject(runtimeDiagram, DiagramResource.getInstance(graph).RuntimeDiagram_HasConfiguration);\r
84                 if (realDiagram == null)\r
85                     return result;\r
86 \r
87                 ModelingResources MOD = ModelingResources.getInstance(graph);\r
88 \r
89 //                System.out.println("looking for diagram elements of type:");\r
90 //                for (Resource t : types)\r
91 //                    System.out.println("\t" + NameUtils.getSafeName(graph, t, true));\r
92 \r
93                 Collection<Resource> elements = graph.syncRequest(new OrderedSet(realDiagram));\r
94                 for (Resource element : elements) {\r
95 //                    System.out.println("checking element " + NameUtils.getSafeName(graph, element, true));\r
96                     Resource mapped = graph.getPossibleObject(element, MOD.ElementToComponent);\r
97 //                    System.out.println("checking mapped component " + NameUtils.getSafeName(graph, mapped, true));\r
98                     if(mapped != null) {\r
99                         Collection<Resource> mappedTypes = graph.getTypes(mapped);\r
100 //                        for (Resource t : mappedTypes)\r
101 //                            System.out.println("\t" + NameUtils.getSafeName(graph, t, true));\r
102                         if (!Collections.disjoint(types, mappedTypes))\r
103                             result.add(element);\r
104                     } else {\r
105                         Resource referenceRelation = graph.getPossibleObject(element, MOD.HasReferenceRelation);\r
106                         if (referenceRelation != null) {\r
107                             Collection<Resource> referencedTypes = graph.getObjects(referenceRelation, MOD.HasReferencedType);\r
108                             if (!Collections.disjoint(types, referencedTypes)) {\r
109                                 result.add(element);\r
110                             } else {\r
111                                 for (Resource referencedType : referencedTypes) {\r
112                                     Set<Resource> allTypes = graph.getSupertypes(referencedType);\r
113                                     if (!Collections.disjoint(types, allTypes))\r
114                                         result.add(element);\r
115                                 }\r
116                             }\r
117                         }\r
118                     }\r
119                 }\r
120 \r
121                 return result;\r
122             }\r
123 \r
124         }, new SetListenerToSingleSetListener<Resource>(listener));\r
125     }\r
126 \r
127     @Override\r
128     public int hashCode() {\r
129         return types.hashCode();\r
130     }\r
131 \r
132     @Override\r
133     public boolean equals(Object object) {\r
134         if (this == object)\r
135             return true;\r
136         else if (object == null)\r
137             return false;\r
138         else if (MappedTypeGroup.class != object.getClass())\r
139             return false;\r
140         MappedTypeGroup other = (MappedTypeGroup)object;\r
141         return types.equals(other.types);\r
142     }\r
143 \r
144     @Override\r
145     public String toString() {\r
146         return "every '" + name + "'";\r
147     }\r
148 \r
149 }\r