package seng302.Mock; import javafx.scene.paint.Color; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import seng302.XMLReader; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.lang.annotation.ElementType; import java.text.ParseException; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * Created by Joseph on 24/04/2017. */ public class BoatXMLReader extends XMLReader { Map streamedBoatMap = new HashMap<>(); private Color[] colours = {Color.BLUEVIOLET, Color.BLACK, Color.RED, Color.ORANGE, Color.DARKOLIVEGREEN, Color.LIMEGREEN}; private int currentColourIndex = 0; /** * Constructor for Boat XML Reader * @param filePath path of the file * @throws IOException error * @throws SAXException error * @throws ParserConfigurationException error */ public BoatXMLReader(String filePath) throws IOException, SAXException, ParserConfigurationException, ParseException { this(filePath, true); } /** * Constructor for Boat XML Reader * @param filePath file path to read * @param read whether or not to read and store the files straight away. * @throws IOException error * @throws SAXException error * @throws ParserConfigurationException error */ public BoatXMLReader(String filePath, boolean read) throws IOException, SAXException, ParserConfigurationException, ParseException { super(filePath); if (read) { read(); } } private void read() { readSettings(); readShapes(); readBoats(); } /** * Reads boats settings. * INFORMATION FROM HERE IS IGNORED FOR NOW */ private void readSettings() { } /** * Reads different kinds of boat. * INFORMATION FROM HERE IS IGNORED FOR NOW */ private void readShapes() { } /** * Reads the boats in the race */ private void readBoats() { Element nBoats = (Element) doc.getElementsByTagName("Boats").item(0); for (int i = 0; i < nBoats.getChildNodes().getLength(); i++) { Node boat = nBoats.getChildNodes().item(i); if (boat.getNodeName().equals("Boat")) { readSingleBoat(boat); currentColourIndex++; } } } /** * Reads the information about one boat * Ignored values: Type, ShapeID, StoweName, HullNum, Skipper */ private void readSingleBoat(Node boat) { StreamedBoat streamedBoat; String country = null; int sourceID = Integer.parseInt(boat.getAttributes().getNamedItem("SourceID").getTextContent()); String boatName = boat.getAttributes().getNamedItem("BoatName").getTextContent(); String shortName = boat.getAttributes().getNamedItem("ShortName").getTextContent(); if (boat.getAttributes().getNamedItem("Country") != null) country = boat.getAttributes().getNamedItem("Country").getTextContent(); if (!streamedBoatMap.containsKey(sourceID)) { if (country != null) { streamedBoat = new StreamedBoat(sourceID, boatName, colours[currentColourIndex], country); } else { streamedBoat = new StreamedBoat(sourceID, boatName, colours[currentColourIndex], shortName); } streamedBoatMap.put(sourceID, streamedBoat); } for (int i = 0; i < boat.getChildNodes().getLength(); i++) { Node GPSPosition = boat.getChildNodes().item(i); if (GPSPosition.getNodeName().equals("GPSposition")) readBoatPositionInformation(sourceID, GPSPosition); } } /** * Reads the positional information about a boat * Ignored values: FlagPosition, MastTop, Z value of GPSposition */ private void readBoatPositionInformation(int sourceID, Node GPSPosition) { // TODO Get relative point before implementing. (GPSposition is based off a relative point). } private Map getBoatMap() { return streamedBoatMap; } }