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 participants; private List course; private List 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); } }