From 5808ffc17da3f7e4f4f1659eb15642780f8ab2a3 Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Tue, 19 Mar 2019 14:39:29 +0100 Subject: [PATCH] improve uid handling. --- src/main/jastadd/Backend.jadd | 74 +++++++++---------- .../org/jastadd/relast/compiler/Compiler.java | 1 - 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd index 012e232..cc89bce 100644 --- a/src/main/jastadd/Backend.jadd +++ b/src/main/jastadd/Backend.jadd @@ -908,8 +908,6 @@ aspect NameResolutionHelper { generateDirectedContextDependentNameResolution(sb); } public void ManyRelationComponent.generateContextDependentNameResolution(StringBuilder sb) { - System.out.println("serializer: " + serializer); - System.out.println("ResolverHelper: " + resolverHelper); if (serializer && !resolverHelper) { sb.append(ind(1) + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id, int position) {\n"); @@ -1063,8 +1061,8 @@ aspect Serializer { sb.append(ind(4) + "g.writeObjectFieldStart(fieldName);\n"); sb.append(ind(3) + "}\n"); sb.append(ind(3) + "g.writeStringField(\"" + jsonTypeKey + "\", \"" + getID() + "\");\n"); - sb.append(ind(3) + "if (__uid() == null) throw new SerializationException(\"The unique identifier of " + getID() + " is missing.\");\n"); - sb.append(ind(3) + "g.writeStringField(\"id\", __uid());\n"); + sb.append(ind(3) + "if (unique$Id() == null) throw new SerializationException(\"The unique identifier of " + getID() + " is missing.\");\n"); + sb.append(ind(3) + "g.writeStringField(\"id\", unique$Id());\n"); if (componentsTransitive().size() > 0) { sb.append(ind(3) + "g.writeObjectFieldStart(\"children\");\n"); for (Component child : componentsTransitive()) { @@ -1167,18 +1165,18 @@ aspect Serializer { public void OneRelationComponent.serialize(StringBuilder sb, int indent) { if (useJastAddNames){ - sb.append(ind(indent) + "g.writeStringField(\""+getID()+"\", get" + getID() + "().__uid());\n"); + sb.append(ind(indent) + "g.writeStringField(\""+getID()+"\", get" + getID() + "().unique$Id());\n"); } else { - sb.append(ind(indent) + "g.writeStringField(\""+getID()+"\", " + getID() + "().__uid());\n"); + sb.append(ind(indent) + "g.writeStringField(\""+getID()+"\", " + getID() + "().unique$Id());\n"); } } public void OptionalRelationComponent.serialize(StringBuilder sb, int indent) { sb.append(ind(indent) + "if (has" + nameCapitalized() + "()) {\n"); if (useJastAddNames){ - sb.append(ind(indent + 1) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().__uid());\n"); + sb.append(ind(indent + 1) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().unique$Id());\n"); } else { - sb.append(ind(indent + 1) + "g.writeStringField(\"" + getID() + "\", " + getID() + "().__uid());\n"); + sb.append(ind(indent + 1) + "g.writeStringField(\"" + getID() + "\", " + getID() + "().unique$Id());\n"); } sb.append(ind(indent) + "}\n"); } @@ -1190,7 +1188,7 @@ aspect Serializer { } else { sb.append(ind(indent) + "for (" + ofTypeDecl().getID() + " child : " + getID() + "()) {\n"); } - sb.append(ind(indent + 1) + "g.writeString(child.__uid());\n"); + sb.append(ind(indent + 1) + "g.writeString(child.unique$Id());\n"); sb.append(ind(indent) + "}\n"); sb.append(ind(indent) + "g.writeEndArray();\n"); } @@ -1227,7 +1225,7 @@ aspect Serializer { // deserialize id sb.append(ind(2) + "if (node.has(\"id\")) {\n"); - sb.append(ind(3) + "element.__uid = node.get(\"id\").asText();\n"); + sb.append(ind(3) + "element.unique$Id = node.get(\"id\").asText();\n"); sb.append(ind(2) + "}\n"); // deserialize containment children @@ -1339,55 +1337,53 @@ aspect Serializer { sb.append(ind(2) + "}\n"); sb.append(ind(1) + "}\n"); sb.append("\n"); - sb.append(ind(1) + "protected String ASTNode.__uid = null;\n"); + sb.append(ind(1) + "protected String ASTNode.unique$Id = null;\n"); sb.append("\n"); - sb.append(ind(1) + "protected String ASTNode.__uid() {\n"); + sb.append(ind(1) + "protected String ASTNode.unique$Id() {\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"); + sb.append(ind(3) + "if (unique$Id == null) {\n"); + sb.append(ind(4) + "unique$Id = UIDProvider.getUID();\n"); sb.append(ind(3) + "}\n"); - sb.append(ind(3) + "return __uid;\n"); + sb.append(ind(3) + "return unique$Id;\n"); sb.append(ind(2) + "} else {\n"); sb.append(ind(3) + "return customUID;\n"); sb.append(ind(2) + "}\n"); sb.append(ind(1) + "}\n"); sb.append("\n"); sb.append(ind(1) + "protected String ASTNode.customID() {\n"); - sb.append(ind(2) + "return null;\n"); + sb.append(ind(1) + " return null;\n"); sb.append(ind(1) + "}\n"); - - if (serializer) { - sb.append(ind(1) + "ASTNode ASTNode.globallyResolveASTNodeByUID(String uid) {\n"); - sb.append(ind(2) + "if (getParent() == null) {\n"); - sb.append(ind(3) + "return __uidMap().get(uid);\n"); - sb.append(ind(2) + "} else {\n"); - sb.append(ind(3) + "return getParent().globallyResolveASTNodeByUID(uid);\n"); - sb.append(ind(2) + "}\n"); - sb.append(ind(1) + "}\n"); - } - - sb.append(ind(1) + "syn java.util.Map<String, ASTNode> ASTNode.__uidMap() {\n"); - sb.append(ind(2) + "return(__uidMap(new java.util.HashMap()));\n"); + sb.append("\n"); + sb.append(ind(1) + "ASTNode ASTNode.globallyResolveASTNodeByUID(String uid) {\n"); + sb.append(ind(2) + "if (getParent() == null) {\n"); + sb.append(ind(3) + "return uid$Map().get(uid).get();\n"); + sb.append(ind(2) + "} else {\n"); + sb.append(ind(3) + "return getParent().globallyResolveASTNodeByUID(uid);\n"); + sb.append(ind(2) + "}\n"); 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("\n"); + sb.append(ind(1) + "java.util.Map<String, java.lang.ref.WeakReference<ASTNode>> ASTNode.uid$Map;\n"); + sb.append("\n"); + sb.append(ind(1) + "java.util.Map<String, java.lang.ref.WeakReference<ASTNode>> ASTNode.uid$Map() {\n"); + sb.append(ind(2) + "if (uid$Map == null) {\n"); + sb.append(ind(3) + "uid$Map = uid$Map(new java.util.HashMap());\n"); + sb.append(ind(2) + "}\n"); + sb.append(ind(2) + "return uid$Map;\n"); + sb.append(ind(1) + "}\n"); + sb.append(ind(1) + "protected java.util.Map<String, java.lang.ref.WeakReference<ASTNode>> ASTNode.uid$Map(java.util.Map<String, java.lang.ref.WeakReference<ASTNode>> map) {\n"); sb.append(ind(2) + "if (!(this instanceof " + jastAddListType + " || this instanceof Opt)) {\n"); - sb.append(ind(3) + "if (map.keySet().contains(__uid())) {\n"); - sb.append(ind(4) + "throw new RuntimeException(new SerializationException(\"UID \" + this.__uid() + \" is assigned to both " + - "\" + this.getClass().getSimpleName() + \":\" + this.hashCode() + \" and " + - "\" + map.get(__uid()).getClass().getSimpleName() + \":\" + map.get(__uid()).hashCode()));\n"); + sb.append(ind(3) + "if (map.keySet().contains(unique$Id())) {\n"); + sb.append(ind(4) + "throw new RuntimeException(new SerializationException(\"UID \" + this.unique$Id() + \" is assigned to both \" + this.getClass().getSimpleName() + \":\" + this.hashCode() + \" and \" + map.get(unique$Id()).getClass().getSimpleName() + \":\" + map.get(unique$Id()).hashCode()));\n"); sb.append(ind(3) + "} else {\n"); - sb.append(ind(4) + "map.put(this.__uid, this);\n"); + sb.append(ind(4) + "map.put(this.unique$Id, new java.lang.ref.WeakReference(this));\n"); sb.append(ind(3) + "}\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(3) + "child.uid$Map(map);\n"); sb.append(ind(2) + "}\n"); sb.append(ind(2) + "return map;\n"); sb.append(ind(1) + "}\n"); - - sb.append("}\n"); } diff --git a/src/main/java/org/jastadd/relast/compiler/Compiler.java b/src/main/java/org/jastadd/relast/compiler/Compiler.java index 124aed2..949cb22 100644 --- a/src/main/java/org/jastadd/relast/compiler/Compiler.java +++ b/src/main/java/org/jastadd/relast/compiler/Compiler.java @@ -69,7 +69,6 @@ public class Compiler { } if (optionUseJastaddNames.isSet()) { - System.out.println("Using JastAdd names"); ASTNode.useJastAddNames = true; } -- GitLab