From 45053ba507bdae9deb2e55529e404b8d76cea2e0 Mon Sep 17 00:00:00 2001 From: Michael Rausch Date: Wed, 19 Jul 2017 14:47:16 +1200 Subject: [PATCH 1/3] Added XML Generation - Implemented a wrapper for Apache Freemake - Implemented the regatta XML generator Tags: #story[984] --- pom.xml | 7 ++ .../seng302/gameServer/GameServerThread.java | 2 +- .../java/seng302/gameServer/GameState.java | 3 - .../MainServerThread.java | 15 +++ src/main/java/seng302/models/xml/Boats.java | 22 +++++ src/main/java/seng302/models/xml/Race.java | 5 + src/main/java/seng302/models/xml/Regatta.java | 74 +++++++++++++++ .../java/seng302/models/xml/XMLGenerator.java | 92 +++++++++++++++++++ .../server_config/xml_templates/boats.ftlh | 36 ++++++++ .../server_config/xml_templates/regatta.ftlh | 11 +++ 10 files changed, 263 insertions(+), 4 deletions(-) create mode 100644 src/main/java/seng302/models/xml/Boats.java create mode 100644 src/main/java/seng302/models/xml/Race.java create mode 100644 src/main/java/seng302/models/xml/Regatta.java create mode 100644 src/main/java/seng302/models/xml/XMLGenerator.java create mode 100644 src/main/resources/server_config/xml_templates/boats.ftlh create mode 100644 src/main/resources/server_config/xml_templates/regatta.ftlh diff --git a/pom.xml b/pom.xml index 8d10c6fc..296a4f01 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,13 @@ 2.7.13 test + + + + org.freemarker + freemarker + 2.3.26-incubating + diff --git a/src/main/java/seng302/gameServer/GameServerThread.java b/src/main/java/seng302/gameServer/GameServerThread.java index 9f127773..342b6e65 100644 --- a/src/main/java/seng302/gameServer/GameServerThread.java +++ b/src/main/java/seng302/gameServer/GameServerThread.java @@ -40,7 +40,7 @@ public class GameServerThread implements Runnable, Observer, ClientConnectionDel runner.start(); } - static void serverLog(String message, int logLevel){ + public static void serverLog(String message, int logLevel){ if(logLevel <= LOG_LEVEL){ System.out.println("[SERVER] " + message); } diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index d36968fc..9dcaed8a 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -59,7 +59,4 @@ public class GameState { } } - - - } diff --git a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java b/src/main/java/seng302/gameServerWithThreading/MainServerThread.java index 226e1dc8..c0168aa6 100644 --- a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java +++ b/src/main/java/seng302/gameServerWithThreading/MainServerThread.java @@ -2,9 +2,13 @@ package seng302.gameServerWithThreading; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; +import seng302.models.mark.Mark; +import seng302.models.mark.MarkType; import seng302.models.stream.PacketBufferDelegate; import seng302.models.stream.StreamParser; import seng302.models.stream.packets.StreamPacket; +import seng302.models.xml.Regatta; +import seng302.models.xml.XMLGenerator; import java.io.IOException; import java.net.ServerSocket; @@ -40,6 +44,17 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ public void run() { + // @TODO remove before commit + XMLGenerator g = new XMLGenerator(); + + Regatta r = new Regatta("Test regatta", 1.123, 4.456); + r.setMagneticVariation(12.1); + r.setUtcOffset(12); + + g.setRegatta(r); + + System.out.println("g.getRegattaAsXml() = " + g.getRegattaAsXml()); + //You should handle interrupts in some way, so that the thread won't keep on forever if you exit the app. while (!isInterrupted()) { try { diff --git a/src/main/java/seng302/models/xml/Boats.java b/src/main/java/seng302/models/xml/Boats.java new file mode 100644 index 00000000..1257e5be --- /dev/null +++ b/src/main/java/seng302/models/xml/Boats.java @@ -0,0 +1,22 @@ +package seng302.models.xml; + +import seng302.models.mark.Mark; + +import java.util.ArrayList; +import java.util.List; + +public class Boats { + private List marks; + + public Boats(){ + marks = new ArrayList<>(); + } + + public void addMark(Mark m){ + marks.add(m); + } + + public List getMarks(){ + return this.marks; + } +} diff --git a/src/main/java/seng302/models/xml/Race.java b/src/main/java/seng302/models/xml/Race.java new file mode 100644 index 00000000..a0e8dc32 --- /dev/null +++ b/src/main/java/seng302/models/xml/Race.java @@ -0,0 +1,5 @@ +package seng302.models.xml; + +public class Race { + +} diff --git a/src/main/java/seng302/models/xml/Regatta.java b/src/main/java/seng302/models/xml/Regatta.java new file mode 100644 index 00000000..7c9dd448 --- /dev/null +++ b/src/main/java/seng302/models/xml/Regatta.java @@ -0,0 +1,74 @@ +package seng302.models.xml; + +public class Regatta { + private final Double DEFAULT_ALTITUDE = 0d; + private final Integer DEFAULT_REGATTA_ID = 0; + + private Integer id; + private String name; + private String courseName; + + private Double latitude; + private Double longitude; + private Double altitude; + + private Integer utcOffset; + private Double magneticVariation; + + public Regatta(String name, Double latitude, Double longitude) { + this.name = name; + this.id = DEFAULT_REGATTA_ID; + this.courseName = name; + + this.latitude = latitude; + this.longitude = longitude; + this.altitude = DEFAULT_ALTITUDE; + + this.utcOffset = 0; + this.magneticVariation = 0d; + } + + public void setMagneticVariation(Double magneticVariation){ + this.magneticVariation = magneticVariation; + } + + public void setUtcOffset(Integer offset){ + this.utcOffset = offset; + } + + /* + NOTE!! The following getters must follow the JavaBean standard (getPropertyName()), and must be public. + */ + + public String getName(){ + return name; + } + + public String getCourseName(){ + return courseName; + } + + public Integer getRegattaId(){ + return id; + } + + public Double getLatitude() { + return latitude; + } + + public Double getLongitude() { + return longitude; + } + + public Double getAltitude() { + return altitude; + } + + public Integer getUtcOffset(){ + return utcOffset; + } + + public Double getMagneticVariation(){ + return magneticVariation; + } +} diff --git a/src/main/java/seng302/models/xml/XMLGenerator.java b/src/main/java/seng302/models/xml/XMLGenerator.java new file mode 100644 index 00000000..09ee9924 --- /dev/null +++ b/src/main/java/seng302/models/xml/XMLGenerator.java @@ -0,0 +1,92 @@ +package seng302.models.xml; + +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import seng302.server.messages.XMLMessageSubType; + +import java.io.*; +import java.net.URISyntaxException; + +public class XMLGenerator { + private static final String XML_TEMPLATE_DIR = "/server_config/xml_templates"; + private static final String REGATTA_TEMPLATE_NAME = "regatta.ftlh"; + private Configuration configuration; + private Regatta regatta; + + /** + * Set up a configuration instance for Apache Freemake + */ + private void setupConfiguration() { + configuration = new Configuration(Configuration.VERSION_2_3_26); + + try { + configuration.setDirectoryForTemplateLoading(new File(getClass().getResource(XML_TEMPLATE_DIR).toURI())); + } catch (IOException e){ + System.out.println("[FATAL] Server could not read XML templates"); + } catch (URISyntaxException e) { + System.out.println("[FATAL] Xml template directory URI is invalid"); + } catch (NullPointerException e){ + System.out.println("[FATAL] Server could not load XML Template directory, ensure this directory isn't empty"); + } + } + + public XMLGenerator(){ + setupConfiguration(); + } + + public void setRegatta(Regatta regatta){ + this.regatta = regatta; + } + + private String parseToXmlString(String templateName, XMLMessageSubType type) throws IOException, TemplateException { + Template template; + ByteArrayOutputStream os = new ByteArrayOutputStream(); + OutputStreamWriter writer = new OutputStreamWriter(os); + + template = configuration.getTemplate(templateName); + + switch (type) { + case REGATTA: + template.process(regatta, writer); + break; + + case BOAT: + template.process(regatta, writer); + break; + + case RACE: + template.process(regatta, writer); + break; + + default: + throw new UnsupportedOperationException(); + } + + try { + return os.toString("UTF-8"); + } catch (UnsupportedEncodingException e) { + System.out.println("[FATAL] UTF-8 Not supported"); + return null; + } + } + + public String getRegattaAsXml(){ + String result = null; + + if (regatta == null) return null; + + try { + result = parseToXmlString(REGATTA_TEMPLATE_NAME, XMLMessageSubType.REGATTA); + } catch (TemplateException e) { + System.out.println("[FATAL] Error parsing regatta"); + } catch (IOException e) { + System.out.println("[FATAL] Error reading regatta"); + } + + return result; + } + + + +} \ No newline at end of file diff --git a/src/main/resources/server_config/xml_templates/boats.ftlh b/src/main/resources/server_config/xml_templates/boats.ftlh new file mode 100644 index 00000000..b2d6f3bb --- /dev/null +++ b/src/main/resources/server_config/xml_templates/boats.ftlh @@ -0,0 +1,36 @@ + + + + 2012-05-17T07:49:40+0200 + 12 + + + + + + + + + + <#-- Not used --> + + + + <#list marks as mark> + + + + + + + <#list boats as boat> + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/server_config/xml_templates/regatta.ftlh b/src/main/resources/server_config/xml_templates/regatta.ftlh new file mode 100644 index 00000000..25543c15 --- /dev/null +++ b/src/main/resources/server_config/xml_templates/regatta.ftlh @@ -0,0 +1,11 @@ + + + ${regattaId} + ${name} + ${courseName} + ${latitude} + ${longitude} + ${altitude} + ${utcOffset} + ${magneticVariation} + \ No newline at end of file From 82b219cdba50668f28da70e67dddab23e9dc4b24 Mon Sep 17 00:00:00 2001 From: Michael Rausch Date: Thu, 20 Jul 2017 13:30:55 +1200 Subject: [PATCH 2/3] Boat and race XML now generated dynamically - Removed course from XML Generator as it was not needed - Boat and race XML added - Method names in Yacht class updated to follow JavaBean standard so they can be read by the template engine Tags: #story[984] --- .../seng302/controllers/CanvasController.java | 2 +- .../FinishScreenViewController.java | 2 +- .../controllers/RaceViewController.java | 12 +-- .../java/seng302/fxObjects/BoatGroup.java | 2 +- .../seng302/gameServer/GameServerThread.java | 2 +- .../MainServerThread.java | 15 ++++ src/main/java/seng302/models/Yacht.java | 7 +- .../java/seng302/models/stream/XMLParser.java | 2 +- src/main/java/seng302/models/xml/Boats.java | 15 +--- src/main/java/seng302/models/xml/Race.java | 20 ++++- .../java/seng302/models/xml/XMLGenerator.java | 41 ++++++++- .../server_config/xml_templates/boats.ftlh | 14 +-- .../server_config/xml_templates/race.ftlh | 86 +++++++++++++++++++ 13 files changed, 180 insertions(+), 40 deletions(-) create mode 100644 src/main/resources/server_config/xml_templates/race.ftlh diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index 8a9f86ec..69ee51b4 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -320,7 +320,7 @@ public class CanvasController { } for (Yacht boat : boats.values()) { - if (participantIDs.contains(boat.getSourceID())) { + if (participantIDs.contains(boat.getSourceId())) { boat.setColour(Colors.getColor()); BoatGroup boatGroup = new BoatGroup(boat, boat.getColour()); boatGroups.add(boatGroup); diff --git a/src/main/java/seng302/controllers/FinishScreenViewController.java b/src/main/java/seng302/controllers/FinishScreenViewController.java index a2d79f36..e15e6f2e 100644 --- a/src/main/java/seng302/controllers/FinishScreenViewController.java +++ b/src/main/java/seng302/controllers/FinishScreenViewController.java @@ -68,7 +68,7 @@ public class FinishScreenViewController implements Initializable { // add data to table for (Yacht boat : StreamParser.getBoatsPos().values()) { - if (participantIDs.contains(boat.getSourceID())) { + if (participantIDs.contains(boat.getSourceId())) { data.add(boat); } } diff --git a/src/main/java/seng302/controllers/RaceViewController.java b/src/main/java/seng302/controllers/RaceViewController.java index 8eb336e7..c22ebf1a 100644 --- a/src/main/java/seng302/controllers/RaceViewController.java +++ b/src/main/java/seng302/controllers/RaceViewController.java @@ -201,7 +201,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel */ void updateSparkLine(){ // Collect the racing boats that aren't already in the chart - ArrayList sparkLineCandidates = startingBoats.stream().filter(yacht -> !sparkLineData.containsKey(yacht.getSourceID()) + ArrayList sparkLineCandidates = startingBoats.stream().filter(yacht -> !sparkLineData.containsKey(yacht.getSourceId()) && yacht.getPosition() != null & yacht.getPosition() != "-").collect(Collectors.toCollection(ArrayList::new)); // Obtain the qualifying boats to set the max on the Y axis @@ -214,7 +214,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel Series yachtData = new Series<>(); yachtData.setName(yacht.getBoatName()); yachtData.getData().add(new XYChart.Data<>(Integer.toString(yacht.getLegNumber()), 1 + racingBoats.size() - Double.parseDouble(yacht.getPosition()))); - sparkLineData.put(yacht.getSourceID(), yachtData); + sparkLineData.put(yacht.getSourceId(), yachtData); }); // Lambda function to sort the series in order of leg (later legs shown more to the right) @@ -244,7 +244,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel * @param legNumber the leg number that the position will be assigned to */ public static void updateYachtPositionSparkline(Yacht yacht, Integer legNumber){ - XYChart.Series positionData = sparkLineData.get(yacht.getSourceID()); + XYChart.Series positionData = sparkLineData.get(yacht.getSourceId()); positionData.getData().add(new XYChart.Data<>(Integer.toString(legNumber), 1 + racingBoats.size() - Double.parseDouble(yacht.getPosition()))); } @@ -381,7 +381,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel if (StreamParser.isRaceStarted()) { for (Yacht boat : StreamParser.getBoatsPos().values()) { - if (participantIDs.contains(boat.getSourceID())) { // check if the boat is racing + if (participantIDs.contains(boat.getSourceId())) { // check if the boat is racing if (boat.getBoatStatus() == 3) { // 3 is finish status Text textToAdd = new Text(boat.getPosition() + ". " + boat.getShortName() + " (Finished)"); @@ -399,7 +399,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel } } else { for (Yacht boat : StreamParser.getBoats().values()) { - if (participantIDs.contains(boat.getSourceID())) { // check if the boat is racing + if (participantIDs.contains(boat.getSourceId())) { // check if the boat is racing Text textToAdd = new Text(boat.getPosition() + ". " + boat.getShortName() + " "); textToAdd.setFill(Paint.valueOf("#d3d3d3")); @@ -613,7 +613,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel for (BoatGroup bg : includedCanvasController.getBoatGroups()) { //We need to iterate over all race groups to get the matching boat group belonging to this boat if we //are to toggle its annotations, there is no other backwards knowledge of a yacht to its boatgroup. - if (bg.getBoat().getHullID().equals(yacht.getHullID())) { + if (bg.getBoat().getHullId().equals(yacht.getHullId())) { updateLaylines(bg); bg.setIsSelected(true); selectedBoat = yacht; diff --git a/src/main/java/seng302/fxObjects/BoatGroup.java b/src/main/java/seng302/fxObjects/BoatGroup.java index 12d23ee8..b87c8fb6 100644 --- a/src/main/java/seng302/fxObjects/BoatGroup.java +++ b/src/main/java/seng302/fxObjects/BoatGroup.java @@ -316,7 +316,7 @@ public class BoatGroup extends Group { * @return An array containing all ID's associated with this RaceObject. */ public long getRaceId() { - return boat.getSourceID(); + return boat.getSourceId(); } public Group getWake () { diff --git a/src/main/java/seng302/gameServer/GameServerThread.java b/src/main/java/seng302/gameServer/GameServerThread.java index 342b6e65..aafb6c0b 100644 --- a/src/main/java/seng302/gameServer/GameServerThread.java +++ b/src/main/java/seng302/gameServer/GameServerThread.java @@ -96,7 +96,7 @@ public class GameServerThread implements Runnable, Observer, ClientConnectionDel thereAreBoatsNotFinished = true; } - BoatSubMessage m = new BoatSubMessage(y.getSourceID(), boatStatus, y.getLastMarkRounded().getId(), 0, 0, 1234l, 1234l); + BoatSubMessage m = new BoatSubMessage(y.getSourceId(), boatStatus, y.getLastMarkRounded().getId(), 0, 0, 1234l, 1234l); boatSubMessages.add(m); } diff --git a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java b/src/main/java/seng302/gameServerWithThreading/MainServerThread.java index c0168aa6..e643738b 100644 --- a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java +++ b/src/main/java/seng302/gameServerWithThreading/MainServerThread.java @@ -2,11 +2,15 @@ package seng302.gameServerWithThreading; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; +import seng302.models.Yacht; import seng302.models.mark.Mark; import seng302.models.mark.MarkType; +import seng302.models.mark.SingleMark; import seng302.models.stream.PacketBufferDelegate; import seng302.models.stream.StreamParser; import seng302.models.stream.packets.StreamPacket; +import seng302.models.xml.Boats; +import seng302.models.xml.Race; import seng302.models.xml.Regatta; import seng302.models.xml.XMLGenerator; @@ -53,8 +57,19 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ g.setRegatta(r); + Race b = new Race(); + b.addBoat(new Yacht("SomeType", 123, "hid", "NZL", + "Emirates Team New Zealand", "NZL")); + + g.setRace(b); + + System.out.println("g.getBoatsAsXml() = " + g.getBoatsAsXml()); + g.getBoatsAsXml(); + System.out.println("g.getRegattaAsXml() = " + g.getRegattaAsXml()); + System.out.println("g.ragce() = " + g.getRaceAsXml()); + //You should handle interrupts in some way, so that the thread won't keep on forever if you exit the app. while (!isInterrupted()) { try { diff --git a/src/main/java/seng302/models/Yacht.java b/src/main/java/seng302/models/Yacht.java index 7ea7e97e..47617bfd 100644 --- a/src/main/java/seng302/models/Yacht.java +++ b/src/main/java/seng302/models/Yacht.java @@ -85,11 +85,11 @@ public class Yacht { return boatType; } - public Integer getSourceID() { + public Integer getSourceId() { return sourceID; } - public String getHullID() { + public String getHullId() { return hullID; } @@ -207,6 +207,7 @@ public class Yacht { } public Double getLat() { + if (lat == null) return 0d; return lat; } @@ -215,6 +216,8 @@ public class Yacht { } public Double getLon() { + + if (lon == null) return 0d; return lon; } diff --git a/src/main/java/seng302/models/stream/XMLParser.java b/src/main/java/seng302/models/stream/XMLParser.java index 99ce72c8..733bcb54 100644 --- a/src/main/java/seng302/models/stream/XMLParser.java +++ b/src/main/java/seng302/models/stream/XMLParser.java @@ -558,7 +558,7 @@ public class XMLParser { getNodeAttributeString(currentBoat, "Country")); this.boats.add(boat); if (boat.getBoatType().equals("Yacht")) { - competingBoats.put(boat.getSourceID(), boat); + competingBoats.put(boat.getSourceId(), boat); } } } diff --git a/src/main/java/seng302/models/xml/Boats.java b/src/main/java/seng302/models/xml/Boats.java index 1257e5be..ed913873 100644 --- a/src/main/java/seng302/models/xml/Boats.java +++ b/src/main/java/seng302/models/xml/Boats.java @@ -1,22 +1,11 @@ package seng302.models.xml; -import seng302.models.mark.Mark; +import seng302.models.Yacht; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class Boats { - private List marks; - public Boats(){ - marks = new ArrayList<>(); - } - - public void addMark(Mark m){ - marks.add(m); - } - - public List getMarks(){ - return this.marks; - } } diff --git a/src/main/java/seng302/models/xml/Race.java b/src/main/java/seng302/models/xml/Race.java index a0e8dc32..b5047071 100644 --- a/src/main/java/seng302/models/xml/Race.java +++ b/src/main/java/seng302/models/xml/Race.java @@ -1,5 +1,23 @@ package seng302.models.xml; -public class Race { +import seng302.models.Yacht; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Race { + private List yachts; + + public Race(){ + yachts = new ArrayList<>(); + } + + public void addBoat(Yacht yacht){ + yachts.add(yacht); + } + + public List getBoats(){ + return Collections.unmodifiableList(yachts); + } } diff --git a/src/main/java/seng302/models/xml/XMLGenerator.java b/src/main/java/seng302/models/xml/XMLGenerator.java index 09ee9924..918748e3 100644 --- a/src/main/java/seng302/models/xml/XMLGenerator.java +++ b/src/main/java/seng302/models/xml/XMLGenerator.java @@ -11,8 +11,11 @@ import java.net.URISyntaxException; public class XMLGenerator { private static final String XML_TEMPLATE_DIR = "/server_config/xml_templates"; private static final String REGATTA_TEMPLATE_NAME = "regatta.ftlh"; + private static final String BOATS_TEMPLATE_NAME = "boats.ftlh"; + private static final String RACE_TEMPLATE_NAME = "race.ftlh"; private Configuration configuration; private Regatta regatta; + private Race race; /** * Set up a configuration instance for Apache Freemake @@ -38,6 +41,10 @@ public class XMLGenerator { public void setRegatta(Regatta regatta){ this.regatta = regatta; } + + public void setRace(Race race){ + this.race = race; + } private String parseToXmlString(String templateName, XMLMessageSubType type) throws IOException, TemplateException { Template template; @@ -52,11 +59,11 @@ public class XMLGenerator { break; case BOAT: - template.process(regatta, writer); + template.process(race, writer); break; case RACE: - template.process(regatta, writer); + template.process(race, writer); break; default: @@ -88,5 +95,35 @@ public class XMLGenerator { } + public String getBoatsAsXml() { + String result = null; + if (race == null) return null; + + try { + result = parseToXmlString(BOATS_TEMPLATE_NAME, XMLMessageSubType.BOAT); + } catch (TemplateException e) { + System.out.println("[FATAL] Error parsing boats"); + } catch (IOException e) { + System.out.println("[FATAL] Error reading boats"); + } + + return result; + } + + public String getRaceAsXml() { + String result = null; + + if (race == null) return null; + + try { + result = parseToXmlString(RACE_TEMPLATE_NAME, XMLMessageSubType.RACE); + } catch (TemplateException e) { + System.out.println("[FATAL] Error parsing race"); + } catch (IOException e) { + System.out.println("[FATAL] Error reading race"); + } + + return result; + } } \ No newline at end of file diff --git a/src/main/resources/server_config/xml_templates/boats.ftlh b/src/main/resources/server_config/xml_templates/boats.ftlh index b2d6f3bb..2dc61eee 100644 --- a/src/main/resources/server_config/xml_templates/boats.ftlh +++ b/src/main/resources/server_config/xml_templates/boats.ftlh @@ -16,20 +16,12 @@ - <#list marks as mark> - - - - - - <#list boats as boat> - - - + + diff --git a/src/main/resources/server_config/xml_templates/race.ftlh b/src/main/resources/server_config/xml_templates/race.ftlh new file mode 100644 index 00000000..2a091262 --- /dev/null +++ b/src/main/resources/server_config/xml_templates/race.ftlh @@ -0,0 +1,86 @@ + + + 2015-08-29T11:27:15+02:00 + + 15082901 + Fleet + + + <#list boats as boat> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 322ff740e2bfc408513c92533a24b2643c2708fd Mon Sep 17 00:00:00 2001 From: Michael Rausch Date: Thu, 20 Jul 2017 14:28:59 +1200 Subject: [PATCH 3/3] Added race start time to race XML - Added race start time to race XML - Added documentation - Removed test code in MainServerThread Tags: #story[984] --- .../MainServerThread.java | 30 -------------- src/main/java/seng302/models/xml/Boats.java | 11 ------ src/main/java/seng302/models/xml/Race.java | 30 ++++++++++++++ src/main/java/seng302/models/xml/Regatta.java | 3 ++ .../java/seng302/models/xml/XMLGenerator.java | 39 ++++++++++++++++++- .../server_config/xml_templates/race.ftlh | 4 +- 6 files changed, 72 insertions(+), 45 deletions(-) delete mode 100644 src/main/java/seng302/models/xml/Boats.java diff --git a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java b/src/main/java/seng302/gameServerWithThreading/MainServerThread.java index e643738b..226e1dc8 100644 --- a/src/main/java/seng302/gameServerWithThreading/MainServerThread.java +++ b/src/main/java/seng302/gameServerWithThreading/MainServerThread.java @@ -2,17 +2,9 @@ package seng302.gameServerWithThreading; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; -import seng302.models.Yacht; -import seng302.models.mark.Mark; -import seng302.models.mark.MarkType; -import seng302.models.mark.SingleMark; import seng302.models.stream.PacketBufferDelegate; import seng302.models.stream.StreamParser; import seng302.models.stream.packets.StreamPacket; -import seng302.models.xml.Boats; -import seng302.models.xml.Race; -import seng302.models.xml.Regatta; -import seng302.models.xml.XMLGenerator; import java.io.IOException; import java.net.ServerSocket; @@ -48,28 +40,6 @@ public class MainServerThread extends Thread implements PacketBufferDelegate{ public void run() { - // @TODO remove before commit - XMLGenerator g = new XMLGenerator(); - - Regatta r = new Regatta("Test regatta", 1.123, 4.456); - r.setMagneticVariation(12.1); - r.setUtcOffset(12); - - g.setRegatta(r); - - Race b = new Race(); - b.addBoat(new Yacht("SomeType", 123, "hid", "NZL", - "Emirates Team New Zealand", "NZL")); - - g.setRace(b); - - System.out.println("g.getBoatsAsXml() = " + g.getBoatsAsXml()); - g.getBoatsAsXml(); - - System.out.println("g.getRegattaAsXml() = " + g.getRegattaAsXml()); - - System.out.println("g.ragce() = " + g.getRaceAsXml()); - //You should handle interrupts in some way, so that the thread won't keep on forever if you exit the app. while (!isInterrupted()) { try { diff --git a/src/main/java/seng302/models/xml/Boats.java b/src/main/java/seng302/models/xml/Boats.java deleted file mode 100644 index ed913873..00000000 --- a/src/main/java/seng302/models/xml/Boats.java +++ /dev/null @@ -1,11 +0,0 @@ -package seng302.models.xml; - -import seng302.models.Yacht; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class Boats { - -} diff --git a/src/main/java/seng302/models/xml/Race.java b/src/main/java/seng302/models/xml/Race.java index b5047071..9be61f37 100644 --- a/src/main/java/seng302/models/xml/Race.java +++ b/src/main/java/seng302/models/xml/Race.java @@ -2,22 +2,52 @@ package seng302.models.xml; import seng302.models.Yacht; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.List; +/** + * A Race object that can be parsed into XML + */ public class Race { private List yachts; + private LocalDateTime startTime; public Race(){ yachts = new ArrayList<>(); + startTime = LocalDateTime.now(); } + /** + * Add a boat to the race + * @param yacht The boat to add + */ public void addBoat(Yacht yacht){ yachts.add(yacht); } + /** + * Get a list of boats in the race + * @return A List of boats + */ public List getBoats(){ return Collections.unmodifiableList(yachts); } + + /** + * Set the time until the race starts + * @param seconds The time in seconds until the race starts + */ + public void setRaceStartDelay(Integer seconds){ + startTime = startTime.plusMinutes(seconds); + } + + /** + * Get the time the race starts + * @return The time the race starts + */ + public String getRaceStartTime(){ + return startTime.toString(); + } } diff --git a/src/main/java/seng302/models/xml/Regatta.java b/src/main/java/seng302/models/xml/Regatta.java index 7c9dd448..733b7a0a 100644 --- a/src/main/java/seng302/models/xml/Regatta.java +++ b/src/main/java/seng302/models/xml/Regatta.java @@ -1,5 +1,8 @@ package seng302.models.xml; +/** + * A Race regatta that can be parsed into XML + */ public class Regatta { private final Double DEFAULT_ALTITUDE = 0d; private final Integer DEFAULT_REGATTA_ID = 0; diff --git a/src/main/java/seng302/models/xml/XMLGenerator.java b/src/main/java/seng302/models/xml/XMLGenerator.java index 918748e3..d74dfb31 100644 --- a/src/main/java/seng302/models/xml/XMLGenerator.java +++ b/src/main/java/seng302/models/xml/XMLGenerator.java @@ -8,6 +8,9 @@ import seng302.server.messages.XMLMessageSubType; import java.io.*; import java.net.URISyntaxException; +/** + * An XML generator to generate the Race, Boat, and Regatta XML dynamically + */ public class XMLGenerator { private static final String XML_TEMPLATE_DIR = "/server_config/xml_templates"; private static final String REGATTA_TEMPLATE_NAME = "regatta.ftlh"; @@ -34,18 +37,36 @@ public class XMLGenerator { } } + /** + * Create an instance of the XML Generator + */ public XMLGenerator(){ setupConfiguration(); } + /** + * Set the race regatta to send to players + * Note: This must be set before a regatta message can be generated + * @param regatta The race regatta + */ public void setRegatta(Regatta regatta){ this.regatta = regatta; } - + + /** + * Set the race to send to players + * Note: This must be set before a boat or race message can be generated + * @param race The race + */ public void setRace(Race race){ this.race = race; } + /** + * Parse an XML template and generate the output as a string + * @param templateName The templates file name + * @param type The XML message sub type + */ private String parseToXmlString(String templateName, XMLMessageSubType type) throws IOException, TemplateException { Template template; ByteArrayOutputStream os = new ByteArrayOutputStream(); @@ -78,6 +99,11 @@ public class XMLGenerator { } } + /** + * Get the race regatta as a string + * Note: Regatta must be set before calling this + * @return String containing the regatta XML, null if there was an error + */ public String getRegattaAsXml(){ String result = null; @@ -94,7 +120,11 @@ public class XMLGenerator { return result; } - + /** + * Get the boats XML as a string + * Note: Race must be set before calling this + * @return String containing the boats XML, null if there was an error + */ public String getBoatsAsXml() { String result = null; @@ -111,6 +141,11 @@ public class XMLGenerator { return result; } + /** + * Get the race XML as a string + * Note: Race must be set before calling this + * @return String containing the race XML, null if there was an error + */ public String getRaceAsXml() { String result = null; diff --git a/src/main/resources/server_config/xml_templates/race.ftlh b/src/main/resources/server_config/xml_templates/race.ftlh index 2a091262..6bdb6ef5 100644 --- a/src/main/resources/server_config/xml_templates/race.ftlh +++ b/src/main/resources/server_config/xml_templates/race.ftlh @@ -1,7 +1,7 @@ - 2015-08-29T11:27:15+02:00 - + ${raceStartTime} + 15082901 Fleet