From b2ea8196d5885b9d881d92ec8fb8ac8c30893eaa Mon Sep 17 00:00:00 2001 From: Haoming Yin Date: Tue, 25 Apr 2017 11:36:27 +1200 Subject: [PATCH] Fixed a bug of getCourse method as it didn't parse xml correctly. - a typo 'CompoundmarkID'(should be 'CompoundMarkID') which caused parser failed to parse file. - add typeOf method in RoundingType to convert strings to types #story[828] --- .../server/simulator/mark/CompoundMark.java | 13 +++++++++++++ .../seng302/server/simulator/mark/Corner.java | 10 ++++++++++ .../seng302/server/simulator/mark/Mark.java | 9 +++++++++ .../server/simulator/mark/RoundingType.java | 19 +++++++++++++++++-- .../simulator/parsers/CourseParser.java | 18 ++++++++++-------- 5 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/main/java/seng302/server/simulator/mark/CompoundMark.java b/src/main/java/seng302/server/simulator/mark/CompoundMark.java index 59dc1f62..489a4a12 100644 --- a/src/main/java/seng302/server/simulator/mark/CompoundMark.java +++ b/src/main/java/seng302/server/simulator/mark/CompoundMark.java @@ -21,6 +21,19 @@ public class CompoundMark { } } + /** + * Prints out compoundMark's info and its marks, good for testing + * @return a string showing its details + */ + @Override + public String toString(){ + if (mark2 == null) + return String.format("CompoundMark: %d (%s), [%s]", + markID, name, mark1.toString()); + return String.format("CompoundMark: %d (%s), [%s; %s]", + markID, name, mark1.toString(), mark2.toString()); + } + public int getMarkID() { return markID; } diff --git a/src/main/java/seng302/server/simulator/mark/Corner.java b/src/main/java/seng302/server/simulator/mark/Corner.java index 98b4828d..70f231b5 100644 --- a/src/main/java/seng302/server/simulator/mark/Corner.java +++ b/src/main/java/seng302/server/simulator/mark/Corner.java @@ -15,6 +15,16 @@ public class Corner { this.zoneSize = zoneSize; } + /** + * Prints out corner's info and its compound mark, good for testing + * @return a string showing its details + */ + @Override + public String toString() { + return String.format("Corner: %d - %s - %d, %s\n", + seqID, roundingType.getType(), zoneSize, compoundMark.toString()); + } + public int getSeqID() { return seqID; } diff --git a/src/main/java/seng302/server/simulator/mark/Mark.java b/src/main/java/seng302/server/simulator/mark/Mark.java index edcac047..0dd2d761 100644 --- a/src/main/java/seng302/server/simulator/mark/Mark.java +++ b/src/main/java/seng302/server/simulator/mark/Mark.java @@ -18,6 +18,15 @@ public class Mark { this.lng = lng; } + /** + * Prints out mark's info and its geo location, good for testing + * @return a string showing its details + */ + @Override + public String toString() { + return String.format("Mark: %d (%s), lat: %f, lng: %f", seqID, name, lat, lng); + } + public int getSeqID() { return seqID; } diff --git a/src/main/java/seng302/server/simulator/mark/RoundingType.java b/src/main/java/seng302/server/simulator/mark/RoundingType.java index 63fae504..de6f6133 100644 --- a/src/main/java/seng302/server/simulator/mark/RoundingType.java +++ b/src/main/java/seng302/server/simulator/mark/RoundingType.java @@ -1,9 +1,9 @@ package seng302.server.simulator.mark; -public enum RoundingType{ +public enum RoundingType { // the mark should be rounded to port (boat's left) - PORT("PS"), + PORT("Port"), // the mark should be rounded to starboard (boat's right) STARBOARD("Stbd"), @@ -25,4 +25,19 @@ public enum RoundingType{ public String getType() { return this.type; } + + public static RoundingType typeOf(String type) { + switch (type) { + case "Port": + return PORT; + case "Stbd": + return STARBOARD; + case "SP": + return SP; + case "PS": + return PS; + default: + return null; + } + } } diff --git a/src/main/java/seng302/server/simulator/parsers/CourseParser.java b/src/main/java/seng302/server/simulator/parsers/CourseParser.java index 831626e4..d055f88e 100644 --- a/src/main/java/seng302/server/simulator/parsers/CourseParser.java +++ b/src/main/java/seng302/server/simulator/parsers/CourseParser.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Map; /** - * parse a course xml file + * Parses the race xml file to get course details * Created by Haoming Yin (hyi25) on 16/3/2017 */ public class CourseParser extends FileParser { @@ -28,10 +28,11 @@ public class CourseParser extends FileParser { this.doc = this.parseFile(); } + // TODO: should handle error / invalid file gracefully public List getCourse() { - compoundMarksMap = getCompoundMarks(doc); + compoundMarksMap = getCompoundMarks(doc.getDocumentElement()); List corners = new ArrayList<>(); - NodeList cMarksSequence = doc.getElementsByTagName("CompoundMarkSequence"); + NodeList cMarksSequence = doc.getElementsByTagName("Corner"); for (int i = 0; i < cMarksSequence.getLength(); i++) { corners.add(getCorner(cMarksSequence.item(i))); @@ -47,7 +48,7 @@ public class CourseParser extends FileParser { Integer seqId = Integer.valueOf(e.getAttribute("SeqID")); Integer cMarkId = Integer.valueOf(e.getAttribute("CompoundMarkID")); CompoundMark cMark = compoundMarksMap.get(cMarkId); - RoundingType roundingType = RoundingType.valueOf(e.getAttribute("Rounding")); + RoundingType roundingType = RoundingType.typeOf(e.getAttribute("Rounding")); Integer zoneSize = Integer.valueOf(e.getAttribute("ZoneSize")); return new Corner(seqId, cMark, roundingType, zoneSize); @@ -60,11 +61,11 @@ public class CourseParser extends FileParser { if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; - NodeList course = element.getElementsByTagName("Course"); + NodeList cMarks = element.getElementsByTagName("CompoundMark"); // loop through all compound marks who are the children of course node - for (int i = 0; i < course.getLength(); i++) { - CompoundMark cMark = getCompoundMark(course.item(i)); + for (int i = 0; i < cMarks.getLength(); i++) { + CompoundMark cMark = getCompoundMark(cMarks.item(i)); if (cMark != null) compoundMarksMap.put(cMark.getMarkID(), cMark); } @@ -78,7 +79,8 @@ public class CourseParser extends FileParser { private CompoundMark getCompoundMark(Node node) { if (node.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) node; - Integer markID = Integer.valueOf(e.getAttribute("CompoundmarkID")); + Integer markID = Integer.valueOf(e.getAttribute("CompoundMarkID")); + String name = e.getAttribute("Name"); CompoundMark cMark = new CompoundMark(markID, name);