Merge remote-tracking branch 'origin/bug3286'

This commit is contained in:
Axel Uhl
2024-01-02 21:13:40 +01:00
8 changed files with 48 additions and 30 deletions
@@ -41,7 +41,7 @@ public class MongoRaceLogStoreImpl implements RaceLogStore {
}
private void addListener(RaceLogIdentifier identifier, final RaceLog raceLog) {
MongoRaceLogStoreVisitor listener = new MongoRaceLogStoreVisitor(identifier, mongoObjectFactory);
final MongoRaceLogStoreVisitor listener = new MongoRaceLogStoreVisitor(identifier, mongoObjectFactory);
listeners.put(raceLog, listener);
raceLog.addListener(listener);
}
@@ -55,7 +55,7 @@ public class MongoRaceLogStoreImpl implements RaceLogStore {
@Override
public void removeListenersAddedByStoreFrom(RaceLog raceLog) {
RaceLogEventVisitor visitor = listeners.get(raceLog);
final RaceLogEventVisitor visitor = listeners.get(raceLog);
if (visitor != null) {
raceLog.removeListener(visitor);
}
@@ -40,6 +40,13 @@ import com.sap.sse.common.Util.Pair;
*
*/
public interface RaceColumn extends Named {
/**
* Sets the information object used to access the race column's race logs (see
* {@link #setRaceLogInformation(RaceLogStore, RegattaLikeIdentifier)}) and (re-)loads the contents of all fleets'
* race logs.
*/
void setRaceLogInformationAndLoad(RaceLogStore raceLogStore, RegattaLikeIdentifier regattaLikeParent);
/**
* Sets the information object used to access the race column's race logs.
*/
@@ -49,7 +56,6 @@ public interface RaceColumn extends Named {
* Gets the race column's race log associated to the passed fleet. Note that the result may be <code>null</code>
* particularly for columns in a {@link MetaLeaderboard}.
*
* @param fleet
* @return the race log or <code>null</code> in case this column belongs to a {@link MetaLeaderboard}
*/
RaceLog getRaceLog(Fleet fleet);
@@ -74,14 +74,19 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem
}
@Override
public synchronized void setRaceLogInformation(RaceLogStore raceLogStore, RegattaLikeIdentifier regattaLikeParent) {
this.raceLogStore = raceLogStore;
this.regattaLikeParent = regattaLikeParent;
public synchronized void setRaceLogInformationAndLoad(RaceLogStore raceLogStore, RegattaLikeIdentifier regattaLikeParent) {
setRaceLogInformation(raceLogStore, regattaLikeParent);
for (final Fleet fleet : getFleets()) {
reloadRaceLog(fleet);
}
}
@Override
public synchronized void setRaceLogInformation(RaceLogStore raceLogStore, RegattaLikeIdentifier regattaLikeParent) {
this.raceLogStore = raceLogStore;
this.regattaLikeParent = regattaLikeParent;
}
@Override
public RaceLog getRaceLog(Fleet fleet) {
return raceLogs.get(fleet);
@@ -191,6 +196,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem
@Override
public void reloadRaceLog(Fleet fleet) {
// FIXME bug3286: newOrLoadedRaceLog will have MongoRaceLogStoreListener attached; raceLogAvailable, result of de-serialization, will not; merging newOrLoadedRaceLog into raceLogAvailable will leave resulting log without persistence
RaceLogIdentifier identifier = getRaceLogIdentifier(fleet);
RaceLog newOrLoadedRaceLog = raceLogStore.getRaceLog(identifier, /* ignoreCache */true);
RaceLog raceLogAvailable = raceLogs.get(fleet);
@@ -284,7 +284,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
}
this.series = seriesList;
for (Series s : series) {
linkToRegattaAndConnectRaceLogsAndAddListeners(s);
linkToRegattaAndConnectRaceLogsAndAddListeners(s, /* load race logs */ true);
}
this.persistent = persistent;
this.scoringScheme = scoringScheme;
@@ -323,14 +323,19 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
return rankingMetricConstructor == null ? OneDesignRankingMetric::new : rankingMetricConstructor;
}
private void registerRaceLogsOnRaceColumns(Series series) {
private void registerRaceLogsOnRaceColumns(Series series, boolean loadRaceLogs) {
for (RaceColumn raceColumn : series.getRaceColumns()) {
setRaceLogInformationOnRaceColumn(raceColumn);
setRaceLogInformationOnRaceColumn(raceColumn, loadRaceLogs);
}
}
private void setRaceLogInformationOnRaceColumn(RaceColumn raceColumn) {
raceColumn.setRaceLogInformation(raceLogStore, new RegattaAsRegattaLikeIdentifier(this));
private void setRaceLogInformationOnRaceColumn(RaceColumn raceColumn, boolean loadRaceLogs) {
final RegattaLikeIdentifier regattaLikeIdentifier = new RegattaAsRegattaLikeIdentifier(this);
if (loadRaceLogs) {
raceColumn.setRaceLogInformationAndLoad(raceLogStore, regattaLikeIdentifier);
} else {
raceColumn.setRaceLogInformation(raceLogStore, regattaLikeIdentifier);
}
}
@Override
@@ -375,17 +380,14 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
/**
* {@link RaceColumnListeners} may not be de-serialized (yet) when the regatta is de-serialized. To avoid
* re-registering empty objects most probably leading to null pointer exception one needs to initialize all
* re-registering empty objects most probably leading to a {link NullPointerException} one needs to initialize all
* listeners after all objects have been read.
*/
public void initializeSeriesAfterDeserialize() {
for (Series series : getSeries()) {
linkToRegattaAndConnectRaceLogsAndAddListeners(series);
if (series.getRaceColumns() != null) {
for (RaceColumnInSeries column : series.getRaceColumns()) {
column.setRaceLogInformation(raceLogStore, new RegattaAsRegattaLikeIdentifier(this));
}
} else {
for (final Series series : getSeries()) {
// the following also transitively invokes setRaceLogInformation(raceLogStore, getRegattaLikeIdentifier()) on all race columns
linkToRegattaAndConnectRaceLogsAndAddListeners(series, /* load race logs */ false);
if (series.getRaceColumns() == null) {
logger.warning("Race Columns were null during deserialization. This should not happen.");
}
}
@@ -594,7 +596,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
@Override
public void raceColumnAddedToContainer(RaceColumn raceColumn) {
setRaceLogInformationOnRaceColumn(raceColumn);
setRaceLogInformationOnRaceColumn(raceColumn, /* loadRaceLogs */ true);
raceColumnListeners.notifyListenersAboutRaceColumnAddedToContainer(raceColumn);
}
@@ -790,7 +792,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
public void addSeries(Series seriesToAdd) {
Series existingSeries = getSeriesByName(seriesToAdd.getName());
if (existingSeries == null) {
linkToRegattaAndConnectRaceLogsAndAddListeners(seriesToAdd);
linkToRegattaAndConnectRaceLogsAndAddListeners(seriesToAdd, /* load race logs */ true);
synchronized (this.series) {
ArrayList<Series> newSeriesList = new ArrayList<Series>();
for (Series seriesObject : this.series) {
@@ -802,10 +804,10 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
}
}
private void linkToRegattaAndConnectRaceLogsAndAddListeners(Series seriesToAdd) {
private void linkToRegattaAndConnectRaceLogsAndAddListeners(Series seriesToAdd, boolean loadRaceLogs) {
seriesToAdd.setRegatta(this);
seriesToAdd.addRaceColumnListener(this);
registerRaceLogsOnRaceColumns(seriesToAdd);
registerRaceLogsOnRaceColumns(seriesToAdd, loadRaceLogs);
}
@Override
@@ -178,7 +178,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
column = createRaceColumn(name, medalRace);
column.addRaceColumnListener(this);
races.add(column);
column.setRaceLogInformation(raceLogStore, new FlexibleLeaderboardAsRegattaLikeIdentifier(this));
column.setRaceLogInformationAndLoad(raceLogStore, new FlexibleLeaderboardAsRegattaLikeIdentifier(this));
column.setRegattaLikeHelper(regattaLikeHelper);
getRaceColumnListeners().notifyListenersAboutRaceColumnAddedToContainer(column);
}
@@ -231,6 +231,10 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R
public void setMasterDataExportOngoingThreadFlag(boolean flagValue) {
}
@Override
public void setRaceLogInformationAndLoad(RaceLogStore raceLogStore, RegattaLikeIdentifier regattaLikeParent) {
}
@Override
public void setRaceLogInformation(RaceLogStore raceLogStore, RegattaLikeIdentifier regattaLikeParent) {
}
@@ -339,7 +339,7 @@ public class ImportMasterDataOperation extends
} else if (override) {
for (RaceColumn raceColumn : existingLeaderboards.get(leaderboard.getName()).getRaceColumns()) {
for (Fleet fleet : raceColumn.getFleets()) {
TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
final TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
if (trackedRace != null) {
raceColumn.releaseTrackedRace(fleet);
}
@@ -414,7 +414,7 @@ public class ImportMasterDataOperation extends
private void addAllImportedEvents(MongoObjectFactory mongoObjectFactory, RaceLogStore mongoRaceLogStore,
final RaceLog log, RaceLogIdentifier identifier) {
RaceLogEventVisitor storeVisitor = MongoRaceLogStoreFactory.INSTANCE
final RaceLogEventVisitor storeVisitor = MongoRaceLogStoreFactory.INSTANCE
.getMongoRaceLogStoreVisitor(identifier, mongoObjectFactory);
log.lockForRead();
try {
@@ -4162,12 +4162,12 @@ Replicator {
@Override
public void reloadRaceLog(String leaderboardName, String raceColumnName, String fleetName) {
Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
final Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
if (leaderboard != null) {
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
final RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
if (raceColumn != null) {
Fleet fleetImpl = raceColumn.getFleetByName(fleetName);
RaceLog racelog = raceColumn.getRaceLog(fleetImpl);
final Fleet fleetImpl = raceColumn.getFleetByName(fleetName);
final RaceLog racelog = raceColumn.getRaceLog(fleetImpl);
if (racelog != null) {
raceColumn.reloadRaceLog(fleetImpl);
logger.info("Reloaded race log for fleet " + fleetImpl + " for race column " + raceColumn.getName()