diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index a2e00a23..6b34732d 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -125,7 +125,7 @@ public class CanvasController { // TODO: 1/05/17 cir27 - Make the RaceObjects update on the actual delay. elapsedNanos = 1000 / 60; - updateRaceObjects(); + //updateRaceObjects(); if (StreamParser.isRaceFinished()) { this.stop(); } @@ -423,23 +423,29 @@ public class CanvasController { * are scaled according to the distanceScaleFactor variable. */ private void givePointsXY() { - List allPoints = StreamParser.getXmlObject().getRaceXML().getCompoundMarks(); - List processed = new ArrayList<>(); - MarkGroup markGroup; + Map allPoints = StreamParser.getXmlObject().getRaceXML().getCompoundMarks(); + List processed = new ArrayList<>(); + MarkGroup markGroup; - for (XMLParser.RaceXMLObject.CompoundMark mark : allPoints) { - if (!processed.contains(mark)) { - if (mark.getMarkType() != MarkType.SINGLE_MARK) { - markGroup = new MarkGroup(mark, findScaledXY(mark.getMarks().get(0)), findScaledXY(mark.getMarks().get(1))); - markGroups.add(markGroup); - } else { - markGroup = new MarkGroup(mark, findScaledXY(mark.getMarks().get(0))); - markGroups.add(markGroup); + for (Map.Entry cMark : allPoints) { + Integer cMarkId = cMark.getKey(); + Mark mark = cMark.getValue(); + if (!processed.contains(mark)) { + if (mark.getMarkType() != MarkType.SINGLE_MARK) { + GateMark gMark = (GateMark) mark; + + markGroup = new MarkGroup(mark, findScaledXY(gMark.getSingleMark1()), findScaledXY(gMark.getSingleMark2())); //should be 2 objects in the list. + markGroups.add(markGroup); + } else { + SingleMark sMark = (SingleMark) mark; + + markGroup = new MarkGroup(mark, findScaledXY(sMark)); + markGroups.add(markGroup); + } + processed.add((mark)); } - processed.add(mark); } - } - group.getChildren().addAll(boatGroups); + group.getChildren().addAll(boatGroups); } private Point2D findScaledXY (Mark unscaled) { diff --git a/src/main/java/seng302/models/mark/Mark.java b/src/main/java/seng302/models/mark/Mark.java index a32ba20f..ce5a6f4a 100644 --- a/src/main/java/seng302/models/mark/Mark.java +++ b/src/main/java/seng302/models/mark/Mark.java @@ -132,5 +132,4 @@ public abstract class Mark { public void setId(int id) { this.id = id; } - } diff --git a/src/main/java/seng302/models/stream/XMLParser.java b/src/main/java/seng302/models/stream/XMLParser.java index 181c1e2f..43595cea 100644 --- a/src/main/java/seng302/models/stream/XMLParser.java +++ b/src/main/java/seng302/models/stream/XMLParser.java @@ -1,27 +1,30 @@ package seng302.models.stream; +import java.util.List; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import seng302.models.Yacht; +import seng302.models.mark.GateMark; +import seng302.models.mark.Mark; import seng302.models.mark.MarkType; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import seng302.models.mark.SingleMark; /** * 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. + * 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. */ public class XMLParser { @@ -31,10 +34,12 @@ public class XMLParser { private RegattaXMLObject regattaXML; private BoatXMLObject boatXML; - public XMLParser() {} + public XMLParser() { + } /** * Constructor for XMLParser + * * @param doc Document to create XML object. * @param messageType Defines if a message is a RegattaXML(5), RaceXML(6), BoatXML(7). */ @@ -53,13 +58,22 @@ public class XMLParser { } } - public RaceXMLObject getRaceXML() { return raceXML; } - public RegattaXMLObject getRegattaXML() { return regattaXML; } - public BoatXMLObject getBoatXML() { return boatXML; } + 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. + * * @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. @@ -75,6 +89,7 @@ public class XMLParser { /** * 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. @@ -90,6 +105,7 @@ public class XMLParser { /** * 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. @@ -105,9 +121,11 @@ public class XMLParser { /** * 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. + * @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) { Node attrItem = n.getAttributes().getNamedItem(attr); @@ -120,9 +138,11 @@ public class XMLParser { /** * 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. + * @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) { Node attrItem = n.getAttributes().getNamedItem(attr); @@ -135,9 +155,11 @@ public class XMLParser { /** * 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. + * @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) { Node attrItem = n.getAttributes().getNamedItem(attr); @@ -149,6 +171,7 @@ public class XMLParser { } public class RegattaXMLObject { + //Regatta Info private Integer regattaID; private String regattaName; @@ -160,6 +183,7 @@ public class XMLParser { /** * 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) { @@ -173,12 +197,29 @@ public class XMLParser { this.utcOffset = getElementInt(docEle, "UtcOffset"); } - public Integer getRegattaID() { return regattaID; } - public String getRegattaName() { return regattaName; } - public String getCourseName() { return courseName; } - public Double getCentralLat() { return centralLat; } - public Double getCentralLng() { return centralLng; } - public Integer getUtcOffset() { return utcOffset; } + public Integer getRegattaID() { + return regattaID; + } + + public String getRegattaName() { + return regattaName; + } + + public String getCourseName() { + return courseName; + } + + public Double getCentralLat() { + return centralLat; + } + + public Double getCentralLng() { + return centralLng; + } + + public Integer getUtcOffset() { + return utcOffset; + } } @@ -195,13 +236,14 @@ public class XMLParser { //Non atomic race attributes private ArrayList participants; - private ArrayList course; + private Map course; private ArrayList compoundMarkSequence; private ArrayList 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) { @@ -213,8 +255,9 @@ public class XMLParser { this.creationTimeDate = getElementString(docEle, "CreationTimeDate"); Node raceStart = docEle.getElementsByTagName("RaceStartTime").item(0); - this.raceStartTime = getNodeAttributeString(raceStart, "Start") ; - this.postponeStatus = Boolean.parseBoolean(getNodeAttributeString(raceStart, "Postpone")); + this.raceStartTime = getNodeAttributeString(raceStart, "Start"); + this.postponeStatus = Boolean + .parseBoolean(getNodeAttributeString(raceStart, "Postpone")); //Participants participants = new ArrayList<>(); @@ -238,21 +281,13 @@ public class XMLParser { } //Course - course = new ArrayList<>(); - - NodeList cMarkList = docEle.getElementsByTagName("Course").item(0).getChildNodes(); - for (int i = 0; i < cMarkList.getLength(); i++) { - Node cMarkNode = cMarkList.item(i); - if (cMarkNode.getNodeName().equals("CompoundMark")) { - CompoundMark cMark = new CompoundMark(cMarkNode); - course.add(cMark); - } - } + course = createCompoundMarks(docEle); //Course Mark Sequence compoundMarkSequence = new ArrayList<>(); - NodeList cornerList = docEle.getElementsByTagName("CompoundMarkSequence").item(0).getChildNodes(); + NodeList cornerList = docEle.getElementsByTagName("CompoundMarkSequence").item(0) + .getChildNodes(); for (int i = 0; i < cornerList.getLength(); i++) { Node cornerNode = cornerList.item(i); if (cornerNode.getNodeName().equals("Corner")) { @@ -274,18 +309,97 @@ public class XMLParser { } } - public Integer getRaceID() { return raceID; } - public String getRaceType() { return raceType; } - public String getCreationTimeDate() { return creationTimeDate; } - public String getRaceStartTime() { return raceStartTime; } - public Boolean getPostponeStatus() { return postponeStatus; } - public ArrayList getParticipants() { return participants; } - public ArrayList getCompoundMarks() { return course; } - public ArrayList getCompoundMarkSequence() { return compoundMarkSequence; } - public ArrayList getCourseLimit() { return courseLimit; } + private Map createCompoundMarks(Element docEle) { + Map cMarks = new HashMap<>(); + + NodeList cMarkList = docEle.getElementsByTagName("Course").item(0).getChildNodes(); + for (int i = 0; i < cMarkList.getLength(); i++) { + Node cMarkNode = cMarkList.item(i); + + if (cMarkNode.getNodeName().equals("CompoundMark")) { + Integer markID = getNodeAttributeInt(cMarkNode, "CompoundMarkID"); + Mark mark = createMark(cMarkNode); + + cMarks.put(markID, mark); + } + } + + return cMarks; + } + + private Mark createMark(Node compoundMark) { + + List marksList = new ArrayList<>(); + String cMarkName = getNodeAttributeString(compoundMark, "Name"); + + NodeList childMarks = compoundMark.getChildNodes(); + + for (int i = 0; i < childMarks.getLength(); i++) { + Node markNode = childMarks.item(i); + if (markNode.getNodeName().equals("Mark")) { + + Integer sourceID = getNodeAttributeInt(markNode, "SourceID"); + String markName = getNodeAttributeString(markNode, "Name"); + Double targetLat = getNodeAttributeDouble(markNode, "TargetLat"); + Double targetLng = getNodeAttributeDouble(markNode, "TargetLng"); + + SingleMark mark = new SingleMark(markName, targetLat, targetLng, sourceID); + marksList.add(mark); + } + } + + System.out.println(marksList.size()); + if (marksList.size() == 1) { + return marksList.get(0); + } else if (marksList.size() == 2) { + return new GateMark(cMarkName, MarkType.OPEN_GATE, marksList.get(0), + marksList.get(1), marksList.get(0).getLatitude(), + marksList.get(0).getLongitude()); + } else { + return null; + } + + } + + public Integer getRaceID() { + return raceID; + } + + public String getRaceType() { + return raceType; + } + + public String getCreationTimeDate() { + return creationTimeDate; + } + + public String getRaceStartTime() { + return raceStartTime; + } + + public Boolean getPostponeStatus() { + return postponeStatus; + } + + public ArrayList getParticipants() { + return participants; + } + + public Map getCompoundMarks() { + return course; + } + + public ArrayList getCompoundMarkSequence() { + return compoundMarkSequence; + } + + public ArrayList getCourseLimit() { + return courseLimit; + } public class Participant { + Integer sourceID; String entry; @@ -294,65 +408,17 @@ public class XMLParser { this.entry = entry; } - public Integer getsourceID() { return sourceID; } - public String getEntry() { return entry; } - } - - public class CompoundMark { - private Integer markID; - private String cMarkName; - private MarkType markType; - private ArrayList marks; - - CompoundMark(Node compoundMark) { - marks = new ArrayList<>(); - this.markID = getNodeAttributeInt(compoundMark, "CompoundMarkID"); - this.cMarkName = getNodeAttributeString(compoundMark, "Name"); - NodeList childMarks = compoundMark.getChildNodes(); - if (childMarks.getLength() > 1){ - markType = MarkType.OPEN_GATE; - } else { - markType = MarkType.SINGLE_MARK; - } - - for (int i = 0; i < childMarks.getLength(); i++) { - Node markNode = childMarks.item(i); - if (markNode.getNodeName().equals("Mark")) { - Mark mark = new Mark(markNode); - marks.add(mark); - } - } + public Integer getsourceID() { + return sourceID; } - public Integer getMarkID() { return markID; } - public String getcMarkName() { return cMarkName; } - public MarkType getMarkType() { return markType; } - public ArrayList getMarks() { return marks; } - - public class Mark { - private Integer seqID; - private Integer sourceID; - private String markName; - private Double targetLat; - 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; } - public Integer getSourceID() { return sourceID; } - public String getMarkName() { return markName; } - public Double getTargetLat() { return targetLat; } - public Double getTargetLng() { return targetLng; } + public String getEntry() { + return entry; } } public class Corner { + private Integer seqID; private Integer compoundMarkID; private String rounding; @@ -365,13 +431,25 @@ public class XMLParser { this.zoneSize = getNodeAttributeInt(cornerNode, "ZoneSize"); } - public Integer getSeqID() { return seqID; } - public Integer getCompoundMarkID() { return compoundMarkID; } - public String getRounding() { return rounding; } - public Integer getZoneSize() { return zoneSize; } + public Integer getSeqID() { + return seqID; + } + + public Integer getCompoundMarkID() { + return compoundMarkID; + } + + public String getRounding() { + return rounding; + } + + public Integer getZoneSize() { + return zoneSize; + } } public class Limit { + private Integer seqID; private Double lat; private Double lng; @@ -382,9 +460,17 @@ public class XMLParser { this.lng = getNodeAttributeDouble(limitNode, "Lon"); } - public Integer getSeqID() { return seqID; } - public Double getLat() { return lat; } - public Double getLng() { return lng; } + public Integer getSeqID() { + return seqID; + } + + public Double getLat() { + return lat; + } + + public Double getLng() { + return lng; + } } } @@ -410,6 +496,7 @@ public class XMLParser { /** * 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) { @@ -429,7 +516,7 @@ public class XMLParser { Node zoneLimitsList = settingsList.item(7); this.zoneLimits = new ArrayList<>(); for (int i = 0; i < zoneLimitsList.getAttributes().getLength(); i++) { - String tag = String.format("Limit%d", i+1); + String tag = String.format("Limit%d", i + 1); this.zoneLimits.add(getNodeAttributeDouble(zoneLimitsList, tag)); } @@ -440,61 +527,60 @@ public class XMLParser { if (currentBoat.getNodeName().equals("Boat")) { // Boat boat = new Boat(currentBoat); Yacht boat = new Yacht(getNodeAttributeString(currentBoat, "Type"), - getNodeAttributeInt(currentBoat, "SourceID"), - getNodeAttributeString(currentBoat, "HullNum"), - getNodeAttributeString(currentBoat, "ShortName"), - getNodeAttributeString(currentBoat, "BoatName"), - getNodeAttributeString(currentBoat, "Country")); + getNodeAttributeInt(currentBoat, "SourceID"), + getNodeAttributeString(currentBoat, "HullNum"), + getNodeAttributeString(currentBoat, "ShortName"), + getNodeAttributeString(currentBoat, "BoatName"), + getNodeAttributeString(currentBoat, "Country")); this.boats.add(boat); if (boat.getBoatType().equals("Yacht")) { competingBoats.put(boat.getSourceID(), boat); } } - //System.out.println(this.getBoats()); } } - public String getLastModified() { return lastModified; } - public Integer getVersion() { return version; } - public String getBoatType() { return boatType; } - public Double getBoatLength() { return boatLength; } - public Double getHullLength() { return hullLength; } - public Double getMarkZoneSize() { return markZoneSize; } - public Double getCourseZoneSize() { return courseZoneSize; } - public ArrayList getZoneLimits() { return zoneLimits; } - public ArrayList getBoats() { return boats; } + public String getLastModified() { + return lastModified; + } + + public Integer getVersion() { + return version; + } + + public String getBoatType() { + return boatType; + } + + public Double getBoatLength() { + return boatLength; + } + + public Double getHullLength() { + return hullLength; + } + + public Double getMarkZoneSize() { + return markZoneSize; + } + + public Double getCourseZoneSize() { + return courseZoneSize; + } + + public ArrayList getZoneLimits() { + return zoneLimits; + } + + public ArrayList getBoats() { + return boats; + } + public Map getCompetingBoats() { return competingBoats; } -// public class Boat { -// -// private String boatType; -// private Integer sourceID; -// private String hullID; //matches HullNum in the XML spec. -// private String shortName; -// private String boatName; -// private String country; -// -// Boat(Node boatNode) { -// 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 Integer getSourceID() { return sourceID; } -// public String getHullID() { return hullID; } -// public String getShortName() { return shortName; } -// public String getBoatName() { return boatName; } -// public String getCountry() { return country; } -// -// } - } } \ No newline at end of file