package edu.usc.enl.dynamicmeasurement.data.scenario.traffic;
import edu.usc.enl.dynamicmeasurement.model.WildcardPattern;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 10/27/13
* Time: 9:31 PM
*/
public class TrafficGenerator {
//output timestep pattern,size,starttime,finishtime pattern,size,starttime,finishtime pattern,size,starttime,finishtime
public static void main(String[] args) throws FileNotFoundException {
List<TrafficFlow> flows = new ArrayList<>();
String output = args[0];
long step = Long.parseLong(args[1]);
long minTime = Long.MAX_VALUE;
long maxTime = -1;
for (int i = 2; i < args.length; i++) {
String arg = args[i];
String[] split = arg.split(",");
long start = Long.parseLong(split[2]);
long finish = Long.parseLong(split[3]);
flows.add(new TrafficFlow(new WildcardPattern(split[0], 0), Integer.parseInt(split[1]), finish, start));
minTime = Math.min(minTime, start);
maxTime = Math.max(maxTime, finish);
}
TrafficGenerator trafficGenerator = new TrafficGenerator();
try (PrintWriter pw = new PrintWriter(output)) {
for (long time = minTime; time < maxTime; time += step) {
trafficGenerator.writeFlows(time, flows, pw);
}
}
}
public void writeFlows(long time, List<TrafficFlow> flows, PrintWriter pw) {
for (Iterator<TrafficFlow> iterator = flows.iterator(); iterator.hasNext(); ) {
TrafficFlow flow = iterator.next();
if (flow.getFinish() <= time) {
iterator.remove();
continue;
}
if (flow.getStart() <= time) {
flow.print(pw, time);
}
}
}
private static class TrafficFlow {
private final WildcardPattern pattern;
private final int eachIPSize;
private final long finish;
private final long start;
private TrafficFlow(WildcardPattern pattern, int eachIPSize, long finish, long start) {
this.pattern = pattern;
this.eachIPSize = eachIPSize;
this.finish = finish;
this.start = start;
}
private WildcardPattern getPattern() {
return pattern;
}
private int getEachIPSize() {
return eachIPSize;
}
private long getFinish() {
return finish;
}
private long getStart() {
return start;
}
public void print(PrintWriter pw, long time) {
long num = 1l << pattern.getWildcardNum();
long start = pattern.getData() << pattern.getWildcardNum();
for (long i = 0; i < num; i++) {
pw.println(time + "," + (start + i) + ",0,0,0,0," + eachIPSize);
}
}
}
}