From b7631c0b4604af6ab230aa8ef8e534bc43451909 Mon Sep 17 00:00:00 2001 From: Haoming Yin Date: Fri, 17 Mar 2017 00:51:16 +1300 Subject: [PATCH 1/5] Create unit test for course parser, and modified course xml file #implement #fix #story[10] #story[9] --- doc/examples/course.xml | 50 ++++++++------ .../models/parsers/CourseParserTest.java | 66 +++++++++++++++++++ 2 files changed, 96 insertions(+), 20 deletions(-) create mode 100644 src/test/java/seng302/models/parsers/CourseParserTest.java diff --git a/doc/examples/course.xml b/doc/examples/course.xml index 768a047c..49e17923 100644 --- a/doc/examples/course.xml +++ b/doc/examples/course.xml @@ -1,52 +1,62 @@ + + - Start + Start - 32.296038 - -64.854401 + Start1 + 32.296038 + -64.854401 - 32.293834 - -64.855195 + Start2 + 32.293834 + -64.855195 Mid Mark - 32.292881 - -64.843231 + 32.292881 + -64.843231 Leeward Gate - 32.283808 - -64.850012 + Leeward Gate1 + 32.283808 + -64.850012 - 32.283216 - -64.847686 + Leeward Gate2 + 32.283216 + -64.847686 Windward Gate - 32.309908 - -64.833665 + Windward Gate1 + 32.309908 + -64.833665 - 32.309158 - -64.830834 + Windward Gate2 + 32.309158 + -64.830834 - + Finish - 32.318439 - -64.837367 + Finish1 + 32.318439 + -64.837367 - 32.318303 - -64.834974 + Finish2 + 32.318303 + -64.834974 diff --git a/src/test/java/seng302/models/parsers/CourseParserTest.java b/src/test/java/seng302/models/parsers/CourseParserTest.java new file mode 100644 index 00000000..20046325 --- /dev/null +++ b/src/test/java/seng302/models/parsers/CourseParserTest.java @@ -0,0 +1,66 @@ +package seng302.models.parsers; + +import org.junit.Before; +import org.junit.Test; +import seng302.models.GateMark; +import seng302.models.Mark; + +import java.util.ArrayList; + +import static org.junit.Assert.*; + +/** + * To test if course parser works as expected. + * Created by Haoming on 17/03/17. + */ +public class CourseParserTest { + + private CourseParser cp; + + @Before + public void initializeParser() throws Exception { + cp = new CourseParser("doc/examples/course.xml"); + } + + @Test + public void getGates() throws Exception { + ArrayList gateMarks = cp.getGates(); + assertEquals(4, gateMarks.size()); + + assertEquals("Start", gateMarks.get(0).getName()); + assertEquals("Leeward Gate", gateMarks.get(1).getName()); + assertEquals("Windward Gate", gateMarks.get(2).getName()); + assertEquals("Finish", gateMarks.get(3).getName()); + + assertEquals("Start1", gateMarks.get(0).getMark1().getName()); + assertEquals("Start2", gateMarks.get(0).getMark2().getName()); + assertEquals(32.293834, gateMarks.get(0).getMark2().getLatitude(), 0.00000001); + assertEquals(-64.855195, gateMarks.get(0).getMark2().getLongitude(), 0.00000001); + + assertEquals("Finish1", gateMarks.get(3).getMark1().getName()); + assertEquals("Finish2", gateMarks.get(3).getMark2().getName()); + assertEquals(32.318303, gateMarks.get(3).getMark2().getLatitude(), 0.00000001); + assertEquals(-64.834974, gateMarks.get(3).getMark2().getLongitude(), 0.00000001); + } + + @Test + public void getMarks() throws Exception { + ArrayList marks = cp.getMarks(); + assertEquals(1, marks.size()); + assertEquals("Mid Mark", marks.get(0).getName()); + } + + @Test + public void getOrder() throws Exception { + ArrayList order = cp.getOrder(); + + assertEquals(6, order.size()); + assertEquals("Start", order.get(0)); + assertEquals("Mid Mark", order.get(1)); + assertEquals("Leeward Gate", order.get(2)); + assertEquals("Windward Gate", order.get(3)); + assertEquals("Leeward Gate", order.get(4)); + assertEquals("Finish", order.get(5)); + } + +} \ No newline at end of file From e7ba9d962da20805499820a8f03df4e92b5bc07e Mon Sep 17 00:00:00 2001 From: Haoming Yin Date: Fri, 17 Mar 2017 00:53:08 +1300 Subject: [PATCH 2/5] =?UTF-8?q?Deleted=20and=20modified=20previous=20sprin?= =?UTF-8?q?t=20parser=20to=20cater=20the=20sprint2=E2=80=99s=20new=20requi?= =?UTF-8?q?rement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - also added new method for GateMark #story[9] #story[10] #fix --- src/main/java/seng302/models/GateMark.java | 43 +++++++++++++------ src/main/java/seng302/models/OldApp.java | 4 +- .../{FileParser.java => OldFileParser.java} | 4 +- ...ParserTest.java => OldFileParserTest.java} | 10 ++--- 4 files changed, 40 insertions(+), 21 deletions(-) rename src/main/java/seng302/models/{FileParser.java => OldFileParser.java} (97%) rename src/test/java/seng302/{FileParserTest.java => OldFileParserTest.java} (78%) diff --git a/src/main/java/seng302/models/GateMark.java b/src/main/java/seng302/models/GateMark.java index c37e84f4..df8d1915 100644 --- a/src/main/java/seng302/models/GateMark.java +++ b/src/main/java/seng302/models/GateMark.java @@ -4,17 +4,36 @@ package seng302.models; * Created by ptg19 on 16/03/17. */ public class GateMark { - private double lat; - private double lon; - private Mark mark1; - private Mark mark2; - private String name; + private double lat; + private double lon; + private Mark mark1; + private Mark mark2; - public GateMark(String name, Mark mark1, Mark mark2, double lat, double lon){ - this.lat = lat; - this.lon = lon; - this.mark1 = mark1; - this.mark2 = mark2; - this.name = name; - } + public Mark getMark1() { + return mark1; + } + + public Mark getMark2() { + return mark2; + } + + public String getName() { + return name; + } + + private String name; + + public GateMark(String name, Mark mark1, Mark mark2, double lat, double lon) { + this.lat = lat; + this.lon = lon; + this.mark1 = mark1; + this.mark2 = mark2; + this.name = name; + } + + public GateMark(String name, Mark mark1, Mark mark2) { + this.mark1 = mark1; + this.mark2 = mark2; + this.name = name; + } } diff --git a/src/main/java/seng302/models/OldApp.java b/src/main/java/seng302/models/OldApp.java index c2b89be7..5d08737e 100644 --- a/src/main/java/seng302/models/OldApp.java +++ b/src/main/java/seng302/models/OldApp.java @@ -16,11 +16,11 @@ public class OldApp { */ public static Race createRace(String configFile) throws Exception { Race race = new Race(); - FileParser fp; + OldFileParser fp; // Read team names from file try{ - fp = new FileParser(configFile); + fp = new OldFileParser(configFile); } catch (FileNotFoundException e){ System.out.println("Config file does not exist"); diff --git a/src/main/java/seng302/models/FileParser.java b/src/main/java/seng302/models/OldFileParser.java similarity index 97% rename from src/main/java/seng302/models/FileParser.java rename to src/main/java/seng302/models/OldFileParser.java index 8adb5be4..e9447b8e 100644 --- a/src/main/java/seng302/models/FileParser.java +++ b/src/main/java/seng302/models/OldFileParser.java @@ -16,7 +16,7 @@ import java.util.Map; * efficiently from external files. */ -public class FileParser { +public class OldFileParser { private String filePath; private JSONObject content; @@ -27,7 +27,7 @@ public class FileParser { * @param filePath a string like path to show location of desired file to * be parsed */ - public FileParser(String filePath) throws Exception { + public OldFileParser(String filePath) throws Exception { this.filePath = filePath; this.readFile(); } diff --git a/src/test/java/seng302/FileParserTest.java b/src/test/java/seng302/OldFileParserTest.java similarity index 78% rename from src/test/java/seng302/FileParserTest.java rename to src/test/java/seng302/OldFileParserTest.java index d57046c9..fa919106 100644 --- a/src/test/java/seng302/FileParserTest.java +++ b/src/test/java/seng302/OldFileParserTest.java @@ -1,7 +1,7 @@ package seng302; import org.junit.Test; -import seng302.models.FileParser; +import seng302.models.OldFileParser; import java.io.FileNotFoundException; @@ -11,14 +11,14 @@ import static org.junit.Assert.assertEquals; * Unit test for FileParser class * Created by Haoming on 5/03/17. */ -public class FileParserTest { +public class OldFileParserTest { /** * test if it fails from reading non existed file */ @Test(expected = FileNotFoundException.class) public void readNonExistedFile() throws Exception { - FileParser fileParser = new FileParser("test/java/seng302/non-existed.json"); + OldFileParser fileParser = new OldFileParser("test/java/seng302/non-existed.json"); } /** @@ -26,7 +26,7 @@ public class FileParserTest { */ @Test public void readValidFile() throws Exception { - FileParser fileParser = new FileParser("src/test/java/seng302/valid.json"); + OldFileParser fileParser = new OldFileParser("src/test/java/seng302/valid.json"); assertEquals("AC35", fileParser.getRaceName()); @@ -42,7 +42,7 @@ public class FileParserTest { */ @Test public void readInvalidFile() throws Exception { - FileParser fileParser = new FileParser("src/test/java/seng302/invalid.json"); + OldFileParser fileParser = new OldFileParser("src/test/java/seng302/invalid.json"); assertEquals(null, fileParser.getRaceName()); assertEquals(null, fileParser.getTeams()); From 16abfcffdaeeefc8b6a1252b1716b3bab2cd26e7 Mon Sep 17 00:00:00 2001 From: Haoming Yin Date: Fri, 17 Mar 2017 00:54:43 +1300 Subject: [PATCH 3/5] Created course parser as a subclass of file parser - refactored file parser as an abstract class - created course parser to parse course xml file #implement #fix #refactor #story[9] #story[10] --- .../seng302/models/parsers/CourseParser.java | 126 ++++++++++++++++++ .../seng302/models/parsers/FileParser.java | 35 +++++ 2 files changed, 161 insertions(+) create mode 100644 src/main/java/seng302/models/parsers/CourseParser.java create mode 100644 src/main/java/seng302/models/parsers/FileParser.java diff --git a/src/main/java/seng302/models/parsers/CourseParser.java b/src/main/java/seng302/models/parsers/CourseParser.java new file mode 100644 index 00000000..7d81fe83 --- /dev/null +++ b/src/main/java/seng302/models/parsers/CourseParser.java @@ -0,0 +1,126 @@ +package seng302.models.parsers; + +import org.w3c.dom.*; +import seng302.models.GateMark; +import seng302.models.Mark; + +import java.util.ArrayList; +import java.util.NoSuchElementException; + +/** + * parse a course xml file + * Created by Haoming Yin (hyi25) on 16/3/2017 + */ +public class CourseParser extends FileParser { + + private Document doc; + + public CourseParser(String path) { + super(path); + this.doc = this.parseFile(); + } + + /** + * create a mark by given node + * + * @param node + * @return a mark, or null if fails to create a mark + */ + private Mark generateMark(Node node) { + try { + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element element = (Element) node; + String name = element.getElementsByTagName("name").item(0).getTextContent(); + double lat = Double.valueOf(element.getElementsByTagName("latitude").item(0).getTextContent()); + double lon = Double.valueOf(element.getElementsByTagName("longitude").item(0).getTextContent()); + Mark mark = new Mark(name, lat, lon); + return mark; + } else { + throw new NoSuchElementException("Cannot generate a mark by given node."); + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * generate an arrayList of gates + * + * @return an arrayList of gates, or null if no gate has been found. + */ + public ArrayList getGates() { + ArrayList gateMarks = new ArrayList<>(); + + try { + NodeList nodes = doc.getElementsByTagName("gate"); + + for (int i = 0; i < nodes.getLength(); i++) { + Node node = nodes.item(i); + + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element element = (Element) node; + String name = element.getElementsByTagName("name").item(0).getTextContent(); + Mark mark1 = generateMark(element.getElementsByTagName("mark").item(0)); + Mark mark2 = generateMark(element.getElementsByTagName("mark").item(1)); + GateMark gateMark = new GateMark(name, mark1, mark2); + gateMarks.add(gateMark); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return gateMarks; + } + + /** + * generate an arrayList of marks + * + * @return an arrayList of marks, or null if no gate has been found. + */ + public ArrayList getMarks() { + ArrayList marks = new ArrayList<>(); + + try { + // find the "marks" tag + Node node = doc.getElementsByTagName("marks").item(0); + // iterate all "marks"'s children + for (Node n = node.getFirstChild(); n != null; n = n.getNextSibling()) { + // if node's tag name is "mark" + if (n.getNodeType() == Node.ELEMENT_NODE) { + Element element = (Element) n; + if (element.getNodeName() == "mark") { + marks.add(generateMark(n)); + } + } + } + return marks; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * return the order of all the marks along a course + * + * @return an arrayList of the names of ordered course marks + */ + public ArrayList getOrder() { + ArrayList markOrder = new ArrayList<>(); + + try { + Node orderNode = doc.getElementsByTagName("order").item(0); + for (Node node = orderNode.getFirstChild(); node != null; node = node.getNextSibling()) { + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element element = (Element) node; + String name = element.getTextContent(); + markOrder.add(name); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return markOrder; + } +} diff --git a/src/main/java/seng302/models/parsers/FileParser.java b/src/main/java/seng302/models/parsers/FileParser.java new file mode 100644 index 00000000..ac4f65c3 --- /dev/null +++ b/src/main/java/seng302/models/parsers/FileParser.java @@ -0,0 +1,35 @@ +package seng302.models.parsers; + +import org.w3c.dom.*; +import javax.xml.parsers.*; +import java.io.*; + +/** + * + * + * Created by Haoming Yin (hyi25) on 16/3/2017 + */ +public abstract class FileParser { + + private String filePath; + + public FileParser(String path) { + this.filePath = path; + } + + protected Document parseFile () { + try { + File file = new File(this.filePath); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(file); + // optional, in order to recover info from broken line. + doc.getDocumentElement().normalize(); + return doc; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + } +} From 121f996a4305b14481834961ea1928c13001ffa2 Mon Sep 17 00:00:00 2001 From: Haoming Yin Date: Fri, 17 Mar 2017 01:04:10 +1300 Subject: [PATCH 4/5] created config, teams xml file, and teamsParser class #implement --- doc/examples/config.xml | 8 ++++++++ doc/examples/teams.xml | 14 ++++++++++++++ .../java/seng302/models/parsers/teamsParser.java | 11 +++++++++++ 3 files changed, 33 insertions(+) create mode 100644 doc/examples/config.xml create mode 100644 doc/examples/teams.xml create mode 100644 src/main/java/seng302/models/parsers/teamsParser.java diff --git a/doc/examples/config.xml b/doc/examples/config.xml new file mode 100644 index 00000000..05c20921 --- /dev/null +++ b/doc/examples/config.xml @@ -0,0 +1,8 @@ + + + + AC35 + 6 + 2.0 + + diff --git a/doc/examples/teams.xml b/doc/examples/teams.xml new file mode 100644 index 00000000..ea549357 --- /dev/null +++ b/doc/examples/teams.xml @@ -0,0 +1,14 @@ + + + + + Oracle Team USA + USA + 23.4 + + + Emirates Team New Zealand + NZL + 25.2 + + \ No newline at end of file diff --git a/src/main/java/seng302/models/parsers/teamsParser.java b/src/main/java/seng302/models/parsers/teamsParser.java new file mode 100644 index 00000000..b54c1773 --- /dev/null +++ b/src/main/java/seng302/models/parsers/teamsParser.java @@ -0,0 +1,11 @@ +package seng302.models.parsers; + +public class teamsParser extends FileParser { + + public teamsParser(String path) { + super(path); + } + + +} + From 8fd06c84ace6dc54c09c10f484b01e20813010c2 Mon Sep 17 00:00:00 2001 From: Haoming Yin Date: Fri, 17 Mar 2017 15:56:37 +1300 Subject: [PATCH 5/5] Merged the refactored mark related class with course parser. #fix #refactor #story[9] #story[10] #story[11] --- .../seng302/models/parsers/CourseParser.java | 23 +++++++++---------- .../models/parsers/CourseParserTest.java | 23 +++++++++---------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/java/seng302/models/parsers/CourseParser.java b/src/main/java/seng302/models/parsers/CourseParser.java index 7d81fe83..ade4f3b7 100644 --- a/src/main/java/seng302/models/parsers/CourseParser.java +++ b/src/main/java/seng302/models/parsers/CourseParser.java @@ -1,8 +1,7 @@ package seng302.models.parsers; import org.w3c.dom.*; -import seng302.models.GateMark; -import seng302.models.Mark; +import seng302.models.mark.*; import java.util.ArrayList; import java.util.NoSuchElementException; @@ -26,15 +25,15 @@ public class CourseParser extends FileParser { * @param node * @return a mark, or null if fails to create a mark */ - private Mark generateMark(Node node) { + private SingleMark generateSingleMark(Node node) { try { if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String name = element.getElementsByTagName("name").item(0).getTextContent(); double lat = Double.valueOf(element.getElementsByTagName("latitude").item(0).getTextContent()); double lon = Double.valueOf(element.getElementsByTagName("longitude").item(0).getTextContent()); - Mark mark = new Mark(name, lat, lon); - return mark; + SingleMark singleMark = new SingleMark(name, lat, lon); + return singleMark; } else { throw new NoSuchElementException("Cannot generate a mark by given node."); } @@ -49,7 +48,7 @@ public class CourseParser extends FileParser { * * @return an arrayList of gates, or null if no gate has been found. */ - public ArrayList getGates() { + public ArrayList getGateMarks() { ArrayList gateMarks = new ArrayList<>(); try { @@ -61,8 +60,8 @@ public class CourseParser extends FileParser { if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String name = element.getElementsByTagName("name").item(0).getTextContent(); - Mark mark1 = generateMark(element.getElementsByTagName("mark").item(0)); - Mark mark2 = generateMark(element.getElementsByTagName("mark").item(1)); + SingleMark mark1 = generateSingleMark(element.getElementsByTagName("mark").item(0)); + SingleMark mark2 = generateSingleMark(element.getElementsByTagName("mark").item(1)); GateMark gateMark = new GateMark(name, mark1, mark2); gateMarks.add(gateMark); } @@ -78,8 +77,8 @@ public class CourseParser extends FileParser { * * @return an arrayList of marks, or null if no gate has been found. */ - public ArrayList getMarks() { - ArrayList marks = new ArrayList<>(); + public ArrayList getSingleMarks() { + ArrayList singleMarks = new ArrayList<>(); try { // find the "marks" tag @@ -90,11 +89,11 @@ public class CourseParser extends FileParser { if (n.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) n; if (element.getNodeName() == "mark") { - marks.add(generateMark(n)); + singleMarks.add(generateSingleMark(n)); } } } - return marks; + return singleMarks; } catch (Exception e) { e.printStackTrace(); return null; diff --git a/src/test/java/seng302/models/parsers/CourseParserTest.java b/src/test/java/seng302/models/parsers/CourseParserTest.java index 20046325..d3e489ee 100644 --- a/src/test/java/seng302/models/parsers/CourseParserTest.java +++ b/src/test/java/seng302/models/parsers/CourseParserTest.java @@ -2,8 +2,7 @@ package seng302.models.parsers; import org.junit.Before; import org.junit.Test; -import seng302.models.GateMark; -import seng302.models.Mark; +import seng302.models.mark.*; import java.util.ArrayList; @@ -24,7 +23,7 @@ public class CourseParserTest { @Test public void getGates() throws Exception { - ArrayList gateMarks = cp.getGates(); + ArrayList gateMarks = cp.getGateMarks(); assertEquals(4, gateMarks.size()); assertEquals("Start", gateMarks.get(0).getName()); @@ -32,20 +31,20 @@ public class CourseParserTest { assertEquals("Windward Gate", gateMarks.get(2).getName()); assertEquals("Finish", gateMarks.get(3).getName()); - assertEquals("Start1", gateMarks.get(0).getMark1().getName()); - assertEquals("Start2", gateMarks.get(0).getMark2().getName()); - assertEquals(32.293834, gateMarks.get(0).getMark2().getLatitude(), 0.00000001); - assertEquals(-64.855195, gateMarks.get(0).getMark2().getLongitude(), 0.00000001); + assertEquals("Start1", gateMarks.get(0).getSingleMark1().getName()); + assertEquals("Start2", gateMarks.get(0).getSingleMark2().getName()); + assertEquals(32.293834, gateMarks.get(0).getSingleMark2().getLatitude(), 0.00000001); + assertEquals(-64.855195, gateMarks.get(0).getSingleMark2().getLongitude(), 0.00000001); - assertEquals("Finish1", gateMarks.get(3).getMark1().getName()); - assertEquals("Finish2", gateMarks.get(3).getMark2().getName()); - assertEquals(32.318303, gateMarks.get(3).getMark2().getLatitude(), 0.00000001); - assertEquals(-64.834974, gateMarks.get(3).getMark2().getLongitude(), 0.00000001); + assertEquals("Finish1", gateMarks.get(3).getSingleMark1().getName()); + assertEquals("Finish2", gateMarks.get(3).getSingleMark2().getName()); + assertEquals(32.318303, gateMarks.get(3).getSingleMark2().getLatitude(), 0.00000001); + assertEquals(-64.834974, gateMarks.get(3).getSingleMark2().getLongitude(), 0.00000001); } @Test public void getMarks() throws Exception { - ArrayList marks = cp.getMarks(); + ArrayList marks = cp.getSingleMarks(); assertEquals(1, marks.size()); assertEquals("Mid Mark", marks.get(0).getName()); }