in src/main/java/com/uber/cadence/internal/common/WorkflowExecutionUtils.java [781:950]
private static String prettyPrintObject(
Object object,
String methodToSkip,
boolean skipNullsAndEmptyCollections,
String indentation,
boolean skipLevel,
boolean printTypeName) {
StringBuilder result = new StringBuilder();
if (object == null) {
return "null";
}
Class<? extends Object> clz = object.getClass();
if (Number.class.isAssignableFrom(clz)) {
return String.valueOf(object);
}
if (Boolean.class.isAssignableFrom(clz)) {
return String.valueOf(object);
}
if (clz.equals(String.class)) {
return (String) object;
}
if (clz.equals(byte[].class)) {
return new String((byte[]) object, UTF_8);
}
if (ByteBuffer.class.isAssignableFrom(clz)) {
byte[] bytes = org.apache.thrift.TBaseHelper.byteBufferToByteArray((ByteBuffer) object);
return new String(bytes, UTF_8);
}
if (clz.equals(Date.class)) {
return String.valueOf(object);
}
if (clz.equals(TaskList.class)) {
return String.valueOf(((TaskList) object).getName());
}
if (clz.equals(ActivityType.class)) {
return String.valueOf(((ActivityType) object).getName());
}
if (clz.equals(WorkflowType.class)) {
return String.valueOf(((WorkflowType) object).getName());
}
if (Map.Entry.class.isAssignableFrom(clz)) {
result.append(
prettyPrintObject(
((Map.Entry) object).getKey(),
methodToSkip,
skipNullsAndEmptyCollections,
"",
skipLevel,
printTypeName));
result.append("=");
result.append(
prettyPrintObject(
((Map.Entry) object).getValue(),
methodToSkip,
skipNullsAndEmptyCollections,
"",
skipLevel,
printTypeName));
return result.toString();
}
if (Map.class.isAssignableFrom(clz)) {
result.append("{ ");
String prefix = "";
for (Object entry : ((Map) object).entrySet()) {
result.append(prefix);
prefix = ", ";
result.append(
prettyPrintObject(
entry, methodToSkip, skipNullsAndEmptyCollections, "", skipLevel, printTypeName));
}
result.append(" }");
return result.toString();
}
if (Collection.class.isAssignableFrom(clz)) {
return String.valueOf(object);
}
if (!skipLevel) {
if (printTypeName) {
result.append(object.getClass().getSimpleName());
result.append(" ");
}
result.append("{");
}
Method[] eventMethods = object.getClass().getDeclaredMethods();
boolean first = true;
for (Method method : eventMethods) {
String name = method.getName();
if (!name.startsWith("get")
|| name.equals("getDecisionType")
|| method.getParameterCount() != 0
|| !Modifier.isPublic(method.getModifiers())) {
continue;
}
if (name.equals(methodToSkip) || name.equals("getClass")) {
continue;
}
if (Modifier.isStatic(method.getModifiers())) {
continue;
}
Object value;
try {
value = method.invoke(object, (Object[]) null);
} catch (InvocationTargetException e) {
throw new RuntimeException(e.getTargetException());
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e);
}
if (skipNullsAndEmptyCollections) {
if (value == null) {
continue;
}
if (value instanceof Map && ((Map<?, ?>) value).isEmpty()) {
continue;
}
if (value instanceof Collection && ((Collection<?>) value).isEmpty()) {
continue;
}
}
if (!skipLevel) {
if (first) {
first = false;
} else {
result.append(";");
}
result.append("\n");
result.append(indentation);
result.append(INDENTATION);
result.append(name.substring(3));
result.append(" = ");
// Pretty print JSON serialized exceptions.
if (name.equals("getDetails") && value instanceof byte[]) {
String details = new String((byte[]) value, UTF_8);
details = prettyPrintJson(details, INDENTATION + INDENTATION);
// GSON pretty prints, but doesn't let to set an initial indentation.
// Thus indenting the pretty printed JSON through regexp :(.
String replacement = "\n" + indentation + INDENTATION;
details = details.replaceAll("\\n|\\\\n", replacement);
result.append(details);
continue;
}
result.append(
prettyPrintObject(
value,
methodToSkip,
skipNullsAndEmptyCollections,
indentation + INDENTATION,
false,
false));
} else {
result.append(
prettyPrintObject(
value,
methodToSkip,
skipNullsAndEmptyCollections,
indentation,
false,
printTypeName));
}
}
if (!skipLevel) {
result.append("\n");
result.append(indentation);
result.append("}");
}
return result.toString();
}