--- /dev/null
+package org.simantics.interop.test;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Comparator;\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.exception.DoesNotContainValueException;\r
+import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;\r
+import org.simantics.db.exception.ServiceException;\r
+import org.simantics.db.exception.ValidationException;\r
+import org.simantics.interop.test.GraphComparator.PredicateComparator;\r
+import org.simantics.interop.test.GraphComparator.ResourceComparator;\r
+import org.simantics.layer0.Layer0;\r
+\r
+/**\r
+ * Object comparator that uses type of objects to check if objects are comparable. \r
+ * \r
+ * Difference value is amount of properties that have different values.\r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class TypeComparator implements ObjectComparator {\r
+\r
+ Comparator<Statement> scomp = new PredicateComparator();\r
+ Comparator<Resource> rcomp = new ResourceComparator();\r
+ \r
+ ArrayList<Resource> rs1 = new ArrayList<Resource>();\r
+ ArrayList<Resource> rs2 = new ArrayList<Resource>();\r
+ \r
+ @Override\r
+ public int compare(ReadGraph g, Resource o1, Resource o2) throws DatabaseException{\r
+ if (!compareType(g,o1, o2)) {\r
+ return (Integer.MAX_VALUE);\r
+ }\r
+ return propsDiffCount(g,o1, o2);\r
+ }\r
+ \r
+ protected boolean compareType(ReadGraph g,Resource r1, Resource r2) throws ServiceException, ManyObjectsForFunctionalRelationException {\r
+ Layer0 l0 = Layer0.getInstance(g);\r
+ rs1.addAll(g.getObjects(r1, l0.InstanceOf));\r
+ rs2.addAll(g.getObjects(r2, l0.InstanceOf));\r
+ if (rs1.size() != rs2.size()) {\r
+ rs1.clear();\r
+ rs2.clear();\r
+ return false;\r
+ }\r
+ Collections.sort(rs1, rcomp);\r
+ Collections.sort(rs2, rcomp);\r
+ for (int i = 0; i < rs1.size(); i++) {\r
+ int c = rcomp.compare(rs1.get(i), rs2.get(i));\r
+ if (c != 0) {\r
+ rs1.clear();\r
+ rs2.clear();\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ rs1.clear();\r
+ rs2.clear();\r
+ \r
+ return true;\r
+ }\r
+ \r
+ protected int propsDiffCount(ReadGraph g, Resource r1, Resource r2) throws ServiceException, DoesNotContainValueException, ValidationException {\r
+ Layer0 l0 = Layer0.getInstance(g);\r
+ ArrayList<Statement> ss1 = new ArrayList<Statement>();\r
+ ArrayList<Statement> ss2 = new ArrayList<Statement>();\r
+ ss1.addAll(g.getStatements(r1, l0.HasProperty));\r
+ ss2.addAll(g.getStatements(r2, l0.HasProperty));\r
+ Collections.sort(ss1, scomp);\r
+ Collections.sort(ss2, scomp);\r
+ \r
+ int count = 0;\r
+ \r
+ int i1 = 0; \r
+ int i2 = 0;\r
+ \r
+ while (true) {\r
+ if (i1 >= ss1.size()) {\r
+ if (i2 >= ss2.size())\r
+ break;\r
+ else {\r
+ while (i2 < ss2.size()) {\r
+ count++;\r
+ i2++;\r
+ }\r
+ break;\r
+ }\r
+ } else if (i2 >= ss2.size()) {\r
+ while (i1 < ss1.size()) {\r
+ count++;\r
+ i1++;\r
+ }\r
+ break;\r
+ }\r
+ Statement s1 = ss1.get(i1);\r
+ Statement s2 = ss2.get(i2);\r
+ int c = scomp.compare(s1, s2);\r
+ switch (c) {\r
+ case 0:{\r
+ boolean b1 = g.hasValue(s1.getObject());\r
+ boolean b2 = g.hasValue(s2.getObject());\r
+ if (b1 == b2) {\r
+ if (b1) {\r
+ Object v1 = g.getValue(s1.getObject());\r
+ Object v2 = g.getValue(s2.getObject());\r
+ boolean eq = GraphComparator.compareValue(v1, v2);\r
+ \r
+ if (!eq) {\r
+ count++;\r
+ }\r
+ //System.out.println("Prop count values " + v1 + " " + v2);\r
+ } else {\r
+ count += propsDiffCount(g,s1.getObject(), s2.getObject());\r
+ }\r
+ } else {\r
+ //System.out.println("Props count structural vs literal");\r
+ count++;\r
+ }\r
+ i1++;\r
+ i2++;\r
+ break;\r
+ }\r
+ case -1:{\r
+ count++;\r
+ i1++;\r
+ break;\r
+ }\r
+ \r
+ case 1:{\r
+ count++;\r
+ i2++;\r
+ break;\r
+ }\r
+ }\r
+\r
+ }\r
+ \r
+ ss1.clear();\r
+ ss2.clear();\r
+ return count;\r
+ }\r
+\r
+}\r