json-serialiser

used visited list as a stack to build the trees and break cycles.

5/11/2019 7:55:18 AM

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/jsonserialiser/JSONSerialiser.java b/src/main/java/br/ufrgs/inf/prosoft/jsonserialiser/JSONSerialiser.java
index 4a42160..6de7fa8 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/jsonserialiser/JSONSerialiser.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/jsonserialiser/JSONSerialiser.java
@@ -25,31 +25,19 @@ import java.util.Map;
  */
 public class JSONSerialiser {
 
-    private final Collection<Object> visited;
+    private final List<Object> visited;
 
     private JSONSerialiser() {
         this.visited = new ArrayList<>();
     }
 
-    private static String serialise(Object bean, boolean cyclicFields) {
+    public static String serialise(Object bean) {
         JSONSerialiser jsonSerialiser = new JSONSerialiser();
-        StringBuilder stringBuilder = jsonSerialiser.serialiseBean(bean, cyclicFields);
+        StringBuilder stringBuilder = jsonSerialiser.serialiseBean(bean);
         Utils.fixJson(stringBuilder);
         return stringBuilder.toString();
     }
 
-    public static String serialise(Object bean) {
-        return serialise(bean, true);
-    }
-
-    public static String serialiseCyclicObject(Object bean) {
-        return serialise(bean);
-    }
-
-    public static String serialiseAcyclicObject(Object bean) {
-        return serialise(bean, false);
-    }
-
     private static class Utils {
 
         private static void fixJson(StringBuilder stringBuilder) {
@@ -94,7 +82,7 @@ public class JSONSerialiser {
         }
     }
 
-    private StringBuilder serialiseBean(Object bean, boolean cyclicFields) {
+    private StringBuilder serialiseBean(Object bean) {
         StringBuilder stringBuilder = new StringBuilder();
         if (bean == null) {
             stringBuilder.append("null");
@@ -112,9 +100,6 @@ public class JSONSerialiser {
                 if (result == null) {
                     continue;
                 }
-                if (!cyclicFields) {
-                    this.visited.clear();
-                }
                 stringBuilder.append("\"").append(field.getName()).append("\"");
                 stringBuilder.append(":");
                 StringBuilder wrap = wrap(result);
@@ -131,10 +116,6 @@ public class JSONSerialiser {
         return stringBuilder;
     }
 
-    private StringBuilder serialiseBean(Object bean) {
-        return serialiseBean(bean, true);
-    }
-
     private StringBuilder wrap(Object object) {
         try {
             if (object == null) {
@@ -195,8 +176,13 @@ public class JSONSerialiser {
             if (this.visited.stream().parallel().anyMatch(visited -> visited == object)) {
                 return getReference(object);
             }
+            int index = this.visited.size();
             this.visited.add(object);
-            return serialiseBean(object);
+            StringBuilder serialiseBean = serialiseBean(object);
+            while (index < this.visited.size()) {
+                this.visited.remove(index);
+            }
+            return serialiseBean;
         } catch (ConcurrentModificationException exception) {
             System.err.println("[JSONSerialiser] ConcurrentModificationException");
             return new StringBuilder().append("\"JSON_CONCURRENT_MODIFICATION\"");