diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java index fc1a209f9e0..6ea9b2e40a7 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java @@ -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 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 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 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 to, RacingEventService service); } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 23d7c0c7869..58475166278 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -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 toRaceLogs, - RacingEventService service) { - final Set 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> { EventT createDeviceMarkMapping(DeviceIdentifier device, TimePoint timePoint); @@ -297,64 +273,6 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { } } - private , EventT extends AbstractLogEvent, VisitorT> void registerCompetitors( - AbstractLogEventAuthor author, LogT log, Set competitors, - Function registerEventFactory) { - Set alreadyRegistered = new HashSet(new CompetitorsInLogAnalyzer<>(log).analyze()); - Set toBeRegistered = new HashSet(); - - for (Competitor c : competitors) { - toBeRegistered.add(c); - } - - Set toBeRemoved = new HashSet(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 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 competitors) { - registerCompetitors(service.getServerAuthor(), regattaLog, competitors, - c -> new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), - MillisecondsTimePoint.now(), service.getServerAuthor(), UUID.randomUUID(), c)); - } - private MailService getMailService() { ServiceReference ref = Activator.getContext().getServiceReference(MailService.class); if (ref == null) { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index e663a5e5c1c..f2dd6734253 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -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) { + public void registerCompetitors(Iterable competitor) { } @Override @@ -507,7 +506,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public void deregisterCompetitors(Collection competitor) { + public void deregisterCompetitors(Iterable competitor) { } }; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index 1561e639c2c..7b8339dee10 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -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, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + void registerCompetitors(Iterable 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 competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; + void deRegisterCompetitors(Iterable currentlyRegisteredCompetitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 33a2f8b8e50..07535c65aeb 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -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 competitors, Fleet fleet) + public void registerCompetitors(Iterable 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 competitors, Fleet fleet) + public void deRegisterCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { if (isCompetitorRegistrationInRacelogEnabled(fleet)){ throw new CompetitorRegistrationOnRaceLogDisabledException(); } + HashSet competitorSet = new HashSet(); + 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 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"); + } + } + } + } } \ No newline at end of file diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index fdc4323dd98..041bf146995 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -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 competitors) { + public void registerCompetitors(Iterable 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 competitors) { + public void deregisterCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); + HashSet competitorSet = new HashSet(); + 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"); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java index 50974add064..e3b2d2631a7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java @@ -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 competitors) { + public void registerCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); TimePoint now = MillisecondsTimePoint.now(); @@ -228,12 +228,15 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI } @Override - public void deregisterCompetitors(Collection competitors) { + public void deregisterCompetitors(Iterable competitors) { RegattaLog regattaLog = getRegattaLike().getRegattaLog(); + HashSet competitorSet = new HashSet(); + 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"); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 217af722e3f..ed3d4009931 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -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, Fleet fleet) + public void registerCompetitors(Iterable competitor, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { throw new CompetitorRegistrationOnRaceLogDisabledException(); } @@ -267,8 +266,16 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R } @Override - public void deRegisterCompetitors(Collection competitors, Fleet fleet) + public void deRegisterCompetitors(Iterable competitors, Fleet fleet) throws CompetitorRegistrationOnRaceLogDisabledException { throw new CompetitorRegistrationOnRaceLogDisabledException(); } + + @Override + public void enableCompetitorRegistrationOnRaceLog(Fleet fleetByName) { + } + + @Override + public void disableCompetitorRegistrationOnRaceLog(Fleet fleetByName) { + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java index 79a010a11b0..4f0cdcd6adb 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/regattalike/HasRegattaLike.java @@ -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 getCompetitorsRegisteredInRegattaLog(); void registerCompetitor(Competitor competitor); - void registerCompetitors(Collection competitor); + void registerCompetitors(Iterable competitor); void deregisterCompetitor(Competitor competitor); - void deregisterCompetitors(Collection competitor); + void deregisterCompetitors(Iterable competitor); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 4b329c26649..8eb707b9b9f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -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() { @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() { @Override public void onSuccess(Void isEnabled) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 36485f872cf..f8ec87c13ae 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -526,7 +526,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS Date dateOfMarkPassing, CompetitorDTO competitorDTO); void setCompetitorRegistrationsInRegattaLog(String leaderboardName, Set 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 checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, String fleetName, Set marksToRemove) throws NotFoundException; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index c2cfd2ce9e9..a311828524b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -740,10 +740,10 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan void areCompetitorRegistrationsEnabledForRace(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback asyncCallback); - void deactivateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, + void disableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback asyncCallback); - void activateCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, + void enableCompetitorRegistrationsForRace(String leaderboardName, String raceColumnName, String fleetName, AsyncCallback asyncCallback); void checkIfMarksAreUsedInOtherRaceLogs(String leaderboardName, String raceColumnName, String fleetName, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 6eb2656baef..531b815ed21 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -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 competitorDTOs) throws CompetitorRegistrationOnRaceLogDisabledException, NotFoundException { - RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - Set competitors = new HashSet(); + Set competitorsToRegister = new HashSet(); 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 competitorsToRemove = raceColumn.getAllCompetitors(fleet); + HashSet 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 competitorDTOs) - throws DoesNotHaveRegattaLogException { - RegattaLog regattaLog = getRegattaLogInternal(leaderboardName); - Set competitors = new HashSet(); - 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 competitorsToRegister = new HashSet(); + for (CompetitorDTO dto : competitorDTOs) { + competitorsToRegister.add(getCompetitor(dto)); + } + + HasRegattaLike hasRegattaLike = (HasRegattaLike) leaderboard; + Iterable competitorsToRemove = leaderboard.getAllCompetitors(); + HashSet competitorSetToRemove = new HashSet<>(); + Util.addAll(competitorsToRemove, competitorSetToRemove); + filterDuplicates(competitorsToRegister, competitorSetToRemove); + + hasRegattaLike.deregisterCompetitors(competitorSetToRemove); + hasRegattaLike.registerCompetitors(competitorsToRegister); + } + + private HashSet filterDuplicates(Set competitorsToRegister, + HashSet 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 fromTriple, Set> toTriples) throws NotFoundException { - RaceLog fromRaceLog = getRaceLog(fromTriple); - Set toRaceLogs = new HashSet<>(); + RaceColumn raceColumn = getRaceColumn(fromTriple.getA(), fromTriple.getB()); + Iterable competitorsToCopy = raceColumn.getAllCompetitors(getFleetByName(raceColumn, fromTriple.getC())); + for (com.sap.sse.common.Util.Triple 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 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 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)); } }