package org.batfish.common.util; import java.util.LinkedList; import java.util.TreeMap; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class PrettyPrinter { public static String print(String prefixStr, JsonDiff jsonDiff) { final StringBuilder sb = new StringBuilder(); for (String key : jsonDiff.getData().keySet()) { Object value = jsonDiff.getData().get(key); if (key.startsWith(JsonDiff.ADDED_ITEM_CODE)) { sb.append(prefixStr + "+[" + JsonDiff.getStringWithoutCode(key) + "]\n"); sb.append(print(prefixStr + " ", value)); } else if (key.startsWith(JsonDiff.REMOVED_ITEM_CODE)) { sb.append(prefixStr + "-[" + JsonDiff.getStringWithoutCode(key) + "]\n"); sb.append(print(prefixStr + " ", value)); } else if (key.startsWith(JsonDiff.COMMON_ITEM_CODE)) { sb.append(prefixStr + "~[" + JsonDiff.getStringWithoutCode(key) + "]\n"); sb.append(print(prefixStr + " ", value)); } else if (key.startsWith(JsonDiff.CHANGED_ITEM_CODE)) { sb.append(prefixStr + "~[" + JsonDiff.getStringWithoutCode(key) + "]\n"); TreeMap<?, ?> treeMap = (TreeMap<?, ?>) value; Object baseValue = treeMap.get(JsonDiff.CHANGED_ITEM_BASE); Object deltaValue = treeMap.get(JsonDiff.CHANGED_ITEM_DELTA); sb.append(prefixStr + "BASE\n"); sb.append(print(prefixStr + " ", baseValue)); sb.append(prefixStr + "DELTA\n"); sb.append(print(prefixStr + " ", deltaValue)); } else { sb.append(prefixStr + key + "\n"); sb.append(print(prefixStr + " ", value)); } } return sb.toString(); } private static String print(String prefixStr, LinkedList<?> list) { final StringBuilder sb = new StringBuilder(); for (Object obj : list) { sb.append(print(prefixStr, obj)); } return sb.toString(); } private static String print(String prefixStr, Object value) { final StringBuilder sb = new StringBuilder(); if (value instanceof JsonDiff) { sb.append(((JsonDiff) value).prettyPrint(prefixStr + " ")); } else if (value instanceof TreeMap<?, ?>) { sb.append(print(prefixStr + " ", (TreeMap<?, ?>) value)); } else if (value instanceof LinkedList<?>) { sb.append(print(prefixStr + " ", (LinkedList<?>) value)); } else if (value instanceof String) { sb.append(prefixStr + " " + (String) value + "\n"); } else { ObjectMapper mapper = new BatfishObjectMapper(); try { sb.append(mapper.writeValueAsString(value)); } catch (JsonProcessingException e) { sb.append("Exception while pretty printing " + value.toString() + "\n" + e.getMessage()); } } return sb.toString(); } private static String print(String prefixStr, TreeMap<?, ?> treeMap) { final StringBuilder sb = new StringBuilder(); for (Object keyObject : treeMap.keySet()) { String key = (String) keyObject; Object value = treeMap.get(key); sb.append(prefixStr + key + "\n"); sb.append(print(prefixStr + " ", value)); } return sb.toString(); } }