Refactored Event Class
#story[881]
This commit is contained in:
@@ -3,20 +3,14 @@ package seng302;
|
|||||||
|
|
||||||
import javafx.application.Application;
|
import javafx.application.Application;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import org.xml.sax.SAXException;
|
|
||||||
import seng302.DataInput.*;
|
|
||||||
import seng302.Model.Event;
|
import seng302.Model.Event;
|
||||||
import seng302.Exceptions.StreamedCourseXMLException;
|
|
||||||
import seng302.DataInput.RaceXMLReader;
|
|
||||||
|
|
||||||
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.text.ParseException;
|
|
||||||
|
|
||||||
public class App extends Application {
|
public class App extends Application {
|
||||||
|
|
||||||
@@ -29,14 +23,6 @@ public class App extends Application {
|
|||||||
launch(args);
|
launch(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static String readFile(String path, Charset encoding) throws IOException {
|
|
||||||
byte[] encoded = Files.readAllBytes(Paths.get(path));
|
|
||||||
return new String(encoded, encoding);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(Stage primaryStage) {
|
public void start(Stage primaryStage) {
|
||||||
try {
|
try {
|
||||||
@@ -52,4 +38,10 @@ public class App extends Application {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static String readFile(String path, Charset encoding) throws IOException {
|
||||||
|
byte[] encoded = Files.readAllBytes(Paths.get(path));
|
||||||
|
return new String(encoded, encoding);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,5 +8,4 @@ public class Constants {
|
|||||||
|
|
||||||
public static final int NMToMetersConversion = 1852; // 1 nautical mile = 1852 meters
|
public static final int NMToMetersConversion = 1852; // 1 nautical mile = 1852 meters
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,218 +0,0 @@
|
|||||||
package seng302.Data;
|
|
||||||
|
|
||||||
import org.w3c.dom.Attr;
|
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.w3c.dom.Element;
|
|
||||||
import seng302.Exceptions.InvalidBoatDataException;
|
|
||||||
import seng302.Model.Boat;
|
|
||||||
|
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.transform.OutputKeys;
|
|
||||||
import javax.xml.transform.Transformer;
|
|
||||||
import javax.xml.transform.TransformerException;
|
|
||||||
import javax.xml.transform.TransformerFactory;
|
|
||||||
import javax.xml.transform.dom.DOMSource;
|
|
||||||
import javax.xml.transform.stream.StreamResult;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by esa46 on 25/04/17.
|
|
||||||
*/
|
|
||||||
public class BoatData {
|
|
||||||
|
|
||||||
Document doc;
|
|
||||||
private List<Boat> boatData;
|
|
||||||
|
|
||||||
|
|
||||||
public BoatData(List<Boat> boatData) {
|
|
||||||
this.boatData = boatData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an AC35 officially formatted xml description of boats competing in a race
|
|
||||||
*
|
|
||||||
* @return String containing xml-formatted boats description
|
|
||||||
*/
|
|
||||||
public String createXML() {
|
|
||||||
|
|
||||||
try {
|
|
||||||
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
|
|
||||||
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
|
|
||||||
|
|
||||||
//root element
|
|
||||||
doc = docBuilder.newDocument();
|
|
||||||
Element rootElement = doc.createElement("BoatConfig");
|
|
||||||
doc.appendChild(rootElement);
|
|
||||||
|
|
||||||
//Boats element
|
|
||||||
Element boats = doc.createElement("Boats");
|
|
||||||
rootElement.appendChild(boats);
|
|
||||||
|
|
||||||
appendIndividualBoats(boats);
|
|
||||||
|
|
||||||
// write the content into xml file
|
|
||||||
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
|
||||||
Transformer transformer = transformerFactory.newTransformer();
|
|
||||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
|
||||||
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
|
|
||||||
DOMSource source = new DOMSource(doc);
|
|
||||||
|
|
||||||
//Serialize document.
|
|
||||||
StringWriter stringWriter = new StringWriter();
|
|
||||||
StreamResult result = new StreamResult(stringWriter);
|
|
||||||
transformer.transform(source, result);
|
|
||||||
|
|
||||||
return stringWriter.toString();
|
|
||||||
|
|
||||||
|
|
||||||
} catch (ParserConfigurationException pce) {
|
|
||||||
throw new InvalidBoatDataException();
|
|
||||||
} catch (TransformerException tfe) {
|
|
||||||
throw new InvalidBoatDataException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs through competing boats, creating an element for each
|
|
||||||
*
|
|
||||||
* @param boatsElement boats element to be added to
|
|
||||||
*/
|
|
||||||
private void appendIndividualBoats(Element boatsElement) {
|
|
||||||
|
|
||||||
for (int i = 0; i < boatData.size(); i++) {
|
|
||||||
Element boat = doc.createElement("Boat");
|
|
||||||
appendType(boat);
|
|
||||||
appendSourceID(boat, i);
|
|
||||||
appendShapeID(boat);
|
|
||||||
appendHullNum(boat);
|
|
||||||
appendStoweName(boat, i);
|
|
||||||
appendShortName(boat, i);
|
|
||||||
appendBoatName(boat, i);
|
|
||||||
appendGPSCoords(boat, i);
|
|
||||||
//Write boat to boats
|
|
||||||
boatsElement.appendChild(boat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends type attribute of a boat
|
|
||||||
*
|
|
||||||
* @param boat element being added to
|
|
||||||
*/
|
|
||||||
private void appendType(Element boat) {
|
|
||||||
//Type attribute
|
|
||||||
Attr attrType = doc.createAttribute("Type");
|
|
||||||
attrType.setValue("Yacht");
|
|
||||||
boat.setAttributeNode(attrType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends sourceID attribute of a boat
|
|
||||||
*
|
|
||||||
* @param boat element being added to
|
|
||||||
* @param i boat number
|
|
||||||
*/
|
|
||||||
private void appendSourceID(Element boat, int i) {
|
|
||||||
//SourceID attribute
|
|
||||||
Attr attrSourceID = doc.createAttribute("SourceID");
|
|
||||||
attrSourceID.setValue(Integer.toString(boatData.get(i).getSourceID()));
|
|
||||||
boat.setAttributeNode(attrSourceID);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends shapeID attribute of a boat
|
|
||||||
*
|
|
||||||
* @param boat element being added to
|
|
||||||
*/
|
|
||||||
private void appendShapeID(Element boat) {
|
|
||||||
//ShapeID attribute
|
|
||||||
Attr attrShapeID = doc.createAttribute("ShapeID");
|
|
||||||
attrShapeID.setValue("0");
|
|
||||||
boat.setAttributeNode(attrShapeID);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends hull name attribute of a boat
|
|
||||||
*
|
|
||||||
* @param boat element being added to
|
|
||||||
*/
|
|
||||||
private void appendHullNum(Element boat) {
|
|
||||||
//HullNum attribute
|
|
||||||
Attr attrHullNum = doc.createAttribute("HullNum");
|
|
||||||
attrHullNum.setValue("RG01");
|
|
||||||
boat.setAttributeNode(attrHullNum);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends stow name attribute of a boat
|
|
||||||
*
|
|
||||||
* @param boat element being added to
|
|
||||||
* @param i boat number
|
|
||||||
*/
|
|
||||||
private void appendStoweName(Element boat, int i) {
|
|
||||||
//StoweName attribute
|
|
||||||
Attr attrStoweName = doc.createAttribute("StoweName");
|
|
||||||
attrStoweName.setValue(boatData.get(i).getCountry());
|
|
||||||
boat.setAttributeNode(attrStoweName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends short name attribute of a boat
|
|
||||||
*
|
|
||||||
* @param boat element being added to
|
|
||||||
* @param i boat number
|
|
||||||
*/
|
|
||||||
private void appendShortName(Element boat, int i) {
|
|
||||||
//ShortName attribute
|
|
||||||
Attr attrShortName = doc.createAttribute("ShortName");
|
|
||||||
attrShortName.setValue(boatData.get(i).getCountry());
|
|
||||||
boat.setAttributeNode(attrShortName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends boat name attribute of a boat
|
|
||||||
*
|
|
||||||
* @param boat element being added to
|
|
||||||
* @param i boat number
|
|
||||||
*/
|
|
||||||
private void appendBoatName(Element boat, int i) {
|
|
||||||
//BoatName attribute
|
|
||||||
Attr attrBoatName = doc.createAttribute("BoatName");
|
|
||||||
attrBoatName.setValue(boatData.get(i).getName());
|
|
||||||
boat.setAttributeNode(attrBoatName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends gps attributes of a boat
|
|
||||||
*
|
|
||||||
* @param boat element being added to
|
|
||||||
* @param i boat number
|
|
||||||
*/
|
|
||||||
private void appendGPSCoords(Element boat, int i) {
|
|
||||||
//GPSCoord for element
|
|
||||||
Element GPSCoord = doc.createElement("GPSposition");
|
|
||||||
//Z axis attribute
|
|
||||||
Attr attrZCoord = doc.createAttribute("Z");
|
|
||||||
attrZCoord.setValue("0");
|
|
||||||
GPSCoord.setAttributeNode(attrZCoord);
|
|
||||||
|
|
||||||
//Y axis attribute
|
|
||||||
Attr attrYCoord = doc.createAttribute("Y");
|
|
||||||
attrYCoord.setValue(Double.toString(boatData.get(i).getCurrentPosition().getLatitude()));
|
|
||||||
GPSCoord.setAttributeNode(attrYCoord);
|
|
||||||
|
|
||||||
//X axis attribute
|
|
||||||
Attr attrXCoord = doc.createAttribute("X");
|
|
||||||
attrXCoord.setValue(Double.toString(boatData.get(i).getCurrentPosition().getLongitude()));
|
|
||||||
GPSCoord.setAttributeNode(attrXCoord);
|
|
||||||
|
|
||||||
//Write GPSCoord to boat
|
|
||||||
boat.appendChild(GPSCoord);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,250 +0,0 @@
|
|||||||
package seng302.Data;
|
|
||||||
|
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.w3c.dom.Element;
|
|
||||||
import seng302.DataInput.RaceDataSource;
|
|
||||||
import seng302.Exceptions.InvalidRaceDataException;
|
|
||||||
import seng302.Model.Boat;
|
|
||||||
import seng302.Model.CompoundMark;
|
|
||||||
import seng302.Model.GPSCoordinate;
|
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.transform.OutputKeys;
|
|
||||||
import javax.xml.transform.Transformer;
|
|
||||||
import javax.xml.transform.TransformerException;
|
|
||||||
import javax.xml.transform.TransformerFactory;
|
|
||||||
import javax.xml.transform.dom.DOMSource;
|
|
||||||
import javax.xml.transform.stream.StreamResult;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.time.ZonedDateTime;
|
|
||||||
import java.time.format.DateTimeFormatter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by esa46 on 21/04/17.
|
|
||||||
*/
|
|
||||||
public class RaceData {
|
|
||||||
|
|
||||||
private RaceDataSource dataSource;
|
|
||||||
private Document doc;
|
|
||||||
private Element rootElement;
|
|
||||||
private ZonedDateTime creationTimeDate;
|
|
||||||
|
|
||||||
public RaceData(RaceDataSource dataSource) {
|
|
||||||
this.dataSource = dataSource;
|
|
||||||
creationTimeDate = ZonedDateTime.now();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an AC35 officially formatted xml description of a race.
|
|
||||||
*
|
|
||||||
* @return String containing xml-formatted race description
|
|
||||||
*/
|
|
||||||
public String createXML() {
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
//create base xml document
|
|
||||||
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
|
|
||||||
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
|
|
||||||
doc = docBuilder.newDocument();
|
|
||||||
|
|
||||||
//create root element (In this case, "Race")
|
|
||||||
rootElement = doc.createElement("Race");
|
|
||||||
doc.appendChild(rootElement);
|
|
||||||
|
|
||||||
appendChildElements();
|
|
||||||
|
|
||||||
// write the content into xml file
|
|
||||||
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
|
||||||
Transformer transformer = transformerFactory.newTransformer();
|
|
||||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
|
||||||
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
|
|
||||||
DOMSource source = new DOMSource(doc);
|
|
||||||
|
|
||||||
//Serialize document.
|
|
||||||
StringWriter stringWriter = new StringWriter();
|
|
||||||
StreamResult result = new StreamResult(stringWriter);
|
|
||||||
transformer.transform(source, result);
|
|
||||||
|
|
||||||
return stringWriter.toString();
|
|
||||||
|
|
||||||
} catch (ParserConfigurationException pce) {
|
|
||||||
throw new InvalidRaceDataException();
|
|
||||||
} catch (TransformerException tfe) {
|
|
||||||
throw new InvalidRaceDataException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates all necessary child elements and appends them to the xml doc
|
|
||||||
*/
|
|
||||||
private void appendChildElements() {
|
|
||||||
appendRaceId();
|
|
||||||
appendRaceType();
|
|
||||||
appendCreationTimeDate();
|
|
||||||
appendRaceStartTime();
|
|
||||||
appendParticipants();
|
|
||||||
appendCourse();
|
|
||||||
appendCourseLimit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends race id element
|
|
||||||
*/
|
|
||||||
private void appendRaceId() {
|
|
||||||
Element raceIdElement = doc.createElement("RaceID");
|
|
||||||
raceIdElement.appendChild(doc.createTextNode(Integer.toString(dataSource.getRaceId())));
|
|
||||||
rootElement.appendChild(raceIdElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends race type element
|
|
||||||
*/
|
|
||||||
private void appendRaceType() {
|
|
||||||
Element raceTypeElement = doc.createElement("RaceType");
|
|
||||||
raceTypeElement.appendChild(doc.createTextNode(dataSource.getRaceType()));
|
|
||||||
rootElement.appendChild(raceTypeElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends creation time date element
|
|
||||||
*/
|
|
||||||
private void appendCreationTimeDate() {
|
|
||||||
Element creationTimeElement = doc.createElement("CreationTimeDate");
|
|
||||||
|
|
||||||
|
|
||||||
creationTimeElement.appendChild(doc.createTextNode(toTruncatedString(creationTimeDate)));
|
|
||||||
rootElement.appendChild(creationTimeElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends race start time element, which is 3 minutes after the race was created by default
|
|
||||||
*/
|
|
||||||
private void appendRaceStartTime() {
|
|
||||||
Element startTimeElement = doc.createElement("RaceStartTime");
|
|
||||||
startTimeElement.setAttribute("Time", (toTruncatedString(creationTimeDate.plusMinutes(3))));
|
|
||||||
startTimeElement.setAttribute("Postpone", "false");
|
|
||||||
rootElement.appendChild(startTimeElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends participants element
|
|
||||||
*/
|
|
||||||
private void appendParticipants() {
|
|
||||||
Element participantsElement = doc.createElement("Participants");
|
|
||||||
|
|
||||||
for (Boat boat : dataSource.getBoats()) {
|
|
||||||
Element yachtElement = doc.createElement("Yacht");
|
|
||||||
yachtElement.setAttribute("SourceID", boat.getSourceID() + "");
|
|
||||||
participantsElement.appendChild(yachtElement);
|
|
||||||
}
|
|
||||||
rootElement.appendChild(participantsElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends course elements
|
|
||||||
*/
|
|
||||||
private void appendCourse() {
|
|
||||||
Element courseElement = doc.createElement("Course");
|
|
||||||
Element compoundMarkSeqElement = doc.createElement("CompoundMarkSequence");
|
|
||||||
|
|
||||||
int i = 1;
|
|
||||||
for (CompoundMark compoundMark : dataSource.getCompoundMarks()) {
|
|
||||||
|
|
||||||
courseElement.appendChild(createCompoundMarker(compoundMark, i));
|
|
||||||
compoundMarkSeqElement.appendChild(createCornerElement(i));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
rootElement.appendChild(compoundMarkSeqElement);
|
|
||||||
rootElement.appendChild(courseElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a mark element for insertion in a coumpound mark element
|
|
||||||
*
|
|
||||||
* @param marker GPS coordinates of the mark
|
|
||||||
* @return Element mark element
|
|
||||||
*/
|
|
||||||
private Element createMark(GPSCoordinate marker) {
|
|
||||||
Element mark = doc.createElement("Mark");
|
|
||||||
mark.setAttribute("TargetLat", marker.getLatitude() + "");
|
|
||||||
mark.setAttribute("TargetLng", marker.getLongitude() + "");
|
|
||||||
return mark;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a compound compoundMark holding one or two marks,and a sequence number
|
|
||||||
*
|
|
||||||
* @param compoundMark compoundMark
|
|
||||||
* @param i sequence number
|
|
||||||
* @return Element compound mark element
|
|
||||||
*/
|
|
||||||
private Element createCompoundMarker(CompoundMark compoundMark, int i) {
|
|
||||||
Element compoundMarkElement = doc.createElement("CompoundMark");
|
|
||||||
compoundMarkElement.setAttribute("CompoundMarkID", i + "");
|
|
||||||
compoundMarkElement.setAttribute("Name", compoundMark.getName());
|
|
||||||
|
|
||||||
compoundMarkElement.appendChild(createMark(compoundMark.getMark1()));
|
|
||||||
|
|
||||||
if (!(compoundMark.getMark1().equals(compoundMark.getMark2()))) {
|
|
||||||
compoundMarkElement.appendChild(createMark(compoundMark.getMark2()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return compoundMarkElement;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a corner element
|
|
||||||
*
|
|
||||||
* @param i sequence number
|
|
||||||
* @return Element corner element
|
|
||||||
*/
|
|
||||||
private Element createCornerElement(int i) {
|
|
||||||
Element cornerElement = doc.createElement("Corner");
|
|
||||||
cornerElement.setAttribute("SeqID", i + "");
|
|
||||||
cornerElement.setAttribute("CompoundMarkID", i + "");
|
|
||||||
|
|
||||||
return cornerElement;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends course limits element (boundaries)
|
|
||||||
*/
|
|
||||||
private void appendCourseLimit() {
|
|
||||||
int j = 1;
|
|
||||||
|
|
||||||
Element courseLimitElement = doc.createElement("CourseLimit");
|
|
||||||
for (GPSCoordinate coordinate : dataSource.getBoundary()) {
|
|
||||||
Element limitElement = doc.createElement("Limit");
|
|
||||||
limitElement.setAttribute("SeqID", j + "");
|
|
||||||
limitElement.setAttribute("Lat", coordinate.getLatitude() + "");
|
|
||||||
limitElement.setAttribute("Lon", coordinate.getLongitude() + "");
|
|
||||||
|
|
||||||
courseLimitElement.appendChild(limitElement);
|
|
||||||
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
package seng302.Data;
|
|
||||||
|
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.w3c.dom.Element;
|
|
||||||
import seng302.DataInput.RegattaDataSource;
|
|
||||||
import seng302.Exceptions.InvalidRegattaDataException;
|
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.transform.OutputKeys;
|
|
||||||
import javax.xml.transform.Transformer;
|
|
||||||
import javax.xml.transform.TransformerException;
|
|
||||||
import javax.xml.transform.TransformerFactory;
|
|
||||||
import javax.xml.transform.dom.DOMSource;
|
|
||||||
import javax.xml.transform.stream.StreamResult;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by esa46 on 25/04/17.
|
|
||||||
*/
|
|
||||||
public class RegattaData {
|
|
||||||
|
|
||||||
|
|
||||||
private RegattaDataSource regattaDataSource;
|
|
||||||
private Document doc;
|
|
||||||
private Element rootElement;
|
|
||||||
|
|
||||||
public RegattaData(RegattaDataSource regattaDataSource) {
|
|
||||||
this.regattaDataSource = regattaDataSource;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an AC35 officially formatted xml description of a regatta
|
|
||||||
*
|
|
||||||
* @return String containing xml-formatted regatta description
|
|
||||||
*/
|
|
||||||
public String createXML() {
|
|
||||||
|
|
||||||
try {
|
|
||||||
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
|
|
||||||
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
|
|
||||||
|
|
||||||
//root element
|
|
||||||
doc = docBuilder.newDocument();
|
|
||||||
rootElement = doc.createElement("RegattaConfig");
|
|
||||||
doc.appendChild(rootElement);
|
|
||||||
|
|
||||||
appendChildElements();
|
|
||||||
|
|
||||||
// write the content into xml file
|
|
||||||
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
|
||||||
Transformer transformer = transformerFactory.newTransformer();
|
|
||||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
|
||||||
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
|
|
||||||
DOMSource source = new DOMSource(doc);
|
|
||||||
|
|
||||||
//Serialize document.
|
|
||||||
StringWriter stringWriter = new StringWriter();
|
|
||||||
StreamResult result = new StreamResult(stringWriter);
|
|
||||||
transformer.transform(source, result);
|
|
||||||
|
|
||||||
return stringWriter.toString();
|
|
||||||
|
|
||||||
|
|
||||||
} catch (ParserConfigurationException pce) {
|
|
||||||
throw new InvalidRegattaDataException();
|
|
||||||
} catch (TransformerException tfe) {
|
|
||||||
throw new InvalidRegattaDataException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates all necessary child elements and appends them to the xml doc
|
|
||||||
*/
|
|
||||||
private void appendChildElements() {
|
|
||||||
appendRegattaID();
|
|
||||||
appendRegattaName();
|
|
||||||
appendCourseName();
|
|
||||||
appendCentralLatitude();
|
|
||||||
appendCentralLongitude();
|
|
||||||
appendCentralAltitude();
|
|
||||||
appedUtcOffset();
|
|
||||||
appendMagneticVariation();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends regatta id element
|
|
||||||
*/
|
|
||||||
private void appendRegattaID() {
|
|
||||||
//regattaID element
|
|
||||||
Element regattaID = doc.createElement("RegattaID");
|
|
||||||
regattaID.appendChild(doc.createTextNode(Integer.toString(regattaDataSource.getRegatta().getRegattaID())));
|
|
||||||
rootElement.appendChild(regattaID);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends regatta name element
|
|
||||||
*/
|
|
||||||
private void appendRegattaName() {
|
|
||||||
//regattaName element
|
|
||||||
Element regattaName = doc.createElement("RegattaName");
|
|
||||||
regattaName.appendChild(doc.createTextNode(regattaDataSource.getRegatta().getRegattaName()));
|
|
||||||
rootElement.appendChild(regattaName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends course name element
|
|
||||||
*/
|
|
||||||
private void appendCourseName() {
|
|
||||||
//courseName element
|
|
||||||
Element courseName = doc.createElement("CourseName");
|
|
||||||
courseName.appendChild(doc.createTextNode(regattaDataSource.getRegatta().getCourseName()));
|
|
||||||
rootElement.appendChild(courseName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends central latitude element
|
|
||||||
*/
|
|
||||||
private void appendCentralLatitude() {
|
|
||||||
//centralLatitude element
|
|
||||||
Element centralLat = doc.createElement("CentralLatitude");
|
|
||||||
centralLat.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getCentralLatitude())));
|
|
||||||
rootElement.appendChild(centralLat);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends central longitude element
|
|
||||||
*/
|
|
||||||
private void appendCentralLongitude() {
|
|
||||||
//centralLongitude element
|
|
||||||
Element centralLong = doc.createElement("CentralLongitude");
|
|
||||||
centralLong.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getCentralLongitude())));
|
|
||||||
rootElement.appendChild(centralLong);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends central altitude element
|
|
||||||
*/
|
|
||||||
private void appendCentralAltitude() {
|
|
||||||
//centralAltitude element
|
|
||||||
Element centralAlt = doc.createElement("CentralAltitude");
|
|
||||||
centralAlt.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getCentralAltitude())));
|
|
||||||
rootElement.appendChild(centralAlt);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends utc offset element
|
|
||||||
*/
|
|
||||||
private void appedUtcOffset() {
|
|
||||||
//utcOffset element
|
|
||||||
Element utcOffset = doc.createElement("UtcOffset");
|
|
||||||
utcOffset.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getUtcOffset())));
|
|
||||||
rootElement.appendChild(utcOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and appends magnetic variation element
|
|
||||||
*/
|
|
||||||
private void appendMagneticVariation() {
|
|
||||||
//magneticVariation element
|
|
||||||
Element magneticVariation = doc.createElement("MagneticVariation");
|
|
||||||
magneticVariation.appendChild(doc.createTextNode(Double.toString(regattaDataSource.getRegatta().getMagneticVariation())));
|
|
||||||
rootElement.appendChild(magneticVariation);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -7,10 +7,6 @@ import seng302.MockOutput;
|
|||||||
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import java.io.*;
|
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.text.ParseException;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
@@ -21,59 +17,37 @@ import java.time.format.DateTimeFormatter;
|
|||||||
*/
|
*/
|
||||||
public class Event {
|
public class Event {
|
||||||
|
|
||||||
RaceDataSource raceDataSource;
|
|
||||||
String raceXML;
|
String raceXML;
|
||||||
RegattaDataSource regattaDataSource;
|
|
||||||
String regattaXML;
|
String regattaXML;
|
||||||
BoatDataSource boatDataSource;
|
|
||||||
String boatXML;
|
String boatXML;
|
||||||
MockOutput mockOutput;
|
MockOutput mockOutput;
|
||||||
|
|
||||||
|
|
||||||
public Event(String raceXML, String regattaXML, String boatXML) {
|
public Event(String raceXML, String regattaXML, String boatXML) {
|
||||||
|
|
||||||
this.raceXML = getRaceAtCurrentTime(raceXML);
|
this.raceXML = getRaceXMLAtCurrentTime(raceXML);
|
||||||
this.boatXML = boatXML;
|
this.boatXML = boatXML;
|
||||||
this.regattaXML = regattaXML;
|
this.regattaXML = regattaXML;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
boatDataSource = new BoatXMLReader(boatXML);
|
|
||||||
raceDataSource = new RaceXMLReader(this.raceXML, boatDataSource);
|
|
||||||
regattaDataSource = new RegattaXMLReader(regattaXML);
|
|
||||||
|
|
||||||
mockOutput = new MockOutput();
|
mockOutput = new MockOutput();
|
||||||
new Thread(mockOutput).start();
|
new Thread(mockOutput).start();
|
||||||
|
|
||||||
} catch (ParserConfigurationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
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
|
* Send the initial race data and then begin race simulation
|
||||||
*/
|
*/
|
||||||
public void start() {
|
public void start() {
|
||||||
|
try {
|
||||||
sendXMLs();
|
sendXMLs();
|
||||||
int scaleFactor = 10;//TEMP - was 15.
|
Race newRace = new Race(new RaceXMLReader(this.raceXML, new BoatXMLReader(boatXML)), mockOutput);
|
||||||
Race newRace = new Race(raceDataSource, scaleFactor, mockOutput);
|
|
||||||
new Thread((newRace)).start();
|
new Thread((newRace)).start();
|
||||||
}
|
|
||||||
|
|
||||||
|
} catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void sendXMLs() {
|
private void sendXMLs() {
|
||||||
|
|
||||||
@@ -89,8 +63,6 @@ public class Event {
|
|||||||
System.out.println("Sending Boat");
|
System.out.println("Sending Boat");
|
||||||
mockOutput.setBoatsXml(boatXML);
|
mockOutput.setBoatsXml(boatXML);
|
||||||
mockOutput.parseXMLString(boatXML, 26);
|
mockOutput.parseXMLString(boatXML, 26);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -105,4 +77,10 @@ public class Event {
|
|||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getRaceXMLAtCurrentTime(String raceXML) {
|
||||||
|
ZonedDateTime creationTime = ZonedDateTime.now();
|
||||||
|
return raceXML.replace("CREATION_TIME", toTruncatedString(creationTime))
|
||||||
|
.replace("START_TIME", toTruncatedString(creationTime.plusMinutes(3)));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,22 +47,20 @@ public class Race implements Runnable {
|
|||||||
*
|
*
|
||||||
* @param boats Takes in an array of boats that are participating in the race.
|
* @param boats Takes in an array of boats that are participating in the race.
|
||||||
* @param legs Number of marks in order that the boats pass in order to complete the race.
|
* @param legs Number of marks in order that the boats pass in order to complete the race.
|
||||||
* @param scaleFactor for race
|
|
||||||
*/
|
*/
|
||||||
public Race(List<Boat> boats, List<Leg> legs, int raceID, int scaleFactor, MockOutput mockOutput) {
|
public Race(List<Boat> boats, List<Leg> legs, int raceID, MockOutput mockOutput) {
|
||||||
|
|
||||||
this.startingBoats = FXCollections.observableArrayList(boats);
|
this.startingBoats = FXCollections.observableArrayList(boats);
|
||||||
this.legs = legs;
|
this.legs = legs;
|
||||||
this.legs.add(new Leg("Finish", this.legs.size()));
|
this.legs.add(new Leg("Finish", this.legs.size()));
|
||||||
this.raceId = raceID;
|
this.raceId = raceID;
|
||||||
this.scaleFactor = scaleFactor;
|
|
||||||
this.mockOutput = mockOutput;
|
this.mockOutput = mockOutput;
|
||||||
|
|
||||||
this.startTime = System.currentTimeMillis() + (this.PRERACE_TIME / this.scaleFactor);
|
this.startTime = System.currentTimeMillis() + (this.PRERACE_TIME / this.scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Race(RaceDataSource raceData, int scaleFactor, MockOutput mockOutput) {
|
public Race(RaceDataSource raceData, MockOutput mockOutput) {
|
||||||
this(raceData.getBoats(), raceData.getLegs(), raceData.getRaceId(), scaleFactor, mockOutput);
|
this(raceData.getBoats(), raceData.getLegs(), raceData.getRaceId(), mockOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user