diff --git a/racevisionGame/pom.xml b/racevisionGame/pom.xml index efc88c09..f77e5ea3 100644 --- a/racevisionGame/pom.xml +++ b/racevisionGame/pom.xml @@ -104,7 +104,7 @@ - mock.app.App + visualiser.app.App ${maven.compiler.source} ${maven.compiler.target} diff --git a/racevisionGame/src/main/java/mock/app/App.java b/racevisionGame/src/main/java/mock/app/App.java deleted file mode 100644 index d8dbebae..00000000 --- a/racevisionGame/src/main/java/mock/app/App.java +++ /dev/null @@ -1,56 +0,0 @@ -package mock.app; - - -import javafx.application.Application; -import javafx.stage.Stage; -import mock.dataInput.PolarParser; -import mock.model.Polars; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import shared.dataInput.XMLReader; -import shared.enums.XMLFileType; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.TransformerException; -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -public class App extends Application { - - /** - * Entry point for running the programme - * - * @param args for starting the programme - */ - public static void main(String[] args) { - launch(args); - } - - @Override - public void start(Stage primaryStage) { - try { - Polars boatPolars = PolarParser.parse("mock/polars/acc_polars.csv"); - - String regattaXML = XMLReader.readXMLFileToString("mock/mockXML/regattaTest.xml", StandardCharsets.UTF_8); - String raceXML = XMLReader.readXMLFileToString("mock/mockXML/raceTest.xml", StandardCharsets.UTF_8); - String boatXML = XMLReader.readXMLFileToString("mock/mockXML/boatTest.xml", StandardCharsets.UTF_8); - - Event raceEvent = new Event(raceXML, regattaXML, boatXML, XMLFileType.Contents, boatPolars); - raceEvent.start(); - - } catch (Exception e) { - //Catch all exceptions, print, and exit. - e.printStackTrace(); - System.exit(1); - } - } - - - -} diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index 53d664b5..4c2b38ce 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -8,8 +8,10 @@ import org.mockito.Mock; import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Array; +import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; @@ -54,6 +56,14 @@ public class ConnectionAcceptor implements Runnable { new Thread(checkClientConnection).start(); } + public String getAddress() throws UnknownHostException { + return InetAddress.getLocalHost().getHostAddress(); + } + + public int getServerPort() { + return serverPort; + } + /** * Run the Acceptor */ diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 7964a30a..3ba6841c 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -1,5 +1,6 @@ package mock.app; +import mock.dataInput.PolarParser; import mock.model.MockRace; import mock.model.Polars; import network.Messages.LatestMessages; @@ -11,7 +12,10 @@ import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; import shared.model.Constants; +import javax.xml.transform.TransformerException; import java.io.IOException; +import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -20,6 +24,7 @@ import java.time.format.DateTimeFormatter; * A Race Event, this holds all of the race's information as well as handling the connection to its clients. */ public class Event { + private static Event theEvent = new Event(); private String raceXML; private String regattaXML; @@ -32,36 +37,42 @@ public class Event { private ConnectionAcceptor mockOutput; private LatestMessages latestMessages; - /** * Constructs an event, using various XML files. - * @param raceXML The race.xml file. - * @param regattaXML The regatta.xml file. - * @param boatXML The boat.xml file. - * @param type How to read the file - e.g., load as resource. - * @param boatPolars polars that the boat uses */ - public Event(String raceXML, String regattaXML, String boatXML, XMLFileType type, Polars boatPolars) { - - this.raceXML = getRaceXMLAtCurrentTime(raceXML); - this.boatXML = boatXML; - this.regattaXML = regattaXML; - this.xmlFileType = type; - - this.boatPolars = boatPolars; - - this.latestMessages = new LatestMessages(); + private Event() { + try { + this.raceXML = getRaceXMLAtCurrentTime(XMLReader.readXMLFileToString("mock/mockXML/raceTest.xml", StandardCharsets.UTF_8)); + this.boatXML = XMLReader.readXMLFileToString("mock/mockXML/boatTest.xml", StandardCharsets.UTF_8); + this.regattaXML = XMLReader.readXMLFileToString("mock/mockXML/regattaTest.xml", StandardCharsets.UTF_8); + this.xmlFileType = XMLFileType.Contents; + this.boatPolars = PolarParser.parse("mock/polars/acc_polars.csv"); - try { + this.latestMessages = new LatestMessages(); this.mockOutput = new ConnectionAcceptor(latestMessages); - new Thread(mockOutput).start(); - - } catch (IOException e) { + } + catch (IOException e) { + e.printStackTrace(); + } catch (XMLReaderException e) { + e.printStackTrace(); + } catch (TransformerException e) { e.printStackTrace(); } } + public static Event getEvent() { + return theEvent; + } + + public String getAddress() throws UnknownHostException { + return mockOutput.getAddress(); + } + + public int getPort() { + return mockOutput.getServerPort(); + } + /** * Sends the initial race data and then begins race simulation. * @throws InvalidRaceDataException Thrown if the race xml file cannot be parsed. @@ -70,6 +81,7 @@ public class Event { * @throws InvalidRegattaDataException Thrown if the regatta xml file cannot be parsed. */ public void start() throws InvalidRaceDataException, XMLReaderException, InvalidBoatDataException, InvalidRegattaDataException { + new Thread(mockOutput).start(); sendXMLs(); @@ -119,5 +131,4 @@ public class Event { return raceXML; } - } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index dd82065c..dd309516 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -8,11 +8,17 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; +import mock.app.Event; +import shared.exceptions.InvalidBoatDataException; +import shared.exceptions.InvalidRaceDataException; +import shared.exceptions.InvalidRegattaDataException; +import shared.exceptions.XMLReaderException; import visualiser.model.RaceConnection; import java.io.IOException; import java.net.Socket; import java.net.URL; +import java.net.UnknownHostException; import java.util.ResourceBundle; /** @@ -41,8 +47,6 @@ public class ConnectionController extends Controller { public void initialize(URL location, ResourceBundle resources) { // TODO - replace with config file connections = FXCollections.observableArrayList(); - connections.add(new RaceConnection("livedata.americascup.com", 4941)); - connections.add(new RaceConnection("localhost", 4942)); connectionTable.setItems(connections); hostnameColumn.setCellValueFactory(cellData -> cellData.getValue().hostnameProperty()); @@ -95,4 +99,28 @@ public class ConnectionController extends Controller { } } + + /** + * Sets up a new host + */ + public void addLocal() { + try { + Event game = Event.getEvent(); + urlField.textProperty().set(game.getAddress()); + portField.textProperty().set(Integer.toString(game.getPort())); + + game.start(); + addConnection(); + } catch (InvalidRaceDataException e) { + e.printStackTrace(); + } catch (XMLReaderException e) { + e.printStackTrace(); + } catch (InvalidBoatDataException e) { + e.printStackTrace(); + } catch (InvalidRegattaDataException e) { + e.printStackTrace(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } } diff --git a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java index a6bd8301..036e1f2a 100644 --- a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java +++ b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java @@ -15,6 +15,11 @@ public class RaceConnection { private final int port; private final StringProperty status; + /** + * Constructor for remote host connections. + * @param hostname URL for remote host + * @param port port for game feed + */ public RaceConnection(String hostname, int port) { this.hostname = new SimpleStringProperty(hostname); this.port = port; diff --git a/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml b/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml index 32384999..254ddb8a 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml @@ -1,15 +1,25 @@ - - - + + + + + + + + + + - + + - - + + + + @@ -18,42 +28,43 @@ - + - + - - -