diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogListener.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogListener.java index 1b1de045d77..a4e066d2f7a 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogListener.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogListener.java @@ -6,6 +6,7 @@ import com.mongodb.DBObject; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.racelog.RaceColumnIdentifier; +import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.RaceLogListener; import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; @@ -40,4 +41,9 @@ public class MongoRaceLogListener implements RaceLogListener { } + @Override + public void eventReceived(RaceLogEvent event) { + // do nothing, we are interested in the typed events. + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogListener.java index 3eb1af4adef..b890fe78eba 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogListener.java @@ -1,7 +1,25 @@ package com.sap.sailing.domain.racelog; +/** + * Implementors may use this interface to listen for added {@link RaceLogEvent}. + */ public interface RaceLogListener { + + /** + * This method is called for any event that is added to the host. + * @param event + */ + void eventReceived(RaceLogEvent event); + + /** + * This method is called additionally if the event is a {@link RaceLogFlagEvent}. + * @param flagEvent + */ void flagEventReceived(RaceLogFlagEvent flagEvent); + /** + * This method is called additionally if the event is a {@link RaceLogStartTimeEvent}. + * @param startTimeEvent + */ void startTimeEventReceived(RaceLogStartTimeEvent startTimeEvent); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogRaceStatus.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogRaceStatus.java index d53e00a67c4..03a61c4b59e 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogRaceStatus.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/RaceLogRaceStatus.java @@ -5,5 +5,5 @@ package com.sap.sailing.domain.racelog; * */ public enum RaceLogRaceStatus { - UNKNOWN, UNSCHEDULED, SCHEDULED, STARTPHASE, RUNNING, FINISHED + UNKNOWN, UNSCHEDULED, SCHEDULED, STARTPHASE, RUNNING, FINISHING, FINISHED } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java index 411133a55dc..6bb761a5783 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java @@ -43,6 +43,7 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } private void notifyListenersAboutReceive(RaceLogEvent event) { + notifiyListenersAboutReceivedEvent(event); if (event instanceof RaceLogFlagEvent) { notifiyListenersAboutReceivedFlagEvent((RaceLogFlagEvent) event); } else if (event instanceof RaceLogStartTimeEvent) { @@ -50,6 +51,19 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } } + private void notifiyListenersAboutReceivedEvent(RaceLogEvent event) { + synchronized (listeners) { + for (RaceLogListener listener : listeners) { + try { + listener.eventReceived(event); + } catch (Throwable t) { + logger.log(Level.SEVERE, "RaceLogListener " + listener + " threw exception " + t.getMessage()); + logger.throwing(RaceLogImpl.class.getName(), "notifiyListenersAboutReceivedEvent(RaceLogEvent)", t); + } + } + } + } + private void notifiyListenersAboutReceivedStartTimeEvent(RaceLogStartTimeEvent event) { synchronized (listeners) { for (RaceLogListener listener : listeners) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java index 42f1ff5caf5..92350e81669 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OfflineDataManager.java @@ -79,7 +79,7 @@ public class OfflineDataManager extends DataManager { RaceLogRaceStatus.SCHEDULED, new MillisecondsTimePoint(new Date().getTime() + 100000))); log.add(factory.createRaceStatusEvent( - new MillisecondsTimePoint(new Date()), + new MillisecondsTimePoint(new Date().getTime() + 1), 2, RaceLogRaceStatus.RUNNING)); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java index 183457a25af..f4d42ef5765 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRace.java @@ -4,6 +4,7 @@ import com.sap.sailing.domain.common.Named; import com.sap.sailing.domain.common.WithID; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogRaceStatus; +import com.sap.sailing.racecommittee.app.domain.state.ManagedRaceState; public interface ManagedRace extends ManagedRaceIdentifier, Named, WithID { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java index 0fccd447c5c..bcddd62f5d7 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceImpl.java @@ -8,8 +8,9 @@ import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogRaceStatus; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; -import com.sap.sailing.racecommittee.app.domain.ManagedRaceState; import com.sap.sailing.racecommittee.app.domain.RaceGroup; +import com.sap.sailing.racecommittee.app.domain.state.ManagedRaceState; +import com.sap.sailing.racecommittee.app.domain.state.impl.ManagedRaceStateImpl; public class ManagedRaceImpl implements ManagedRace { private static final long serialVersionUID = -4936566684992524001L; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/PassAwareRaceLog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/PassAwareRaceLog.java index a7d9948147b..1c5b191f509 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/PassAwareRaceLog.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/PassAwareRaceLog.java @@ -6,9 +6,11 @@ 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.RaceLogListener; +import com.sap.sailing.domain.racelog.impl.RaceLogEventComparator; import com.sap.sailing.domain.tracking.impl.PartialNavigableSetView; import com.sap.sailing.domain.tracking.impl.TrackImpl; import com.sap.sailing.racecommittee.app.logging.ExLog; +import com.sap.sailing.util.impl.ArrayListNavigableSet; public class PassAwareRaceLog extends TrackImpl implements RaceLog { private static final String TAG = PassAwareRaceLog.class.getName(); @@ -24,7 +26,7 @@ public class PassAwareRaceLog extends TrackImpl implements RaceLog } public PassAwareRaceLog(int currentPassId) { - super(ReadWriteLockName); + super(new ArrayListNavigableSet(RaceLogEventComparator.INSTANCE), ReadWriteLockName); this.currentPassId = currentPassId; } @@ -64,8 +66,11 @@ public class PassAwareRaceLog extends TrackImpl implements RaceLog public boolean add(RaceLogEvent event) { lockForWrite(); try { - setCurrentPassId(Math.max(event.getPassId(), this.currentPassId)); - return getInternalRawFixes().add(event); + if (getInternalRawFixes().add(event)) { + setCurrentPassId(Math.max(event.getPassId(), this.currentPassId)); + return true; + } + return false; } finally { unlockAfterWrite(); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRaceState.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/ManagedRaceState.java similarity index 89% rename from mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRaceState.java rename to mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/ManagedRaceState.java index 2f0a63acecf..9df2c9803e7 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/ManagedRaceState.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/ManagedRaceState.java @@ -1,4 +1,4 @@ -package com.sap.sailing.racecommittee.app.domain; +package com.sap.sailing.racecommittee.app.domain.state; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogRaceStatus; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceStateImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/ManagedRaceStateImpl.java similarity index 91% rename from mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceStateImpl.java rename to mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/ManagedRaceStateImpl.java index c68eafb7053..2558c91b5c4 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/ManagedRaceStateImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/ManagedRaceStateImpl.java @@ -1,10 +1,10 @@ -package com.sap.sailing.racecommittee.app.domain.impl; +package com.sap.sailing.racecommittee.app.domain.state.impl; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; -import com.sap.sailing.racecommittee.app.domain.ManagedRaceState; +import com.sap.sailing.racecommittee.app.domain.state.ManagedRaceState; import com.sap.sailing.racecommittee.app.logging.ExLog; public class ManagedRaceStateImpl implements ManagedRaceState { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListAdapter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListAdapter.java index f596370d1c9..11f8eaf31f5 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListAdapter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListAdapter.java @@ -190,6 +190,7 @@ public class RaceListAdapter extends ArrayAdapter { RaceListDataTypeElement lastFinishedRace = null; int numberOfUnscheduledRaces = 0; + /// TODO: new status FINISHING?!?!?! for (RaceListDataTypeElement dataElement : elementList) { if (dataElement.getRace().getStatus().equals(RaceLogRaceStatus.FINISHED)) { lastFinishedRace = dataElement; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListDataTypeElement.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListDataTypeElement.java index fc68e58f36b..7d7fc108bc1 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListDataTypeElement.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListDataTypeElement.java @@ -85,6 +85,7 @@ public class RaceListDataTypeElement extends RaceListDataType { case STARTPHASE: return String.format(startPhaseTemplate, formatStartTime()); case RUNNING: + case FINISHING: return String.format(runningTemplate, formatStartTime()); case FINISHED: return finishedTemplate;