You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
6.1 KiB

package seng302.Data;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import seng302.Exceptions.InvalidRaceDataException;
import seng302.GPSCoordinate;
import seng302.Model.BoatInRace;
import seng302.Model.Marker;
import seng302.Mock.RaceDataSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
import java.time.OffsetDateTime;
import java.util.List;
/**
* Created by esa46 on 21/04/17.
*/
public class RaceData {
private RaceDataSource dataSource;
Document doc;
Element raceElement;
private OffsetDateTime creationTimeDate;
private OffsetDateTime raceStartTime;
private List<BoatInRace> participants;
private List<Marker> course;
private List<GPSCoordinate> courseLimit;
public RaceData(RaceDataSource dataSource) {
this.dataSource = dataSource;
creationTimeDate = OffsetDateTime.now();
raceStartTime = OffsetDateTime.now().plusMinutes(3);
participants = dataSource.getBoats();
course = dataSource.getMarkers();
courseLimit = dataSource.getBoundary();
}
public String createXML() {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
doc = docBuilder.newDocument();
//root element;
raceElement = doc.createElement("Race");
doc.appendChild(raceElement);
appendRaceId();
appendRaceType();
Element creationTimeElement = doc.createElement("CreationTimeDate");
creationTimeElement.appendChild(doc.createTextNode(creationTimeDate.toString()));
raceElement.appendChild(creationTimeElement);
Element startTimeElement = doc.createElement("RaceStartTime");
startTimeElement.setAttribute("Time", raceStartTime.toString());
startTimeElement.setAttribute("Postpone", "false");
raceElement.appendChild(startTimeElement);
Element participantsElement = doc.createElement("Participants");
for (BoatInRace boat : participants) {
Element yachtElement = doc.createElement("Yacht");
yachtElement.setAttribute("SourceID", boat.getSourceID() + "");
participantsElement.appendChild(yachtElement);
}
raceElement.appendChild(participantsElement);
Element courseElement = doc.createElement("Course");
Element compoundMarkSeqElement = doc.createElement("CompoundMarkSequence");
int i = 1;
for (Marker marker : course) {
Element compoundMarkElement = doc.createElement("CompoundMark");
compoundMarkElement.setAttribute("CompoundMarkId", i + "");
compoundMarkElement.setAttribute("Name", marker.getName());
Element mark1 = doc.createElement("Mark");
mark1.setAttribute("TargetLat", marker.getMark1().getLatitude() + "");
mark1.setAttribute("TargetLng", marker.getMark1().getLongitude() + "");
compoundMarkElement.appendChild(mark1);
if (!(marker.getMark1().equals(marker.getMark2()))) {
Element mark2 = doc.createElement("Mark");
mark2.setAttribute("TargetLat", marker.getMark2().getLatitude() + "");
mark2.setAttribute("TargetLng", marker.getMark2().getLongitude() + "");
compoundMarkElement.appendChild(mark2);
}
courseElement.appendChild(compoundMarkElement);
Element cornerElement = doc.createElement("Corner");
cornerElement.setAttribute("SeqID", i + "");
cornerElement.setAttribute("CompoundMarkID", i + "");
compoundMarkSeqElement.appendChild(cornerElement);
i++;
}
raceElement.appendChild(compoundMarkSeqElement);
raceElement.appendChild(courseElement);
int j = 1;
Element courseLimitElement = doc.createElement("CourseLimit");
for (GPSCoordinate coordinate : courseLimit) {
Element limitElement = doc.createElement("Limit");
limitElement.setAttribute("SeqID", j + "");
limitElement.setAttribute("Lat", coordinate.getLatitude() + "");
limitElement.setAttribute("Lon", coordinate.getLongitude() + "");
courseLimitElement.appendChild(limitElement);
j++;
}
raceElement.appendChild(courseLimitElement);
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
//Serialize document.
StringWriter stringWriter = new StringWriter();
StreamResult result = new StreamResult(stringWriter);
transformer.transform(source,result);
return stringWriter.toString();
} catch (ParserConfigurationException pce) {
throw new InvalidRaceDataException();
} catch (TransformerException tfe) {
throw new InvalidRaceDataException();
}
}
private void appendRaceId() {
Element raceIdElement = doc.createElement("RaceID");
raceIdElement.appendChild(doc.createTextNode(dataSource.getRaceId()));
raceElement.appendChild(raceIdElement);
}
private void appendRaceType() {
Element raceTypeElement = doc.createElement("RaceType");
raceTypeElement.appendChild(doc.createTextNode(dataSource.getRaceType()));
raceElement.appendChild(raceTypeElement);
}
}