in hollow-diff-ui/src/main/java/com/netflix/hollow/history/ui/pages/HistoryStateTypePage.java [61:160]
public void sendJson(HttpServletRequest request, HollowUISession session, HttpServletResponse response) {
long version = Long.parseLong(request.getParameter("version"));
HistoryStateTypeChanges typeChange = getStateTypeChanges(request, session, ui);
HollowHistoricalState historicalState = ui.getHistory().getHistoricalState(version);
List<String> groupByOptions = new ArrayList<String>(Arrays.asList(historicalState.getKeyOrdinalMapping().getTypeMapping(request.getParameter("type")).getKeyIndex().getKeyFields()));
groupByOptions.removeAll(Arrays.asList(typeChange.getGroupedFieldNames()));
Map<String, List<List<String>>> changes = new LinkedHashMap<String, List<List<String>>>();
List<List<String>> groups = new ArrayList<List<String>>();
groups.add(groupByOptions);
changes.put("groups", groups);
// handle additions
if(typeChange.getAddedRecords().isEmpty()) {
changes.put("additions", new ArrayList<List<String>>());
} else if(!typeChange.getAddedRecords().hasSubGroups()){
List<RecordDiff> addedDiffs = typeChange.getAddedRecords().getRecordDiffs();
List<List<String>> idRecords = new ArrayList<List<String>>();
for(RecordDiff diff : addedDiffs) {
List<String> data = new ArrayList<String>();
data.add(diff.getIdentifierString());
data.add(new Integer(diff.getKeyOrdinal()).toString());
idRecords.add(data);
}
changes.put("additions", idRecords);
} else {
// This has sub groups
List<List<String>> idRecords = new ArrayList<List<String>>();
for(RecordDiffTreeNode changeGroup : typeChange.getAddedRecords().getSubGroups()) {
List<String> data = new ArrayList<String>();
data.add(changeGroup.getGroupName() + "(" + changeGroup.getDiffCount() + ")");
data.add(changeGroup.getHierarchicalFieldName());
idRecords.add(data);
}
changes.put("additions", idRecords);
}
// handle modifications
if(typeChange.getModifiedRecords().isEmpty()) {
changes.put("modifications", new ArrayList<List<String>>());
} else if(!typeChange.getModifiedRecords().hasSubGroups()){
List<RecordDiff> modifiedDiffs = typeChange.getModifiedRecords().getRecordDiffs();
List<List<String>> idRecords = new ArrayList<List<String>>();
for(RecordDiff diff : modifiedDiffs) {
List<String> data = new ArrayList<String>();
data.add(diff.getIdentifierString());
data.add(new Integer(diff.getKeyOrdinal()).toString());
idRecords.add(data);
}
changes.put("modifications", idRecords);
} else {
// This has sub groups
List<List<String>> idRecords = new ArrayList<List<String>>();
for(RecordDiffTreeNode changeGroup : typeChange.getModifiedRecords().getSubGroups()) {
List<String> data = new ArrayList<String>();
data.add(changeGroup.getGroupName() + "(" + changeGroup.getDiffCount() + ")");
data.add(changeGroup.getHierarchicalFieldName());
idRecords.add(data);
}
changes.put("modifications", idRecords);
}
// handle removals
if(typeChange.getRemovedRecords().isEmpty()) {
changes.put("removals", new ArrayList<List<String>>());
} else if(!typeChange.getRemovedRecords().hasSubGroups()){
List<RecordDiff> removedDiffs = typeChange.getRemovedRecords().getRecordDiffs();
List<List<String>> idRecords = new ArrayList<List<String>>();
for(RecordDiff diff : removedDiffs) {
List<String> data = new ArrayList<String>();
data.add(diff.getIdentifierString());
data.add(new Integer(diff.getKeyOrdinal()).toString());
idRecords.add(data);
}
changes.put("removals", idRecords);
} else {
// This has sub groups
List<List<String>> idRecords = new ArrayList<List<String>>();
for(RecordDiffTreeNode changeGroup : typeChange.getRemovedRecords().getSubGroups()) {
List<String> data = new ArrayList<String>();
data.add(changeGroup.getGroupName() + "(" + changeGroup.getDiffCount() + ")");
data.add(changeGroup.getHierarchicalFieldName());
idRecords.add(data);
}
changes.put("removals", idRecords);
}
try {
PrintWriter out = response.getWriter();
Gson gson = new Gson();
String json = gson.toJson(changes, changes.getClass());
out.println(json);
} catch(IOException e) {
e.printStackTrace();
}
}