getUnrevokedEventsDescending();
-
- /**
- * Inserts a {@link RevokeEvent} for {@code toRevoke}, if latter is revokable, exists in the racelog
- * and has not yet been revoked.
- *
- * @param author The author for the {@code RevokeEvent}.
- */
- RevokeEvent revokeEvent(RaceLogEventAuthor author, T toRevoke, String reason) throws NotRevokableException;
- RevokeEvent revokeEvent(RaceLogEventAuthor author, T toRevoke) throws NotRevokableException;
/**
* Merges all events from the other race log into this.
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java
index 1a7aaa095fe..18255ceab03 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java
@@ -13,7 +13,7 @@ import com.sap.sailing.domain.common.WithID;
/**
*
- * A {@link AbstractLogEvent} is an entry in a race's log (typically a {@link RaceLog}.
+ * A {@link AbstractLogEvent} is an entry in a race's log (typically a {@link RaceLog}).
*
*
*
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java
index 8a3bc461954..31f107a3a7c 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java
@@ -17,15 +17,12 @@ import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.AbstractLog;
import com.sap.sailing.domain.abstractlog.AbstractLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.abstractlog.race.Revokable;
import com.sap.sailing.domain.abstractlog.race.RevokeEvent;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventComparator;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl;
import com.sap.sailing.domain.base.Timed;
-import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException;
import com.sap.sailing.domain.tracking.Track;
import com.sap.sailing.domain.tracking.impl.PartialNavigableSetView;
@@ -414,22 +411,4 @@ public class AbstractLogImpl extends TrackImpl im
unlockAfterWrite();
}
}
-
- @Override
- public RevokeEvent revokeEvent(RaceLogEventAuthor author, T toRevoke) throws NotRevokableException {
- return revokeEvent(author, toRevoke, null);
- }
-
- @Override
- public RevokeEvent revokeEvent(RaceLogEventAuthor author, T toRevoke, String reason) throws NotRevokableException {
- if (toRevoke == null) {
- throw new NotRevokableException("Received null as event to revoke");
- }
- RevokeEvent revokeEvent = RaceLogEventFactory.INSTANCE.createRevokeEvent(
- MillisecondsTimePoint.now(), author, getCurrentPassId(), toRevoke.getId(),
- toRevoke.getClass().getSimpleName(), toRevoke.getShortInfo(), reason);
- checkIfSuccessfullyRevokes(revokeEvent);
- add((T) revokeEvent);
- return revokeEvent;
- }
}
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java
index e6788a5f18d..48233c6cfcc 100755
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java
@@ -12,12 +12,9 @@ import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.AbstractLog;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
-import com.sap.sailing.domain.abstractlog.race.RevokeEvent;
import com.sap.sailing.domain.common.Duration;
import com.sap.sailing.domain.common.TimePoint;
-import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException;
/**
* Wrapper for a {@link RaceLog} which will ignore all calls trying to add an {@link RaceLogEvent}. All other
@@ -234,15 +231,4 @@ public class NoAddingRaceLogWrapper implements RaceLog {
public void merge(AbstractLog other) {
innerRaceLog.merge(other);
}
-
- @Override
- public RevokeEvent revokeEvent(RaceLogEventAuthor author, RaceLogEvent toRevoke) throws NotRevokableException {
- return innerRaceLog.revokeEvent(author, toRevoke);
- }
-
- @Override
- public RevokeEvent revokeEvent(RaceLogEventAuthor author, RaceLogEvent toRevoke, String reason)
- throws NotRevokableException {
- return innerRaceLog.revokeEvent(author, toRevoke, reason);
- }
}
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java
index 785cb326fba..d190fe030b7 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java
@@ -15,6 +15,7 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProce
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureFactory;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureFactoryImpl;
+import com.sap.sailing.domain.abstractlog.race.tracking.events.RevokeEventImpl;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.configuration.ConfigurationLoader;
import com.sap.sailing.domain.base.configuration.RegattaConfiguration;
@@ -23,7 +24,6 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
-import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException;
import com.sap.sailing.domain.tracking.Wind;
/**
@@ -173,12 +173,8 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState {
}
} else {
if (event != null) {
- try {
- // revoke the newest one
- raceLog.revokeEvent(author, event);
- } catch (NotRevokableException e) {
- e.printStackTrace();
- }
+ // revoke the newest one
+ raceLog.add(RevokeEventImpl.create(raceLog, author, event));
}
}
}
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/RevokeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/RevokeEventImpl.java
index 68c7ef07064..650e9318e4a 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/RevokeEventImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/RevokeEventImpl.java
@@ -2,13 +2,17 @@ package com.sap.sailing.domain.abstractlog.race.tracking.events;
import java.io.Serializable;
import java.util.Collections;
+import java.util.UUID;
+import com.sap.sailing.domain.abstractlog.AbstractLog;
+import com.sap.sailing.domain.abstractlog.AbstractLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.abstractlog.race.RevokeEvent;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.TimePoint;
+import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
public class RevokeEventImpl extends RaceLogEventImpl implements RevokeEvent {
private static final long serialVersionUID = -30864810737555657L;
@@ -61,5 +65,14 @@ public class RevokeEventImpl extends RaceLogEventImpl implements RevokeEvent {
@Override
public String getReason() {
return reason;
- }
+ }
+
+ public static RevokeEvent create(AbstractLog> log, RaceLogEventAuthor author, AbstractLogEvent toRevoke, String reason) {
+ return new RevokeEventImpl(MillisecondsTimePoint.now(), author, MillisecondsTimePoint.now(), UUID.randomUUID(),
+ log.getCurrentPassId(), toRevoke.getId(), toRevoke.getClass().getName(), toRevoke.getShortInfo(), reason);
+ }
+
+ public static RevokeEvent create(AbstractLog> log, RaceLogEventAuthor author, AbstractLogEvent toRevoke) {
+ return create(log, author, toRevoke, null);
+ }
}
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java
index 85b669f7e4b..fbf80bd06d0 100644
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java
@@ -29,6 +29,7 @@ import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformat
import com.sap.sailing.domain.abstractlog.race.scoring.impl.AdditionalScoringInformationEventImpl;
import com.sap.sailing.domain.abstractlog.race.state.RaceState;
import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl;
+import com.sap.sailing.domain.abstractlog.race.tracking.events.RevokeEventImpl;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.DomainFactory;
@@ -52,7 +53,6 @@ import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
-import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException;
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
@@ -846,11 +846,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest {
AdditionalScoringInformationFinder finder = new AdditionalScoringInformationFinder(raceLogForRace2);
AdditionalScoringInformationEvent event = finder.analyze(/*filterBy*/AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE);
assert event != null;
- try {
- raceLogForRace2.revokeEvent(new RaceLogEventAuthorImpl("Plopp", 1), event);
- } catch (NotRevokableException e) {
- e.printStackTrace();
- }
+ raceLogForRace2.add(RevokeEventImpl.create(raceLogForRace2, new RaceLogEventAuthorImpl("Plopp", 1), event));
event = finder.analyze(/*filterBy*/AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE);
assert event == null;
assertEquals(new Double(30), leaderboardHighPoint10Or8AndLastBreaksTie.getTotalPoints(competitors[0], later));
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 c1136821074..af6ab9bb215 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
@@ -78,6 +78,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.LastPingM
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.OpenEndedDeviceMappingCloser;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer;
+import com.sap.sailing.domain.abstractlog.race.tracking.events.RevokeEventImpl;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.DeviceMappingImpl;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
@@ -196,7 +197,6 @@ import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegisteredException;
import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException;
-import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException;
import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState;
import com.sap.sailing.domain.common.racelog.tracking.TransformationException;
import com.sap.sailing.domain.common.racelog.tracking.TypeBasedServiceFinder;
@@ -4970,14 +4970,14 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public void revokeRaceLogEvents(String leaderboardName, String raceColumnName, String fleetName,
- List eventIds) throws NotRevokableException {
+ List eventIds) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
for (Serializable idToRevoke : eventIds) {
raceLog.lockForRead();
RaceLogEvent event = raceLog.getEventById(idToRevoke);
raceLog.unlockAfterRead();
if (event instanceof Revokable) {
- raceLog.revokeEvent(getService().getServerAuthor(), (Revokable) event);
+ raceLog.add(RevokeEventImpl.create(raceLog, getService().getServerAuthor(), (Revokable) event));
}
}
}
From d53e21ff0d8cbe7a3c69766a38f54e66cfb87ff7 Mon Sep 17 00:00:00 2001
From: Fredrik Teschke
Date: Mon, 17 Nov 2014 14:42:44 +0100
Subject: [PATCH 03/93] further refactoring (AbstractLog): pass and involved
competitors -> RaceLog, generalize RevokeEvent
---
.../impl/DomainObjectFactoryImpl.java | 50 ++---
.../impl/MongoObjectFactoryImpl.java | 11 +-
.../impl/MongoRaceLogStoreVisitor.java | 4 +-
.../test/AbstractGPSFixStoreTest.java | 4 +-
.../impl/CreateAndTrackWithRaceLogTest.java | 4 +-
.../impl/RaceLogRaceTracker.java | 7 +-
.../impl/RaceLogTrackingAdapterImpl.java | 29 ++-
...firmedFinishPositioningListFinderTest.java | 4 +-
.../test/FinishedTimeFinderTest.java | 4 +-
.../test/FinishingTimeFinderTest.java | 4 +-
.../test/GateLineOpeningTimeFinderTest.java | 4 +-
.../test/IndividualRecallFinderTest.java | 4 +-
.../test/PassAwareRaceLogAnalyzerTest.java | 18 +-
.../test/ProtestStartTimeFinderTest.java | 4 +-
.../analyzing/test/RaceLogAnalyzerTest.java | 8 +-
.../test/RaceStatusAnalyzerTest.java | 10 +-
.../analyzing/test/StartTimeFinderTest.java | 4 +-
.../racelog/state/test/RaceStateTest.java | 4 +-
.../racelog/test/RaceLogEventAuthorTest.java | 12 +-
.../test/RaceLogEventComparatorTest.java | 35 +++-
.../racelog/test/RaceLogEventImplTest.java | 4 +-
.../racelog/test/RaceLogRevocationTest.java | 55 +++---
.../domain/racelog/test/RaceLogTest.java | 24 +--
.../test/AbstractRaceLogTrackingTest.java | 6 +-
.../test/DeviceMappingFinderTest.java | 6 +-
.../analyzing/test/RevokeEventTest.java | 10 +-
.../META-INF/MANIFEST.MF | 5 +
.../domain/abstractlog/AbstractLog.java | 84 ++++-----
.../domain/abstractlog/AbstractLogEvent.java | 37 +---
...uthor.java => AbstractLogEventAuthor.java} | 6 +-
.../abstractlog/{race => }/Revokable.java | 5 +-
.../abstractlog/{race => }/RevokeEvent.java | 6 +-
.../impl/AbstractLogEventComparator.java | 51 ++++++
.../impl/AbstractLogEventImpl.java | 31 +---
.../abstractlog/impl/AbstractLogImpl.java | 171 ++++++++----------
.../abstractlog/impl/RevokeEventImpl.java | 56 ++++++
.../domain/abstractlog/race/RaceLog.java | 25 +--
.../domain/abstractlog/race/RaceLogEvent.java | 62 ++-----
.../abstractlog/race/RaceLogEventFactory.java | 72 ++++----
.../race/RaceLogEventRestoreFactory.java | 45 ++---
.../abstractlog/race/RaceLogEventVisitor.java | 4 +-
.../abstractlog/race/RaceLogRevokeEvent.java | 7 +
.../impl/AbstractRaceLogChangedVisitor.java | 4 +-
.../race/impl/BaseRaceLogEventVisitor.java | 4 +-
.../race/impl/NoAddingRaceLogWrapper.java | 15 +-
.../RaceLogCourseAreaChangeEventImpl.java | 4 +-
.../RaceLogCourseDesignChangedEventImpl.java | 4 +-
.../race/impl/RaceLogEventAuthorImpl.java | 8 +-
.../race/impl/RaceLogEventComparator.java | 54 ++----
.../race/impl/RaceLogEventFactoryImpl.java | 81 ++++-----
.../race/impl/RaceLogEventImpl.java | 28 ++-
.../impl/RaceLogEventRestoreFactoryImpl.java | 51 +++---
...ogFinishPositioningConfirmedEventImpl.java | 4 +-
.../RaceLogFinishPositioningEventImpl.java | 4 +-
...FinishPositioningListChangedEventImpl.java | 4 +-
.../race/impl/RaceLogFlagEventImpl.java | 4 +-
.../RaceLogGateLineOpeningTimeEventImpl.java | 4 +-
.../abstractlog/race/impl/RaceLogImpl.java | 67 ++++++-
.../race/impl/RaceLogPassChangeEventImpl.java | 4 +-
.../race/impl/RaceLogPathfinderEventImpl.java | 4 +-
.../RaceLogProtestStartTimeEventImpl.java | 4 +-
.../RaceLogRaceStatusEventComparator.java | 4 +-
.../race/impl/RaceLogRaceStatusEventImpl.java | 4 +-
.../race/impl/RaceLogRevokeEventImpl.java | 40 ++++
...RaceLogStartProcedureChangedEventImpl.java | 4 +-
.../race/impl/RaceLogStartTimeEventImpl.java | 4 +-
.../race/impl/RaceLogWindFixEventImpl.java | 4 +-
.../AdditionalScoringInformationEvent.java | 2 +-
...AdditionalScoringInformationEventImpl.java | 4 +-
.../abstractlog/race/state/RaceState.java | 6 +-
.../race/state/impl/RaceStateImpl.java | 25 ++-
.../basic/impl/BasicRacingProcedureImpl.java | 4 +-
.../ess/impl/ESSRacingProcedureImpl.java | 4 +-
.../impl/GateStartRacingProcedureImpl.java | 4 +-
.../impl/BaseRacingProcedure.java | 6 +-
.../impl/RacingProcedureFactoryImpl.java | 6 +-
.../impl/ReadonlyRacingProcedureFactory.java | 6 +-
.../rrs26/impl/RRS26RacingProcedureImpl.java | 4 +-
.../CloseOpenEndedDeviceMappingEvent.java | 2 +-
.../race/tracking/DefineMarkEvent.java | 2 +-
.../race/tracking/DenoteForTrackingEvent.java | 2 +-
.../race/tracking/DeviceMappingEvent.java | 2 +-
.../tracking/RegisterCompetitorEvent.java | 2 +-
.../race/tracking/StartTrackingEvent.java | 2 +-
.../impl/OpenEndedDeviceMappingCloser.java | 6 +-
.../AbstractDeviceMappingEventImpl.java | 4 +-
.../CloseOpenEndedDeviceMappingEventImpl.java | 4 +-
.../tracking/events/DefineMarkEventImpl.java | 4 +-
.../events/DenoteForTrackingEventImpl.java | 4 +-
.../DeviceCompetitorMappingEventImpl.java | 4 +-
.../events/DeviceMarkMappingEventImpl.java | 4 +-
.../events/RegisterCompetitorEventImpl.java | 4 +-
.../race/tracking/events/RevokeEventImpl.java | 78 --------
.../events/StartTrackingEventImpl.java | 4 +-
.../abstractlog/regatta/RegattaLog.java | 2 +-
.../abstractlog/regatta/RegattaLogEvent.java | 45 +----
.../regatta/RegattaLogEventFactory.java | 10 +
.../RegattaLogEventRestoreFactory.java | 15 ++
.../regatta/RegattaLogEventVisitor.java | 7 +
.../regatta/RegattaLogRevokeEvent.java | 7 +
.../impl/RegattaLogEventFactoryImpl.java | 18 ++
.../regatta/impl/RegattaLogEventImpl.java | 13 +-
.../RegattaLogEventRestoreFactoryImpl.java | 16 ++
.../regatta/impl/RegattaLogImpl.java | 15 +-
.../impl/RegattaLogRevokeEventImpl.java | 24 +++
.../LeaderboardScoringAndRankingTest.java | 8 +-
.../impl/RaceColumnRaceLogReplicator.java | 4 +-
.../sailing/gwt/ui/client/SailingService.java | 2 +-
.../gwt/ui/server/SailingServiceImpl.java | 8 +-
...tStoringAndRetrievingRaceLogInRegatta.java | 4 +-
.../StoreAndLoadDeviceIdentifierTest.java | 4 +-
.../test/StoreAndLoadRaceLogEventsTest.java | 14 +-
.../mongodb/test/StoreGPSFixTrackTest.java | 4 +-
...tStoringAndRetrievingRaceLogEventData.java | 4 +-
...ingAndRetrievingRaceLogInLeaderboards.java | 6 +-
.../racelog/AbstractEventSerializerTest.java | 4 +-
...ourseDesignChangedEventSerializerTest.java | 4 +-
.../racelog/RaceLogEventSerializerTest.java | 6 +-
...sitioningConfirmedEventSerializerTest.java | 4 +-
.../RaceLogWindFixEventSerializerTest.java | 4 +-
.../impl/BaseRaceLogEventDeserializer.java | 6 +-
...alScoringInformationEventDeserializer.java | 4 +-
...enEndedDeviceMappingEventDeserializer.java | 4 +-
...LogCourseAreaChangedEventDeserializer.java | 4 +-
...gCourseDesignChangedEventDeserializer.java | 4 +-
.../RaceLogDefineMarkEventDeserializer.java | 4 +-
...LogDenoteForTrackingEventDeserializer.java | 4 +-
...iceCompetitorMappingEventDeserializer.java | 4 +-
...RaceLogDeviceMappingEventDeserializer.java | 6 +-
...LogDeviceMarkMappingEventDeserializer.java | 4 +-
...PositioningConfirmedEventDeserializer.java | 4 +-
...sitioningListChangedEventDeserializer.java | 4 +-
.../impl/RaceLogFlagEventDeserializer.java | 4 +-
...gGateLineOpeningTimeEventDeserializer.java | 4 +-
.../RaceLogPassChangeEventDeserializer.java | 4 +-
.../RaceLogPathFinderEventDeserializer.java | 4 +-
...eLogProtestStartTimeEventDeserializer.java | 4 +-
.../RaceLogRaceStatusEventDeserializer.java | 4 +-
...ogRegisterCompetitorEventDeserializer.java | 4 +-
.../impl/RaceLogRevokeEventDeserializer.java | 4 +-
...tartProcedureChangedEventDeserializer.java | 4 +-
.../RaceLogStartTimeEventDeserializer.java | 4 +-
...RaceLogStartTrackingEventDeserializer.java | 4 +-
.../impl/RaceLogWindFixEventDeserializer.java | 4 +-
.../racelog/impl/RaceLogEventSerializer.java | 4 +-
.../impl/RaceLogRevokeEventSerializer.java | 6 +-
.../test/RaceLogSerializationTest.java | 4 +-
.../test/RaceLogReplicationTest.java | 4 +-
.../server/test/MasterDataImportTest.java | 4 +-
.../server/test/RaceLogInRaceColumnTest.java | 4 +-
.../RaceLogOperationalTransformationTest.java | 4 +-
.../server/test/WindByRaceLogTest.java | 4 +-
.../sailing/server/RacingEventService.java | 6 +-
.../server/impl/RacingEventServiceImpl.java | 6 +-
.../tracking/app/utils/AppPreferences.java | 4 +-
.../racecommittee/app/AppPreferences.java | 6 +-
.../app/data/OfflineDataManager.java | 4 +-
.../data/parsers/ManagedRacesDataParser.java | 6 +-
.../app/ui/activities/RacingActivity.java | 4 +-
.../app/ui/fragments/dialogs/LoginDialog.java | 6 +-
160 files changed, 1105 insertions(+), 930 deletions(-)
rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/{race/RaceLogEventAuthor.java => AbstractLogEventAuthor.java} (75%)
mode change 100755 => 100644
rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/{race => }/Revokable.java (82%)
rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/{race => }/RevokeEvent.java (76%)
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventComparator.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/RevokeEventImpl.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogRevokeEvent.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogRevokeEventImpl.java
delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/events/RevokeEventImpl.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventFactory.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventRestoreFactory.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogEventVisitor.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/RegattaLogRevokeEvent.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventFactoryImpl.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogEventRestoreFactoryImpl.java
create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/impl/RegattaLogRevokeEventImpl.java
diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java
index d4f005aa9c9..1e55269b20f 100755
--- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java
+++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java
@@ -29,12 +29,13 @@ import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
import com.mongodb.util.JSON;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.RevokeEvent;
import com.sap.sailing.domain.abstractlog.race.CompetitorResults;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventRestoreFactory;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent;
@@ -47,7 +48,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent;
-import com.sap.sailing.domain.abstractlog.race.RevokeEvent;
import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventAuthorImpl;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl;
@@ -1292,7 +1292,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
Integer passId = (Integer) dbObject.get(FieldNames.RACE_LOG_EVENT_PASS_ID.name());
BasicDBList dbCompetitors = (BasicDBList) dbObject.get(FieldNames.RACE_LOG_EVENT_INVOLVED_BOATS.name());
List competitors = loadCompetitorsForRaceLogEvent(dbCompetitors);
- final RaceLogEventAuthor author;
+ final AbstractLogEventAuthor author;
String authorName = (String) dbObject.get(FieldNames.RACE_LOG_EVENT_AUTHOR_NAME.name());
Number authorPriority = (Number) dbObject.get(FieldNames.RACE_LOG_EVENT_AUTHOR_PRIORITY.name());
if (authorName != null && authorPriority != null) {
@@ -1351,13 +1351,13 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
throw new IllegalStateException(String.format("Unknown RaceLogEvent type %s", eventClass));
}
- private RaceLogEvent loadRaceLogRaceLogWindFixEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogRaceLogWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
Wind wind = loadWind((DBObject) dbObject.get(FieldNames.WIND.name()));
return raceLogEventFactory.createWindFixEvent(createdAt, author, logicalTimePoint, id, competitors, passId, wind);
}
- private RaceLogEvent loadRaceLogDeviceCompetitorMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogDeviceCompetitorMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
DeviceIdentifier device = null;
try {
@@ -1374,7 +1374,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return raceLogEventFactory.createDeviceCompetitorMappingEvent(createdAt, author, logicalTimePoint, id, device, mappedTo, passId, from, to);
}
- private RaceLogEvent loadRaceLogDeviceMarkMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogDeviceMarkMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
DeviceIdentifier device = null;
try {
@@ -1391,7 +1391,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return raceLogEventFactory.createDeviceMarkMappingEvent(createdAt, author, logicalTimePoint, id, device, mappedTo, passId, from, to);
}
- private RaceLogEvent loadRaceLogDenoteForTrackingEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogDenoteForTrackingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
String raceName = (String) dbObject.get(FieldNames.RACE_NAME.name());
BoatClass boatClass = baseDomainFactory.getOrCreateBoatClass((String) dbObject.get(FieldNames.BOAT_CLASS_NAME.name()));
@@ -1399,12 +1399,12 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return raceLogEventFactory.createDenoteForTrackingEvent(createdAt, author, logicalTimePoint, id, passId, raceName, boatClass, raceId);
}
- private RaceLogEvent loadRaceLogStartEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogStartEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
return raceLogEventFactory.createStartTrackingEvent(createdAt, author, logicalTimePoint, id, passId);
}
- private RaceLogEvent loadRaceLogRevokeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogRevokeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
Serializable revokedEventId = Helpers.tryUuidConversion(
(Serializable) dbObject.get(FieldNames.RACE_LOG_REVOKED_EVENT_ID.name()));
@@ -1415,19 +1415,19 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
revokedEventId, revokedEventType, revokedEventShortInfo, reason);
}
- private RaceLogEvent loadRaceLogRegisterCompetitorEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogRegisterCompetitorEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
assert competitors.size() == 1 : "Should have exactly one competitor for RegisterCompetitorEvent";
return raceLogEventFactory.createRegisterCompetitorEvent(createdAt, author, logicalTimePoint, id, passId, competitors.get(0));
}
- private RaceLogEvent loadRaceLogDefineMarkEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogDefineMarkEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
Mark mark = loadMark((DBObject) dbObject.get(FieldNames.RACE_LOG_MARK.name()));
return raceLogEventFactory.createDefineMarkEvent(createdAt, author, logicalTimePoint, id, passId, mark);
}
- private RaceLogEvent loadRaceLogCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogCloseOpenEndedDeviceMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
Serializable deviceMappingEventId = Helpers.tryUuidConversion((Serializable) dbObject.get(FieldNames.RACE_LOG_DEVICE_MAPPING_EVENT_ID.name()));
TimePoint closingTimePoint = loadTimePoint(dbObject, FieldNames.RACE_LOG_CLOSING_TIMEPOINT);
@@ -1435,7 +1435,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
deviceMappingEventId, closingTimePoint);
}
- private RaceLogEvent loadRaceLogAdditionalScoringInformationEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogAdditionalScoringInformationEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
Object additionalScoringInformationTypeInfo = dbObject.get(FieldNames.RACE_LOG_ADDITIONAL_SCORING_INFORMATION_TYPE.name());
AdditionalScoringInformationType informationType = AdditionalScoringInformationType.UNKNOWN;
@@ -1447,19 +1447,19 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return raceLogEventFactory.createAdditionalScoringInformationEvent(createdAt, author, logicalTimePoint, id, competitors, passId, informationType);
}
- private RaceLogEvent loadRaceLogRaceLogProtestStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author,
+ private RaceLogEvent loadRaceLogRaceLogProtestStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author,
TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
TimePoint protestStartTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_PROTEST_START_TIME);
return raceLogEventFactory.createProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, competitors, passId, protestStartTime);
}
- private RaceLogEvent loadRaceLogStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author,
+ private RaceLogEvent loadRaceLogStartProcedureChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author,
TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
RacingProcedureType type = RacingProcedureType.valueOf(dbObject.get(FieldNames.RACE_LOG_START_PROCEDURE_TYPE.name()).toString());
return raceLogEventFactory.createStartProcedureChangedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, type);
}
- private RaceLogEvent loadRaceLogGateLineOpeningTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogGateLineOpeningTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
Number gateLaunchStopTime = (Number) dbObject.get(FieldNames.RACE_LOG_GATE_LINE_OPENING_TIME.name());
Number golfDownTime = 0;
@@ -1470,13 +1470,13 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
passId, gateLaunchStopTime == null ? null : gateLaunchStopTime.longValue(), golfDownTime.longValue());
}
- private RaceLogEvent loadRaceLogPathfinderEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogPathfinderEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors, DBObject dbObject) {
String pathfinderId = dbObject.get(FieldNames.RACE_LOG_PATHFINDER_ID.name()).toString();
return raceLogEventFactory.createPathfinderEvent(createdAt, author, logicalTimePoint, id, competitors, passId, pathfinderId);
}
- private RaceLogEvent loadRaceLogFinishPositioningConfirmedEvent(TimePoint createdAt, RaceLogEventAuthor author,
+ private RaceLogEvent loadRaceLogFinishPositioningConfirmedEvent(TimePoint createdAt, AbstractLogEventAuthor author,
TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
BasicDBList dbPositionedCompetitorList = (BasicDBList) dbObject.get(FieldNames.RACE_LOG_POSITIONED_COMPETITORS.name());
CompetitorResults positionedCompetitors = null;
@@ -1489,7 +1489,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return raceLogEventFactory.createFinishPositioningConfirmedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, positionedCompetitors);
}
- private RaceLogEvent loadRaceLogFinishPositioningListChangedEvent(TimePoint createdAt, RaceLogEventAuthor author,
+ private RaceLogEvent loadRaceLogFinishPositioningListChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author,
TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
BasicDBList dbPositionedCompetitorList = (BasicDBList) dbObject.get(FieldNames.RACE_LOG_POSITIONED_COMPETITORS.name());
CompetitorResults positionedCompetitors = loadPositionedCompetitors(dbPositionedCompetitorList);
@@ -1497,18 +1497,18 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return raceLogEventFactory.createFinishPositioningListChangedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, positionedCompetitors);
}
- private RaceLogEvent loadRaceLogPassChangeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ private RaceLogEvent loadRaceLogPassChangeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List competitors) {
return raceLogEventFactory.createPassChangeEvent(createdAt, author, logicalTimePoint, id, competitors, passId);
}
- private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
+ private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
String courseName = (String) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN_NAME.name());
CourseBase courseData = loadCourseData((BasicDBList) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN.name()), courseName);
return raceLogEventFactory.createCourseDesignChangedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, courseData);
}
- private RaceLogCourseAreaChangedEvent loadRaceLogCourseAreaChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
+ private RaceLogCourseAreaChangedEvent loadRaceLogCourseAreaChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
Serializable courseAreaId = (Serializable) dbObject.get(FieldNames.COURSE_AREA_ID.name());
return raceLogEventFactory.createCourseAreaChangedEvent(createdAt, author, logicalTimePoint, id, competitors, passId, courseAreaId);
}
@@ -1549,7 +1549,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return competitors;
}
- private RaceLogFlagEvent loadRaceLogFlagEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
+ private RaceLogFlagEvent loadRaceLogFlagEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
Flags upperFlag = Flags.valueOf((String) dbObject.get(FieldNames.RACE_LOG_EVENT_FLAG_UPPER.name()));
Flags lowerFlag = Flags.valueOf((String) dbObject.get(FieldNames.RACE_LOG_EVENT_FLAG_LOWER.name()));
Boolean displayed = Boolean.valueOf((String) dbObject.get(FieldNames.RACE_LOG_EVENT_FLAG_DISPLAYED.name()));
@@ -1561,12 +1561,12 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return raceLogEventFactory.createFlagEvent(createdAt, author, logicalTimePoint, id, competitors, passId, upperFlag, lowerFlag, displayed);
}
- private RaceLogStartTimeEvent loadRaceLogStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
+ private RaceLogStartTimeEvent loadRaceLogStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
TimePoint startTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_EVENT_START_TIME);
return raceLogEventFactory.createStartTimeEvent(createdAt, author, logicalTimePoint, id, competitors, passId, startTime);
}
- private RaceLogRaceStatusEvent loadRaceLogRaceStatusEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
+ private RaceLogRaceStatusEvent loadRaceLogRaceStatusEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) {
RaceLogRaceStatus nextStatus = RaceLogRaceStatus.valueOf((String) dbObject.get(FieldNames.RACE_LOG_EVENT_NEXT_STATUS.name()));
return raceLogEventFactory.createRaceStatusEvent(createdAt, author, logicalTimePoint, id, competitors, passId, nextStatus);
}
diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java
index 00900df0045..6194d7a646f 100755
--- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java
+++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java
@@ -18,10 +18,11 @@ import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.WriteConcern;
import com.mongodb.util.JSON;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.RevokeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent;
@@ -30,10 +31,10 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent;
+import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent;
-import com.sap.sailing.domain.abstractlog.race.RevokeEvent;
import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent;
@@ -686,7 +687,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
return result;
}
- private void storeRaceLogEventAuthor(DBObject dbObject, RaceLogEventAuthor author) {
+ private void storeRaceLogEventAuthor(DBObject dbObject, AbstractLogEventAuthor author) {
if (author != null) {
dbObject.put(FieldNames.RACE_LOG_EVENT_AUTHOR_NAME.name(), author.getName());
dbObject.put(FieldNames.RACE_LOG_EVENT_AUTHOR_PRIORITY.name(), author.getPriority());
@@ -816,7 +817,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
return result;
}
- public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RevokeEvent event) {
+ public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogRevokeEvent event) {
BasicDBObject result = new BasicDBObject();
storeRaceLogIdentifier(raceLogIdentifier, result);
result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogRevokeEvent(event));
@@ -943,7 +944,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
return result;
}
- private Object storeRaceLogRevokeEvent(RevokeEvent event) {
+ private Object storeRaceLogRevokeEvent(RaceLogRevokeEvent event) {
DBObject result = new BasicDBObject();
storeRaceLogEventProperties(event, result);
result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RevokeEvent.class.getSimpleName());
diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java
index 12c3013051f..b09e981de9f 100644
--- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java
+++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java
@@ -14,10 +14,10 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogPathfinderEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogProtestStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent;
+import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent;
-import com.sap.sailing.domain.abstractlog.race.RevokeEvent;
import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.CloseOpenEndedDeviceMappingEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent;
@@ -145,7 +145,7 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor {
}
@Override
- public void visit(RevokeEvent event) {
+ public void visit(RaceLogRevokeEvent event) {
DBObject object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event);
mongoObjectFactory.storeRaceLogEventEvent(object);
}
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java
index 5d97814b5f3..63ae6706606 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java
@@ -6,8 +6,8 @@ import static junit.framework.Assert.assertEquals;
import org.junit.After;
import org.junit.Before;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventAuthorImpl;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl;
@@ -43,7 +43,7 @@ public class AbstractGPSFixStoreTest {
protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null);
protected final Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark");
- private final RaceLogEventAuthor author = new RaceLogEventAuthorImpl("author", 0);
+ private final AbstractLogEventAuthor author = new RaceLogEventAuthorImpl("author", 0);
protected GPSFixMoving createFix(long millis, double lat, double lng, double knots, double degrees) {
return new GPSFixMovingImpl(new DegreePosition(lat, lng),
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java
index 7f6077ac181..f6b9796f936 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java
@@ -17,8 +17,8 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory;
import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier;
import com.sap.sailing.domain.base.Competitor;
@@ -57,7 +57,7 @@ public class CreateAndTrackWithRaceLogTest {
private RegattaLeaderboard leaderboard;
private RaceLogTrackingAdapter adapter;
private Regatta regatta;
- private RaceLogEventAuthor author;
+ private AbstractLogEventAuthor author;
private GPSFixStore gpsFixStore;
private long time = 0;
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java
index 88843bb0f53..ca242106fb6 100755
--- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java
@@ -26,7 +26,6 @@ import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DeviceMar
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceInformationFinder;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer;
-import com.sap.sailing.domain.abstractlog.race.tracking.events.RevokeEventImpl;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
@@ -49,6 +48,7 @@ import com.sap.sailing.domain.common.TrackedRaceStatusEnum;
import com.sap.sailing.domain.common.WithID;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegisteredException;
+import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException;
import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState;
import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException;
import com.sap.sailing.domain.common.racelog.tracking.TransformationException;
@@ -373,7 +373,10 @@ public class RaceLogRaceTracker extends BaseRaceLogEventVisitor implements RaceT
Course course = new CourseImpl(raceName + " course", courseBase.getWaypoints());
if (raceColumn.getTrackedRace(fleet) != null) {
- raceLog.add(RevokeEventImpl.create(raceLog, params.getService().getServerAuthor(), event));
+ try {
+ raceLog.revokeEvent(params.getService().getServerAuthor(), event,
+ "could not start tracking because tracked race already exists");
+ } catch (NotRevokableException e) {}
throw new RaceNotCreatedException(String.format("Race for racelog (%s) has already been created", raceLog));
}
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 5ec97e3cb95..5544d6480bc 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
@@ -9,11 +9,11 @@ import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.Revokable;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory;
-import com.sap.sailing.domain.abstractlog.race.Revokable;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder;
import com.sap.sailing.domain.abstractlog.race.tracking.DefineMarkEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent;
@@ -24,7 +24,6 @@ import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.AllEvents
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.LastEventOfTypeFinder;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer;
-import com.sap.sailing.domain.abstractlog.race.tracking.events.RevokeEventImpl;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
@@ -44,6 +43,7 @@ import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.racelog.tracking.NoCorrespondingServiceRegisteredException;
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.NotRevokableException;
import com.sap.sailing.domain.common.racelog.tracking.RaceLogRaceTrackerExistsException;
import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState;
import com.sap.sailing.domain.common.racelog.tracking.TransformationException;
@@ -199,10 +199,14 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
return baseDomainFactory.createWaypoint(newCP, pi);
}
- private void revokeAlreadyDefinedMarks(RaceLog raceLog, RaceLogEventAuthor author) {
+ private void revokeAlreadyDefinedMarks(RaceLog raceLog, AbstractLogEventAuthor author) {
List markEvents = new AllEventsOfTypeFinder(raceLog, true, DefineMarkEvent.class).analyze();
for (RaceLogEvent event : markEvents) {
- raceLog.add(RevokeEventImpl.create(raceLog, author, event));
+ try {
+ raceLog.revokeEvent(author, event, "removing mark that was already defined");
+ } catch (NotRevokableException e) {
+ logger.log(Level.WARNING, "Could not remove mark that was already defined by adding RevokeEvent", e);
+ }
}
}
@@ -261,8 +265,12 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
public void removeDenotationForRaceLogTracking(RacingEventService service, RaceLog raceLog) {
Revokable denoteForTrackingEvent = (Revokable) new LastEventOfTypeFinder(raceLog, true, DenoteForTrackingEvent.class).analyze();
Revokable startTrackingEvent = (Revokable) new LastEventOfTypeFinder(raceLog, true, StartTrackingEvent.class).analyze();
- raceLog.add(RevokeEventImpl.create(raceLog, service.getServerAuthor(), denoteForTrackingEvent));
- raceLog.add(RevokeEventImpl.create(raceLog, service.getServerAuthor(), startTrackingEvent));
+ try {
+ raceLog.revokeEvent(service.getServerAuthor(), denoteForTrackingEvent, "remove denotation");
+ raceLog.revokeEvent(service.getServerAuthor(), startTrackingEvent, "reset start time upon removing denotation");
+ } catch (NotRevokableException e) {
+ logger.log(Level.WARNING, "could not remove denotation by adding RevokeEvents", e);
+ }
}
@Override
@@ -289,7 +297,12 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
if (event instanceof RegisterCompetitorEvent) {
RegisterCompetitorEvent registerEvent = (RegisterCompetitorEvent) event;
if (toBeRemoved.contains(registerEvent.getCompetitor())) {
- raceLog.add(RevokeEventImpl.create(raceLog, service.getServerAuthor(), (RegisterCompetitorEvent) event));
+ try {
+ raceLog.revokeEvent(service.getServerAuthor(), (RegisterCompetitorEvent) event,
+ "unregistering competitor because no longer selected for registration");
+ } catch (NotRevokableException e) {
+ logger.log(Level.WARNING, "could not unregister competitor by adding RevokeEvent", e);
+ }
}
}
}
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java
index 451b6a358ac..bada0503c17 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java
@@ -9,10 +9,10 @@ import java.util.Arrays;
import org.junit.Test;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.CompetitorResults;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.ConfirmedFinishPositioningListFinder;
@@ -25,7 +25,7 @@ public class ConfirmedFinishPositioningListFinderTest extends
}
@Override
- protected TargetPair getTargetEventsAndResultForPassAwareTests(int passId, RaceLogEventAuthor author) {
+ protected TargetPair getTargetEventsAndResultForPassAwareTests(int passId, AbstractLogEventAuthor author) {
RaceLogFinishPositioningConfirmedEvent event = createEvent(RaceLogFinishPositioningConfirmedEvent.class, 1, passId, author);
when(event.getPositionedCompetitorsIDsNamesMaxPointsReasons()).thenReturn(mock(CompetitorResults.class));
return new TargetPair(Arrays.asList(event), event.getPositionedCompetitorsIDsNamesMaxPointsReasons());
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java
index 918c7c17df3..43792f039c2 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/FinishedTimeFinderTest.java
@@ -8,9 +8,9 @@ import java.util.Arrays;
import org.junit.Test;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder;
import com.sap.sailing.domain.common.TimePoint;
@@ -24,7 +24,7 @@ public class FinishedTimeFinderTest extends PassAwareRaceLogAnalyzerTest, ResultType>
@@ -41,18 +41,18 @@ public abstract class PassAwareRaceLogAnalyzerTest T createEvent(Class type, long milliseconds, int passId, Serializable id) {
- return createEvent(type, milliseconds, passId, id, mock(RaceLogEventAuthor.class));
+ return createEvent(type, milliseconds, passId, id, mock(AbstractLogEventAuthor.class));
}
- protected static T createEvent(Class type, long milliseconds, int passId, RaceLogEventAuthor author) {
+ protected static T createEvent(Class type, long milliseconds, int passId, AbstractLogEventAuthor author) {
return createEvent(type, milliseconds, passId, UUID.randomUUID(), author);
}
- protected static T createEvent(Class type, long milliseconds, int passId, Serializable id, RaceLogEventAuthor author) {
+ protected static T createEvent(Class type, long milliseconds, int passId, Serializable id, AbstractLogEventAuthor author) {
T event = mock(type);
when(event.getAuthor()).thenReturn(author);
when(event.getPassId()).thenReturn(passId);
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/RaceStatusAnalyzerTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/RaceStatusAnalyzerTest.java
index 6f9b4a7ddc1..82c305620d6 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/RaceStatusAnalyzerTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/RaceStatusAnalyzerTest.java
@@ -12,9 +12,9 @@ import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.abstractlog.race.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent;
@@ -35,7 +35,7 @@ public class RaceStatusAnalyzerTest extends PassAwareRaceLogAnalyzerTest configuration;
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventAuthorTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventAuthorTest.java
index 87aff01304a..c15fd2fb727 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventAuthorTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventAuthorTest.java
@@ -5,14 +5,14 @@ import static org.junit.Assert.assertTrue;
import org.junit.Test;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventAuthorImpl;
public class RaceLogEventAuthorTest {
@Test
public void testCompareToSame() {
- RaceLogEventAuthor author = new RaceLogEventAuthorImpl("", 1);
+ AbstractLogEventAuthor author = new RaceLogEventAuthorImpl("", 1);
int result = author.compareTo(author);
assertEquals(0, result);
@@ -20,8 +20,8 @@ public class RaceLogEventAuthorTest {
@Test
public void testCompareToMinor() {
- RaceLogEventAuthor author = new RaceLogEventAuthorImpl("", 1);
- RaceLogEventAuthor minor = new RaceLogEventAuthorImpl("", 2);
+ AbstractLogEventAuthor author = new RaceLogEventAuthorImpl("", 1);
+ AbstractLogEventAuthor minor = new RaceLogEventAuthorImpl("", 2);
int result = author.compareTo(minor);
assertTrue(result > 0);
@@ -29,8 +29,8 @@ public class RaceLogEventAuthorTest {
@Test
public void testCompareToMajor() {
- RaceLogEventAuthor author = new RaceLogEventAuthorImpl("", 3);
- RaceLogEventAuthor major = new RaceLogEventAuthorImpl("", 2);
+ AbstractLogEventAuthor author = new RaceLogEventAuthorImpl("", 3);
+ AbstractLogEventAuthor major = new RaceLogEventAuthorImpl("", 2);
int result = author.compareTo(major);
assertTrue(result < 0);
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventComparatorTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventComparatorTest.java
index b2c693f169f..0e7711631f1 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventComparatorTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventComparatorTest.java
@@ -8,8 +8,8 @@ import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventComparator;
import com.sap.sailing.domain.base.Timed;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
@@ -18,7 +18,7 @@ public class RaceLogEventComparatorTest {
private RaceLogEvent eventOne;
private RaceLogEvent eventTwo;
- private RaceLogEventAuthor author;
+ private AbstractLogEventAuthor author;
private RaceLogEventComparator comparator;
@@ -26,15 +26,16 @@ public class RaceLogEventComparatorTest {
public void setUp() {
eventOne = mock(RaceLogEvent.class);
eventTwo = mock(RaceLogEvent.class);
- author = mock(RaceLogEventAuthor.class);
+ author = mock(AbstractLogEventAuthor.class);
- comparator = RaceLogEventComparator.INSTANCE;
+ comparator = new RaceLogEventComparator();
}
@Test
public void testEqualsOnSame() {
- when(eventOne.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class));
+ when(eventOne.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class));
when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1));
+ when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
when(eventOne.getId()).thenReturn("a");
int result = comparator.compare(eventOne, eventOne);
@@ -46,10 +47,12 @@ public class RaceLogEventComparatorTest {
when(eventOne.getPassId()).thenReturn(0);
when(eventOne.getAuthor()).thenReturn(author);
when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0));
+ when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
when(eventOne.getId()).thenReturn("a");
when(eventTwo.getPassId()).thenReturn(0);
when(eventTwo.getAuthor()).thenReturn(author);
when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0));
+ when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
when(eventTwo.getId()).thenReturn("a");
int result = comparator.compare(eventOne, eventTwo);
@@ -61,10 +64,12 @@ public class RaceLogEventComparatorTest {
when(eventOne.getPassId()).thenReturn(0);
when(eventOne.getAuthor()).thenReturn(author);
when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0));
+ when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
when(eventOne.getId()).thenReturn("a");
when(eventTwo.getPassId()).thenReturn(0);
when(eventTwo.getAuthor()).thenReturn(author);
when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0));
+ when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
when(eventTwo.getId()).thenReturn("b");
int result = comparator.compare(eventOne, eventTwo);
@@ -76,9 +81,11 @@ public class RaceLogEventComparatorTest {
when(eventOne.getPassId()).thenReturn(0);
when(eventOne.getAuthor()).thenReturn(author);
when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1));
+ when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
when(eventTwo.getPassId()).thenReturn(0);
when(eventTwo.getAuthor()).thenReturn(author);
when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2));
+ when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(2));
int result = comparator.compare(eventOne, eventTwo);
assertTrue(result < 0);
@@ -89,9 +96,11 @@ public class RaceLogEventComparatorTest {
when(eventOne.getPassId()).thenReturn(0);
when(eventOne.getAuthor()).thenReturn(author);
when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2));
+ when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(2));
when(eventTwo.getPassId()).thenReturn(0);
when(eventTwo.getAuthor()).thenReturn(author);
when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1));
+ when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
int result = comparator.compare(eventOne, eventTwo);
assertTrue(result > 0);
@@ -99,15 +108,19 @@ public class RaceLogEventComparatorTest {
@Test
public void testSamePassButLowerHigherAuthor() {
- RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class);
- RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class);
+ AbstractLogEventAuthor minorAuthor = mock(AbstractLogEventAuthor.class);
+ AbstractLogEventAuthor majorAuthor = mock(AbstractLogEventAuthor.class);
when(minorAuthor.compareTo(majorAuthor)).thenReturn(-1);
when(majorAuthor.compareTo(minorAuthor)).thenReturn(1);
when(eventOne.getPassId()).thenReturn(0);
when(eventOne.getAuthor()).thenReturn(minorAuthor);
+ when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1));
+ when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
when(eventTwo.getPassId()).thenReturn(0);
when(eventTwo.getAuthor()).thenReturn(majorAuthor);
+ when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1));
+ when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
int result = comparator.compare(eventOne, eventTwo);
assertTrue(result < 0);
@@ -115,15 +128,19 @@ public class RaceLogEventComparatorTest {
@Test
public void testSamePassButHigherLowerAuthor() {
- RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class);
- RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class);
+ AbstractLogEventAuthor minorAuthor = mock(AbstractLogEventAuthor.class);
+ AbstractLogEventAuthor majorAuthor = mock(AbstractLogEventAuthor.class);
when(minorAuthor.compareTo(majorAuthor)).thenReturn(-1);
when(majorAuthor.compareTo(minorAuthor)).thenReturn(1);
when(eventOne.getPassId()).thenReturn(0);
when(eventOne.getAuthor()).thenReturn(majorAuthor);
+ when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1));
+ when(eventOne.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
when(eventTwo.getPassId()).thenReturn(0);
when(eventTwo.getAuthor()).thenReturn(minorAuthor);
+ when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1));
+ when(eventTwo.getLogicalTimePoint()).thenReturn(new MillisecondsTimePoint(1));
int result = comparator.compare(eventOne, eventTwo);
assertTrue(result > 0);
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventImplTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventImplTest.java
index f3447dc61cc..41af3e1fc60 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventImplTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogEventImplTest.java
@@ -6,8 +6,8 @@ import static org.mockito.Mockito.mock;
import java.io.Serializable;
import java.util.List;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventImpl;
import com.sap.sailing.domain.base.Competitor;
@@ -28,7 +28,7 @@ public class RaceLogEventImplTest {
private static class TestRaceLogEvent extends RaceLogEventImpl {
private static final long serialVersionUID = -5856509136541176818L;
- public TestRaceLogEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
+ public TestRaceLogEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable pId, List pInvolvedBoats, int pPassId) {
super(createdAt, author, logicalTimePoint, pId, pInvolvedBoats, pPassId);
}
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogRevocationTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogRevocationTest.java
index d92ef571167..0f7f072442d 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogRevocationTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogRevocationTest.java
@@ -1,24 +1,23 @@
package com.sap.sailing.domain.racelog.test;
-import static org.junit.Assert.assertEquals;
-
-import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.isIn;
+import static org.junit.Assert.assertEquals;
import java.util.UUID;
import org.junit.Before;
import org.junit.Test;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
+import com.sap.sailing.domain.abstractlog.race.RaceLogChangedListener;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory;
-import com.sap.sailing.domain.abstractlog.race.RevokeEvent;
+import com.sap.sailing.domain.abstractlog.race.impl.RaceLogChangedVisitor;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventAuthorImpl;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl;
import com.sap.sailing.domain.abstractlog.race.tracking.DenoteForTrackingEvent;
-import com.sap.sailing.domain.abstractlog.race.tracking.events.RevokeEventImpl;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException;
@@ -26,16 +25,16 @@ import com.sap.sse.common.Util;
public class RaceLogRevocationTest {
private RaceLog serverRaceLog;
- private RaceLogEventAuthor serverAuthor = new RaceLogEventAuthorImpl("server", 2);
+ private AbstractLogEventAuthor serverAuthor = new RaceLogEventAuthorImpl("server", 2);
private RaceLog clientARaceLog;
private UUID clientAUUID = UUID.randomUUID();
- private RaceLogEventAuthor clientAAuthor = new RaceLogEventAuthorImpl("clientA", 3);
+ private AbstractLogEventAuthor clientAAuthor = new RaceLogEventAuthorImpl("clientA", 3);
private RaceLog clientBRaceLog;
private UUID clientBUUID = UUID.randomUUID();
- private RaceLogEventAuthor clientBAuthor = new RaceLogEventAuthorImpl("clientB", 1);
+ private AbstractLogEventAuthor clientBAuthor = new RaceLogEventAuthorImpl("clientB", 1);
private RaceLog clientCRaceLog;
private UUID clientCUUID = UUID.randomUUID();
- private RaceLogEventAuthor clientCAuthor = new RaceLogEventAuthorImpl("clientC", 0);
+ private AbstractLogEventAuthor clientCAuthor = new RaceLogEventAuthorImpl("clientC", 0);
@Before
public void setup() {
@@ -43,6 +42,19 @@ public class RaceLogRevocationTest {
clientARaceLog = new RaceLogImpl("clientA");
clientBRaceLog = new RaceLogImpl("clientB");
clientCRaceLog = new RaceLogImpl("clientC");
+
+ addSendingListener(clientARaceLog, clientAUUID);
+ addSendingListener(clientBRaceLog, clientBUUID);
+ addSendingListener(clientCRaceLog, clientCUUID);
+ }
+
+ private void addSendingListener(RaceLog raceLog, UUID uuid) {
+ raceLog.addListener(new RaceLogChangedVisitor(new RaceLogChangedListener() {
+ @Override
+ public void eventAdded(RaceLogEvent event) {
+ sendClientEvent(raceLog, event, uuid);
+ }
+ }));
}
private static TimePoint now() {
@@ -105,17 +117,16 @@ public class RaceLogRevocationTest {
sendClientCEvent(null);
//they revoke the event independently
- RevokeEvent revokeEventA = RevokeEventImpl.create(clientARaceLog, clientAAuthor, event);
- RevokeEvent revokeEventB = RevokeEventImpl.create(clientBRaceLog, clientBAuthor, event);
- RevokeEvent revokeEventC = RevokeEventImpl.create(clientCRaceLog, clientCAuthor, event);
-
- sendClientAEvent(revokeEventA);
+ try {
+ clientARaceLog.revokeEvent(clientAAuthor, event);
+ } catch (NotRevokableException e) {
+ //expected
+ }
+ clientBRaceLog.revokeEvent(clientBAuthor, event);
+ clientCRaceLog.revokeEvent(clientCAuthor, event);
//expected, because A does not have sufficient priority
assertThat("event not revoked due to insufficient author priority", event, isIn(clientARaceLog.getUnrevokedEvents()));
- sendClientBEvent(revokeEventB);
- sendClientCEvent(revokeEventC);
-
//update clients
sendClientAEvent(null);
sendClientBEvent(null);
@@ -123,12 +134,12 @@ public class RaceLogRevocationTest {
//check if the event has been revoked on the server and clients
assertNumUnrevoked(clientARaceLog, 0);
- assertNumAll(clientARaceLog, 4);
+ assertNumAll(clientARaceLog, 3);
assertNumUnrevoked(clientBRaceLog, 0);
- assertNumAll(clientBRaceLog, 4);
+ assertNumAll(clientBRaceLog, 3);
assertNumUnrevoked(clientCRaceLog, 0);
- assertNumAll(clientCRaceLog, 4);
+ assertNumAll(clientCRaceLog, 3);
assertNumUnrevoked(serverRaceLog, 0);
- assertNumAll(serverRaceLog, 4);
+ assertNumAll(serverRaceLog, 3);
}
}
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogTest.java
index d4c73b24b7d..28b6c71217d 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogTest.java
@@ -19,9 +19,9 @@ import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventFactory;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent;
@@ -242,11 +242,11 @@ public class RaceLogTest {
RaceLogEvent eventTwo = mock(RaceLogEvent.class);
when(eventOne.getPassId()).thenReturn(0);
- when(eventOne.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class));
+ when(eventOne.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class));
when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0));
when(eventOne.getId()).thenReturn("a");
when(eventTwo.getPassId()).thenReturn(1);
- when(eventTwo.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class));
+ when(eventTwo.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class));
when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0));
when(eventTwo.getId()).thenReturn("b");
@@ -263,7 +263,7 @@ public class RaceLogTest {
public void testAddEventSamePassAndSameAuthorAndSameTimePointButDifferentId() {
RaceLogEvent eventOne = mock(RaceLogEvent.class);
RaceLogEvent eventTwo = mock(RaceLogEvent.class);
- RaceLogEventAuthor author = mock(RaceLogEventAuthor.class);
+ AbstractLogEventAuthor author = mock(AbstractLogEventAuthor.class);
when(eventOne.getPassId()).thenReturn(0);
when(eventOne.getAuthor()).thenReturn(author);
@@ -287,7 +287,7 @@ public class RaceLogTest {
public void testWontAddEventSamePassAndSameAuthorAndSameTimePointAndSameId() {
RaceLogEvent eventOne = mock(RaceLogEvent.class);
RaceLogEvent eventTwo = mock(RaceLogEvent.class);
- RaceLogEventAuthor author = mock(RaceLogEventAuthor.class);
+ AbstractLogEventAuthor author = mock(AbstractLogEventAuthor.class);
when(eventOne.getPassId()).thenReturn(0);
when(eventOne.getAuthor()).thenReturn(author);
@@ -360,8 +360,8 @@ public class RaceLogTest {
RaceLogEvent event1 = mock(RaceLogEvent.class);
RaceLogEvent event2 = mock(RaceLogEvent.class);
RaceLogEvent event3 = mock(RaceLogEvent.class);
- RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class);
- RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class);
+ AbstractLogEventAuthor minorAuthor = mock(AbstractLogEventAuthor.class);
+ AbstractLogEventAuthor majorAuthor = mock(AbstractLogEventAuthor.class);
when(minorAuthor.compareTo(majorAuthor)).thenReturn(-1);
when(majorAuthor.compareTo(minorAuthor)).thenReturn(1);
@@ -389,8 +389,8 @@ public class RaceLogTest {
RaceLogEvent event2 = mock(RaceLogEvent.class);
RaceLogEvent event3 = mock(RaceLogEvent.class);
RaceLogEvent event4 = mock(RaceLogEvent.class);
- RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class);
- RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class);
+ AbstractLogEventAuthor minorAuthor = mock(AbstractLogEventAuthor.class);
+ AbstractLogEventAuthor majorAuthor = mock(AbstractLogEventAuthor.class);
when(minorAuthor.compareTo(majorAuthor)).thenReturn(-1);
when(majorAuthor.compareTo(minorAuthor)).thenReturn(1);
@@ -419,7 +419,7 @@ public class RaceLogTest {
assertEquals(event2, Util.get(raceLog.getFixesDescending(), 2));
raceLog.unlockAfterRead();
}
- private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1);
+ private AbstractLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1);
@Test
public void testAddingEventsFromMultipleClients() {
@@ -446,14 +446,14 @@ public class RaceLogTest {
TimePoint createdAtEventOne = new MillisecondsTimePoint(100);
RaceLogEvent eventOne = mock(RaceLogEvent.class);
- when(eventOne.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class));
+ when(eventOne.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class));
when(eventOne.getCreatedAt()).thenReturn(createdAtEventOne);
when(eventOne.getTimePoint()).thenReturn(createdAtEventOne);
raceLog.add(eventOne);
TimePoint createdAtEventTwo = new MillisecondsTimePoint(99);
RaceLogEvent eventTwo = mock(RaceLogEvent.class);
- when(eventTwo.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class));
+ when(eventTwo.getAuthor()).thenReturn(mock(AbstractLogEventAuthor.class));
when(eventTwo.getCreatedAt()).thenReturn(createdAtEventTwo);
when(eventTwo.getTimePoint()).thenReturn(createdAtEventTwo);
raceLog.add(eventTwo);
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/AbstractRaceLogTrackingTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/AbstractRaceLogTrackingTest.java
index e3d58550607..06ef7638d55 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/AbstractRaceLogTrackingTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/AbstractRaceLogTrackingTest.java
@@ -2,8 +2,8 @@ package com.sap.sailing.domain.racelog.tracking.analyzing.test;
import org.junit.Before;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventRestoreFactory;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventAuthorImpl;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl;
@@ -13,8 +13,8 @@ import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
public abstract class AbstractRaceLogTrackingTest {
protected RaceLog log;
- protected final RaceLogEventAuthor author = new RaceLogEventAuthorImpl("author0", 0);
- protected final RaceLogEventAuthor author1 = new RaceLogEventAuthorImpl("author1", 1);
+ protected final AbstractLogEventAuthor author = new RaceLogEventAuthorImpl("author0", 0);
+ protected final AbstractLogEventAuthor author1 = new RaceLogEventAuthorImpl("author1", 1);
protected final TimePoint now = MillisecondsTimePoint.now();
protected final RaceLogEventRestoreFactory factory = RaceLogEventRestoreFactory.INSTANCE;
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java
index 8188dbae00d..f47d82b8b7c 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java
@@ -10,8 +10,8 @@ import junit.framework.Assert;
import org.junit.Test;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.tracking.DeviceIdentifier;
import com.sap.sailing.domain.abstractlog.race.tracking.DeviceMapping;
import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DeviceCompetitorMappingFinder;
@@ -40,14 +40,14 @@ public class DeviceMappingFinderTest extends AbstractRaceLogTrackingTest {
return millis == null ? null : new MillisecondsTimePoint(millis);
}
- private Serializable addMapping(RaceLogEventAuthor author, DeviceIdentifier device, Long from, Long to, Competitor item) {
+ private Serializable addMapping(AbstractLogEventAuthor author, DeviceIdentifier device, Long from, Long to, Competitor item) {
RaceLogEvent mapping = factory.createDeviceCompetitorMappingEvent(t(), author, t(), UUID.randomUUID(), device, item, 0,
t(from), t(to));
log.add(mapping);
return mapping.getId();
}
- private void closeMapping(RaceLogEventAuthor author, DeviceIdentifier device, Serializable mappingId, long millis) {
+ private void closeMapping(AbstractLogEventAuthor author, DeviceIdentifier device, Serializable mappingId, long millis) {
RaceLogEvent mapping = factory.createCloseOpenEndedDeviceMappingEvent(t(), author, t(), UUID.randomUUID(), 0, mappingId,
new MillisecondsTimePoint(millis));
log.add(mapping);
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java
index 6e5e6cd9a9a..6344333f059 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/RevokeEventTest.java
@@ -7,14 +7,14 @@ import junit.framework.Assert;
import org.junit.Test;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RevokeEvent;
+import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent;
import com.sap.sse.common.Util;
public class RevokeEventTest extends AbstractRaceLogTrackingTest {
@Test
public void revokedEventIsExcluded() {
RaceLogEvent event = factory.createDeviceCompetitorMappingEvent(now, author, now, UUID.randomUUID(), null, null, 0, null, null);
- RevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author, now.plus(1), UUID.randomUUID(), 0, event.getId(),
+ RaceLogRevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author, now.plus(1), UUID.randomUUID(), 0, event.getId(),
null, null, null);
log.add(event);
@@ -28,7 +28,7 @@ public class RevokeEventTest extends AbstractRaceLogTrackingTest {
@Test
public void eventRevokedByAuthorWithLowerPrioIsNotExcluded() {
RaceLogEvent event = factory.createDeviceCompetitorMappingEvent(now, author, now, UUID.randomUUID(), null, null, 0, null, null);
- RevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author1, now.plus(1), UUID.randomUUID(), 0, event.getId(),
+ RaceLogRevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author1, now.plus(1), UUID.randomUUID(), 0, event.getId(),
null, null, null);
log.add(event);
@@ -42,9 +42,9 @@ public class RevokeEventTest extends AbstractRaceLogTrackingTest {
@Test
public void revokingRevokeEventIsNotHarmful() {
RaceLogEvent event = factory.createDeviceCompetitorMappingEvent(now, author, now, UUID.randomUUID(), null, null, 0, null, null);
- RevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author, now.plus(1), UUID.randomUUID(), 0, event.getId(),
+ RaceLogRevokeEvent revokeEvent = factory.createRevokeEvent(now.plus(1), author, now.plus(1), UUID.randomUUID(), 0, event.getId(),
null, null, null);
- RevokeEvent revokeEvent2 = factory.createRevokeEvent(now.plus(2), author, now.plus(2), UUID.randomUUID(), 2, revokeEvent.getId(),
+ RaceLogRevokeEvent revokeEvent2 = factory.createRevokeEvent(now.plus(2), author, now.plus(2), UUID.randomUUID(), 2, revokeEvent.getId(),
null, null, null);
log.add(event);
diff --git a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF
index 7c5afdea2fd..1368ec0c8b7 100644
--- a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF
+++ b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF
@@ -9,6 +9,7 @@ Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0",
com.sap.sse.datamining.shared;bundle-version="1.0.0",
com.sap.sse.common
Export-Package: com.sap.sailing.domain.abstractlog,
+ com.sap.sailing.domain.abstractlog.impl,
com.sap.sailing.domain.abstractlog.race,
com.sap.sailing.domain.abstractlog.race.analyzing.impl,
com.sap.sailing.domain.abstractlog.race.impl,
@@ -17,6 +18,8 @@ Export-Package: com.sap.sailing.domain.abstractlog,
com.sap.sailing.domain.abstractlog.race.state,
com.sap.sailing.domain.abstractlog.race.state.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure,
+ com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic,
+ com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate,
@@ -28,6 +31,8 @@ Export-Package: com.sap.sailing.domain.abstractlog,
com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl,
com.sap.sailing.domain.abstractlog.race.tracking.events,
com.sap.sailing.domain.abstractlog.race.tracking.impl,
+ com.sap.sailing.domain.abstractlog.regatta,
+ com.sap.sailing.domain.abstractlog.regatta.impl,
com.sap.sailing.domain.base,
com.sap.sailing.domain.base.configuration,
com.sap.sailing.domain.base.configuration.impl,
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java
index a876fd0dafb..7c04f9b3817 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLog.java
@@ -5,10 +5,9 @@ import java.util.HashSet;
import java.util.NavigableSet;
import java.util.UUID;
-import com.sap.sailing.domain.abstractlog.race.RaceLog;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WithID;
+import com.sap.sailing.domain.common.racelog.tracking.NotRevokableException;
import com.sap.sailing.domain.tracking.Track;
/**
@@ -16,114 +15,117 @@ import com.sap.sailing.domain.tracking.Track;
*
*
* Keeps track of the {@link AbstractLogEvent}'s pass and returns only the events of the current pass on
- * {@link RaceLog#getFixes()}. Use {@link RaceLog#getRawFixes()} to receive all events in a {@link RaceLog}.
+ * {@link #getFixes()}. Use {@link #getRawFixes()} to receive all events in a {@link AbstractLog}.
*
*
- *
- * Implementations should use the {@link AbstractLogEventComparator} for sorting its content.
- *
+ * The visitor pattern presents a problem in combination with the generic event type: such events
+ * that
+ *
+ * @param Event visitor type - must be able to visit all events of type {@link EventT}
+ * @param Event type
*/
-public interface AbstractLog extends Track, WithID {
-
- public static final int DefaultPassId = 0;
-
- /**
- * Gets the current pass id.
- *
- * @return the pass id.
- */
- int getCurrentPassId();
+public interface AbstractLog, VisitorT>
+extends Track, WithID {
/**
- * Adds a {@link AbstractLogEvent} to the {@link RaceLog}.
+ * Adds a {@link AbstractLogEvent} to the AbstractLog.
*
* @param event
* {@link AbstractLogEvent} to be added.
* @return true if the element was added, false otherwise.
*/
- boolean add(T event);
+ boolean add(EventT event);
/**
- * Add a {@link RaceLogEventVisitor} as a listener for additions.
+ * Add a {@link VisitorT} as a listener for additions.
*/
- void addListener(RaceLogEventVisitor listener);
+ void addListener(VisitorT listener);
/**
* Remove a listener.
*/
- void removeListener(RaceLogEventVisitor listener);
+ void removeListener(VisitorT listener);
/**
* Removes all listeners
* @return
*/
- HashSet removeAllListeners();
+ HashSet removeAllListeners();
/**
- * Checks if the race log is empty.
+ * Checks if the log is empty.
*/
boolean isEmpty();
- Iterable getRawFixesDescending();
+ Iterable getRawFixesDescending();
- Iterable getFixesDescending();
+ Iterable getFixesDescending();
- void addAllListeners(HashSet listeners);
+ void addAllListeners(HashSet listeners);
- Iterable getAllListeners();
+ Iterable getAllListeners();
/**
- * Adds an event to this race log and returns {@link RaceLog#getEventsToDeliver(UUID)}
+ * Adds an event to this log and returns {@link #getEventsToDeliver(UUID)}
* (excluding the new event)
*/
- Iterable add(T event, UUID clientId);
+ Iterable add(EventT event, UUID clientId);
/**
- * Returns a superset of all race log events that were added to this race log but not yet returned to
+ * Returns a superset of all log events that were added to this log but not yet returned to
* the client with ID clientId by this method. In general, the list returned is not a true
* superset but equals exactly those events not yet delivered to the client. However, if the server
* was re-started since the client last called this method, and since the underlying data structures
- * are not durably stored, the entire set of all race log events would be delivered to the client once.
+ * are not durably stored, the entire set of all log events would be delivered to the client once.
*/
- Iterable getEventsToDeliver(UUID clientId);
+ Iterable getEventsToDeliver(UUID clientId);
/**
* Returns all {@link #getRawFixes() raw fixes} and marks them as delivered to the client identified by clientId
* so that when that ID appears in a subsequent call to {@link #add(AbstractLogEvent, UUID)}, the fixes returned by this call
* are already considered delivered to the client identified by clientId.
*/
- Iterable getRawFixes(UUID clientId);
+ Iterable getRawFixes(UUID clientId);
/**
- * Like {@link #add(AbstractLogEvent)}, only that no events are triggered. Use this method only when loading a race log,
+ * Like {@link #add(AbstractLogEvent)}, only that no events are triggered. Use this method only when loading a log,
* e.g., from a replication or master data import or when loading from the database.
*
* @return true if the event was actually added which is the case if there was no equal event contained
- * in this race log yet
+ * in this log yet
*/
- boolean load(T event);
+ boolean load(EventT event);
/**
* Search for the event by its {@link AbstractLogEvent#getId() id}.
* Caller needs to hold the read lock.
*/
- T getEventById(Serializable id);
+ EventT getEventById(Serializable id);
/**
* Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}. Events are sorted by
* their {@link TimePoint} and the oldest is returned first.
* @return
*/
- NavigableSet getUnrevokedEvents();
+ NavigableSet getUnrevokedEvents();
/**
* Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}.
* @return
*/
- NavigableSet getUnrevokedEventsDescending();
+ NavigableSet getUnrevokedEventsDescending();
/**
- * Merges all events from the other race log into this.
+ * Merges all events from the other log into this.
*/
- void merge(AbstractLog other);
+ void merge(AbstractLog other);
+
+ /**
+ * Inserts a {@link RevokeEvent} for {@code toRevoke}, if latter is revokable, exists in the racelog
+ * and has not yet been revoked.
+ *
+ * @param author The author for the {@code RevokeEvent}.
+ */
+ void revokeEvent(AbstractLogEventAuthor author, EventT toRevoke, String reason) throws NotRevokableException;
+ void revokeEvent(AbstractLogEventAuthor author, EventT toRevoke) throws NotRevokableException;
}
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java
index 18255ceab03..7fc3beb1f4a 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEvent.java
@@ -1,19 +1,14 @@
package com.sap.sailing.domain.abstractlog;
import java.io.Serializable;
-import java.util.List;
-import com.sap.sailing.domain.abstractlog.race.RaceLog;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
-import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Timed;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WithID;
/**
*
- * A {@link AbstractLogEvent} is an entry in a race's log (typically a {@link RaceLog}).
+ * A {@link AbstractLogEvent} is an entry in an AbstractLog.
*
*
*
@@ -47,13 +42,13 @@ import com.sap.sailing.domain.common.WithID;
*
*
*
- * Race log events have an author that has a name and a priority assigned. This can be used to represent multiple
- * concurrent race log authors such as a device used on a starting vessel, another device used at the finish line and
+ * AbstractLog events have an author that has a name and a priority assigned. This can be used to represent multiple
+ * concurrent authors such as a device used on a starting vessel, another device used at the finish line and
* yet another device used on shore. In case more than one device make a statement about something, such as the start
* time or the start procedure, the statement from the device with the highest priority needs to take precedence.
*
*/
-public interface AbstractLogEvent extends Timed, WithID, Serializable {
+public interface AbstractLogEvent extends Timed, WithID, Serializable {
/**
* Gets the {@link TimePoint} this event was created at.
@@ -67,33 +62,15 @@ public interface AbstractLogEvent extends Timed, WithID, Serializable {
*/
TimePoint getLogicalTimePoint();
- /**
- * Gets the event's pass identifier.
- *
- * Each {@link AbstractLogEvent} is associated to a certain pass. A pass is every attempt to start and run a race. A
- * new pass is initiated when a new start time is proposed (e.g. after the race was aborted). There might be certain
- * event type that are not strictly bound to its pass.
- *
- */
- int getPassId();
-
- /**
- * Gets the list of associated {@link Competitor}s.
- *
- * A {@link AbstractLogEvent} might be associated with a list of competitors, which are somehow relevant for this
- * kind of event. An example is a list of competitors who are marked for an individual recall.
- */
- List getInvolvedBoats();
-
/**
* Visitor pattern to implement certain {@link AbstractLogEvent} subclass specific behavior.
*/
- void accept(RaceLogEventVisitor visitor);
+ void accept(VisitorT visitor);
/**
- * Gets the {@link RaceLogEventAuthor} author of this event.
+ * Gets the {@link AbstractLogEventAuthor} author of this event.
*/
- RaceLogEventAuthor getAuthor();
+ AbstractLogEventAuthor getAuthor();
/**
* Gets a short info about the most relevant data of the event.
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventAuthor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEventAuthor.java
old mode 100755
new mode 100644
similarity index 75%
rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventAuthor.java
rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEventAuthor.java
index d59fce19264..0e54f84218b
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventAuthor.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/AbstractLogEventAuthor.java
@@ -1,9 +1,9 @@
-package com.sap.sailing.domain.abstractlog.race;
+package com.sap.sailing.domain.abstractlog;
import com.sap.sse.common.Named;
/**
- * Multiple devices may concurrently post to a single {@link RaceLog}. In this case it is important to understand
+ * Multiple devices may concurrently post to a single {@link AbstractLog}. In this case it is important to understand
* who posted what. The "who" is described by instances of this class. In particular, an author has a name and a
* priority which is then used to arbitrate between different posts on the same subject, such as a race's start time
* or transitions from one race phase to another.
@@ -11,7 +11,7 @@ import com.sap.sse.common.Named;
* @author Axel Uhl (d043530)
*
*/
-public interface RaceLogEventAuthor extends Named, Comparable {
+public interface AbstractLogEventAuthor extends Named, Comparable {
public static final int PRIORITY_COMPATIBILITY = 16;
public static final String NAME_COMPATIBILITY = "Compatibility";
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/Revokable.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/Revokable.java
similarity index 82%
rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/Revokable.java
rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/Revokable.java
index 125fe12bb38..77f5c400bf6 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/Revokable.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/Revokable.java
@@ -1,4 +1,7 @@
-package com.sap.sailing.domain.abstractlog.race;
+package com.sap.sailing.domain.abstractlog;
+
+import com.sap.sailing.domain.abstractlog.race.RaceLog;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
/**
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RevokeEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/RevokeEvent.java
similarity index 76%
rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RevokeEvent.java
rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/RevokeEvent.java
index 1e7cef187f9..dacb6a23f96 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RevokeEvent.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/RevokeEvent.java
@@ -1,7 +1,9 @@
-package com.sap.sailing.domain.abstractlog.race;
+package com.sap.sailing.domain.abstractlog;
import java.io.Serializable;
+import com.sap.sailing.domain.abstractlog.race.RaceLog;
+
/**
* Revokes the event referenced by {@link #getRevokedEventId()}.
* A {@link RevokeEvent} cannot itself be revoked. Instead, e.g. the original event should be resubmitted.
@@ -9,7 +11,7 @@ import java.io.Serializable;
* @see Revokable
*
*/
-public interface RevokeEvent extends RaceLogEvent {
+public interface RevokeEvent extends AbstractLogEvent {
Serializable getRevokedEventId();
/**
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventComparator.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventComparator.java
new file mode 100644
index 00000000000..c08bf09c3ac
--- /dev/null
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventComparator.java
@@ -0,0 +1,51 @@
+package com.sap.sailing.domain.abstractlog.impl;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
+import com.sap.sailing.domain.base.Timed;
+import com.sap.sailing.domain.tracking.impl.TimedComparator;
+
+/**
+ * Comparator sorting by pass, then by {@link AbstractLogEventAuthor}, then by {@link RaceLogEvent#getCreatedAt()}
+ * timestamp.
+ *
+ * If one of the passed objects is not a {@link RaceLogEvent}, sorting is done by {@link Timed#getTimePoint()}.
+ */
+public class AbstractLogEventComparator implements Comparator, Serializable {
+ private static final long serialVersionUID = -1337219742246147546L;
+ private Comparator timedComparator;
+
+ public AbstractLogEventComparator() {
+ this.timedComparator = TimedComparator.INSTANCE;
+ }
+
+ @Override
+ public int compare(Timed o1, Timed o2) {
+ if (o1 instanceof RaceLogEvent && o2 instanceof RaceLogEvent) {
+ return compareEvents((RaceLogEvent) o1, (RaceLogEvent) o2);
+ }
+
+ // fallback to timed comparison
+ return timedComparator.compare(o1, o2);
+ }
+
+ protected int compareEvents(RaceLogEvent e1, RaceLogEvent e2) {
+ //compare author priorities
+ int result = e1.getAuthor().compareTo(e2.getAuthor());
+ if (result != 0) return result;
+
+ //compare created at timepoints
+ result = e1.getCreatedAt().compareTo(e2.getCreatedAt());
+ if (result != 0) return result;
+
+ //compare logical timepoints
+ result = e1.getLogicalTimePoint().compareTo(e2.getLogicalTimePoint());
+ if (result != 0) return result;
+
+ //compare ids
+ return e1.getId().toString().compareTo(e2.getId().toString());
+ }
+}
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventImpl.java
index 8803e5d1a59..c3be178f6bd 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogEventImpl.java
@@ -1,32 +1,26 @@
package com.sap.sailing.domain.abstractlog.impl;
import java.io.Serializable;
-import java.util.List;
import com.sap.sailing.domain.abstractlog.AbstractLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventAuthor;
-import com.sap.sailing.domain.base.Competitor;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.common.TimePoint;
-public abstract class AbstractLogEventImpl implements AbstractLogEvent {
+public abstract class AbstractLogEventImpl implements AbstractLogEvent {
private static final long serialVersionUID = -5810258278984777732L;
private final TimePoint createdAt;
private final TimePoint logicalTimePoint;
private final Serializable id;
- private final List involvedBoats;
- private final int passId;
- private final RaceLogEventAuthor author;
+ private final AbstractLogEventAuthor author;
- public AbstractLogEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint,
- Serializable pId, List pInvolvedBoats, int pPassId) {
+ public AbstractLogEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
+ Serializable pId) {
this.createdAt = createdAt;
this.author = author;
this.logicalTimePoint = logicalTimePoint;
this.id = pId;
- this.involvedBoats = pInvolvedBoats;
- this.passId = pPassId;
}
@Override
@@ -51,27 +45,16 @@ public abstract class AbstractLogEventImpl implements AbstractLogEvent {
public Serializable getId() {
return id;
}
-
- @Override
- public List getInvolvedBoats() {
- return involvedBoats;
- }
-
- @Override
- public int getPassId() {
- return passId;
- }
@Override
- public RaceLogEventAuthor getAuthor() {
+ public AbstractLogEventAuthor getAuthor() {
return author;
}
@Override
public String toString() {
return getClass().getName() + ": createdAt: " + getCreatedAt() + ", logicalTimePoint: " + getLogicalTimePoint()
- + ", id: " + getId() + ", involvedBoats: " + getInvolvedBoats() + ", passId: " + getPassId() +
- ", author: "+ getAuthor();
+ + ", id: " + getId() + ", author: "+ getAuthor();
}
@Override
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java
index 31f107a3a7c..877900dc5b5 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/impl/AbstractLogImpl.java
@@ -3,6 +3,7 @@ package com.sap.sailing.domain.abstractlog.impl;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -16,10 +17,10 @@ import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.AbstractLog;
import com.sap.sailing.domain.abstractlog.AbstractLogEvent;
+import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
+import com.sap.sailing.domain.abstractlog.Revokable;
+import com.sap.sailing.domain.abstractlog.RevokeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
-import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
-import com.sap.sailing.domain.abstractlog.race.Revokable;
-import com.sap.sailing.domain.abstractlog.race.RevokeEvent;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventComparator;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogImpl;
import com.sap.sailing.domain.base.Timed;
@@ -43,7 +44,8 @@ import com.sap.sailing.util.impl.ArrayListNavigableSet;
*
*
*/
-public class AbstractLogImpl extends TrackImpl implements AbstractLog {
+public abstract class AbstractLogImpl, VisitorT>
+extends TrackImpl implements AbstractLog {
private static final long serialVersionUID = -176745401321893502L;
private static final String DefaultLockName = AbstractLogImpl.class.getName() + ".lock";
private final static Logger logger = Logger.getLogger(AbstractLogImpl.class.getName());
@@ -52,19 +54,18 @@ public class AbstractLogImpl extends TrackImpl im
/**
* Clients can use the {@link #add(RaceLogEvent, UUID)} method
*/
- private transient Map> eventsDeliveredToClient = new HashMap>();
+ private transient Map> eventsDeliveredToClient = new HashMap>();
- private Map eventsById = new HashMap();
+ private Map eventsById = new HashMap();
private final Serializable id;
- private transient Set listeners;
- private int currentPassId;
+ private transient Set listeners;
/**
* Initializes a new {@link RaceLogImpl} with the default lock name.
*/
- public AbstractLogImpl(Serializable identifier) {
- this(DefaultLockName, identifier);
+ public AbstractLogImpl(Serializable identifier, Comparator comparator) {
+ this(DefaultLockName, identifier, comparator);
}
/**
@@ -73,11 +74,10 @@ public class AbstractLogImpl extends TrackImpl im
* @param nameForReadWriteLock
* name of lock.
*/
- public AbstractLogImpl(String nameForReadWriteLock, Serializable identifier) {
- super(new ArrayListNavigableSet(RaceLogEventComparator.INSTANCE), nameForReadWriteLock);
+ public AbstractLogImpl(String nameForReadWriteLock, Serializable identifier, Comparator comparator) {
+ super(new ArrayListNavigableSet(comparator), nameForReadWriteLock);
- this.listeners = new HashSet();
- this.currentPassId = DefaultPassId;
+ this.listeners = new HashSet();
this.id = identifier;
}
@@ -85,27 +85,9 @@ public class AbstractLogImpl extends TrackImpl im
public Serializable getId() {
return this.id;
}
-
- @Override
- public int getCurrentPassId() {
- return currentPassId;
- }
-
- /**
- * Sets a new active pass id. Ignored if new and current are equal.
- *
- * @param newPassId
- * to be set.
- */
- public void setCurrentPassId(int newPassId) {
- if (newPassId != this.currentPassId) {
- logger.finer(String.format("Changing pass id to %d", newPassId));
- this.currentPassId = newPassId;
- }
- }
@Override
- public boolean add(T event) {
+ public boolean add(EventT event) {
boolean isAdded = false;
lockForWrite();
try {
@@ -117,7 +99,6 @@ public class AbstractLogImpl extends TrackImpl im
logger.finer(String.format("%s (%s) was added to log %s.", event, event.getClass().getName(), getId()));
// FIXME with out-of-order delivery would destroy currentPassId; need to check at least the createdAt time
// point
- setCurrentPassId(Math.max(event.getPassId(), this.currentPassId));
revokeIfNecessary(event);
eventsById.put(event.getId(), event);
notifyListenersAboutReceive(event);
@@ -128,7 +109,7 @@ public class AbstractLogImpl extends TrackImpl im
}
@Override
- public boolean load(T event) {
+ public boolean load(EventT event) {
boolean isAdded = false;
lockForWrite();
try {
@@ -138,7 +119,6 @@ public class AbstractLogImpl extends TrackImpl im
}
if (isAdded) {
logger.finer(String.format("%s (%s) was loaded into log.", event, event.getClass().getName()));
- setCurrentPassId(Math.max(event.getPassId(), this.currentPassId));
revokeIfNecessary(event);
eventsById.put(event.getId(), event);
} else {
@@ -148,9 +128,9 @@ public class AbstractLogImpl extends TrackImpl im
return isAdded;
}
- private void revokeIfNecessary(T newEvent) {
+ private void revokeIfNecessary(EventT newEvent) {
if (newEvent instanceof RevokeEvent) {
- RevokeEvent revokeEvent = (RevokeEvent) newEvent;
+ RevokeEvent> revokeEvent = (RevokeEvent>) newEvent;
try {
checkIfSuccessfullyRevokes(revokeEvent);
lockForWrite();
@@ -162,9 +142,9 @@ public class AbstractLogImpl extends TrackImpl im
}
}
- private void checkIfSuccessfullyRevokes(RevokeEvent revokeEvent) throws NotRevokableException {
+ private void checkIfSuccessfullyRevokes(RevokeEvent> revokeEvent) throws NotRevokableException {
lockForRead();
- T revokedEvent = getEventById(revokeEvent.getRevokedEventId());
+ EventT revokedEvent = getEventById(revokeEvent.getRevokedEventId());
unlockAfterRead();
if (revokedEvent == null) {
@@ -186,30 +166,30 @@ public class AbstractLogImpl extends TrackImpl im
}
@Override
- public Iterable add(T event, UUID clientId) {
+ public Iterable add(EventT event, UUID clientId) {
add(event);
return getEventsToDeliver(clientId, event);
}
@Override
- public Iterable getEventsToDeliver(UUID clientId) {
+ public Iterable getEventsToDeliver(UUID clientId) {
return getEventsToDeliver(clientId, null);
}
- protected Iterable getEventsToDeliver(UUID clientId, T suppressedEvent) {
- final LinkedHashSet stillToDeliverToClient;
+ protected Iterable getEventsToDeliver(UUID clientId, EventT suppressedEvent) {
+ final LinkedHashSet stillToDeliverToClient;
lockForRead();
try {
- stillToDeliverToClient = new LinkedHashSet(getInternalRawFixes());
+ stillToDeliverToClient = new LinkedHashSet(getInternalRawFixes());
} finally {
unlockAfterRead();
}
stillToDeliverToClient.remove(suppressedEvent);
- Set deliveredToClient = eventsDeliveredToClient.get(clientId);
+ Set deliveredToClient = eventsDeliveredToClient.get(clientId);
if (deliveredToClient != null) {
stillToDeliverToClient.removeAll(deliveredToClient);
} else {
- deliveredToClient = new HashSet();
+ deliveredToClient = new HashSet();
eventsDeliveredToClient.put(clientId, deliveredToClient);
}
deliveredToClient.addAll(stillToDeliverToClient);
@@ -217,12 +197,12 @@ public class AbstractLogImpl extends TrackImpl im
return stillToDeliverToClient;
}
- protected void notifyListenersAboutReceive(T event) {
- Set workingListeners = new HashSet();
+ protected void notifyListenersAboutReceive(EventT event) {
+ Set workingListeners = new HashSet();
synchronized (listeners) {
workingListeners.addAll(listeners);
}
- for (RaceLogEventVisitor listener : workingListeners) {
+ for (VisitorT listener : workingListeners) {
try {
event.accept(listener);
} catch (Throwable t) {
@@ -239,29 +219,19 @@ public class AbstractLogImpl extends TrackImpl im
}
@Override
- public void addListener(RaceLogEventVisitor listener) {
+ public void addListener(VisitorT listener) {
synchronized (listeners) {
listeners.add(listener);
}
}
@Override
- public void removeListener(RaceLogEventVisitor listener) {
+ public void removeListener(VisitorT listener) {
synchronized (listeners) {
listeners.remove(listener);
}
}
- @Override
- protected NavigableSet getInternalFixes() {
- return new PartialNavigableSetView(super.getInternalFixes()) {
- @Override
- protected boolean isValid(T e) {
- return e.getPassId() == getCurrentPassId();
- }
- };
- }
-
/**
* When deserializing, needs to initialize empty set of listeners. Furthermore, as a migration effort, when the
* {@link #eventsById} field was introduced, old clients get null as its value when deserializing which
@@ -270,13 +240,13 @@ public class AbstractLogImpl extends TrackImpl im
*/
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
ois.defaultReadObject();
- listeners = new HashSet();
- eventsDeliveredToClient = new HashMap>();
+ listeners = new HashSet();
+ eventsDeliveredToClient = new HashMap>();
if (eventsById == null) {
- eventsById = new HashMap();
+ eventsById = new HashMap();
lockForRead();
try {
- for (T event : getRawFixes()) {
+ for (EventT event : getRawFixes()) {
eventsById.put(event.getId(), event);
}
} finally {
@@ -287,9 +257,9 @@ public class AbstractLogImpl extends TrackImpl im
revokedEventIds = new HashSet();
lockForRead();
try {
- for (T event : getRawFixes()) {
+ for (EventT event : getRawFixes()) {
if (event instanceof RevokeEvent) {
- revokedEventIds.add(((RevokeEvent)event).getRevokedEventId());
+ revokedEventIds.add(((RevokeEvent>)event).getRevokedEventId());
}
}
} finally {
@@ -299,43 +269,43 @@ public class AbstractLogImpl extends TrackImpl im
}
@Override
- public Iterable getRawFixesDescending() {
+ public Iterable getRawFixesDescending() {
return getRawFixes().descendingSet();
}
@Override
- public Iterable getFixesDescending() {
+ public Iterable getFixesDescending() {
return getFixes().descendingSet();
}
@Override
- public HashSet removeAllListeners() {
+ public HashSet removeAllListeners() {
synchronized (listeners) {
- HashSet clonedListeners = new HashSet(listeners);
- listeners = new HashSet();
+ HashSet clonedListeners = new HashSet(listeners);
+ listeners = new HashSet();
return clonedListeners;
}
}
@Override
- public void addAllListeners(HashSet listeners) {
+ public void addAllListeners(HashSet