diff --git a/racevisionGame/src/main/java/mock/model/RaceServer.java b/racevisionGame/src/main/java/mock/model/RaceServer.java index 585fe615..b7ccef12 100644 --- a/racevisionGame/src/main/java/mock/model/RaceServer.java +++ b/racevisionGame/src/main/java/mock/model/RaceServer.java @@ -78,8 +78,8 @@ public class RaceServer { */ private void updateXMLFiles() { updateRaceXMLFile(); - //updateBoatXMLFile(); - //updateRegattaXMLFile(); + updateBoatXMLFile(); + updateRegattaXMLFile(); } /** @@ -105,7 +105,19 @@ public class RaceServer { * Checks if the boat data source has changed, and if it has, updates LatestMessages' boat xml message. */ private void updateBoatXMLFile() { + if (boatXMLSeqNumber != race.getBoatDataSource().getSequenceNumber()) { + boatXMLSeqNumber = race.getBoatDataSource().getSequenceNumber(); + try { + String boatXMLString = BoatDataSourceToXML.toString(race.getBoatDataSource()); + XMLMessage message = createXMLMessage(boatXMLString, XMLMessageType.BOAT); + latestMessages.setXMLMessage(message); + + } catch (JAXBException e) { + Logger.getGlobal().log(Level.WARNING, "Could not serialise: " + race.getBoatDataSource(), e); + } + + } } /** diff --git a/racevisionGame/src/main/java/shared/xml/boats/BoatConfig.java b/racevisionGame/src/main/java/shared/xml/boats/BoatConfig.java new file mode 100644 index 00000000..c517c830 --- /dev/null +++ b/racevisionGame/src/main/java/shared/xml/boats/BoatConfig.java @@ -0,0 +1,533 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2017.09.01 at 11:12:43 PM NZST +// + + +package shared.xml.boats; + +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.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="Boats">
+ *           <complexType>
+ *             <complexContent>
+ *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 <sequence>
+ *                   <element name="Boat" maxOccurs="unbounded">
+ *                     <complexType>
+ *                       <complexContent>
+ *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                           <sequence>
+ *                             <element name="GPSposition">
+ *                               <complexType>
+ *                                 <complexContent>
+ *                                   <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                                     <attribute name="X" type="{http://www.w3.org/2001/XMLSchema}double" />
+ *                                     <attribute name="Y" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+ *                                     <attribute name="Z" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+ *                                   </restriction>
+ *                                 </complexContent>
+ *                               </complexType>
+ *                             </element>
+ *                           </sequence>
+ *                           <attribute name="Type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                           <attribute name="BoatName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                           <attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
+ *                           <attribute name="HullNum" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                           <attribute name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                           <attribute name="ShapeID" type="{http://www.w3.org/2001/XMLSchema}int" />
+ *                           <attribute name="StoweName" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                         </restriction>
+ *                       </complexContent>
+ *                     </complexType>
+ *                   </element>
+ *                 </sequence>
+ *               </restriction>
+ *             </complexContent>
+ *           </complexType>
+ *         </element>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "boats" +}) +@XmlRootElement(name = "BoatConfig") +public class BoatConfig { + + @XmlElement(name = "Boats", required = true) + protected BoatConfig.Boats boats; + + /** + * Gets the value of the boats property. + * + * @return + * possible object is + * {@link BoatConfig.Boats } + * + */ + public BoatConfig.Boats getBoats() { + return boats; + } + + /** + * Sets the value of the boats property. + * + * @param value + * allowed object is + * {@link BoatConfig.Boats } + * + */ + public void setBoats(BoatConfig.Boats value) { + this.boats = value; + } + + + /** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+     * <complexType>
+     *   <complexContent>
+     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *       <sequence>
+     *         <element name="Boat" maxOccurs="unbounded">
+     *           <complexType>
+     *             <complexContent>
+     *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *                 <sequence>
+     *                   <element name="GPSposition">
+     *                     <complexType>
+     *                       <complexContent>
+     *                         <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+     *                           <attribute name="X" type="{http://www.w3.org/2001/XMLSchema}double" />
+     *                           <attribute name="Y" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+     *                           <attribute name="Z" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+     *                         </restriction>
+     *                       </complexContent>
+     *                     </complexType>
+     *                   </element>
+     *                 </sequence>
+     *                 <attribute name="Type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *                 <attribute name="BoatName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *                 <attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
+     *                 <attribute name="HullNum" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *                 <attribute name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *                 <attribute name="ShapeID" type="{http://www.w3.org/2001/XMLSchema}int" />
+     *                 <attribute name="StoweName" type="{http://www.w3.org/2001/XMLSchema}string" />
+     *               </restriction>
+     *             </complexContent>
+     *           </complexType>
+     *         </element>
+     *       </sequence>
+     *     </restriction>
+     *   </complexContent>
+     * </complexType>
+     * 
+ * + * + */ + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "", propOrder = { + "boat" + }) + public static class Boats { + + @XmlElement(name = "Boat", required = true) + protected List boat; + + /** + * Gets the value of the boat property. + * + *

+ * 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 set method for the boat property. + * + *

+ * For example, to add a new item, do as follows: + *

+         *    getBoat().add(newItem);
+         * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link BoatConfig.Boats.Boat } + * + * + */ + public List getBoat() { + if (boat == null) { + boat = new ArrayList(); + } + return this.boat; + } + + + /** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+         * <complexType>
+         *   <complexContent>
+         *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+         *       <sequence>
+         *         <element name="GPSposition">
+         *           <complexType>
+         *             <complexContent>
+         *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+         *                 <attribute name="X" type="{http://www.w3.org/2001/XMLSchema}double" />
+         *                 <attribute name="Y" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+         *                 <attribute name="Z" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+         *               </restriction>
+         *             </complexContent>
+         *           </complexType>
+         *         </element>
+         *       </sequence>
+         *       <attribute name="Type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *       <attribute name="BoatName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *       <attribute name="SourceID" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
+         *       <attribute name="HullNum" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *       <attribute name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *       <attribute name="ShapeID" type="{http://www.w3.org/2001/XMLSchema}int" />
+         *       <attribute name="StoweName" type="{http://www.w3.org/2001/XMLSchema}string" />
+         *     </restriction>
+         *   </complexContent>
+         * </complexType>
+         * 
+ * + * + */ + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "", propOrder = { + "gpSposition" + }) + public static class Boat { + + @XmlElement(name = "GPSposition", required = true) + protected BoatConfig.Boats.Boat.GPSposition gpSposition; + @XmlAttribute(name = "Type", required = true) + protected String type; + @XmlAttribute(name = "BoatName", required = true) + protected String boatName; + @XmlAttribute(name = "SourceID", required = true) + protected int sourceID; + @XmlAttribute(name = "HullNum") + protected String hullNum; + @XmlAttribute(name = "ShortName") + protected String shortName; + @XmlAttribute(name = "ShapeID") + protected Integer shapeID; + @XmlAttribute(name = "StoweName") + protected String stoweName; + + /** + * Gets the value of the gpSposition property. + * + * @return + * possible object is + * {@link BoatConfig.Boats.Boat.GPSposition } + * + */ + public BoatConfig.Boats.Boat.GPSposition getGPSposition() { + return gpSposition; + } + + /** + * Sets the value of the gpSposition property. + * + * @param value + * allowed object is + * {@link BoatConfig.Boats.Boat.GPSposition } + * + */ + public void setGPSposition(BoatConfig.Boats.Boat.GPSposition value) { + this.gpSposition = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the boatName property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getBoatName() { + return boatName; + } + + /** + * Sets the value of the boatName property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setBoatName(String value) { + this.boatName = value; + } + + /** + * Gets the value of the sourceID property. + * + */ + public int getSourceID() { + return sourceID; + } + + /** + * Sets the value of the sourceID property. + * + */ + public void setSourceID(int value) { + this.sourceID = value; + } + + /** + * Gets the value of the hullNum property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getHullNum() { + return hullNum; + } + + /** + * Sets the value of the hullNum property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setHullNum(String value) { + this.hullNum = value; + } + + /** + * Gets the value of the shortName property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getShortName() { + return shortName; + } + + /** + * Sets the value of the shortName property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setShortName(String value) { + this.shortName = value; + } + + /** + * Gets the value of the shapeID property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public Integer getShapeID() { + return shapeID; + } + + /** + * Sets the value of the shapeID property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setShapeID(Integer value) { + this.shapeID = value; + } + + /** + * Gets the value of the stoweName property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getStoweName() { + return stoweName; + } + + /** + * Sets the value of the stoweName property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setStoweName(String value) { + this.stoweName = value; + } + + + /** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+             * <complexType>
+             *   <complexContent>
+             *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+             *       <attribute name="X" type="{http://www.w3.org/2001/XMLSchema}double" />
+             *       <attribute name="Y" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+             *       <attribute name="Z" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
+             *     </restriction>
+             *   </complexContent>
+             * </complexType>
+             * 
+ * + * + */ + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "") + public static class GPSposition { + + @XmlAttribute(name = "X", required = true) + protected Double x; + @XmlAttribute(name = "Y", required = true) + protected double y; + @XmlAttribute(name = "Z", required = true) + protected double z; + + /** + * Gets the value of the x property. + * + * @return + * possible object is + * {@link Double } + * + */ + public Double getX() { + return x; + } + + /** + * Sets the value of the x property. + * + * @param value + * allowed object is + * {@link Double } + * + */ + public void setX(Double value) { + this.x = value; + } + + /** + * Gets the value of the y property. + * + */ + public double getY() { + return y; + } + + /** + * Sets the value of the y property. + * + */ + public void setY(double value) { + this.y = value; + } + + /** + * Gets the value of the z property. + * + */ + public double getZ() { + return z; + } + + /** + * Sets the value of the z property. + * + */ + public void setZ(double value) { + this.z = value; + } + + } + + } + + } + +} diff --git a/racevisionGame/src/main/java/shared/xml/boats/BoatDataSourceToXML.java b/racevisionGame/src/main/java/shared/xml/boats/BoatDataSourceToXML.java new file mode 100644 index 00000000..d24bee56 --- /dev/null +++ b/racevisionGame/src/main/java/shared/xml/boats/BoatDataSourceToXML.java @@ -0,0 +1,86 @@ +package shared.xml.boats; + +import shared.dataInput.BoatDataSource; +import shared.dataInput.RaceDataSource; +import shared.enums.RoundingType; +import shared.model.Boat; +import shared.model.CompoundMark; +import shared.model.Leg; +import shared.model.Mark; +import shared.xml.Race.*; +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.BoatDataSource} to an {@link BoatConfig} object. + */ +public class BoatDataSourceToXML { + + + /** + * Converts a boat data source to an XMLRace object. + * @param boatDataSource The data source to convert. + * @return The XMLRace file. + */ + public static BoatConfig toXML(BoatDataSource boatDataSource) { + BoatConfig boatConfig = new BoatConfig(); + + boatConfig.boats = new BoatConfig.Boats(); + boatConfig.boats.boat = new ArrayList<>(); + + + for (Boat boat : boatDataSource.getBoats().values()) { + BoatConfig.Boats.Boat xmlBoat = new BoatConfig.Boats.Boat(); + + xmlBoat.setType("Yacht"); + xmlBoat.setBoatName(boat.getName()); + xmlBoat.setSourceID(boat.getSourceID()); + xmlBoat.setStoweName(boat.getCountry()); + xmlBoat.setShortName(boat.getCountry()); + + BoatConfig.Boats.Boat.GPSposition position = new BoatConfig.Boats.Boat.GPSposition(); + position.setX(boat.getPosition().getLongitude()); + position.setY(boat.getPosition().getLatitude()); + position.setZ(0); + xmlBoat.setGPSposition(position); + + boatConfig.boats.boat.add(xmlBoat); + } + + + for (Mark mark : boatDataSource.getMarkerBoats().values()) { + BoatConfig.Boats.Boat xmlBoat = new BoatConfig.Boats.Boat(); + + xmlBoat.setType("Mark"); + xmlBoat.setBoatName(mark.getName()); + xmlBoat.setSourceID(mark.getSourceID()); + + BoatConfig.Boats.Boat.GPSposition position = new BoatConfig.Boats.Boat.GPSposition(); + position.setX(mark.getPosition().getLongitude()); + position.setY(mark.getPosition().getLatitude()); + position.setZ(0); + xmlBoat.setGPSposition(position); + + boatConfig.boats.boat.add(xmlBoat); + } + + return boatConfig; + } + + + /** + * Converts a boat data source to an xml string. + * @param boatDataSource Data source to convert. + * @return String containing xml file. + * @throws JAXBException Thrown if it cannot be converted. + */ + public static String toString(BoatDataSource boatDataSource) throws JAXBException { + BoatConfig boats = toXML(boatDataSource); + return XMLUtilities.classToXML(boats); + } + + +} diff --git a/racevisionGame/src/main/java/shared/xml/boats/ObjectFactory.java b/racevisionGame/src/main/java/shared/xml/boats/ObjectFactory.java new file mode 100644 index 00000000..0319de9a --- /dev/null +++ b/racevisionGame/src/main/java/shared/xml/boats/ObjectFactory.java @@ -0,0 +1,71 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2017.09.01 at 11:12:43 PM NZST +// + + +package shared.xml.boats; + +import javax.xml.bind.annotation.XmlRegistry; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the aaa package. + *

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 ObjectFactory { + + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: aaa + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link BoatConfig } + * + */ + public BoatConfig createBoatConfig() { + return new BoatConfig(); + } + + /** + * Create an instance of {@link BoatConfig.Boats } + * + */ + public BoatConfig.Boats createBoatConfigBoats() { + return new BoatConfig.Boats(); + } + + /** + * Create an instance of {@link BoatConfig.Boats.Boat } + * + */ + public BoatConfig.Boats.Boat createBoatConfigBoatsBoat() { + return new BoatConfig.Boats.Boat(); + } + + /** + * Create an instance of {@link BoatConfig.Boats.Boat.GPSposition } + * + */ + public BoatConfig.Boats.Boat.GPSposition createBoatConfigBoatsBoatGPSposition() { + return new BoatConfig.Boats.Boat.GPSposition(); + } + +} diff --git a/racevisionGame/src/main/resources/mock/mockXML/schema/boatsSchema.xsd b/racevisionGame/src/main/resources/mock/mockXML/schema/boatsSchema.xsd new file mode 100644 index 00000000..6d5af617 --- /dev/null +++ b/racevisionGame/src/main/resources/mock/mockXML/schema/boatsSchema.xsd @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +