package edu.usc.enl.dynamicmeasurement.algorithms.transform;
import edu.usc.enl.dynamicmeasurement.data.ConfigReader;
import edu.usc.enl.dynamicmeasurement.process.EpochPacket;
import edu.usc.enl.dynamicmeasurement.util.Util;
import org.w3c.dom.Element;
import java.util.HashMap;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 11/11/13
* Time: 10:49 AM <br/>
* A traffic transformer that scales traffic down.
* It regenerates traffic at the end of epoch and ignores traffic from items that have very small traffic
*/
public class ExperimentScale extends TrafficTransformer {
private Map<Long, Double> ipTraffic = new HashMap<>();
private double scaleFactor = -1;
public ExperimentScale(Element element) {
super(element);
Map<String, Element> childrenProperties = Util.getChildrenProperties(element, "Property");
this.scaleFactor = Double.parseDouble(childrenProperties.get("Scale").getAttribute(ConfigReader.PROPERTY_VALUE));
}
@Override
protected void process2(edu.usc.enl.dynamicmeasurement.data.DataPacket p) {
if (match(p)) {
Double aDouble = ipTraffic.get(p.getSrcIP());
if (aDouble == null) {
aDouble = 0d;
}
ipTraffic.put(p.getSrcIP(), aDouble + p.getSize());
} else {
passPacket(p);
}
}
@Override
protected void step(EpochPacket p) {
long time = p.getTime();
for (Map.Entry<Long, Double> entry : ipTraffic.entrySet()) {
edu.usc.enl.dynamicmeasurement.data.DataPacket p2 = new edu.usc.enl.dynamicmeasurement.data.DataPacket(time, 0, 0, 0, 0, 0, 0);
p2.setSrcIP(entry.getKey());
p2.setSize(entry.getValue() / scaleFactor);
if (p2.getSize() > 10) {
passPacket(p2);
}
}
passPacket(p);
}
@Override
protected void reset() {
super.reset();
ipTraffic.clear();
}
}