diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/CompetitorDeregistrationTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/CompetitorDeregistrationTest.java old mode 100755 new mode 100644 index 80993ca0df5..693e7df1e24 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/CompetitorDeregistrationTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/CompetitorDeregistrationTest.java @@ -28,7 +28,8 @@ public class CompetitorDeregistrationTest extends AbstractRegattaLogTrackingTest log.add(new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), author, competitor2)); final CompetitorDeregistrator deregistrator = new CompetitorDeregistrator<>(log, Collections.singleton(competitor2), author); - deregistrator.analyze(); + final Set events = deregistrator.analyze(); + deregistrator.deregister(events); final Set competitors = new CompetitorsInLogAnalyzer<>(log).analyze(); assertEquals(1, competitors.size()); assertSame(competitor, competitors.iterator().next()); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorDeregistrator.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorDeregistrator.java index f1316b292b4..06c05304b64 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorDeregistrator.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/shared/analyzing/CompetitorDeregistrator.java @@ -1,6 +1,7 @@ package com.sap.sailing.domain.abstractlog.shared.analyzing; import java.util.HashSet; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -14,14 +15,21 @@ import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sse.common.Util; /** - * Generates events that close the events that are responsible for the {@link #mapping} that is passed to the - * constructor. + * Finds the competitor registration events for a given set of {@link Competitor competitors} that must be + * {@link AbstractLog#revokeEvent(AbstractLogEventAuthor, AbstractLogEvent) revoked} in order to deregister the + * competitors. Note that the de-registration cannot be performed during analysis because + * {@link BaseLogAnalyzer#analyze()} obtains a read lock on the log whereas + * {@link AbstractLog#revokeEvent(AbstractLogEventAuthor, AbstractLogEvent)} requires a write lock, and upgrading from a + * read to a write lock is not possible.

+ * + * Clients must call {@link #deregister} with the result of {@link #analyze()} in order to actually perform the + * deregistration. * * @author Jan Bross * */ public class CompetitorDeregistrator, EventT extends AbstractLogEvent, VisitorT> -extends BaseLogAnalyzer { +extends BaseLogAnalyzer> { private static final Logger logger = Logger.getLogger(CompetitorDeregistrator.class.getName()); protected final Iterable competitorsToDeregister; @@ -34,24 +42,29 @@ extends BaseLogAnalyzer { } @Override - protected Void performAnalysis() { - HashSet competitorSet = new HashSet(); + protected Set performAnalysis() { + final Set result = new HashSet<>(); + final HashSet competitorSet = new HashSet(); Util.addAll(competitorsToDeregister, competitorSet); - for (EventT event : log.getUnrevokedEventsDescending()) { if (event instanceof RegisterCompetitorEvent) { RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event; if (competitorSet.contains(registerEvent.getCompetitor())) { - try { - log.revokeEvent(eventAuthor, event, - "unregistering competitor because no longer selected for registration"); - } catch (NotRevokableException e) { - logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); - } + result.add(event); } } } - - return null; + return result; + } + + public void deregister(final Set competitorRegistrationEvents) { + for (final EventT event : competitorRegistrationEvents) { + try { + log.revokeEvent(eventAuthor, event, + "unregistering competitor because no longer selected for registration"); + } catch (NotRevokableException e) { + logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e); + } + } } }