Seperated race xml creation into a class of its own

- Created RaceXMLCreator class
- made a function to convert limit to GPS Coordinate (limitToGPSCoordinate)
- can rotate a GPS Coordinate around a point (rotate)
- can get center of a race with (getCenter)
#story[1092]
This commit is contained in:
Fan-Wu Yang
2017-08-03 23:13:28 +12:00
parent 4e8d4f2433
commit f23c3f854d
3 changed files with 145 additions and 222 deletions
@@ -3,8 +3,7 @@ package mock.app;
import mock.dataInput.PolarParser;
import mock.model.MockRace;
import mock.model.Polars;
import mock.xml.Race;
import mock.xml.RaceFactory;
import mock.xml.RaceXMLCreator;
import network.Messages.LatestMessages;
import shared.dataInput.*;
import shared.enums.XMLFileType;
@@ -12,13 +11,9 @@ import shared.exceptions.InvalidBoatDataException;
import shared.exceptions.InvalidRaceDataException;
import shared.exceptions.InvalidRegattaDataException;
import shared.exceptions.XMLReaderException;
import shared.model.CompoundMark;
import shared.model.Constants;
import shared.model.Corner;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.transform.TransformerException;
import java.io.*;
import java.net.UnknownHostException;
@@ -49,7 +44,8 @@ public class Event {
*/
private Event() {
try {
this.raceXML = getRaceXMLAtCurrentTime(alterRaceToWind("mock/mockXML/raceSchemaTest.xml", 0));
this.raceXML = getRaceXMLAtCurrentTime(RaceXMLCreator.alterRaceToWind("mock/mockXML/raceSchemaTest.xml", 90));
System.out.println(this.raceXML);
this.boatXML = XMLReader.readXMLFileToString("mock/mockXML/boatsSinglePlayer.xml", StandardCharsets.UTF_8);
this.regattaXML = XMLReader.readXMLFileToString("mock/mockXML/regattaTest.xml", StandardCharsets.UTF_8);
this.xmlFileType = XMLFileType.Contents;
@@ -143,92 +139,4 @@ public class Event {
}
private Race copyRace(RaceXMLReader reader) throws InvalidRaceDataException, XMLReaderException {
mock.xml.RaceFactory raceFactory = new RaceFactory();
mock.xml.Race race = raceFactory.createRace();
race.setRaceID(String.valueOf(reader.getRaceId()));
race.setRaceType(String.valueOf(reader.getRaceType()));
race.setCreationTimeDate("CREATION_TIME");//this needs to be changed later
//Race Start Time
mock.xml.Race.RaceStartTime raceStartTime = raceFactory.createRaceRaceStartTime();
raceStartTime.setPostpone("false");
raceStartTime.setTime("START_TIME");//this needs to be changed later
race.setRaceStartTime(raceStartTime);
//Participants
Race.Participants participants = raceFactory.createRaceParticipants();
for (int i :reader.getParticipants()) {
Race.Participants.Yacht yacht = raceFactory.createRaceParticipantsYacht();
yacht.setSourceID(String.valueOf(i));
participants.getYacht().add(yacht); //java schema does not clone the array so this is "safe".
}
race.setParticipants(participants);
//compound marks sequence
Race.CompoundMarkSequence cms = raceFactory.createRaceCompoundMarkSequence();
for (Corner mark: reader.getCornersList()){
Race.CompoundMarkSequence.Corner corner = raceFactory.createRaceCompoundMarkSequenceCorner();
corner.setCompoundMarkID(String.valueOf(mark.getId()));
corner.setSeqID(String.valueOf(mark.getSeqID()));
cms.getCorner().add(corner);
}
race.setCompoundMarkSequence(cms);
//Course
Race.Course course = raceFactory.createRaceCourse();
for (CompoundMark mark: reader.getCompoundMarks()){
Race.Course.CompoundMark cm = raceFactory.createRaceCourseCompoundMark();
cm.setName(mark.getName());
cm.setCompoundMarkID(String.valueOf(mark.getId()));
if (mark.getMark1() != null){
Race.Course.CompoundMark.Mark m1 = raceFactory.createRaceCourseCompoundMarkMark();
m1.setName(mark.getMark1().getName());
m1.setTargetLat(String.valueOf(mark.getMark1().getPosition().getLatitude()));
m1.setTargetLng(String.valueOf(mark.getMark1().getPosition().getLongitude()));
m1.setSourceID(String.valueOf(mark.getMark1().getSourceID()));
cm.getMark().add(m1);
}
//make this not copy paste later but just need the concept working right now
if (mark.getMark2() != null){
Race.Course.CompoundMark.Mark m2 = raceFactory.createRaceCourseCompoundMarkMark();
m2.setName(mark.getMark1().getName());
m2.setTargetLat(String.valueOf(mark.getMark1().getPosition().getLatitude()));
m2.setTargetLng(String.valueOf(mark.getMark1().getPosition().getLongitude()));
m2.setSourceID(String.valueOf(mark.getMark1().getSourceID()));
cm.getMark().add(m2);
}
course.getCompoundMark().add(cm);
}
race.setCourse(course);
//Course Limit
Race.CourseLimit courseLimit = raceFactory.createRaceCourseLimit();
for (int i = 0; i < reader.getBoundary().size(); i++){
Race.CourseLimit.Limit limit = raceFactory.createRaceCourseLimitLimit();
limit.setSeqID(String.valueOf(i+1));
limit.setLat(String.valueOf(reader.getBoundary().get(i).getLatitude()));
limit.setLon(String.valueOf(reader.getBoundary().get(i).getLongitude()));
courseLimit.getLimit().add(limit);
}
race.setCourseLimit(courseLimit);
return race;
}
private String alterRaceToWind(String s, double degrees) throws XMLReaderException, InvalidRaceDataException, JAXBException {
RaceXMLReader reader = new RaceXMLReader(s, XMLFileType.ResourcePath);
mock.xml.Race race = copyRace(reader);
JAXBContext context = JAXBContext.newInstance(mock.xml.Race.class);
Marshaller jaxbMarshaller = context.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(race, sw);
return sw.toString();
}
}