package edu.usc.enl.dynamicmeasurement.data;
import edu.usc.enl.dynamicmeasurement.algorithms.taskhandler.TaskHandler;
import edu.usc.enl.dynamicmeasurement.model.Network;
import edu.usc.enl.dynamicmeasurement.model.event.Event;
import edu.usc.enl.dynamicmeasurement.util.SimulationConfiguration;
import edu.usc.enl.dynamicmeasurement.util.Util;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedList;
/**
* Created with IntelliJ IDEA.
* User: masoud
* Date: 9/1/13
* Time: 9:49 PM <br/>
* The utility class that parses a configuration file.
*/
public class ConfigReader {
public static final String PROPERTY_VALUE = "value";
public static final String PROPERTY_NAME = "name";
private LinkedList<Event> events;
private TaskHandler handler;
public static void writeElement(Element e, String fileName) throws ParserConfigurationException, TransformerException {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Node node = doc.importNode(e, true);
doc.appendChild(node);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(fileName));
// Output to console for testing
// StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
}
public static Element readElement(String filename) throws IOException, SAXException, ParserConfigurationException {
File file = new File(filename);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(file);
Element rootElement = doc.getDocumentElement();
rootElement.normalize();
return rootElement;
}
public void read(String filename) throws Exception {
File file = new File(filename);
Element rootElement = loadFile(file);
{
SimulationConfiguration simulationConfiguration = new SimulationConfiguration(rootElement);
Util.setSimulationConfiguration(simulationConfiguration);
String output = simulationConfiguration.get("Output");
if (output != null) {
Util.setRootFolder(output);
} else {
Util.setRootFolder(file.getParent());//same folder as file
//Util.setRootFolder(file.getAbsolutePath().replaceAll("\\.[^\\.]*$", ""));//same folder name as file
}
//copy the config file to output
String outputFileName = Util.getRootFolder() + "/config.xml";
if (!new File(outputFileName).getAbsoluteFile().getAbsolutePath().equals(file.getAbsoluteFile().getAbsolutePath())) {
try (BufferedReader br = new BufferedReader(new FileReader(file)); PrintWriter pw = new PrintWriter(outputFileName)) {
while (br.ready()) {
pw.println(br.readLine());
}
}
}
}
{
Element network1 = Util.getChildrenProperties2(rootElement, "Network").get(0);
Network network;
if (network1.hasAttribute("path")) {
String path = network1.getAttribute("path");
Element rootElement2 = loadFile(new File(file.getParentFile().getAbsolutePath() + "/" + path));
network = new Network(rootElement2);
} else {
network = new Network(network1);
}
Util.setNetwork(network);
}
{
//initialize script
NodeList handlerNode = rootElement.getElementsByTagName("TaskHandler");
Node item = handlerNode.item(0);
Element element = (Element) item;
handler = (TaskHandler) Class.forName(element.getAttribute("class")).getConstructor(Element.class).newInstance(element);
}
events = new LinkedList<>();
{
{//Import
NodeList eventsNode = rootElement.getElementsByTagName("ImportEvents");
for (int i = 0; i < eventsNode.getLength(); i++) {
Element element = (Element) eventsNode.item(i);
String path = element.getAttribute("path");
Element rootElement2 = loadFile(new File(file.getParentFile().getAbsolutePath() + "/" + path));
loadEvents(events, rootElement2);
}
}
loadEvents(events, rootElement);
}
}
public static void loadEvents(LinkedList<Event> events, Element rootElement) throws InstantiationException,
IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException {
//initialize events
NodeList eventsNode = rootElement.getElementsByTagName("Event");
for (int i = 0; i < eventsNode.getLength(); i++) {
Element element = (Element) eventsNode.item(i);
Event event = (Event) Class.forName(element.getAttribute("class")).getConstructor(Element.class).newInstance(element);
events.add(event);
}
}
public static Element loadFile(File file) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(file);
Element rootElement = doc.getDocumentElement();
rootElement.normalize();
return rootElement;
}
public LinkedList<Event> getEvents() {
return events;
}
public TaskHandler getTaskHandler() {
return handler;
}
}