package org.vaadin.mideaas.model; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Arrays; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; 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 org.vaadin.mideaas.app.MideaasConfig; import org.vaadin.mideaas.test.Script; import org.vaadin.mideaas.test.ScriptContainer; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.vaadin.mideaas.model.ServerContainer; import org.vaadin.mideaas.model.Server; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XmlTestWriter{ public static synchronized void DOMWriteTestsToXml(String projectName) { try { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); // root elements Document doc = docBuilder.newDocument(); Element rootElement = doc.createElement("project"); rootElement.setAttribute("name", "test"); doc.appendChild(rootElement); // upper level elements: tests and servers Element tests = doc.createElement("tests"); rootElement.appendChild(tests); Element servers = doc.createElement("servers"); rootElement.appendChild(servers); for (Script p : ScriptContainer.getContainer().getItemIds()) { //subelement test Element test = doc.createElement("test"); test.setAttribute("name", p.getName()); Element description = doc.createElement("description"); description.appendChild(doc.createTextNode(p.getDescription())); test.appendChild(description); Element result = doc.createElement("result"); result.appendChild(doc.createTextNode(p.getResult())); test.appendChild(result); Element location = doc.createElement("location"); location.appendChild(doc.createTextNode(p.getLocation())); test.appendChild(location); Element checked = doc.createElement("checked"); checked.appendChild(doc.createTextNode(String.valueOf(p.getCheck()))); test.appendChild(checked); Element notes = doc.createElement("notes"); notes.appendChild(doc.createTextNode(p.getNotes())); test.appendChild(notes); Element testengine = doc.createElement("testengine"); testengine.appendChild(doc.createTextNode(p.getEngine().trim())); test.appendChild(testengine); tests.appendChild(test); } for (Server s : ServerContainer.getServerContainer().getItemIds()) { //subelement test Element server = doc.createElement("server"); server.setAttribute("IP", s.getIP()); for (String eng : s.getEngines()) { Element engine = doc.createElement("engine"); engine.appendChild(doc.createTextNode(eng)); server.appendChild(engine); } Element details = doc.createElement("details"); details.appendChild(doc.createTextNode(s.getDetails().trim())); server.appendChild(details); servers.appendChild(server); } // write the content into xml file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(MideaasConfig.getProjectsDir() + "/" + projectName + "/" + "TestDataStorage.xml")); // Output to console for testing // StreamResult result = new StreamResult(System.out); transformer.transform(source, result); System.out.println("File saved!"); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } public static synchronized void WriteTestsToXml(String projectName) { XmlWriter xml = new XmlWriter(); xml.startWriting(projectName); } public static synchronized String SAXloadTestsFromXml(String projectName) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); DefaultHandler handler = new DefaultHandler() { boolean project = false; boolean tests = false; boolean test = false; boolean testlocation = false; boolean testdescription = false; boolean testresult = false; boolean testcheck = false; boolean testnotes = false; boolean testengine = false; boolean servers = false; boolean server = false; boolean serverengines = false; boolean serverdetails = false; Script scr; Server serv; String notes = ""; String details = ""; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("project")) { project = true; } else if (qName.equalsIgnoreCase("tests")) { tests = true; } else if (qName.equalsIgnoreCase("test")) { scr = new Script(); scr.setName(attributes.getValue("name").trim()); test = true; } else if (qName.equalsIgnoreCase("location")) { testlocation = true; } else if (qName.equalsIgnoreCase("description")) { testdescription = true; } else if (qName.equalsIgnoreCase("result")) { testresult = true; } else if (qName.equalsIgnoreCase("check")) { testcheck = true; } else if (qName.equalsIgnoreCase("notes")) { testnotes = true; } else if (qName.equalsIgnoreCase("testengine")) { testengine = true; } else if (qName.equalsIgnoreCase("servers")) { servers = true; } else if (qName.equalsIgnoreCase("server")) { serv = new Server(); serv.setIP(attributes.getValue("IP").trim()); server = true; } else if (qName.equalsIgnoreCase("engines")) { serverengines = true; } else if (qName.equalsIgnoreCase("details")) { serverdetails = true; } } public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("project")) { project = false; } else if (qName.equalsIgnoreCase("tests")) { tests = false; } else if (qName.equalsIgnoreCase("test")) { scr.setNotes(notes); notes = ""; ScriptContainer.addTestObjectToContainer(scr); test = false; } else if (qName.equalsIgnoreCase("location")) { testlocation = false; } else if (qName.equalsIgnoreCase("description")) { testdescription = false; } else if (qName.equalsIgnoreCase("result")) { testresult = false; } else if (qName.equalsIgnoreCase("check")) { testcheck = false; } else if (qName.equalsIgnoreCase("notes")) { testnotes = false; } else if (qName.equalsIgnoreCase("testengine")) { testengine = false; } else if (qName.equalsIgnoreCase("servers")) { servers = false; } else if (qName.equalsIgnoreCase("server")) { serv.setDetails(details); ServerContainer.addServerObjectToContainer(serv); server = false; } else if (qName.equalsIgnoreCase("engines")) { serverengines = false; } else if (qName.equalsIgnoreCase("details")) { serverdetails = false; } } public void characters(char ch[], int start, int length) throws SAXException { if (testlocation) { scr.setLocation(new String(ch, start, length).trim()); } else if (testdescription) { scr.setDescription(new String(ch, start, length).trim()); } else if (testresult) { scr.setResult(new String(ch, start, length).trim()); } else if (testcheck) { scr.setCheck(Boolean.valueOf(new String(ch, start, length).trim())); } else if (testnotes) { notes = notes + new String(ch, start, length).trim() + "\n"; } else if (testengine) { scr.setEngine(new String(ch, start, length).trim()); } else if (serverengines) { List<String> engines = Arrays.asList(new String(ch, start, length).split(",")); List<String> trimmedEngines = new ArrayList<String>(); for(String engine : engines){ trimmedEngines.add(engine.trim()); } serv.setEngines(trimmedEngines); } else if (serverdetails) { details = details + new String(ch, start, length).trim() + "\n"; } } }; File file = new File(MideaasConfig.getProjectsDir() + "/" + projectName + "/" + "TestDataStorage.xml"); //TODO: needs changeable project name InputStream inputStream= new FileInputStream(file); Reader reader = new InputStreamReader(inputStream,"UTF-8"); InputSource is = new InputSource(reader); is.setEncoding("UTF-8"); saxParser.parse(is, handler); return "ok"; } catch (IOException e) { //e.printStackTrace(); return "Something went wrong while loading file!"; } catch (Exception e) { e.printStackTrace(); return "Something went wrong while reading data!"; } } }