]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentUtils.java
Sync git svn branch with SVN repository r33366.
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / ComponentUtils.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.modeling;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.Collections;\r
17 import java.util.LinkedList;\r
18 import java.util.List;\r
19 \r
20 import org.simantics.db.ReadGraph;\r
21 import org.simantics.db.Resource;\r
22 import org.simantics.db.common.ResourceArray;\r
23 import org.simantics.db.common.utils.NameUtils;\r
24 import org.simantics.db.exception.DatabaseException;\r
25 import org.simantics.layer0.Layer0;\r
26 import org.simantics.simulation.ontology.SimulationResource;\r
27 import org.simantics.structural.stubs.StructuralResource2;\r
28 \r
29 /**\r
30  * @author Tuukka Lehtonen\r
31  */\r
32 public final class ComponentUtils {\r
33 \r
34     public static boolean componentHasDiagram(ReadGraph g, Resource component) throws DatabaseException {\r
35         return !getComponentDiagrams(g, component).isEmpty();\r
36     }\r
37 \r
38     public static boolean compositeHasDiagram(ReadGraph g, Resource composite) throws DatabaseException {\r
39         return !getCompositeDiagrams(g, composite).isEmpty();\r
40     }\r
41 \r
42     public static Collection<Resource> getComponentDiagrams(ReadGraph g, Resource component) throws DatabaseException {\r
43         StructuralResource2 sr = StructuralResource2.getInstance(g);\r
44         Resource componentType = g.getPossibleType(component, sr.Component);\r
45         Resource composite = componentType != null ? g.getPossibleObject(componentType, sr.IsDefinedBy) : null;\r
46         if (composite != null)\r
47             return getCompositeDiagrams(g, composite);\r
48         return Collections.emptyList();\r
49     }\r
50 \r
51     public static Collection<Resource> getCompositeDiagrams(ReadGraph g, Resource composite) throws DatabaseException {\r
52         return g.getObjects(composite, ModelingResources.getInstance(g).CompositeToDiagram);\r
53     }\r
54 \r
55     public static Resource getCompositeDiagram(ReadGraph g, Resource composite) throws DatabaseException {\r
56         return g.getSingleObject(composite, ModelingResources.getInstance(g).CompositeToDiagram);\r
57     }\r
58 \r
59     public static Resource getPossibleCompositeDiagram(ReadGraph g, Resource composite) throws DatabaseException {\r
60         return g.getPossibleObject(composite, ModelingResources.getInstance(g).CompositeToDiagram);\r
61     }\r
62 \r
63     public static Resource getPossibleDiagramComposite(ReadGraph g, Resource diagram) throws DatabaseException {\r
64         return g.getPossibleObject(diagram, ModelingResources.getInstance(g).DiagramToComposite);\r
65     }\r
66 \r
67     public static Collection<ResourceArray> formInputs(ReadGraph g, Resource compositeOrComponent) throws DatabaseException {\r
68         ResourceArray path = getStructuralPath(g, compositeOrComponent);\r
69         Collection<ResourceArray> inputs = new ArrayList<ResourceArray>();\r
70 \r
71         if (compositeHasDiagram(g, compositeOrComponent)) {\r
72             for (Resource dia : getCompositeDiagrams(g, compositeOrComponent)) {\r
73                 //System.out.println(": " + NameUtils.getSafeName(g, compositeOrComponent));\r
74                 //System.out.println(": " + NameUtils.getSafeName(g, dia));\r
75                 inputs.add(path.prepended(dia));\r
76             }\r
77         } else if (componentHasDiagram(g, compositeOrComponent)) {\r
78             for (Resource dia : getComponentDiagrams(g, compositeOrComponent)) {\r
79                 //System.out.println("* " + NameUtils.getSafeName(g, compositeOrComponent));\r
80                 //System.out.println("* " + NameUtils.getSafeName(g, dia));\r
81                 inputs.add(path.prepended(dia));\r
82             }\r
83         }\r
84 \r
85         return inputs;\r
86     }\r
87 \r
88 //    public static ResourceArray getStructuralPath(ReadGraph g, Resource compositeOrComponent) throws DatabaseException {\r
89 //        Builtins b = g.getBuiltins();\r
90 //        StructuralResource2 sr = StructuralResource2.getInstance(g);\r
91 //        Resource component = null;\r
92 //\r
93 //        List<Resource> result = new ArrayList<Resource>();\r
94 //\r
95 //        // Find component where to start the path browsing\r
96 //        if (g.isInstanceOf(compositeOrComponent, sr.Composite)) {\r
97 ////            System.out.println("got composite: " + NameUtils.getSafeName(g, compositeOrComponent));\r
98 //            Resource defines = g.getPossibleObject(compositeOrComponent, sr.Defines);\r
99 //            if (defines == null)\r
100 //                return ResourceArray.EMPTY;\r
101 //            component = g.getPossibleObject(defines, b.HasSingleInstance);\r
102 //            if (component == null)\r
103 //                return ResourceArray.EMPTY;\r
104 ////            System.out.println("start path browsing from: " + NameUtils.getSafeName(g, component));\r
105 //        } else if (g.isInstanceOf(compositeOrComponent, sr.Component)) {\r
106 ////            System.out.println("got component: " + NameUtils.getSafeName(g, compositeOrComponent));\r
107 //            component = compositeOrComponent;\r
108 //        } else {\r
109 //            return ResourceArray.EMPTY;\r
110 //        }\r
111 //\r
112 //        while (component != null) {\r
113 ////            System.out.println("ADDING COMPONENT: " + NameUtils.getSafeName(g, component));\r
114 //            result.add(component);\r
115 //\r
116 //            Resource composite = g.getPossibleObject(component, b.PartOf);\r
117 //            if (composite == null)\r
118 //                break;\r
119 ////            System.out.println("  PART OF: " + NameUtils.getSafeName(g, composite));\r
120 //\r
121 //            Resource defines = g.getPossibleObject(composite, sr.Defines);\r
122 //            if (defines == null)\r
123 //                break;\r
124 ////            System.out.println("  WHICH DEFINES: " + NameUtils.getSafeName(g, defines));\r
125 //\r
126 //            component = g.getPossibleObject(defines, b.HasSingleInstance);\r
127 //        }\r
128 ////        System.out.println("FOUND PATH:");\r
129 ////        for (Resource r : result)\r
130 ////            System.out.println("    " + NameUtils.getSafeName(g, r));\r
131 //        return new ResourceArray(result);\r
132 //    }\r
133 \r
134     public static ResourceArray getStructuralPath(ReadGraph g, Resource compositeOrComponent) throws DatabaseException {\r
135         Layer0 b = Layer0.getInstance(g);\r
136         StructuralResource2 sr = StructuralResource2.getInstance(g);\r
137         Resource component = null;\r
138 \r
139         List<Resource> result = new ArrayList<Resource>();\r
140 \r
141 //        System.out.println("checking composite or component: " + NameUtils.getSafeName(g, compositeOrComponent));\r
142 \r
143         // Find component where to start the path browsing\r
144         if (g.isInstanceOf(compositeOrComponent, sr.Composite)) {\r
145 //            System.out.println("got composite: " + NameUtils.getSafeName(g, compositeOrComponent));\r
146             component = compositeOrComponent;\r
147         } else if (g.isInstanceOf(compositeOrComponent, sr.Component)) {\r
148 //            System.out.println("got component: " + NameUtils.getSafeName(g, compositeOrComponent));\r
149             component = compositeOrComponent;\r
150         } else {\r
151             return ResourceArray.EMPTY;\r
152         }\r
153 //        System.out.println("start path browsing from: " + NameUtils.getSafeName(g, component));\r
154 \r
155         while (component != null) {\r
156 //            System.out.println("ADDING COMPONENT: " + NameUtils.getSafeName(g, component));\r
157             result.add(component);\r
158 \r
159             Resource composite = g.getPossibleObject(component, b.PartOf);\r
160             if (composite == null)\r
161                 break;\r
162             if (!g.isInstanceOf(composite, sr.Composite)) {\r
163 //                System.out.println("  PART OF NON-COMPOSITE: " + NameUtils.getSafeName(g, composite));\r
164                 break;\r
165             }\r
166 //            System.out.println("  PART OF COMPOSITE: " + NameUtils.getSafeName(g, composite));\r
167             component = composite;\r
168         }\r
169 //        System.out.println("FOUND PATH:");\r
170 //        for (Resource r : result)\r
171 //            System.out.println("    " + NameUtils.getSafeName(g, r));\r
172         return new ResourceArray(result);\r
173     }\r
174 \r
175     public static Resource getCompositeConfigurationRoot(ReadGraph g, Resource composite) throws DatabaseException {\r
176         StructuralResource2 sr = StructuralResource2.getInstance(g);\r
177 \r
178         if (!g.isInstanceOf(composite, sr.Composite))\r
179             throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, composite) + " is not a composite component");\r
180 \r
181         ResourceArray path = getStructuralPath(g, composite);\r
182         if (path.isEmpty()) {\r
183             return composite;\r
184         }\r
185 \r
186         Resource topmostComponent = path.resources[path.resources.length - 1];\r
187         //Resource parent = g.getPossibleObject(topmostComponent, g.getBuiltins().PartOf);\r
188         //assert parent != null;\r
189         //return parent;\r
190         return topmostComponent;\r
191     }\r
192 \r
193     public static Resource getComponentConfigurationRoot(ReadGraph g, Resource component) throws DatabaseException {\r
194         StructuralResource2 sr = StructuralResource2.getInstance(g);\r
195 \r
196         if (g.isInstanceOf(component, sr.Composite))\r
197             throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, component) + " is a composite component");\r
198         if (!g.isInstanceOf(component, sr.Component))\r
199             throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, component) + " is not a component");\r
200 \r
201         ResourceArray path = getStructuralPath(g, component);\r
202         Resource topmostComponent = path.isEmpty() ? component : path.resources[path.resources.length - 1];\r
203 //        Resource parent = g.getPossibleObject(topmostComponent, g.getBuiltins().PartOf);\r
204 //        assert parent != null;\r
205 //        return parent;\r
206         return topmostComponent;\r
207     }\r
208 \r
209     public static Resource tryGetComponentContainer(ReadGraph g, Resource component) throws DatabaseException {\r
210         Layer0 l0 = Layer0.getInstance(g);\r
211         StructuralResource2 sr = StructuralResource2.getInstance(g);\r
212 \r
213         if (g.isInstanceOf(component, sr.Composite))\r
214             throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, component) + " is a composite component");\r
215         if (!g.isInstanceOf(component, sr.Component))\r
216             throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, component) + " is not a component");\r
217 \r
218         Resource container = g.getPossibleObject(component, l0.PartOf);\r
219         if (container == null)\r
220             return null;\r
221         return container;\r
222     }\r
223 \r
224     public static Resource tryGetComponentConfigurationRoot(ReadGraph g, Resource component) throws DatabaseException {\r
225         StructuralResource2 sr = StructuralResource2.getInstance(g);\r
226 \r
227         if (g.isInstanceOf(component, sr.Composite))\r
228             return null;\r
229         if (!g.isInstanceOf(component, sr.Component))\r
230             return null;\r
231 \r
232         ResourceArray path = getStructuralPath(g, component);\r
233         Resource topmostComponent = path.isEmpty() ? component : path.resources[path.resources.length - 1];\r
234 \r
235 //        Resource parent = g.getPossibleObject(topmostComponent, g.getBuiltins().PartOf);\r
236 //        return parent;\r
237         return topmostComponent;\r
238     }\r
239 \r
240     public static List<Resource> getCompositePathToConfiguration(ReadGraph graph, Resource composite) throws DatabaseException {\r
241         Layer0 L0 = Layer0.getInstance(graph);\r
242         SimulationResource SIMU = SimulationResource.getInstance(graph);\r
243         LinkedList<Resource> compositePath = new LinkedList<Resource>();\r
244         while (!graph.hasStatement(composite, SIMU.IsConfigurationOf)) {\r
245             compositePath.addFirst(composite);\r
246             composite = graph.getPossibleObject(composite, L0.PartOf);\r
247             if (composite == null)\r
248                 return null;\r
249         }\r
250         return compositePath;\r
251     }\r
252 \r
253 }\r