-package org.simantics.diagram.synchronization.graph;\r
-\r
-import gnu.trove.set.hash.THashSet;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.Collections;\r
-import java.util.List;\r
-\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Statement;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.util.RelativeReference;\r
-import org.simantics.diagram.stubs.DiagramResource;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.modeling.ModelingResources;\r
-import org.simantics.structural.stubs.StructuralResource2;\r
-\r
-public class ElementIdentification {\r
-\r
- /**\r
- * Browses from given resource to neighbor resources by connectors.\r
- * @param g\r
- * @param r\r
- * @return\r
- */\r
- private static ArrayList<Statement> browseConnectors(ReadGraph g, Resource r) throws DatabaseException {\r
- ArrayList<Statement> result = new ArrayList<Statement>(2);\r
- StructuralResource2 STR = StructuralResource2.getInstance(g);\r
- for(Resource connector : g.getObjects(r, STR.IsConnectedTo))\r
- for(Statement other : g.getStatements(connector, STR.Connects))\r
- if(!other.getObject().equals(r))\r
- result.add(other);\r
- return result;\r
- }\r
- \r
- private static Resource getJoinedFlag(ReadGraph g, Resource r) throws DatabaseException {\r
- DiagramResource DIA = DiagramResource.getInstance(g);\r
- for(Resource join : g.getObjects(r, DIA.FlagIsJoinedBy))\r
- for(Resource flag : g.getObjects(join, DIA.JoinsFlag))\r
- if(!flag.equals(r))\r
- return flag;\r
- return null;\r
- }\r
- \r
- /**\r
- * Returns an identifier of the flag or null if the procedure fails.\r
- */\r
- private static RelativeReference getSimpleFlagIdentifier(ReadGraph g, Resource flag) throws DatabaseException {\r
- DiagramResource DIA = DiagramResource.getInstance(g); \r
- if(!g.isInstanceOf(flag, DIA.Flag))\r
- return null;\r
- ArrayList<Statement> connections = browseConnectors(g, flag);\r
- if(connections.size() != 1)\r
- return null; \r
- Resource connection = connections.get(0).getObject();\r
- ArrayList<Statement> connections2 = browseConnectors(g, connection);\r
- for(Statement stat : connections2) {\r
- Resource element = stat.getObject();\r
- if(!g.isInstanceOf(element, DIA.Flag)) { \r
- Resource relation = g.getInverse(stat.getPredicate()); \r
- RelativeReference ref = getElementIdentifier(g, element);\r
- if(ref != null) {\r
- Layer0 L0 = Layer0.getInstance(g);\r
- return new RelativeReference(ref.base, ref.path + "#" + \r
- g.getRelatedValue(relation, L0.HasName) \r
- );\r
- }\r
- } \r
- }\r
- return null;\r
- }\r
- \r
- private static RelativeReference getFlagIdentifier(ReadGraph g, Resource flag) throws DatabaseException {\r
- RelativeReference ref1 = getSimpleFlagIdentifier(g, flag);\r
- if(ref1 == null)\r
- return null;\r
- Resource otherFlag = getJoinedFlag(g, flag);\r
- if(otherFlag == null)\r
- return new RelativeReference(ref1.base, "UNJOINED_FLAG|" + ref1.path);\r
- else {\r
- RelativeReference ref2 = getSimpleFlagIdentifier(g, otherFlag);\r
- if(ref2 == null)\r
- return new RelativeReference(ref1.base, "UNJOINED_FLAG|" + ref1.path);\r
- return new RelativeReference(ref1.base, "FLAG|" + ref1.path + "|" + ref2.path);\r
- }\r
- }\r
- \r
- public static RelativeReference getElementIdentifier(ReadGraph g, Resource element) throws DatabaseException {\r
- DiagramResource DIA = DiagramResource.getInstance(g);\r
- ModelingResources MOD = ModelingResources.getInstance(g);\r
- if(g.isInstanceOf(element, DIA.Flag)) {\r
- return getFlagIdentifier(g, element); \r
- }\r
- else if(g.isInstanceOf(element, MOD.ReferenceElement)) {\r
- Resource parent = g.getPossibleObject(element, MOD.HasParentComponent);\r
- if(parent == null)\r
- return null;\r
- RelativeReference parentRef = \r
- RelativeReference.createReference(g, MOD.StructuralModel, parent);\r
- if(parentRef == null)\r
- return null;\r
- Resource referenceRelation = \r
- g.getPossibleObject(element, MOD.HasReferenceRelation);\r
- if(referenceRelation == null)\r
- return null;\r
- Layer0 L0 = Layer0.getInstance(g);\r
- return new RelativeReference(parentRef.base, \r
- "REFERENCE#"+parentRef.path+"#"+\r
- g.getRelatedValue(referenceRelation, L0.HasName));\r
- }\r
- else { \r
- Resource component = g.getPossibleObject(element, MOD.ElementToComponent);\r
- if(component == null)\r
- return null;\r
- return RelativeReference.createReference(g, MOD.StructuralModel, component);\r
- } \r
- }\r
- \r
- public static RelativeReference getConnectorIdentifier(ReadGraph g, Resource connector) throws DatabaseException {\r
- StructuralResource2 STR = StructuralResource2.getInstance(g);\r
- DiagramResource DIA = DiagramResource.getInstance(g);\r
- Layer0 L0 = Layer0.getInstance(g);\r
- \r
- for(Statement stat : g.getStatements(connector, STR.Connects)) {\r
- if(!g.isInstanceOf(stat.getObject(), DIA.Connection)) {\r
- RelativeReference ref = getElementIdentifier(g, stat.getObject());\r
- if(ref == null || ref.path == null)\r
- continue;\r
- if(ref.path.contains("#"))\r
- return ref;\r
- else\r
- return new RelativeReference(ref.base, ref.path + "#" + \r
- g.getRelatedValue(g.getInverse(stat.getPredicate()), L0.HasName));\r
- }\r
- }\r
- return new RelativeReference(null, "UNK");\r
- } \r
- \r
- private static Resource resolveElementFromComponent(ReadGraph graph, Resource model, String path) throws DatabaseException {\r
- Resource component = RelativeReference.resolve(graph, model, path);\r
- if(component == null) {\r
- System.err.println("Didn't find component " + path);\r
- return null;\r
- }\r
- \r
- ModelingResources MOD = ModelingResources.getInstance(graph);\r
- Resource element = graph.getPossibleObject(component, MOD.ComponentToElement);\r
- if(element == null) {\r
- System.err.println("Didn't find element for component " + path);\r
- return null;\r
- } \r
- return element;\r
- }\r
- \r
- private static ArrayList<Resource> findRelatedFlags(ReadGraph graph, Resource model, String path) throws DatabaseException {\r
- ArrayList<Resource> result = new ArrayList<Resource>();\r
- String[] parts = path.split("#");\r
- Resource element;\r
- String attributeName;\r
- if(parts[0].equals("REFERENCE")) {\r
- element = resolveReference(graph, model, path);\r
- attributeName = parts[3];\r
- }\r
- else {\r
- element = resolveElementFromComponent(graph, model, parts[0]);\r
- attributeName = parts[1];\r
- }\r
- if(element == null)\r
- return result;\r
- StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
- DiagramResource DIA = DiagramResource.getInstance(graph);\r
- Layer0 L0 = Layer0.getInstance(graph);\r
- for(Statement stat : graph.getStatements(element, STR.IsConnectedTo)) {\r
- if(attributeName.equals(graph.getRelatedValue(stat.getPredicate(), L0.HasName))) {\r
- Resource connector1 = stat.getObject();\r
- for(Resource connection : graph.getObjects(connector1, STR.Connects)) {\r
- for(Resource connector2 : graph.getObjects(connection, STR.IsConnectedTo))\r
- if(!connector2.equals(connector1)) {\r
- for(Resource flag : graph.getObjects(connector2, STR.Connects)) {\r
- if(graph.isInstanceOf(flag, DIA.Flag))\r
- result.add(flag);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- return result;\r
- }\r
- \r
- public static Resource resolveElement(ReadGraph graph, Resource model, String path) throws DatabaseException {\r
- String[] parts = path.split("\\|");\r
- \r
- if(parts[0].equals("UNJOINED_FLAG")) {\r
- ArrayList<Resource> flags = findRelatedFlags(graph, model, parts[1]);\r
- if(flags.isEmpty()) {\r
- System.err.println("Didn't find any flag " + path);\r
- return null;\r
- }\r
- // TODO filter multiple found flags\r
- return flags.get(0);\r
- }\r
- else if(parts[0].equals("FLAG")) {\r
- ArrayList<Resource> flags = findRelatedFlags(graph, model, parts[1]);\r
- if(flags.isEmpty()) {\r
- System.err.println("Didn't find any flag " + path);\r
- return null;\r
- }\r
- if(flags.size() == 1)\r
- return flags.get(0);\r
- THashSet<Resource> flagSet = new THashSet<Resource>(findRelatedFlags(graph, model, parts[2]));\r
- DiagramResource DIA = DiagramResource.getInstance(graph);\r
- for(Resource f : flags)\r
- for(Resource join : graph.getObjects(f, DIA.FlagIsJoinedBy))\r
- for(Resource otherFlag : graph.getObjects(join, DIA.JoinsFlag))\r
- if(flagSet.contains(otherFlag))\r
- return f;\r
- System.err.println("Ambiguous flag reference " + path);\r
- return null;\r
- }\r
- else if(path.startsWith("REFERENCE#")) {\r
- return resolveReference(graph, model, path);\r
- }\r
- else {\r
- return resolveElementFromComponent(graph, model, path);\r
- }\r
- }\r
- \r
- private static Resource resolveReference(ReadGraph graph, Resource model, String path) throws DatabaseException {\r
- String[] parts = path.split("#");\r
- Resource component = RelativeReference.resolve(graph, model, parts[1]);\r
- if(component == null) {\r
- System.err.println("Didn't find component " + path);\r
- return null;\r
- }\r
- \r
- ModelingResources MOD = ModelingResources.getInstance(graph);\r
- Layer0 L0 = Layer0.getInstance(graph);\r
- for(Resource element : graph.getObjects(component, MOD.HasParentComponent_Inverse)) {\r
- Resource referenceRelation = graph.getSingleObject(element, MOD.HasReferenceRelation);\r
- if(parts[2].equals(graph.getRelatedValue(referenceRelation, L0.HasName)))\r
- return element;\r
- }\r
-\r
- System.err.println("Didn't find element for " + path);\r
- return null;\r
- }\r
- \r
- public static List<Resource> resolveConnector(ReadGraph g, Resource model,\r
- String name) throws DatabaseException {\r
- if(name.equals("UNK"))\r
- return Collections.emptyList();\r
- if(name.startsWith("FLAG|") || name.startsWith("UNKNOWN_FLAG|")) {\r
- Resource element = resolveElement(g, model, name);\r
- return Arrays.asList(g.getSingleObject(element, \r
- DiagramResource.getInstance(g).Flag_ConnectionPoint));\r
- }\r
- String[] parts = name.split("#");\r
- Resource element = resolveElement(g, model, parts[0]);\r
- if (element == null)\r
- return Collections.emptyList();\r
- StructuralResource2 STR = StructuralResource2.getInstance(g);\r
- Layer0 L0 = Layer0.getInstance(g);\r
- ArrayList<Resource> result = new ArrayList<Resource>(2);\r
- for(Statement stat : g.getStatements(element, STR.IsConnectedTo))\r
- if(g.getRelatedValue(stat.getPredicate(), L0.HasName).equals(parts[1]))\r
- result.add(stat.getObject());\r
- return result;\r
- }\r
- \r
-}\r
+package org.simantics.diagram.synchronization.graph;
+
+import gnu.trove.set.hash.THashSet;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.Statement;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.util.RelativeReference;
+import org.simantics.diagram.stubs.DiagramResource;
+import org.simantics.layer0.Layer0;
+import org.simantics.modeling.ModelingResources;
+import org.simantics.structural.stubs.StructuralResource2;
+
+public class ElementIdentification {
+
+ /**
+ * Browses from given resource to neighbor resources by connectors.
+ * @param g
+ * @param r
+ * @return
+ */
+ private static ArrayList<Statement> browseConnectors(ReadGraph g, Resource r) throws DatabaseException {
+ ArrayList<Statement> result = new ArrayList<Statement>(2);
+ StructuralResource2 STR = StructuralResource2.getInstance(g);
+ for(Resource connector : g.getObjects(r, STR.IsConnectedTo))
+ for(Statement other : g.getStatements(connector, STR.Connects))
+ if(!other.getObject().equals(r))
+ result.add(other);
+ return result;
+ }
+
+ private static Resource getJoinedFlag(ReadGraph g, Resource r) throws DatabaseException {
+ DiagramResource DIA = DiagramResource.getInstance(g);
+ for(Resource join : g.getObjects(r, DIA.FlagIsJoinedBy))
+ for(Resource flag : g.getObjects(join, DIA.JoinsFlag))
+ if(!flag.equals(r))
+ return flag;
+ return null;
+ }
+
+ /**
+ * Returns an identifier of the flag or null if the procedure fails.
+ */
+ private static RelativeReference getSimpleFlagIdentifier(ReadGraph g, Resource flag) throws DatabaseException {
+ DiagramResource DIA = DiagramResource.getInstance(g);
+ if(!g.isInstanceOf(flag, DIA.Flag))
+ return null;
+ ArrayList<Statement> connections = browseConnectors(g, flag);
+ if(connections.size() != 1)
+ return null;
+ Resource connection = connections.get(0).getObject();
+ ArrayList<Statement> connections2 = browseConnectors(g, connection);
+ for(Statement stat : connections2) {
+ Resource element = stat.getObject();
+ if(!g.isInstanceOf(element, DIA.Flag)) {
+ Resource relation = g.getInverse(stat.getPredicate());
+ RelativeReference ref = getElementIdentifier(g, element);
+ if(ref != null) {
+ Layer0 L0 = Layer0.getInstance(g);
+ return new RelativeReference(ref.base, ref.path + "#" +
+ g.getRelatedValue(relation, L0.HasName)
+ );
+ }
+ }
+ }
+ return null;
+ }
+
+ private static RelativeReference getFlagIdentifier(ReadGraph g, Resource flag) throws DatabaseException {
+ RelativeReference ref1 = getSimpleFlagIdentifier(g, flag);
+ if(ref1 == null)
+ return null;
+ Resource otherFlag = getJoinedFlag(g, flag);
+ if(otherFlag == null)
+ return new RelativeReference(ref1.base, "UNJOINED_FLAG|" + ref1.path);
+ else {
+ RelativeReference ref2 = getSimpleFlagIdentifier(g, otherFlag);
+ if(ref2 == null)
+ return new RelativeReference(ref1.base, "UNJOINED_FLAG|" + ref1.path);
+ return new RelativeReference(ref1.base, "FLAG|" + ref1.path + "|" + ref2.path);
+ }
+ }
+
+ public static RelativeReference getElementIdentifier(ReadGraph g, Resource element) throws DatabaseException {
+ DiagramResource DIA = DiagramResource.getInstance(g);
+ ModelingResources MOD = ModelingResources.getInstance(g);
+ if(g.isInstanceOf(element, DIA.Flag)) {
+ return getFlagIdentifier(g, element);
+ }
+ else if(g.isInstanceOf(element, MOD.ReferenceElement)) {
+ Resource parent = g.getPossibleObject(element, MOD.HasParentComponent);
+ if(parent == null)
+ return null;
+ RelativeReference parentRef =
+ RelativeReference.createReference(g, MOD.StructuralModel, parent);
+ if(parentRef == null)
+ return null;
+ Resource referenceRelation =
+ g.getPossibleObject(element, MOD.HasReferenceRelation);
+ if(referenceRelation == null)
+ return null;
+ Layer0 L0 = Layer0.getInstance(g);
+ return new RelativeReference(parentRef.base,
+ "REFERENCE#"+parentRef.path+"#"+
+ g.getRelatedValue(referenceRelation, L0.HasName));
+ }
+ else {
+ Resource component = g.getPossibleObject(element, MOD.ElementToComponent);
+ if(component == null)
+ return null;
+ return RelativeReference.createReference(g, MOD.StructuralModel, component);
+ }
+ }
+
+ public static RelativeReference getConnectorIdentifier(ReadGraph g, Resource connector) throws DatabaseException {
+ StructuralResource2 STR = StructuralResource2.getInstance(g);
+ DiagramResource DIA = DiagramResource.getInstance(g);
+ Layer0 L0 = Layer0.getInstance(g);
+
+ for(Statement stat : g.getStatements(connector, STR.Connects)) {
+ if(!g.isInstanceOf(stat.getObject(), DIA.Connection)) {
+ RelativeReference ref = getElementIdentifier(g, stat.getObject());
+ if(ref == null || ref.path == null)
+ continue;
+ if(ref.path.contains("#"))
+ return ref;
+ else
+ return new RelativeReference(ref.base, ref.path + "#" +
+ g.getRelatedValue(g.getInverse(stat.getPredicate()), L0.HasName));
+ }
+ }
+ return new RelativeReference(null, "UNK");
+ }
+
+ private static Resource resolveElementFromComponent(ReadGraph graph, Resource model, String path) throws DatabaseException {
+ Resource component = RelativeReference.resolve(graph, model, path);
+ if(component == null) {
+ System.err.println("Didn't find component " + path);
+ return null;
+ }
+
+ ModelingResources MOD = ModelingResources.getInstance(graph);
+ Resource element = graph.getPossibleObject(component, MOD.ComponentToElement);
+ if(element == null) {
+ System.err.println("Didn't find element for component " + path);
+ return null;
+ }
+ return element;
+ }
+
+ private static ArrayList<Resource> findRelatedFlags(ReadGraph graph, Resource model, String path) throws DatabaseException {
+ ArrayList<Resource> result = new ArrayList<Resource>();
+ String[] parts = path.split("#");
+ Resource element;
+ String attributeName;
+ if(parts[0].equals("REFERENCE")) {
+ element = resolveReference(graph, model, path);
+ attributeName = parts[3];
+ }
+ else {
+ element = resolveElementFromComponent(graph, model, parts[0]);
+ attributeName = parts[1];
+ }
+ if(element == null)
+ return result;
+ StructuralResource2 STR = StructuralResource2.getInstance(graph);
+ DiagramResource DIA = DiagramResource.getInstance(graph);
+ Layer0 L0 = Layer0.getInstance(graph);
+ for(Statement stat : graph.getStatements(element, STR.IsConnectedTo)) {
+ if(attributeName.equals(graph.getRelatedValue(stat.getPredicate(), L0.HasName))) {
+ Resource connector1 = stat.getObject();
+ for(Resource connection : graph.getObjects(connector1, STR.Connects)) {
+ for(Resource connector2 : graph.getObjects(connection, STR.IsConnectedTo))
+ if(!connector2.equals(connector1)) {
+ for(Resource flag : graph.getObjects(connector2, STR.Connects)) {
+ if(graph.isInstanceOf(flag, DIA.Flag))
+ result.add(flag);
+ }
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ public static Resource resolveElement(ReadGraph graph, Resource model, String path) throws DatabaseException {
+ String[] parts = path.split("\\|");
+
+ if(parts[0].equals("UNJOINED_FLAG")) {
+ ArrayList<Resource> flags = findRelatedFlags(graph, model, parts[1]);
+ if(flags.isEmpty()) {
+ System.err.println("Didn't find any flag " + path);
+ return null;
+ }
+ // TODO filter multiple found flags
+ return flags.get(0);
+ }
+ else if(parts[0].equals("FLAG")) {
+ ArrayList<Resource> flags = findRelatedFlags(graph, model, parts[1]);
+ if(flags.isEmpty()) {
+ System.err.println("Didn't find any flag " + path);
+ return null;
+ }
+ if(flags.size() == 1)
+ return flags.get(0);
+ THashSet<Resource> flagSet = new THashSet<Resource>(findRelatedFlags(graph, model, parts[2]));
+ DiagramResource DIA = DiagramResource.getInstance(graph);
+ for(Resource f : flags)
+ for(Resource join : graph.getObjects(f, DIA.FlagIsJoinedBy))
+ for(Resource otherFlag : graph.getObjects(join, DIA.JoinsFlag))
+ if(flagSet.contains(otherFlag))
+ return f;
+ System.err.println("Ambiguous flag reference " + path);
+ return null;
+ }
+ else if(path.startsWith("REFERENCE#")) {
+ return resolveReference(graph, model, path);
+ }
+ else {
+ return resolveElementFromComponent(graph, model, path);
+ }
+ }
+
+ private static Resource resolveReference(ReadGraph graph, Resource model, String path) throws DatabaseException {
+ String[] parts = path.split("#");
+ Resource component = RelativeReference.resolve(graph, model, parts[1]);
+ if(component == null) {
+ System.err.println("Didn't find component " + path);
+ return null;
+ }
+
+ ModelingResources MOD = ModelingResources.getInstance(graph);
+ Layer0 L0 = Layer0.getInstance(graph);
+ for(Resource element : graph.getObjects(component, MOD.HasParentComponent_Inverse)) {
+ Resource referenceRelation = graph.getSingleObject(element, MOD.HasReferenceRelation);
+ if(parts[2].equals(graph.getRelatedValue(referenceRelation, L0.HasName)))
+ return element;
+ }
+
+ System.err.println("Didn't find element for " + path);
+ return null;
+ }
+
+ public static List<Resource> resolveConnector(ReadGraph g, Resource model,
+ String name) throws DatabaseException {
+ if(name.equals("UNK"))
+ return Collections.emptyList();
+ if(name.startsWith("FLAG|") || name.startsWith("UNKNOWN_FLAG|")) {
+ Resource element = resolveElement(g, model, name);
+ return Arrays.asList(g.getSingleObject(element,
+ DiagramResource.getInstance(g).Flag_ConnectionPoint));
+ }
+ String[] parts = name.split("#");
+ Resource element = resolveElement(g, model, parts[0]);
+ if (element == null)
+ return Collections.emptyList();
+ StructuralResource2 STR = StructuralResource2.getInstance(g);
+ Layer0 L0 = Layer0.getInstance(g);
+ ArrayList<Resource> result = new ArrayList<Resource>(2);
+ for(Statement stat : g.getStatements(element, STR.IsConnectedTo))
+ if(g.getRelatedValue(stat.getPredicate(), L0.HasName).equals(parts[1]))
+ result.add(stat.getObject());
+ return result;
+ }
+
+}