package uk.ac.imperial.lsds.seepworker.core.input;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
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.ConnectionType;
import uk.ac.imperial.lsds.seep.api.DataReference;
import uk.ac.imperial.lsds.seep.api.DataStore;
import uk.ac.imperial.lsds.seep.api.DataStoreType;
import uk.ac.imperial.lsds.seep.api.operator.sources.SyntheticSourceConfig;
import uk.ac.imperial.lsds.seep.core.IBuffer;
import uk.ac.imperial.lsds.seep.core.InputAdapter;
import uk.ac.imperial.lsds.seepworker.WorkerConfig;
import uk.ac.imperial.lsds.seepworker.core.DataReferenceManager;
public class CoreInputFactory {
final private static Logger LOG = LoggerFactory.getLogger(CoreInputFactory.class);
public static CoreInput buildCoreInputFor(WorkerConfig wc,
DataReferenceManager drm,
Map<Integer, Set<DataReference>> input,
Map<Integer, ConnectionType> connTypeInformation) {
LOG.info("Building Core Input...");
List<InputAdapter> inputAdapters = new LinkedList<>();
Map<Integer, IBuffer> iBuffers = new HashMap<>();
// Iterate through streamId
for(Entry<Integer, Set<DataReference>> entry : input.entrySet()) {
int streamId = entry.getKey();
Set<DataReference> drefs = entry.getValue();
List<IBuffer> buffers = new ArrayList<>();
for(DataReference dr : drefs) {
IBuffer ib = null;
// If DR is managed internally and locally
if(drm.doesManageDataReference(dr.getId()) != null) {
ib = drm.getInputBufferFor(dr);
}
else if(dr.getDataStore().type().equals(DataStoreType.EMPTY)) {
ib = FacadeInputBuffer.makeOneFor(wc, dr);
}
else if(dr.getDataStore().type().equals(DataStoreType.SEEP_SYNTHETIC_GEN)) {
DataStore ds = dr.getDataStore();
long sizeOfGeneratedData = new Long(ds.getConfig().getProperty(SyntheticSourceConfig.GENERATED_SIZE));
LOG.info("Created synthetic dataset of size: {}", sizeOfGeneratedData);
ib = drm.getSyntheticDataset(dr, sizeOfGeneratedData);
}
// If not
else {
ib = InputBuffer.makeInputBufferFor(wc, dr);
}
iBuffers.put(dr.getId(), ib); // dataref.id -> inputbuffer
buffers.add(ib);
}
ConnectionType ct = connTypeInformation.get(streamId);
List<InputAdapter> ias = InputAdapterFactory.buildInputAdapterForStreamId(wc, streamId, buffers, drefs, ct, drm);
inputAdapters.addAll(ias);
}
CoreInput ci = new CoreInput(wc, input, iBuffers, inputAdapters);
LOG.info("Building Core Input...OK");
return ci;
}
}