From 9156bde8af94a2eb9e10d8b6a35cf5bdc46c8de4 Mon Sep 17 00:00:00 2001 From: fjc40 Date: Fri, 1 Sep 2017 01:19:17 +1200 Subject: [PATCH] Moved XML message creation to RaceServer instead of ConnectionAcceptor. RaceServer does not currently generate new XMLMessages - NYI. Added a sequence number to RaceDataSource - this is used to indicate that the data source has been modified. #story[1188] --- .../java/mock/app/ConnectionAcceptor.java | 78 +-------------- .../src/main/java/mock/app/Event.java | 4 +- .../src/main/java/mock/model/RaceServer.java | 96 +++++++++++++++++++ .../java/network/Messages/LatestMessages.java | 1 + .../shared/dataInput/EmptyRaceDataSource.java | 12 +++ .../java/shared/dataInput/RaceDataSource.java | 12 +++ .../java/shared/dataInput/RaceXMLReader.java | 12 +++ .../src/main/java/shared/model/Constants.java | 9 +- .../Controllers/FinishController.java | 6 +- .../main/resources/mock/mockXML/raceTest.xml | 7 +- .../mock/model/SourceIdAllocatorTest.java | 29 ++---- .../test/resources/mock/mockXML/raceTest.xml | 8 +- 12 files changed, 154 insertions(+), 120 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index ee8ea216..b4ed1d2a 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -61,12 +61,7 @@ public class ConnectionAcceptor implements Runnable { */ private SourceIdAllocator sourceIdAllocator; - //race xml sequence number - private short raceXMLSequenceNumber; - //boat xml sequence number - private short boatXMLSequenceNumber; - //regatta xml sequence number - private short regattaXMLSequenceNumber; + // private RaceLogic raceLogic = null; @@ -209,77 +204,6 @@ public class ConnectionAcceptor implements Runnable { } } } - - /** - * Sets the Race XML to send. - * @param raceXml XML to send to the Client. - */ - public void setRaceXml(String raceXml) { - //Create the message. - XMLMessage message = this.createXMLMessage(raceXml, XMLMessageType.RACE); - //Place it in LatestMessages. - this.latestMessages.setRaceXMLMessage(message); - } - - /** - * Sets the Regatta XMl to send. - * @param regattaXml XML to send to Client. - */ - public void setRegattaXml(String regattaXml) { - //Create the message. - XMLMessage message = this.createXMLMessage(regattaXml, XMLMessageType.REGATTA); - //Place it in LatestMessages. - this.latestMessages.setRegattaXMLMessage(message); - } - - /** - * Sets the Boats XML to send. - * @param boatsXml XMl to send to the Client. - */ - public void setBoatsXml(String boatsXml) { - //Create the message. - XMLMessage message = this.createXMLMessage(boatsXml, XMLMessageType.BOAT); - - //Place it in LatestMessages. - this.latestMessages.setBoatXMLMessage(message); - } - - /** - * Creates an XMLMessage of a specified subtype using the xml contents string. - * @param xmlString The contents of the xml file. - * @param messageType The subtype of xml message (race, regatta, boat). - * @return The created XMLMessage object. - */ - private XMLMessage createXMLMessage(String xmlString, XMLMessageType messageType) { - - //Get the correct sequence number to use, and increment it. - short sequenceNumber = 0; - if (messageType == XMLMessageType.RACE) { - sequenceNumber = this.raceXMLSequenceNumber; - this.raceXMLSequenceNumber++; - - } else if (messageType == XMLMessageType.BOAT) { - sequenceNumber = this.boatXMLSequenceNumber; - this.boatXMLSequenceNumber++; - - } else if (messageType == XMLMessageType.REGATTA) { - sequenceNumber = this.regattaXMLSequenceNumber; - this.regattaXMLSequenceNumber++; - - } - - //Create the message. - XMLMessage message = new XMLMessage( - XMLMessage.currentVersionNumber, - AckSequencer.getNextAckNum(), - System.currentTimeMillis(), - messageType, - sequenceNumber, - xmlString); - - - return message; - } } diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 526223ba..27e2103c 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -120,8 +120,7 @@ public class Event { } - List potentialParticipants = new ArrayList<>(boatDataSource.getBoats().keySet()); - this.sourceIdAllocator = new SourceIdAllocator(potentialParticipants); + this.compositeCommand = new CompositeCommand(); this.latestMessages = new LatestMessages(); @@ -149,6 +148,7 @@ public class Event { //Create connection acceptor. + this.sourceIdAllocator = new SourceIdAllocator(newRace.getRace()); try { this.connectionAcceptor = new ConnectionAcceptor(latestMessages, compositeCommand, sourceIdAllocator, newRace); diff --git a/racevisionGame/src/main/java/mock/model/RaceServer.java b/racevisionGame/src/main/java/mock/model/RaceServer.java index cbbe1971..45a4f6e0 100644 --- a/racevisionGame/src/main/java/mock/model/RaceServer.java +++ b/racevisionGame/src/main/java/mock/model/RaceServer.java @@ -1,7 +1,9 @@ package mock.model; +import network.AckSequencer; import network.Messages.*; import network.Messages.Enums.BoatLocationDeviceEnum; +import network.Messages.Enums.XMLMessageType; import shared.model.Bearing; import shared.model.CompoundMark; import shared.model.Mark; @@ -22,10 +24,29 @@ public class RaceServer { */ private int boatLocationSequenceNumber = 1; + /** + * The sequence number of race XML messages. + */ + private int raceXMLSeqNumber; + + /** + * The sequence number of boat XML messages. + */ + private int boatXMLSeqNumber; + + /** + * The sequence number of regatta XML messages. + */ + private int regattaXMLSeqNumber; + public RaceServer(MockRace race, LatestMessages latestMessages) { this.race = race; this.latestMessages = latestMessages; + + this.raceXMLSeqNumber = race.getRaceDataSource().getSequenceNumber(); + //this.boatXMLSeqNumber = race.getBoatDataSource().getSequenceNumber(); + //this.regattaXMLSeqNumber = race.getRegattaDataSource().getSequenceNumber(); } /** @@ -45,8 +66,46 @@ public class RaceServer { snapshotMessages.add(parseRaceStatus()); latestMessages.setSnapshot(snapshotMessages); + + updateXMLFiles(); + } + + + /** + * Checks if the race/boat/regatta data sources have changed, and if they have, update their xml representations. + */ + private void updateXMLFiles() { + updateRaceXMLFile(); + //updateBoatXMLFile(); + //updateRegattaXMLFile(); + } + + /** + * Checks if the race data source has changed, and if it has, updates LatestMessages' race xml message. + */ + private void updateRaceXMLFile() { + if (raceXMLSeqNumber != race.getRaceDataSource().getSequenceNumber()) { + //TODO generate XML string from race data source + String raceXMLString = "test";//TODO + XMLMessage message = createXMLMessage(raceXMLString, XMLMessageType.RACE); + latestMessages.setXMLMessage(message); + raceXMLSeqNumber = race.getRaceDataSource().getSequenceNumber(); + } + } + + /** + * Checks if the boat data source has changed, and if it has, updates LatestMessages' boat xml message. + */ + private void updateBoatXMLFile() { + } + /** + * Checks if the regatta data source has changed, and if it has, updates LatestMessages' regatta xml message. + */ + private void updateRegattaXMLFile() { + + } /** * Parses an individual marker boat, and returns it. @@ -178,4 +237,41 @@ public class RaceServer { return raceStatus; } + + + + + /** + * Creates an XMLMessage of a specified subtype using the xml contents string. + * @param xmlString The contents of the xml file. + * @param messageType The subtype of xml message (race, regatta, boat). + * @return The created XMLMessage object. + */ + private XMLMessage createXMLMessage(String xmlString, XMLMessageType messageType) { + + //Get the correct sequence number to use. + int sequenceNumber = 0; + if (messageType == XMLMessageType.RACE) { + sequenceNumber = this.raceXMLSeqNumber; + + } else if (messageType == XMLMessageType.BOAT) { + sequenceNumber = this.boatXMLSeqNumber; + + } else if (messageType == XMLMessageType.REGATTA) { + sequenceNumber = this.regattaXMLSeqNumber; + + } + + //Create the message. + XMLMessage message = new XMLMessage( + XMLMessage.currentVersionNumber, + AckSequencer.getNextAckNum(), + System.currentTimeMillis(), + messageType, + sequenceNumber, + xmlString); + + + return message; + } } diff --git a/racevisionGame/src/main/java/network/Messages/LatestMessages.java b/racevisionGame/src/main/java/network/Messages/LatestMessages.java index 738b3ae6..c16d722f 100644 --- a/racevisionGame/src/main/java/network/Messages/LatestMessages.java +++ b/racevisionGame/src/main/java/network/Messages/LatestMessages.java @@ -35,6 +35,7 @@ public class LatestMessages extends Observable { + /** * Ctor. */ diff --git a/racevisionGame/src/main/java/shared/dataInput/EmptyRaceDataSource.java b/racevisionGame/src/main/java/shared/dataInput/EmptyRaceDataSource.java index 74ccbaf5..ffacaa93 100644 --- a/racevisionGame/src/main/java/shared/dataInput/EmptyRaceDataSource.java +++ b/racevisionGame/src/main/java/shared/dataInput/EmptyRaceDataSource.java @@ -76,6 +76,8 @@ public class EmptyRaceDataSource implements RaceDataSource { private RaceTypeEnum raceType = RaceTypeEnum.NOT_A_RACE_TYPE; + private int sequenceNumber = 0; + public EmptyRaceDataSource() { } @@ -126,4 +128,14 @@ public class EmptyRaceDataSource implements RaceDataSource { public List getParticipants() { return participants; } + + @Override + public int getSequenceNumber() { + return sequenceNumber; + } + + @Override + public void incrementSequenceNumber() { + sequenceNumber++; + } } diff --git a/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java b/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java index b89dc45d..c1a4b370 100644 --- a/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java +++ b/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java @@ -83,4 +83,16 @@ public interface RaceDataSource { * @return Bottom right GPS coordinate. */ GPSCoordinate getMapBottomRight(); + + + /** + * Returns the sequence number associated with this data source. Used to indicate when it has changed. + * @return Sequence number. + */ + int getSequenceNumber(); + + /** + * Increments the sequence number for this data source. Used to indicate that it has changed. + */ + void incrementSequenceNumber(); } diff --git a/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java b/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java index c2faea69..6165bf44 100644 --- a/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java +++ b/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java @@ -84,6 +84,8 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { private RaceTypeEnum raceType; + private int sequenceNumber = 0; + /** @@ -491,4 +493,14 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { public List getCornersList() { return cornersList; } + + @Override + public int getSequenceNumber() { + return sequenceNumber; + } + + @Override + public void incrementSequenceNumber() { + sequenceNumber++; + } } diff --git a/racevisionGame/src/main/java/shared/model/Constants.java b/racevisionGame/src/main/java/shared/model/Constants.java index a6fe3844..c5595d7a 100644 --- a/racevisionGame/src/main/java/shared/model/Constants.java +++ b/racevisionGame/src/main/java/shared/model/Constants.java @@ -33,20 +33,23 @@ public class Constants { * Frame periods are multiplied by this to get the amount of time a single frame represents. * E.g., frame period = 20ms, scale = 5, frame represents 20 * 5 = 100ms, and so boats are simulated for 100ms, even though only 20ms actually occurred. */ - public static final int RaceTimeScale = 10; + public static final int RaceTimeScale = 1;//10; /** * The race pre-start time, in milliseconds. 3 minutes. */ - public static final long RacePreStartTime = 1 * 10 * 1000; + public static final long RacePreStartTime = 3 * 60 * 1000; /** - * The race preparatory time, in milliseconds. 1 minutes. + * The race preparatory time, in milliseconds. 1 minute. */ public static final long RacePreparatoryTime = 1 * 60 * 1000; + + + /** * The number of milliseconds in one hour. *
diff --git a/racevisionGame/src/main/java/visualiser/Controllers/FinishController.java b/racevisionGame/src/main/java/visualiser/Controllers/FinishController.java index c5356495..6de6dcdf 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/FinishController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/FinishController.java @@ -71,8 +71,10 @@ public class FinishController extends Controller { //Winner label. - raceWinnerLabel.setText("Winner: "+ boatNameColumn.getCellObservableValue(0).getValue()); - raceWinnerLabel.setWrapText(true); + if (boats.size() > 0) { + raceWinnerLabel.setText("Winner: " + boatNameColumn.getCellObservableValue(0).getValue()); + raceWinnerLabel.setWrapText(true); + } } diff --git a/racevisionGame/src/main/resources/mock/mockXML/raceTest.xml b/racevisionGame/src/main/resources/mock/mockXML/raceTest.xml index ad14d931..6ae04ef8 100644 --- a/racevisionGame/src/main/resources/mock/mockXML/raceTest.xml +++ b/racevisionGame/src/main/resources/mock/mockXML/raceTest.xml @@ -5,12 +5,7 @@ RACE_CREATION_TIME - - - - - - + diff --git a/racevisionGame/src/test/java/mock/model/SourceIdAllocatorTest.java b/racevisionGame/src/test/java/mock/model/SourceIdAllocatorTest.java index 7240e01b..a1568044 100644 --- a/racevisionGame/src/test/java/mock/model/SourceIdAllocatorTest.java +++ b/racevisionGame/src/test/java/mock/model/SourceIdAllocatorTest.java @@ -15,30 +15,16 @@ import static org.junit.Assert.*; */ public class SourceIdAllocatorTest { - /** - * This is the list of source IDs that we start with. - */ - private List originalSourceIDs; - - /** - * Used to allocate source IDs. - */ + private MockRace mockRace; private SourceIdAllocator sourceIdAllocator; @Before public void setUp() throws Exception { - originalSourceIDs = new ArrayList<>(); - originalSourceIDs.add(120); - originalSourceIDs.add(121); - originalSourceIDs.add(122); - originalSourceIDs.add(123); - originalSourceIDs.add(124); - originalSourceIDs.add(125); - + mockRace = MockRaceTest.createMockRace(); - sourceIdAllocator = new SourceIdAllocator(originalSourceIDs); + sourceIdAllocator = new SourceIdAllocator(mockRace); } @@ -49,11 +35,12 @@ public class SourceIdAllocatorTest { @Test public void emptyAllocationTest() { - SourceIdAllocator allocator = new SourceIdAllocator(new ArrayList<>()); + mockRace.getRaceDataSource().getParticipants().removeAll(mockRace.getBoatDataSource().getBoats().keySet()); + mockRace.getRaceDataSource().getParticipants().addAll(mockRace.getBoatDataSource().getBoats().keySet()); try { - int sourceID = allocator.allocateSourceID(); + int sourceID = sourceIdAllocator.allocateSourceID(); fail("Exception should have been thrown, but wasn't."); @@ -108,10 +95,6 @@ public class SourceIdAllocatorTest { @Test public void reallocationTest() throws Exception { - List sourceIDList = new ArrayList<>(); - sourceIDList.add(123); - - SourceIdAllocator sourceIdAllocator = new SourceIdAllocator(sourceIDList); //Allocate. int sourceID = sourceIdAllocator.allocateSourceID(); diff --git a/racevisionGame/src/test/resources/mock/mockXML/raceTest.xml b/racevisionGame/src/test/resources/mock/mockXML/raceTest.xml index 4ad5f88f..b10a0158 100644 --- a/racevisionGame/src/test/resources/mock/mockXML/raceTest.xml +++ b/racevisionGame/src/test/resources/mock/mockXML/raceTest.xml @@ -5,12 +5,6 @@ 2017-04-19T15:30:00+1200 - - - - - - @@ -54,4 +48,4 @@ - \ No newline at end of file +