Disable/Enable competitor registrations on RaceColumn

This commit is contained in:
Jan Broß committed 2015-11-28 19:59:11 +01:00
1 parent 2f75c64c45
commit 96c6a19847
13 files changed
+149 -171

No files matched your search

@@ -7,8 +7,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
@@ -17,7 +15,6 @@ import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException;
import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException;
import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException;
import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState;
@@ -82,22 +79,6 @@ public interface RaceLogTrackingAdapter {
*/
void pingMark(RegattaLog regattaLogToAddTo, Mark mark, GPSFix gpsFix, RacingEventService service);
/**
* If not yet registered, register the competitors in {@code competitors}, and unregister all already registered
* competitors not in {@code competitors}.
*
* @throws CompetitorRegistrationOnRaceLogDisabledException
* if no {@link RaceLogUseCompetitorsFromRaceLogEvent} is present in the RaceLog
*/
void registerCompetitors(RacingEventService service, RaceLog raceLog, Set<Competitor> competitors)
throws CompetitorRegistrationOnRaceLogDisabledException;
/**
* If not yet registered, register the competitors in {@code competitors}, and unregister all already registered
* competitors not in {@code competitors}.
*/
void registerCompetitors(RacingEventService service, RegattaLog regattaLog, Set<Competitor> competitors);
/**
* Invite competitors for tracking via the Tracking App by sending out emails.
*
@@ -120,11 +101,4 @@ public interface RaceLogTrackingAdapter {
*/
void copyCourse(RaceLog fromRaceLog, Set<RaceLog> toRaceLogs, SharedDomainFactory baseDomainFactory,
RacingEventService service);
/**
* Duplicate the competitor registrations from the {@code from} race log to the {@code to} race logs. If a RaceLog
* is not set to use the CompetitorRegistrations on itself via {@link RaceLogUseCompetitorsFromRaceLogEvent},
* the RaceLog is set to use its own by adding a {@link RaceLogUseCompetitorsFromRaceLogEventImpl}
*/
void copyCompetitors(RaceLog from, Set<RaceLog> to, RacingEventService service);
}
@@ -7,7 +7,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -34,18 +33,12 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseDesignChangedEv
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogUsesOwnCompetitorsAnalyzer;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTrackingEventImpl;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor;
import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl;
import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl;
import com.sap.sailing.domain.abstractlog.shared.analyzing.CompetitorsInLogAnalyzer;
import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseBase;
@@ -60,7 +53,6 @@ import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.CourseDataImpl;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.abstractlog.NotRevokableException;
import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException;
import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException;
import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException;
@@ -238,22 +230,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
}
}
@Override
public void copyCompetitors(RaceLog fromRaceLog, Set<RaceLog> toRaceLogs,
RacingEventService service) {
final Set<Competitor> competitors = new CompetitorsInLogAnalyzer<>(fromRaceLog).analyze();
for (RaceLog toRaceLog : toRaceLogs) {
try {
registerCompetitors(service, toRaceLog, competitors);
} catch (CompetitorRegistrationOnRaceLogDisabledException e) {
int passId = toRaceLog.getCurrentPassId();
TimePoint now = MillisecondsTimePoint.now();
toRaceLog.add(new RaceLogUseCompetitorsFromRaceLogEventImpl(now, service.getServerAuthor(), now, UUID.randomUUID(), passId));
try { registerCompetitors(service, toRaceLog, competitors); } catch (CompetitorRegistrationOnRaceLogDisabledException e1) {/*cannot happen*/}
}
}
}
@FunctionalInterface
private static interface DeviceMarkMappingEventFactory<VisitorT, EventT extends AbstractLogEvent<VisitorT>> {
EventT createDeviceMarkMapping(DeviceIdentifier device, TimePoint timePoint);
@@ -297,64 +273,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
}
}
private <LogT extends AbstractLog<EventT, VisitorT>, EventT extends AbstractLogEvent<VisitorT>, VisitorT> void registerCompetitors(
AbstractLogEventAuthor author, LogT log, Set<Competitor> competitors,
Function<Competitor, EventT> registerEventFactory) {
Set<Competitor> alreadyRegistered = new HashSet<Competitor>(new CompetitorsInLogAnalyzer<>(log).analyze());
Set<Competitor> toBeRegistered = new HashSet<Competitor>();
for (Competitor c : competitors) {
toBeRegistered.add(c);
}
Set<Competitor> toBeRemoved = new HashSet<Competitor>(alreadyRegistered);
toBeRemoved.removeAll(toBeRegistered);
toBeRegistered.removeAll(alreadyRegistered);
// register
for (Competitor c : toBeRegistered) {
log.add(registerEventFactory.apply(c));
}
// unregister
for (EventT event : log.getUnrevokedEventsDescending()) {
if (event instanceof RegisterCompetitorEvent) {
RegisterCompetitorEvent<?> registerEvent = (RegisterCompetitorEvent<?>) event;
if (toBeRemoved.contains(registerEvent.getCompetitor())) {
try {
log.revokeEvent(author, event,
"unregistering competitor because no longer selected for registration");
} catch (NotRevokableException e) {
logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e);
}
}
}
}
}
@Override
public void registerCompetitors(RacingEventService service, RaceLog raceLog, Set<Competitor> competitors) throws CompetitorRegistrationOnRaceLogDisabledException {
if (new RaceLogUsesOwnCompetitorsAnalyzer(raceLog).analyze()){
registerCompetitors(
service.getServerAuthor(),
raceLog,
competitors,
c -> new RaceLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(),
service.getServerAuthor(), raceLog.getCurrentPassId(), c));
} else {
logger.warning("Not performing competitor registration on RaceLog as no RaceLogUseCompetitorsFromRaceLogEvent "
+ "is present and therefore competitors should be registered on RegattaLog");
throw new CompetitorRegistrationOnRaceLogDisabledException();
}
}
@Override
public void registerCompetitors(RacingEventService service, RegattaLog regattaLog, Set<Competitor> competitors) {
registerCompetitors(service.getServerAuthor(), regattaLog, competitors,
c -> new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(),
MillisecondsTimePoint.now(), service.getServerAuthor(), UUID.randomUUID(), c));
}
private MailService getMailService() {
ServiceReference<MailService> ref = Activator.getContext().getServiceReference(MailService.class);
if (ref == null) {
@@ -1,7 +1,6 @@
package com.sap.sailing.domain.test.mock;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.NavigableSet;
@@ -499,7 +498,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
}
@Override
public void registerCompetitors(Collection<Competitor> competitor) {
public void registerCompetitors(Iterable<Competitor> competitor) {
}
@Override
@@ -507,7 +506,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
}
@Override
public void deregisterCompetitors(Collection<Competitor> competitor) {
public void deregisterCompetitors(Iterable<Competitor> competitor) {
}
};
}
@@ -1,7 +1,5 @@
package com.sap.sailing.domain.base;
import java.util.Collection;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.common.RaceIdentifier;
@@ -281,6 +279,20 @@ public interface RaceColumn extends Named {
*/
boolean isCompetitorRegistrationInRacelogEnabled(Fleet fleet);
/**
* Activates competitor registration on the race column's race log associated to the passed fleet.
* Performs nothing in case this column belongs to a {@link MetaLeaderboard}.
* @param fleetByName
*/
void enableCompetitorRegistrationOnRaceLog(Fleet fleet);
/**
* Disables competitor registration on the race column's race log associated to the passed fleet.
* Performs nothing in case this column belongs to a {@link MetaLeaderboard}.
* @param fleetByName
*/
void disableCompetitorRegistrationOnRaceLog(Fleet fleet);
/**
* Registers a competitor on the the race column's race log associated to the passed fleet.
* @param competitor
@@ -289,7 +301,7 @@ public interface RaceColumn extends Named {
* thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard}
*/
void registerCompetitor(Competitor competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException;
void registerCompetitors(Collection<Competitor> competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException;
void registerCompetitors(Iterable<Competitor> competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException;
/**
* Deregisters a competitor on the the race column's race log associated to the passed fleet.
@@ -299,5 +311,5 @@ public interface RaceColumn extends Named {
* thrown if competitor registration is disabled on racelog as well as if RaceColumn belongs to a {@link MetaLeaderboard}
*/
void deRegisterCompetitor(Competitor competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException;
void deRegisterCompetitors(Collection<Competitor> competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException;
void deRegisterCompetitors(Iterable<Competitor> currentlyRegisteredCompetitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException;
}
@@ -6,6 +6,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@@ -14,12 +15,15 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.impl.AllEventsOfTypeFinder;
import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent;
import com.sap.sailing.domain.base.Competitor;
@@ -286,7 +290,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem
}
@Override
public void registerCompetitors(Collection<Competitor> competitors, Fleet fleet)
public void registerCompetitors(Iterable<Competitor> competitors, Fleet fleet)
throws CompetitorRegistrationOnRaceLogDisabledException {
if (isCompetitorRegistrationInRacelogEnabled(fleet)){
throw new CompetitorRegistrationOnRaceLogDisabledException();
@@ -308,17 +312,20 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem
}
@Override
public void deRegisterCompetitors(Collection<Competitor> competitors, Fleet fleet)
public void deRegisterCompetitors(Iterable<Competitor> competitors, Fleet fleet)
throws CompetitorRegistrationOnRaceLogDisabledException {
if (isCompetitorRegistrationInRacelogEnabled(fleet)){
throw new CompetitorRegistrationOnRaceLogDisabledException();
}
HashSet<Competitor> competitorSet = new HashSet<Competitor>();
Util.addAll(competitors, competitorSet);
RaceLog raceLog = getRaceLog(fleet);
for (RaceLogEvent event : raceLog.getUnrevokedEventsDescending()) {
if (event instanceof RegisterCompetitorEvent) {
RegisterCompetitorEvent<?> registerEvent = (RegisterCompetitorEvent<?>) event;
if (competitors.contains(registerEvent.getCompetitor())) {
if (competitorSet.contains(registerEvent.getCompetitor())) {
try {
raceLog.revokeEvent(raceLogEventAuthorForRaceColumn, event,
"unregistering competitor because no longer selected for registration");
@@ -378,4 +385,33 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem
}
return result;
}
@Override
public void enableCompetitorRegistrationOnRaceLog(Fleet fleet) {
TimePoint now = MillisecondsTimePoint.now();
RaceLog raceLog = getRaceLog(fleet);
int passId = raceLog.getCurrentPassId();
raceLog.add(new RaceLogUseCompetitorsFromRaceLogEventImpl(now, raceLogEventAuthorForRaceColumn, now, UUID.randomUUID(), passId));
}
@Override
public void disableCompetitorRegistrationOnRaceLog(Fleet fleet) {
RaceLog raceLog = getRaceLog(fleet);
List<RaceLogEvent> events = new AllEventsOfTypeFinder<>(raceLog, true, RaceLogUseCompetitorsFromRaceLogEvent.class).analyze();
for (RaceLogEvent event : events) {
raceLog.lockForRead();
try {
event = raceLog.getEventById(event.getId());
} finally {
raceLog.unlockAfterRead();
}
if (event != null) {
try {
raceLog.revokeEvent(raceLogEventAuthorForRaceColumn, event, "revoke triggered by GWT user action");
} catch (NotRevokableException e) {
logger.warning("Event could not be revoked");
}
}
}
}
}
@@ -5,7 +5,6 @@ import java.io.ObjectInputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
@@ -759,7 +758,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
}
@Override
public void registerCompetitors(Collection<Competitor> competitors) {
public void registerCompetitors(Iterable<Competitor> competitors) {
RegattaLog regattaLog = getRegattaLike().getRegattaLog();
TimePoint now = MillisecondsTimePoint.now();
@@ -775,12 +774,14 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
}
@Override
public void deregisterCompetitors(Collection<Competitor> competitors) {
public void deregisterCompetitors(Iterable<Competitor> competitors) {
RegattaLog regattaLog = getRegattaLike().getRegattaLog();
HashSet<Competitor> competitorSet = new HashSet<Competitor>();
Util.addAll(competitors, competitorSet);
for (RegattaLogEvent event : regattaLog.getUnrevokedEventsDescending()) {
if (event instanceof RegisterCompetitorEvent) {
RegisterCompetitorEvent<?> registerEvent = (RegisterCompetitorEvent<?>) event;
if (competitors.contains(registerEvent.getCompetitor())) {
if (competitorSet.contains(registerEvent.getCompetitor())) {
try {
regattaLog.revokeEvent(regattaLogEventAuthorForRegatta, event,
"unregistering competitor because no longer selected for registration");
@@ -1,6 +1,5 @@
package com.sap.sailing.domain.leaderboard.impl;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
@@ -30,6 +29,7 @@ import com.sap.sailing.domain.leaderboard.ScoreCorrection;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.common.impl.MillisecondsTimePoint;
/**
@@ -212,7 +212,7 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI
}
@Override
public void registerCompetitors(Collection<Competitor> competitors) {
public void registerCompetitors(Iterable<Competitor> competitors) {
RegattaLog regattaLog = getRegattaLike().getRegattaLog();
TimePoint now = MillisecondsTimePoint.now();
@@ -228,12 +228,15 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI
}
@Override
public void deregisterCompetitors(Collection<Competitor> competitors) {
public void deregisterCompetitors(Iterable<Competitor> competitors) {
RegattaLog regattaLog = getRegattaLike().getRegattaLog();
HashSet<Competitor> competitorSet = new HashSet<Competitor>();
Util.addAll(competitors, competitorSet);
for (RegattaLogEvent event : regattaLog.getUnrevokedEventsDescending()) {
if (event instanceof RegisterCompetitorEvent) {
RegisterCompetitorEvent<?> registerEvent = (RegisterCompetitorEvent<?>) event;
if (competitors.contains(registerEvent.getCompetitor())) {
if (competitorSet.contains(registerEvent.getCompetitor())) {
try {
regattaLog.revokeEvent(regattaLogEventAuthorForAbstraceLeaderboard, event,
"unregistering competitor because no longer selected for registration");
@@ -1,6 +1,5 @@
package com.sap.sailing.domain.leaderboard.meta;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@@ -255,7 +254,7 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R
}
@Override
public void registerCompetitors(Collection<Competitor> competitor, Fleet fleet)
public void registerCompetitors(Iterable<Competitor> competitor, Fleet fleet)
throws CompetitorRegistrationOnRaceLogDisabledException {
throw new CompetitorRegistrationOnRaceLogDisabledException();
}
@@ -267,8 +266,16 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R
}
@Override
public void deRegisterCompetitors(Collection<Competitor> competitors, Fleet fleet)
public void deRegisterCompetitors(Iterable<Competitor> competitors, Fleet fleet)
throws CompetitorRegistrationOnRaceLogDisabledException {
throw new CompetitorRegistrationOnRaceLogDisabledException();
}
@Override
public void enableCompetitorRegistrationOnRaceLog(Fleet fleetByName) {
}
@Override
public void disableCompetitorRegistrationOnRaceLog(Fleet fleetByName) {
}
}
@@ -1,7 +1,5 @@
package com.sap.sailing.domain.regattalike;
import java.util.Collection;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Regatta;
@@ -22,8 +20,8 @@ public interface HasRegattaLike {
Iterable<Competitor> getCompetitorsRegisteredInRegattaLog();
void registerCompetitor(Competitor competitor);
void registerCompetitors(Collection<Competitor> competitor);
void registerCompetitors(Iterable<Competitor> competitor);
void deregisterCompetitor(Competitor competitor);
void deregisterCompetitors(Collection<Competitor> competitor);
void deregisterCompetitors(Iterable<Competitor> competitor);
}
@@ -92,7 +92,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
@Override
public void ok(Void editedObject) {
if (competitorRegistrationInRaceLogCheckBox.getValue()) {
sailingService.activateCompetitorRegistrationsForRace(leaderboardName,
sailingService.enableCompetitorRegistrationsForRace(leaderboardName,
raceColumnName, fleetName, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void isEnabled) {
@@ -110,7 +110,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
});
} else {
sailingService.deactivateCompetitorRegistrationsForRace(leaderboardName,
sailingService.disableCompetitorRegistrationsForRace(leaderboardName,
raceColumnName, fleetName, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void isEnabled) {
@@ -526,7 +526,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
Date dateOfMarkPassing, CompetitorDTO competitorDTO);
void setCompetitorRegistrationsInRegattaLog(String leaderboardName, Set<CompetitorDTO> competitors)
throws DoesNotHaveRegattaLogException;
throws DoesNotHaveRegattaLogException, NotFoundException;
/**
* A leaderboard may be situated under multiple events (connected via a leaderboardgroup).
@@ -606,9 +606,9 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
Boolean areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException;
void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException;
void disableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException;
void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException;
void enableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException;
Pair<Boolean, String> checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName,
String fleetName, Set<MarkDTO> marksToRemove) throws NotFoundException;
@@ -740,10 +740,10 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
void areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Boolean> asyncCallback);
void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName,
void disableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Void> asyncCallback);
void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName,
void enableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Void> asyncCallback);
void checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, String fleetName,
@@ -81,9 +81,7 @@ import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogUseCompetitorsFromRaceLogEventImpl;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent;
import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent;
@@ -5035,25 +5033,54 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public void setCompetitorRegistrationsInRaceLog(String leaderboardName, String raceColumnName, String fleetName,
Set<CompetitorDTO> competitorDTOs) throws CompetitorRegistrationOnRaceLogDisabledException, NotFoundException {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
Set<Competitor> competitors = new HashSet<Competitor>();
Set<Competitor> competitorsToRegister = new HashSet<Competitor>();
for (CompetitorDTO dto : competitorDTOs) {
competitors.add(getCompetitor(dto));
competitorsToRegister.add(getCompetitor(dto));
}
getRaceLogTrackingAdapter().registerCompetitors(getService(), raceLog, competitors);
RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName);
Fleet fleet = getFleetByName(raceColumn, fleetName);
Iterable<Competitor> competitorsToRemove = raceColumn.getAllCompetitors(fleet);
HashSet<Competitor> competitorSetToRemove = new HashSet<>();
Util.addAll(competitorsToRemove, competitorSetToRemove);
filterDuplicates(competitorsToRegister, competitorSetToRemove);
raceColumn.deRegisterCompetitors(competitorSetToRemove, fleet);
raceColumn.registerCompetitors(competitorsToRegister, fleet);
}
@Override
public void setCompetitorRegistrationsInRegattaLog(String leaderboardName, Set<CompetitorDTO> competitorDTOs)
throws DoesNotHaveRegattaLogException {
RegattaLog regattaLog = getRegattaLogInternal(leaderboardName);
Set<Competitor> competitors = new HashSet<Competitor>();
for (CompetitorDTO dto : competitorDTOs) {
competitors.add(getCompetitor(dto));
throws DoesNotHaveRegattaLogException, NotFoundException {
Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
if (!(leaderboard instanceof HasRegattaLike)){
throw new DoesNotHaveRegattaLogException();
}
getRaceLogTrackingAdapter().registerCompetitors(getService(), regattaLog, competitors);
Set<Competitor> competitorsToRegister = new HashSet<Competitor>();
for (CompetitorDTO dto : competitorDTOs) {
competitorsToRegister.add(getCompetitor(dto));
}
HasRegattaLike hasRegattaLike = (HasRegattaLike) leaderboard;
Iterable<Competitor> competitorsToRemove = leaderboard.getAllCompetitors();
HashSet<Competitor> competitorSetToRemove = new HashSet<>();
Util.addAll(competitorsToRemove, competitorSetToRemove);
filterDuplicates(competitorsToRegister, competitorSetToRemove);
hasRegattaLike.deregisterCompetitors(competitorSetToRemove);
hasRegattaLike.registerCompetitors(competitorsToRegister);
}
private HashSet<Competitor> filterDuplicates(Set<Competitor> competitorsToRegister,
HashSet<Competitor> competitorSetToRemove) {
for (Competitor competitor : competitorSetToRemove) {
if (competitorsToRegister.contains(competitor)){
competitorsToRegister.remove(competitor);
competitorSetToRemove.remove(competitor);
}
}
return competitorSetToRemove;
}
private Mark convertToMark(MarkDTO dto, boolean resolve) {
@@ -5219,12 +5246,22 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public void copyCompetitorsToOtherRaceLogs(com.sap.sse.common.Util.Triple<String, String, String> fromTriple,
Set<com.sap.sse.common.Util.Triple<String, String, String>> toTriples) throws NotFoundException {
RaceLog fromRaceLog = getRaceLog(fromTriple);
Set<RaceLog> toRaceLogs = new HashSet<>();
RaceColumn raceColumn = getRaceColumn(fromTriple.getA(), fromTriple.getB());
Iterable<Competitor> competitorsToCopy = raceColumn.getAllCompetitors(getFleetByName(raceColumn, fromTriple.getC()));
for (com.sap.sse.common.Util.Triple<String, String, String> toTriple : toTriples) {
toRaceLogs.add(getRaceLog(toTriple));
RaceColumn toRaceColumn = getRaceColumn(toTriple.getA(), toTriple.getB());
try {
toRaceColumn.registerCompetitors(competitorsToCopy, getFleetByName(toRaceColumn, toTriple.getC()));
} catch (CompetitorRegistrationOnRaceLogDisabledException e){
toRaceColumn.enableCompetitorRegistrationOnRaceLog(getFleetByName(toRaceColumn, toTriple.getC()));
try {
toRaceColumn.registerCompetitors(competitorsToCopy, getFleetByName(toRaceColumn, toTriple.getC()));
} catch (CompetitorRegistrationOnRaceLogDisabledException e1) {
//cannot happen
}
}
}
getRaceLogTrackingAdapter().copyCompetitors(fromRaceLog, toRaceLogs, getService());
}
private TypeBasedServiceFinder<DeviceIdentifierStringSerializationHandler> getDeviceIdentifierStringSerializerHandlerFinder(
@@ -5288,7 +5325,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
result.add(raceLog);
}
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
if (leaderboard instanceof HasRegattaLike) {
result.add(((HasRegattaLike) leaderboard).getRegattaLike().getRegattaLog());
}
@@ -5468,7 +5505,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public void startRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, final boolean trackWind, final boolean correctWindByDeclination)
throws NotDenotedForRaceLogTrackingException, Exception {
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
Leaderboard leaderboard = getLeaderboardByName(leaderboardName);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
Fleet fleet = raceColumn.getFleetByName(fleetName);
final RaceHandle raceHandle = getRaceLogTrackingAdapter().startTracking(getService(), leaderboard, raceColumn, fleet);
@@ -5959,25 +5996,18 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
@Override
public void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException {
public void disableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws NotRevokableException, NotFoundException {
if (areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName)){
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
List<RaceLogEvent> events = new AllEventsOfTypeFinder<>(raceLog, true, RaceLogUseCompetitorsFromRaceLogEvent.class).analyze();
for (RaceLogEvent event : events) {
revokeEvent(false, event.getId(), raceLog);
}
RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName);
raceColumn.disableCompetitorRegistrationOnRaceLog(getFleetByName(raceColumn, fleetName));
}
}
@Override
public void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException {
public void enableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName) throws IllegalArgumentException, NotFoundException {
if (!areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName)){
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
int passId = raceLog.getCurrentPassId();
RaceLogUseCompetitorsFromRaceLogEvent event = new RaceLogUseCompetitorsFromRaceLogEventImpl(MillisecondsTimePoint.now(),
getService().getServerAuthor(), MillisecondsTimePoint.now(), UUID.randomUUID(), passId);
raceLog.add(event);
RaceColumn raceColumn = getRaceColumn(leaderboardName, raceColumnName);
raceColumn.enableCompetitorRegistrationOnRaceLog(getFleetByName(raceColumn, fleetName));
}
}