package org.activityinfo.core.shared.form.tree; import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.activityinfo.model.resource.ResourceId; import org.activityinfo.model.form.FormClass; import org.activityinfo.model.formTree.FormTree; import java.io.PrintWriter; import java.util.Collections; import java.util.List; import java.util.Set; /** * Created by alex on 3/26/14. */ public class FormTreePrettyPrinter { private PrintWriter pw = new PrintWriter(System.out); public void prettyPrintNodes(int indent, List<FormTree.Node> nodes) { List<FormClass> formClasses = distinctFormClasses(nodes); pw.println(classNode(formClasses)); for(FormClass formClass : formClasses) { if(formClasses.size() > 1) { println(indent, classNode(Collections.singletonList(formClass))); } printFields(indent+1, nodes, formClass.getId()); } pw.flush(); } private void printFields(int indent, List<FormTree.Node> nodes, ResourceId formClassId) { // print data fields first for(FormTree.Node node : nodes) { if(!node.isReference() && node.getDefiningFormClass().getId().equals(formClassId)) { println(indent, "." + node.getField().getLabel()); } } for(FormTree.Node node : nodes) { if(node.isReference() && node.getDefiningFormClass().getId().equals(formClassId)) { String fieldLabel = "." + node.getField().getLabel() + " = "; print(indent, fieldLabel); prettyPrintNodes(indent + fieldLabel.length(), node.getChildren()); } } } private void println(int indent, String s) { print(indent, s); pw.println(); } private void print(int indent, String line) { pw.print(Strings.repeat(".", indent)); pw.print(line); } private List<FormClass> distinctFormClasses(List<FormTree.Node> nodes) { Set<ResourceId> formClassIds = Sets.newHashSet(); List<FormClass> formClasses = Lists.newArrayList(); for(FormTree.Node node : nodes) { ResourceId formClassId = node.getDefiningFormClass().getId(); if(!formClassIds.contains(formClassId)) { formClassIds.add(formClassId); formClasses.add(node.getDefiningFormClass()); } } return formClasses; } private String classNode(List<FormClass> formClasses) { StringBuilder sb = new StringBuilder("["); boolean needsPipe = false; for(FormClass formClass : formClasses) { if(needsPipe) { sb.append(" | "); } sb.append(formClass.getLabel()); needsPipe = true; } sb.append("]"); return sb.toString(); } public static void print(FormTree formTree) { new FormTreePrettyPrinter() .prettyPrintNodes(0, formTree.getRootFields()); } }