import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.util.*;
import net.sf.json.*;
public class ThreadedProducer extends Thread {
private String dataFile = null;
private int sendMax = 0;
private Pipe.SinkChannel t = null;
public ThreadedProducer(String datafile, int sendmax, Pipe.SinkChannel sink){
this.dataFile = datafile;
this.sendMax = sendmax;
this.t = sink;
}
public void run(){
try{
System.out.println("Producer started");
//populate data item
byte[] data;
FileReader freader = new FileReader(dataFile);
BufferedReader breader = new BufferedReader(freader);
String line = breader.readLine();
StringBuffer o=new StringBuffer();
while(line != null){
line = line.trim();
o.append(line);
line=breader.readLine();
}
int sent=1;
JSONObject jdata = (JSONObject) JSONSerializer.toJSON(o.toString());
JSONObject jdataProps = jdata.getJSONObject("properties");
JSONObject jdataHead = jdataProps.getJSONObject("head");
jdataHead.put("timestamp", sent);
jdataProps.put("head",jdataHead);
jdata.put("properties", jdataProps);
byte[] fdata = jdata.toString().getBytes();
int bufferLength = fdata.length + 4;
//System.out.println("bufferLength:" + bufferLength);
data= new byte[bufferLength];
ByteBuffer dataByteBuf = ByteBuffer.wrap(data);
dataByteBuf = dataByteBuf.putInt(bufferLength);
/*System.out.println("written:"+dataByteBuf.position() + ", capacity:" + dataByteBuf.capacity() +
" remaining:" + dataByteBuf.remaining() + ", length: " + fdata.length);*/
dataByteBuf=dataByteBuf.put(fdata);
while(sent<=sendMax || sendMax ==0 && t.isOpen()){
dataByteBuf.rewind();
//System.out.println("source.remaining: " + dataByteBuf.remaining());
int v = t.write(dataByteBuf);
//System.out.println("Producer wrote: " +v + "\tdataByteBuf.size="+dataByteBuf.array().length);
sent +=1;
this.sleep(1000);
//update sent attribute value
jdata = (JSONObject) JSONSerializer.toJSON(o.toString());
jdataProps = jdata.getJSONObject("properties");
jdataHead = jdataProps.getJSONObject("head");
jdataHead.put("timestamp", sent);
jdataProps.put("head",jdataHead);
jdata.put("properties", jdataProps);
fdata = jdata.toString().getBytes();
bufferLength = fdata.length + 4;
data= new byte[bufferLength];
dataByteBuf = ByteBuffer.wrap(data);
dataByteBuf.putInt(bufferLength);
dataByteBuf.put(fdata);
}
//send kill op to producer
dataByteBuf.rewind();
dataByteBuf.clear();
JSONObject c = new JSONObject();
c.put("operation", "kill");
dataByteBuf = null;
dataByteBuf = ByteBuffer.wrap(c.toString().getBytes());
dataByteBuf.rewind();
int v = t.write(dataByteBuf);
this.yield();
t.close();
} catch (Exception e){
e.printStackTrace();
}
}
}