package Services; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; 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 javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException; import Controllers.Runway; import javax.xml.validation.Validator; public class XMLRunwayService { public void exportRunway(Runway runway, String passedFilename) throws ParserConfigurationException, TransformerException, SAXException, IOException { if (passedFilename.equals("")) { // creates file name that will be used to store exported runways String filename = this.getDatedFileName() + "_runway_exports.xml"; File file = new File(filename); // checks to see if a runway exporting file already exists for today if (file.exists() == true) { DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); // parses the xml document in Document xmlDoc = db.parse(file); // gets the root element in the parsed file Element root = xmlDoc.getDocumentElement(); root.normalize(); // Build XML elements and Text Nodes Element main = xmlDoc.createElement("runway"); Element runName = xmlDoc.createElement("runway_name"); Element runId = xmlDoc.createElement("runway_id"); Element todaLeft = xmlDoc.createElement("toda_from_left"); Element todaRight = xmlDoc.createElement("toda_from_right"); Element tora = xmlDoc.createElement("tora"); Element asdaLeft = xmlDoc.createElement("asda_from_left"); Element asdaRight = xmlDoc.createElement("asda_from_right"); Element ldaLeft = xmlDoc.createElement("lda_from_left"); Element ldaRight = xmlDoc.createElement("lda_from_right"); Element blastDistance = xmlDoc .createElement("take_off_plane_blast_distance"); Text runNameText = xmlDoc .createTextNode(runway.getRunwayName()); Text runIdText = xmlDoc.createTextNode(Integer.toString(runway .getRunwayID())); Text todaLeftText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().toda)); Text todaRightText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromRight().toda)); Text toraText = xmlDoc.createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().tora)); Text asdaLeftText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().asda)); Text asdaRightText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromRight().asda)); Text ldaLeftText = xmlDoc.createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().lda)); Text ldaRightText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromRight().lda)); Text blastDistanceText = xmlDoc.createTextNode(Double .toString(runway.getBlastDistance())); runName.appendChild(runNameText); runId.appendChild(runIdText); todaLeft.appendChild(todaLeftText); todaRight.appendChild(todaRightText); tora.appendChild(toraText); asdaLeft.appendChild(asdaLeftText); asdaRight.appendChild(asdaRightText); ldaLeft.appendChild(ldaLeftText); ldaRight.appendChild(ldaRightText); blastDistance.appendChild(blastDistanceText); main.appendChild(runName); main.appendChild(runId); main.appendChild(todaLeft); main.appendChild(todaRight); main.appendChild(tora); main.appendChild(asdaLeft); main.appendChild(asdaRight); main.appendChild(ldaLeft); main.appendChild(ldaRight); main.appendChild(blastDistance); root.appendChild(main); // used to output the xml structure into a file TransformerFactory transformerfac = TransformerFactory .newInstance(); Transformer transformer = transformerfac.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2"); DOMSource source = new DOMSource(xmlDoc); StreamResult result = new StreamResult(file); transformer.transform(source, result); } else { // else called if the document doesn't already exist // creates a new document DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document xmlDoc = db.newDocument(); // Build XML elements and Text Nodes Element root = xmlDoc.createElement("runways"); Element main = xmlDoc.createElement("runway"); Element runName = xmlDoc.createElement("runway_name"); Element runId = xmlDoc.createElement("runway_id"); Element todaLeft = xmlDoc.createElement("toda_from_left"); Element todaRight = xmlDoc.createElement("toda_from_right"); Element tora = xmlDoc.createElement("tora"); Element asdaLeft = xmlDoc.createElement("asda_from_left"); Element asdaRight = xmlDoc.createElement("asda_from_right"); Element ldaLeft = xmlDoc.createElement("lda_from_left"); Element ldaRight = xmlDoc.createElement("lda_from_right"); Element blastDistance = xmlDoc .createElement("take_off_plane_blast_distance"); Text runNameText = xmlDoc .createTextNode(runway.getRunwayName()); Text runIdText = xmlDoc.createTextNode(Integer.toString(runway .getRunwayID())); Text todaLeftText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().toda)); Text todaRightText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromRight().toda)); Text toraText = xmlDoc.createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().tora)); Text asdaLeftText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().asda)); Text asdaRightText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromRight().asda)); Text ldaLeftText = xmlDoc.createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().lda)); Text ldaRightText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromRight().lda)); Text blastDistanceText = xmlDoc.createTextNode(Double .toString(runway.getBlastDistance())); runName.appendChild(runNameText); runId.appendChild(runIdText); todaLeft.appendChild(todaLeftText); todaRight.appendChild(todaRightText); tora.appendChild(toraText); asdaLeft.appendChild(asdaLeftText); asdaRight.appendChild(asdaRightText); ldaLeft.appendChild(ldaLeftText); ldaRight.appendChild(ldaRightText); blastDistance.appendChild(blastDistanceText); main.appendChild(runName); main.appendChild(runId); main.appendChild(todaLeft); main.appendChild(todaRight); main.appendChild(tora); main.appendChild(asdaLeft); main.appendChild(asdaRight); main.appendChild(ldaLeft); main.appendChild(ldaRight); main.appendChild(blastDistance); root.appendChild(main); xmlDoc.appendChild(root); // used to output the xml structure into a file TransformerFactory transformerfac = TransformerFactory .newInstance(); Transformer transformer = transformerfac.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2"); DOMSource source = new DOMSource(xmlDoc); StreamResult result = new StreamResult(file); transformer.transform(source, result); } } else { // append the new runway to the passedFilename File file = new File(passedFilename); if (file.exists() == true) { DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); // parses the xml document in Document xmlDoc = db.parse(file); // gets the root element in the parsed file Element root = xmlDoc.getDocumentElement(); root.normalize(); // Build XML elements and Text Nodes Element main = xmlDoc.createElement("runway"); Element runName = xmlDoc.createElement("runway_name"); Element runId = xmlDoc.createElement("runway_id"); Element todaLeft = xmlDoc.createElement("toda_from_left"); Element todaRight = xmlDoc.createElement("toda_from_right"); Element tora = xmlDoc.createElement("tora"); Element asdaLeft = xmlDoc.createElement("asda_from_left"); Element asdaRight = xmlDoc.createElement("asda_from_right"); Element ldaLeft = xmlDoc.createElement("lda_from_left"); Element ldaRight = xmlDoc.createElement("lda_from_right"); Element blastDistance = xmlDoc .createElement("take_off_plane_blast_distance"); Text runNameText = xmlDoc .createTextNode(runway.getRunwayName()); Text runIdText = xmlDoc.createTextNode(Integer.toString(runway .getRunwayID())); Text todaLeftText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().toda)); Text todaRightText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromRight().toda)); Text toraText = xmlDoc.createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().tora)); Text asdaLeftText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().asda)); Text asdaRightText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromRight().asda)); Text ldaLeftText = xmlDoc.createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromLeft().lda)); Text ldaRightText = xmlDoc .createTextNode(Double.toString(runway .getOriginalLogicalRunwayFromRight().lda)); Text blastDistanceText = xmlDoc.createTextNode(Double .toString(runway.getBlastDistance())); runName.appendChild(runNameText); runId.appendChild(runIdText); todaLeft.appendChild(todaLeftText); todaRight.appendChild(todaRightText); tora.appendChild(toraText); asdaLeft.appendChild(asdaLeftText); asdaRight.appendChild(asdaRightText); ldaLeft.appendChild(ldaLeftText); ldaRight.appendChild(ldaRightText); blastDistance.appendChild(blastDistanceText); main.appendChild(runName); main.appendChild(runId); main.appendChild(todaLeft); main.appendChild(todaRight); main.appendChild(tora); main.appendChild(asdaLeft); main.appendChild(asdaRight); main.appendChild(ldaLeft); main.appendChild(ldaRight); main.appendChild(blastDistance); root.appendChild(main); // used to output the xml structure into a file TransformerFactory transformerfac = TransformerFactory .newInstance(); Transformer transformer = transformerfac.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2"); DOMSource source = new DOMSource(xmlDoc); StreamResult result = new StreamResult(file); transformer.transform(source, result); } } } /* returns todays date in string form - used for date-specific import/export files*/ public String getDatedFileName() { // gets date in correct format SimpleDateFormat sdfdate = new SimpleDateFormat("dd-MM-yyyy"); Date date = new Date(); String today = sdfdate.format(date); return today; } // Imports runways from a given file public ArrayList<Runway> importRunways(String filename) throws ParserConfigurationException, SAXException, IOException { // validate the file being imported from // parse an XML document into a DOM tree DocumentBuilder parser = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document document = parser.parse(new File(filename)); // create a SchemaFactory capable of understanding WXS schemas SchemaFactory factory = SchemaFactory .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // load a WXS schema, represented by a Schema instance StreamSource schemaFile = new StreamSource(new File("runway_XSD.xsd")); Schema schema = factory.newSchema(schemaFile); // create a Validator instance, which can be used to validate an // instance document Validator validator = (Validator) schema.newValidator(); // validate the DOM tree validator.validate(new DOMSource(document)); // ArrayLists used in method ArrayList<Runway> runways = new ArrayList<Runway>(); ArrayList<String> parseRunNames = new ArrayList<String>(); ArrayList<String> parseRunIDs = new ArrayList<String>(); ArrayList<String> parseTodaLeft = new ArrayList<String>(); ArrayList<String> parseTodaRight = new ArrayList<String>(); ArrayList<String> parseTora = new ArrayList<String>(); ArrayList<String> parseAsdaLeft = new ArrayList<String>(); ArrayList<String> parseAsdaRight = new ArrayList<String>(); ArrayList<String> parseLdaLeft = new ArrayList<String>(); ArrayList<String> parseLdaRight = new ArrayList<String>(); ArrayList<String> parseBlastDistance = new ArrayList<String>(); // Parsing XML file in File file = new File(filename); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(file); doc.getDocumentElement().normalize(); // creating nodes for each obstacle NodeList nodeList = doc.getElementsByTagName("runway"); // adds each nodes value to an array which is used to populate the // RunwayArea ArrayList later on for (int j = 0; j < nodeList.getLength(); j++) { Node node = nodeList.item(j); if (node.getNodeType() == Node.ELEMENT_NODE) { Element elem = (Element) node; // getting name of runway NodeList nameElementList = elem .getElementsByTagName("runway_name"); Element nameElement = (Element) nameElementList.item(0); NodeList name = nameElement.getChildNodes(); parseRunNames.add(((Node) name.item(0)).getNodeValue()); // getting ID of runway NodeList idElementList = elem.getElementsByTagName("runway_id"); Element idElement = (Element) idElementList.item(0); NodeList id = idElement.getChildNodes(); parseRunIDs.add(((Node) id.item(0)).getNodeValue()); // getting runway left toda NodeList todaLeftElementList = elem .getElementsByTagName("toda_from_left"); Element todaLeftElement = (Element) todaLeftElementList.item(0); NodeList todaLeft = todaLeftElement.getChildNodes(); parseTodaLeft.add(((Node) todaLeft.item(0)).getNodeValue()); // getting runway right toda NodeList todaRightElementList = elem .getElementsByTagName("toda_from_right"); Element todaRightElement = (Element) todaRightElementList .item(0); NodeList todaRight = todaRightElement.getChildNodes(); parseTodaRight.add(((Node) todaRight.item(0)).getNodeValue()); // getting runway tora NodeList toraElementList = elem.getElementsByTagName("tora"); Element toraElement = (Element) toraElementList.item(0); NodeList tora = toraElement.getChildNodes(); parseTora.add(((Node) tora.item(0)).getNodeValue()); // getting runway left asda NodeList asdaLeftElementList = elem .getElementsByTagName("asda_from_left"); Element asdaLeftElement = (Element) asdaLeftElementList.item(0); NodeList asdaLeft = asdaLeftElement.getChildNodes(); parseAsdaLeft.add(((Node) asdaLeft.item(0)).getNodeValue()); // getting runway right asda NodeList asdaRightElementList = elem .getElementsByTagName("asda_from_right"); Element asdaRightElement = (Element) asdaRightElementList .item(0); NodeList asdaRight = asdaRightElement.getChildNodes(); parseAsdaRight.add(((Node) asdaRight.item(0)).getNodeValue()); // getting runway left lda NodeList ldaLeftElementList = elem .getElementsByTagName("lda_from_left"); Element ldaLeftElement = (Element) ldaLeftElementList.item(0); NodeList ldaLeft = ldaLeftElement.getChildNodes(); parseLdaLeft.add(((Node) ldaLeft.item(0)).getNodeValue()); // getting runway right lda NodeList ldaRightElementList = elem .getElementsByTagName("lda_from_right"); Element ldaRightElement = (Element) ldaRightElementList.item(0); NodeList ldaRight = ldaRightElement.getChildNodes(); parseLdaRight.add(((Node) ldaRight.item(0)).getNodeValue()); // getting plane blast distance NodeList blastDistanceElementList = elem .getElementsByTagName("take_off_plane_blast_distance"); Element blastDistanceElement = (Element) blastDistanceElementList .item(0); NodeList blastDistance = blastDistanceElement.getChildNodes(); parseBlastDistance.add(((Node) blastDistance.item(0)) .getNodeValue()); } } // creates RunwayArea objects based on the information that was read // from the file for (int i = 0; i < nodeList.getLength(); i++) { String runName = parseRunNames.get(i); int runId = Integer.parseInt(parseRunIDs.get(i)); Double todaLeft = Double.parseDouble(parseTodaLeft.get(i)); Double todaRight = Double.parseDouble(parseTodaRight.get(i)); Double tora = Double.parseDouble(parseTora.get(i)); Double asdaLeft = Double.parseDouble(parseAsdaLeft.get(i)); Double asdaRight = Double.parseDouble(parseAsdaRight.get(i)); Double ldaLeft = Double.parseDouble(parseLdaLeft.get(i)); Double ldaRight = Double.parseDouble(parseLdaRight.get(i)); Double blastDistance = Double .parseDouble(parseBlastDistance.get(i)); runways.add(new Runway(runName, runId, todaLeft, todaRight, tora, asdaLeft, asdaRight, ldaLeft, ldaRight, blastDistance)); } return runways; } }