Merge branch 'MapWindRotation' into 'master'

Map wind rotation

Note: we'd like to generate a realistic course layout, that can vary from race to race (but not within a race, for now.) The generated layout must be sent through the API in the format given by the race.xml section of the AC35 Streaming Data Interface Specification. The AC35 Protocol (sections 31.4 and 31.5) specifies the requirements for a course:

*    First leg of the course (from start line to first mark) must be a reaching leg
*    Next legs are windward/leeward, and boats complete either two or three laps of this section
*    Final leg to finish line may be a reaching leg
*    A boat should take around 25 minutes to complete the course in the wind conditions at the start of the race (AC35 protocol, section 31.5)

You should assume that the windward/leeward marks and start/finish lines are always compounds of two marks.

Acceptance criteria:

 *   The layout must be sent over the API in a race.xml message, plus boat location messages for the marks as required, before any other boat location messages are sent.
 *   Each mark must be defined using boat "SourceID"s (see definition of race.xml) so their positions can be adjusted later.
 *   The course must meet the requirements given in the AC35 Protocol.
 *   The course limits should be set to clear all marks by at least several boat-lengths.
 *   The entire race area within the limits must be on the water.

See merge request !22
main
Joseph Gardner 8 years ago
commit 610aa96241

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectCodeStyleSettingsManager">
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</component>
</project>

@ -4,7 +4,9 @@ import mock.dataInput.PolarParser;
import mock.exceptions.EventConstructionException; import mock.exceptions.EventConstructionException;
import mock.model.*; import mock.model.*;
import mock.model.commandFactory.CompositeCommand; import mock.model.commandFactory.CompositeCommand;
import mock.xml.RaceXMLCreator;
import network.Messages.LatestMessages; import network.Messages.LatestMessages;
import org.xml.sax.SAXException;
import shared.dataInput.*; import shared.dataInput.*;
import shared.enums.XMLFileType; import shared.enums.XMLFileType;
import shared.exceptions.InvalidBoatDataException; import shared.exceptions.InvalidBoatDataException;
@ -14,6 +16,8 @@ import shared.exceptions.XMLReaderException;
import shared.model.Bearing; import shared.model.Bearing;
import shared.model.Constants; import shared.model.Constants;
import javax.xml.bind.JAXBException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import java.io.IOException; import java.io.IOException;
import java.net.UnknownHostException; import java.net.UnknownHostException;
@ -82,12 +86,22 @@ public class Event {
//Read XML files. //Read XML files.
try { try {
this.raceXML = getRaceXMLAtCurrentTime(XMLReader.readXMLFileToString(raceXMLFile, StandardCharsets.UTF_8)); this.raceXML = RaceXMLCreator.alterRaceToWind(raceXMLFile, 90);
this.boatXML = XMLReader.readXMLFileToString(boatsXMLFile, StandardCharsets.UTF_8); this.boatXML = XMLReader.readXMLFileToString(boatsXMLFile, StandardCharsets.UTF_8);
this.regattaXML = XMLReader.readXMLFileToString(regattaXMLFile, StandardCharsets.UTF_8); this.regattaXML = XMLReader.readXMLFileToString(regattaXMLFile, StandardCharsets.UTF_8);
} catch (XMLReaderException e) { } catch (XMLReaderException e) {
throw new EventConstructionException("Could not read XML files.", e); throw new EventConstructionException("Could not read XML files.", e);
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (InvalidRaceDataException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
} }
this.xmlFileType = XMLFileType.Contents; this.xmlFileType = XMLFileType.Contents;
@ -171,27 +185,4 @@ public class Event {
connectionAcceptor.setBoatsXml(boatXML); connectionAcceptor.setBoatsXml(boatXML);
} }
/**
* Sets the xml description of the race to show the race was created now, and starts in 4 minutes
* @param raceXML The race.xml contents.
* @return String containing edited xml
*/
private String getRaceXMLAtCurrentTime(String raceXML) {
//The start time is current time + 4 minutes. prestart is 3 minutes, and we add another minute.
long millisecondsToAdd = Constants.RacePreStartTime + Duration.ofMinutes(1).toMillis();
long secondsToAdd = millisecondsToAdd / 1000;
//Scale the time using our time scalar.
secondsToAdd = secondsToAdd / Constants.RaceTimeScale;
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
ZonedDateTime creationTime = ZonedDateTime.now();
raceXML = raceXML.replace("CREATION_TIME", dateFormat.format(creationTime));
raceXML = raceXML.replace("START_TIME", dateFormat.format(creationTime.plusSeconds(secondsToAdd)));
return raceXML;
}
} }

@ -1,5 +1,9 @@
package mock.model; package mock.model;
import javafx.animation.AnimationTimer;
import mock.xml.*;
import network.Messages.BoatLocation;
import network.Messages.BoatStatus;
import network.Messages.Enums.BoatStatusEnum; import network.Messages.Enums.BoatStatusEnum;
import network.Messages.Enums.RaceStatusEnum; import network.Messages.Enums.RaceStatusEnum;
import shared.dataInput.BoatDataSource; import shared.dataInput.BoatDataSource;
@ -8,6 +12,8 @@ import shared.dataInput.RegattaDataSource;
import shared.exceptions.BoatNotFoundException; import shared.exceptions.BoatNotFoundException;
import shared.enums.RoundingType; import shared.enums.RoundingType;
import shared.model.*; import shared.model.*;
import shared.model.Bearing;
import shared.model.Race;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
@ -392,7 +398,7 @@ public class MockRace extends Race {
double lastAngle = -1; double lastAngle = -1;
boolean lastAngleWasGood = false; boolean lastAngleWasGood = false;
//Check all bearings between [0, 360). //Check all bearings between [0, 360)
for (double angle = 0; angle < 360; angle += 1) { for (double angle = 0; angle < 360; angle += 1) {
//Create bearing from angle. //Create bearing from angle.
@ -628,7 +634,6 @@ public class MockRace extends Race {
protected int getNumberOfActiveBoats() { protected int getNumberOfActiveBoats() {
int numberOfActiveBoats = 0; int numberOfActiveBoats = 0;
for (MockBoat boat : this.boats) { for (MockBoat boat : this.boats) {
//If the boat is currently racing, count it. //If the boat is currently racing, count it.
@ -701,6 +706,7 @@ public class MockRace extends Race {
} }
public List<CompoundMark> getCompoundMarks() {
return compoundMarks;
}
} }

@ -180,9 +180,9 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer {
public void update(Observable o, Object arg) { public void update(Observable o, Object arg) {
Collision e = (Collision)arg; Collision e = (Collision)arg;
if(e.getBearing().degrees() == 0) System.out.println("Ahead"); // if(e.getBearing().degrees() == 0) System.out.println("Ahead");
else if(e.getBearing().degrees() < 90) System.out.println("Starboard"); // else if(e.getBearing().degrees() < 90) System.out.println("Starboard");
else if(e.getBearing().degrees() > 270) System.out.println("Port"); // else if(e.getBearing().degrees() > 270) System.out.println("Port");
else System.out.println("Behind"); // else System.out.println("Behind");
} }
} }

@ -0,0 +1,207 @@
package mock.xml;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import shared.dataInput.RaceXMLReader;
import shared.enums.XMLFileType;
import shared.exceptions.InvalidRaceDataException;
import shared.exceptions.XMLReaderException;
import shared.model.*;
import shared.xml.Race.*;
import shared.xml.XMLUtilities;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.util.JAXBSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.math.BigInteger;
import java.net.URL;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
/**
* Helper Class for creating a Race XML
*/
public class RaceXMLCreator {
/**
* get the windward gate in a race
* @param reader reads in the mark
* @return the windward gate.
*/
public static CompoundMark getWindwardGate(RaceXMLReader reader){
for (CompoundMark mark: reader.getCompoundMarks()){
if (mark.getName().equals("Windward Gate")) return mark;
}
return null;
}
/**
* get the leeward gate in a race
* @param reader reads in the mark
* @return the leeward gate.
*/
public static CompoundMark getLeewardGate(RaceXMLReader reader){
for (CompoundMark mark: reader.getCompoundMarks()){
if (mark.getName().equals("Leeward Gate")) return mark;
}
return null;
}
/**
* Rotates the race in a specified direction.
* @param s xml file name
* @param degrees degrees to rotate
* @return the new xml file as a string
* @throws XMLReaderException if the xml is not readable
* @throws InvalidRaceDataException if the race is invalid
* @throws JAXBException if the Race class cannot be parsed into a xml.
* @throws IOException if the schema file cannot be found
* @throws SAXException error in schema file
* @throws ParserConfigurationException error in parsing the schema file
*/
public static String alterRaceToWind(String s, double degrees) throws XMLReaderException, InvalidRaceDataException, JAXBException, IOException, SAXException, ParserConfigurationException {
RaceXMLReader reader = new RaceXMLReader(s, XMLFileType.ResourcePath);
XMLRace race = (XMLRace) XMLUtilities.xmlToClass(new File(RaceXMLCreator.class.getClassLoader().getResource(s).getFile()),
RaceXMLCreator.class.getClassLoader().getResource("mock/mockXML/schema/raceSchema.xsd"),
XMLRace.class);
setRaceXMLAtCurrentTimeToNow(race);
double raceOriginalBearing = getLineAngle(getLeewardGate(reader).getMark1Position(), getWindwardGate(reader).getMark1Position());
double degreesToRotate = degrees - raceOriginalBearing;
alterRaceRotation(race, degreesToRotate);
JAXBContext context = JAXBContext.newInstance(XMLRace.class);
Marshaller jaxbMarshaller = context.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(race, sw);
return sw.toString();
}
/**
* Rotate the features in a race such as the boundary, and the marks.
* @param race the race to alter
* @param degrees the degrees to rotate by.
*/
public static void alterRaceRotation(XMLRace race, double degrees){
GPSCoordinate center = getCenter(race);
for(XMLLimit limit: race.getCourseLimit().getLimit()){
GPSCoordinate rotatedLim = rotate(center, limitToGPSCoordinate(limit), degrees);
limit.setLat(rotatedLim.getLatitude());
limit.setLon(rotatedLim.getLongitude());
}
for(XMLCompoundMark compoundMark: race.getCourse().getCompoundMark()){
for (XMLMark mark: compoundMark.getMark()){
GPSCoordinate rotatedMark = rotate(center, markToGPSCoordinate(mark), degrees);
mark.setTargetLat(rotatedMark.getLatitude());
mark.setTargetLng(rotatedMark.getLongitude());
}
}
}
/**
* Converts a Race.CourseLimit.Limit to a GPS coordinate
* @param limit limit to convert
* @return gps coordinate corresponding to the limit
*/
public static GPSCoordinate limitToGPSCoordinate(XMLLimit limit){
return new GPSCoordinate(limit.getLat(), limit.getLon());
}
/**
* get new gps coordinate after rotating
* @param pivot center point to rotating from.
* @param point point to rotate
* @param degrees number of degress to rotate by
* @return the new GPSCoordinate of the transformed point.
*/
public static GPSCoordinate rotate(GPSCoordinate pivot, GPSCoordinate point, double degrees){
double radDeg = Math.toRadians(degrees);
double deltaLat = (point.getLatitude() - pivot.getLatitude());
double deltaLon = (point.getLongitude() - pivot.getLongitude());
//map to (0,1) vector and use vector maths to rotate.
double resLat = deltaLat * Math.cos(radDeg) - deltaLon * Math.sin(radDeg) + pivot.getLatitude();
double resLon = deltaLat * Math.sin(radDeg) + deltaLon * Math.cos(radDeg) + pivot.getLongitude();
return new GPSCoordinate(resLat, resLon);
}
/**
* obtains the GPSCoordinates of a mark
* @param mark mark to obtain the GPSCoordinates of
* @return the GPSCOordinatess of a mark
*/
public static GPSCoordinate markToGPSCoordinate(XMLMark mark){
return new GPSCoordinate(mark.getTargetLat(), mark.getTargetLng());
}
/**
* get the center of a race
* @param race race to get the center of
* @return GPSCoordinates of the center
*/
public static GPSCoordinate getCenter(XMLRace race){
double avgLat = 0;
double avgLng = 0;
for (XMLLimit limit: race.getCourseLimit().getLimit()){
avgLat += limit.getLat();
avgLng += limit.getLon();
}
avgLat = avgLat/race.getCourseLimit().getLimit().size();
avgLng = avgLng/race.getCourseLimit().getLimit().size();
return new GPSCoordinate(avgLat, avgLng);
}
/**
* gets the angle of a line
* @param coord1 point a of the line
* @param coord2 point b of the line
* @return the angle in degrees that the bearing of the line is [-180, 180]
*/
public static double getLineAngle(GPSCoordinate coord1, GPSCoordinate coord2){
double dx = coord1.getLongitude() - coord2.getLongitude();
double dy = coord1.getLatitude() - coord2.getLatitude();
return Math.atan2(dy, dx)/Math.PI * 180;
}
/**
* Sets the xml description of the race to show the race was created now, and starts in 4 minutes
* @param raceXML The race.xml contents.
*/
public static void setRaceXMLAtCurrentTimeToNow(XMLRace raceXML) {
//The start time is current time + 4 minutes. prestart is 3 minutes, and we add another minute.
long millisecondsToAdd = Constants.RacePreStartTime + (1 * 60 * 1000);
long secondsToAdd = millisecondsToAdd / 1000;
//Scale the time using our time scalar.
secondsToAdd = secondsToAdd / Constants.RaceTimeScale;
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
ZonedDateTime creationTime = ZonedDateTime.now();
raceXML.setCreationTimeDate(dateFormat.format(creationTime));
raceXML.getRaceStartTime().setTime(dateFormat.format(creationTime.plusSeconds(secondsToAdd)));
}
}

@ -52,6 +52,10 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
*/ */
private final List<Leg> legs = new ArrayList<>(); private final List<Leg> legs = new ArrayList<>();
/**
* List of corners in the race
*/
private final List<Corner> cornersList = new ArrayList<>();
/** /**
* The time that the race.xml file was created. * The time that the race.xml file was created.
@ -337,6 +341,10 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
//gets the Rounding of this corner element //gets the Rounding of this corner element
String cornerRounding = getCompoundMarkRounding(cornerElement); String cornerRounding = getCompoundMarkRounding(cornerElement);
int cornerSeq = Integer.parseInt(getAttribute(cornerElement, "SeqID"));
cornersList.add(new Corner(cornerID, cornerSeq, "SP", 3));
//Gets the CompoundMark associated with this corner. //Gets the CompoundMark associated with this corner.
CompoundMark lastCompoundMark = this.compoundMarkMap.get(cornerID); CompoundMark lastCompoundMark = this.compoundMarkMap.get(cornerID);
@ -356,6 +364,9 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
//Gets the ID number of this corner element. //Gets the ID number of this corner element.
cornerID = getCompoundMarkID(cornerElement); cornerID = getCompoundMarkID(cornerElement);
cornerSeq = Integer.parseInt(getAttribute(cornerElement, "SeqID"));
cornersList.add(new Corner(cornerID, cornerSeq, "Port", 3));
//gets the Rounding of this corner element //gets the Rounding of this corner element
cornerRounding = getCompoundMarkRounding(cornerElement); cornerRounding = getCompoundMarkRounding(cornerElement);
@ -476,4 +487,8 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
public List<Integer> getParticipants() { public List<Integer> getParticipants() {
return participants; return participants;
} }
public List<Corner> getCornersList() {
return cornersList;
}
} }

@ -1,11 +1,14 @@
package shared.model; package shared.model;
import shared.xml.Race.XMLCompoundMark;
import shared.enums.RoundingType; import shared.enums.RoundingType;
/** /**
* Represents a compound mark - that is, either one or two individual marks which form a single compound mark. * Represents a compound mark - that is, either one or two individual marks which form a single compound mark.
*/ */
public class CompoundMark { public class CompoundMark extends XMLCompoundMark{
/** /**
* The ID of the compound mark. * The ID of the compound mark.
@ -45,11 +48,7 @@ public class CompoundMark {
* @param mark1 The individual mark that comprises this compound mark. * @param mark1 The individual mark that comprises this compound mark.
*/ */
public CompoundMark(int id, String name, Mark mark1) { public CompoundMark(int id, String name, Mark mark1) {
this.id = id; this(id, name, mark1, null);
this.name = name;
this.mark1 = mark1;
this.averageGPSCoordinate = calculateAverage();
} }
@ -61,6 +60,14 @@ public class CompoundMark {
* @param mark2 The second individual mark that comprises this compound mark. * @param mark2 The second individual mark that comprises this compound mark.
*/ */
public CompoundMark(int id, String name, Mark mark1, Mark mark2) { public CompoundMark(int id, String name, Mark mark1, Mark mark2) {
//parent set up
super();
setName(name);
setCompoundMarkID(id);
/*TODO need to talk to connor about this as Mark should be extending XMLMark
getMark().add(mark1);
if (mark2 != null) getMark().add(mark2);*/
this.id = id; this.id = id;
this.name = name; this.name = name;
this.mark1 = mark1; this.mark1 = mark1;
@ -78,14 +85,6 @@ public class CompoundMark {
return id; return id;
} }
/**
* Returns the name of this compound mark
* @return The name of this compound mark.
*/
public String getName() {
return name;
}
/** /**
* Returns the first mark of the compound mark. * Returns the first mark of the compound mark.
* @return The first mark of the compound mark. * @return The first mark of the compound mark.

@ -0,0 +1,25 @@
package shared.model;
import shared.xml.Race.XMLCorner;
/**
* Created by Gondr on 3/08/2017.
*/
public class Corner extends XMLCorner{
private int id;
public Corner(int id, int seqID, String rounding, int zoneSize){
super();
setCompoundMarkID(id);
setSeqID(seqID);
setRounding(rounding);
setZoneSize(zoneSize);
this.id = id;
}
public int getId() {
return id;
}
}

@ -1,5 +1,10 @@
package shared.model; package shared.model;
import shared.xml.Race.XMLMark;
import java.math.BigDecimal;
import java.math.BigInteger;
import mock.model.collider.Collider; import mock.model.collider.Collider;
import mock.model.collider.Collision; import mock.model.collider.Collision;
@ -7,7 +12,7 @@ import mock.model.collider.Collision;
* Represents an individual mark. * Represents an individual mark.
* Has a source ID, name, and position. * Has a source ID, name, and position.
*/ */
public class Mark extends Collider { public class Mark extends Collider{
/** /**
* The source ID of the mark. * The source ID of the mark.
@ -36,6 +41,13 @@ public class Mark extends Collider {
* @param position The position of the mark. * @param position The position of the mark.
*/ */
public Mark(int sourceID, String name, GPSCoordinate position) { public Mark(int sourceID, String name, GPSCoordinate position) {
super();
/* TODO need to talk to connor about this as this class should be extending XMLMark
targetLat = position.getLatitude();
targetLng = position.getLongitude();
setSourceID(sourceID);
setName(name);*/
this.sourceID = sourceID; this.sourceID = sourceID;
this.name = name; this.name = name;
this.position = position; this.position = position;
@ -60,8 +72,8 @@ public class Mark extends Collider {
} }
/** /**
* Returns the source ID of the mark. * Returns the source ID of the mark
* @return The source ID of the mark. * @return the source ID of the mark
*/ */
public int getSourceID() { public int getSourceID() {
return sourceID; return sourceID;

@ -0,0 +1,135 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
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.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="Mark" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="SeqId" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="TargetLat" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="TargetLng" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;/sequence&gt;
* &lt;attribute name="CompoundMarkID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Name" use="required" 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 = {
"mark"
})
public class XMLCompoundMark {
@XmlElement(name = "Mark", required = true)
protected List<XMLMark> mark;
@XmlAttribute(name = "CompoundMarkID", required = true)
protected int compoundMarkID;
@XmlAttribute(name = "Name", required = true)
protected String name;
/**
* Gets the value of the mark 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 mark property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getMark().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link XMLMark }
*
* @return list of marks
*/
public List<XMLMark> getMark() {
if (mark == null) {
mark = new ArrayList<XMLMark>();
}
return this.mark;
}
/**
* Gets the value of the compoundMarkID property.
* @return the id of the compound mark
*/
public int getCompoundMarkID() {
return compoundMarkID;
}
/**
* Sets the value of the compoundMarkID property.
* @param value sets ID of the compound mark
*/
public void setCompoundMarkID(int value) {
this.compoundMarkID = value;
}
/**
* Gets the value of the name property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getName() {
return name;
}
/**
* Sets the value of the name property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setName(String value) {
this.name = value;
}
}

@ -0,0 +1,87 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
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.XmlElement;
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="Corner" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="CompoundMarkID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="SeqID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Rounding" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="ZoneSize" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&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 = {
"corner"
})
public class XMLCompoundMarkSequence {
@XmlElement(name = "Corner", required = true)
protected List<XMLCorner> corner;
/**
* Gets the value of the corner 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 corner property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getCorner().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link XMLCorner }
*
* @return getCorners/legs that the boats are to sequentially pass
*/
public List<XMLCorner> getCorner() {
if (corner == null) {
corner = new ArrayList<XMLCorner>();
}
return this.corner;
}
}

@ -0,0 +1,122 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
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;attribute name="CompoundMarkID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="SeqID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Rounding" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="ZoneSize" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public class XMLCorner {
@XmlAttribute(name = "CompoundMarkID", required = true)
protected int compoundMarkID;
@XmlAttribute(name = "SeqID", required = true)
protected int seqID;
@XmlAttribute(name = "Rounding", required = true)
protected String rounding;
@XmlAttribute(name = "ZoneSize", required = true)
protected int zoneSize;
/**
* Gets the value of the compoundMarkID property.
* @return Id of the compound mark
*/
public int getCompoundMarkID() {
return compoundMarkID;
}
/**
* Sets the value of the compoundMarkID property.
* @param value sets the id of the compound mark
*/
public void setCompoundMarkID(int value) {
this.compoundMarkID = value;
}
/**
* Gets the value of the seqID property.
* @return the order that the mark is to be passed at
*/
public int getSeqID() {
return seqID;
}
/**
* Sets the value of the seqID property.
* @param value sets the order that this corner is to appear in a race at.
*/
public void setSeqID(int value) {
this.seqID = value;
}
/**
* Gets the value of the rounding property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getRounding() {
return rounding;
}
/**
* Sets the value of the rounding property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setRounding(String value) {
this.rounding = value;
}
/**
* Gets the value of the zoneSize property.
* @return the size of the leg
*/
public int getZoneSize() {
return zoneSize;
}
/**
* Sets the value of the zoneSize property.
* @param value sets the size of the corner.
*/
public void setZoneSize(int value) {
this.zoneSize = value;
}
}

@ -0,0 +1,100 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
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.XmlElement;
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="CompoundMark" 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="Mark" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="SeqId" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="TargetLat" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="TargetLng" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;/sequence&gt;
* &lt;attribute name="CompoundMarkID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Name" use="required" 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 = {
"compoundMark"
})
public class XMLCourse {
@XmlElement(name = "CompoundMark", required = true)
protected List<XMLCompoundMark> compoundMark;
/**
* Gets the value of the compoundMark 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 compoundMark property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getCompoundMark().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link XMLCompoundMark }
*
* @return the compound marks in the course.
*/
public List<XMLCompoundMark> getCompoundMark() {
if (compoundMark == null) {
compoundMark = new ArrayList<XMLCompoundMark>();
}
return this.compoundMark;
}
}

@ -0,0 +1,86 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
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.XmlElement;
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="Limit" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="Lat" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Lon" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="SeqID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&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 = {
"limit"
})
public class XMLCourseLimit {
@XmlElement(name = "Limit", required = true)
protected List<XMLLimit> limit;
/**
* Gets the value of the limit 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 limit property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getLimit().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link XMLLimit }
*
* @return the limits of the race
*/
public List<XMLLimit> getLimit() {
if (limit == null) {
limit = new ArrayList<XMLLimit>();
}
return this.limit;
}
}

@ -0,0 +1,95 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
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;attribute name="Lat" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Lon" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="SeqID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public class XMLLimit {
@XmlAttribute(name = "Lat", required = true)
protected double lat;
@XmlAttribute(name = "Lon", required = true)
protected double lon;
@XmlAttribute(name = "SeqID", required = true)
protected int seqID;
/**
* Gets the value of the lat property.
* @return get the latitude of the limit
*/
public double getLat() {
return lat;
}
/**
* Sets the value of the lat property.
* @param value sets the latitude of the limit
*/
public void setLat(double value) {
this.lat = value;
}
/**
* Gets the value of the lon property.
* @return sets the longitude of the limit
*/
public double getLon() {
return lon;
}
/**
* Sets the value of the lon property.
* @param value sets the longitude of the limit
*/
public void setLon(double value) {
this.lon = value;
}
/**
* Gets the value of the seqID property.
* @return gets the sequence that the limit is at.
*/
public int getSeqID() {
return seqID;
}
/**
* Sets the value of the seqID property.
* @param value sets the order that this limit is to appear in.
*/
public void setSeqID(int value) {
this.seqID = value;
}
}

@ -0,0 +1,151 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
import mock.model.collider.Collider;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
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;attribute name="SeqId" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="TargetLat" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="TargetLng" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public class XMLMark{
@XmlAttribute(name = "SeqId")
protected Integer seqId;
@XmlAttribute(name = "Name", required = true)
protected String name;
@XmlAttribute(name = "TargetLat", required = true)
protected double targetLat;
@XmlAttribute(name = "TargetLng", required = true)
protected double targetLng;
@XmlAttribute(name = "SourceID", required = true)
protected int sourceID;
/**
* Gets the value of the seqId property.
*
* @return
* possible object is
* {@link Integer }
*
*/
public Integer getSeqId() {
return seqId;
}
/**
* Sets the value of the seqId property.
*
* @param value
* allowed object is
* {@link Integer }
*
*/
public void setSeqId(Integer value) {
this.seqId = value;
}
/**
* Gets the value of the name property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getName() {
return name;
}
/**
* Sets the value of the name property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setName(String value) {
this.name = value;
}
/**
* Gets the value of the targetLat property.
* @return latitude that mark is at
*/
public double getTargetLat() {
return targetLat;
}
/**
* Sets the value of the targetLat property.
* @param value sets the latitude that the mark is at.
*/
public void setTargetLat(double value) {
this.targetLat = value;
}
/**
* Gets the value of the targetLng property.
* @return the longitude the mark is at
*/
public double getTargetLng() {
return targetLng;
}
/**
* Sets the value of the targetLng property.
* @param value sets the longitude that the value is at
*/
public void setTargetLng(double value) {
this.targetLng = value;
}
/**
* Gets the value of the sourceID property.
* @return the markerboats source ID
*/
public int getSourceID() {
return sourceID;
}
/**
* Sets the value of the sourceID property.
* @param value sets the id of the boat that the mark is referencing to.
*/
public void setSourceID(int value) {
this.sourceID = value;
}
}

@ -0,0 +1,85 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
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.XmlElement;
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="Yacht" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Entry" 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 = {
"yacht"
})
public class XMLParticipants {
@XmlElement(name = "Yacht", required = true)
protected List<XMLYacht> yacht;
/**
* Gets the value of the yacht 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 yacht property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getYacht().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link XMLYacht }
*
* @return the yachts that are part of the race.
*/
public List<XMLYacht> getYacht() {
if (yacht == null) {
yacht = new ArrayList<XMLYacht>();
}
return this.yacht;
}
}

@ -0,0 +1,362 @@
//
// 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.08.14 at 03:20:03 AM NZST
//
package shared.xml.Race;
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="RaceID" type="{http://www.w3.org/2001/XMLSchema}int"/&gt;
* &lt;element name="RaceType" type="{http://www.w3.org/2001/XMLSchema}string"/&gt;
* &lt;element name="CreationTimeDate" type="{http://www.w3.org/2001/XMLSchema}string"/&gt;
* &lt;element name="RaceStartTime"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="Postpone" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="Time" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;element name="Participants"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="Yacht" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Entry" 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;element name="CompoundMarkSequence"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="Corner" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="CompoundMarkID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="SeqID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Rounding" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="ZoneSize" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&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;element name="Course"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="CompoundMark" 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="Mark" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="SeqId" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="TargetLat" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="TargetLng" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* &lt;/element&gt;
* &lt;/sequence&gt;
* &lt;attribute name="CompoundMarkID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Name" use="required" 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;element name="CourseLimit"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;sequence&gt;
* &lt;element name="Limit" maxOccurs="unbounded"&gt;
* &lt;complexType&gt;
* &lt;complexContent&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
* &lt;attribute name="Lat" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="Lon" use="required" type="{http://www.w3.org/2001/XMLSchema}double" /&gt;
* &lt;attribute name="SeqID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&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 = {
"raceID",
"raceType",
"creationTimeDate",
"raceStartTime",
"participants",
"compoundMarkSequence",
"course",
"courseLimit"
})
@XmlRootElement(name = "Race")
public class XMLRace {
@XmlElement(name = "RaceID")
protected int raceID;
@XmlElement(name = "RaceType", required = true)
protected String raceType;
@XmlElement(name = "CreationTimeDate", required = true)
protected String creationTimeDate;
@XmlElement(name = "RaceStartTime", required = true)
protected XMLRaceStartTime raceStartTime;
@XmlElement(name = "Participants", required = true)
protected XMLParticipants participants;
@XmlElement(name = "CompoundMarkSequence", required = true)
protected XMLCompoundMarkSequence compoundMarkSequence;
@XmlElement(name = "Course", required = true)
protected XMLCourse course;
@XmlElement(name = "CourseLimit", required = true)
protected XMLCourseLimit courseLimit;
/**
* Gets the value of the raceID property.
* @return the id of the race
*/
public int getRaceID() {
return raceID;
}
/**
* Sets the value of the raceID property.
* @param value sets the id of the race
*/
public void setRaceID(int value) {
this.raceID = value;
}
/**
* Gets the value of the raceType property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getRaceType() {
return raceType;
}
/**
* Sets the value of the raceType property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setRaceType(String value) {
this.raceType = value;
}
/**
* Gets the value of the creationTimeDate property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getCreationTimeDate() {
return creationTimeDate;
}
/**
* Sets the value of the creationTimeDate property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setCreationTimeDate(String value) {
this.creationTimeDate = value;
}
/**
* Gets the value of the raceStartTime property.
*
* @return
* possible object is
* {@link XMLRaceStartTime }
*
*/
public XMLRaceStartTime getRaceStartTime() {
return raceStartTime;
}
/**
* Sets the value of the raceStartTime property.
*
* @param value
* allowed object is
* {@link XMLRaceStartTime }
*
*/
public void setRaceStartTime(XMLRaceStartTime value) {
this.raceStartTime = value;
}
/**
* Gets the value of the participants property.
*
* @return
* possible object is
* {@link XMLParticipants }
*
*/
public XMLParticipants getParticipants() {
return participants;
}
/**
* Sets the value of the participants property.
*
* @param value
* allowed object is
* {@link XMLParticipants }
*
*/
public void setParticipants(XMLParticipants value) {
this.participants = value;
}
/**
* Gets the value of the compoundMarkSequence property.
*
* @return
* possible object is
* {@link XMLCompoundMarkSequence }
*
*/
public XMLCompoundMarkSequence getCompoundMarkSequence() {
return compoundMarkSequence;
}
/**
* Sets the value of the compoundMarkSequence property.
*
* @param value
* allowed object is
* {@link XMLCompoundMarkSequence }
*
*/
public void setCompoundMarkSequence(XMLCompoundMarkSequence value) {
this.compoundMarkSequence = value;
}
/**
* Gets the value of the course property.
*
* @return
* possible object is
* {@link XMLCourse }
*
*/
public XMLCourse getCourse() {
return course;
}
/**
* Sets the value of the course property.
*
* @param value
* allowed object is
* {@link XMLCourse }
*
*/
public void setCourse(XMLCourse value) {
this.course = value;
}
/**
* Gets the value of the courseLimit property.
*
* @return
* possible object is
* {@link XMLCourseLimit }
*
*/
public XMLCourseLimit getCourseLimit() {
return courseLimit;
}
/**
* Sets the value of the courseLimit property.
*
* @param value
* allowed object is
* {@link XMLCourseLimit }
*
*/
public void setCourseLimit(XMLCourseLimit value) {
this.courseLimit = value;
}
}

@ -0,0 +1,127 @@
//
// 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.08.14 at 02:41:51 AM NZST
//
package shared.xml.Race;
import javax.xml.bind.annotation.XmlRegistry;
/**
* This object contains factory methods for each
* Java content interface and Java element interface
* generated in the shared.xml.Race 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 XMLRaceFactory {
/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: shared.xml.Race
*
*/
public XMLRaceFactory() {
}
/**
* Create an instance of {@link XMLRace }
* @return a new instance of a race.
*/
public XMLRace createRace() {
return new XMLRace();
}
/**
* Create an instance of {@link XMLRaceStartTime }
* @return a new start time for the race
*/
public XMLRaceStartTime createXMLRaceStartTime() {
return new XMLRaceStartTime();
}
/**
* Create an instance of {@link XMLParticipants }
* @return a new participant of the race
*/
public XMLParticipants createXMLParticipants() {
return new XMLParticipants();
}
/**
* Create an instance of {@link XMLCompoundMarkSequence }
* @return a new Compound Mark Sequence that hte race is to follow.
*/
public XMLCompoundMarkSequence createXMLCompoundMarkSequence() {
return new XMLCompoundMarkSequence();
}
/**
* Create an instance of {@link XMLCourse }
* @return the course the race is to use.
*/
public XMLCourse createXMLCourse() {
return new XMLCourse();
}
/**
* Create an instance of {@link XMLCourseLimit }
* @return the limits/boundaries of the course.
*/
public XMLCourseLimit createXMLCourseLimit() {
return new XMLCourseLimit();
}
/**
* Create an instance of {@link XMLLimit }
* @return a point on hte boundaries
*/
public XMLLimit createXMLLimit() {
return new XMLLimit();
}
/**
* Create an instance of {@link XMLCompoundMark }
* @return a compound mark (made out of multiple marks)
*/
public XMLCompoundMark createXMLCompoundMark() {
return new XMLCompoundMark();
}
/**
* Create an instance of {@link XMLMark }
* @return a mark
*/
public XMLMark createXMLMark() {
return new XMLMark();
}
/**
* Create an instance of {@link XMLCorner }
* @return a corner of a compound mark sequence
*/
public XMLCorner createXMLCorner() {
return new XMLCorner();
}
/**
* Create an instance of {@link XMLYacht }
* @return creates a new Yacht.
*/
public XMLYacht createXMLYacht() {
return new XMLYacht();
}
}

@ -0,0 +1,92 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
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;attribute name="Postpone" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;attribute name="Time" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public class XMLRaceStartTime {
@XmlAttribute(name = "Postpone", required = true)
protected String postpone;
@XmlAttribute(name = "Time", required = true)
protected String time;
/**
* Gets the value of the postpone property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getPostpone() {
return postpone;
}
/**
* Sets the value of the postpone property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setPostpone(String value) {
this.postpone = value;
}
/**
* Gets the value of the time property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getTime() {
return time;
}
/**
* Sets the value of the time property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setTime(String value) {
this.time = value;
}
}

@ -0,0 +1,84 @@
//
// 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.08.14 at 02:54:32 AM NZST
//
package shared.xml.Race;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
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;attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
* &lt;attribute name="Entry" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
* &lt;/restriction&gt;
* &lt;/complexContent&gt;
* &lt;/complexType&gt;
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public class XMLYacht {
@XmlAttribute(name = "SourceID", required = true)
protected int sourceID;
@XmlAttribute(name = "Entry")
protected String entry;
/**
* Gets the value of the sourceID property.
* @return the id of the yacht
*/
public int getSourceID() {
return sourceID;
}
/**
* Sets the value of the sourceID property.
* @param value sets the source ID of the a yacht that is participating in the race
*/
public void setSourceID(int value) {
this.sourceID = value;
}
/**
* Gets the value of the entry property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getEntry() {
return entry;
}
/**
* Sets the value of the entry property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setEntry(String value) {
this.entry = value;
}
}

@ -0,0 +1,86 @@
package shared.xml;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URL;
/**
* Created by fwy13 on 13/08/17.
*/
public class XMLUtilities {
public static String classToXML(Object o) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(o.getClass());
Marshaller jaxbMarshaller = context.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(o, sw);
return sw.toString();
}
public static Object xmlToClass(File file, URL schemaURL, Class c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(file);
return xmlToClass(document, schemaURL, c);
}
public static Object xmlToClass(String xml, URL schemaURL, Class c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("utf-8"))));
return xmlToClass(document, schemaURL, c);
}
public static Object xmlToClass(Document document, URL schemaURL, Class c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
JAXBContext jc = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = jc.createUnmarshaller();
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(schemaURL);
unmarshaller.setSchema(schema);
return unmarshaller.unmarshal(new DOMSource(document));
}
public static boolean validateXML(String file, URL schemaURL){
try {
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(new File(file));
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(schemaURL);
Validator validator = schema.newValidator();
validator.validate(new DOMSource(document));
} catch (ParserConfigurationException e) {
return false;
} catch (IOException e) {
return false;
} catch (SAXException e) {
return false;
}
return true;
}
}

@ -6,12 +6,15 @@ import javafx.fxml.FXML;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import mock.app.Event; import mock.app.Event;
import org.xml.sax.SAXException;
import shared.exceptions.InvalidBoatDataException; import shared.exceptions.InvalidBoatDataException;
import shared.exceptions.InvalidRaceDataException; import shared.exceptions.InvalidRaceDataException;
import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.InvalidRegattaDataException;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;
import visualiser.model.RaceConnection; import visualiser.model.RaceConnection;
import javax.xml.bind.JAXBException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.soap.Text; import javax.xml.soap.Text;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;

@ -6,6 +6,7 @@ import javafx.scene.control.*;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage; import javafx.stage.Stage;
import mock.app.Event; import mock.app.Event;
import org.xml.sax.SAXException;
import mock.exceptions.EventConstructionException; import mock.exceptions.EventConstructionException;
import shared.exceptions.InvalidBoatDataException; import shared.exceptions.InvalidBoatDataException;
import shared.exceptions.InvalidRaceDataException; import shared.exceptions.InvalidRaceDataException;
@ -13,6 +14,8 @@ import shared.exceptions.InvalidRegattaDataException;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;
import visualiser.model.RaceConnection; import visualiser.model.RaceConnection;
import javax.xml.bind.JAXBException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;
import java.net.URL; import java.net.URL;

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Race>
<RaceID>5326</RaceID>
<RaceType>FLEET</RaceType>
<CreationTimeDate>2017-08-03T02:13:14+1200</CreationTimeDate>
<RaceStartTime Postpone="false" Time="2017-08-03T02:08:10+1200"/>
<Participants>
<Yacht SourceID="125"/>
</Participants>
<CompoundMarkSequence>
<Corner CompoundMarkID="1" SeqID="1" Rounding="SP" ZoneSize="3"/>
<Corner CompoundMarkID="2" SeqID="2" Rounding="Port" ZoneSize="3"/>
<Corner CompoundMarkID="4" SeqID="3" Rounding="Port" ZoneSize="3"/>
<Corner CompoundMarkID="3" SeqID="4" Rounding="Port" ZoneSize="3"/>
<Corner CompoundMarkID="4" SeqID="5" Rounding="Port" ZoneSize="3"/>
<Corner CompoundMarkID="5" SeqID="6" Rounding="SP" ZoneSize="3"/>
</CompoundMarkSequence>
<Course>
<CompoundMark CompoundMarkID="1" Name="Start Line">
<Mark SeqId="1" Name="PRO" TargetLat="32.296577" TargetLng="-64.854304" SourceID="101"/>
<Mark SeqId="2" Name="PIN" TargetLat="32.293771" TargetLng="-64.855242" SourceID="102"/>
</CompoundMark>
<CompoundMark CompoundMarkID="2" Name="Marker 1">
<Mark Name="Marker1" TargetLat="32.293039" TargetLng="-64.843983" SourceID="103"/>
</CompoundMark>
<CompoundMark CompoundMarkID="3" Name="Windward Gate">
<Mark Name="WGL" SeqId="1" TargetLat="32.28468" TargetLng="-64.850045" SourceID="104"/>
<Mark Name="WGR" SeqId="2" TargetLat="32.280164" TargetLng="-64.847591" SourceID="105"/>
</CompoundMark>
<CompoundMark CompoundMarkID="4" Name="Leeward Gate">
<Mark Name="LGL" SeqId="1" TargetLat="32.309693" TargetLng="-64.835249" SourceID="106"/>
<Mark Name="LGR" SeqId="2" TargetLat="32.308046" TargetLng="-64.831785" SourceID="107"/>
</CompoundMark>
<CompoundMark CompoundMarkID="5" Name="Finish Line">
<Mark Name="FL" SeqId="1" TargetLat="32.317379" TargetLng="-64.839291" SourceID="108"/>
<Mark Name="FR" SeqId="2" TargetLat="32.317257" TargetLng="-64.83626" SourceID="109"/>
</CompoundMark>
</Course>
<CourseLimit>
<Limit Lat="32.313922" Lon="-64.837168" SeqID="1"/>
<Limit Lat="32.317379" Lon="-64.839291" SeqID="2"/>
<Limit Lat="32.317911" Lon="-64.836996" SeqID="3"/>
<Limit Lat="32.317257" Lon="-64.83626" SeqID="4"/>
<Limit Lat="32.304273" Lon="-64.822834" SeqID="5"/>
<Limit Lat="32.279097" Lon="-64.841545" SeqID="6"/>
<Limit Lat="32.279604" Lon="-64.849871" SeqID="7"/>
<Limit Lat="32.289545" Lon="-64.854162" SeqID="8"/>
<Limit Lat="32.290198" Lon="-64.858711" SeqID="9"/>
<Limit Lat="32.297164" Lon="-64.856394" SeqID="10"/>
<Limit Lat="32.296148" Lon="-64.849184" SeqID="11"/>
</CourseLimit>
</Race>

@ -2,8 +2,8 @@
<Race> <Race>
<RaceID>5326</RaceID> <RaceID>5326</RaceID>
<RaceType>FLEET</RaceType> <RaceType>FLEET</RaceType>
<CreationTimeDate>CREATION_TIME</CreationTimeDate> <CreationTimeDate>2017-08-03T02:13:14+1200</CreationTimeDate>
<RaceStartTime Postpone="false" Time="START_TIME"/> <RaceStartTime Postpone="false" Time="2017-08-03T02:08:10+1200"/>
<Participants> <Participants>
<Yacht SourceID="126"/> <Yacht SourceID="126"/>
</Participants> </Participants>

@ -2,8 +2,8 @@
<Race> <Race>
<RaceID>5326</RaceID> <RaceID>5326</RaceID>
<RaceType>FLEET</RaceType> <RaceType>FLEET</RaceType>
<CreationTimeDate>CREATION_TIME</CreationTimeDate> <CreationTimeDate>2017-08-03T02:13:14+1200</CreationTimeDate>
<RaceStartTime Postpone="false" Time="START_TIME"/> <RaceStartTime Postpone="false" Time="2017-08-03T02:08:10+1200"/>
<Participants> <Participants>
<Yacht SourceID="121"/> <Yacht SourceID="121"/>
<Yacht SourceID="122"/> <Yacht SourceID="122"/>

@ -0,0 +1,6 @@
<jaxb:bindings
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:globalBindings localScoping="toplevel"/>
</jaxb:bindings>

@ -0,0 +1,17 @@
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="raceSchema.xsd" node="/xs:schema">
<jxb:schemaBindings>
<jxb:nameXmlTransform>
<jxb:typeName prefix="XML"/>
<jxb:anonymousTypeName prefix="XML"/>
</jxb:nameXmlTransform>
</jxb:schemaBindings>
<jxb:globalBindings localScoping="toplevel"/>
</jxb:bindings>
</jxb:bindings>

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Race">
<xs:complexType>
<xs:sequence>
<xs:element name="RaceID" type="xs:int"/>
<xs:element name="RaceType" type="xs:string"/>
<xs:element name="CreationTimeDate" type="xs:string"/>
<xs:element name="RaceStartTime">
<xs:complexType>
<xs:attribute name="Postpone" type="xs:string" use="required"/>
<xs:attribute name="Time" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Participants">
<xs:complexType>
<xs:sequence>
<xs:element name="Yacht" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="SourceID" type="xs:int" use="required"/>
<xs:attribute name="Entry" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CompoundMarkSequence">
<xs:complexType>
<xs:sequence>
<xs:element name="Corner" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="CompoundMarkID" type="xs:int" use="required"/>
<xs:attribute name="SeqID" type="xs:int" use="required"/>
<xs:attribute name="Rounding" type="xs:string" use="required"/>
<xs:attribute name="ZoneSize" type="xs:int" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Course">
<xs:complexType>
<xs:sequence>
<xs:element name="CompoundMark" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Mark" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="SeqId" type="xs:int"/>
<xs:attribute name="Name" type="xs:string" use="required"/>
<xs:attribute name="TargetLat" type="xs:double" use="required"/>
<xs:attribute name="TargetLng" type="xs:double" use="required"/>
<xs:attribute name="SourceID" type="xs:int" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="CompoundMarkID" type="xs:int" use="required"/>
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CourseLimit">
<xs:complexType>
<xs:sequence>
<xs:element name="Limit" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="Lat" type="xs:double" use="required"/>
<xs:attribute name="Lon" type="xs:double" use="required"/>
<xs:attribute name="SeqID" type="xs:int" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

@ -0,0 +1,31 @@
package mock.xml;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import shared.dataInput.RaceXMLReader;
import shared.exceptions.InvalidRaceDataException;
import shared.exceptions.XMLReaderException;
import javax.xml.bind.JAXBException;
import static org.mockito.Mockito.mock;
public class RaceXMLCreatorTest {
String fileToTest = "mock/mockXML/raceSchemaTest.xml";
@Mock
RaceXMLReader reader;
@Before
public void setup() throws XMLReaderException, JAXBException, InvalidRaceDataException {
}
@Test
public void getLineAngleTest(){
}
}
Loading…
Cancel
Save