//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.consumers.template;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.uima.jcas.tcas.DocumentAnnotation;
import org.apache.uima.util.FileUtils;
import org.junit.After;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import uk.gov.dstl.baleen.annotators.templates.TemplateFieldConfiguration;
import uk.gov.dstl.baleen.annotators.templates.TemplateRecordConfiguration;
import uk.gov.dstl.baleen.annotators.templates.TemplateRecordConfiguration.Kind;
import uk.gov.dstl.baleen.annotators.testing.AbstractAnnotatorTest;
import uk.gov.dstl.baleen.types.structure.Paragraph;
import uk.gov.dstl.baleen.types.templates.TemplateFieldDefinition;
public abstract class AbstractTemplateRecordConfigurationCreatingConsumerTest extends AbstractAnnotatorTest {
private static final String SOURCEURI = AbstractTemplateRecordConfigurationCreatingConsumerTest.class
.getSimpleName() + ".yaml";
private static final String PARA1 = "The quick brown fox jumped over the lazy dog's back.";
private static final String PARA2 = "The quick brown cat jumped over the lazy dog's back.";
private static final String PARA3 = "The quick brown rat jumped over the lazy dog's back.";
private static final String PARA4 = "The quick brown bat jumped over the lazy dog's back.";
private static final String TEXT = String.join("\n", PARA1, PARA2, PARA3, PARA4);
private static final ObjectMapper YAMLMAPPER = new ObjectMapper(new YAMLFactory());
protected Path tempDirectory;
public AbstractTemplateRecordConfigurationCreatingConsumerTest() {
super(TemplateRecordConfigurationCreatingConsumer.class);
}
public void setup() throws IOException {
jCas.setDocumentText(TEXT);
tempDirectory = Files
.createTempDirectory(AbstractTemplateRecordConfigurationCreatingConsumerTest.class.getSimpleName());
tempDirectory.toFile().deleteOnExit();
DocumentAnnotation documentAnnotation = (DocumentAnnotation) jCas.getDocumentAnnotationFs();
documentAnnotation.setSourceUri(SOURCEURI);
Paragraph paragraph1 = new Paragraph(jCas);
paragraph1.setBegin(0);
paragraph1.setDepth(1);
paragraph1.setEnd(52);
paragraph1.addToIndexes();
Paragraph paragraph2 = new Paragraph(jCas);
paragraph2.setBegin(53);
paragraph2.setDepth(1);
paragraph2.setEnd(105);
paragraph2.addToIndexes();
Paragraph paragraph3 = new Paragraph(jCas);
paragraph3.setBegin(106);
paragraph3.setDepth(1);
paragraph3.setEnd(158);
paragraph3.addToIndexes();
Paragraph paragraph4 = new Paragraph(jCas);
paragraph4.setBegin(159);
paragraph4.setDepth(1);
paragraph4.setEnd(212);
paragraph4.addToIndexes();
TemplateFieldDefinition field1 = new TemplateFieldDefinition(jCas);
field1.setBegin(72);
field1.setEnd(75);
field1.setName("field1");
field1.addToIndexes();
TemplateFieldDefinition field2 = new TemplateFieldDefinition(jCas);
field2.setBegin(123);
field2.setEnd(140);
field2.setName("field2");
field2.addToIndexes();
TemplateFieldDefinition field3 = new TemplateFieldDefinition(jCas);
field3.setBegin(17);
field3.setEnd(20);
field3.setName("noRecordField");
field3.addToIndexes();
}
protected List<TemplateRecordConfiguration> readDefinitions(Path yamlFile)
throws IOException, JsonParseException, JsonMappingException {
List<TemplateRecordConfiguration> definitions = YAMLMAPPER.readValue(yamlFile.toFile(),
YAMLMAPPER.getTypeFactory().constructCollectionType(List.class, TemplateRecordConfiguration.class));
return definitions;
}
protected Path getDefinitionPath() {
Path yamlFile = Paths.get(tempDirectory.toString(),
AbstractTemplateRecordConfigurationCreatingConsumerTest.class.getSimpleName() + ".yaml");
yamlFile.toFile().deleteOnExit();
return yamlFile;
}
protected void assertDefaultRecord(List<TemplateRecordConfiguration> definitions) {
TemplateRecordConfiguration defaultRecord = definitions.stream().filter(p -> p.getKind().equals(Kind.DEFAULT))
.collect(Collectors.toList()).get(0);
assertEquals(null, defaultRecord.getName());
assertEquals(1, defaultRecord.getFields().size());
TemplateFieldConfiguration field = defaultRecord.getFields().get(0);
assertEquals("noRecordField", field.getName());
assertEquals("Paragraph:nth-of-type(1)", field.getPath());
}
protected TemplateRecordConfiguration assertNamedRecord(List<TemplateRecordConfiguration> definitions) {
TemplateRecordConfiguration record = definitions.stream()
.filter(p -> p.getKind().equals(Kind.NAMED) && p.getName().equals("record1"))
.collect(Collectors.toList()).get(0);
assertEquals(Kind.NAMED, record.getKind());
assertEquals(2, record.getFields().size());
for (TemplateFieldConfiguration field : record.getFields()) {
String name = field.getName();
if (name.equals("field1")) {
assertEquals("Paragraph:nth-of-type(2)", field.getPath());
} else if (field.getName().equals("field2")) {
assertEquals("Paragraph:nth-of-type(3)", field.getPath());
} else {
fail("field not expected: " + name);
}
}
assertEquals("Paragraph:nth-of-type(1)", record.getPrecedingPath());
assertEquals("Paragraph:nth-of-type(4)", record.getFollowingPath());
return record;
}
@After
public void tearDown() throws IOException {
FileUtils.deleteRecursive(tempDirectory.toFile());
}
}