From ffa3d530aeca0b89fb9e4d933c10a3eb3e611f18 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Wed, 10 May 2017 21:46:24 +1200 Subject: [PATCH] Event takes string and sets time of race - RaceXmlReaders can handle strings now - Not working with visualiser, gps coords may be worng #story[881] --- mock/src/main/java/seng302/App.java | 25 +- mock/src/main/java/seng302/Data/BoatData.java | 2 - mock/src/main/java/seng302/Data/RaceData.java | 6 +- .../java/seng302/DataInput/RaceXMLReader.java | 436 +++++++----------- .../java/seng302/DataInput/XMLReader.java | 19 +- .../StreamedCourseXMLException.java | 2 +- mock/src/main/java/seng302/Model/Boat.java | 2 +- mock/src/main/java/seng302/Model/Event.java | 96 ++-- mock/src/main/java/seng302/Model/Race.java | 13 +- .../Model/StreamedCourseXMLReader.java | 274 ----------- mock/src/main/resources/mockXML/raceTest.xml | 4 +- .../java/seng302/Data/RegattaDataTest.java | 1 - .../main/java/seng302/Mock/StreamedBoat.java | 14 - .../java/seng302/Mock/StreamedCourse.java | 1 + .../main/java/seng302/VisualiserInput.java | 3 +- 15 files changed, 275 insertions(+), 623 deletions(-) rename mock/src/main/java/seng302/{Model => Exceptions}/StreamedCourseXMLException.java (78%) delete mode 100644 mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java diff --git a/mock/src/main/java/seng302/App.java b/mock/src/main/java/seng302/App.java index 40077276..3816093d 100644 --- a/mock/src/main/java/seng302/App.java +++ b/mock/src/main/java/seng302/App.java @@ -6,13 +6,14 @@ import javafx.stage.Stage; import org.xml.sax.SAXException; import seng302.DataInput.*; import seng302.Model.Event; -import seng302.Model.StreamedCourseXMLException; -import seng302.Model.StreamedCourseXMLReader; +import seng302.Exceptions.StreamedCourseXMLException; +import seng302.DataInput.RaceXMLReader; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.text.ParseException; @@ -30,6 +31,7 @@ public class App extends Application { + static String readFile(String path, Charset encoding) throws IOException { byte[] encoded = Files.readAllBytes(Paths.get(path)); return new String(encoded, encoding); @@ -38,21 +40,16 @@ public class App extends Application { @Override public void start(Stage primaryStage) { try { - RegattaDataSource regattaData = new RegattaXMLReader("mockXML/regattaTest.xml"); - BoatDataSource boatData = new BoatXMLReader("mockXML/boatTest.xml"); - RaceDataSource raceData = new StreamedCourseXMLReader("mockXML/raceTest.xml", boatData); - Event raceEvent = new Event(raceData, regattaData, boatData); + + String regattaXML = readFile("mock/src/main/resources/mockXML/regattaTest.xml", StandardCharsets.UTF_8); + String raceXML = readFile("mock/src/main/resources/mockXML/raceTest.xml", StandardCharsets.UTF_8); + String boatXML = readFile("mock/src/main/resources/mockXML/boatTest.xml", StandardCharsets.UTF_8); + + Event raceEvent = new Event(raceXML, regattaXML, boatXML); raceEvent.start(); + } catch (IOException e) { e.printStackTrace(); - } catch (SAXException e) { - e.printStackTrace(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } catch (StreamedCourseXMLException e) { - e.printStackTrace(); } } } diff --git a/mock/src/main/java/seng302/Data/BoatData.java b/mock/src/main/java/seng302/Data/BoatData.java index c34dc614..4851d53d 100644 --- a/mock/src/main/java/seng302/Data/BoatData.java +++ b/mock/src/main/java/seng302/Data/BoatData.java @@ -66,8 +66,6 @@ public class BoatData { StreamResult result = new StreamResult(stringWriter); transformer.transform(source, result); - - System.out.println(stringWriter.toString()); return stringWriter.toString(); diff --git a/mock/src/main/java/seng302/Data/RaceData.java b/mock/src/main/java/seng302/Data/RaceData.java index cabc5471..f4c7cc8c 100644 --- a/mock/src/main/java/seng302/Data/RaceData.java +++ b/mock/src/main/java/seng302/Data/RaceData.java @@ -124,7 +124,7 @@ public class RaceData { */ private void appendRaceStartTime() { Element startTimeElement = doc.createElement("RaceStartTime"); - startTimeElement.setAttribute("Time", (toTruncatedString(creationTimeDate.plusMinutes(0)))); + startTimeElement.setAttribute("Time", (toTruncatedString(creationTimeDate.plusMinutes(3)))); startTimeElement.setAttribute("Postpone", "false"); rootElement.appendChild(startTimeElement); } @@ -232,19 +232,19 @@ public class RaceData { rootElement.appendChild(courseLimitElement); } + /** * Format time data and return it. * @param time time data. * @return formatted time data. */ private String toTruncatedString(ZonedDateTime time) { - DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); String text = dateFormat.format(time); return text; + } - } } diff --git a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java index e751aad8..c306ab86 100644 --- a/mock/src/main/java/seng302/DataInput/RaceXMLReader.java +++ b/mock/src/main/java/seng302/DataInput/RaceXMLReader.java @@ -1,376 +1,274 @@ package seng302.DataInput; -import javafx.scene.paint.Color; import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; - +import seng302.Exceptions.StreamedCourseXMLException; import seng302.Model.*; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; +import java.text.ParseException; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; +import java.time.format.DateTimeFormatter; +import java.util.*; /** - * Created by fwy13 on 26/03/2017. - * @deprecated please use {@link seng302.Model.StreamedCourseXMLReader} + * Created by jjg64 on 21/04/17. */ public class RaceXMLReader extends XMLReader implements RaceDataSource { - private static double COORDINATEPADDING = 0.0005; - private int raceID; - private List boats = new ArrayList<>(); - private Color[] colors = {Color.BLUEVIOLET, Color.BLACK, Color.RED, Color.ORANGE, Color.DARKOLIVEGREEN, Color.LIMEGREEN};//TODO make this established in xml or come up with a better system. - private List legs = new ArrayList<>(); - private GPSCoordinate mark, startPt1, startPt2, finishPt1, finishPt2, leewardPt1, leewardPt2, windwardPt1, windwardPt2; + private static final double COORDINATEPADDING = 0.000; private GPSCoordinate mapTopLeft, mapBottomRight; - private List boundary = new ArrayList<>(); - private List compoundMarks = new ArrayList<>(); + private final List boundary = new ArrayList<>(); + private final Map compoundMarkMap = new HashMap<>(); + private final Map participants = new HashMap<>(); + private final List legs = new ArrayList<>(); + private final List compoundMarks = new ArrayList<>(); + private ZonedDateTime creationTimeDate; + private ZonedDateTime raceStartTime; + private int raceID; + private String raceType; + private boolean postpone; + + private Map boats; + private Map marks; /** - * Constractor for Race XML - * + * Constructor for Streamed Race XML * @param filePath path of the file - * @throws IOException error - * @throws SAXException error + * @throws IOException error + * @throws SAXException error * @throws ParserConfigurationException error + * @throws ParseException error + * @throws StreamedCourseXMLException error */ - public RaceXMLReader(String filePath) throws IOException, SAXException, ParserConfigurationException { - this(filePath, true); + public RaceXMLReader(String filePath, BoatDataSource boatData) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { + this(filePath, boatData, true); } + + /** - * COnstructor for Race XML - * + * Constructor for Streamed Race XML * @param filePath file path to read - * @param read whether or not to read and store the files straight away. - * @throws IOException error - * @throws SAXException error + * @param read whether or not to read and store the files straight away. + * @throws IOException error + * @throws SAXException error * @throws ParserConfigurationException error + * @throws ParseException error + * @throws StreamedCourseXMLException error */ - public RaceXMLReader(String filePath, boolean read) throws IOException, SAXException, ParserConfigurationException { + public RaceXMLReader(String filePath, BoatDataSource boatData, boolean read) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { super(filePath); + this.boats = boatData.getBoats(); + this.marks = boatData.getMarkerBoats(); if (read) { read(); } } /** - * Read the files + * reads + * @throws StreamedCourseXMLException error */ - private void read() { - + private void read() throws StreamedCourseXMLException { + readRace(); + readParticipants(); readCourse(); - readID(); - readLegs(); - readMarkers(); - readBoats(); } /** - * Read in race ID from XML object. + * reads a race */ - public void readID() { - NodeList race = doc.getElementsByTagName("race"); - raceID = Integer.parseInt(getTextValueOfNode((Element) race.item(0), "raceId")); - } + private void readRace() { + DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + Element settings = (Element) doc.getElementsByTagName("Race").item(0); + NamedNodeMap raceTimeTag = doc.getElementsByTagName("RaceStartTime").item(0).getAttributes(); - /** - * Read all the boats in the XML file - */ - public void readBoats() { - //get all boats - NodeList nBoats = doc.getElementsByTagName("boat"); - - for (int i = 0; i < nBoats.getLength(); i++) { - String name = getTextValueOfNode((Element) nBoats.item(i), "name"); - String country = getTextValueOfNode((Element) nBoats.item(i), "abbr"); - int sourceID = Integer.parseInt(getTextValueOfNode((Element) nBoats.item(i), "sourceID")); - Boat boat = new Boat(sourceID, name, country); - boat.setCurrentPosition(startPt1); - if (legs.size() > 0) { - boat.setCurrentLeg(legs.get(0)); - } - boats.add(boat); - } - } + if (raceTimeTag.getNamedItem("Time") != null) dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); - /** - * Read all the boats in the XML file - */ - public void readMarkers() { - //get all boats - NodeList nMarkers = doc.getElementsByTagName("marker"); + raceID = Integer.parseInt(getTextValueOfNode(settings, "RaceID")); + raceType = getTextValueOfNode(settings, "RaceType"); - for (int i = 0; i < nMarkers.getLength(); i++) { - CompoundMark compoundMark = getMarker((Element) nMarkers.item(i)); - if (compoundMark.getName() != null) compoundMarks.add(compoundMark); - } - } + creationTimeDate = ZonedDateTime.parse(getTextValueOfNode(settings, "CreationTimeDate"), dateFormat); - /** - * Read all the legs in the XML file - */ - public void readLegs() { - //get all legs - NodeList nLegs = doc.getElementsByTagName("leg"); - - for (int i = 0; i < nLegs.getLength(); i++) { - String label = getTextValueOfNode((Element) nLegs.item(i), "name"); - NodeList start = ((Element) nLegs.item(i)).getElementsByTagName("start"); - CompoundMark startCompoundMark = getMarker(start); - NodeList finish = ((Element) nLegs.item(i)).getElementsByTagName("finish"); - CompoundMark finishCompoundMark = getMarker(finish); - legs.add(new Leg(label, startCompoundMark, finishCompoundMark, i)); - } + if (raceTimeTag.getNamedItem("Time") != null) raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Time").getTextContent(), dateFormat); + else raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Start").getTextContent(), dateFormat); + + postpone = Boolean.parseBoolean(raceTimeTag.getNamedItem("Postpone").getTextContent()); } - /** - * Read courses in XML file - */ - public void readCourse() { - NodeList nCourse = doc.getElementsByTagName("course"); - - NodeList nBounds = ((Element) nCourse.item(0)).getElementsByTagName("boundaries"); - nBounds = ((Element) nBounds.item(0)).getElementsByTagName("coordinate"); - int maxLatitudeIndex = 0; - double maxLatitude = -Double.MIN_VALUE; - int maxLongitudeIndex = 0; - double maxLongitude = -180; - int minLatitudeIndex = 0; - double minLatitude = Double.MAX_VALUE; - int minLongitudeIndex = 0; - double minLongitude = Double.MAX_VALUE; - for (int i = 0; i < nBounds.getLength(); i++) { - boundary.add(getCoordinates((Element) nBounds.item(i))); - if (boundary.get(i).getLatitude() > maxLatitude) { - maxLatitudeIndex = i; - maxLatitude = boundary.get(i).getLatitude(); - } - if (boundary.get(i).getLatitude() < minLatitude) { - minLatitudeIndex = i; - minLatitude = boundary.get(i).getLatitude(); - } - if (boundary.get(i).getLongitude() > maxLongitude) { - maxLongitudeIndex = i; - maxLongitude = boundary.get(i).getLongitude(); + private void readParticipants() { + Element nParticipants = (Element) doc.getElementsByTagName("Participants").item(0); + nParticipants.getChildNodes().getLength(); + for (int i = 0; i < nParticipants.getChildNodes().getLength(); i++) { + int sourceID; + Node yacht = nParticipants.getChildNodes().item(i); + if (yacht.getNodeName().equals("Yacht")) { + if (exists(yacht, "SourceID")) { + sourceID = Integer.parseInt(yacht.getAttributes().getNamedItem("SourceID").getTextContent()); + participants.put(sourceID, boats.get(sourceID)); + } } - if (boundary.get(i).getLongitude() < minLongitude) { - minLongitudeIndex = i; - minLongitude = boundary.get(i).getLongitude(); - } - } - - double difference = 0;//this will hold the largest difference so we can make the map square. - double latitudeDiff = Math.abs(Math.abs(boundary.get(maxLatitudeIndex).getLatitude()) - Math.abs(boundary.get(minLatitudeIndex).getLatitude())); - double longitudeDiff = Math.abs(Math.abs(boundary.get(maxLongitudeIndex).getLongitude()) - Math.abs(boundary.get(minLongitudeIndex).getLongitude())); - if (latitudeDiff >= longitudeDiff) { - difference = latitudeDiff - longitudeDiff; - maxLongitude += difference / 2; - minLongitude -= difference / 2; - } else { - difference = longitudeDiff - latitudeDiff; - maxLatitude += difference / 2; - minLatitude -= difference / 2; } - maxLatitude += COORDINATEPADDING; - minLatitude -= COORDINATEPADDING; - maxLongitude += COORDINATEPADDING; - minLongitude -= COORDINATEPADDING; - //now create map boundaries - //top left canvas point is min logitude, max latitude - //bottom right of canvas point is min longitude, max latitude. - mapTopLeft = new GPSCoordinate(minLatitude, minLongitude); - mapBottomRight = new GPSCoordinate(maxLatitude, maxLongitude); - - NodeList nMarks = ((Element) nCourse.item(0)).getElementsByTagName("marker"); - startPt1 = getCoordinates(nMarks, 0); - startPt2 = getCoordinates(nMarks, 0, 1); - mark = getCoordinates(nMarks, 1); - windwardPt1 = getCoordinates(nMarks, 2); - windwardPt2 = getCoordinates(nMarks, 2, 1); - leewardPt1 = getCoordinates(nMarks, 3); - leewardPt2 = getCoordinates(nMarks, 3, 1); - finishPt1 = getCoordinates(nMarks, 4); - finishPt2 = getCoordinates(nMarks, 4, 1); - } - - /** - * gets a marker from the XML file - * - * @param start base nodelist this should be the tag that contains - * @return - */ - private CompoundMark getMarker(NodeList start) { - return getMarker(start, 0); } /** - * gets a marker from the XML file - * - * @param start base nodelist this should be the tag that contains - * @param startIndex index in the node that has the coordinate tag - * @return + * reads a course + * @throws StreamedCourseXMLException error */ - private CompoundMark getMarker(NodeList start, int startIndex) { - return getMarker(start, startIndex, 0); + private void readCourse() throws StreamedCourseXMLException { + readCompoundMarks(); + readCompoundMarkSequence(); + readCourseLimit(); } /** - * gets a marker from the XML file - * - * @param start base nodelist this should be the tag that contains - * @param startIndex index in the node that has the coordinate tag - * @param nodeIndex coordinate index - * @return + * Indexes CompoundMark elements by their ID for use in generating the course, and populates list of Markers. + * @see CompoundMark */ - private CompoundMark getMarker(NodeList start, int startIndex, int nodeIndex) { - NodeList nodeList = ((Element) start.item(startIndex)).getElementsByTagName("marker"); - Element marker = (Element) nodeList.item(nodeIndex); - return getMarker(marker); + private void readCompoundMarks() throws StreamedCourseXMLException { + Element nCourse = (Element) doc.getElementsByTagName("Course").item(0); + for(int i = 0; i < nCourse.getChildNodes().getLength(); i++) { + Node compoundMark = nCourse.getChildNodes().item(i); + if(compoundMark.getNodeName().equals("CompoundMark")) { + int compoundMarkID = getCompoundMarkID((Element) compoundMark); + compoundMarkMap.put(compoundMarkID, (Element)compoundMark); + compoundMarks.add(getCompoundMark(compoundMarkID)); + } + } } /** - * gets a changes a marker to GPS coordinates into a marker - * - * @param markerNode marker to turn into coordinates - * @return + * Generates a CompoundMark from the CompoundMark element with given ID. + * @param compoundMarkID index of required CompoundMark element + * @return generated CompoundMark + * @throws StreamedCourseXMLException if CompoundMark element contains unhandled number of compoundMarks + * @see CompoundMark */ - private CompoundMark getMarker(Element markerNode) { - - NodeList nCoordinates = markerNode.getElementsByTagName("coordinate"); - - GPSCoordinate side1 = getCoordinates((Element) nCoordinates.item(0)); - GPSCoordinate side2; - if (nCoordinates.getLength() > 1) { - side2 = getCoordinates((Element) nCoordinates.item(1)); - } else { - side2 = side1; + private CompoundMark getCompoundMark(int compoundMarkID) throws StreamedCourseXMLException { + Element compoundMark = compoundMarkMap.get(compoundMarkID); + NodeList nMarks = compoundMark.getElementsByTagName("Mark"); + CompoundMark marker; + + switch(nMarks.getLength()) { + case 1: marker = new CompoundMark(getMark((Element)nMarks.item(0))); break; + case 2: marker = new CompoundMark(getMark((Element)nMarks.item(0)), getMark((Element)nMarks.item(1))); break; + default: throw new StreamedCourseXMLException(); } - NodeList name = markerNode.getElementsByTagName("name"); - return null;//name.getLength() == 1 ? new CompoundMark(getTextValueOfNode((Element) markerNode, "name"), side1, side2) : new CompoundMark(side1, side2); + + return marker; } - /** - * gets a coordinates from the XML file - * - * @param start base nodelist this should be the tag that contains - * @return - */ - private GPSCoordinate getCoordinates(NodeList start) { - return getCoordinates(start, 0); + private Mark getMark(Element mark) { + int sourceID = Integer.parseInt(mark.getAttribute("SourceID")); + return marks.get(sourceID); } /** - * gets a coordinates from the XML file - * - * @param start base nodelist this should be the tag that contains - * @param startIndex the index the tag containing the coordinate should be in - * @return + * Reads "compoundMarkID" attribute of CompoundMark or Corner element + * @param element with "compoundMarkID" attribute + * @return value of "compoundMarkID" attribute */ - private GPSCoordinate getCoordinates(NodeList start, int startIndex) { - return getCoordinates(start, startIndex, 0); + private int getCompoundMarkID(Element element) { + return Integer.parseInt(element.getAttribute("CompoundMarkID")); } /** - * gets a coordinates from the XML file - * - * @param start base nodelist this should be the tag that contains - * @param startIndex the index the tag containing the coordinate should be in - * @param nodeIndex The coordinate index - * @return + * Reads "name" attribute of CompoundMark element with corresponding CompoundMarkID + * @param compoundMarkID unique ID for CompoundMark element + * @return value of "name" attribute */ - private GPSCoordinate getCoordinates(NodeList start, int startIndex, int nodeIndex) { - NodeList nodeList = ((Element) start.item(startIndex)).getElementsByTagName("coordinate"); - Element coord = (Element) nodeList.item(nodeIndex); - return getCoordinates(coord); + private String getCompoundMarkName(int compoundMarkID) { + return compoundMarkMap.get(compoundMarkID).getAttribute("Name"); } /** - * Returns the coordinate TODO raise exception that runs when the XML is formatted wrongly. - * - * @param coordNode - * @return + * Populates list of legs given CompoundMarkSequence element and referenced CompoundMark elements. + * @throws StreamedCourseXMLException if compoundMarks cannot be resolved from CompoundMark */ - private GPSCoordinate getCoordinates(Element coordNode) { - - double startLat = Double.parseDouble(getTextValueOfNode(coordNode, "latitude")); - double startLong = Double.parseDouble(getTextValueOfNode(coordNode, "longitude")); - return new GPSCoordinate(startLat, startLong); - } - - public List getBoats() { - return boats; - } - - public List getLegs() { - return legs; + private void readCompoundMarkSequence() throws StreamedCourseXMLException { + Element nCompoundMarkSequence = (Element) doc.getElementsByTagName("CompoundMarkSequence").item(0); + NodeList nCorners = nCompoundMarkSequence.getElementsByTagName("Corner"); + Element markXML = (Element)nCorners.item(0); + CompoundMark lastCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); + String legName = getCompoundMarkName(getCompoundMarkID(markXML)); + for(int i = 1; i < nCorners.getLength(); i++) { + markXML = (Element)nCorners.item(i); + CompoundMark currentCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); + legs.add(new Leg(legName, lastCompoundMark, currentCompoundMark, i-1)); + lastCompoundMark = currentCompoundMark; + legName = getCompoundMarkName(getCompoundMarkID(markXML)); + } } - public GPSCoordinate getMark() { - return mark; - } + private void readCourseLimit() { + Element nCourseLimit = (Element) doc.getElementsByTagName("CourseLimit").item(0); + for(int i = 0; i < nCourseLimit.getChildNodes().getLength(); i++) { + Node limit = nCourseLimit.getChildNodes().item(i); + if (limit.getNodeName().equals("Limit")) { + double lat = Double.parseDouble(limit.getAttributes().getNamedItem("Lat").getTextContent()); + double lon = Double.parseDouble(limit.getAttributes().getNamedItem("Lon").getTextContent()); + boundary.add(new GPSCoordinate(lat, lon)); + } + } - public GPSCoordinate getStartPt1() { - return startPt1; - } - public GPSCoordinate getStartPt2() { - return startPt2; - } + double maxLatitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; + double maxLongitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; + double minLatitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; + double minLongitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; - public GPSCoordinate getFinishPt1() { - return finishPt1; + mapTopLeft = new GPSCoordinate(minLatitude, minLongitude); + mapBottomRight = new GPSCoordinate(maxLatitude, maxLongitude); } - public GPSCoordinate getFinishPt2() { - return finishPt2; + public List getBoundary() { + return boundary; } - public GPSCoordinate getLeewardPt1() { - return leewardPt1; + public GPSCoordinate getMapTopLeft() { + return mapTopLeft; } - public GPSCoordinate getLeewardPt2() { - return leewardPt2; + public GPSCoordinate getMapBottomRight() { + return mapBottomRight; } - public GPSCoordinate getWindwardPt1() { - return windwardPt1; + public List getLegs() { + return legs; } - public GPSCoordinate getWindwardPt2() { - return windwardPt2; - } + public List getCompoundMarks() { return compoundMarks; } - public List getBoundary() { - return boundary; + public Double getPadding() { + return COORDINATEPADDING; } - public GPSCoordinate getMapTopLeft() { - return mapTopLeft; + public ZonedDateTime getCreationTimeDate() { + return creationTimeDate; } - public GPSCoordinate getMapBottomRight() { - return mapBottomRight; + public ZonedDateTime getZonedDateTime() { + return raceStartTime; } public int getRaceId() { return raceID; } - public List getCompoundMarks() { - return compoundMarks; + public String getRaceType() { + return raceType; } - public String getRaceType() { - return "FLEET"; + public boolean isPostpone() { + return postpone; } - @Override - public ZonedDateTime getZonedDateTime() { - return null; + public List getBoats() { + return new ArrayList<>(participants.values()); } } diff --git a/mock/src/main/java/seng302/DataInput/XMLReader.java b/mock/src/main/java/seng302/DataInput/XMLReader.java index b2b89e30..e24fb160 100644 --- a/mock/src/main/java/seng302/DataInput/XMLReader.java +++ b/mock/src/main/java/seng302/DataInput/XMLReader.java @@ -3,6 +3,7 @@ package seng302.DataInput; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; +import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; @@ -10,6 +11,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.InputStream; +import java.io.StringReader; /** * Created by fwy13 on 26/03/2017. @@ -26,13 +28,28 @@ public abstract class XMLReader { * @throws SAXException */ public XMLReader(String filePath) throws ParserConfigurationException, IOException, SAXException { - InputStream fXmlFile = getClass().getClassLoader().getResourceAsStream(filePath); + + + + InputSource fXmlFile; + if (filePath.contains("<")) { + fXmlFile = new InputSource(); + fXmlFile.setCharacterStream(new StringReader(filePath)); + + } else { + fXmlFile = new InputSource(getClass().getClassLoader().getResourceAsStream(filePath)); + } + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); } + public XMLReader(String xmlFile, Boolean isWholeFile) { + + } + /** * Return Document data of the read-in XML * @return XML document diff --git a/mock/src/main/java/seng302/Model/StreamedCourseXMLException.java b/mock/src/main/java/seng302/Exceptions/StreamedCourseXMLException.java similarity index 78% rename from mock/src/main/java/seng302/Model/StreamedCourseXMLException.java rename to mock/src/main/java/seng302/Exceptions/StreamedCourseXMLException.java index 453bacfd..eb21e0fa 100644 --- a/mock/src/main/java/seng302/Model/StreamedCourseXMLException.java +++ b/mock/src/main/java/seng302/Exceptions/StreamedCourseXMLException.java @@ -1,4 +1,4 @@ -package seng302.Model; +package seng302.Exceptions; /** * Created by cbt24 on 25/04/17. diff --git a/mock/src/main/java/seng302/Model/Boat.java b/mock/src/main/java/seng302/Model/Boat.java index a53e6626..91fe6f24 100644 --- a/mock/src/main/java/seng302/Model/Boat.java +++ b/mock/src/main/java/seng302/Model/Boat.java @@ -27,7 +27,7 @@ public class Boat { * @param country nam abbreviation */ public Boat(int sourceID, String name, String country) { - this.velocity = 5; // TODO - please dont commit + this.velocity = 30; // TODO - please dont commit this.country = this.country; this.name = name; this.sourceID = sourceID; diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index 25a303d6..3d49c1d3 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -1,21 +1,19 @@ package seng302.Model; -import seng302.Data.BoatData; -import seng302.Data.RaceData; -import seng302.Data.RegattaData; -import seng302.DataInput.BoatDataSource; -import seng302.DataInput.RaceDataSource; -import seng302.DataInput.RegattaDataSource; -import seng302.Exceptions.InvalidBoatDataException; -import seng302.Exceptions.InvalidRaceDataException; -import seng302.Exceptions.InvalidRegattaDataException; +import org.xml.sax.SAXException; +import seng302.DataInput.*; +import seng302.Exceptions.StreamedCourseXMLException; import seng302.MockOutput; +import javax.xml.parsers.ParserConfigurationException; import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; +import java.text.ParseException; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; /** @@ -24,59 +22,87 @@ import java.nio.file.Paths; public class Event { RaceDataSource raceDataSource; + String raceXML; RegattaDataSource regattaDataSource; + String regattaXML; BoatDataSource boatDataSource; - + String boatXML; MockOutput mockOutput; - public Event(RaceDataSource raceData, RegattaDataSource regattaData, BoatDataSource boatDataSource) { - this.raceDataSource = raceData; - this.regattaDataSource = regattaData; - this.boatDataSource = boatDataSource; + + public Event(String raceXML, String regattaXML, String boatXML) { + + this.raceXML = getRaceAtCurrentTime(raceXML); + this.boatXML = boatXML; + this.regattaXML = regattaXML; + try { + boatDataSource = new BoatXMLReader(boatXML); + raceDataSource = new RaceXMLReader(this.raceXML, boatDataSource); + regattaDataSource = new RegattaXMLReader(regattaXML); + mockOutput = new MockOutput(); new Thread(mockOutput).start(); + + } catch (ParserConfigurationException e) { + e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } catch (StreamedCourseXMLException e) { + e.printStackTrace(); } + + } + + private String getRaceAtCurrentTime(String raceXML) { + ZonedDateTime creationTime = ZonedDateTime.now(); + return raceXML.replace("CREATION_TIME", toTruncatedString(creationTime)) + .replace("START_TIME", toTruncatedString(creationTime.plusMinutes(3))); } /** * Send the initial race data and then begin race simulation */ public void start() { - sendXMLs(); - int scaleFactor = 5;//TEMP - was 15. + int scaleFactor = 10;//TEMP - was 15. Race newRace = new Race(raceDataSource, scaleFactor, mockOutput); new Thread((newRace)).start(); } private void sendXMLs() { - try { - System.out.println("Sending Regatta"); - String regattaData = readFile("mock/src/main/resources/mockXML/regattaTest.xml", StandardCharsets.UTF_8); - mockOutput.setRegattaXml(regattaData); - mockOutput.parseXMLString(regattaData, 26); + System.out.println("Sending Regatta"); + mockOutput.setRegattaXml(regattaXML); + mockOutput.parseXMLString(regattaXML, 26); + + System.out.println("Sending Race"); + mockOutput.setRaceXml(raceXML); + System.out.println(raceXML); + mockOutput.parseXMLString(raceXML, 26); + + System.out.println("Sending Boat"); + mockOutput.setBoatsXml(boatXML); + mockOutput.parseXMLString(boatXML, 26); - System.out.println("Sending Race"); - String raceData = readFile("mock/src/main/resources/mockXML/raceTest.xml", StandardCharsets.UTF_8); - mockOutput.setRaceXml(raceData); - mockOutput.parseXMLString(raceData, 26); - System.out.println("Sending Boat"); - String boatData = readFile("mock/src/main/resources/mockXML/boatTest.xml", StandardCharsets.UTF_8); - mockOutput.setBoatsXml(boatData); - mockOutput.parseXMLString(boatData, 26); - } catch (IOException e) { - e.printStackTrace(); - } } - static String readFile(String path, Charset encoding) throws IOException { - byte[] encoded = Files.readAllBytes(Paths.get(path)); - return new String(encoded, encoding); + /** + * Format time data and return it. + * @param time time data. + * @return formatted time data. + */ + private String toTruncatedString(ZonedDateTime time) { + DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); + String text = dateFormat.format(time); + return text; } + } diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 05f0d7f7..52cf85ac 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -25,13 +25,13 @@ import java.util.Random; * Created by fwy13 on 3/03/17. */ public class Race implements Runnable { - //protected Boat[] startingBoats; + protected ObservableList startingBoats; protected List legs; protected int boatsFinished = 0; protected long totalTimeElapsed; - protected int scaleFactor=25; - protected int PRERACE_TIME = 180000; //time in milliseconds to pause during pre-race. At the moment, 3 minutes + protected int scaleFactor = 25; + protected int PRERACE_TIME = 1800; //time in milliseconds to pause during pre-race. At the moment, 3 minutes private long startTime; protected boolean countdownFinish = false; protected boolean runRace = true; @@ -59,7 +59,7 @@ public class Race implements Runnable { this.scaleFactor = scaleFactor; this.mockOutput = mockOutput; - //TODO refactor + this.startTime = System.currentTimeMillis() + (this.PRERACE_TIME / this.scaleFactor); if (startingBoats != null && startingBoats.size() > 0) { @@ -83,7 +83,6 @@ public class Race implements Runnable { public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { //Find new coordinate using current heading and distance - GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); //Load start point into calculator Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); @@ -93,6 +92,7 @@ public class Race implements Runnable { //get new point Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); + System.out.println(endPoint.getX()); return new GPSCoordinate(endPoint.getY(), endPoint.getX()); } @@ -121,6 +121,7 @@ public class Race implements Runnable { @Override public void handle(long arg0) { timeLeft = startTime - currentTime; + System.out.println(timeLeft); ArrayList boatStatuses = new ArrayList<>(); //For each boat, we update it's position, and generate a BoatLocationMessage. for (int i = 0; i < startingBoats.size(); i++) { @@ -165,6 +166,7 @@ public class Race implements Runnable { for (Boat boat : startingBoats) { boat.setStarted(true); + System.out.println(boat.getName()); } new AnimationTimer() { @@ -208,6 +210,7 @@ public class Race implements Runnable { } boatOffset = (boatOffset + 1) % (startingBoats.size()); RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 3, startTime, 0, 2300, 2, boatStatuses);//TODO FIX the second currentTime is a placeholder! Also, replace magic values. + System.out.println(raceStatus.getBoatStatuses().get(0).getLegNumber()); mockOutput.parseRaceStatus(raceStatus); } } diff --git a/mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java b/mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java deleted file mode 100644 index 9a089e41..00000000 --- a/mock/src/main/java/seng302/Model/StreamedCourseXMLReader.java +++ /dev/null @@ -1,274 +0,0 @@ -package seng302.Model; - -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; -import seng302.DataInput.BoatDataSource; -import seng302.DataInput.RaceDataSource; -import seng302.DataInput.XMLReader; - -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.text.ParseException; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; - -/** - * Created by jjg64 on 21/04/17. - */ -public class StreamedCourseXMLReader extends XMLReader implements RaceDataSource { - private static final double COORDINATEPADDING = 0.000; - private GPSCoordinate mapTopLeft, mapBottomRight; - private final List boundary = new ArrayList<>(); - private final Map compoundMarkMap = new HashMap<>(); - private final Map participants = new HashMap<>(); - private final List legs = new ArrayList<>(); - private final List compoundMarks = new ArrayList<>(); - private ZonedDateTime creationTimeDate; - private ZonedDateTime raceStartTime; - private int raceID; - private String raceType; - private boolean postpone; - - private Map boats; - private Map marks; - - /** - * Constructor for Streamed Race XML - * @param filePath path of the file - * @throws IOException error - * @throws SAXException error - * @throws ParserConfigurationException error - * @throws ParseException error - * @throws StreamedCourseXMLException error - */ - public StreamedCourseXMLReader(String filePath, BoatDataSource boatData) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { - this(filePath, boatData, true); - } - - /** - * Constructor for Streamed Race XML - * @param filePath file path to read - * @param read whether or not to read and store the files straight away. - * @throws IOException error - * @throws SAXException error - * @throws ParserConfigurationException error - * @throws ParseException error - * @throws StreamedCourseXMLException error - */ - public StreamedCourseXMLReader(String filePath, BoatDataSource boatData, boolean read) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException { - super(filePath); - this.boats = boatData.getBoats(); - this.marks = boatData.getMarkerBoats(); - if (read) { - read(); - } - } - - /** - * reads - * @throws StreamedCourseXMLException error - */ - private void read() throws StreamedCourseXMLException { - readRace(); - readParticipants(); - readCourse(); - } - - /** - * reads a race - */ - private void readRace() { - DateTimeFormatter dateFormat = DateTimeFormatter.ISO_OFFSET_DATE_TIME; - Element settings = (Element) doc.getElementsByTagName("Race").item(0); - NamedNodeMap raceTimeTag = doc.getElementsByTagName("RaceStartTime").item(0).getAttributes(); - - if (raceTimeTag.getNamedItem("Time") != null) dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); - - - raceID = Integer.parseInt(getTextValueOfNode(settings, "RaceID")); - raceType = getTextValueOfNode(settings, "RaceType"); - - creationTimeDate = ZonedDateTime.parse(getTextValueOfNode(settings, "CreationTimeDate"), dateFormat); - - if (raceTimeTag.getNamedItem("Time") != null) raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Time").getTextContent(), dateFormat); - else raceStartTime = ZonedDateTime.parse(raceTimeTag.getNamedItem("Start").getTextContent(), dateFormat); - - postpone = Boolean.parseBoolean(raceTimeTag.getNamedItem("Postpone").getTextContent()); - } - - private void readParticipants() { - Element nParticipants = (Element) doc.getElementsByTagName("Participants").item(0); - nParticipants.getChildNodes().getLength(); - for (int i = 0; i < nParticipants.getChildNodes().getLength(); i++) { - int sourceID; - Node yacht = nParticipants.getChildNodes().item(i); - if (yacht.getNodeName().equals("Yacht")) { - if (exists(yacht, "SourceID")) { - sourceID = Integer.parseInt(yacht.getAttributes().getNamedItem("SourceID").getTextContent()); - participants.put(sourceID, boats.get(sourceID)); - } - } - } - } - - /** - * reads a course - * @throws StreamedCourseXMLException error - */ - private void readCourse() throws StreamedCourseXMLException { - readCompoundMarks(); - readCompoundMarkSequence(); - readCourseLimit(); - } - - /** - * Indexes CompoundMark elements by their ID for use in generating the course, and populates list of Markers. - * @see CompoundMark - */ - private void readCompoundMarks() throws StreamedCourseXMLException { - Element nCourse = (Element) doc.getElementsByTagName("Course").item(0); - for(int i = 0; i < nCourse.getChildNodes().getLength(); i++) { - Node compoundMark = nCourse.getChildNodes().item(i); - if(compoundMark.getNodeName().equals("CompoundMark")) { - int compoundMarkID = getCompoundMarkID((Element) compoundMark); - compoundMarkMap.put(compoundMarkID, (Element)compoundMark); - compoundMarks.add(getCompoundMark(compoundMarkID)); - } - } - } - - /** - * Generates a CompoundMark from the CompoundMark element with given ID. - * @param compoundMarkID index of required CompoundMark element - * @return generated CompoundMark - * @throws StreamedCourseXMLException if CompoundMark element contains unhandled number of compoundMarks - * @see CompoundMark - */ - private CompoundMark getCompoundMark(int compoundMarkID) throws StreamedCourseXMLException { - Element compoundMark = compoundMarkMap.get(compoundMarkID); - NodeList nMarks = compoundMark.getElementsByTagName("Mark"); - CompoundMark marker; - - switch(nMarks.getLength()) { - case 1: marker = new CompoundMark(getMark((Element)nMarks.item(0))); break; - case 2: marker = new CompoundMark(getMark((Element)nMarks.item(0)), getMark((Element)nMarks.item(1))); break; - default: throw new StreamedCourseXMLException(); - } - - return marker; - } - - private Mark getMark(Element mark) { - int sourceID = Integer.parseInt(mark.getAttribute("SourceID")); - System.out.println(marks.get(sourceID).getPosition()); - return marks.get(sourceID); - } - - /** - * Reads "compoundMarkID" attribute of CompoundMark or Corner element - * @param element with "compoundMarkID" attribute - * @return value of "compoundMarkID" attribute - */ - private int getCompoundMarkID(Element element) { - return Integer.parseInt(element.getAttribute("CompoundMarkID")); - } - - /** - * Reads "name" attribute of CompoundMark element with corresponding CompoundMarkID - * @param compoundMarkID unique ID for CompoundMark element - * @return value of "name" attribute - */ - private String getCompoundMarkName(int compoundMarkID) { - return compoundMarkMap.get(compoundMarkID).getAttribute("Name"); - } - - /** - * Populates list of legs given CompoundMarkSequence element and referenced CompoundMark elements. - * @throws StreamedCourseXMLException if compoundMarks cannot be resolved from CompoundMark - */ - private void readCompoundMarkSequence() throws StreamedCourseXMLException { - Element nCompoundMarkSequence = (Element) doc.getElementsByTagName("CompoundMarkSequence").item(0); - NodeList nCorners = nCompoundMarkSequence.getElementsByTagName("Corner"); - Element markXML = (Element)nCorners.item(0); - CompoundMark lastCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); - String legName = getCompoundMarkName(getCompoundMarkID(markXML)); - for(int i = 1; i < nCorners.getLength(); i++) { - markXML = (Element)nCorners.item(i); - CompoundMark currentCompoundMark = getCompoundMark(getCompoundMarkID(markXML)); - legs.add(new Leg(legName, lastCompoundMark, currentCompoundMark, i-1)); - lastCompoundMark = currentCompoundMark; - legName = getCompoundMarkName(getCompoundMarkID(markXML)); - } - } - - private void readCourseLimit() { - Element nCourseLimit = (Element) doc.getElementsByTagName("CourseLimit").item(0); - for(int i = 0; i < nCourseLimit.getChildNodes().getLength(); i++) { - Node limit = nCourseLimit.getChildNodes().item(i); - if (limit.getNodeName().equals("Limit")) { - double lat = Double.parseDouble(limit.getAttributes().getNamedItem("Lat").getTextContent()); - double lon = Double.parseDouble(limit.getAttributes().getNamedItem("Lon").getTextContent()); - boundary.add(new GPSCoordinate(lat, lon)); - } - } - - - double maxLatitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; - double maxLongitude = boundary.stream().max(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; - double minLatitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLatitude)).get().getLatitude() + COORDINATEPADDING; - double minLongitude = boundary.stream().min(Comparator.comparingDouble(GPSCoordinate::getLongitude)).get().getLongitude() + COORDINATEPADDING; - - mapTopLeft = new GPSCoordinate(minLatitude, minLongitude); - mapBottomRight = new GPSCoordinate(maxLatitude, maxLongitude); - } - - public List getBoundary() { - return boundary; - } - - public GPSCoordinate getMapTopLeft() { - return mapTopLeft; - } - - public GPSCoordinate getMapBottomRight() { - return mapBottomRight; - } - - public List getLegs() { - return legs; - } - - public List getCompoundMarks() { return compoundMarks; } - - public Double getPadding() { - return COORDINATEPADDING; - } - - public ZonedDateTime getCreationTimeDate() { - return creationTimeDate; - } - - public ZonedDateTime getZonedDateTime() { - return raceStartTime; - } - - public int getRaceId() { - return raceID; - } - - public String getRaceType() { - return raceType; - } - - public boolean isPostpone() { - return postpone; - } - - public List getBoats() { - return new ArrayList<>(participants.values()); - } -} diff --git a/mock/src/main/resources/mockXML/raceTest.xml b/mock/src/main/resources/mockXML/raceTest.xml index 40a509a2..85ff00eb 100644 --- a/mock/src/main/resources/mockXML/raceTest.xml +++ b/mock/src/main/resources/mockXML/raceTest.xml @@ -2,8 +2,8 @@ 5326 FLEET - 2017-05-10T12:35:19+1200 - + CREATION_TIME + diff --git a/mock/src/test/java/seng302/Data/RegattaDataTest.java b/mock/src/test/java/seng302/Data/RegattaDataTest.java index c3040498..da2d833e 100644 --- a/mock/src/test/java/seng302/Data/RegattaDataTest.java +++ b/mock/src/test/java/seng302/Data/RegattaDataTest.java @@ -4,7 +4,6 @@ import org.junit.Before; import org.junit.Test; import org.xml.sax.SAXException; import seng302.DataInput.RaceDataSource; -import seng302.DataInput.RaceXMLReader; import seng302.DataInput.RegattaDataSource; import seng302.DataInput.RegattaXMLReader; diff --git a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java index d4485b5a..d5134cc0 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java @@ -29,18 +29,4 @@ public class StreamedBoat extends Boat { return sourceID; } - /** - * Calculates the azimuth of the travel via heading of the boat - * - * @return the direction that the boat is heading towards in degrees (-180 to 180). - */ - public double calculateAzimuth() { - double azimuth; - if (heading <= 180) { - azimuth = heading; - } else { - azimuth = -heading + 180; - } - return azimuth; - } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index 1233b519..6301f584 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -33,6 +33,7 @@ public class StreamedCourse extends Observable implements RaceDataSource { this.boatXMLReader = boatXMLReader; if (streamedCourseXMLReader != null && boatXMLReader != null) { this.boatXMLReader.setParticipants(streamedCourseXMLReader.getParticipants()); + System.out.println(streamedCourseXMLReader.getParticipants().size()); boatXMLReader.read(); } diff --git a/visualiser/src/main/java/seng302/VisualiserInput.java b/visualiser/src/main/java/seng302/VisualiserInput.java index ffba53c3..e35c4b7f 100644 --- a/visualiser/src/main/java/seng302/VisualiserInput.java +++ b/visualiser/src/main/java/seng302/VisualiserInput.java @@ -219,7 +219,6 @@ public class VisualiserInput implements Runnable { //If no heartbeat has been received in more the heartbeat period //then the connection will need to be restarted. - System.out.println("time since last heartbeat: " + timeSinceHeartbeat());//TEMP REMOVE long heartBeatPeriod = 10 * 1000; if (timeSinceHeartbeat() > heartBeatPeriod) { System.out.println("Connection has stopped, trying to reconnect."); @@ -369,6 +368,8 @@ public class VisualiserInput implements Runnable { BoatLocation boatLocation = (BoatLocation) message; //System.out.println("Boat Location!"); + //System.out.println(boatLocation.getSourceID()); + if (this.boatLocationMap.containsKey(boatLocation.getSourceID())) { //If our boatlocation map already contains a boat location message for this boat, check that the new message is actually for a later timestamp (i.e., newer). if (boatLocation.getTime() > this.boatLocationMap.get(boatLocation.getSourceID()).getTime()){