package dk.statsbiblioteket.medieplatform.autonomous.iterator.eventhandlers;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.AttributeParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.NodeBeginsParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.NodeEndParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.ParsingEvent;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.util.List;
/** Prints the tree to the console. Used for testing purposes. */
public class ConsoleLogger extends DefaultTreeEventHandler {
private static final String indentString = "..................................................";
int indentLevel = 0;
/**
* Prints a begin node and indents a step
*
* @param event The event to handle
*/
@Override
public void handleNodeBegin(NodeBeginsParsingEvent event) {
printIndentNode(event);
indentLevel += 2;
}
/**
* Prints an end node and unindents a step
*
* @param event The event to handle
*/
@Override
public void handleNodeEnd(NodeEndParsingEvent event) {
// We have exited a node, decrease indentLevel-level again
indentLevel -= 2;
printIndentNode(event);
}
/**
* Prints an attribute event and its attributes, properly indented
*
* @param event The event to handle
*/
@Override
public void handleAttribute(AttributeParsingEvent event) {
try {
List<String> content = IOUtils.readLines(event.getData());
String checksum = event.getChecksum();
printIndentNode(event);
printIndentAttribute("[" + content.size() + " lines of content]");
printIndentAttribute("Checksum: " + checksum);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Prints an indented node
*
* @param event The event to handle
*/
private void printIndentNode(ParsingEvent event) {
System.out.println(getIndentString() + printEvent(event));
}
/**
* Prints an indented attribute event
*
* @param attributeString The event to handle
*/
private void printIndentAttribute(String attributeString) {
System.out.println(getIndentString() + "src/main" + attributeString);
}
/**
* Create a string of dots, used for indenting.
*
* @return A string of dots, as long as specified by input parameter 'indentLevel'
*/
private String getIndentString() {
String s;
if (indentLevel > 0) {
s = indentString.substring(0, indentLevel);
} else {
s = "";
}
return s;
}
/**
* Print the name of an event to a string
*
* @param event The event to handle
*
* @return The name of the event as a string
*/
private String printEvent(ParsingEvent event) {
switch (event.getType()) {
case NodeBegin:
return "<" + event.getName() + ">";
case NodeEnd:
return "</" + event.getName() + ">";
case Attribute:
return "<" + event.getName() + "/>";
default:
return event.toString();
}
}
}