]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/validation/ValidateMapping.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / validation / ValidateMapping.java
diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/validation/ValidateMapping.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/validation/ValidateMapping.java
new file mode 100644 (file)
index 0000000..82651fd
--- /dev/null
@@ -0,0 +1,216 @@
+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