]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/TypeGroup.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / TypeGroup.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.Arrays;\r
15 import java.util.Collection;\r
16 import java.util.Collections;\r
17 import java.util.HashSet;\r
18 import java.util.Set;\r
19 \r
20 import org.simantics.databoard.Bindings;\r
21 import org.simantics.db.ReadGraph;\r
22 import org.simantics.db.RequestProcessor;\r
23 import org.simantics.db.Resource;\r
24 import org.simantics.db.common.primitiverequest.OrderedSet;\r
25 import org.simantics.db.common.procedure.wrapper.SetListenerToSingleSetListener;\r
26 import org.simantics.db.common.request.BinaryRead;\r
27 import org.simantics.db.exception.DatabaseException;\r
28 import org.simantics.db.procedure.SetListener;\r
29 import org.simantics.diagram.stubs.DiagramResource;\r
30 import org.simantics.layer0.Layer0;\r
31 import org.simantics.scenegraph.profile.Group;\r
32 \r
33 /**\r
34  * @author Tuukka Lehtonen\r
35  */\r
36 public class TypeGroup implements Group {\r
37 \r
38     private final Collection<Resource> types;\r
39     private final String               name;\r
40 \r
41     public TypeGroup(String name, Resource type) {\r
42         this(name);\r
43     }\r
44 \r
45     public TypeGroup(String name, Resource... types) {\r
46         this.types = Arrays.asList(types);\r
47         this.name = name;\r
48     }\r
49 \r
50     /**\r
51      * Initialize TypeGroup from a DIAGRAM.Group instance.\r
52      * \r
53      * @param graph\r
54      * @param group\r
55      * @throws DatabaseException\r
56      */\r
57     public TypeGroup(ReadGraph graph, final Resource group) throws DatabaseException {\r
58         Layer0 L0 = Layer0.getInstance(graph);\r
59         DiagramResource DIA = DiagramResource.getInstance(graph);\r
60 \r
61         this.name = graph.getPossibleRelatedValue(group, L0.HasName, Bindings.STRING);\r
62         this.types = graph.getObjects(group, DIA.TypeGroup_HasType);\r
63     }\r
64 \r
65     @Override\r
66     public void trackItems(RequestProcessor processor, final Resource runtimeDiagram, final SetListener<Resource> listener) {\r
67         if (types.isEmpty()) {\r
68             System.out.println("TypeGroup has no types!");\r
69             return;\r
70         }\r
71 \r
72         processor.asyncRequest(new BinaryRead<Resource, Collection<Resource>, Collection<Resource>>(runtimeDiagram, types) {\r
73 \r
74             @Override\r
75             public Set<Resource> perform(ReadGraph graph) throws DatabaseException {\r
76                 HashSet<Resource> result = new HashSet<Resource>();\r
77 \r
78                 Resource realDiagram = graph.getPossibleObject(runtimeDiagram, DiagramResource.getInstance(graph).RuntimeDiagram_HasConfiguration);\r
79                 if (realDiagram == null)\r
80                     return result;\r
81 \r
82 //                System.out.println("looking for diagram elements of type:");\r
83 //                for (Resource t : types)\r
84 //                    System.out.println("\t" + NameUtils.getSafeName(graph, t, true));\r
85 \r
86                 Collection<Resource> elements = graph.syncRequest(new OrderedSet(realDiagram));\r
87                 for (Resource element : elements) {\r
88 //                    System.out.println("checking element " + NameUtils.getSafeName(graph, element, true));\r
89                     Collection<Resource> elementTypes = graph.getTypes(element);\r
90                     if (!Collections.disjoint(types, elementTypes))\r
91                         result.add(element);\r
92                 }\r
93 \r
94                 return result;\r
95             }\r
96 \r
97         }, new SetListenerToSingleSetListener<Resource>(listener));\r
98     }\r
99 \r
100     @Override\r
101     public String toString() {\r
102         return "every '" + name + "'";\r
103     }\r
104 \r
105 }\r