package dk.statsbiblioteket.medieplatform.autonomous;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.AttributeParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.DataFileNodeBeginsParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.DataFileNodeEndsParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.ParsingEvent;
import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.TreeIterator;
import org.apache.commons.io.IOUtils;
import org.testng.Assert;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
public abstract class AbstractTests {
private static final String indentString = " ";
private static String getIndent(int indent) {
String s;
if (indent > 0) {
s = indentString.substring(0, indent);
} else {
s = "";
}
return s;
}
public abstract TreeIterator getIterator() throws URISyntaxException, IOException;
public void testIterator(final boolean print, final boolean printContent) throws Exception {
printStructure(getIterator(), print, printContent);
}
private String printEvent(ParsingEvent next) throws IOException {
switch (next.getType()) {
case NodeBegin:
return "<node name=\"" + next.getName() + "\" location=\"" + next.getLocation() + "\">";
case NodeEnd:
return "</node>";
case Attribute:
if (next instanceof AttributeParsingEvent) {
AttributeParsingEvent attributeParsingEvent = (AttributeParsingEvent) next;
return "<attribute name=\"" + next.getName() + "\" checksum=\"" + attributeParsingEvent.getChecksum() + "\" location=\"" + next.getLocation() + "\"/>";
}
default:
return next.toString();
}
}
public void testIteratorWithSkipping(final boolean print, final boolean printContent) throws Exception {
List<TreeIterator> avisIterators = new ArrayList<>();
System.out.println("Print the batch and film, and store the iterators for the aviser");
int indent = 0;
while (getIterator().hasNext()) {
ParsingEvent next = getIterator().next();
String s;
switch (next.getType()) {
case NodeBegin:
if (next.getName().endsWith(".jp2")) {
Assert.assertTrue(next instanceof DataFileNodeBeginsParsingEvent);
}
s = getIndent(indent);
if (print) {
System.out.println(s + printEvent(next));
}
indent += 2;
if (indent > 4) {
TreeIterator avis = getIterator().skipToNextSibling();
avisIterators.add(avis);
indent -= 2;
}
break;
case NodeEnd:
if (next.getName().endsWith(".jp2")) {
Assert.assertTrue(next instanceof DataFileNodeEndsParsingEvent);
}
indent -= 2;
s = getIndent(indent);
if (print) {
System.out.println(s + printEvent(next));
}
break;
case Attribute:
s = getIndent(indent);
if (print) {
System.out.println(s + printEvent(next));
}
break;
}
}
if (print) {
System.out.println("Print each of the newspapers in order");
}
for (TreeIterator avisIterator : avisIterators) {
if (print) {
System.out.println("We found this newspaper");
}
printStructure(avisIterator, print, printContent);
}
}
private void printStructure(TreeIterator avisIterator, final boolean print, final boolean printContent) throws
IOException {
int indent = 0;
int files = 0;
while (avisIterator.hasNext()) {
ParsingEvent next = avisIterator.next();
switch (next.getType()) {
case NodeBegin: {
String s;
s = getIndent(indent);
if (print) {
System.out.println(s + printEvent(next));
}
indent += 2;
break;
}
case NodeEnd: {
String s;
indent -= 2;
s = getIndent(indent);
if (print) {
System.out.println(s + printEvent(next));
}
break;
}
case Attribute: {
String s = getIndent(indent);
AttributeParsingEvent attributeEvent = (AttributeParsingEvent) next;
List<String> content = IOUtils.readLines(attributeEvent.getData());
if (print) {
System.out.println(s + printEvent(next));
}
s = getIndent(indent + 2);
if (print && printContent) {
System.out.println(s + "[" + content.size() + " lines of content]");
}
files++;
break;
}
}
}
Assert.assertEquals(indent, 0, "Indent is not reset after iteration");
Assert.assertTrue(files > 1, "We have not encountered very much, only " + files + ", is the test data broken?");
}
}