package edu.usc.enl.dynamicmeasurement.data.trace; import edu.usc.enl.dynamicmeasurement.data.CachedMultiFileTraceReader; import edu.usc.enl.dynamicmeasurement.data.DataPacket; import edu.usc.enl.dynamicmeasurement.data.MultiFileTraceReader; import edu.usc.enl.dynamicmeasurement.data.PacketLoader; import edu.usc.enl.dynamicmeasurement.model.WildcardPattern; import edu.usc.enl.dynamicmeasurement.util.Util; import java.io.IOException; import java.util.StringTokenizer; /** * Created with IntelliJ IDEA. * User: masoud * Date: 9/23/13 * Time: 2:20 PM <br/> * This is the utility class that reads the trace associated with prefix of a task from a trace that covers that prefix */ public class TaskTraceReader implements TaskTraceReaderInterface { private final long epochSize; /** * The start time of the task (This will be added to the data packets timestamps) */ private final long taskStart; /** * The prefix filter for the task */ private final WildcardPattern filter; /** * The prefix filter for the trace */ private final WildcardPattern tracePattern; /** * The data that must be added to the key of data packets to make sure that they match the trace pattern */ private final long tracePatternShift; /** * The start of simulation time (this should be useless. just 0 should work) */ private final long simulationStartTime; private PacketLoader.TraceReader br; /** * keeps track of a data packets came at the end of last epoch that should have been processed in the next epoch */ private DataPacket keepDataForNext = null; private int traceCurrentTime = -1; private long lastPacketTime = -1; public TaskTraceReader(long taskStart, WildcardPattern filter, String[] files, WildcardPattern tracePattern, boolean cached) throws IOException { this.taskStart = taskStart; this.filter = filter; this.tracePattern = tracePattern; if (cached) { br = new CachedMultiFileTraceReader(new MultiFileTraceReader(files)); } else { br = new MultiFileTraceReader(files); } epochSize = Util.getSimulationConfiguration().getEpoch(); tracePatternShift = tracePattern.getData() << tracePattern.getWildcardNum(); simulationStartTime = Util.getSimulationConfiguration().getStartTime(); } /** * reset a trace file to read it from the beginning! */ public void reset() { if (br instanceof CachedMultiFileTraceReader) { ((CachedMultiFileTraceReader) br).reset(); } else { try { br.close(); br = new MultiFileTraceReader(((MultiFileTraceReader) br).getFiles()); } catch (IOException e) { e.printStackTrace(); } } keepDataForNext = null; traceCurrentTime = -1; lastPacketTime = -1; } public DataPacket getNextPacket(DataPacket p) throws DataPacket.PacketParseException, IOException { while (true) { if (keepDataForNext != null) { DataPacket temp = keepDataForNext; keepDataForNext = null; return temp; } String line = br.readLine(); if (line == null) { return null; } StringTokenizer st = new StringTokenizer(line, ","); long time = Long.parseLong(st.nextToken()); if (lastPacketTime != time) { if (time > lastPacketTime && time - lastPacketTime < 300) { //check if it is in this set of traces traceCurrentTime += time - lastPacketTime; } else { traceCurrentTime++; } lastPacketTime = time; } long srcIP = Long.parseLong(st.nextToken()); srcIP = (srcIP >> (WildcardPattern.TOTAL_LENGTH - tracePattern.getWildcardNum())) + tracePatternShift; if (filter.match(srcIP)) { if (p == null) { p = new DataPacket(new StringTokenizer(line, ",")); } else { p.fill(new StringTokenizer(line, ",")); } p.setSrcIP(srcIP); // if (filter.toStringNoWeight().equals("01001100010_____________________")) { // System.out.println(traceCurrentTime + " " + p.getSize()); // } p.setTime(taskStart * epochSize + traceCurrentTime + simulationStartTime); return p; } } } public void finish() { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } public void keepForNext(DataPacket p) { keepDataForNext = p; } }