Participants can now join during the warning period as well.
Added RaceDataSourceToXML. RaceServer now create an XMLMessage when the race's RaceDataSource changes. #story[1188]
This commit is contained in:
@@ -161,8 +161,6 @@ public class Event {
|
|||||||
this.connectionThread = new Thread(connectionAcceptor, "Event.Start()->ConnectionAcceptor thread");
|
this.connectionThread = new Thread(connectionAcceptor, "Event.Start()->ConnectionAcceptor thread");
|
||||||
connectionThread.start();
|
connectionThread.start();
|
||||||
|
|
||||||
sendXMLs();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,18 +173,6 @@ public class Event {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends out each xml string, via the mock output
|
|
||||||
*/
|
|
||||||
private void sendXMLs() {
|
|
||||||
|
|
||||||
connectionAcceptor.setRegattaXml(regattaXML);
|
|
||||||
|
|
||||||
connectionAcceptor.setRaceXml(raceXML);
|
|
||||||
|
|
||||||
connectionAcceptor.setBoatsXml(boatXML);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//TODO remove this after demo on 18th august!
|
//TODO remove this after demo on 18th august!
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -109,6 +109,11 @@ public class ClientConnection implements Runnable {
|
|||||||
*/
|
*/
|
||||||
private ConnectionStateEnum connectionState = ConnectionStateEnum.UNKNOWN;
|
private ConnectionStateEnum connectionState = ConnectionStateEnum.UNKNOWN;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The source ID that has been allocated to the client.
|
||||||
|
* 0 means not allocated.
|
||||||
|
*/
|
||||||
|
private int allocatedSourceID = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -178,7 +183,7 @@ public class ClientConnection implements Runnable {
|
|||||||
|
|
||||||
RequestToJoin requestToJoin = waitForRequestToJoin();
|
RequestToJoin requestToJoin = waitForRequestToJoin();
|
||||||
|
|
||||||
int allocatedSourceID = 0;
|
allocatedSourceID = 0;
|
||||||
|
|
||||||
//If they want to participate, give them a source ID number.
|
//If they want to participate, give them a source ID number.
|
||||||
if (requestToJoin.getRequestType() == RequestToJoinEnum.PARTICIPANT) {
|
if (requestToJoin.getRequestType() == RequestToJoinEnum.PARTICIPANT) {
|
||||||
@@ -283,6 +288,10 @@ public class ClientConnection implements Runnable {
|
|||||||
if (this.controllerServerThread != null) {
|
if (this.controllerServerThread != null) {
|
||||||
this.controllerServerThread.interrupt();
|
this.controllerServerThread.interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (allocatedSourceID != 0) {
|
||||||
|
sourceIdAllocator.returnSourceID(allocatedSourceID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer {
|
|||||||
long previousFrameTime = System.currentTimeMillis();
|
long previousFrameTime = System.currentTimeMillis();
|
||||||
|
|
||||||
while (((race.getRaceStatusEnum() == RaceStatusEnum.PRESTART)
|
while (((race.getRaceStatusEnum() == RaceStatusEnum.PRESTART)
|
||||||
|| (race.getRaceStatusEnum() == RaceStatusEnum.NOT_ACTIVE)) && loopBool) {
|
|| (race.getRaceStatusEnum() == RaceStatusEnum.NOT_ACTIVE)
|
||||||
|
|| (race.getRaceStatusEnum() == RaceStatusEnum.WARNING)) && loopBool) {
|
||||||
|
|
||||||
long currentTime = System.currentTimeMillis();
|
long currentTime = System.currentTimeMillis();
|
||||||
|
|
||||||
@@ -87,6 +88,7 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer {
|
|||||||
//Parse the race snapshot.
|
//Parse the race snapshot.
|
||||||
server.parseSnapshot();
|
server.parseSnapshot();
|
||||||
|
|
||||||
|
|
||||||
waitForFramePeriod(previousFrameTime, currentTime, 50);
|
waitForFramePeriod(previousFrameTime, currentTime, 50);
|
||||||
previousFrameTime = currentTime;
|
previousFrameTime = currentTime;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,15 @@ import network.Messages.Enums.XMLMessageType;
|
|||||||
import shared.model.Bearing;
|
import shared.model.Bearing;
|
||||||
import shared.model.CompoundMark;
|
import shared.model.CompoundMark;
|
||||||
import shared.model.Mark;
|
import shared.model.Mark;
|
||||||
|
import shared.xml.Race.RaceDataSourceToXML;
|
||||||
|
import shared.xml.boats.BoatDataSourceToXML;
|
||||||
|
import shared.xml.regatta.RegattaDataSourceToXML;
|
||||||
|
|
||||||
|
import javax.xml.bind.JAXBException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by connortaylorbrown on 2/08/17.
|
* Created by connortaylorbrown on 2/08/17.
|
||||||
@@ -27,26 +33,22 @@ public class RaceServer {
|
|||||||
/**
|
/**
|
||||||
* The sequence number of race XML messages.
|
* The sequence number of race XML messages.
|
||||||
*/
|
*/
|
||||||
private int raceXMLSeqNumber;
|
private int raceXMLSeqNumber = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The sequence number of boat XML messages.
|
* The sequence number of boat XML messages.
|
||||||
*/
|
*/
|
||||||
private int boatXMLSeqNumber;
|
private int boatXMLSeqNumber = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The sequence number of regatta XML messages.
|
* The sequence number of regatta XML messages.
|
||||||
*/
|
*/
|
||||||
private int regattaXMLSeqNumber;
|
private int regattaXMLSeqNumber = -1;
|
||||||
|
|
||||||
|
|
||||||
public RaceServer(MockRace race, LatestMessages latestMessages) {
|
public RaceServer(MockRace race, LatestMessages latestMessages) {
|
||||||
this.race = race;
|
this.race = race;
|
||||||
this.latestMessages = latestMessages;
|
this.latestMessages = latestMessages;
|
||||||
|
|
||||||
this.raceXMLSeqNumber = race.getRaceDataSource().getSequenceNumber();
|
|
||||||
//this.boatXMLSeqNumber = race.getBoatDataSource().getSequenceNumber();
|
|
||||||
//this.regattaXMLSeqNumber = race.getRegattaDataSource().getSequenceNumber();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -85,11 +87,17 @@ public class RaceServer {
|
|||||||
*/
|
*/
|
||||||
private void updateRaceXMLFile() {
|
private void updateRaceXMLFile() {
|
||||||
if (raceXMLSeqNumber != race.getRaceDataSource().getSequenceNumber()) {
|
if (raceXMLSeqNumber != race.getRaceDataSource().getSequenceNumber()) {
|
||||||
//TODO generate XML string from race data source
|
|
||||||
String raceXMLString = "test";//TODO
|
raceXMLSeqNumber = race.getRaceDataSource().getSequenceNumber();
|
||||||
|
try {
|
||||||
|
String raceXMLString = RaceDataSourceToXML.toString(race.getRaceDataSource());
|
||||||
XMLMessage message = createXMLMessage(raceXMLString, XMLMessageType.RACE);
|
XMLMessage message = createXMLMessage(raceXMLString, XMLMessageType.RACE);
|
||||||
latestMessages.setXMLMessage(message);
|
latestMessages.setXMLMessage(message);
|
||||||
raceXMLSeqNumber = race.getRaceDataSource().getSequenceNumber();
|
|
||||||
|
} catch (JAXBException e) {
|
||||||
|
Logger.getGlobal().log(Level.WARNING, "Could not serialise: " + race.getRaceDataSource(), e);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ public class SourceIdAllocator {
|
|||||||
*/
|
*/
|
||||||
public synchronized int allocateSourceID() throws SourceIDAllocationException {
|
public synchronized int allocateSourceID() throws SourceIDAllocationException {
|
||||||
|
|
||||||
if (mockRace.getRaceStatusEnum() != RaceStatusEnum.PRESTART) {
|
if (!((mockRace.getRaceStatusEnum() == RaceStatusEnum.PRESTART)
|
||||||
|
|| (mockRace.getRaceStatusEnum() == RaceStatusEnum.WARNING))) {
|
||||||
throw new SourceIDAllocationException("Could not allocate a source ID. Can only allocate during pre-start period. It is currently: " + mockRace.getRaceStatusEnum());
|
throw new SourceIDAllocationException("Could not allocate a source ID. Can only allocate during pre-start period. It is currently: " + mockRace.getRaceStatusEnum());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,8 @@ public enum RaceTypeEnum {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores a mapping between Byte values and RaceStatusEnum values.
|
* Stores a mapping between Byte values and RaceStatusEnum values.
|
||||||
*/
|
*/
|
||||||
@@ -107,4 +109,14 @@ public enum RaceTypeEnum {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
if (fromByte(value) == FLEET_RACE) {
|
||||||
|
return "fleet";
|
||||||
|
} else if (fromByte(value) == MATCH_RACE) {
|
||||||
|
return "match";
|
||||||
|
} else {
|
||||||
|
return super.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,4 +22,16 @@ public interface BoatDataSource {
|
|||||||
* @return Map between source ID and mark.
|
* @return Map between source ID and mark.
|
||||||
*/
|
*/
|
||||||
Map<Integer, Mark> getMarkerBoats();
|
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 final Map<Integer, Mark> markerMap = new HashMap<>();
|
||||||
|
|
||||||
|
|
||||||
|
private int sequenceNumber = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for Boat XML using a file.
|
* Constructor for Boat XML using a file.
|
||||||
*
|
*
|
||||||
@@ -174,4 +176,15 @@ public class BoatXMLReader extends XMLReader implements BoatDataSource {
|
|||||||
public Map<Integer, Mark> getMarkerBoats() {
|
public Map<Integer, Mark> getMarkerBoats() {
|
||||||
return markerMap;
|
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 final Map<Integer, Mark> markerMap = new HashMap<>();
|
||||||
|
|
||||||
|
|
||||||
|
private int sequenceNumber = 0;
|
||||||
|
|
||||||
|
|
||||||
public EmptyBoatDataSource() {
|
public EmptyBoatDataSource() {
|
||||||
}
|
}
|
||||||
@@ -44,4 +46,15 @@ public class EmptyBoatDataSource implements BoatDataSource {
|
|||||||
public Map<Integer, Mark> getMarkerBoats() {
|
public Map<Integer, Mark> getMarkerBoats() {
|
||||||
return markerMap;
|
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 network.Messages.Enums.RaceTypeEnum;
|
||||||
import shared.model.CompoundMark;
|
import shared.model.CompoundMark;
|
||||||
|
import shared.model.Corner;
|
||||||
import shared.model.GPSCoordinate;
|
import shared.model.GPSCoordinate;
|
||||||
import shared.model.Leg;
|
import shared.model.Leg;
|
||||||
|
import shared.xml.Race.XMLCorner;
|
||||||
|
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -48,6 +50,12 @@ public class EmptyRaceDataSource implements RaceDataSource {
|
|||||||
*/
|
*/
|
||||||
private final List<Leg> legs = new ArrayList<>();
|
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.
|
* The time that the race.xml file was created.
|
||||||
@@ -100,6 +108,11 @@ public class EmptyRaceDataSource implements RaceDataSource {
|
|||||||
return legs;
|
return legs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Corner> getCorners() {
|
||||||
|
return corners;
|
||||||
|
}
|
||||||
|
|
||||||
public List<CompoundMark> getCompoundMarks() {
|
public List<CompoundMark> getCompoundMarks() {
|
||||||
return new ArrayList<>(compoundMarkMap.values());
|
return new ArrayList<>(compoundMarkMap.values());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,6 +60,8 @@ public class EmptyRegattaDataSource implements RegattaDataSource {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private int sequenceNumber = 0;
|
||||||
|
|
||||||
|
|
||||||
public EmptyRegattaDataSource() {
|
public EmptyRegattaDataSource() {
|
||||||
}
|
}
|
||||||
@@ -119,4 +121,15 @@ public class EmptyRegattaDataSource implements RegattaDataSource {
|
|||||||
public GPSCoordinate getGPSCoordinate() {
|
public GPSCoordinate getGPSCoordinate() {
|
||||||
return new GPSCoordinate(centralLatitude, centralLongitude);
|
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 network.Messages.Enums.RaceTypeEnum;
|
||||||
import shared.model.CompoundMark;
|
import shared.model.CompoundMark;
|
||||||
|
import shared.model.Corner;
|
||||||
import shared.model.GPSCoordinate;
|
import shared.model.GPSCoordinate;
|
||||||
import shared.model.Leg;
|
import shared.model.Leg;
|
||||||
|
import shared.xml.Race.XMLCorner;
|
||||||
|
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -27,6 +29,12 @@ public interface RaceDataSource {
|
|||||||
*/
|
*/
|
||||||
List<Leg> getLegs();
|
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.
|
* Returns a list of coordinates representing the boundary of the race.
|
||||||
* @return The boundary of the race.
|
* @return The boundary of the race.
|
||||||
|
|||||||
@@ -345,7 +345,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
|
|||||||
|
|
||||||
int cornerSeq = Integer.parseInt(getAttribute(cornerElement, "SeqID"));
|
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.
|
//Gets the CompoundMark associated with this corner.
|
||||||
CompoundMark lastCompoundMark = this.compoundMarkMap.get(cornerID);
|
CompoundMark lastCompoundMark = this.compoundMarkMap.get(cornerID);
|
||||||
@@ -368,7 +368,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
|
|||||||
|
|
||||||
cornerSeq = Integer.parseInt(getAttribute(cornerElement, "SeqID"));
|
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
|
//gets the Rounding of this corner element
|
||||||
cornerRounding = getCompoundMarkRounding(cornerElement);
|
cornerRounding = getCompoundMarkRounding(cornerElement);
|
||||||
|
|
||||||
@@ -490,7 +490,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
|
|||||||
return participants;
|
return participants;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Corner> getCornersList() {
|
public List<Corner> getCorners() {
|
||||||
return cornersList;
|
return cornersList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,5 +66,15 @@ public interface RegattaDataSource {
|
|||||||
float getMagneticVariation();
|
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 float magneticVariation;
|
||||||
|
|
||||||
|
|
||||||
|
private int sequenceNumber = 0;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for Regatta XML using a file.
|
* Constructor for Regatta XML using a file.
|
||||||
@@ -209,4 +211,14 @@ public class RegattaXMLReader extends XMLReader implements RegattaDataSource {
|
|||||||
public GPSCoordinate getGPSCoordinate() {
|
public GPSCoordinate getGPSCoordinate() {
|
||||||
return new GPSCoordinate(centralLatitude, centralLongitude);
|
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;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -32,7 +32,6 @@
|
|||||||
<GPSposition X= "-64.83626" Y="32.317257" Z="0"/>
|
<GPSposition X= "-64.83626" Y="32.317257" Z="0"/>
|
||||||
</Boat>
|
</Boat>
|
||||||
|
|
||||||
<!--Participants-->
|
|
||||||
<!--Participants-->
|
<!--Participants-->
|
||||||
<Boat BoatName="Emirates Team New Zealand" HullNum="RG01" ShapeID="0" ShortName="NZL" SourceID="121" StoweName="NZL" Type="Yacht">
|
<Boat BoatName="Emirates Team New Zealand" HullNum="RG01" ShapeID="0" ShortName="NZL" SourceID="121" StoweName="NZL" Type="Yacht">
|
||||||
<GPSposition X="-64.854304" Y="32.296577" Z="0"/>
|
<GPSposition X="-64.854304" Y="32.296577" Z="0"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user