package eu.dnetlib.iis.wf.export.actionmanager.api; import java.io.IOException; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.SequenceFile.CompressionType; import org.apache.hadoop.io.SequenceFile.Writer; import org.apache.hadoop.io.Text; import eu.dnetlib.actionmanager.actions.AtomicAction; import eu.dnetlib.actionmanager.rmi.ActionManagerException; /** * Sequence file based action manager service facade. * * @author mhorst * */ public class SequenceFileActionManagerServiceFacade implements ActionManagerServiceFacade { private final SequenceFile.Writer writer; // ------------------------------- CONSTRUCTORS ---------------------------------------- /** * @param hadoopConf hadoop configuration * @param outputDirRoot root output directory * @param outputDirName output subdirectory name */ public SequenceFileActionManagerServiceFacade(Configuration hadoopConf, String outputDirRoot, String outputDirName) throws IOException { this.writer = SequenceFile.createWriter(hadoopConf, Writer.file(new Path(new Path(outputDirRoot, outputDirName), "part-m-00000")), Writer.keyClass(Text.class), Writer.valueClass(Text.class), Writer.compression(CompressionType.BLOCK)); } /** * @param writer writer instantiated outside facade */ public SequenceFileActionManagerServiceFacade(SequenceFile.Writer writer) { this.writer = writer; } // ------------------------------- LOGIC ---------------------------------------- @Override public void storeActions(List<AtomicAction> actions) throws ActionManagerException { if (actions != null) { for (AtomicAction action : actions) { try { Text keyOut = new Text(); Text valueOut = new Text(); keyOut.set(action.getRowKey()); valueOut.set(action.toString()); writer.append(keyOut, valueOut); } catch (IOException e) { throw new ActionManagerException("exception occurred when writing action: " + action.toString(), e); } } } } @Override public void close() { IOUtils.closeStream(writer); } }