package benchmark; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Vector; import process_handlers.ClientHandler; import process_handlers.ReplicaHandler; import commands.*; public class TestLoader { private FileReader testReader; private Scheduler scheduler; private List<ClientHandler> clients; private Map<Integer, ReplicaHandler> replicas; private ProcessListener listener; private static String modelnetFile = null; private static String replicaCmd = null; private static String clientCmd = null; public static String getModelnetFile() { return modelnetFile; } public static String getReplicaCmd() { return replicaCmd; } public static String getClientCmd() { return clientCmd; } String line = null; private final MyLogger logger; public TestLoader(FileReader testReader, Scheduler scheduler, List<ClientHandler> clients, Map<Integer, ReplicaHandler> replicas, ProcessListener listener2, MyLogger logger) { this.listener = listener2; this.testReader = testReader; this.clients = clients; this.replicas = replicas; this.scheduler = scheduler; this.logger = logger; } class MyBufferedReader extends BufferedReader { public MyBufferedReader(Reader in) { super(in); } @Override public String readLine() throws IOException { String s; do { s = super.readLine(); if (s == null) return null; s = simplifyWhitespaces(s); } while (s.matches("^//.*") || s.matches("^#.*") || s.isEmpty()); return s; } private String simplifyWhitespaces(String s) { return s.replaceFirst("^[ \t][ \t]*", "").replaceFirst("[ \t][ \t]*$", "").replaceAll("[ \t][ \t]*", " "); } } public void parse() { MyBufferedReader testBufferedReader = new MyBufferedReader(testReader); // Config file: // 1) modelnet file // 2) replica command // 3) client command // Variable settings: // A) Client: // MODEL VNODE COUNT DELAY RANDOM // B) Replica: // MODEL VNODE NUM try { modelnetFile = testBufferedReader.readLine(); replicaCmd = testBufferedReader.readLine(); clientCmd = testBufferedReader.readLine(); } catch (IOException e) { e.printStackTrace(); System.exit(1); } while (true) { try { line = testBufferedReader.readLine(); } catch (IOException e) { e.printStackTrace(); System.exit(1); } if (line == null) break; String line = this.line.toUpperCase(); LinkedList<String> tokens = new LinkedList<String>(); tokens.addAll(Arrays.asList(line.split("[\t ]"))); String time = tokens.removeFirst(); try { scheduler.addTask(time, readCommand(tokens)); } catch (IllegalArgumentException e) { e.printStackTrace(); System.exit(1); } } } private static List<String> noEventNames = new Vector<String>(); { noEventNames.add("NONE"); noEventNames.add("OFF"); noEventNames.add("NO"); noEventNames.add("FALSE"); } private Command readCommand(LinkedList<String> tokens) { String type = tokens.removeFirst().toUpperCase(); String eventName = tokens.removeLast().toUpperCase(); if (eventName.contains(",")) { System.err.println("Event name cannot have a ',' character"); System.exit(1); } if (noEventNames.contains(eventName)) eventName = null; if (type.equals("CLIENT")) { return new ClientCommand(clients, tokens, eventName, listener, logger); } else if (type.equals("REPLICA")) { return new ReplicaCommand(replicas, tokens, eventName, listener, logger); } System.err.print("Wrong command type: " + type + " May be either Replica, or Client:\n" + line); System.exit(1); return null; } }