//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.consumers.print; import uk.gov.dstl.baleen.consumers.AbstractStructureConsumer; import uk.gov.dstl.baleen.types.structure.Structure; import uk.gov.dstl.baleen.uima.utils.AnnotationNode; import uk.gov.dstl.baleen.uima.utils.select.ItemHierarchy; import uk.gov.dstl.baleen.uima.utils.select.Node; /** * Print out all structure. */ public class Structures extends AbstractStructureConsumer { private void print(int level, StringBuilder sb, Node<Structure> n) { startTag(level, sb, n.getItem()); int offset = 0; for (final Node<Structure> child : n.getChildren()) { addText(level + 1, sb, n.getItem(), offset, AnnotationNode.getBegin(child) - AnnotationNode.getBegin(n)); print(level + 1, sb, child); offset = AnnotationNode.getEnd(child) - AnnotationNode.getBegin(n); } addText(level + 1, sb, n.getItem(), offset, AnnotationNode.getEnd(n) - AnnotationNode.getBegin(n)); endTag(level, sb, n.getItem()); } private void addText(int level, StringBuilder sb, Structure element, int start, int end) { if (element != null && start < end) { final String coveredText = element.getCoveredText(); if (end > coveredText.length()) { sb.append("ERROR IN DOCUMENT TREE"); } indent(level, sb); sb.append(coveredText.substring(start, end)); } } private void endTag(int level, final StringBuilder sb, Structure element) { if (element != null) { indent(level, sb); sb.append("</"); sb.append(element.getClass().getSimpleName()); sb.append(">"); } } private void indent(int size, StringBuilder sb) { sb.append("\n"); for (int i = 0; i < size - 1; i++) { sb.append("\t"); } } private String print(Node<Structure> parent) { final StringBuilder sb = new StringBuilder(); print(0, sb, parent); return sb.toString(); } private void startTag(int level, final StringBuilder sb, Structure element) { if (element != null) { indent(level, sb); sb.append("<"); sb.append(element.getClass().getSimpleName()); sb.append(">"); } } @Override protected void doProcess(ItemHierarchy<Structure> structureHierarchy) { final String result = print(structureHierarchy.getRoot()); getMonitor().info("{}:\n{}", Structure.class.getName(), result); } }