Merge remote-tracking branch 'remotes/origin/master' into wind_(story53)
# Conflicts: # racevisionGame/src/main/java/mock/app/Event.java # racevisionGame/src/main/java/mock/model/MockRace.java
This commit is contained in:
@@ -109,6 +109,11 @@ public class ClientConnection implements Runnable {
|
||||
*/
|
||||
private ConnectionStateEnum connectionState = ConnectionStateEnum.UNKNOWN;
|
||||
|
||||
/**
|
||||
* The source ID that has been allocated to the client.
|
||||
* 0 means not allocated.
|
||||
*/
|
||||
private int allocatedSourceID = 0;
|
||||
|
||||
|
||||
|
||||
@@ -178,7 +183,7 @@ public class ClientConnection implements Runnable {
|
||||
|
||||
RequestToJoin requestToJoin = waitForRequestToJoin();
|
||||
|
||||
int allocatedSourceID = 0;
|
||||
allocatedSourceID = 0;
|
||||
|
||||
//If they want to participate, give them a source ID number.
|
||||
if (requestToJoin.getRequestType() == RequestToJoinEnum.PARTICIPANT) {
|
||||
@@ -283,6 +288,10 @@ public class ClientConnection implements Runnable {
|
||||
if (this.controllerServerThread != null) {
|
||||
this.controllerServerThread.interrupt();
|
||||
}
|
||||
|
||||
if (allocatedSourceID != 0) {
|
||||
sourceIdAllocator.returnSourceID(allocatedSourceID);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
package mock.model;
|
||||
|
||||
import mock.model.wind.WindGenerator;
|
||||
import javafx.animation.AnimationTimer;
|
||||
import mock.model.collider.ColliderRegistry;
|
||||
import mock.xml.*;
|
||||
import network.Messages.BoatLocation;
|
||||
import network.Messages.BoatStatus;
|
||||
import network.Messages.Enums.BoatStatusEnum;
|
||||
import network.Messages.Enums.RaceStatusEnum;
|
||||
import shared.dataInput.BoatDataSource;
|
||||
@@ -10,7 +15,6 @@ import shared.exceptions.BoatNotFoundException;
|
||||
import shared.enums.RoundingType;
|
||||
import shared.model.*;
|
||||
import shared.model.Bearing;
|
||||
import shared.model.Race;
|
||||
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
@@ -24,7 +28,7 @@ import static java.lang.Math.cos;
|
||||
* Has a course, boats, boundaries, etc...
|
||||
* Is responsible for simulating the race, and sending messages to a MockOutput instance.
|
||||
*/
|
||||
public class MockRace extends Race {
|
||||
public class MockRace extends RaceState {
|
||||
|
||||
/**
|
||||
* An observable list of boats in the race.
|
||||
@@ -37,6 +41,12 @@ public class MockRace extends Race {
|
||||
private List<GPSCoordinate> shrinkBoundary;
|
||||
|
||||
|
||||
/**
|
||||
* Registry for all collider object in this race
|
||||
*/
|
||||
private ColliderRegistry colliderRegistry;
|
||||
|
||||
|
||||
/**
|
||||
* The scale factor of the race.
|
||||
* See {@link Constants#RaceTimeScale}.
|
||||
@@ -48,6 +58,14 @@ public class MockRace extends Race {
|
||||
*/
|
||||
private WindGenerator windGenerator;
|
||||
|
||||
|
||||
/**
|
||||
* The polars file to use for each boat.
|
||||
*/
|
||||
private Polars polars;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Constructs a race object with a given RaceDataSource, BoatDataSource, and RegattaDataSource and sends events to the given mockOutput.
|
||||
* @param boatDataSource Data source for boat related data (yachts and marker boats).
|
||||
@@ -59,13 +77,16 @@ public class MockRace extends Race {
|
||||
*/
|
||||
public MockRace(BoatDataSource boatDataSource, RaceDataSource raceDataSource, RegattaDataSource regattaDataSource, Polars polars, int timeScale, WindGenerator windGenerator) {
|
||||
|
||||
super(boatDataSource, raceDataSource, regattaDataSource);
|
||||
this.setBoatDataSource(boatDataSource);
|
||||
this.setRaceDataSource(raceDataSource);
|
||||
this.setRegattaDataSource(regattaDataSource);
|
||||
|
||||
this.polars = polars;
|
||||
this.scaleFactor = timeScale;
|
||||
|
||||
this.boats = this.generateMockBoats(boatDataSource.getBoats(), raceDataSource.getParticipants(), polars);
|
||||
this.boats = new ArrayList<>();
|
||||
|
||||
this.shrinkBoundary = GPSCoordinate.getShrinkBoundary(this.boundary);
|
||||
this.shrinkBoundary = GPSCoordinate.getShrinkBoundary(this.getBoundary());
|
||||
|
||||
|
||||
this.windGenerator = windGenerator;
|
||||
@@ -73,35 +94,53 @@ public class MockRace extends Race {
|
||||
//Wind.
|
||||
this.setWind(windGenerator.generateBaselineWind());
|
||||
|
||||
|
||||
// Set up colliders
|
||||
this.colliderRegistry = new ColliderRegistry();
|
||||
|
||||
for(CompoundMark mark: this.getCompoundMarks()) {
|
||||
colliderRegistry.addCollider(mark.getMark1());
|
||||
if(mark.getMark2() != null) colliderRegistry.addCollider(mark.getMark2());
|
||||
}
|
||||
|
||||
this.colliderRegistry.addAllColliders(boats);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generates a list of MockBoats given a list of Boats, and a list of participating boats.
|
||||
* @param boats The map of Boats describing boats that are potentially in the race. Maps boat sourceID to boat.
|
||||
* @param sourceIDs The list of boat sourceIDs describing which specific boats are actually participating.
|
||||
* @param polars The polars table to be used for boat simulation.
|
||||
* @return A list of MockBoats that are participating in the race.
|
||||
* Generates a MockBoat from the BoatDataSource, given a source ID. Also adds it to the participant list.
|
||||
* @param sourceID The source ID to assign the boat.
|
||||
*/
|
||||
private List<MockBoat> generateMockBoats(Map<Integer, Boat> boats, List<Integer> sourceIDs, Polars polars) {
|
||||
public void generateMockBoat(Integer sourceID) {
|
||||
|
||||
List<MockBoat> mockBoats = new ArrayList<>(sourceIDs.size());
|
||||
//Get the boat associated with the sourceID.
|
||||
Boat boat = getBoatDataSource().getBoats().get(sourceID);
|
||||
|
||||
//For each sourceID participating...
|
||||
for (int sourceID : sourceIDs) {
|
||||
//Construct a MockBoat using the Boat and Polars.
|
||||
MockBoat mockBoat = new MockBoat(boat, polars);
|
||||
mockBoat.setCurrentLeg(this.getLegs().get(0));
|
||||
|
||||
//Get the boat associated with the sourceID.
|
||||
Boat boat = boats.get(sourceID);
|
||||
//Update participant list.
|
||||
getRaceDataSource().getParticipants().add(sourceID);
|
||||
|
||||
//Construct a MockBoat using the Boat and Polars.
|
||||
MockBoat mockBoat = new MockBoat(boat, polars);
|
||||
this.boats.add(mockBoat);
|
||||
|
||||
mockBoats.add(mockBoat);
|
||||
getRaceDataSource().incrementSequenceNumber();
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Removes a MockBoat from the race, by sourceID. Also removes it from the participant list.
|
||||
* @param sourceID Source ID of boat to remove.
|
||||
*/
|
||||
public void removeMockBoat(Integer sourceID) {
|
||||
this.boats.removeIf(mockBoat -> mockBoat.getSourceID() == sourceID);
|
||||
getRaceDataSource().getParticipants().remove(sourceID);
|
||||
getRaceDataSource().incrementSequenceNumber();
|
||||
}
|
||||
|
||||
return mockBoats;
|
||||
|
||||
public ColliderRegistry getColliderRegistry() {
|
||||
return colliderRegistry;
|
||||
}
|
||||
|
||||
|
||||
@@ -110,7 +149,7 @@ public class MockRace extends Race {
|
||||
* @param currentTime Milliseconds since unix epoch.
|
||||
*/
|
||||
public void updateRaceTime(long currentTime) {
|
||||
this.raceClock.setUTCTime(currentTime);
|
||||
this.getRaceClock().setUTCTime(currentTime);
|
||||
}
|
||||
|
||||
|
||||
@@ -120,7 +159,7 @@ public class MockRace extends Race {
|
||||
public void updateRaceStatusEnum() {
|
||||
|
||||
//The millisecond duration of the race. Negative means it hasn't started, so we flip sign.
|
||||
long timeToStart = - this.raceClock.getDurationMilli();
|
||||
long timeToStart = - this.getRaceClock().getDurationMilli();
|
||||
|
||||
|
||||
if (timeToStart > Constants.RacePreStartTime) {
|
||||
@@ -191,7 +230,7 @@ public class MockRace extends Race {
|
||||
|
||||
|
||||
//The boat starts on the first leg of the race.
|
||||
boat.setCurrentLeg(this.legs.get(0));
|
||||
boat.setCurrentLeg(this.getLegs().get(0));
|
||||
|
||||
//Boats start with 0 knots speed.
|
||||
boat.setCurrentSpeed(0d);
|
||||
@@ -220,7 +259,7 @@ public class MockRace extends Race {
|
||||
private List<GPSCoordinate> getSpreadStartingPositions() {
|
||||
|
||||
//The first compound marker of the race - the starting gate.
|
||||
CompoundMark compoundMark = this.legs.get(0).getStartCompoundMark();
|
||||
CompoundMark compoundMark = this.getLegs().get(0).getStartCompoundMark();
|
||||
|
||||
//The position of the two markers from the compound marker.
|
||||
GPSCoordinate mark1Position = compoundMark.getMark1Position();
|
||||
@@ -482,7 +521,7 @@ public class MockRace extends Race {
|
||||
roundingChecks.get(0), boat.getPosition(), legBearing) &&
|
||||
gateCheck && boat.isBetweenGate(roundingMark, Mark.tempMark(roundingChecks.get(0)))) {
|
||||
boat.increaseRoundingStatus();
|
||||
if (boat.getCurrentLeg().getLegNumber() + 2 >= legs.size()){
|
||||
if (boat.getCurrentLeg().getLegNumber() + 2 >= getLegs().size()){
|
||||
//boat has finished race
|
||||
boat.increaseRoundingStatus();
|
||||
}
|
||||
@@ -500,7 +539,7 @@ public class MockRace extends Race {
|
||||
case 2://has traveled 180 degrees around the mark
|
||||
//Move boat on to next leg.
|
||||
boat.resetRoundingStatus();
|
||||
Leg nextLeg = this.legs.get(boat.getCurrentLeg().getLegNumber() + 1);
|
||||
Leg nextLeg = this.getLegs().get(boat.getCurrentLeg().getLegNumber() + 1);
|
||||
boat.setCurrentLeg(nextLeg);
|
||||
break;
|
||||
}
|
||||
@@ -527,7 +566,7 @@ public class MockRace extends Race {
|
||||
gateCheck &&
|
||||
boat.isBetweenGate(roundingMark, Mark.tempMark(roundingChecks.get(0)))) {
|
||||
boat.increaseRoundingStatus();
|
||||
if (boat.getCurrentLeg().getLegNumber() + 2 >= legs.size()){
|
||||
if (boat.getCurrentLeg().getLegNumber() + 2 >= getLegs().size()){
|
||||
//boat has finished race
|
||||
boat.increaseRoundingStatus();
|
||||
}
|
||||
@@ -544,7 +583,7 @@ public class MockRace extends Race {
|
||||
case 2://has traveled 180 degrees around the mark
|
||||
//Move boat on to next leg.
|
||||
boat.resetRoundingStatus();
|
||||
Leg nextLeg = this.legs.get(boat.getCurrentLeg().getLegNumber() + 1);
|
||||
Leg nextLeg = this.getLegs().get(boat.getCurrentLeg().getLegNumber() + 1);
|
||||
boat.setCurrentLeg(nextLeg);
|
||||
break;
|
||||
}
|
||||
@@ -582,7 +621,7 @@ public class MockRace extends Race {
|
||||
|
||||
GPSCoordinate roundCheck2;
|
||||
try{
|
||||
Leg nextLeg = legs.get(legs.indexOf(boat.getCurrentLeg()) + 1);
|
||||
Leg nextLeg = getLegs().get(getLegs().indexOf(boat.getCurrentLeg()) + 1);
|
||||
|
||||
GPSCoordinate startNextDirectionLinePoint = nextLeg.getStartCompoundMark().getMark1Position();
|
||||
GPSCoordinate endNextDirectionLinePoint = nextLeg.getEndCompoundMark().getMark1Position();
|
||||
@@ -678,7 +717,7 @@ public class MockRace extends Race {
|
||||
*/
|
||||
public void changeWindDirection() {
|
||||
|
||||
Wind nextWind = windGenerator.generateNextWind(raceWind.getValue());
|
||||
Wind nextWind = windGenerator.generateNextWind(windProperty().getValue());
|
||||
|
||||
setWind(nextWind);
|
||||
}
|
||||
@@ -699,13 +738,10 @@ public class MockRace extends Race {
|
||||
long timeFromNow = (long) (1000 * boat.calculateDistanceToNextMarker() / velocityToMark);
|
||||
|
||||
//Calculate time at which it will reach mark.
|
||||
ZonedDateTime timeAtMark = this.raceClock.getCurrentTime().plus(timeFromNow, ChronoUnit.MILLIS);
|
||||
ZonedDateTime timeAtMark = this.getRaceClock().getCurrentTime().plus(timeFromNow, ChronoUnit.MILLIS);
|
||||
boat.setEstimatedTimeAtNextMark(timeAtMark);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public List<CompoundMark> getCompoundMarks() {
|
||||
return compoundMarks;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +48,9 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer {
|
||||
*/
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
prestartCountdown();
|
||||
|
||||
race.initialiseBoats();
|
||||
|
||||
countdown();
|
||||
@@ -60,6 +63,37 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The countdown timer until the prestart period is finished. This timer will stop 3 minutes before the race starts, and players can no longer start participating.
|
||||
*/
|
||||
private void prestartCountdown() {
|
||||
|
||||
long previousFrameTime = System.currentTimeMillis();
|
||||
|
||||
while (((race.getRaceStatusEnum() == RaceStatusEnum.PRESTART)
|
||||
|| (race.getRaceStatusEnum() == RaceStatusEnum.NOT_ACTIVE)
|
||||
|| (race.getRaceStatusEnum() == RaceStatusEnum.WARNING)) && loopBool) {
|
||||
|
||||
long currentTime = System.currentTimeMillis();
|
||||
|
||||
//Update race time.
|
||||
race.updateRaceTime(currentTime);
|
||||
|
||||
//Update the race status based on the current time.
|
||||
race.updateRaceStatusEnum();
|
||||
|
||||
//Provide boat's with an estimated time at next mark until the race starts.
|
||||
race.setBoatsTimeNextMark(race.getRaceClock().getCurrentTime());
|
||||
|
||||
//Parse the race snapshot.
|
||||
server.parseSnapshot();
|
||||
|
||||
|
||||
waitForFramePeriod(previousFrameTime, currentTime, 50);
|
||||
previousFrameTime = currentTime;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Countdown timer until race starts.
|
||||
*/
|
||||
|
||||
@@ -1,13 +1,21 @@
|
||||
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;
|
||||
import shared.xml.Race.RaceDataSourceToXML;
|
||||
import shared.xml.boats.BoatDataSourceToXML;
|
||||
import shared.xml.regatta.RegattaDataSourceToXML;
|
||||
|
||||
import javax.xml.bind.JAXBException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Created by connortaylorbrown on 2/08/17.
|
||||
@@ -22,6 +30,21 @@ public class RaceServer {
|
||||
*/
|
||||
private int boatLocationSequenceNumber = 1;
|
||||
|
||||
/**
|
||||
* The sequence number of race XML messages.
|
||||
*/
|
||||
private int raceXMLSeqNumber = -1;
|
||||
|
||||
/**
|
||||
* The sequence number of boat XML messages.
|
||||
*/
|
||||
private int boatXMLSeqNumber = -1;
|
||||
|
||||
/**
|
||||
* The sequence number of regatta XML messages.
|
||||
*/
|
||||
private int regattaXMLSeqNumber = -1;
|
||||
|
||||
|
||||
public RaceServer(MockRace race, LatestMessages latestMessages) {
|
||||
this.race = race;
|
||||
@@ -45,9 +68,78 @@ 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()) {
|
||||
|
||||
raceXMLSeqNumber = race.getRaceDataSource().getSequenceNumber();
|
||||
try {
|
||||
String raceXMLString = RaceDataSourceToXML.toString(race.getRaceDataSource());
|
||||
XMLMessage message = createXMLMessage(raceXMLString, XMLMessageType.RACE);
|
||||
latestMessages.setXMLMessage(message);
|
||||
|
||||
} catch (JAXBException e) {
|
||||
Logger.getGlobal().log(Level.WARNING, "Could not serialise: " + race.getRaceDataSource(), e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the regatta data source has changed, and if it has, updates LatestMessages' regatta xml message.
|
||||
*/
|
||||
private void updateRegattaXMLFile() {
|
||||
if (regattaXMLSeqNumber != race.getRegattaDataSource().getSequenceNumber()) {
|
||||
|
||||
regattaXMLSeqNumber = race.getRegattaDataSource().getSequenceNumber();
|
||||
|
||||
try {
|
||||
String regattaXMLString = RegattaDataSourceToXML.toString(race.getRegattaDataSource());
|
||||
XMLMessage message = createXMLMessage(regattaXMLString, XMLMessageType.REGATTA);
|
||||
latestMessages.setXMLMessage(message);
|
||||
|
||||
} catch (JAXBException e) {
|
||||
Logger.getGlobal().log(Level.WARNING, "Could not serialise: " + race.getRegattaDataSource(), e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses an individual marker boat, and returns it.
|
||||
* @param mark The marker boat to parse.
|
||||
@@ -178,4 +270,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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package mock.model;
|
||||
|
||||
|
||||
import mock.exceptions.SourceIDAllocationException;
|
||||
import network.Messages.Enums.RaceStatusEnum;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -13,24 +14,18 @@ public class SourceIdAllocator {
|
||||
|
||||
|
||||
/**
|
||||
* This list contains all unallocated source IDs.
|
||||
* The race we are allocating for.
|
||||
*/
|
||||
List<Integer> unallocatedIDs = new ArrayList<>();
|
||||
private MockRace mockRace;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This list contains all allocated source IDs.
|
||||
* Creates a SourceIdAllocator for a given race.
|
||||
* @param mockRace Race to allocate source IDs for.
|
||||
*/
|
||||
List<Integer> allocatedIDs = new ArrayList<>();
|
||||
|
||||
|
||||
/**
|
||||
* Creates a source ID allocator, using the given list of unallocated source IDs.
|
||||
* @param unallocatedIDs List of unallocated source IDs.
|
||||
*/
|
||||
public SourceIdAllocator(List<Integer> unallocatedIDs) {
|
||||
//We need to copy the list.
|
||||
this.unallocatedIDs.addAll(unallocatedIDs);
|
||||
public SourceIdAllocator(MockRace mockRace) {
|
||||
this.mockRace = mockRace;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,11 +36,24 @@ public class SourceIdAllocator {
|
||||
*/
|
||||
public synchronized int allocateSourceID() throws SourceIDAllocationException {
|
||||
|
||||
if (!((mockRace.getRaceStatusEnum() == RaceStatusEnum.PRESTART)
|
||||
|| (mockRace.getRaceStatusEnum() == RaceStatusEnum.WARNING))) {
|
||||
throw new SourceIDAllocationException("Could not allocate a source ID. Can only allocate during pre-start period. It is currently: " + mockRace.getRaceStatusEnum());
|
||||
}
|
||||
|
||||
List<Integer> allocatedIDs = mockRace.getRaceDataSource().getParticipants();
|
||||
List<Integer> allIDs = new ArrayList<>(mockRace.getBoatDataSource().getBoats().keySet());
|
||||
|
||||
//Get list of unallocated ids.
|
||||
List<Integer> unallocatedIDs = new ArrayList<>(allIDs);
|
||||
unallocatedIDs.removeAll(allocatedIDs);
|
||||
|
||||
|
||||
if (!unallocatedIDs.isEmpty()) {
|
||||
|
||||
int sourceID = unallocatedIDs.remove(0);
|
||||
|
||||
allocatedIDs.add(sourceID);
|
||||
mockRace.generateMockBoat(sourceID);
|
||||
|
||||
return sourceID;
|
||||
|
||||
@@ -61,10 +69,6 @@ public class SourceIdAllocator {
|
||||
* @param sourceID Source ID to return.
|
||||
*/
|
||||
public void returnSourceID(Integer sourceID) {
|
||||
|
||||
//We remove an Integer, not an int, so that we remove by value not by index.
|
||||
allocatedIDs.remove(sourceID);
|
||||
|
||||
unallocatedIDs.add(sourceID);
|
||||
mockRace.removeMockBoat(sourceID);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user