]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / ComponentUtils.java
diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentUtils.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentUtils.java
new file mode 100644 (file)
index 0000000..c34efd3
--- /dev/null
@@ -0,0 +1,253 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.modeling;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.ResourceArray;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.simulation.ontology.SimulationResource;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public final class ComponentUtils {\r
+\r
+    public static boolean componentHasDiagram(ReadGraph g, Resource component) throws DatabaseException {\r
+        return !getComponentDiagrams(g, component).isEmpty();\r
+    }\r
+\r
+    public static boolean compositeHasDiagram(ReadGraph g, Resource composite) throws DatabaseException {\r
+        return !getCompositeDiagrams(g, composite).isEmpty();\r
+    }\r
+\r
+    public static Collection<Resource> getComponentDiagrams(ReadGraph g, Resource component) throws DatabaseException {\r
+        StructuralResource2 sr = StructuralResource2.getInstance(g);\r
+        Resource componentType = g.getPossibleType(component, sr.Component);\r
+        Resource composite = componentType != null ? g.getPossibleObject(componentType, sr.IsDefinedBy) : null;\r
+        if (composite != null)\r
+            return getCompositeDiagrams(g, composite);\r
+        return Collections.emptyList();\r
+    }\r
+\r
+    public static Collection<Resource> getCompositeDiagrams(ReadGraph g, Resource composite) throws DatabaseException {\r
+        return g.getObjects(composite, ModelingResources.getInstance(g).CompositeToDiagram);\r
+    }\r
+\r
+    public static Resource getCompositeDiagram(ReadGraph g, Resource composite) throws DatabaseException {\r
+        return g.getSingleObject(composite, ModelingResources.getInstance(g).CompositeToDiagram);\r
+    }\r
+\r
+    public static Resource getPossibleCompositeDiagram(ReadGraph g, Resource composite) throws DatabaseException {\r
+        return g.getPossibleObject(composite, ModelingResources.getInstance(g).CompositeToDiagram);\r
+    }\r
+\r
+    public static Resource getPossibleDiagramComposite(ReadGraph g, Resource diagram) throws DatabaseException {\r
+        return g.getPossibleObject(diagram, ModelingResources.getInstance(g).DiagramToComposite);\r
+    }\r
+\r
+    public static Collection<ResourceArray> formInputs(ReadGraph g, Resource compositeOrComponent) throws DatabaseException {\r
+        ResourceArray path = getStructuralPath(g, compositeOrComponent);\r
+        Collection<ResourceArray> inputs = new ArrayList<ResourceArray>();\r
+\r
+        if (compositeHasDiagram(g, compositeOrComponent)) {\r
+            for (Resource dia : getCompositeDiagrams(g, compositeOrComponent)) {\r
+                //System.out.println(": " + NameUtils.getSafeName(g, compositeOrComponent));\r
+                //System.out.println(": " + NameUtils.getSafeName(g, dia));\r
+                inputs.add(path.prepended(dia));\r
+            }\r
+        } else if (componentHasDiagram(g, compositeOrComponent)) {\r
+            for (Resource dia : getComponentDiagrams(g, compositeOrComponent)) {\r
+                //System.out.println("* " + NameUtils.getSafeName(g, compositeOrComponent));\r
+                //System.out.println("* " + NameUtils.getSafeName(g, dia));\r
+                inputs.add(path.prepended(dia));\r
+            }\r
+        }\r
+\r
+        return inputs;\r
+    }\r
+\r
+//    public static ResourceArray getStructuralPath(ReadGraph g, Resource compositeOrComponent) throws DatabaseException {\r
+//        Builtins b = g.getBuiltins();\r
+//        StructuralResource2 sr = StructuralResource2.getInstance(g);\r
+//        Resource component = null;\r
+//\r
+//        List<Resource> result = new ArrayList<Resource>();\r
+//\r
+//        // Find component where to start the path browsing\r
+//        if (g.isInstanceOf(compositeOrComponent, sr.Composite)) {\r
+////            System.out.println("got composite: " + NameUtils.getSafeName(g, compositeOrComponent));\r
+//            Resource defines = g.getPossibleObject(compositeOrComponent, sr.Defines);\r
+//            if (defines == null)\r
+//                return ResourceArray.EMPTY;\r
+//            component = g.getPossibleObject(defines, b.HasSingleInstance);\r
+//            if (component == null)\r
+//                return ResourceArray.EMPTY;\r
+////            System.out.println("start path browsing from: " + NameUtils.getSafeName(g, component));\r
+//        } else if (g.isInstanceOf(compositeOrComponent, sr.Component)) {\r
+////            System.out.println("got component: " + NameUtils.getSafeName(g, compositeOrComponent));\r
+//            component = compositeOrComponent;\r
+//        } else {\r
+//            return ResourceArray.EMPTY;\r
+//        }\r
+//\r
+//        while (component != null) {\r
+////            System.out.println("ADDING COMPONENT: " + NameUtils.getSafeName(g, component));\r
+//            result.add(component);\r
+//\r
+//            Resource composite = g.getPossibleObject(component, b.PartOf);\r
+//            if (composite == null)\r
+//                break;\r
+////            System.out.println("  PART OF: " + NameUtils.getSafeName(g, composite));\r
+//\r
+//            Resource defines = g.getPossibleObject(composite, sr.Defines);\r
+//            if (defines == null)\r
+//                break;\r
+////            System.out.println("  WHICH DEFINES: " + NameUtils.getSafeName(g, defines));\r
+//\r
+//            component = g.getPossibleObject(defines, b.HasSingleInstance);\r
+//        }\r
+////        System.out.println("FOUND PATH:");\r
+////        for (Resource r : result)\r
+////            System.out.println("    " + NameUtils.getSafeName(g, r));\r
+//        return new ResourceArray(result);\r
+//    }\r
+\r
+    public static ResourceArray getStructuralPath(ReadGraph g, Resource compositeOrComponent) throws DatabaseException {\r
+        Layer0 b = Layer0.getInstance(g);\r
+        StructuralResource2 sr = StructuralResource2.getInstance(g);\r
+        Resource component = null;\r
+\r
+        List<Resource> result = new ArrayList<Resource>();\r
+\r
+//        System.out.println("checking composite or component: " + NameUtils.getSafeName(g, compositeOrComponent));\r
+\r
+        // Find component where to start the path browsing\r
+        if (g.isInstanceOf(compositeOrComponent, sr.Composite)) {\r
+//            System.out.println("got composite: " + NameUtils.getSafeName(g, compositeOrComponent));\r
+            component = compositeOrComponent;\r
+        } else if (g.isInstanceOf(compositeOrComponent, sr.Component)) {\r
+//            System.out.println("got component: " + NameUtils.getSafeName(g, compositeOrComponent));\r
+            component = compositeOrComponent;\r
+        } else {\r
+            return ResourceArray.EMPTY;\r
+        }\r
+//        System.out.println("start path browsing from: " + NameUtils.getSafeName(g, component));\r
+\r
+        while (component != null) {\r
+//            System.out.println("ADDING COMPONENT: " + NameUtils.getSafeName(g, component));\r
+            result.add(component);\r
+\r
+            Resource composite = g.getPossibleObject(component, b.PartOf);\r
+            if (composite == null)\r
+                break;\r
+            if (!g.isInstanceOf(composite, sr.Composite)) {\r
+//                System.out.println("  PART OF NON-COMPOSITE: " + NameUtils.getSafeName(g, composite));\r
+                break;\r
+            }\r
+//            System.out.println("  PART OF COMPOSITE: " + NameUtils.getSafeName(g, composite));\r
+            component = composite;\r
+        }\r
+//        System.out.println("FOUND PATH:");\r
+//        for (Resource r : result)\r
+//            System.out.println("    " + NameUtils.getSafeName(g, r));\r
+        return new ResourceArray(result);\r
+    }\r
+\r
+    public static Resource getCompositeConfigurationRoot(ReadGraph g, Resource composite) throws DatabaseException {\r
+        StructuralResource2 sr = StructuralResource2.getInstance(g);\r
+\r
+        if (!g.isInstanceOf(composite, sr.Composite))\r
+            throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, composite) + " is not a composite component");\r
+\r
+        ResourceArray path = getStructuralPath(g, composite);\r
+        if (path.isEmpty()) {\r
+            return composite;\r
+        }\r
+\r
+        Resource topmostComponent = path.resources[path.resources.length - 1];\r
+        //Resource parent = g.getPossibleObject(topmostComponent, g.getBuiltins().PartOf);\r
+        //assert parent != null;\r
+        //return parent;\r
+        return topmostComponent;\r
+    }\r
+\r
+    public static Resource getComponentConfigurationRoot(ReadGraph g, Resource component) throws DatabaseException {\r
+        StructuralResource2 sr = StructuralResource2.getInstance(g);\r
+\r
+        if (g.isInstanceOf(component, sr.Composite))\r
+            throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, component) + " is a composite component");\r
+        if (!g.isInstanceOf(component, sr.Component))\r
+            throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, component) + " is not a component");\r
+\r
+        ResourceArray path = getStructuralPath(g, component);\r
+        Resource topmostComponent = path.isEmpty() ? component : path.resources[path.resources.length - 1];\r
+//        Resource parent = g.getPossibleObject(topmostComponent, g.getBuiltins().PartOf);\r
+//        assert parent != null;\r
+//        return parent;\r
+        return topmostComponent;\r
+    }\r
+\r
+    public static Resource tryGetComponentContainer(ReadGraph g, Resource component) throws DatabaseException {\r
+        Layer0 l0 = Layer0.getInstance(g);\r
+        StructuralResource2 sr = StructuralResource2.getInstance(g);\r
+\r
+        if (g.isInstanceOf(component, sr.Composite))\r
+            throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, component) + " is a composite component");\r
+        if (!g.isInstanceOf(component, sr.Component))\r
+            throw new IllegalArgumentException("argument " + NameUtils.getSafeName(g, component) + " is not a component");\r
+\r
+        Resource container = g.getPossibleObject(component, l0.PartOf);\r
+        if (container == null)\r
+            return null;\r
+        return container;\r
+    }\r
+\r
+    public static Resource tryGetComponentConfigurationRoot(ReadGraph g, Resource component) throws DatabaseException {\r
+        StructuralResource2 sr = StructuralResource2.getInstance(g);\r
+\r
+        if (g.isInstanceOf(component, sr.Composite))\r
+            return null;\r
+        if (!g.isInstanceOf(component, sr.Component))\r
+            return null;\r
+\r
+        ResourceArray path = getStructuralPath(g, component);\r
+        Resource topmostComponent = path.isEmpty() ? component : path.resources[path.resources.length - 1];\r
+\r
+//        Resource parent = g.getPossibleObject(topmostComponent, g.getBuiltins().PartOf);\r
+//        return parent;\r
+        return topmostComponent;\r
+    }\r
+\r
+    public static List<Resource> getCompositePathToConfiguration(ReadGraph graph, Resource composite) throws DatabaseException {\r
+        Layer0 L0 = Layer0.getInstance(graph);\r
+        SimulationResource SIMU = SimulationResource.getInstance(graph);\r
+        LinkedList<Resource> compositePath = new LinkedList<Resource>();\r
+        while (!graph.hasStatement(composite, SIMU.IsConfigurationOf)) {\r
+            compositePath.addFirst(composite);\r
+            composite = graph.getPossibleObject(composite, L0.PartOf);\r
+            if (composite == null)\r
+                return null;\r
+        }\r
+        return compositePath;\r
+    }\r
+\r
+}\r