mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
XML data types are done. Easily navigated for future use. Some documentation has been done, tests aren't yet completed just yet.
#story[820]
This commit is contained in:
@@ -2,9 +2,6 @@ package seng302.models.parsers;
|
|||||||
|
|
||||||
|
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
|
||||||
import org.w3c.dom.Node;
|
|
||||||
import org.w3c.dom.NodeList;
|
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
@@ -14,7 +11,8 @@ import javax.xml.parsers.ParserConfigurationException;
|
|||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by kre39 on 23/04/17.
|
* Created by kre39 on 23/04/17.
|
||||||
@@ -111,8 +109,8 @@ public class StreamParser {
|
|||||||
|
|
||||||
static void extractXmlMessage(StreamPacket packet){
|
static void extractXmlMessage(StreamPacket packet){
|
||||||
|
|
||||||
byte[] payload = packet.getPayload();
|
byte[] payload = packet.getPayload(); //Raw Binary XML Message
|
||||||
String xmlMessage = "";
|
String xmlMessage = ""; //Empty xmlMessage String to store XML in
|
||||||
|
|
||||||
ByteArrayInputStream payloadStream = new ByteArrayInputStream(payload);
|
ByteArrayInputStream payloadStream = new ByteArrayInputStream(payload);
|
||||||
|
|
||||||
@@ -129,21 +127,19 @@ public class StreamParser {
|
|||||||
while (payloadStream.available() > 0 && (currentChar = payloadStream.read()) != 0) {
|
while (payloadStream.available() > 0 && (currentChar = payloadStream.read()) != 0) {
|
||||||
xmlMessage += (char)currentChar;
|
xmlMessage += (char)currentChar;
|
||||||
}
|
}
|
||||||
if (xmlMessageSubType == 7) System.out.println(xmlMessage);
|
|
||||||
|
|
||||||
//Create XML document Object
|
//Create XML document Object
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
|
dbf.setNamespaceAware(true);
|
||||||
DocumentBuilder db = null;
|
DocumentBuilder db = null;
|
||||||
|
Document doc = null;
|
||||||
try {
|
try {
|
||||||
db = dbf.newDocumentBuilder();
|
db = dbf.newDocumentBuilder();
|
||||||
Document doc = db.parse(new InputSource(new StringReader(xmlMessage)));
|
doc = db.parse(new InputSource(new StringReader(xmlMessage)));
|
||||||
if (xmlMessageSubType == 7) {
|
|
||||||
XMLParser x = new XMLParser();
|
|
||||||
XMLParser.BoatXMLObject xr = x.createBoatXML(doc);
|
|
||||||
}
|
|
||||||
} catch (ParserConfigurationException|SAXException|IOException e) {
|
} catch (ParserConfigurationException|SAXException|IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
// TODO: 30/04/2017 (ajm412) Figure out how this will tie into the backend of the visualiser now that the parsing is done.
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void extractRaceStartStatus(StreamPacket packet){
|
private static void extractRaceStartStatus(StreamPacket packet){
|
||||||
|
|||||||
@@ -1,57 +1,135 @@
|
|||||||
package seng302.models.parsers;
|
package seng302.models.parsers;
|
||||||
|
|
||||||
import com.sun.org.apache.xpath.internal.SourceTree;
|
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to create an XML object from the XML Packet Messages.
|
||||||
|
*/
|
||||||
class XMLParser {
|
class XMLParser {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Regatta XML Object from the data in a Regatta XML Message
|
||||||
|
* @param doc XML Document Object
|
||||||
|
* @return A new RegattaXMLObject from the input Document.
|
||||||
|
*/
|
||||||
RegattaXMLObject createRegattaXML(Document doc) {
|
RegattaXMLObject createRegattaXML(Document doc) {
|
||||||
return new RegattaXMLObject(doc);
|
return new RegattaXMLObject(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Race XML Object from the data in a Regatta XML Message
|
||||||
|
* @param doc XML Document Object
|
||||||
|
* @return A new RaceXMLObject from the input Document.
|
||||||
|
*/
|
||||||
RaceXMLObject createRaceXML(Document doc) {
|
RaceXMLObject createRaceXML(Document doc) {
|
||||||
return new RaceXMLObject(doc);
|
return new RaceXMLObject(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Boat XML Object from the data in a Regatta XML Message
|
||||||
|
* @param doc XML Document Object
|
||||||
|
* @return A new BoatXMLObject from the input Document.
|
||||||
|
*/
|
||||||
BoatXMLObject createBoatXML(Document doc) {
|
BoatXMLObject createBoatXML(Document doc) {
|
||||||
return new BoatXMLObject(doc);
|
return new BoatXMLObject(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: 29/04/17 ajm412: Data Validation here to return null if a tag somehow doesn't actually exist.
|
/**
|
||||||
|
* Returns the text content of a given child element tag, assuming it exists, as an Integer.
|
||||||
|
* @param ele Document Element with child elements.
|
||||||
|
* @param tag Tag to find in document elements child elements.
|
||||||
|
* @return Text content from tag if found, null otherwise.
|
||||||
|
*/
|
||||||
private static Integer getElementInt(Element ele, String tag) {
|
private static Integer getElementInt(Element ele, String tag) {
|
||||||
return Integer.parseInt(ele.getElementsByTagName(tag).item(0).getTextContent());
|
NodeList tagList = ele.getElementsByTagName(tag);
|
||||||
|
if (tagList.getLength() > 0) {
|
||||||
|
return Integer.parseInt(tagList.item(0).getTextContent());
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the text content of a given child element tag, assuming it exists, as an String.
|
||||||
|
* @param ele Document Element with child elements.
|
||||||
|
* @param tag Tag to find in document elements child elements.
|
||||||
|
* @return Text content from tag if found, null otherwise.
|
||||||
|
*/
|
||||||
private static String getElementString(Element ele, String tag) {
|
private static String getElementString(Element ele, String tag) {
|
||||||
return ele.getElementsByTagName(tag).item(0).getTextContent();
|
NodeList tagList = ele.getElementsByTagName(tag);
|
||||||
|
if (tagList.getLength() > 0) {
|
||||||
|
return tagList.item(0).getTextContent();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the text content of a given child element tag, assuming it exists, as a Double.
|
||||||
|
* @param ele Document Element with child elements.
|
||||||
|
* @param tag Tag to find in document elements child elements.
|
||||||
|
* @return Text content from tag if found, null otherwise.
|
||||||
|
*/
|
||||||
private static Double getElementDouble(Element ele, String tag) {
|
private static Double getElementDouble(Element ele, String tag) {
|
||||||
return Double.parseDouble(ele.getElementsByTagName(tag).item(0).getTextContent());
|
NodeList tagList = ele.getElementsByTagName(tag);
|
||||||
|
if (tagList.getLength() > 0) {
|
||||||
|
return Double.parseDouble(tagList.item(0).getTextContent());
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the text content of an attribute of a given Node, assuming it exists, as a String.
|
||||||
|
* @param n A node object that should have some attributes
|
||||||
|
* @param attr The attribute you want to get from the given node.
|
||||||
|
* @return The String representation of the text content of an attribute in the given node, else returns null.
|
||||||
|
*/
|
||||||
private static String getNodeAttributeString(Node n, String attr) {
|
private static String getNodeAttributeString(Node n, String attr) {
|
||||||
return n.getAttributes().getNamedItem(attr).getTextContent();
|
Node attrItem = n.getAttributes().getNamedItem(attr);
|
||||||
|
if (attrItem != null) {
|
||||||
|
return attrItem.getTextContent();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the text content of an attribute of a given Node, assuming it exists, as an Integer.
|
||||||
|
* @param n A node object that should have some attributes
|
||||||
|
* @param attr The attribute you want to get from the given node.
|
||||||
|
* @return The Integer representation of the text content of an attribute in the given node, else returns null.
|
||||||
|
*/
|
||||||
private static Integer getNodeAttributeInt(Node n, String attr) {
|
private static Integer getNodeAttributeInt(Node n, String attr) {
|
||||||
return Integer.parseInt(n.getAttributes().getNamedItem(attr).getTextContent());
|
Node attrItem = n.getAttributes().getNamedItem(attr);
|
||||||
|
if (attrItem != null) {
|
||||||
|
return Integer.parseInt(attrItem.getTextContent());
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the text content of an attribute of a given Node, assuming it exists, as a Double.
|
||||||
|
* @param n A node object that should have some attributes
|
||||||
|
* @param attr The attribute you want to get from the given node.
|
||||||
|
* @return The Double representation of the text content of an attribute in the given node, else returns null.
|
||||||
|
*/
|
||||||
private static Double getNodeAttributeDouble(Node n, String attr) {
|
private static Double getNodeAttributeDouble(Node n, String attr) {
|
||||||
return Double.parseDouble(n.getAttributes().getNamedItem(attr).getTextContent());
|
Node attrItem = n.getAttributes().getNamedItem(attr);
|
||||||
|
if (attrItem != null) {
|
||||||
|
return Double.parseDouble(attrItem.getTextContent());
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class RegattaXMLObject {
|
class RegattaXMLObject {
|
||||||
|
|
||||||
//Regatta Info
|
//Regatta Info
|
||||||
private Integer regattaID;
|
private Integer regattaID;
|
||||||
private String regattaName;
|
private String regattaName;
|
||||||
@@ -60,6 +138,11 @@ class XMLParser {
|
|||||||
private Double centralLng;
|
private Double centralLng;
|
||||||
private Integer utcOffset;
|
private Integer utcOffset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for a RegattaXMLObject.
|
||||||
|
* Takes the information from a Document object and creates a more usable format.
|
||||||
|
* @param doc XML Document Object
|
||||||
|
*/
|
||||||
RegattaXMLObject(Document doc) {
|
RegattaXMLObject(Document doc) {
|
||||||
Element docEle = doc.getDocumentElement();
|
Element docEle = doc.getDocumentElement();
|
||||||
|
|
||||||
@@ -97,6 +180,11 @@ class XMLParser {
|
|||||||
ArrayList<Corner> compoundMarkSequence;
|
ArrayList<Corner> compoundMarkSequence;
|
||||||
ArrayList<Limit> courseLimit;
|
ArrayList<Limit> courseLimit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for a RaceXMLObject.
|
||||||
|
* Takes the information from a Document object and creates a more usable format.
|
||||||
|
* @param doc XML Document Object
|
||||||
|
*/
|
||||||
RaceXMLObject(Document doc) {
|
RaceXMLObject(Document doc) {
|
||||||
Element docEle = doc.getDocumentElement();
|
Element docEle = doc.getDocumentElement();
|
||||||
participants = new ArrayList<>();
|
participants = new ArrayList<>();
|
||||||
@@ -230,7 +318,6 @@ class XMLParser {
|
|||||||
this.compoundMarkID = getNodeAttributeInt(cornerNode, "CompoundMarkID");
|
this.compoundMarkID = getNodeAttributeInt(cornerNode, "CompoundMarkID");
|
||||||
this.rounding = getNodeAttributeString(cornerNode, "Rounding");
|
this.rounding = getNodeAttributeString(cornerNode, "Rounding");
|
||||||
this.zoneSize = getNodeAttributeInt(cornerNode, "ZoneSize");
|
this.zoneSize = getNodeAttributeInt(cornerNode, "ZoneSize");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getSeqID() { return seqID; }
|
public Integer getSeqID() { return seqID; }
|
||||||
@@ -273,6 +360,11 @@ class XMLParser {
|
|||||||
//Boats
|
//Boats
|
||||||
ArrayList<Boat> boats;
|
ArrayList<Boat> boats;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for a BoatXMLObject.
|
||||||
|
* Takes the information from a Document object and creates a more usable format.
|
||||||
|
* @param doc XML Document Object
|
||||||
|
*/
|
||||||
BoatXMLObject(Document doc) {
|
BoatXMLObject(Document doc) {
|
||||||
|
|
||||||
Element docEle = doc.getDocumentElement();
|
Element docEle = doc.getDocumentElement();
|
||||||
@@ -294,6 +386,17 @@ class XMLParser {
|
|||||||
this.zoneLimits.add(getNodeAttributeDouble(zoneLimitsList, tag));
|
this.zoneLimits.add(getNodeAttributeDouble(zoneLimitsList, tag));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.boats = new ArrayList<>();
|
||||||
|
NodeList boatsList = docEle.getElementsByTagName("Boats").item(0).getChildNodes();
|
||||||
|
for (int i = 0; i < boatsList.getLength(); i++) {
|
||||||
|
Node currentBoat = boatsList.item(i);
|
||||||
|
if (currentBoat.getNodeName().equals("Boat")) {
|
||||||
|
Boat boat = new Boat(currentBoat);
|
||||||
|
this.boats.add(boat);
|
||||||
|
}
|
||||||
|
//System.out.println(this.getBoats());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLastModified() { return lastModified; }
|
public String getLastModified() { return lastModified; }
|
||||||
@@ -314,10 +417,14 @@ class XMLParser {
|
|||||||
private String shortName;
|
private String shortName;
|
||||||
private String boatName;
|
private String boatName;
|
||||||
private String country;
|
private String country;
|
||||||
private String skipper;
|
|
||||||
|
|
||||||
Boat(Node boatNode) {
|
Boat(Node boatNode) {
|
||||||
// TODO: 29/04/17 Actually build the boats.
|
this.boatType = getNodeAttributeString(boatNode, "Type");
|
||||||
|
this.sourceID = getNodeAttributeInt(boatNode, "SourceID");
|
||||||
|
this.hullID = getNodeAttributeString(boatNode, "HullNum");
|
||||||
|
this.shortName = getNodeAttributeString(boatNode, "ShortName");
|
||||||
|
this.boatName = getNodeAttributeString(boatNode, "BoatName");
|
||||||
|
this.country = getNodeAttributeString(boatNode, "Country");
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBoatType() { return boatType; }
|
public String getBoatType() { return boatType; }
|
||||||
@@ -326,7 +433,6 @@ class XMLParser {
|
|||||||
public String getShortName() { return shortName; }
|
public String getShortName() { return shortName; }
|
||||||
public String getBoatName() { return boatName; }
|
public String getBoatName() { return boatName; }
|
||||||
public String getCountry() { return country; }
|
public String getCountry() { return country; }
|
||||||
public String getSkipper() { return skipper; }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user