From 0bd30d0942d880422e360f582ebe9d7e721326a3 Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Fri, 7 Jun 2013 09:10:27 +0200 Subject: [PATCH] Persist the identifier for a racelog - not using racelogidentifier directly because it would mean adding com.sap.sailing.domain as a dependency to shared android - also a racelog identifier is too tightly bound with the notion of a race column and such - a racelog should never know about being coupled with a column or fleet --- .../persistence/impl/DomainObjectFactoryImpl.java | 2 +- .../domain/racelog/test/RaceLogAnalyzerTest.java | 2 +- .../sailing/domain/racelog/test/RaceLogTest.java | 6 +++++- .../com/sap/sailing/domain/racelog/RaceLog.java | 3 ++- .../sailing/domain/racelog/impl/RaceLogImpl.java | 15 ++++++++++++--- .../test/RaceLogAttachOnTrackedRaceTest.java | 4 +++- .../com/sap/sailing/domain/test/RaceLogTest.java | 6 +++--- .../domain/test/mock/MockedTrackedRace.java | 8 +++++++- .../MockedTrackedRaceWithStartTimeAndRanks.java | 9 ++++++++- .../domain/base/impl/AbstractRaceColumn.java | 4 +++- .../domain/racelog/impl/EmptyRaceLogStore.java | 2 +- .../sap/sailing/domain/tracking/TrackedRace.java | 7 ++++++- .../tracking/impl/DynamicTrackedRaceImpl.java | 5 +++-- .../domain/tracking/impl/TrackedRaceImpl.java | 13 ++++++++++--- .../sailing/gwt/ui/test/MockedTrackedRace.java | 8 +++++++- .../racelog/impl/RaceLogDeserializer.java | 5 ++++- .../racelog/impl/RaceLogSerializer.java | 2 ++ 17 files changed, 78 insertions(+), 23 deletions(-) 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 f2770ee8f52..fe20a1b22bb 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 @@ -997,7 +997,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { @Override public RaceLog loadRaceLog(RaceLogIdentifier identifier) { - RaceLog result = new RaceLogImpl(RaceLogImpl.class.getSimpleName()); + RaceLog result = new RaceLogImpl(RaceLogImpl.class.getSimpleName(), identifier.getIdentifier()); try { BasicDBObject query = new BasicDBObject(); query.put(FieldNames.RACE_LOG_IDENTIFIER.name(), MongoUtils.escapeDollarAndDot(identifier.getIdentifier().toString())); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogAnalyzerTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogAnalyzerTest.java index e191a00134d..4aa979513bb 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogAnalyzerTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogAnalyzerTest.java @@ -17,7 +17,7 @@ public class RaceLogAnalyzerTest { @Test public void testLastFlagFinder() { - RaceLog raceLog = new RaceLogImpl("RaceLogTest"); + RaceLog raceLog = new RaceLogImpl("RaceLogTest", "test-identifier"); TimePoint t1 = MillisecondsTimePoint.now(); int passId = 0; boolean isDisplayed = true; 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 dc10560c6ef..0ceea5a6e87 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 @@ -28,7 +28,7 @@ public class RaceLogTest { @Before public void setUp() { - raceLog = new RaceLogImpl("testlock"); + raceLog = new RaceLogImpl("testlock", "test-identifier"); } @Test(expected = IllegalStateException.class) @@ -43,6 +43,10 @@ public class RaceLogTest { raceLog.unlockAfterRead(); } + public void testIdentifier() { + assertEquals("test-identifier", raceLog.getId()); + } + @Test public void testAddEvent() { RaceLogEvent event = mock(RaceLogEvent.class); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLog.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLog.java index b7ef5c08a8e..3a665056e7b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLog.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLog.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.racelog; +import com.sap.sailing.domain.common.WithID; import com.sap.sailing.domain.racelog.impl.RaceLogEventComparator; import com.sap.sailing.domain.tracking.Track; @@ -15,7 +16,7 @@ import com.sap.sailing.domain.tracking.Track; * Implementations should use the {@link RaceLogEventComparator} for sorting its content. *

*/ -public interface RaceLog extends Track { +public interface RaceLog extends Track, WithID { /** * Gets the current pass id. * diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java index e053787f123..59741fdaebf 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogImpl.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.racelog.impl; import java.io.IOException; import java.io.ObjectInputStream; +import java.io.Serializable; import java.util.HashSet; import java.util.NavigableSet; import java.util.Set; @@ -24,6 +25,7 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { private static final String DefaultLockName = RaceLogImpl.class.getName() + ".lock"; private final static Logger logger = Logger.getLogger(RaceLogImpl.class.getName()); + private final Serializable id; private transient Set listeners; private int currentPassId; @@ -32,19 +34,25 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { /** * Initializes a new {@link RaceLogImpl} with the default lock name. */ - public RaceLogImpl() { - this(DefaultLockName); + public RaceLogImpl(Serializable identifier) { + this(DefaultLockName, identifier); } /** * Initializes a new {@link RaceLogImpl}. * @param nameForReadWriteLock name of lock. */ - public RaceLogImpl(String nameForReadWriteLock) { + public RaceLogImpl(String nameForReadWriteLock, Serializable identifier) { super(new ArrayListNavigableSet(RaceLogEventComparator.INSTANCE), nameForReadWriteLock); this.listeners = new HashSet(); this.currentPassId = DefaultPassId; + this.id = identifier; + } + + @Override + public Serializable getId() { + return this.id; } @Override @@ -132,4 +140,5 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { ois.defaultReadObject(); listeners = new HashSet(); } + } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java index 9ab66c4c1c4..f5ebcade7a9 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogAttachOnTrackedRaceTest.java @@ -4,6 +4,8 @@ import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; +import java.io.Serializable; + import org.junit.Before; import org.junit.Test; @@ -27,7 +29,7 @@ public class RaceLogAttachOnTrackedRaceTest { private RaceLog raceLog; @Override - public void detachRaceLog() { + public void detachRaceLog(Serializable identifier) { this.raceLog = null; } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogTest.java index 9d349713dff..575f28d9510 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceLogTest.java @@ -29,7 +29,7 @@ public class RaceLogTest { public void testAddingTwoEventsOfDifferentPassesButSameTimestamps() { TimePoint t1 = MillisecondsTimePoint.now(); int passId = 0; - RaceLog raceLog = new RaceLogImpl("RaceLogTest"); + RaceLog raceLog = new RaceLogImpl("RaceLogTest", "test-identifier"); RaceLogFlagEvent rcEvent1 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, UUID.randomUUID(), new ArrayList(), passId, Flags.CLASS, Flags.NONE, false); RaceLogFlagEvent rcEvent2 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, UUID.randomUUID(), new ArrayList(), ++passId, Flags.CLASS, Flags.NONE, false); @@ -48,7 +48,7 @@ public class RaceLogTest { @Test public void testAddOfEvent() { - RaceLog rcEventTrack = new RaceLogImpl("RaceLogTest"); + RaceLog rcEventTrack = new RaceLogImpl("RaceLogTest", "test-identifier"); TimePoint t1 = MillisecondsTimePoint.now(); int passId = 0; boolean isDisplayed = true; @@ -75,7 +75,7 @@ public class RaceLogTest { @Test public void testTrackAPIForEventLogUsage() { - RaceLog rcEventTrack = new RaceLogImpl("RaceLog"); + RaceLog rcEventTrack = new RaceLogImpl("RaceLog", "test-identifier"); List expectedOrderingList = new ArrayList(); TimePoint t1 = MillisecondsTimePoint.now(); TimePoint t2 = new MillisecondsTimePoint(t1.asMillis() - 1000); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index e4e4f97cb06..f241bbfa778 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -741,7 +741,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public void detachRaceLog() { + public void detachRaceLog(Serializable identifier) { // TODO Auto-generated method stub } @@ -781,4 +781,10 @@ public class MockedTrackedRace implements DynamicTrackedRace { // TODO Auto-generated method stub return null; } + + @Override + public void detachAllRaceLogs() { + // TODO Auto-generated method stub + + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index b78fc8f0836..e31b38f9e8b 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.test.mock; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -477,7 +478,7 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { } @Override - public void detachRaceLog() { + public void detachRaceLog(Serializable identifier) { // TODO Auto-generated method stub } @@ -512,4 +513,10 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { return null; } + @Override + public void detachAllRaceLogs() { + // TODO Auto-generated method stub + + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index a625bd8469a..22db0f1f126 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -16,6 +16,7 @@ import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogIdentifierTemplate; import com.sap.sailing.domain.racelog.RaceLogInformation; import com.sap.sailing.domain.racelog.RaceLogStore; +import com.sap.sailing.domain.racelog.impl.RaceLogIdentifierImpl; import com.sap.sailing.domain.tracking.TrackedRace; public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implements RaceColumn { @@ -75,7 +76,8 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } } if (previouslyLinkedRace != null) { - previouslyLinkedRace.detachRaceLog(); + RaceLogIdentifierImpl identifier = new RaceLogIdentifierImpl(raceLogsIdentifierTemplate, getName(), fleet); + previouslyLinkedRace.detachRaceLog(identifier); getRaceColumnListeners().notifyListenersAboutTrackedRaceUnlinked(this, fleet, previouslyLinkedRace); } if (trackedRace != null) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/EmptyRaceLogStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/EmptyRaceLogStore.java index d33063ce501..7398cdede58 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/EmptyRaceLogStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/EmptyRaceLogStore.java @@ -12,6 +12,6 @@ public enum EmptyRaceLogStore implements RaceLogStore { @Override public RaceLog getRaceLog(RaceLogIdentifier identifier) { - return new RaceLogImpl(UUID.randomUUID().toString()); + return new RaceLogImpl(UUID.randomUUID().toString(), identifier.getIdentifier()); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 902fff19980..126986f75c4 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -482,7 +482,12 @@ public interface TrackedRace extends Serializable { /** * Detaches the race log associated with this {@link TrackedRace}. */ - void detachRaceLog(); + void detachRaceLog(Serializable identifier); + + /** + * Detaches all {@link RaceLog} instances from this race + */ + void detachAllRaceLogs(); /** * Attaches the passed race log with this {@link TrackedRace}. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index bd81bb318d9..a104dbbdf1e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.tracking.impl; import java.io.IOException; import java.io.ObjectInputStream; +import java.io.Serializable; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.HashMap; @@ -669,11 +670,11 @@ DynamicTrackedRace, GPSTrackListener { } @Override - public void detachRaceLog() { + public void detachRaceLog(Serializable identifier) { if (attachedRaceLog != null) { logListener.removeFrom(attachedRaceLog); } - super.detachRaceLog(); + super.detachRaceLog(identifier); } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 52968890c3a..7b92eca563a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -3,6 +3,7 @@ package com.sap.sailing.domain.tracking.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.ConcurrentModificationException; @@ -221,6 +222,7 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { private transient CombinedWindTrackImpl combinedWindTrack; protected transient RaceLog attachedRaceLog; + protected transient HashMap attachedRaceLogs; /** * The time delay to the current point in time in milliseconds. @@ -2331,12 +2333,17 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { @Override public void attachRaceLog(RaceLog raceLog) { - this.attachedRaceLog = raceLog; + this.attachedRaceLogs.put(raceLog.getId(), raceLog); } @Override - public void detachRaceLog() { - this.attachedRaceLog = null; + public void detachRaceLog(Serializable identifier) { + this.attachedRaceLogs.remove(identifier); + } + + @Override + public void detachAllRaceLogs() { + this.attachedRaceLogs.clear(); } @Override diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 61277d5eced..1f6aa88dad6 100644 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -742,7 +742,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public void detachRaceLog() { + public void detachRaceLog(Serializable identifier) { // TODO Auto-generated method stub } @@ -783,4 +783,10 @@ public class MockedTrackedRace implements DynamicTrackedRace { return null; } + @Override + public void detachAllRaceLogs() { + // TODO Auto-generated method stub + + } + } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeserializer.java index ee6749d2b5f..84cb5c83007 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDeserializer.java @@ -1,5 +1,7 @@ package com.sap.sailing.server.gateway.deserialization.racelog.impl; +import java.io.Serializable; + import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -20,7 +22,8 @@ public class RaceLogDeserializer implements JsonDeserializer { } public RaceLog deserialize(JSONObject object) throws JsonDeserializationException { - RaceLog result = new RaceLogImpl(); + Serializable id = (String)object.get(RaceLogSerializer.FIELD_RACELOG_IDENTIFIER); + RaceLog result = new RaceLogImpl(id); if (object.get(RaceLogSerializer.FIELD_EVENTS) == null) { return result; diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogSerializer.java index d5fa82eb366..e37cde27517 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogSerializer.java @@ -10,6 +10,7 @@ import com.sap.sailing.server.gateway.serialization.JsonSerializer; public class RaceLogSerializer implements JsonSerializer { public static final String FIELD_EVENTS = "events"; + public static final String FIELD_RACELOG_IDENTIFIER = "racelog_id"; private final JsonSerializer itemSerializer; @@ -27,6 +28,7 @@ public class RaceLogSerializer implements JsonSerializer { events.add(itemSerializer.serialize(event)); } result.put(FIELD_EVENTS, events); + result.put(FIELD_RACELOG_IDENTIFIER, object.getId()); } finally { object.unlockAfterRead(); }