//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.annotators.templates; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import org.apache.uima.UimaContext; import org.apache.uima.fit.descriptor.ConfigurationParameter; import org.apache.uima.resource.ResourceInitializationException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import uk.gov.dstl.baleen.uima.BaleenAnnotator; /** * Base class for Annotators that deal with template record definitions */ public abstract class AbstractTemplateAnnotator extends BaleenAnnotator { /** the record definition directory parameter name */ public static final String PARAM_RECORD_DEFINITIONS_DIRECTORY = "recordDefinitionsDirectory"; /** The record definitions directory. */ @ConfigurationParameter(name = PARAM_RECORD_DEFINITIONS_DIRECTORY, defaultValue = "recordDefinitions") private String recordDefinitionsDirectory = "recordDefinitions"; /** The object mapper, used to read YAML configurations */ private final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); /** The record definitions. */ protected final ListMultimap<String, TemplateRecordConfiguration> recordDefinitions = ArrayListMultimap.create(); @Override public void doInitialize(final UimaContext aContext) throws ResourceInitializationException { super.doInitialize(aContext); readRecordDefinitions(); } /** * Read all record definitions from YAML configuration files in directory. * * @throws ResourceInitializationException * if the record definitions path is not found */ private void readRecordDefinitions() throws ResourceInitializationException { final Path path = Paths.get(recordDefinitionsDirectory); try { Files.list(path).filter(Files::isRegularFile).forEach(this::readRecordDefinitionsFromFile); } catch (IOException e) { throw new ResourceInitializationException(e); } } /** * Read record definitions from YAML file. * * @param path * the path */ private void readRecordDefinitionsFromFile(final Path path) { try { List<TemplateRecordConfiguration> fileDefinitions = objectMapper .readValue(Files.newBufferedReader(path, StandardCharsets.UTF_8), objectMapper.getTypeFactory() .constructCollectionType(List.class, TemplateRecordConfiguration.class)); String namespace = path.toFile().getName(); recordDefinitions.putAll(namespace, fileDefinitions); } catch (IOException e) { getMonitor().warn("Failed to read from recordDefinitions from file " + path, e); } } }