Merge remote-tracking branch 'remotes/origin/master' into wind_(story53)

# Conflicts:
#	racevisionGame/src/main/java/mock/app/Event.java
#	racevisionGame/src/main/java/mock/model/MockRace.java
This commit is contained in:
hba56
2017-09-05 23:37:17 +12:00
73 changed files with 2721 additions and 749 deletions
@@ -22,4 +22,16 @@ public interface BoatDataSource {
* @return Map between source ID and mark.
*/
Map<Integer, Mark> getMarkerBoats();
/**
* Returns the sequence number associated with this data source. Used to indicate when it has changed.
* @return Sequence number.
*/
int getSequenceNumber();
/**
* Increments the sequence number for this data source. Used to indicate that it has changed.
*/
void incrementSequenceNumber();
}
@@ -29,6 +29,8 @@ public class BoatXMLReader extends XMLReader implements BoatDataSource {
private final Map<Integer, Mark> markerMap = new HashMap<>();
private int sequenceNumber = 0;
/**
* Constructor for Boat XML using a file.
*
@@ -174,4 +176,15 @@ public class BoatXMLReader extends XMLReader implements BoatDataSource {
public Map<Integer, Mark> getMarkerBoats() {
return markerMap;
}
@Override
public int getSequenceNumber() {
return sequenceNumber;
}
@Override
public void incrementSequenceNumber() {
sequenceNumber++;
}
}
@@ -22,6 +22,8 @@ public class EmptyBoatDataSource implements BoatDataSource {
private final Map<Integer, Mark> markerMap = new HashMap<>();
private int sequenceNumber = 0;
public EmptyBoatDataSource() {
}
@@ -44,4 +46,15 @@ public class EmptyBoatDataSource implements BoatDataSource {
public Map<Integer, Mark> getMarkerBoats() {
return markerMap;
}
@Override
public int getSequenceNumber() {
return sequenceNumber;
}
@Override
public void incrementSequenceNumber() {
sequenceNumber++;
}
}
@@ -2,8 +2,10 @@ package shared.dataInput;
import network.Messages.Enums.RaceTypeEnum;
import shared.model.CompoundMark;
import shared.model.Corner;
import shared.model.GPSCoordinate;
import shared.model.Leg;
import shared.xml.Race.XMLCorner;
import java.time.ZonedDateTime;
import java.util.ArrayList;
@@ -48,6 +50,12 @@ public class EmptyRaceDataSource implements RaceDataSource {
*/
private final List<Leg> legs = new ArrayList<>();
/**
* Corners in race.
*/
private final List<Corner> corners = new ArrayList<>();
/**
* The time that the race.xml file was created.
@@ -76,6 +84,8 @@ public class EmptyRaceDataSource implements RaceDataSource {
private RaceTypeEnum raceType = RaceTypeEnum.NOT_A_RACE_TYPE;
private int sequenceNumber = 0;
public EmptyRaceDataSource() {
}
@@ -98,6 +108,11 @@ public class EmptyRaceDataSource implements RaceDataSource {
return legs;
}
@Override
public List<Corner> getCorners() {
return corners;
}
public List<CompoundMark> getCompoundMarks() {
return new ArrayList<>(compoundMarkMap.values());
}
@@ -126,4 +141,14 @@ public class EmptyRaceDataSource implements RaceDataSource {
public List<Integer> getParticipants() {
return participants;
}
@Override
public int getSequenceNumber() {
return sequenceNumber;
}
@Override
public void incrementSequenceNumber() {
sequenceNumber++;
}
}
@@ -60,6 +60,8 @@ public class EmptyRegattaDataSource implements RegattaDataSource {
private int sequenceNumber = 0;
public EmptyRegattaDataSource() {
}
@@ -119,4 +121,15 @@ public class EmptyRegattaDataSource implements RegattaDataSource {
public GPSCoordinate getGPSCoordinate() {
return new GPSCoordinate(centralLatitude, centralLongitude);
}
@Override
public int getSequenceNumber() {
return sequenceNumber;
}
@Override
public void incrementSequenceNumber() {
sequenceNumber++;
}
}
@@ -2,8 +2,10 @@ package shared.dataInput;
import network.Messages.Enums.RaceTypeEnum;
import shared.model.CompoundMark;
import shared.model.Corner;
import shared.model.GPSCoordinate;
import shared.model.Leg;
import shared.xml.Race.XMLCorner;
import java.time.ZonedDateTime;
import java.util.List;
@@ -27,6 +29,12 @@ public interface RaceDataSource {
*/
List<Leg> getLegs();
/**
* Returns the list of corners in the race - two adjacent corners form a leg.
* @return List of corners in race.
*/
List<Corner> getCorners();
/**
* Returns a list of coordinates representing the boundary of the race.
* @return The boundary of the race.
@@ -83,4 +91,16 @@ public interface RaceDataSource {
* @return Bottom right GPS coordinate.
*/
GPSCoordinate getMapBottomRight();
/**
* Returns the sequence number associated with this data source. Used to indicate when it has changed.
* @return Sequence number.
*/
int getSequenceNumber();
/**
* Increments the sequence number for this data source. Used to indicate that it has changed.
*/
void incrementSequenceNumber();
}
@@ -84,6 +84,8 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
private RaceTypeEnum raceType;
private int sequenceNumber = 0;
/**
@@ -343,7 +345,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
int cornerSeq = Integer.parseInt(getAttribute(cornerElement, "SeqID"));
cornersList.add(new Corner(cornerID, cornerSeq, "SP", 3));
cornersList.add(new Corner(cornerID, cornerSeq, cornerRounding, 3));
//Gets the CompoundMark associated with this corner.
CompoundMark lastCompoundMark = this.compoundMarkMap.get(cornerID);
@@ -366,7 +368,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
cornerSeq = Integer.parseInt(getAttribute(cornerElement, "SeqID"));
cornersList.add(new Corner(cornerID, cornerSeq, "Port", 3));
cornersList.add(new Corner(cornerID, cornerSeq, getCompoundMarkRounding(cornerElement), 3));
//gets the Rounding of this corner element
cornerRounding = getCompoundMarkRounding(cornerElement);
@@ -488,7 +490,17 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
return participants;
}
public List<Corner> getCornersList() {
public List<Corner> getCorners() {
return cornersList;
}
@Override
public int getSequenceNumber() {
return sequenceNumber;
}
@Override
public void incrementSequenceNumber() {
sequenceNumber++;
}
}
@@ -66,5 +66,15 @@ public interface RegattaDataSource {
float getMagneticVariation();
/**
* Returns the sequence number associated with this data source. Used to indicate when it has changed.
* @return Sequence number.
*/
int getSequenceNumber();
/**
* Increments the sequence number for this data source. Used to indicate that it has changed.
*/
void incrementSequenceNumber();
}
@@ -59,6 +59,8 @@ public class RegattaXMLReader extends XMLReader implements RegattaDataSource {
private float magneticVariation;
private int sequenceNumber = 0;
/**
* Constructor for Regatta XML using a file.
@@ -209,4 +211,14 @@ public class RegattaXMLReader extends XMLReader implements RegattaDataSource {
public GPSCoordinate getGPSCoordinate() {
return new GPSCoordinate(centralLatitude, centralLongitude);
}
@Override
public int getSequenceNumber() {
return sequenceNumber;
}
@Override
public void incrementSequenceNumber() {
sequenceNumber++;
}
}
@@ -46,4 +46,19 @@ public enum RoundingType {
return null;
}
}
public static String getStringOf(RoundingType value) {
switch (value) {
case Port:
return "Port";
case Starboard:
return "Starboard";
case SP:
return "SP";
case PS:
return "PS";
default:
return null;
}
}
}
@@ -33,20 +33,23 @@ public class Constants {
* Frame periods are multiplied by this to get the amount of time a single frame represents.
* E.g., frame period = 20ms, scale = 5, frame represents 20 * 5 = 100ms, and so boats are simulated for 100ms, even though only 20ms actually occurred.
*/
public static final int RaceTimeScale = 10;
public static final int RaceTimeScale = 2;//10;
/**
* The race pre-start time, in milliseconds. 3 minutes.
*/
public static final long RacePreStartTime = 1 * 10 * 1000;
public static final long RacePreStartTime = 3 * 60 * 1000;
/**
* The race preparatory time, in milliseconds. 1 minutes.
* The race preparatory time, in milliseconds. 1 minute.
*/
public static final long RacePreparatoryTime = 1 * 60 * 1000;
/**
* The number of milliseconds in one hour.
* <br>
@@ -1,318 +0,0 @@
package shared.model;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import mock.model.collider.ColliderRegistry;
import network.Messages.Enums.RaceStatusEnum;
import network.Messages.Enums.RaceTypeEnum;
import shared.dataInput.BoatDataSource;
import shared.dataInput.RaceDataSource;
import shared.dataInput.RegattaDataSource;
import java.util.List;
/**
* Represents a yacht race.
* Has a course, state, wind, boundaries, etc.... Boats are added by inheriting classes (see {@link Boat}, {@link mock.model.MockBoat}, {@link visualiser.model.VisualiserBoat}.
*/
public abstract class Race {
/**
* The source of race related data.
*/
protected RaceDataSource raceDataSource;
/**
* The source of boat related data.
*/
protected BoatDataSource boatDataSource;
/**
* The source of regatta related data.
*/
protected RegattaDataSource regattaDataSource;
/**
* A list of compound marks in the race.
*/
protected List<CompoundMark> compoundMarks;
/**
* A list of legs in the race.
*/
protected List<Leg> legs;
/**
* A list of coordinates describing the boundary of the course.
*/
protected List<GPSCoordinate> boundary;
/**
* The clock which tracks the race's start time, current time, and elapsed duration.
*/
protected RaceClock raceClock;
/**
* The race ID of the course.
*/
protected int raceId;
/**
* The name of the regatta.
*/
protected String regattaName;
/**
* The current status of the race.
*/
protected RaceStatusEnum raceStatusEnum;
/**
* The type of race this is.
*/
protected RaceTypeEnum raceType;
/**
* The race's wind.
*/
protected Property<Wind> raceWind = new SimpleObjectProperty<>();
/**
* Registry for all collider object in this race
*/
protected ColliderRegistry colliderRegistry;
/**
* The number of frames per second.
* We essentially track the number of frames generated per second, over a one second period. When {@link #lastFpsResetTime} reaches 1 second, currentFps is reset.
*/
private int currentFps = 0;
/**
* The number of frames per second we generated over the last 1 second period.
*/
private IntegerProperty lastFps = new SimpleIntegerProperty(0);
/**
* The time, in milliseconds, since we last reset our {@link #currentFps} counter.
*/
private long lastFpsResetTime;
/**
* Constructs a race object with a given BoatDataSource, RaceDataSource, and RegattaDataSource.
* @param boatDataSource Data source for boat related data (yachts and marker boats).
* @param raceDataSource Data source for race related data (participating boats, legs, etc...).
* @param regattaDataSource Data source for race related data (course name, location, timezone, etc...).
*/
public Race(BoatDataSource boatDataSource, RaceDataSource raceDataSource, RegattaDataSource regattaDataSource) {
//Keep a reference to data sources.
this.raceDataSource = raceDataSource;
this.boatDataSource = boatDataSource;
this.regattaDataSource = regattaDataSource;
//Marks.
this.compoundMarks = raceDataSource.getCompoundMarks();
//Boundaries.
this.boundary = raceDataSource.getBoundary();
//Legs.
this.useLegsList(raceDataSource.getLegs());
//Race ID.
this.raceId = raceDataSource.getRaceId();
//Regatta name.
this.regattaName = regattaDataSource.getRegattaName();
//Race clock.
this.raceClock = new RaceClock(this.raceDataSource.getStartDateTime());
//Race status.
this.setRaceStatusEnum(RaceStatusEnum.NOT_ACTIVE);
//Race type.
this.raceType = raceDataSource.getRaceType();
//Wind.
this.setWind(Bearing.fromDegrees(0), 0);
// Set up colliders
this.colliderRegistry = new ColliderRegistry();
for(CompoundMark mark: compoundMarks) {
colliderRegistry.addCollider(mark.getMark1());
if(mark.getMark2() != null) colliderRegistry.addCollider(mark.getMark2());
}
}
public ColliderRegistry getColliderRegistry() {
return colliderRegistry;
}
/**
* Initialise the boats in the race.
* This sets their starting positions and current legs.
*/
protected abstract void initialiseBoats();
/**
* Updates the race to use a new list of legs, and adds a dummy "Finish" leg at the end.
* @param legs The new list of legs to use.
*/
protected void useLegsList(List<Leg> legs) {
//We add a "dummy" leg at the end of the race.
this.legs = legs;
this.legs.add(new Leg("Finish", this.legs.size()));
}
/**
* Determines whether or not a specific leg is the last leg in the race.
* @param leg The leg to check.
* @return Returns true if it is the last, false otherwise.
*/
protected boolean isLastLeg(Leg leg) {
//Get the last leg.
Leg lastLeg = this.legs.get(this.legs.size() - 1);
//Check its ID.
int lastLegID = lastLeg.getLegNumber();
//Get the specified leg's ID.
int legID = leg.getLegNumber();
//Check if they are the same.
return legID == lastLegID;
}
/**
* Returns the current race status.
* @return The current race status.
*/
public RaceStatusEnum getRaceStatusEnum() {
return raceStatusEnum;
}
/**
* Sets the current race status.
* @param raceStatusEnum The new status of the race.
*/
public void setRaceStatusEnum(RaceStatusEnum raceStatusEnum) {
this.raceStatusEnum = raceStatusEnum;
}
/**
* Returns the type of race this is.
* @return The type of race this is.
*/
public RaceTypeEnum getRaceType() {
return raceType;
}
/**
* Returns the name of the regatta.
* @return The name of the regatta.
*/
public String getRegattaName() {
return regattaName;
}
/**
* Updates the race to have a specified wind bearing and speed.
* @param windBearing New wind bearing.
* @param windSpeedKnots New wind speed, in knots.
*/
protected void setWind(Bearing windBearing, double windSpeedKnots) {
Wind wind = new Wind(windBearing, windSpeedKnots);
setWind(wind);
}
/**
* Updates the race to have a specified wind (bearing and speed).
* @param wind New wind.
*/
protected void setWind(Wind wind) {
this.raceWind.setValue(wind);
}
/**
* Returns the wind bearing.
* @return The wind bearing.
*/
public Bearing getWindDirection() {
return raceWind.getValue().getWindDirection();
}
/**
* Returns the wind speed.
* Measured in knots.
* @return The wind speed.
*/
public double getWindSpeed() {
return raceWind.getValue().getWindSpeed();
}
/**
* Returns the RaceClock for this race.
* This is used to track the start time, current time, and elapsed duration of the race.
* @return The RaceClock for the race.
*/
public RaceClock getRaceClock() {
return raceClock;
}
/**
* Returns the RaceDataSource used for the race.
* @return The RaceDataSource used for the race.
*/
public RaceDataSource getRaceDataSource() {
return raceDataSource;
}
/**
* Returns the number of legs in the race.
* @return The number of legs in the race.
*/
public int getLegCount() {
//We minus one, as we have added an extra "dummy" leg.
return legs.size() - 1;
}
/**
* Returns the race boundary.
* @return The race boundary.
*/
public List<GPSCoordinate> getBoundary() {
return boundary;
}
/**
* Returns the marks of the race.
* @return Marks of the race.
*/
public List<CompoundMark> getCompoundMarks() {
return compoundMarks;
}
/**
* Returns the legs of the race.
* @return Legs of the race.
*/
public List<Leg> getLegs() {
return legs;
}
/**
* Returns the fps property.
* @return The fps property.
*/
public IntegerProperty fpsProperty() {
return lastFps;
}
/**
* Increments the FPS counter, and adds timePeriod milliseconds to our FPS reset timer.
* @param timePeriod Time, in milliseconds, to add to {@link #lastFpsResetTime}.
*/
protected void incrementFps(long timePeriod) {
//Increment.
this.currentFps++;
//Add period to timer.
this.lastFpsResetTime += timePeriod;
//If we have reached 1 second period, snapshot the framerate and reset.
if (this.lastFpsResetTime > 1000) {
this.lastFps.set(this.currentFps);
this.currentFps = 0;
this.lastFpsResetTime = 0;
}
}
public int getRaceId() {
return raceId;
}
}
@@ -188,7 +188,20 @@ public abstract class RaceState {
* @return List of mark boats.
*/
public List<Mark> getMarks() {
return new ArrayList<>(boatDataSource.getMarkerBoats().values());
//BoatDataSource contains a collection of Marks, and RaceDataSource contains a collection of Compound marks (which contain marks). RaceDataSource is the "definitive" source of mark data.
List<Mark> marks = new ArrayList<>(getCompoundMarks().size() * 2);
for (CompoundMark compoundMark : getCompoundMarks()) {
if (compoundMark.getMark1() != null) {
marks.add(compoundMark.getMark1());
}
if (compoundMark.getMark2() != null) {
marks.add(compoundMark.getMark2());
}
}
return marks;
}
/**
@@ -0,0 +1,131 @@
package shared.xml.Race;
import shared.dataInput.RaceDataSource;
import shared.enums.RoundingType;
import shared.model.CompoundMark;
import shared.model.Corner;
import shared.model.GPSCoordinate;
import shared.model.Leg;
import shared.xml.XMLUtilities;
import javax.xml.bind.JAXBException;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
/**
* Has functions to convert a {@link shared.dataInput.RaceDataSource} to an {@link XMLRace} object.
*/
public class RaceDataSourceToXML {
/**
* Converts a race data source to an XMLRace object.
* @param raceDataSource The data source to convert.
* @return The XMLRace file.
*/
public static XMLRace toXML(RaceDataSource raceDataSource) {
//Kind of ugly. Could be refactored/split up a bit.
XMLRace race = new XMLRace();
race.setRaceID(raceDataSource.getRaceId());
race.setRaceType(raceDataSource.getRaceType().toString());
race.setCreationTimeDate(raceDataSource.getCreationDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")));
XMLRaceStartTime startTime = new XMLRaceStartTime();
startTime.setPostpone(String.valueOf(raceDataSource.getPostponed()));
startTime.setTime(raceDataSource.getStartDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")));
race.setRaceStartTime(startTime);
XMLParticipants participants = new XMLParticipants();
participants.yacht = new ArrayList<>();
for (int i : raceDataSource.getParticipants()) {
XMLYacht yacht = new XMLYacht();
yacht.setSourceID(i);
participants.yacht.add(yacht);
}
race.setParticipants(participants);
XMLCourseLimit courseLimit = new XMLCourseLimit();
courseLimit.limit = new ArrayList<>();
for (int i = 0; i < raceDataSource.getBoundary().size(); i++) {
XMLLimit limit = new XMLLimit();
limit.setLat(raceDataSource.getBoundary().get(i).getLatitude());
limit.setLon(raceDataSource.getBoundary().get(i).getLongitude());
limit.setSeqID(i + 1);
courseLimit.limit.add(limit);
}
race.setCourseLimit(courseLimit);
XMLCourse course = new XMLCourse();
course.compoundMark = new ArrayList<>();
for (CompoundMark compoundMark : raceDataSource.getCompoundMarks()) {
XMLCompoundMark xmlCompoundMark = new XMLCompoundMark();
xmlCompoundMark.setCompoundMarkID(compoundMark.getCompoundMarkID());
xmlCompoundMark.setName(compoundMark.getName());
if (compoundMark.getMark1() != null) {
XMLMark xmlMark = new XMLMark();
xmlMark.setName(compoundMark.getMark1().getName());
xmlMark.setSourceID(compoundMark.getMark1().getSourceID());
xmlMark.setSeqId(1);
xmlMark.setTargetLat(compoundMark.getMark1().getPosition().getLatitude());
xmlMark.setTargetLng(compoundMark.getMark1().getPosition().getLongitude());
xmlCompoundMark.getMark().add(xmlMark);
}
if (compoundMark.getMark2() != null) {
XMLMark xmlMark = new XMLMark();
xmlMark.setName(compoundMark.getMark2().getName());
xmlMark.setSourceID(compoundMark.getMark2().getSourceID());
xmlMark.setSeqId(2);
xmlMark.setTargetLat(compoundMark.getMark2().getPosition().getLatitude());
xmlMark.setTargetLng(compoundMark.getMark2().getPosition().getLongitude());
xmlCompoundMark.getMark().add(xmlMark);
}
course.compoundMark.add(xmlCompoundMark);
}
race.setCourse(course);
XMLCompoundMarkSequence compoundMarkSequence = new XMLCompoundMarkSequence();
compoundMarkSequence.corner = new ArrayList<>();
for (Corner corner : raceDataSource.getCorners()) {
XMLCorner xmlCorner = new XMLCorner();
xmlCorner.setZoneSize(corner.getZoneSize());
xmlCorner.setSeqID(corner.getSeqID());
xmlCorner.setCompoundMarkID(corner.getCompoundMarkID());
xmlCorner.setRounding(corner.getRounding());
compoundMarkSequence.corner.add(xmlCorner);
}
race.setCompoundMarkSequence(compoundMarkSequence);
return race;
}
/**
* Converts a race data source to an xml string.
* @param raceDataSource Data source to convert.
* @return String containing xml file.
* @throws JAXBException Thrown if it cannot be converted.
*/
public static String toString(RaceDataSource raceDataSource) throws JAXBException {
XMLRace race = toXML(raceDataSource);
return XMLUtilities.classToXML(race);
}
}
@@ -20,10 +20,17 @@ import java.io.*;
import java.net.URL;
/**
* Created by fwy13 on 13/08/17.
* Contains utility functions to convert between xml files and xml class objects.
*/
public class XMLUtilities {
/**
* Converts an XML class object to an XML string.
* @param o The XML class object to convert.
* @return String containing the serialised XML data.
* @throws JAXBException Thrown if the object is cannot be serialised to XML.
*/
public static String classToXML(Object o) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(o.getClass());
Marshaller jaxbMarshaller = context.createMarshaller();
@@ -49,14 +56,26 @@ public class XMLUtilities {
return xmlToClass(document, schemaURL, c);
}
public static Object xmlToClass(InputStream i, URL schemaURL, Class c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
/**
* Converts an XML file to an XML class (e.g., {@link shared.xml.Race.XMLRace}).
* @param i The input stream for the XML file.
* @param schemaURL URL for the XML schema.
* @param c The XML class to convert to.
* @param <T> The XML class to convert to.
* @return The XML class object.
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
* @throws JAXBException
*/
public static <T> T xmlToClass(InputStream i, URL schemaURL, Class<T> c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(i);
return xmlToClass(document, schemaURL, c);
}
public static Object xmlToClass(Document document, URL schemaURL, Class c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
public static <T> T xmlToClass(Document document, URL schemaURL, Class<T> c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
JAXBContext jc = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = jc.createUnmarshaller();
@@ -64,7 +83,7 @@ public class XMLUtilities {
Schema schema = sf.newSchema(schemaURL);
unmarshaller.setSchema(schema);
return unmarshaller.unmarshal(new DOMSource(document));
return (T) unmarshaller.unmarshal(new DOMSource(document));
}
public static boolean validateXML(String file, URL schemaURL){
@@ -0,0 +1,533 @@
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.09.01 at 11:12:43 PM NZST
//
package shared.xml.boats;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="Boats"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="Boat" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="GPSposition"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="X" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Y" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Z" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;/sequence&gt;
* &lt;attribute name="Type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="BoatName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="HullNum" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="ShapeID" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="StoweName" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;/sequence&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;/sequence&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"boats"
})
@XmlRootElement(name = "BoatConfig")
public class BoatConfig {
@XmlElement(name = "Boats", required = true)
protected BoatConfig.Boats boats;
/**
* Gets the value of the boats property.
*
* @return
* possible object is
* {@link BoatConfig.Boats }
*
*/
public BoatConfig.Boats getBoats() {
return boats;
}
/**
* Sets the value of the boats property.
*
* @param value
* allowed object is
* {@link BoatConfig.Boats }
*
*/
public void setBoats(BoatConfig.Boats value) {
this.boats = value;
}
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="Boat" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="GPSposition"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="X" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Y" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Z" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;/sequence&gt;
* &lt;attribute name="Type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="BoatName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="HullNum" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="ShapeID" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="StoweName" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;/sequence&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"boat"
})
public static class Boats {
@XmlElement(name = "Boat", required = true)
protected List<BoatConfig.Boats.Boat> boat;
/**
* Gets the value of the boat property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the boat property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getBoat().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link BoatConfig.Boats.Boat }
*
*
*/
public List<BoatConfig.Boats.Boat> getBoat() {
if (boat == null) {
boat = new ArrayList<BoatConfig.Boats.Boat>();
}
return this.boat;
}
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="GPSposition"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="X" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Y" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Z" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;/sequence&gt;
* &lt;attribute name="Type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="BoatName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="HullNum" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="ShapeID" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="StoweName" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"gpSposition"
})
public static class Boat {
@XmlElement(name = "GPSposition", required = true)
protected BoatConfig.Boats.Boat.GPSposition gpSposition;
@XmlAttribute(name = "Type", required = true)
protected String type;
@XmlAttribute(name = "BoatName", required = true)
protected String boatName;
@XmlAttribute(name = "SourceID", required = true)
protected int sourceID;
@XmlAttribute(name = "HullNum")
protected String hullNum;
@XmlAttribute(name = "ShortName")
protected String shortName;
@XmlAttribute(name = "ShapeID")
protected Integer shapeID;
@XmlAttribute(name = "StoweName")
protected String stoweName;
/**
* Gets the value of the gpSposition property.
*
* @return
* possible object is
* {@link BoatConfig.Boats.Boat.GPSposition }
*
*/
public BoatConfig.Boats.Boat.GPSposition getGPSposition() {
return gpSposition;
}
/**
* Sets the value of the gpSposition property.
*
* @param value
* allowed object is
* {@link BoatConfig.Boats.Boat.GPSposition }
*
*/
public void setGPSposition(BoatConfig.Boats.Boat.GPSposition value) {
this.gpSposition = value;
}
/**
* Gets the value of the type property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getType() {
return type;
}
/**
* Sets the value of the type property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setType(String value) {
this.type = value;
}
/**
* Gets the value of the boatName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getBoatName() {
return boatName;
}
/**
* Sets the value of the boatName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setBoatName(String value) {
this.boatName = value;
}
/**
* Gets the value of the sourceID property.
*
*/
public int getSourceID() {
return sourceID;
}
/**
* Sets the value of the sourceID property.
*
*/
public void setSourceID(int value) {
this.sourceID = value;
}
/**
* Gets the value of the hullNum property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getHullNum() {
return hullNum;
}
/**
* Sets the value of the hullNum property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setHullNum(String value) {
this.hullNum = value;
}
/**
* Gets the value of the shortName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getShortName() {
return shortName;
}
/**
* Sets the value of the shortName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setShortName(String value) {
this.shortName = value;
}
/**
* Gets the value of the shapeID property.
*
* @return
* possible object is
* {@link Integer }
*
*/
public Integer getShapeID() {
return shapeID;
}
/**
* Sets the value of the shapeID property.
*
* @param value
* allowed object is
* {@link Integer }
*
*/
public void setShapeID(Integer value) {
this.shapeID = value;
}
/**
* Gets the value of the stoweName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getStoweName() {
return stoweName;
}
/**
* Sets the value of the stoweName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setStoweName(String value) {
this.stoweName = value;
}
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="X" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Y" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Z" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public static class GPSposition {
@XmlAttribute(name = "X", required = true)
protected Double x;
@XmlAttribute(name = "Y", required = true)
protected double y;
@XmlAttribute(name = "Z", required = true)
protected double z;
/**
* Gets the value of the x property.
*
* @return
* possible object is
* {@link Double }
*
*/
public Double getX() {
return x;
}
/**
* Sets the value of the x property.
*
* @param value
* allowed object is
* {@link Double }
*
*/
public void setX(Double value) {
this.x = value;
}
/**
* Gets the value of the y property.
*
*/
public double getY() {
return y;
}
/**
* Sets the value of the y property.
*
*/
public void setY(double value) {
this.y = value;
}
/**
* Gets the value of the z property.
*
*/
public double getZ() {
return z;
}
/**
* Sets the value of the z property.
*
*/
public void setZ(double value) {
this.z = value;
}
}
}
}
}
@@ -0,0 +1,86 @@
package shared.xml.boats;
import shared.dataInput.BoatDataSource;
import shared.dataInput.RaceDataSource;
import shared.enums.RoundingType;
import shared.model.Boat;
import shared.model.CompoundMark;
import shared.model.Leg;
import shared.model.Mark;
import shared.xml.Race.*;
import shared.xml.XMLUtilities;
import javax.xml.bind.JAXBException;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
/**
* Has functions to convert a {@link shared.dataInput.BoatDataSource} to an {@link BoatConfig} object.
*/
public class BoatDataSourceToXML {
/**
* Converts a boat data source to an XMLRace object.
* @param boatDataSource The data source to convert.
* @return The XMLRace file.
*/
public static BoatConfig toXML(BoatDataSource boatDataSource) {
BoatConfig boatConfig = new BoatConfig();
boatConfig.boats = new BoatConfig.Boats();
boatConfig.boats.boat = new ArrayList<>();
for (Boat boat : boatDataSource.getBoats().values()) {
BoatConfig.Boats.Boat xmlBoat = new BoatConfig.Boats.Boat();
xmlBoat.setType("Yacht");
xmlBoat.setBoatName(boat.getName());
xmlBoat.setSourceID(boat.getSourceID());
xmlBoat.setStoweName(boat.getCountry());
xmlBoat.setShortName(boat.getCountry());
BoatConfig.Boats.Boat.GPSposition position = new BoatConfig.Boats.Boat.GPSposition();
position.setX(boat.getPosition().getLongitude());
position.setY(boat.getPosition().getLatitude());
position.setZ(0);
xmlBoat.setGPSposition(position);
boatConfig.boats.boat.add(xmlBoat);
}
for (Mark mark : boatDataSource.getMarkerBoats().values()) {
BoatConfig.Boats.Boat xmlBoat = new BoatConfig.Boats.Boat();
xmlBoat.setType("Mark");
xmlBoat.setBoatName(mark.getName());
xmlBoat.setSourceID(mark.getSourceID());
BoatConfig.Boats.Boat.GPSposition position = new BoatConfig.Boats.Boat.GPSposition();
position.setX(mark.getPosition().getLongitude());
position.setY(mark.getPosition().getLatitude());
position.setZ(0);
xmlBoat.setGPSposition(position);
boatConfig.boats.boat.add(xmlBoat);
}
return boatConfig;
}
/**
* Converts a boat data source to an xml string.
* @param boatDataSource Data source to convert.
* @return String containing xml file.
* @throws JAXBException Thrown if it cannot be converted.
*/
public static String toString(BoatDataSource boatDataSource) throws JAXBException {
BoatConfig boats = toXML(boatDataSource);
return XMLUtilities.classToXML(boats);
}
}
@@ -0,0 +1,71 @@
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.09.01 at 11:12:43 PM NZST
//
package shared.xml.boats;
import javax.xml.bind.annotation.XmlRegistry;
/**
* This object contains factory methods for each
* Java content interface and Java element interface
* generated in the aaa package.
* <p>An ObjectFactory allows you to programatically
* construct new instances of the Java representation
* for XML content. The Java representation of XML
* content can consist of schema derived interfaces
* and classes representing the binding of schema
* type definitions, element declarations and model
* groups. Factory methods for each of these are
* provided in this class.
*
*/
@XmlRegistry
public class ObjectFactory {
/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: aaa
*
*/
public ObjectFactory() {
}
/**
* Create an instance of {@link BoatConfig }
*
*/
public BoatConfig createBoatConfig() {
return new BoatConfig();
}
/**
* Create an instance of {@link BoatConfig.Boats }
*
*/
public BoatConfig.Boats createBoatConfigBoats() {
return new BoatConfig.Boats();
}
/**
* Create an instance of {@link BoatConfig.Boats.Boat }
*
*/
public BoatConfig.Boats.Boat createBoatConfigBoatsBoat() {
return new BoatConfig.Boats.Boat();
}
/**
* Create an instance of {@link BoatConfig.Boats.Boat.GPSposition }
*
*/
public BoatConfig.Boats.Boat.GPSposition createBoatConfigBoatsBoatGPSposition() {
return new BoatConfig.Boats.Boat.GPSposition();
}
}
@@ -0,0 +1,47 @@
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.09.01 at 10:37:23 PM NZST
//
package shared.xml.regatta;
import javax.xml.bind.annotation.XmlRegistry;
/**
* This object contains factory methods for each
* Java content interface and Java element interface
* generated in the aaa package.
* <p>An ObjectFactory allows you to programatically
* construct new instances of the Java representation
* for XML content. The Java representation of XML
* content can consist of schema derived interfaces
* and classes representing the binding of schema
* type definitions, element declarations and model
* groups. Factory methods for each of these are
* provided in this class.
*
*/
@XmlRegistry
public class ObjectFactory {
/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: aaa
*
*/
public ObjectFactory() {
}
/**
* Create an instance of {@link RegattaConfig }
*
*/
public RegattaConfig createRegattaConfig() {
return new RegattaConfig();
}
}
@@ -0,0 +1,219 @@
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.09.01 at 10:37:23 PM NZST
//
package shared.xml.regatta;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="RegattaID" type="{http://www.w3.org/2001/XMLSchema}int"/&gt;
* &lt;element name="RegattaName" type="{http://www.w3.org/2001/XMLSchema}string"/&gt;
* &lt;element name="CourseName" type="{http://www.w3.org/2001/XMLSchema}string"/&gt;
* &lt;element name="CentralLatitude" type="{http://www.w3.org/2001/XMLSchema}double"/&gt;
* &lt;element name="CentralLongitude" type="{http://www.w3.org/2001/XMLSchema}double"/&gt;
* &lt;element name="CentralAltitude" type="{http://www.w3.org/2001/XMLSchema}double"/&gt;
* &lt;element name="UtcOffset" type="{http://www.w3.org/2001/XMLSchema}double"/&gt;
* &lt;element name="MagneticVariation" type="{http://www.w3.org/2001/XMLSchema}double"/&gt;
* &lt;/sequence&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"regattaID",
"regattaName",
"courseName",
"centralLatitude",
"centralLongitude",
"centralAltitude",
"utcOffset",
"magneticVariation"
})
@XmlRootElement(name = "RegattaConfig")
public class RegattaConfig {
@XmlElement(name = "RegattaID")
protected int regattaID;
@XmlElement(name = "RegattaName", required = true)
protected String regattaName;
@XmlElement(name = "CourseName", required = true)
protected String courseName;
@XmlElement(name = "CentralLatitude")
protected double centralLatitude;
@XmlElement(name = "CentralLongitude")
protected double centralLongitude;
@XmlElement(name = "CentralAltitude")
protected double centralAltitude;
@XmlElement(name = "UtcOffset")
protected double utcOffset;
@XmlElement(name = "MagneticVariation")
protected double magneticVariation;
/**
* Gets the value of the regattaID property.
*
*/
public int getRegattaID() {
return regattaID;
}
/**
* Sets the value of the regattaID property.
*
*/
public void setRegattaID(int value) {
this.regattaID = value;
}
/**
* Gets the value of the regattaName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getRegattaName() {
return regattaName;
}
/**
* Sets the value of the regattaName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setRegattaName(String value) {
this.regattaName = value;
}
/**
* Gets the value of the courseName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getCourseName() {
return courseName;
}
/**
* Sets the value of the courseName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setCourseName(String value) {
this.courseName = value;
}
/**
* Gets the value of the centralLatitude property.
*
*/
public double getCentralLatitude() {
return centralLatitude;
}
/**
* Sets the value of the centralLatitude property.
*
*/
public void setCentralLatitude(double value) {
this.centralLatitude = value;
}
/**
* Gets the value of the centralLongitude property.
*
*/
public double getCentralLongitude() {
return centralLongitude;
}
/**
* Sets the value of the centralLongitude property.
*
*/
public void setCentralLongitude(double value) {
this.centralLongitude = value;
}
/**
* Gets the value of the centralAltitude property.
*
*/
public double getCentralAltitude() {
return centralAltitude;
}
/**
* Sets the value of the centralAltitude property.
*
*/
public void setCentralAltitude(double value) {
this.centralAltitude = value;
}
/**
* Gets the value of the utcOffset property.
*
*/
public double getUtcOffset() {
return utcOffset;
}
/**
* Sets the value of the utcOffset property.
*
*/
public void setUtcOffset(double value) {
this.utcOffset = value;
}
/**
* Gets the value of the magneticVariation property.
*
*/
public double getMagneticVariation() {
return magneticVariation;
}
/**
* Sets the value of the magneticVariation property.
*
*/
public void setMagneticVariation(double value) {
this.magneticVariation = value;
}
}
@@ -0,0 +1,54 @@
package shared.xml.regatta;
import shared.dataInput.RegattaDataSource;
import shared.xml.Race.XMLRace;
import shared.xml.XMLUtilities;
import javax.xml.bind.JAXBException;
/**
* Has functions to convert a {@link shared.dataInput.RegattaDataSource} to an {@link RegattaConfig} object.
*/
public class RegattaDataSourceToXML {
/**
* Converts a regatta data source to an XMLRace object.
* @param regattaDataSource The data source to convert.
* @return The XMLRace file.
*/
public static RegattaConfig toXML(RegattaDataSource regattaDataSource) {
RegattaConfig regatta = new RegattaConfig();
regatta.setCentralAltitude(regattaDataSource.getCentralAltitude());
regatta.setCentralLatitude(regattaDataSource.getCentralLatitude());
regatta.setCentralLongitude(regattaDataSource.getCentralLongitude());
regatta.setCourseName(regattaDataSource.getCourseName());
regatta.setRegattaName(regattaDataSource.getRegattaName());
regatta.setMagneticVariation(regattaDataSource.getMagneticVariation());
regatta.setRegattaID(regattaDataSource.getRegattaID());
regatta.setUtcOffset(regattaDataSource.getUtcOffset());
return regatta;
}
/**
* Converts a regatta data source to an xml string.
* @param regattaDataSource Data source to convert.
* @return String containing xml file.
* @throws JAXBException Thrown if it cannot be converted.
*/
public static String toString(RegattaDataSource regattaDataSource) throws JAXBException {
RegattaConfig regatta = toXML(regattaDataSource);
return XMLUtilities.classToXML(regatta);
}
}