X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.interop%2Fsrc%2Forg%2Fsimantics%2Finterop%2Ftest%2FTypeComparator.java;h=6a05562961d230551220f10deb913b97fbd3528e;hb=88fcf43b9eb2e217b50bf67cee58edaef4637a59;hp=81d465609e024b8171503ce88345ff09db312772;hpb=99e240f9ca43aa78fbc6d71d7905c38c00bc679a;p=simantics%2Finterop.git diff --git a/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java b/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java index 81d4656..6a05562 100644 --- a/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java +++ b/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java @@ -26,20 +26,30 @@ public class TypeComparator extends ResourceComparator { @Override public int compare(ReadGraph g, Resource o1, Resource o2, boolean local) throws DatabaseException { - if (local) - return new TypeComparator().compare(g, o1, o2); - else - return compare(g, o1, o2); + if (o1.equals(o2)) { + return EXACT_MATCH; + } + return compare(g, o1, o2); } @Override public int compare(ReadGraph g, Resource o1, Resource o2) throws DatabaseException{ if (!compareType(g,o1, o2)) { - return (Integer.MAX_VALUE); + return NO_MATCH; } return propsDiffCount(g,o1, o2); } + /** + * Compares resources based on L0.InstaceOf relations. + * If there are no L0.InstanceOf relations, uses ResourceComparator for comparison. + * + * @param g + * @param r1 + * @param r2 + * @return + * @throws DatabaseException + */ protected boolean compareType(ReadGraph g,Resource r1, Resource r2) throws DatabaseException { Layer0 l0 = Layer0.getInstance(g); rs1.addAll(g.getObjects(r1, l0.InstanceOf)); @@ -49,7 +59,19 @@ public class TypeComparator extends ResourceComparator { rs2.clear(); return false; } + if (rs1.size() == 0) { + rs1.addAll(g.getObjects(r1, l0.Inherits)); + rs2.addAll(g.getObjects(r2, l0.Inherits)); + } + if (rs1.size() == 0) { + rs1.addAll(g.getObjects(r1, l0.SubrelationOf)); + rs2.addAll(g.getObjects(r2, l0.SubrelationOf)); + } Comparator rcomp = getComparator().getResourceComparator(); + if (rs1.size() == 0) { + return rcomp.compare(r1, r2) == 0; + } + getComparator().sortResource(rs1, rs2); for (int i = 0; i < rs1.size(); i++) { @@ -60,6 +82,16 @@ public class TypeComparator extends ResourceComparator { return false; } } + if (rs1.size() == 1) { + // Check for enumeration type. Without this enumeration instances could be mixed together. + if (g.hasStatement(rs1.get(0), l0.Enumeration, rs1.get(0))) { + if (!r1.equals(r2)) { + rs1.clear(); + rs2.clear(); + return false; + } + } + } rs1.clear(); rs2.clear(); @@ -67,6 +99,7 @@ public class TypeComparator extends ResourceComparator { return true; } + protected int propsDiffCount(ReadGraph g, Resource r1, Resource r2) throws DatabaseException { Layer0 l0 = Layer0.getInstance(g); ArrayList ss1 = new ArrayList(); @@ -118,15 +151,10 @@ public class TypeComparator extends ResourceComparator { boolean b2 = g.hasValue(s2.getObject()); if (b1 == b2) { if (b1) { -// Object v1 = g.getValue(s1.getObject()); -// Object v2 = g.getValue(s2.getObject()); -// boolean eq = GraphComparator.compareValue(v1, v2); boolean eq = GraphComparator.compareValue(g, l0 , s1.getObject(), s2.getObject()); - if (!eq) { count++; } - //System.out.println("Prop count values " + v1 + " " + v2); } else { count += propsDiffCount(g,s1.getObject(), s2.getObject()); }