diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd index 3e294aaf9f80c0b4a61478ef01901083f2835592..7fb0cd253ede55b83f55a999711fa33b7c7a8447 100644 --- a/src/main/jastadd/Backend.jadd +++ b/src/main/jastadd/Backend.jadd @@ -368,7 +368,7 @@ aspect BackendBidirectionalAPI { sb.append(ind(3) + "get" + getImplAttributeName() + "().set" + otherSide().getImplAttributeName() + "(null);\n"); sb.append(ind(2) + "}\n"); if (resolverHelper | serializer) { - sb.append(ind(2) + "if (!o.unresolved() && o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n"); + sb.append(ind(2) + "if (o != null && !o.unresolved() && o.get" + otherSide().getImplAttributeName() + "() != null) {\n"); } else { sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n"); } @@ -376,7 +376,7 @@ aspect BackendBidirectionalAPI { sb.append(ind(2) + "}\n"); sb.append(ind(2) + "set" + getImplAttributeName() + "(o);\n"); if (resolverHelper | serializer) { - sb.append(ind(2) + "if (!o.unresolved()) {\n"); + sb.append(ind(2) + "if (o == null || !o.unresolved()) {\n"); if (isOpt) { sb.append(ind(3) + "if (o != null) {\n"); sb.append(ind(4) + "o.set" + otherSide().getImplAttributeName() + "(this);\n"); @@ -1294,7 +1294,7 @@ aspect Serializer { sb.append(ind(1) + "protected String ASTNode.__uid = null;\n"); sb.append("\n"); sb.append(ind(1) + "protected String ASTNode.__uid() {\n"); - sb.append(ind(2) + "String customUID = serializationID();\n"); + sb.append(ind(2) + "String customUID = customID();\n"); sb.append(ind(2) + "if (customUID == null) {\n"); sb.append(ind(3) + "if (__uid == null) {\n"); sb.append(ind(4) + "__uid = UIDProvider.getUID();\n"); @@ -1305,7 +1305,7 @@ aspect Serializer { sb.append(ind(2) + "}\n"); sb.append(ind(1) + "}\n"); sb.append("\n"); - sb.append(ind(1) + "protected String ASTNode.serializationID() {\n"); + sb.append(ind(1) + "protected String ASTNode.customID() {\n"); sb.append(ind(2) + "return null;\n"); sb.append(ind(1) + "}\n"); @@ -1322,7 +1322,11 @@ aspect Serializer { sb.append(ind(1) + "}\n"); sb.append(ind(1) + "protected java.util.Map<String, ASTNode> ASTNode.__uidMap(java.util.Map<String, ASTNode> map) {\n"); - sb.append(ind(2) + "map.put(this.__uid, this);\n"); + sb.append(ind(2) + "if (map.keySet().contains(__uid())) {\n"); + sb.append(ind(3) + "throw new RuntimeException(new SerializationException(\"UID \" + this.__uid + \" is not unique\"));\n"); + sb.append(ind(2) + "} else {\n"); + sb.append(ind(3) + "map.put(this.__uid, this);\n"); + sb.append(ind(2) + "}\n"); sb.append(ind(2) + "for (ASTNode child : astChildren()) {\n"); sb.append(ind(3) + "child.__uidMap(map);\n"); sb.append(ind(2) + "}\n"); diff --git a/src/test/java/org/jastadd/relast/tests/Serializer.java b/src/test/java/org/jastadd/relast/tests/Serializer.java index 96a57d45bcca1b5c5e4b7624b365c89110308d66..09bb9af2380bf3aa1f2c14eae2e73174c99ada4d 100644 --- a/src/test/java/org/jastadd/relast/tests/Serializer.java +++ b/src/test/java/org/jastadd/relast/tests/Serializer.java @@ -93,9 +93,9 @@ class Serializer { a2.addDi3(b2); // Bi1 - a1.setBi1(b1); - a2.setBi1(b3); - a3.setBi1(b2); + a1.setBi1(b3); + a2.setBi1(b2); + a3.setBi1(b1); // Bi2 a1.setBi2(b1); @@ -112,23 +112,46 @@ class Serializer { a2.setBi5(b3); // Bi6 - a2.setBi6(b2); - a3.setBi6(b2); + a2.setBi6(b3); + a3.setBi6(b3); // Bi9 a1.addBi9(b1); - a1.addBi9(b2); - a2.addBi9(b2); - - File f = File.createTempFile("original", ".json"); - System.out.println(f.getAbsoluteFile()); - r.serialize(f); - - Root copy = Root.deserialize(f); - File f2 = File.createTempFile("copy", ".json"); - copy.serialize(f2); - - assertThat(f2).hasSameContentAs(f); + a1.addBi9(b3); + a2.addBi9(b3); + + File f1a = File.createTempFile("original", ".json"); + System.out.println(f1a.getAbsoluteFile()); + r.serialize(f1a); + + Root copy = Root.deserialize(f1a); + File f1b = File.createTempFile("copy", ".json"); + copy.serialize(f1b); + + assertThat(f1b).hasSameContentAs(f1a); + + // remove a2 + a1.setDi1(b3); + a1.setDi2(b3); + a1.removeDi3(b2); + a1.removeDi3(b2); + a1.setBi3(b1); + a3.setBi3(b1); + b3.clearBi5(); + b3.removeBi6(a2); + b3.removeBi9(a2); + r.getAList().removeChild(r.getAList().getIndexOfChild(a2)); + r.getBList().removeChild(r.getBList().getIndexOfChild(b2)); + + File f2a = File.createTempFile("original", ".json"); + System.out.println(f2a.getAbsoluteFile()); + r.serialize(f2a); + + copy = Root.deserialize(f2a); + File f2b = File.createTempFile("copy", ".json"); + copy.serialize(f2b); + + assertThat(f2b).hasSameContentAs(f2a); }