Revamped RaceColumn link and unlink logic. Never ever remove the

RaceDefinition upon TrackedRace removal.
This commit is contained in:
Simon Pamies committed 2013-06-26 16:55:39 +02:00
1 parent 166325d51d
commit ff5568fd05
5 files changed
+37 -17

No files matched your search

@@ -114,6 +114,8 @@ public interface RaceColumn extends Named {
*
* @param fleet
* the fleet for which to associate a race by its identifier
* @param raceIdentifier
* the race that should be associated with this column+fleet. It should never be null.
*/
void setRaceIdentifier(Fleet fleet, RaceIdentifier raceIdentifier);
@@ -135,7 +137,7 @@ public interface RaceColumn extends Named {
/**
* Releases the {@link TrackedRace} previously set by {@link #setTrackedRace(Fleet, TrackedRace)} but leaves the
* {@link #getRaceIdentifier(Fleet) race identifier} untouched. Therefore, the {@link TrackedRace} may be garbage
* {@link #getRaceIdentifier(Fleet) race identifier} untouched(!). Therefore, the {@link TrackedRace} may be garbage
* collected but may be re-resolved for this column using the race identifier at a later time.
*
* @param fleet
@@ -189,5 +191,14 @@ public interface RaceColumn extends Named {
* @param raceLogInformation
* @param fleetImpl
*/
void setOrReloadRaceLogInformation(RaceLogInformation raceLogInformation, Fleet fleetImpl);
void setOrReloadRaceLogInformation(RaceLogInformation raceLogInformation, Fleet fleetImpl);
/**
* Remove the association between a race and a column. This is different from
* {@link RaceColumn#releaseTrackedRace(Fleet)} because it will also remove the
* association from database.
*
* @param fleet
*/
void removeRaceIdentifier(Fleet fleet);
}
@@ -71,20 +71,13 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem
public void setTrackedRace(Fleet fleet, TrackedRace trackedRace) {
TrackedRace previouslyLinkedRace = this.trackedRaces.get(fleet);
if (trackedRace != previouslyLinkedRace) {
releaseTrackedRace(fleet);
synchronized (this) {
if (trackedRace == null) {
setRaceIdentifier(fleet, null);
this.trackedRaces.remove(fleet);
} else {
if (trackedRace != null) {
this.trackedRaces.put(fleet, trackedRace);
this.setRaceIdentifier(fleet, trackedRace.getRaceIdentifier());
}
}
if (previouslyLinkedRace != null) {
RaceLogIdentifierImpl identifier = new RaceLogIdentifierImpl(raceLogInformation.getIdentifierTemplate(), getName(), fleet);
previouslyLinkedRace.detachRaceLog(identifier);
getRaceColumnListeners().notifyListenersAboutTrackedRaceUnlinked(this, fleet, previouslyLinkedRace);
}
if (trackedRace != null) {
trackedRace.attachRaceLog(getRaceLog(fleet));
getRaceColumnListeners().notifyListenersAboutTrackedRaceLinked(this, fleet, trackedRace);
@@ -99,18 +92,28 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem
@Override
public void setRaceIdentifier(Fleet fleet, RaceIdentifier raceIdentifier) {
if (raceIdentifier == null) {
this.raceIdentifiers.remove(fleet);
} else {
if (raceIdentifier != null) {
this.raceIdentifiers.put(fleet, raceIdentifier);
}
}
@Override
public synchronized void releaseTrackedRace(Fleet fleet) {
setTrackedRace(fleet, null);
TrackedRace previouslyLinkedRace = this.trackedRaces.get(fleet);
this.trackedRaces.remove(fleet);
if (previouslyLinkedRace != null) {
RaceLogIdentifierImpl identifier = new RaceLogIdentifierImpl(raceLogInformation.getIdentifierTemplate(), getName(), fleet);
previouslyLinkedRace.detachRaceLog(identifier);
getRaceColumnListeners().notifyListenersAboutTrackedRaceUnlinked(this, fleet, previouslyLinkedRace);
}
}
@Override
public void removeRaceIdentifier(Fleet fleet) {
releaseTrackedRace(fleet);
this.raceIdentifiers.remove(fleet);
}
@Override
public Fleet getFleetOfCompetitor(Competitor competitor) {
for (Map.Entry<Fleet, TrackedRace> e : trackedRaces.entrySet()) {
@@ -189,4 +189,8 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R
@Override
public void setOrReloadRaceLogInformation(RaceLogInformation raceLogInformation, Fleet fleetImpl) {
}
@Override
public void removeRaceIdentifier(Fleet fleet) {
}
}
@@ -717,7 +717,9 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
@Override
public Pair<String, List<RaceRecord>> getTracTracRaceRecords(URL jsonURL) throws IOException, ParseException, org.json.simple.parser.ParseException, URISyntaxException {
logger.info("Retrieving TracTrac race records from " + jsonURL);
JSONService jsonService = getTracTracDomainFactory().parseJSONURL(jsonURL);
logger.info("OK retrieving TracTrac race records from " + jsonURL);
return new Pair<String, List<RaceRecord>>(jsonService.getEventName(), jsonService.getRaceRecords());
}
@@ -21,7 +21,7 @@ public class DisconnectLeaderboardColumnFromTrackedRace extends AbstractLeaderbo
if (leaderboard != null) {
RaceColumn raceColumn = leaderboard.getRaceColumnByName(getColumnName());
if (raceColumn != null) {
raceColumn.setTrackedRace(raceColumn.getFleetByName(fleetName), null);
raceColumn.removeRaceIdentifier(raceColumn.getFleetByName(fleetName));
updateDB(toState, leaderboard, raceColumn);
} else {
throw new IllegalArgumentException("Didn't find race "+getColumnName()+" in leaderboard "+getLeaderboardName());