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; import java.util.Random; /** * Created with IntelliJ IDEA. * User: masoud * Date: 7/27/13 * Time: 5:23 PM <br/> * */ public class RandomAdditionPacketUser extends TrafficTransformer { private final Map<Long, Double> ipTraffic = new HashMap<>(); private double changeFraction; private Random random; public RandomAdditionPacketUser(Element element) { super(element); Map<String, Element> childrenProperties = Util.getChildrenProperties(element, "Property"); this.changeFraction = Double.parseDouble(childrenProperties.get("ChangeFraction").getAttribute(ConfigReader.PROPERTY_VALUE)); this.random = new Random(Long.parseLong(childrenProperties.get("Random").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(); double sum = 0; for (Double traffic : ipTraffic.values()) { sum += traffic; } double toChangeMax = sum / ipTraffic.size() * changeFraction * 2; double sum2 = 0; for (Map.Entry<Long, Double> entry : ipTraffic.entrySet()) { Long srcIP = entry.getKey(); edu.usc.enl.dynamicmeasurement.data.DataPacket p2 = new edu.usc.enl.dynamicmeasurement.data.DataPacket(time, 0, 0, 0, 0, 0, 0); p2.setSrcIP(srcIP); double size = entry.getValue() * (1 - changeFraction) + random.nextDouble() * toChangeMax; p2.setSize(size); sum2 += size; passPacket(p2); } passPacket(p); } @Override protected void reset() { super.reset(); ipTraffic.clear(); } }