restructured revoke event, introduced Revokable interface

This commit is contained in:
Fredrik Teschke committed 2014-03-07 10:26:11 +01:00
1 parent 04eacadb62
commit 8282c77c63
25 files changed
+68 -66

No files matched your search

@@ -124,6 +124,7 @@ import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.impl.CompetitorResultsImpl;
import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl;
import com.sap.sailing.domain.racelog.impl.RaceLogImpl;
@@ -132,7 +133,6 @@ import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
import com.sap.sailing.domain.tracking.Wind;
@@ -78,12 +78,12 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.tracking.Positioned;
import com.sap.sailing.domain.tracking.TrackedRace;
@@ -20,11 +20,11 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor {
@@ -8,7 +8,7 @@ import org.junit.Test;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
public class RevokeEventTest extends AbstractRaceLogTrackingTest {
@Test
@@ -7,7 +7,6 @@ import java.util.UUID;
import com.sap.sailing.domain.common.WithID;
import com.sap.sailing.domain.racelog.impl.RaceLogEventComparator;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.tracking.Track;
/**
@@ -108,18 +107,13 @@ public interface RaceLog extends Track<RaceLogEvent>, WithID {
RaceLogEvent getEventById(Serializable id);
/**
* Search for the event by its {@link RaceLogEvent#getId() id}.
*/
boolean isEventRevokedBy(RevokeEvent revokeEvent);
/**
* Get a {@link NavigableSet} of unrevoked events.
* Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}.
* @return
*/
NavigableSet<RaceLogEvent> getUnrevokedEvents();
/**
* Get a {@link NavigableSet} of unrevoked events.
* Get a {@link NavigableSet} of unrevoked events regardless of the {@code pass}.
* @return
*/
NavigableSet<RaceLogEvent> getUnrevokedEventsDescending();
@@ -17,7 +17,6 @@ import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.tracking.Wind;
@@ -17,7 +17,6 @@ import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.tracking.Wind;
@@ -5,7 +5,6 @@ import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
public interface RaceLogEventVisitor {
@@ -0,0 +1,18 @@
package com.sap.sailing.domain.racelog;
/**
* Any {@link RaceLogEvent} marked as {@code Revokable} can be revoked by an {@link RevokeEvent}.
* This means that if an {@code RevokeEvent} {@code r} is added to the {@code RaceLog}, that
* {@link RevokeEvent#getRevokedEventId() revokes} an already existing event {@code e}, then the
* revoked event {@code e} will subsequently not appear in the event-iterators of the {@code RaceLog}
* ({@link RaceLog#getUnrevokedEvents()}, {@link RaceLog#getUnrevokedEventsDescending()}).
* <p>
* The event {@code r} can only successufully revoke {@code e}, if {@code r}'s priority is higher
* (author prio, timepoint), and if {@code e} is of an event type that implements {@code Revokable}.
* @author Fredrik Teschke
*
*/
public interface Revokable {
}
@@ -0,0 +1,14 @@
package com.sap.sailing.domain.racelog;
import java.io.Serializable;
/**
* Revokes the event referenced by {@link #getRevokedEventId()}.
* A {@link RevokeEvent} cannot itself be revoked. Instead, e.g. the original event should be resubmitted.
* @author Fredrik Teschke
* @see Revokable
*
*/
public interface RevokeEvent extends RaceLogEvent {
Serializable getRevokedEventId();
}
@@ -14,12 +14,12 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
/**
* Base class implementing {@link RaceLogEventVisitor}. Every method is implemented as a no-op.
@@ -14,7 +14,6 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogEventVisitor;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
/**
* Wrapper for a {@link RaceLog} which will ignore all calls trying to add an {@link RaceLogEvent}. All other
@@ -203,11 +202,6 @@ public class NoAddingRaceLogWrapper implements RaceLog {
return innerRaceLog.getFixes(from, fromInclusive, to, toInclusive);
}
@Override
public boolean isEventRevokedBy(RevokeEvent revokeEvent) {
return innerRaceLog.isEventRevokedBy(revokeEvent);
}
@Override
public NavigableSet<RaceLogEvent> getUnrevokedEvents() {
return innerRaceLog.getUnrevokedEvents();
@@ -15,12 +15,12 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
public class RaceLogChangedVisitor implements RaceLogEventVisitor {
@@ -29,13 +29,13 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.events.RegisterCompetitorEventImpl;
import com.sap.sailing.domain.racelog.tracking.events.StartTrackingEventImpl;
import com.sap.sailing.domain.racelog.tracking.events.DenoteForTrackingEventImpl;
@@ -27,12 +27,12 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.events.DenoteForTrackingEventImpl;
import com.sap.sailing.domain.racelog.tracking.events.DeviceCompetitorMappingEventImpl;
@@ -17,7 +17,8 @@ import com.sap.sailing.domain.base.Timed;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogEventVisitor;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.Revokable;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.tracking.Track;
import com.sap.sailing.domain.tracking.impl.PartialNavigableSetView;
import com.sap.sailing.domain.tracking.impl.TrackImpl;
@@ -151,15 +152,22 @@ public class RaceLogImpl extends TrackImpl<RaceLogEvent> implements RaceLog {
if (revokedEvent == null) {
logger.log(Level.FINE, "RevokeEvent added, that refers to non-existent event to be revoked");
return;
}
if (revokedEvent != null && ! (revokedEvent instanceof RevokeEvent) && isEventRevokedBy(revokeEvent)) {
lockForWrite();
revokedEventIds.add(revokeEvent.getRevokedEventId());
unlockAfterWrite();
} else {
logger.log(Level.FINE, "Not revoking event " + revokedEvent);
if (! (revokedEvent instanceof Revokable)) {
logger.log(Level.FINE, "RevokeEvent trying to revoke non-revokable event");
return;
}
if (getInternalRawFixes().comparator().compare(revokeEvent, revokedEvent) <= 0) {
logger.log(Level.FINE, "RevokeEvent does not have sufficient priority");
return;
}
lockForWrite();
revokedEventIds.add(revokeEvent.getRevokedEventId());
unlockAfterWrite();
}
}
@@ -315,14 +323,6 @@ public class RaceLogImpl extends TrackImpl<RaceLogEvent> implements RaceLog {
return eventsById.get(id);
}
@Override
public boolean isEventRevokedBy(RevokeEvent revokeEvent) {
lockForRead();
RaceLogEvent revokedEvent = getEventById(revokeEvent.getRevokedEventId());
unlockAfterRead();
return getInternalRawFixes().comparator().compare(revokeEvent, revokedEvent) > 0;
}
@Override
public NavigableSet<RaceLogEvent> getUnrevokedEvents() {
return new PartialNavigableSetView<RaceLogEvent>(super.getInternalFixes()) {
@@ -3,6 +3,7 @@ package com.sap.sailing.domain.racelog.tracking;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WithID;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.Revokable;
/**
* Event type for mapping {@link DeviceIdentifier devices} to {@code items} ({@link Competitor competitors} or {@link Mark marks}).
@@ -33,7 +34,7 @@ import com.sap.sailing.domain.racelog.RaceLogEvent;
* </ul>
* @author Fredrik Teschke
*/
public interface DeviceMappingEvent<ItemType extends WithID> extends RaceLogEvent {
public interface DeviceMappingEvent<ItemType extends WithID> extends RaceLogEvent, Revokable {
ItemType getMappedTo();
DeviceIdentifier getDevice();
@@ -3,6 +3,7 @@ package com.sap.sailing.domain.racelog.tracking;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.Revokable;
/**
* Register a competitor for that race using the {@link RaceLog} in racelog-tracked races.
@@ -14,6 +15,6 @@ import com.sap.sailing.domain.racelog.RaceLogEvent;
* @author Fredrik Teschke
*
*/
public interface RegisterCompetitorEvent extends RaceLogEvent {
public interface RegisterCompetitorEvent extends RaceLogEvent, Revokable {
Competitor getCompetitor();
}
@@ -1,18 +0,0 @@
package com.sap.sailing.domain.racelog.tracking;
import java.io.Serializable;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
/**
* The event referenced by {@link #getRevokedEventId()} should be revoked, that is to say the {@link RaceLog}
* should ignore it in {@link RaceLog#getUnrevokedEvents()}.
*
* A {@link RevokeEvent} cannot itself be revoked. Instead, e.g. the original event should be resubmitted.
* @author Fredrik Teschke
*
*/
public interface RevokeEvent extends RaceLogEvent {
Serializable getRevokedEventId();
}
@@ -1,6 +1,7 @@
package com.sap.sailing.domain.racelog.tracking;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.Revokable;
import com.sap.sailing.domain.racelog.tracking.events.DeviceCompetitorMappingEventImpl;
/**
@@ -11,5 +12,5 @@ import com.sap.sailing.domain.racelog.tracking.events.DeviceCompetitorMappingEve
* @author Fredrik Teschke
*
*/
public interface StartTrackingEvent extends RaceLogEvent {
public interface StartTrackingEvent extends RaceLogEvent, Revokable {
}
@@ -7,8 +7,8 @@ import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
import com.sap.sailing.domain.racelog.RaceLogEventVisitor;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.impl.RaceLogEventImpl;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
public class RevokeEventImpl extends RaceLogEventImpl implements RevokeEvent {
private static final long serialVersionUID = -30864810737555657L;
@@ -19,12 +19,12 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Serializable {
private static final long serialVersionUID = 4752330236765192592L;
@@ -41,13 +41,13 @@ import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent;
import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceIdentifier;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.domain.racelog.tracking.test.mock.MockServiceFinderFactory;
@@ -20,12 +20,12 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.StartTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DenoteForTrackingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceCompetitorMappingEvent;
import com.sap.sailing.domain.racelog.tracking.DeviceMarkMappingEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.tracking.SmartphoneImeiIdentifier;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.ControlPointJsonSerializer;
@@ -4,7 +4,7 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.tracking.RevokeEvent;
import com.sap.sailing.domain.racelog.RevokeEvent;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class RaceLogRevokeEventSerializer extends BaseRaceLogEventSerializer {