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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.modeling;
\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
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
30 * @author Tuukka Lehtonen
\r
32 public final class ComponentUtils {
\r
34 public static boolean componentHasDiagram(ReadGraph g, Resource component) throws DatabaseException {
\r
35 return !getComponentDiagrams(g, component).isEmpty();
\r
38 public static boolean compositeHasDiagram(ReadGraph g, Resource composite) throws DatabaseException {
\r
39 return !getCompositeDiagrams(g, composite).isEmpty();
\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
51 public static Collection<Resource> getCompositeDiagrams(ReadGraph g, Resource composite) throws DatabaseException {
\r
52 return g.getObjects(composite, ModelingResources.getInstance(g).CompositeToDiagram);
\r
55 public static Resource getCompositeDiagram(ReadGraph g, Resource composite) throws DatabaseException {
\r
56 return g.getSingleObject(composite, ModelingResources.getInstance(g).CompositeToDiagram);
\r
59 public static Resource getPossibleCompositeDiagram(ReadGraph g, Resource composite) throws DatabaseException {
\r
60 return g.getPossibleObject(composite, ModelingResources.getInstance(g).CompositeToDiagram);
\r
63 public static Resource getPossibleDiagramComposite(ReadGraph g, Resource diagram) throws DatabaseException {
\r
64 return g.getPossibleObject(diagram, ModelingResources.getInstance(g).DiagramToComposite);
\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
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
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
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
93 // List<Resource> result = new ArrayList<Resource>();
\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
109 // return ResourceArray.EMPTY;
\r
112 // while (component != null) {
\r
113 //// System.out.println("ADDING COMPONENT: " + NameUtils.getSafeName(g, component));
\r
114 // result.add(component);
\r
116 // Resource composite = g.getPossibleObject(component, b.PartOf);
\r
117 // if (composite == null)
\r
119 //// System.out.println(" PART OF: " + NameUtils.getSafeName(g, composite));
\r
121 // Resource defines = g.getPossibleObject(composite, sr.Defines);
\r
122 // if (defines == null)
\r
124 //// System.out.println(" WHICH DEFINES: " + NameUtils.getSafeName(g, defines));
\r
126 // component = g.getPossibleObject(defines, b.HasSingleInstance);
\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
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
139 List<Resource> result = new ArrayList<Resource>();
\r
141 // System.out.println("checking composite or component: " + NameUtils.getSafeName(g, compositeOrComponent));
\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
151 return ResourceArray.EMPTY;
\r
153 // System.out.println("start path browsing from: " + NameUtils.getSafeName(g, component));
\r
155 while (component != null) {
\r
156 // System.out.println("ADDING COMPONENT: " + NameUtils.getSafeName(g, component));
\r
157 result.add(component);
\r
159 Resource composite = g.getPossibleObject(component, b.PartOf);
\r
160 if (composite == null)
\r
162 if (!g.isInstanceOf(composite, sr.Composite)) {
\r
163 // System.out.println(" PART OF NON-COMPOSITE: " + NameUtils.getSafeName(g, composite));
\r
166 // System.out.println(" PART OF COMPOSITE: " + NameUtils.getSafeName(g, composite));
\r
167 component = composite;
\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
175 public static Resource getCompositeConfigurationRoot(ReadGraph g, Resource composite) throws DatabaseException {
\r
176 StructuralResource2 sr = StructuralResource2.getInstance(g);
\r
178 if (!g.isInstanceOf(composite, sr.Composite))
\r
179 throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, composite) + " is not a composite component");
\r
181 ResourceArray path = getStructuralPath(g, composite);
\r
182 if (path.isEmpty()) {
\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
190 return topmostComponent;
\r
193 public static Resource getComponentConfigurationRoot(ReadGraph g, Resource component) throws DatabaseException {
\r
194 StructuralResource2 sr = StructuralResource2.getInstance(g);
\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
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
206 return topmostComponent;
\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
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
218 Resource container = g.getPossibleObject(component, l0.PartOf);
\r
219 if (container == null)
\r
224 public static Resource tryGetComponentConfigurationRoot(ReadGraph g, Resource component) throws DatabaseException {
\r
225 StructuralResource2 sr = StructuralResource2.getInstance(g);
\r
227 if (g.isInstanceOf(component, sr.Composite))
\r
229 if (!g.isInstanceOf(component, sr.Component))
\r
232 ResourceArray path = getStructuralPath(g, component);
\r
233 Resource topmostComponent = path.isEmpty() ? component : path.resources[path.resources.length - 1];
\r
235 // Resource parent = g.getPossibleObject(topmostComponent, g.getBuiltins().PartOf);
\r
237 return topmostComponent;
\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
250 return compositePath;
\r