From 57de0585826f0c05b73ba9335e90486bd1a8b828 Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Mon, 1 May 2017 17:35:39 +1200 Subject: [PATCH] Began figuring out how to implement XML data in place of mock data. #story[820] #pair[ajm412, wmu16] --- .../java/seng302/controllers/Controller.java | 8 ++ .../seng302/controllers/RaceController.java | 3 +- .../seng302/models/parsers/StreamParser.java | 54 ++++++------- .../seng302/models/parsers/XMLParser.java | 78 +++++++++++-------- 4 files changed, 79 insertions(+), 64 deletions(-) diff --git a/src/main/java/seng302/controllers/Controller.java b/src/main/java/seng302/controllers/Controller.java index d5d662b2..d78d85f2 100644 --- a/src/main/java/seng302/controllers/Controller.java +++ b/src/main/java/seng302/controllers/Controller.java @@ -17,10 +17,13 @@ import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import seng302.models.Boat; import seng302.models.parsers.StreamParser; +import seng302.models.parsers.XMLParser; +import javax.xml.crypto.dsig.XMLObject; import java.io.IOException; import java.net.URL; +import java.util.ArrayList; import java.util.ResourceBundle; import java.util.Timer; import java.util.TimerTask; @@ -70,6 +73,7 @@ public class Controller implements Initializable { */ public void startStream() { if (StreamParser.isStreamStatus()) { + XMLParser xmlParser = StreamParser.getXmlObject(); streamButton.setVisible(false); timeTillLive.setVisible(true); timeTillLive.setTextFill(Color.GREEN); @@ -92,6 +96,10 @@ public class Controller implements Initializable { String timerString = "-" + timerMinute + "." + timerSecond + " minutes"; timeTillLive.setText(timerString); } else if (StreamParser.getTimeSinceStart() % 10 == 0) { +// ArrayList courseLimits = xmlParser.getRaceXML().getCourseLimit(); +// for (XMLParser.RaceXMLObject.Limit courseLimit : courseLimits) { +// System.out.println("Lat,Lng: " + courseLimit.getLat() + courseLimit.getLng()); +// } updateTeamList(); timeTillLive.setTextFill(Color.BLACK); switchToRaceViewButton.setDisable(false); diff --git a/src/main/java/seng302/controllers/RaceController.java b/src/main/java/seng302/controllers/RaceController.java index b5fa2847..f595e5e9 100644 --- a/src/main/java/seng302/controllers/RaceController.java +++ b/src/main/java/seng302/controllers/RaceController.java @@ -4,6 +4,7 @@ import seng302.models.Boat; import seng302.models.Race; import seng302.models.parsers.ConfigParser; import seng302.models.parsers.CourseParser; +import seng302.models.parsers.StreamParser; import seng302.models.parsers.TeamsParser; import java.lang.reflect.Array; @@ -38,7 +39,7 @@ public class RaceController { public Race createRace(String configFile, String teamsConfigFile) throws Exception { Race race = new Race(); - +// StreamParser.xmlObject // Read team names from file TeamsParser tp = new TeamsParser(teamsConfigFile); diff --git a/src/main/java/seng302/models/parsers/StreamParser.java b/src/main/java/seng302/models/parsers/StreamParser.java index 4f6b206f..7a438f42 100644 --- a/src/main/java/seng302/models/parsers/StreamParser.java +++ b/src/main/java/seng302/models/parsers/StreamParser.java @@ -1,7 +1,9 @@ package seng302.models.parsers; +import com.sun.deploy.util.StringUtils; import javafx.geometry.Point3D; +import jdk.internal.util.xml.impl.Pair; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -33,6 +35,7 @@ public class StreamParser extends Thread{ private String threadName; private Thread t; private static boolean raceStarted = false; + public static XMLParser xmlObject; private static boolean raceFinished = false; private static boolean streamStatus = false; private static long timeSinceStart = -1; @@ -50,6 +53,7 @@ public class StreamParser extends Thread{ try { System.out.println("START OF STREAM"); streamStatus = true; + xmlObject = new XMLParser(); while (StreamReceiver.packetBuffer == null || StreamReceiver.packetBuffer.size() < 1) { Thread.sleep(1); } @@ -220,41 +224,24 @@ public class StreamParser extends Thread{ private static void extractXmlMessage(StreamPacket packet){ byte[] payload = packet.getPayload(); - String xmlMessage = ""; - ByteArrayInputStream payloadStream = new ByteArrayInputStream(payload); - - //Bunch of data we don't want (Message Version Number, AckNumber, Timestamp) - payloadStream.skip(9); - int xmlMessageSubType = payloadStream.read(); - payloadStream.skip(2); - - //checks the length of the xml message itself - int xmlMessageLength = payloadStream.read() | payloadStream.read() << 8; - - //Converts XML message to string to be parsed - int currentChar; - while (payloadStream.available() > 0 && (currentChar = payloadStream.read()) != 0) { - xmlMessage += (char)currentChar; - } - - // Parse boat xml from server - if (xmlMessageSubType == 7) { - BoatsParser boatsParser = new BoatsParser(xmlMessage); - boats = boatsParser.getBoats(); - } + int messageType = payload[9]; + long messagelength = bytesToLong(Arrays.copyOfRange(payload,12,14)); + String xmlMessage = new String((Arrays.copyOfRange(payload,14,(int) (14 + messagelength)))).trim(); + //System.out.println("xmlMessage2 = " + xmlMessage); //Create XML document Object -// DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); -// DocumentBuilder db = null; -// try { -// db = dbf.newDocumentBuilder(); -// Document doc = db.parse(new InputSource(new StringReader(xmlMessage))); -// // TODO: 25/04/17 ajm412: Check that the object matches expected structure and return Document object. -// } catch (ParserConfigurationException | IOException | SAXException e) { -// e.printStackTrace(); -// } + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = null; + Document doc = null; + try { + db = dbf.newDocumentBuilder(); + doc = db.parse(new InputSource(new StringReader(xmlMessage))); + } catch (ParserConfigurationException | IOException | SAXException e) { + e.printStackTrace(); + } + xmlObject.constructXML(doc, messageType); } /** @@ -473,5 +460,10 @@ public class StreamParser extends Thread{ public static List getBoats() { return boats; } + + + public static XMLParser getXmlObject() { + return xmlObject; + } } diff --git a/src/main/java/seng302/models/parsers/XMLParser.java b/src/main/java/seng302/models/parsers/XMLParser.java index ef65ea38..a50cbcbc 100644 --- a/src/main/java/seng302/models/parsers/XMLParser.java +++ b/src/main/java/seng302/models/parsers/XMLParser.java @@ -9,35 +9,51 @@ import java.util.ArrayList; /** * Class to create an XML object from the XML Packet Messages. + * + * Example usage: + * + * Document doc; // some xml document + * Integer xmlMessageType; // an Integer of value 5, 6, 7 + * + * xmlP = new XMLParser(doc, xmlMessageType); + * RegattaXMLObject rXmlObj = xmlP.createRegattaXML(); // creates a regattaXML object. + * */ -class XMLParser { +public 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) { - return new RegattaXMLObject(doc); + private Document xmlDoc; + + private RaceXMLObject raceXML; + private RegattaXMLObject regattaXML; + private BoatXMLObject boatXML; + + public XMLParser() { } /** - * 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. + * Constructor for XMLParser + * @param doc Document to create XML object. + * @param messageType Defines if a message is a RegattaXML(5), RaceXML(6), BoatXML(7). */ - RaceXMLObject createRaceXML(Document doc) { - return new RaceXMLObject(doc); + public void constructXML(Document doc, Integer messageType) { + this.xmlDoc = doc; + switch (messageType) { + case 5: + regattaXML = new RegattaXMLObject(this.xmlDoc); + break; + case 6: + raceXML = new RaceXMLObject(this.xmlDoc); + break; + case 7: + boatXML = new BoatXMLObject(this.xmlDoc); + break; + } } - /** - * 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) { - return new BoatXMLObject(doc); - } + public RaceXMLObject getRaceXML() { return raceXML; } + public RegattaXMLObject getRegattaXML() { return regattaXML; } + public BoatXMLObject getBoatXML() { return boatXML; } + /** * Returns the text content of a given child element tag, assuming it exists, as an Integer. @@ -129,7 +145,7 @@ class XMLParser { } } - class RegattaXMLObject { + public class RegattaXMLObject { //Regatta Info private Integer regattaID; private String regattaName; @@ -163,7 +179,7 @@ class XMLParser { } - class RaceXMLObject { + public class RaceXMLObject { // Race Info private Integer raceID; @@ -266,7 +282,7 @@ class XMLParser { public ArrayList getCompoundMarkSequence() { return compoundMarkSequence; } public ArrayList getCourseLimit() { return courseLimit; } - class Participant { + public class Participant { Integer sourceID; String entry; @@ -279,7 +295,7 @@ class XMLParser { public String getEntry() { return entry; } } - class CompoundMark { + public class CompoundMark { private Integer markID; private String cMarkName; private ArrayList marks; @@ -302,7 +318,7 @@ class XMLParser { public String getcMarkName() { return cMarkName; } public ArrayList getMarks() { return marks; } - class Mark { + public class Mark { private Integer seqID; private Integer sourceID; private String markName; @@ -310,13 +326,11 @@ class XMLParser { private Double targetLng; Mark(Node markNode) { - this.seqID = getNodeAttributeInt(markNode, "SeqID"); this.sourceID = getNodeAttributeInt(markNode, "SourceID"); this.markName = getNodeAttributeString(markNode, "Name"); this.targetLat = getNodeAttributeDouble(markNode, "TargetLat"); this.targetLng = getNodeAttributeDouble(markNode, "TargetLng"); - } public Integer getSeqID() { return seqID; } @@ -327,7 +341,7 @@ class XMLParser { } } - class Corner { + public class Corner { private Integer seqID; private Integer compoundMarkID; private String rounding; @@ -346,7 +360,7 @@ class XMLParser { public Integer getZoneSize() { return zoneSize; } } - class Limit { + public class Limit { private Integer seqID; private Double lat; private Double lng; @@ -364,7 +378,7 @@ class XMLParser { } - class BoatXMLObject { + public class BoatXMLObject { private String lastModified; private Integer version; @@ -429,7 +443,7 @@ class XMLParser { public ArrayList getZoneLimits() { return zoneLimits; } public ArrayList getBoats() { return boats; } - class Boat { + public class Boat { private String boatType; private Integer sourceID;