package uk.ac.imperial.lsds.seepworker.core.output; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.ac.imperial.lsds.seep.api.DataReference; import uk.ac.imperial.lsds.seep.api.DataReference.ServeMode; import uk.ac.imperial.lsds.seep.api.DataStoreType; import uk.ac.imperial.lsds.seep.api.operator.sources.FileConfig; import uk.ac.imperial.lsds.seep.core.OBuffer; import uk.ac.imperial.lsds.seepworker.core.output.OutputBuffer; import uk.ac.imperial.lsds.seepworker.WorkerConfig; import uk.ac.imperial.lsds.seepworker.core.DataReferenceManager; public class CoreOutputFactory { final private static Logger LOG = LoggerFactory.getLogger(CoreOutputFactory.class); public static CoreOutput buildCoreOutputFor(WorkerConfig wc, DataReferenceManager drm, Map<Integer, Set<DataReference>> output) { LOG.info("Building coreOutput..."); Map<Integer, OBuffer> oBuffers = new HashMap<>(); Map<Integer, List<OBuffer>> streamId_To_OBuffers = new HashMap<>(); // Iterate per streamId for(Entry<Integer, Set<DataReference>> entry : output.entrySet()) { int streamId = entry.getKey(); List<OBuffer> buffers = new ArrayList<>(); for(DataReference dr : entry.getValue()) { OBuffer ob = null; // If STORE, then DRM is responsible for the new DataReference if(dr.getServeMode().equals(ServeMode.STORE)) { ob = drm.manageNewDataReference(dr); } // If SINK, then it will depend on the target DataStoreType else if (dr.getServeMode().equals(ServeMode.SINK)) { // TODO: refactor this into a another private method below DataStoreType type = dr.getDataStore().type(); if(type.equals(DataStoreType.FILE)) { FileConfig config = new FileConfig(dr.getDataStore().getConfig()); if (config.getBoolean(FileConfig.TEXT_SOURCE)) { ob = new TextFileOutputBuffer(dr, wc.getInt(WorkerConfig.BATCH_SIZE)); } else { ob = new FileOutputBuffer(dr, wc.getInt(WorkerConfig.BATCH_SIZE)); } } else { ob = new NullOutputBuffer(); } } // If STREAM, data is kept in an OutputBuffer until the network services pulls it else if(dr.getServeMode().equals(ServeMode.STREAM)) { ob = new OutputBuffer(dr, wc.getInt(WorkerConfig.BATCH_SIZE)); } oBuffers.put(dr.getId(), ob); // dr.id -> obuffer buffers.add(ob); } streamId_To_OBuffers.put(streamId, buffers); } CoreOutput cOutput = new CoreOutput(output, streamId_To_OBuffers, oBuffers); LOG.info("Building coreOutput...OK"); return cOutput; } public static CoreOutput buildCoreOutputForTestingOneDatasetOutput(WorkerConfig wc, DataReferenceManager drm) { Map<Integer, OBuffer> oBuffers = new HashMap<>(); Map<Integer, List<OBuffer>> streamId_To_OBuffers = new HashMap<>(); Map<Integer, Set<DataReference>> output = new HashMap<>(); DataReference dr = DataReference.makeEmptyDataReference(null); OBuffer o = drm.manageNewDataReference(dr); oBuffers.put(dr.getId(), o); // dr.id -> obuffer List<OBuffer> buffers = new ArrayList<>(); buffers.add(o); streamId_To_OBuffers.put(333, buffers); CoreOutput cOutput = new CoreOutput(output, streamId_To_OBuffers, oBuffers); return cOutput; } }