From 37acf1273cdf0be148b22625db2baa15a4077d0b Mon Sep 17 00:00:00 2001 From: Marko Luukkainen Date: Wed, 4 Nov 2020 16:34:06 +0200 Subject: [PATCH] Support for enumerated properties. Type comparator could match different enumeration value instances. Graph comparator did not handle non literal property changes properly. Property change could not apply enumeration changes. gitlab #25 Change-Id: Icc2774bd4f646d8c61febf96352548d7e92b8e79 --- .../interop/update/model/PropertyChange.java | 13 +++++++++++- .../interop/test/GraphComparator.java | 20 ++++++++++++------- .../interop/test/TypeComparator.java | 10 ++++++++++ 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/org.simantics.interop.update/src/org/simantics/interop/update/model/PropertyChange.java b/org.simantics.interop.update/src/org/simantics/interop/update/model/PropertyChange.java index b955548..be6e5e0 100644 --- a/org.simantics.interop.update/src/org/simantics/interop/update/model/PropertyChange.java +++ b/org.simantics.interop.update/src/org/simantics/interop/update/model/PropertyChange.java @@ -118,6 +118,7 @@ public class PropertyChange { } else { graph.deny(s,pred); } + applied = true; } else if (graph.isInstanceOf(pair.second.getObject(), L0.SCLValue)) { Resource pred = pair.second.getPredicate(); graph.deny(s, pred); @@ -125,8 +126,18 @@ public class PropertyChange { graph.claim(valueResource, L0.InstanceOf, graph.getSingleObject(pair.second.getObject(), L0.InstanceOf)); AddDeleteUpdateOp.copyProperties(graph, pair.second.getObject(), valueResource); graph.claim(s, pred, valueResource); + applied = true; + } else { + Resource type = graph.getPossibleType(pair.second.getObject(), L0.Value); + if (type != null && graph.hasStatement(type, L0.Enumeration, type)) { + Resource pred = pair.second.getPredicate(); + graph.deny(s, pred); + graph.claim(s, pred, pair.second.getObject()); + applied = true; + } + } - applied = true; + } /** diff --git a/org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java b/org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java index 9f14ecd..2727a95 100644 --- a/org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java +++ b/org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java @@ -896,8 +896,8 @@ public class GraphComparator { } } - private void addModification(Resource sub1, Statement s1, Resource sub2, Statement s2) { - Modification mod = new Modification(sub1, sub2, s1, s2); + private void addModification(Resource left, Statement leftstm, Resource right, Statement rightstm) { + Modification mod = new Modification(left, right, leftstm, rightstm); if (!modificationsSet.contains(mod)) { modificationsSet.add(mod); modifications.add(mod); @@ -1254,9 +1254,7 @@ public class GraphComparator { 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 = compareValue(v1, v2); + // Literals boolean eq = compareValue(g,b,s1.getObject(), s2.getObject()); if (!eq) { addModification(r1,s1,r2,s2); @@ -1264,8 +1262,16 @@ public class GraphComparator { addComparable(s1, s2); } } else { - if (!s1.getObject().equals(s1.getSubject()) && !s2.getObject().equals(s2.getSubject())) - compareProps(s1.getObject(), s2.getObject()); + // Non literal properties. + if (comparator.compare(g, s1.getObject(), s2.getObject()) != ResourceComparator.NO_MATCH) { + if (!s1.getObject().equals(s1.getSubject()) && !s2.getObject().equals(s2.getSubject())) + // TODO compare props matches objects, so this is questionable. + compareProps(s1.getObject(), s2.getObject()); + else + addModification(r1,s1,r2,s2); + } else { + addModification(r1,s1,r2,s2); + } } } else { addModification(r1,s1,r2,s2); 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 a0069c6..2ea03d3 100644 --- a/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java +++ b/org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java @@ -60,6 +60,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(); -- 2.45.1