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();
}