package edu.usc.enl.dynamicmeasurement.data.trace;
import edu.usc.enl.dynamicmeasurement.data.ConfigReader;
import edu.usc.enl.dynamicmeasurement.model.WildcardPattern;
import edu.usc.enl.dynamicmeasurement.util.NumberAwareComparator;
import edu.usc.enl.dynamicmeasurement.util.Util;
import org.w3c.dom.Element;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 9/22/13
* Time: 8:39 PM <br/>
* Represents the information for a packet trace file. This may cover multiple tasks.
* <p>The XML constructor requires the following Property children tags: <ul>
* <li> name attribute as "Filter", value attribute as a prefix pattern</li>
* <li> name attribute as "Folder0", the first folder of traces</li>
* <li> name attribute as "Folder1", the second folder of traces</li>
* </ul>
* If the trace just has one folder of traces it can have a property named "Folder"</p>
*/
public class InputTrace {
private String[] packetsFile;
private WildcardPattern wildcardPattern;
public InputTrace(Element e) {
Map<String, Element> childrenProperties = Util.getChildrenProperties(e, "Property");
wildcardPattern = new WildcardPattern(childrenProperties.get("Filter").getAttribute(ConfigReader.PROPERTY_VALUE), 0);
String[] folders = new String[childrenProperties.size()];
for (Map.Entry<String, Element> entry : childrenProperties.entrySet()) {
String folder = entry.getValue().getAttribute(ConfigReader.PROPERTY_VALUE);
if (entry.getKey().matches("Folder\\d+")) {
folders[Integer.parseInt(entry.getKey().replaceAll("Folder", ""))] = folder;
} else if (entry.getKey().equals("Folder")) {
folders[0] = folder;
}
}
try {
List<File> files2 = new ArrayList<>();
for (String folder : folders) {
if (folder != null) {
File folderFile = new File(folder);
File[] files = folderFile.listFiles();
if (files == null) {
throw new Exception("Folder " + folder + " not found");
}
Arrays.sort(files, new NumberAwareComparator());
files2.addAll(Arrays.asList(files));
}
for (Iterator<File> iterator = files2.iterator(); iterator.hasNext(); ) {
File next = iterator.next();
if (next.getName().contains("summary")) {
iterator.remove();
}
}
}
packetsFile = new String[files2.size()];
int i = 0;
for (File file : files2) {
packetsFile[i++] = file.getAbsolutePath();
}
} catch (Exception e1) {
System.err.println(e1.getMessage());
System.exit(1);
}
}
public WildcardPattern getWildcardPattern() {
return wildcardPattern;
}
public TaskTraceReader getTaskTraceReader(WildcardPattern wildcardPattern, int taskStart, boolean cache) throws IOException {
return new TaskTraceReader(taskStart, wildcardPattern, packetsFile, this.wildcardPattern, cache);
}
}