package com.zillabyte.motherbrain.flow.buffer.mock;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import com.csvreader.CsvWriter;
import com.zillabyte.motherbrain.flow.MapTuple;
import com.zillabyte.motherbrain.flow.buffer.BufferProducer;
import com.zillabyte.motherbrain.flow.buffer.SinkToBuffer;
import com.zillabyte.motherbrain.flow.operations.OperationException;
import com.zillabyte.motherbrain.flow.operations.OperationLogger;
import com.zillabyte.motherbrain.universe.Universe;
public class LocalBufferProducer implements BufferProducer {
private SinkToBuffer _operation;
private CsvWriter _csvOutput = null;
public LocalBufferProducer(SinkToBuffer operation) throws OperationException {
_operation = operation;
if(Universe.instance().env().isLocal()) {
String outputFile = Universe.instance().config().getOrException("output.prefix");
if(!outputFile.equals("")) {
outputFile += "_"+_operation.getTopicName()+".csv";
try {
String outputFilePath = Universe.instance().config().getOrException("directory")+"/"+outputFile;
_operation.logger().writeLog("Writing output for relation ["+_operation.getTopicName()+"] to file: "+outputFilePath, OperationLogger.LogPriority.RUN);
_csvOutput = new CsvWriter(new FileWriter(outputFilePath), ',');
} catch (IOException e) {
throw (OperationException) new OperationException(_operation, e).setUserMessage("Could not open CSV file for writing.").adviseRetry();
}
}
}
}
@Override
public synchronized void pushTuple(MapTuple t) throws OperationException {
if(_csvOutput != null) {
Map<String, Object> tupleValues = t.values();
try {
for(String key : tupleValues.keySet()) {
_csvOutput.write(tupleValues.get(key).toString());
}
_csvOutput.endRecord();
_csvOutput.flush();
} catch (IOException e) {
throw (OperationException) new OperationException(_operation, e).setUserMessage("Error writing output tuples to CSV file.").adviseRetry();
}
}
}
public void closeFile() {
if(_csvOutput != null) _csvOutput.close();
}
}