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("\"}");
+ }
}