package edu.usc.enl.dynamicmeasurement.data.trace; import edu.usc.enl.dynamicmeasurement.algorithms.tasks.Task2; import edu.usc.enl.dynamicmeasurement.algorithms.tasks.TaskUser; import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.multiswitch.separateallocation.MultiSwitchTask; import edu.usc.enl.dynamicmeasurement.algorithms.tasks.multitask.singleswitch.SingleSwitchTask; import edu.usc.enl.dynamicmeasurement.data.DataPacket; import edu.usc.enl.dynamicmeasurement.data.FinishPacket; import edu.usc.enl.dynamicmeasurement.model.monitorpoint.MonitorPoint; import edu.usc.enl.dynamicmeasurement.util.Util; import org.w3c.dom.Element; import java.io.*; import java.util.HashMap; import java.util.Map; /** * Created with IntelliJ IDEA. * User: masoud * Date: 11/2/13 * Time: 9:19 AM <br/> * This is a special task that appends whatever packets it sees into a new trace per switch. * Now we will have traces per switch. * This is used for preparing the trace for experiments on the prototype */ public class PrintTaskUser extends TaskUser { private static Map<MonitorPoint, PrintWriter> monitorPointWriters = new HashMap<>(); private static int tasksNum = 0; private final DummyImplementation taskImplementation; private Map<Long, Integer> ipSize = new HashMap<>(); private int taskNumber = 0; public PrintTaskUser(Element element) { super(element); taskImplementation = new DummyImplementation(); tasksNum++; taskNumber = tasksNum; } /** * set the folder of traces to be written into * * @param folder */ @Override public void setFolder(String folder) { if (monitorPointWriters.size() == 0) { String traceFolder = new File(folder).getAbsoluteFile().getParentFile().getAbsolutePath() + "/trace/"; new File(traceFolder).mkdirs(); try { for (MonitorPoint monitorPoint : Util.getNetwork().getMonitorPoints()) { monitorPointWriters.put(monitorPoint, new PrintWriter(new BufferedWriter(new FileWriter(traceFolder + monitorPoint.getIntId() + ".txt", true)))); } } catch (IOException e) { e.printStackTrace(); } } } @Override public Task2.TaskImplementation getImplementation() { return taskImplementation; } @Override public void report(int step) { // System.out.println("Print: " + taskNumber + "," + step + "," + ipSize.size()); for (Map.Entry<Long, Integer> ipSizeEntry : ipSize.entrySet()) { for (Map.Entry<MonitorPoint, PrintWriter> monitorPointWriterEntry : monitorPointWriters.entrySet()) { Long ip = ipSizeEntry.getKey(); if (monitorPointWriterEntry.getKey().hasDataFrom(ip)) { PrintWriter writer = monitorPointWriterEntry.getValue(); synchronized (writer) { writer.println(step + "," + ip + "," + ipSizeEntry.getValue()); } break; } } } ipSize.clear(); } @Override public void update(int step) { } @Override public void process2(DataPacket p) { Integer size = ipSize.get(p.getSrcIP()); if (size == null) { size = 0; } ipSize.put(p.getSrcIP(), (int) (size + p.getSize())); } @Override public void finish(FinishPacket p) { tasksNum--; if (tasksNum == 0) { for (PrintWriter printWriter : monitorPointWriters.values()) { printWriter.close(); } monitorPointWriters.clear(); } else { for (PrintWriter printWriter : monitorPointWriters.values()) { printWriter.flush(); } } } private static class DummyImplementation implements MultiSwitchTask.MultiSwitchTaskImplementation, SingleSwitchTask.SingleSwitchTaskImplementation { @Override public void setCapacityShare(Map<MonitorPoint, Integer> resource) { } @Override public void estimateAccuracy(Map<MonitorPoint, Double> accuracy) { for (Map.Entry<MonitorPoint, Double> entry : accuracy.entrySet()) { entry.setValue(1d); } } @Override public double getGlobalAccuracy() { return 1; } @Override public void getUsedResources(Map<MonitorPoint, Integer> resource) { for (Map.Entry<MonitorPoint, Integer> entry : resource.entrySet()) { entry.setValue(0); } } @Override public void setCapacityShare(int resource) { } @Override public double estimateAccuracy() { return 1; } @Override public int getUsedResourceShare() { return 0; } } }