]> gerrit.simantics Code Review - simantics/interop.git/commitdiff
Support for enumerated properties. 04/4604/2
authorMarko Luukkainen <marko.luukkainen@semantum.fi>
Wed, 4 Nov 2020 14:34:06 +0000 (16:34 +0200)
committerMarko Luukkainen <marko.luukkainen@semantum.fi>
Wed, 4 Nov 2020 14:59:12 +0000 (16:59 +0200)
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

org.simantics.interop.update/src/org/simantics/interop/update/model/PropertyChange.java
org.simantics.interop/src/org/simantics/interop/test/GraphComparator.java
org.simantics.interop/src/org/simantics/interop/test/TypeComparator.java

index b9555484e51481a5d733b41b742cee68a541a562..be6e5e0bbda38498fd22388d6dc6e2ed31dd4b45 100644 (file)
@@ -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;
+               
        }
        
        /**
index 9f14ecdebe6fdc75dd76f377fc472e0818731cfa..2727a95e0793dd5f5249c06c50361a749561931e 100644 (file)
@@ -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);
index a0069c6e0e0b9218563fdd49f3a32d3c9919cd40..2ea03d38f8d12ce0e4519b8b5a2328e906d084e1 100644 (file)
@@ -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();