//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.consumers.utils;
import java.io.File;
import java.io.IOException;
import org.apache.uima.UimaContext;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.fit.descriptor.ConfigurationParameter;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.tcas.DocumentAnnotation;
import org.apache.uima.resource.ResourceInitializationException;
import com.google.common.base.Strings;
import uk.gov.dstl.baleen.exceptions.BaleenException;
import uk.gov.dstl.baleen.uima.BaleenConsumer;
/** A base implement for a consumer that writes to the file system.
*
* The file created is derived from the sourceUrl, see SourceUtils for details.
*
*
* @baleen.javadoc
*/
public abstract class AbstractBaleenFileConsumer extends BaleenConsumer {
/**
* The root directory to output to.
* If not set, then the current directory is used.
*
* @baleen.config
*/
public static final String PARAM_BASE_PATH = "basePath";
@ConfigurationParameter(name = PARAM_BASE_PATH, defaultValue = "")
private String basePathString;
private File basePath;
@Override
public void doInitialize(UimaContext aContext) throws ResourceInitializationException {
super.doInitialize(aContext);
if (!Strings.isNullOrEmpty(basePathString)) {
basePath = new File(basePathString);
if (basePath.exists() && !basePath.isDirectory()) {
throw new ResourceInitializationException(new IOException("Path already exists and is not a directory"));
} else if (!basePath.exists() && !basePath.mkdirs()){
throw new ResourceInitializationException(new IOException("Unable to create directory structure"));
}
} else {
basePath = null;
}
}
@Override
protected void doProcess(JCas jCas) throws AnalysisEngineProcessException {
DocumentAnnotation documentAnnotation =getDocumentAnnotation(jCas);
String url = documentAnnotation.getSourceUri();
if(Strings.isNullOrEmpty(url)) {
url = ConsumerUtils.getExternalId(documentAnnotation, false);
}
String extension = getExtension();
if(!Strings.isNullOrEmpty(extension)) {
url = url + "." + extension;
}
File file = SourceUtils.urlToFile(basePath, url);
try {
getMonitor().debug("Writing {} to {}", url, file.getAbsolutePath());
writeToFile(jCas, file);
} catch(Exception e) {
getMonitor().warn("Failed to write file {}, deleting", file.getAbsolutePath(), e);
if(!file.delete()){
getMonitor().warn("Failed to delete file {}", file.getAbsolutePath(), e);
}
}
}
protected String getExtension() {
return "";
}
protected abstract void writeToFile(JCas jCas, File file)
throws BaleenException;
}