package edu.usc.enl.dynamicmeasurement.algorithms.transform;
import edu.usc.enl.dynamicmeasurement.process.EpochPacket;
import edu.usc.enl.dynamicmeasurement.process.PacketUser;
import java.util.Iterator;
import java.util.LinkedList;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 9/2/13
* Time: 2:33 PM <br/>
* A simple traffic transformer handler.
* Inside it has a pipe of transformers.
* Once the pipe finishes processing the packet it passes it to the next user.
* The order of transformers in the pipe is FIFO
*/
public class TransformHandler extends PacketPipe implements TransformHandlerInterface {
private LinkedList<TrafficTransformer> transforms;
public TransformHandler(PacketUser nextUser) {
super(nextUser);
transforms = new LinkedList<>();
}
@Override
protected void process2(edu.usc.enl.dynamicmeasurement.data.DataPacket p) {
if (transforms.size() == 0 || transforms.getLast().sent(p)) {
passPacket(p);
} else {
transforms.getFirst().process(p);
}
}
@Override
protected void step(EpochPacket p) {
if (transforms.size() == 0 || transforms.getLast().sent(p)) {
passPacket(p);
} else {
transforms.getFirst().process(p);
}
}
public void addTransform(TrafficTransformer t) {
if (transforms.size() > 0) {
transforms.getLast().setNextUser(t);
}
transforms.add(t);
t.setNextUser(this);
}
public void removeTransform(String transformName) {
TrafficTransformer last = null;
for (Iterator<TrafficTransformer> iterator = transforms.iterator(); iterator.hasNext(); ) {
TrafficTransformer transform = iterator.next();
if (transform.getName2().equals(transformName)) {
iterator.remove();
if (last != null) {
last.setNextUser(iterator.hasNext() ? iterator.next() : this);
}
return;
}
last = transform;
}
// System.err.println("Transform " + transformName + " not found");
}
}