Began figuring out how to implement XML data in place of mock data.

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