--- /dev/null
+package org.simantics.modeling.mapping;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+\r
+import java.util.ArrayList;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.common.request.ResourceRead;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.mapping.IContextualModification;\r
+import org.simantics.mapping.constraint.instructions.Instruction3;\r
+import org.simantics.modeling.ModelingResources;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+\r
+public class DiagramConnectionExistence extends Instruction3 {\r
+\r
+ public DiagramConnectionExistence(int variable0, int variable1,\r
+ int variable2) {\r
+ super(variable0, variable1, variable2);\r
+ }\r
+ \r
+ /* and(bf(MOD.ConnectionRelationToDiagramConnectionRelation, ConnectionRelation, DiagramConnectionRelation),\r
+ statement_bbf(Element, DiagramConnectionRelation, Connector),\r
+ bb(DIA.IsConnectorOf, Connector, Connection2)\r
+ )\r
+ */\r
+ private static class ConnectionsOfElement extends ResourceRead<THashMap<Resource,ArrayList<Resource>>> {\r
+ \r
+ public ConnectionsOfElement(Resource element) {\r
+ super(element);\r
+ }\r
+\r
+ @Override\r
+ public THashMap<Resource, ArrayList<Resource>> perform(ReadGraph graph)\r
+ throws DatabaseException {\r
+ THashMap<Resource, ArrayList<Resource>> result =\r
+ new THashMap<Resource, ArrayList<Resource>>(4);\r
+ StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
+ DiagramResource DIA = DiagramResource.getInstance(graph); \r
+ ModelingResources MOD = ModelingResources.getInstance(graph);\r
+ for(Statement stat : graph.getStatements(resource, STR.IsConnectedTo)) {\r
+ for(Resource configurationRelation : \r
+ graph.getObjects(stat.getPredicate(), \r
+ MOD.DiagramConnectionRelationToConnectionRelation)) {\r
+ ArrayList<Resource> l = result.get(configurationRelation);\r
+ if(l == null) {\r
+ l = new ArrayList<Resource>(2);\r
+ result.put(configurationRelation, l);\r
+ }\r
+ l.addAll(graph.getObjects(stat.getObject(), DIA.IsConnectorOf));\r
+ }\r
+ }\r
+ return result;\r
+ } \r
+ }\r
+ \r
+ @Override\r
+ public Object query(ReadGraph g, Object[] bindings)\r
+ throws DatabaseException {\r
+ Resource element = (Resource)bindings[variable0];\r
+ Resource connectionRelation = (Resource)bindings[variable1];\r
+ Resource connection2 = (Resource)bindings[variable2];\r
+ //System.out.println("query " + element + " " + connectionRelation + " " + connection2);\r
+ \r
+ THashMap<Resource, ArrayList<Resource>> map = g.syncRequest(new ConnectionsOfElement(element)); \r
+ //System.out.println(" " + map);\r
+ ArrayList<Resource> cs = map.get(connectionRelation);\r
+ if(cs != null && cs.contains(connection2))\r
+ return null;\r
+ else\r
+ return FAILURE;\r
+ }\r
+\r
+ @Override\r
+ public Object next(ReadGraph g, Object[] bindings, Object continuation)\r
+ throws DatabaseException {\r
+ return FAILURE;\r
+ }\r
+\r
+ @Override\r
+ public IContextualModification claim(ReadGraph g, Object[] bindings)\r
+ throws DatabaseException {\r
+ throw new UnsupportedOperationException();\r
+ }\r
+\r
+ @Override\r
+ public IContextualModification deny(ReadGraph g, Object[] bindings)\r
+ throws DatabaseException {\r
+ throw new UnsupportedOperationException();\r
+ }\r
+\r
+ @Override\r
+ public void toString(StringBuilder b, int indent) {\r
+ b.append("DiagramConnectionExistence");\r
+ }\r
+\r
+}\r