package edu.usc.enl.dynamicmeasurement.data;
import edu.usc.enl.dynamicmeasurement.model.Packet;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.concurrent.BlockingQueue;
/**
* Created with IntelliJ IDEA.
* User: Masoud
* Date: 1/24/13
* Time: 9:50 AM <br/>
* A simple class that can read traces and make data packets and put into a queue.
* It is mostly used for just trace analysis scripts
*/
public class PacketLoader extends Thread {
private final TraceReader br;
private final long maxTime;
private final BlockingQueue<Packet> queue;
private boolean finish = false;
public PacketLoader(BlockingQueue<Packet> queue, TraceReader br) {
this(queue, br, 0);
}
public PacketLoader(BlockingQueue<Packet> queue, TraceReader br, long maxTime) {
this.br = br;
this.maxTime = maxTime;
this.queue = queue;
}
public void run() {
long start = -1;
long lastTime = 0;
try (TraceReader br2 = br) {
while (true) {
String line = br2.readLine();
if (line == null) {
break;
}
DataPacket p = null;
try {
p = new DataPacket(new StringTokenizer(line, ","));
} catch (DataPacket.PacketParseException e) {
System.out.println(line);
throw e;
}
lastTime = p.getTime();
queue.put(p);
if (finish) {
queue.put(new FinishPacket(lastTime));
return;
}
if (start < 0) {
start = p.getTime();
} else {
if (maxTime > 0 && p.getTime() - start > maxTime) {
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
queue.put(new FinishPacket(lastTime));
} catch (InterruptedException e) {
}
}
}
public void finish() {
finish = true;
queue.clear();
}
/**
* A traceReader is a simple class that can read files one line at a time
*/
public interface TraceReader extends AutoCloseable {
public void close() throws IOException;
/**
* @return null if the end of traces
*/
public String readLine() throws IOException;
}
}