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/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/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/GateMark.java b/src/main/java/seng302/models/GateMark.java
new file mode 100644
index 00000000..e69de29b
diff --git a/src/main/java/seng302/models/OldApp.java b/src/main/java/seng302/models/OldApp.java
index cba4da66..094ae681 100644
--- a/src/main/java/seng302/models/OldApp.java
+++ b/src/main/java/seng302/models/OldApp.java
@@ -18,11 +18,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/main/java/seng302/models/parsers/CourseParser.java b/src/main/java/seng302/models/parsers/CourseParser.java
new file mode 100644
index 00000000..ade4f3b7
--- /dev/null
+++ b/src/main/java/seng302/models/parsers/CourseParser.java
@@ -0,0 +1,125 @@
+package seng302.models.parsers;
+
+import org.w3c.dom.*;
+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 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());
+ SingleMark singleMark = new SingleMark(name, lat, lon);
+ return singleMark;
+ } 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 getGateMarks() {
+ 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();
+ 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);
+ }
+ }
+ } 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 getSingleMarks() {
+ ArrayList singleMarks = 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") {
+ singleMarks.add(generateSingleMark(n));
+ }
+ }
+ }
+ return singleMarks;
+ } 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;
+ }
+
+ }
+}
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);
+ }
+
+
+}
+
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());
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..d3e489ee
--- /dev/null
+++ b/src/test/java/seng302/models/parsers/CourseParserTest.java
@@ -0,0 +1,65 @@
+package seng302.models.parsers;
+
+import org.junit.Before;
+import org.junit.Test;
+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.getGateMarks();
+ 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).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).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.getSingleMarks();
+ 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