json-serialiser

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 9b257b2..d97a3b9 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/jsonserialiser/JSONSerialiser.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/jsonserialiser/JSONSerialiser.java
@@ -146,8 +146,8 @@ public class JSONSerialiser {
             if (object instanceof Character) {
                 return serialiseString(String.valueOf(object));
             }
-            if (object instanceof String) {
-                String string = (String) object;
+            if (object instanceof CharSequence) {
+                CharSequence string = (CharSequence) object;
                 return serialiseString(string);
             }
             if (object instanceof Number) {
@@ -172,10 +172,7 @@ public class JSONSerialiser {
                 return new StringBuilder().append("\"").append(String.valueOf(date.getTime())).append("\"");
             }
             String serialiseInternals = System.getenv("TRACER_SERIALISE_INTERNALS");
-            if (serialiseInternals == null) {
-                serialiseInternals = "true";
-            }
-            if (serialiseInternals.equals("false")) {
+            if (serialiseInternals == null || serialiseInternals.equals("false")) {
                 Package objectPackage = object.getClass().getPackage();
                 String objectPackageName = objectPackage != null ? objectPackage.getName() : "";
 
@@ -197,28 +194,21 @@ public class JSONSerialiser {
                     }
                 }
             }
-            if (this.visited.stream().parallel().anyMatch((visited) -> (visited == object))) {
-                int hashCode;
-                try {
-                    hashCode = object.hashCode();
-                } catch (Exception e) {
-                    hashCode = object.getClass().hashCode();
-                }
-                return new StringBuilder().append("{\"r\":\"")
-                        .append(object.getClass().getName())
-                        .append("@")
-                        .append(hashCode)
-                        .append("\"}");
+            if (this.visited.stream().parallel().anyMatch(visited -> visited == object)) {
+                return getReference(object);
             }
             this.visited.add(object);
             return serialiseBean(object);
         } catch (ConcurrentModificationException exception) {
             System.err.println("[JSONSerialiser] ConcurrentModificationException");
-            return new StringBuilder().append("{\"e\":\"JSON_CONCURRENT_MODIFICATION\"}");
+            return new StringBuilder().append("\"JSON_CONCURRENT_MODIFICATION\"");
         } catch (Exception exception) {
             System.err.println("[JSONSerialiser] wrap exception: " + exception);
             exception.printStackTrace();
-            return new StringBuilder().append("{\"e\":\"JSON_SERIALISE_EXCEPTION\"}");
+            return new StringBuilder().append("\"JSON_SERIALISE_EXCEPTION\"");
+        } catch (StackOverflowError exception) {
+            System.err.println("[JSONSerialiser] stack overflow");
+            return new StringBuilder().append("\"JSON_STACK_OVERFLOW\"");
         }
     }
 
@@ -233,13 +223,13 @@ public class JSONSerialiser {
                 if (key == null || value == null) {
                     continue;
                 }
-                String serialisedKey;
-                if (!(key instanceof String)) {
-                    serialisedKey = JSONSerialiser.serialise(key);
-                    stringBuilder.append("\"").append(serialisedKey).append("\"");
+                StringBuilder serialisedKey;
+                if (key instanceof String) {
+                    serialisedKey = serialiseString((String) key);
+                } else if (this.visited.stream().parallel().anyMatch(visited -> visited == key)) {
+                    serialisedKey = serialiseString(getReference(key));
                 } else {
-                    StringBuilder wrappedKey = wrap(key);
-                    serialisedKey = wrappedKey.toString();
+                    serialisedKey = serialiseString(JSONSerialiser.serialise(key));
                 }
                 StringBuilder wrappedValue = wrap(value);
                 stringBuilder.append(serialisedKey).append(":").append(wrappedValue);
@@ -294,9 +284,9 @@ public class JSONSerialiser {
         return stringBuilder.append("]");
     }
 
-    private StringBuilder serialiseString(String string) {
+    private StringBuilder serialiseString(CharSequence string) {
         StringBuilder stringBuilder = new StringBuilder();
-        if (string == null || string.isEmpty()) {
+        if (string == null || string.length() == 0) {
             return stringBuilder.append("\"\"");
         }
         stringBuilder.append('"');
@@ -355,4 +345,18 @@ public class JSONSerialiser {
         }
         return stringBuilder.append('"');
     }
+
+    private static StringBuilder getReference(Object object) {
+        int hashCode;
+        try {
+            hashCode = object.hashCode();
+        } catch (Exception e) {
+            hashCode = object.getClass().hashCode();
+        }
+        return new StringBuilder().append("{\"r\":\"")
+                .append(object.getClass().getName())
+                .append("@")
+                .append(hashCode)
+                .append("\"}");
+    }
 }