//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.consumers; import java.io.File; import java.io.IOException; import java.nio.file.Files; import org.apache.commons.io.FileUtils; 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 com.google.common.base.Strings; import uk.gov.dstl.baleen.types.metadata.Metadata; import uk.gov.dstl.baleen.uima.BaleenConsumer; /** * Move the source file of a document to the destination directory, or delete it if destination directory is not set. * * Assumes that the Source URI is a file, and will throw an error if we're unable to read it. * * @baleen.javadoc */ public class MoveSourceFile extends BaleenConsumer { /** * The location to move source files to. If not set, then the source file will be deleted. * * @baleen.config */ public static final String PARAM_DESTINATION = "destination"; @ConfigurationParameter(name = PARAM_DESTINATION, defaultValue = "") String destination; /** * If true, then documents will be split into subfolders based on type. * Documents with no type will be placed in the root folder. * * @baleen.config false */ public static final String PARAM_SPLIT = "splitByType"; @ConfigurationParameter(name = PARAM_SPLIT, defaultValue = "false") Boolean splitByType; @Override protected void doProcess(JCas jCas) throws AnalysisEngineProcessException { DocumentAnnotation da = getDocumentAnnotation(jCas); String source = da.getSourceUri(); try{ File f = new File(source); if(Strings.isNullOrEmpty(destination)){ deleteFile(f); Metadata md = new Metadata(jCas); md.setKey("movedDocumentLocation"); md.setValue("deleted"); addToJCasIndex(md); }else{ File finalDest = moveFile(f, getDestinationFolder(da)); Metadata md = new Metadata(jCas); md.setKey("movedDocumentLocation"); md.setValue(finalDest.getPath()); addToJCasIndex(md); } }catch(IOException ioe){ getMonitor().error("Unable to move source file", ioe); } } private void deleteFile(File file) throws IOException{ Files.delete(file.toPath()); } private File moveFile(File source, File destination) throws IOException{ if((!destination.exists() || !destination.isDirectory()) && !destination.mkdirs()){ throw new IOException("Destination folder '"+destination.getName()+"' does not exist and could not be created"); } if(!source.exists() || source.isDirectory()){ throw new IOException("File '"+source.getName()+"' does not exist"); } File destFile = new File(destination, source.getName()); int append = 0; while(destFile.exists()){ append++; destFile = new File(destination, source.getName() + "." + append); } if(append != 0){ getMonitor().info("File with the same name already exists in {} - source file will be saved as {}", destination.getName(), destFile.getName()); } FileUtils.moveFile(source, destFile); return destFile; } private File getDestinationFolder(DocumentAnnotation da){ File dest = new File(destination); if(splitByType){ String type = da.getDocType(); if(!Strings.isNullOrEmpty(type)){ dest = new File(dest, type); } } return dest; } }