--- /dev/null
+package org.simantics.modeling.validation;\r
+\r
+import java.util.Collection;\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.ReadRequest;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.common.utils.OrderedSetUtils;\r
+import org.simantics.db.exception.DatabaseException;\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 ValidateMapping extends ReadRequest {\r
+\r
+ Resource composite;\r
+ Resource diagram;\r
+ \r
+ ReadGraph g;\r
+ Layer0 b;\r
+ DiagramResource dr;\r
+ StructuralResource2 sr;\r
+ ModelingResources mr; \r
+ \r
+ public ValidateMapping(Resource composite) {\r
+ this.composite = composite;\r
+ }\r
+\r
+ @Override\r
+ public void run(ReadGraph g) throws DatabaseException {\r
+ this.g = g;\r
+ this.b = Layer0.getInstance(g);\r
+ this.dr = DiagramResource.getInstance(g);\r
+ this.sr = StructuralResource2.getInstance(g);\r
+ this.mr = ModelingResources.getInstance(g);\r
+ \r
+ this.diagram = g.getPossibleObject(composite, mr.CompositeToDiagram);\r
+ \r
+ System.out.println("------------------------------------------------------------------");\r
+ System.out.println("---- " + NameUtils.getSafeName(g, composite));\r
+ if (diagram == null) {\r
+ System.out.println("No diagram.");\r
+ } else {\r
+ additiveRule();\r
+ destructiveRule();\r
+ }\r
+ }\r
+\r
+ private void additiveRule() throws DatabaseException {\r
+ for(Resource element : OrderedSetUtils.toList(g, diagram)) {\r
+ Resource elementType = g.getPossibleObject(element, b.InstanceOf);\r
+ if(elementType == null) {\r
+ System.out.println("Element " + NameUtils.getSafeName(g, element) + " has no type.");\r
+ continue;\r
+ }\r
+ Resource componentType = g.getPossibleObject(elementType, mr.SymbolToComponentType);\r
+ if(componentType != null)\r
+ createComponentRule(element, componentType);\r
+ else if(g.isInstanceOf(element, dr.Connection))\r
+ createNormalConnectionRule(element);\r
+ else if(g.isInstanceOf(element, dr.Flag))\r
+ createFlagRule(element);\r
+ /*else\r
+ System.out.println("No rule for element " + NameUtils.getSafeName(g, element));\r
+ */\r
+ }\r
+ } \r
+\r
+ private void createComponentRule(Resource element, Resource componentType) throws DatabaseException {\r
+ Collection<Resource> components = g.getObjects(element, mr.ElementToComponent);\r
+ if(components.isEmpty())\r
+ System.out.println("Element " + NameUtils.getSafeName(g, element) + " is not mapped.");\r
+ else if(components.size() > 1)\r
+ System.out.println("Element " + NameUtils.getSafeName(g, element) + " is not multiple times.");\r
+ else for(Resource component : components) {\r
+ if(!g.isInstanceOf(component, componentType))\r
+ System.out.println("Component " + NameUtils.getSafeName(g, component) + \r
+ " is not an instance of " + NameUtils.getSafeName(g, componentType));\r
+ if(!g.hasStatement(component, b.PartOf, composite))\r
+ System.out.println("Component " + NameUtils.getSafeName(g, component) + " is not a part of composite.");\r
+ if(!g.hasStatement(component, mr.Mapped))\r
+ System.out.println("Component " + NameUtils.getSafeName(g, component) + " is not tagged as Mapped.");\r
+ }\r
+ }\r
+\r
+ private void createNormalConnectionRule(Resource element) throws DatabaseException {\r
+ Collection<Resource> connections = g.getObjects(element, mr.DiagramConnectionToConnection);\r
+ if(connections.isEmpty())\r
+ System.out.println("Diagram connection " + NameUtils.getSafeName(g, element) + " is not mapped.");\r
+ else if(connections.size() > 1)\r
+ System.out.println("Diagram connection " + NameUtils.getSafeName(g, element) + " is not multiple times.");\r
+ else for(Resource connection : connections) {\r
+ if(!g.isInstanceOf(connection, sr.Connection))\r
+ System.out.println("Resource " + NameUtils.getSafeName(g, connection) + " is not a connection.");\r
+ if(!g.hasStatement(connection, mr.Mapped))\r
+ System.out.println("Connection " + NameUtils.getSafeName(g, connection) + " is not tagged as Mapped.");\r
+ \r
+ for(Resource connector : g.getObjects(element, sr.IsConnectedTo)) {\r
+ for(Statement stat : g.getStatements(connector, sr.Connects)) {\r
+ Resource diagramConnectionRelation = g.getInverse(stat.getPredicate());\r
+ Resource cElement = stat.getObject();\r
+ Resource connectionRelation = g.getPossibleObject(diagramConnectionRelation, mr.DiagramConnectionRelationToConnectionRelation);\r
+ if(connectionRelation == null)\r
+ continue;\r
+ Resource component = g.getPossibleObject(cElement, mr.ElementToComponent);\r
+ if(component == null)\r
+ continue;\r
+ \r
+ // Special connection data\r
+ Resource connectionRelation2 = g.getPossibleObject(diagramConnectionRelation, mr.DiagramConnectionRelationToConnectionRelationB);\r
+ Resource connectionRelation3 = g.getPossibleObject(diagramConnectionRelation, mr.DiagramConnectionRelationToConnectionRelationC);\r
+ Resource componentType = g.getPossibleObject(diagramConnectionRelation, mr.DiagramConnectionRelationToComponentType);\r
+ \r
+ // Normal connection\r
+ if(connectionRelation2 == null || connectionRelation3 == null || componentType == null) {\r
+ if(!g.hasStatement(component, connectionRelation, connection))\r
+ System.out.println("Missing connection statement " + NameUtils.getSafeName(g, component) + " . " +\r
+ NameUtils.getSafeName(g, connectionRelation));\r
+ }\r
+ \r
+ // Special connection\r
+ else {\r
+ Resource component2 = g.getPossibleObject(element, mr.ElementToComponent);\r
+ if(component2 == null)\r
+ System.out.println("Special connection " + NameUtils.getSafeName(g, element) + " is not mapped.");\r
+ else {\r
+ if(!g.isInstanceOf(component2, componentType))\r
+ System.out.println("Component " + NameUtils.getSafeName(g, component2) + \r
+ " is not an instance of " + NameUtils.getSafeName(g, componentType));\r
+ if(!g.hasStatement(component2, b.PartOf, composite))\r
+ System.out.println("Component " + NameUtils.getSafeName(g, component2) + " is not a part of composite.");\r
+ if(!g.hasStatement(component2, mr.Mapped))\r
+ System.out.println("Component " + NameUtils.getSafeName(g, component2) + " is not tagged as Mapped.");\r
+ \r
+ boolean foundConnection2 = false;\r
+ for(Resource connection2 : g.getObjects(component2, connectionRelation2))\r
+ if(g.hasStatement(component, connectionRelation, connection2)) {\r
+ foundConnection2 = true;\r
+ if(!g.isInstanceOf(connection2, sr.Connection))\r
+ System.out.println(NameUtils.getSafeName(g, connection2) + " is not a connection.");\r
+ if(!g.hasStatement(component2, connectionRelation3, connection))\r
+ System.out.println("Missing connection point " + NameUtils.getSafeName(g, component2) + " . "\r
+ + NameUtils.getSafeName(g, connectionRelation3));\r
+ }\r
+ if(!foundConnection2)\r
+ System.out.println("Special connection "+ NameUtils.getSafeName(g, element) + " is not correctly mapped (missing configuration connection).");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /*\r
+ claim( \r
+ \r
+ // Create a connection\r
+ exists(\r
+ and(statement_bbf(Component2, ConnectionRelation2, Connection2),\r
+ statement (Component, ConnectionRelation, Connection2)\r
+ ),\r
+ Connection2\r
+ ),\r
+ b(sr.Connection, Connection2),\r
+ //b(mapped, Connection2),\r
+ \r
+ // \r
+ statement(Component2, ConnectionRelation3, Connection)\r
+ ),\r
+}*/\r
+ \r
+ private void createFlagRule(Resource element) throws DatabaseException {\r
+ for(Resource connectionJoin : g.getObjects(element, dr.FlagIsJoinedBy))\r
+ for(Resource connector : g.getObjects(element, sr.IsConnectedTo))\r
+ for(Resource diagramConnection : g.getObjects(connector, sr.Connects))\r
+ for(Resource connection : g.getObjects(diagramConnection, mr.DiagramConnectionToConnection)) {\r
+ if(!g.hasStatement(connectionJoin, sr.Joins, connection))\r
+ System.out.println("Joins-relation of flag " + NameUtils.getSafeName(g, element) + " is not mapped.");\r
+ if(!g.hasStatement(composite, sr.HasConnectionJoin, connectionJoin))\r
+ System.out.println("Connection join is not attached to the composite.");\r
+ }\r
+ \r
+ }\r
+ \r
+ private void destructiveRule() throws DatabaseException {\r
+ for(Resource component : g.getObjects(composite, b.ConsistsOf)) {\r
+ if(g.hasStatement(component, mr.Mapped)) {\r
+ //Resource element = g.getPossibleObject(component, mr.ComponentToElement);\r
+ Collection<Resource> elements = g.getObjects(component, mr.ComponentToElement);\r
+ if (elements.isEmpty())\r
+ System.out.println("Component " + NameUtils.getSafeName(g, component) + \r
+ " does not have corresponding element (but is tagged Mapped).");\r
+ for (Resource element : elements) {\r
+ if(!OrderedSetUtils.contains(g, diagram, element))\r
+ System.out.println("Element corresponding to component " + NameUtils.getSafeName(g, component) + \r
+ " is not included in the diagram.");\r
+ else {\r
+ for(Statement stat : g.getStatements(component, sr.IsConnectedTo)) {\r
+ //Resource connectionRelation = stat.getPredicate();\r
+ Resource connection = stat.getObject();\r
+ if(g.hasStatement(connection, mr.Mapped)) {\r
+ if (!g.hasStatement(connection, mr.ConnectionMapsTo))\r
+ System.out.println("Connection " + NameUtils.getSafeName(g, connection) + \r
+ " does not have a correspondence in diagram (but is tagged Mapped).");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+}\r