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.*; /** * Created with IntelliJ IDEA. * User: masoud * Date: 7/26/13 * Time: 5:04 PM */ public class RandomMappingPacketUser extends TrafficTransformer { private final Map<Long, Double> ipTraffic = new HashMap<>(); private final Map<Long, Long> ipMapping = new HashMap<>(); private double changeFraction; private int changeStepNum; private Random random; public RandomMappingPacketUser(Element e) { super(e); Map<String, Element> childrenProperties = Util.getChildrenProperties(e, "Property"); this.random = new Random(Long.parseLong(childrenProperties.get("Random").getAttribute(ConfigReader.PROPERTY_VALUE))); this.changeFraction = Double.parseDouble(childrenProperties.get("ChangeFraction").getAttribute(ConfigReader.PROPERTY_VALUE)); this.changeStepNum = Integer.parseInt(childrenProperties.get("ChangeStepNum").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(); int step = p.getStep(); if (step > 0 && step % changeStepNum == 0) { remap(); } for (Map.Entry<Long, Double> entry : ipTraffic.entrySet()) { Long srcIP = entry.getKey(); Long newSrcIP = ipMapping.get(srcIP); if (newSrcIP == null) { newSrcIP = srcIP; ipMapping.put(srcIP, newSrcIP); } edu.usc.enl.dynamicmeasurement.data.DataPacket p2 = new edu.usc.enl.dynamicmeasurement.data.DataPacket(time, 0, 0, 0, 0, 0, 0); p2.setSrcIP(newSrcIP); p2.setSize(entry.getValue()); passPacket(p2); } passPacket(p); } private void remap() { List<Long> IPs = new ArrayList<>(ipMapping.keySet()); Collections.shuffle(IPs, random); double toChangeNum = ipMapping.size() * changeFraction; for (int i = 0; i < toChangeNum; i++) { Long first = IPs.get(i++); Long second = IPs.get(i); Long firstValue = ipMapping.get(first); ipMapping.put(first, ipMapping.get(second)); ipMapping.put(second, firstValue); } } @Override protected void reset() { super.reset(); ipTraffic.clear(); } }