package edu.usc.enl.dynamicmeasurement.algorithms.tasks.taskthread;
import edu.usc.enl.dynamicmeasurement.algorithms.tasks.Task2;
import edu.usc.enl.dynamicmeasurement.algorithms.transform.TrafficTransformer;
import edu.usc.enl.dynamicmeasurement.algorithms.transform.TransformHandler;
import edu.usc.enl.dynamicmeasurement.data.DataPacket;
import edu.usc.enl.dynamicmeasurement.data.FinishPacket;
import edu.usc.enl.dynamicmeasurement.data.trace.TaskTraceReaderInterface;
import edu.usc.enl.dynamicmeasurement.model.Packet;
import edu.usc.enl.dynamicmeasurement.process.EpochPacket;
import edu.usc.enl.dynamicmeasurement.process.PacketUser;
import edu.usc.enl.dynamicmeasurement.util.Util;
import java.io.IOException;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 9/23/13
* Time: 6:41 PM <br/>
* This is the actual method that loads traffic and matches against packet users of a task in the simulation
*/
public class LoadTrafficTaskMethod implements Runnable {
private Task2 task;
private EpochPacket stepPacket;
private TransformHandler transformHandler;
private DataPacket p = null;
public LoadTrafficTaskMethod(Task2 task) {
this.task = task;
transformHandler = new TransformHandler(new TransformPacketUser());
}
public void setEpoch(EpochPacket p) {
this.stepPacket = p;
}
@Override
public void run() {
int epochSize = (int) Util.getSimulationConfiguration().getEpoch();
try {
int num = 0;
while (true) {
//load task traffic from
TaskTraceReaderInterface traceReader = task.getTraceReader();
p = traceReader.getNextPacket(p);
if (p != null) {
if (p.getTime() < stepPacket.getTime() + epochSize) {//load traffic until the next epoch
transformHandler.process(p);
num++;
} else {
traceReader.keepForNext(p);
break;
}
} else {
break;
}
}
transformHandler.process(stepPacket);
} catch (DataPacket.PacketParseException | IOException e) {
e.printStackTrace();
}
}
public void addTransform(TrafficTransformer transformer) {
transformHandler.addTransform(transformer);
}
public void removeTransform(String name) {
transformHandler.removeTransform(name);
}
class TransformPacketUser extends PacketUser {
@Override
public void process(Packet p) {
if (p instanceof DataPacket) {
task.process((DataPacket) p);
}//in case of epoch the task handler must run its step
}
@Override
public void finish(FinishPacket p) {
task.finish(p);
}
}
}