From dc8dc67196e271dc13613335cc698eb354befe74 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 9 Jul 2013 16:52:42 +0200 Subject: [PATCH 001/450] prepared OT framework for use by RaceLog --- .../OperationWithTransformationSupport.java | 23 +++++++++++++++++++ .../OperationalTransformer.java | 13 +++++++++++ .../operationaltransformation/package.html | 5 ++++ .../test/OperationalTransformationTest.java | 4 ++-- .../server/test/RaceLogInRaceColumnTest.java | 4 ++-- .../server/RacingEventServiceOperation.java | 23 ++----------------- .../AbstractMediaTrackOperation.java | 0 .../AddCourseArea.java | 0 .../AddMediaTrackOperation.java | 0 .../CreateEvent.java | 0 .../ImportMasterDataOperation.java | 0 .../OperationalTransformer.java | 17 -------------- .../RecordRaceLogEventOnLeaderboard.java | 0 .../RecordRaceLogEventOnRegatta.java | 0 .../RemoveEvent.java | 0 .../RemoveMediaTrackOperation.java | 0 .../RenameEvent.java | 0 .../UpdateEvent.java | 0 .../UpdateMediaTrackDurationOperation.java | 0 .../UpdateMediaTrackStartTimeOperation.java | 0 .../UpdateMediaTrackTitleOperation.java | 0 .../UpdateMediaTrackUrlOperation.java | 0 .../UpdateRaceDelayToLive.java | 0 .../UpdateSpecificRegatta.java | 0 24 files changed, 47 insertions(+), 42 deletions(-) create mode 100755 java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationWithTransformationSupport.java create mode 100755 java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationalTransformer.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractMediaTrackOperation.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddCourseArea.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddMediaTrackOperation.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateEvent.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java delete mode 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/OperationalTransformer.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RecordRaceLogEventOnLeaderboard.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RecordRaceLogEventOnRegatta.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveEvent.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveMediaTrackOperation.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RenameEvent.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateEvent.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackDurationOperation.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackStartTimeOperation.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackTitleOperation.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackUrlOperation.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateRaceDelayToLive.java mode change 100644 => 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateSpecificRegatta.java diff --git a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationWithTransformationSupport.java b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationWithTransformationSupport.java new file mode 100755 index 00000000000..44dfd0c74cc --- /dev/null +++ b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationWithTransformationSupport.java @@ -0,0 +1,23 @@ +package com.sap.sailing.operationaltransformation; + + + +public interface OperationWithTransformationSupport> extends Operation { + /** + * Implements the specific transformation rule for the implementing subclass for the set of possible peer operations + * along which to transform this operation, assuming this is the client operation. See + * {@link Transformer#transform(Operation, Operation)} for the specification. + * + * @return the result of transforming this operation along serverOp + */ + O transformClientOp(O serverOp); + + /** + * Implements the specific transformation rule for the implementing subclass for the set of possible peer operations + * along which to transform this operation, assuming this is the server operation. See + * {@link Transformer#transform(Operation, Operation)} for the specification. + * + * @return the result of transforming this operation along clientOp + */ + O transformServerOp(O clientOp); +} diff --git a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationalTransformer.java b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationalTransformer.java new file mode 100755 index 00000000000..0e4b972eceb --- /dev/null +++ b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationalTransformer.java @@ -0,0 +1,13 @@ +package com.sap.sailing.operationaltransformation; + + +public class OperationalTransformer> implements Transformer { + + @Override + public ClientServerOperationPair transform(O clientOp, O serverOp) { + ClientServerOperationPair result = new ClientServerOperationPair( + clientOp.transformClientOp(serverOp), serverOp.transformServerOp(clientOp)); + return result; + } + +} diff --git a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/package.html b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/package.html index 7a089eb0cd7..50c2d041290 100755 --- a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/package.html +++ b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/package.html @@ -55,4 +55,9 @@ obtain the current state of a peer using the {@link com.sap.runlet.operationaltr operation.

+Consider using {@link com.sap.sailing.operationaltransformation.OperationalTransformer} as the basis for your transformation +logic. It generically works with {@link com.sap.sailing.operationaltransformation.OperationWithTransformationSupport} if you +can afford to have your operation classes implement the transformation logic. The benefit of doing so is that adding more +operations requires you to consider the transformation logic. + \ No newline at end of file diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java index ad436cd4ec6..c5867934015 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java @@ -15,6 +15,7 @@ import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.mongodb.MongoDBService; +import com.sap.sailing.operationaltransformation.OperationalTransformer; import com.sap.sailing.operationaltransformation.Peer; import com.sap.sailing.operationaltransformation.Peer.Role; import com.sap.sailing.operationaltransformation.PeerImpl; @@ -24,7 +25,6 @@ import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.operationaltransformation.AddColumnToLeaderboard; import com.sap.sailing.server.operationaltransformation.CreateFlexibleLeaderboard; import com.sap.sailing.server.operationaltransformation.MoveLeaderboardColumnUp; -import com.sap.sailing.server.operationaltransformation.OperationalTransformer; import com.sap.sailing.server.operationaltransformation.RemoveLeaderboard; public class OperationalTransformationTest { @@ -41,7 +41,7 @@ public class OperationalTransformationTest { MongoDBService.INSTANCE.getDB().dropDatabase(); racingEventServiceServer = new RacingEventServiceImpl(); racingEventServiceReplica = new RacingEventServiceImpl(); - OperationalTransformer transformer = new OperationalTransformer(); + OperationalTransformer> transformer = new OperationalTransformer<>(); server = new PeerImpl<>(transformer, racingEventServiceServer, Role.SERVER); replica = new PeerImpl<>(transformer, racingEventServiceReplica, Role.CLIENT); // wire the peers: diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java index 3525408ee0e..c0dc9b37d11 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java @@ -17,6 +17,7 @@ import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.mongodb.MongoDBService; +import com.sap.sailing.operationaltransformation.OperationalTransformer; import com.sap.sailing.operationaltransformation.Peer; import com.sap.sailing.operationaltransformation.Peer.Role; import com.sap.sailing.operationaltransformation.PeerImpl; @@ -25,7 +26,6 @@ import com.sap.sailing.server.RacingEventServiceOperation; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.operationaltransformation.AddColumnToLeaderboard; import com.sap.sailing.server.operationaltransformation.CreateFlexibleLeaderboard; -import com.sap.sailing.server.operationaltransformation.OperationalTransformer; public class RaceLogInRaceColumnTest { @@ -39,7 +39,7 @@ public class RaceLogInRaceColumnTest { public void setUp() { MongoDBService.INSTANCE.getDB().dropDatabase(); racingEventServiceServer = new RacingEventServiceImpl(); - OperationalTransformer transformer = new OperationalTransformer(); + OperationalTransformer> transformer = new OperationalTransformer<>(); server = new PeerImpl<>(transformer, racingEventServiceServer, Role.SERVER); } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventServiceOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventServiceOperation.java index d6c4fd272dc..84ded6fd4be 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventServiceOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventServiceOperation.java @@ -2,8 +2,7 @@ package com.sap.sailing.server; import java.io.Serializable; -import com.sap.sailing.operationaltransformation.Operation; -import com.sap.sailing.operationaltransformation.Transformer; +import com.sap.sailing.operationaltransformation.OperationWithTransformationSupport; import com.sap.sailing.server.operationaltransformation.AddColumnToLeaderboard; import com.sap.sailing.server.operationaltransformation.CreateFlexibleLeaderboard; import com.sap.sailing.server.operationaltransformation.CreateRegattaLeaderboard; @@ -13,7 +12,7 @@ import com.sap.sailing.server.operationaltransformation.RemoveLeaderboard; import com.sap.sailing.server.operationaltransformation.RemoveLeaderboardColumn; import com.sap.sailing.server.operationaltransformation.RenameLeaderboardColumn; -public interface RacingEventServiceOperation extends Operation, Serializable { +public interface RacingEventServiceOperation extends OperationWithTransformationSupport>, Serializable { /** * Performs the actual operation, applying it to the toState service. The operation's result is * returned. @@ -25,24 +24,6 @@ public interface RacingEventServiceOperation extends Operationthis operation along serverOp - */ - RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp); - - /** - * Implements the specific transformation rule for the implementing subclass for the set of possible peer operations - * along which to transform this operation, assuming this is the server operation. See - * {@link Transformer#transform(Operation, Operation)} for the specification. - * - * @return the result of transforming this operation along clientOp - */ - RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp); - /** * Assumes this is the "server" operation and transforms the client's removeColumnFromLeaderboardClientOp according to this * operation. The default implementation will probably pass on the untransformed client operation. However, if this diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractMediaTrackOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractMediaTrackOperation.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddCourseArea.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddCourseArea.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddMediaTrackOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddMediaTrackOperation.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateEvent.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateEvent.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/OperationalTransformer.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/OperationalTransformer.java deleted file mode 100755 index 9fbc518c362..00000000000 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/OperationalTransformer.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sap.sailing.server.operationaltransformation; - -import com.sap.sailing.operationaltransformation.ClientServerOperationPair; -import com.sap.sailing.operationaltransformation.Transformer; -import com.sap.sailing.server.RacingEventServiceOperation; - -public class OperationalTransformer implements Transformer> { - - @Override - public ClientServerOperationPair> transform(RacingEventServiceOperation clientOp, - RacingEventServiceOperation serverOp) { - ClientServerOperationPair> result = new ClientServerOperationPair>( - clientOp.transformClientOp(serverOp), serverOp.transformServerOp(clientOp)); - return result; - } - -} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RecordRaceLogEventOnLeaderboard.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RecordRaceLogEventOnLeaderboard.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RecordRaceLogEventOnRegatta.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RecordRaceLogEventOnRegatta.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveEvent.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveEvent.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveMediaTrackOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveMediaTrackOperation.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RenameEvent.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RenameEvent.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateEvent.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateEvent.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackDurationOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackDurationOperation.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackStartTimeOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackStartTimeOperation.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackTitleOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackTitleOperation.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackUrlOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMediaTrackUrlOperation.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateRaceDelayToLive.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateRaceDelayToLive.java old mode 100644 new mode 100755 diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateSpecificRegatta.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateSpecificRegatta.java old mode 100644 new mode 100755 From fef73b7a9a0ecdb0ce96066c5f0a19aeafea8636 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 9 Jul 2013 17:52:59 +0200 Subject: [PATCH 002/450] first test frame for OT support for RaceLog --- .../RaceLogOperationalTransformationTest.java | 64 +++++++++++++++++++ ...RaceLogEventWithTransformationSupport.java | 33 ++++++++++ ...artTimeEventWithTransformationSupport.java | 9 +++ 3 files changed, 106 insertions(+) create mode 100755 java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java create mode 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java create mode 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java new file mode 100755 index 00000000000..4fb4adb8781 --- /dev/null +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java @@ -0,0 +1,64 @@ +package com.sap.sailing.server.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; +import java.util.Collections; +import java.util.GregorianCalendar; +import java.util.UUID; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; +import com.sap.sailing.domain.common.impl.Util; +import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; +import com.sap.sailing.domain.racelog.impl.RaceLogImpl; +import com.sap.sailing.domain.racelog.impl.RaceLogStartTimeEventImpl; +import com.sap.sailing.operationaltransformation.OperationalTransformer; +import com.sap.sailing.operationaltransformation.Peer; +import com.sap.sailing.operationaltransformation.Peer.Role; +import com.sap.sailing.operationaltransformation.PeerImpl; +import com.sap.sailing.server.operationaltransformation.racelog.RaceLogEventWithTransformationSupport; +import com.sap.sailing.server.operationaltransformation.racelog.RaceLogStartTimeEventWithTransformationSupport; + +public class RaceLogOperationalTransformationTest { + private RaceLog raceLogClient1; + private RaceLog raceLogClient2; + private RaceLog raceLogServer; + private Peer, RaceLog> client1; + private Peer, RaceLog> client2; + private Peer, RaceLog> server; + private OperationalTransformer> transformer; + + @Before + public void setUp() { + raceLogClient1 = new RaceLogImpl("Test Race Log Client1"); + raceLogClient2 = new RaceLogImpl("Test Race Log Client2"); + raceLogServer = new RaceLogImpl("Test Race Log Server"); + transformer = new OperationalTransformer<>(); + client1 = new PeerImpl<>(transformer, raceLogClient1, Role.CLIENT); + client2 = new PeerImpl<>(transformer, raceLogClient2, Role.CLIENT); + server = new PeerImpl<>(transformer, raceLogServer, Role.SERVER); + server.addPeer(client1); + server.addPeer(client2); + } + + @Test + public void testSimpleApply() { + Calendar c = new GregorianCalendar(2013, 6, 7, 13, 59, 33); + final MillisecondsTimePoint startTime = new MillisecondsTimePoint(c.getTime()); + RaceLogStartTimeEvent startTimeEvent = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), startTime, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTime); + RaceLogStartTimeEventWithTransformationSupport e = new RaceLogStartTimeEventWithTransformationSupport(startTimeEvent); + server.apply(e); + server.waitForNotRunning(); + client1.waitForNotRunning(); + client2.waitForNotRunning(); + assertEquals(1, Util.size(raceLogClient1.getRawFixes())); + assertEquals(1, Util.size(raceLogClient2.getRawFixes())); + assertEquals(raceLogServer.getRawFixes().iterator().next(), raceLogClient1.getRawFixes().iterator().next()); + assertEquals(raceLogServer.getRawFixes().iterator().next(), raceLogClient2.getRawFixes().iterator().next()); + } +} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java new file mode 100755 index 00000000000..114ea78f7d5 --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java @@ -0,0 +1,33 @@ +package com.sap.sailing.server.operationaltransformation.racelog; + +import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.operationaltransformation.OperationWithTransformationSupport; + +public abstract class RaceLogEventWithTransformationSupport implements OperationWithTransformationSupport> { + private final E raceLogEvent; + + public RaceLogEventWithTransformationSupport(E raceLogEvent) { + super(); + this.raceLogEvent = raceLogEvent; + } + + @Override + public RaceLog applyTo(RaceLog toState) { + toState.add(raceLogEvent); + return toState; + } + + @Override + public RaceLogEventWithTransformationSupport transformClientOp(RaceLogEventWithTransformationSupport serverOp) { + // TODO Auto-generated method stub + return null; + } + + @Override + public RaceLogEventWithTransformationSupport transformServerOp(RaceLogEventWithTransformationSupport clientOp) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java new file mode 100755 index 00000000000..f41ef3fefc4 --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java @@ -0,0 +1,9 @@ +package com.sap.sailing.server.operationaltransformation.racelog; + +import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; + +public class RaceLogStartTimeEventWithTransformationSupport extends RaceLogEventWithTransformationSupport{ + public RaceLogStartTimeEventWithTransformationSupport(RaceLogStartTimeEvent raceLogEvent) { + super(raceLogEvent); + } +} From 0d8120c929f606efd361895c15a805ab796e14d7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 10 Jul 2013 09:15:01 +0200 Subject: [PATCH 003/450] first successful trivial OT test for RaceLog synchronization --- .../RaceLogOperationalTransformationTest.java | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java index 4fb4adb8781..dcaa9dcbc77 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java @@ -43,7 +43,9 @@ public class RaceLogOperationalTransformationTest { client2 = new PeerImpl<>(transformer, raceLogClient2, Role.CLIENT); server = new PeerImpl<>(transformer, raceLogServer, Role.SERVER); server.addPeer(client1); + client1.addPeer(server); server.addPeer(client2); + client2.addPeer(server); } @Test @@ -56,9 +58,33 @@ public class RaceLogOperationalTransformationTest { server.waitForNotRunning(); client1.waitForNotRunning(); client2.waitForNotRunning(); - assertEquals(1, Util.size(raceLogClient1.getRawFixes())); - assertEquals(1, Util.size(raceLogClient2.getRawFixes())); - assertEquals(raceLogServer.getRawFixes().iterator().next(), raceLogClient1.getRawFixes().iterator().next()); - assertEquals(raceLogServer.getRawFixes().iterator().next(), raceLogClient2.getRawFixes().iterator().next()); + raceLogClient1.lockForRead(); + try { + assertEquals(1, Util.size(raceLogClient1.getRawFixes())); + } finally { + raceLogClient1.unlockAfterRead(); + } + raceLogClient2.lockForRead(); + try { + assertEquals(1, Util.size(raceLogClient2.getRawFixes())); + } finally { + raceLogClient2.unlockAfterRead(); + } + raceLogServer.lockForRead(); + raceLogClient1.lockForRead(); + try { + assertEquals(raceLogServer.getRawFixes().iterator().next(), raceLogClient1.getRawFixes().iterator().next()); + } finally { + raceLogClient1.unlockAfterRead(); + raceLogServer.unlockAfterRead(); + } + raceLogServer.lockForRead(); + raceLogClient2.lockForRead(); + try { + assertEquals(raceLogServer.getRawFixes().iterator().next(), raceLogClient2.getRawFixes().iterator().next()); + } finally { + raceLogClient2.unlockAfterRead(); + raceLogServer.unlockAfterRead(); + } } } From 61750b59c0d079a0909f07bb5b12e968172331ff Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 10 Jul 2013 13:41:21 +0200 Subject: [PATCH 004/450] started implementing a specific OT rule for race log events --- .../racelog/RaceLogEventWithTransformationSupport.java | 9 ++++----- ...RaceLogStartTimeEventWithTransformationSupport.java | 10 ++++++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java index 114ea78f7d5..98003492d5d 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java @@ -18,16 +18,15 @@ public abstract class RaceLogEventWithTransformationSupport transformClientOp(RaceLogEventWithTransformationSupport serverOp) { + public RaceLogEventWithTransformationSupport transformClientOpForStartTimeEvent( + RaceLogStartTimeEventWithTransformationSupport raceLogStartTimeEventWithTransformationSupport) { // TODO Auto-generated method stub return null; } - @Override - public RaceLogEventWithTransformationSupport transformServerOp(RaceLogEventWithTransformationSupport clientOp) { + public RaceLogEventWithTransformationSupport transformServerOpForStartTimeEvent( + RaceLogStartTimeEventWithTransformationSupport raceLogStartTimeEventWithTransformationSupport) { // TODO Auto-generated method stub return null; } - } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java index f41ef3fefc4..610ea5b58bc 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java @@ -6,4 +6,14 @@ public class RaceLogStartTimeEventWithTransformationSupport extends RaceLogEvent public RaceLogStartTimeEventWithTransformationSupport(RaceLogStartTimeEvent raceLogEvent) { super(raceLogEvent); } + + @Override + public RaceLogEventWithTransformationSupport transformClientOp(RaceLogEventWithTransformationSupport serverOp) { + return serverOp.transformClientOpForStartTimeEvent(this); + } + + @Override + public RaceLogEventWithTransformationSupport transformServerOp(RaceLogEventWithTransformationSupport clientOp) { + return clientOp.transformServerOpForStartTimeEvent(this); + } } From 87210386771a8563c4d6e1c43bf9b933185fbea2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 11 Jul 2013 09:17:26 +0200 Subject: [PATCH 005/450] refactored OT framework such that null may represent a no-op --- .../test/OperationalTransformationTest.java | 9 +- .../OperationalTransformer.java | 3 +- .../operationaltransformation/PeerImpl.java | 96 ++++++++++++------- .../Transformer.java | 21 ++-- .../RaceLogOperationalTransformationTest.java | 46 ++++++++- .../AbstractRacingEventServiceOperation.java | 24 +---- ...RaceLogEventWithTransformationSupport.java | 16 ++-- ...artTimeEventWithTransformationSupport.java | 10 ++ 8 files changed, 145 insertions(+), 80 deletions(-) diff --git a/java/com.sap.sailing.operationaltransformation.test/src/com/sap/sailing/operationaltransformation/test/OperationalTransformationTest.java b/java/com.sap.sailing.operationaltransformation.test/src/com/sap/sailing/operationaltransformation/test/OperationalTransformationTest.java index 081f67faeba..d420b5e65c6 100755 --- a/java/com.sap.sailing.operationaltransformation.test/src/com/sap/sailing/operationaltransformation/test/OperationalTransformationTest.java +++ b/java/com.sap.sailing.operationaltransformation.test/src/com/sap/sailing/operationaltransformation/test/OperationalTransformationTest.java @@ -47,9 +47,12 @@ public class OperationalTransformationTest { public static class StringInsertTransformer implements Transformer { @Override public ClientServerOperationPair transform(StringInsertOperation clientOp, StringInsertOperation serverOp) { - StringInsertOperation resultClientOp; - StringInsertOperation resultServerOp; - if (clientOp.getPos() >= serverOp.getPos()) { + final StringInsertOperation resultClientOp; + final StringInsertOperation resultServerOp; + if (clientOp == null || serverOp == null) { + resultClientOp = clientOp; + resultServerOp = serverOp; + } else if (clientOp.getPos() >= serverOp.getPos()) { resultServerOp = serverOp; resultClientOp = new StringInsertOperation(clientOp.getPos()+serverOp.getS().length(), clientOp.getS()); } else { diff --git a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationalTransformer.java b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationalTransformer.java index 0e4b972eceb..1fdb249521d 100755 --- a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationalTransformer.java +++ b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/OperationalTransformer.java @@ -6,7 +6,8 @@ public class OperationalTransformer transform(O clientOp, O serverOp) { ClientServerOperationPair result = new ClientServerOperationPair( - clientOp.transformClientOp(serverOp), serverOp.transformServerOp(clientOp)); + clientOp == null ? null : clientOp.transformClientOp(serverOp), + serverOp == null ? null : serverOp.transformServerOp(clientOp)); return result; } diff --git a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/PeerImpl.java b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/PeerImpl.java index 81bd4e099fe..a7eb3e12bb3 100755 --- a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/PeerImpl.java +++ b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/PeerImpl.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.logging.Level; import java.util.logging.Logger; @@ -128,6 +129,9 @@ public class PeerImpl, S> implements Peer { try { currentState = operation.applyTo(currentState); updatePeers(operation, /* except */null); + } catch (Exception e) { + logger.log(Level.SEVERE, "Exception during executing task in peer "+PeerImpl.this, e); + throw e; } finally { taskFinished(); } @@ -136,41 +140,60 @@ public class PeerImpl, S> implements Peer { @Override public synchronized void apply(final Peer source, O operation, final int numberOfOperationsSourceHasMergedFromThis) { - taskScheduled(); - if (!getPeers().contains(source)) { - throw new RuntimeException("Peer "+source+" not registered with peer "+this); - } - // Starting from base up to current, compute transformed operation sequence to send - // to client; this will create a sequence of states for the client which eventually - // leads up to a state that equals the server's current state. - O transformedOp = operation; - UnmergedOperationsQueue unmergedOperationsForSource = unmergedOperationsForPeer.get(source); - int localOpNumber = numberOfOperationsSourceHasMergedFromThis; - for (O unconfirmedOperation : unmergedOperationsForSource.getUnmergedOperations(numberOfOperationsSourceHasMergedFromThis)) { - if (role == Role.SERVER) { - ClientServerOperationPair pair = getTransformer().transform(transformedOp, unconfirmedOperation); - transformedOp = pair.getClientOp(); - unmergedOperationsForSource.updateWithTransformed(localOpNumber, pair.getServerOp()); - } else { - ClientServerOperationPair pair = getTransformer().transform(unconfirmedOperation, transformedOp); - transformedOp = pair.getServerOp(); - unmergedOperationsForSource.updateWithTransformed(localOpNumber, pair.getClientOp()); - } - localOpNumber++; - } - currentState = transformedOp.applyTo(currentState); // produce a new current state - final int numberOfMergedOperationsFromSource = numberOfMergedOperations.get(source)+1; - numberOfMergedOperations.put(source, numberOfMergedOperationsFromSource); - // It's important that the following call to confirm is synchronized with the - // sending of updates to the source peer. Therefore, the confirm call is executed - // in the same serializing background thread: - scheduleTask(new Runnable() { - public void run() { - source.confirm(PeerImpl.this, numberOfMergedOperationsFromSource); - } - }); - updatePeers(transformedOp, /* except */source); - taskFinished(); + taskScheduled(); + try { + if (!getPeers().contains(source)) { + throw new RuntimeException("Peer " + source + " not registered with peer " + this); + } + // Starting from base up to current, compute transformed operation sequence to send + // to client; this will create a sequence of states for the client which eventually + // leads up to a state that equals the server's current state. + O transformedOp = operation; + UnmergedOperationsQueue unmergedOperationsForSource = unmergedOperationsForPeer.get(source); + int localOpNumber = numberOfOperationsSourceHasMergedFromThis; + for (O unconfirmedOperation : unmergedOperationsForSource + .getUnmergedOperations(numberOfOperationsSourceHasMergedFromThis)) { + if (role == Role.SERVER) { + final ClientServerOperationPair pair; + if (transformedOp == null || unconfirmedOperation == null) { + pair = new ClientServerOperationPair<>(transformedOp, unconfirmedOperation); + } else { + pair = getTransformer().transform(transformedOp, unconfirmedOperation); + } + transformedOp = pair.getClientOp(); + unmergedOperationsForSource.updateWithTransformed(localOpNumber, pair.getServerOp()); + } else { + final ClientServerOperationPair pair; + if (transformedOp == null || unconfirmedOperation == null) { + pair = new ClientServerOperationPair<>(unconfirmedOperation, transformedOp); + } else { + pair = getTransformer().transform(unconfirmedOperation, transformedOp); + } + transformedOp = pair.getServerOp(); + unmergedOperationsForSource.updateWithTransformed(localOpNumber, pair.getClientOp()); + } + localOpNumber++; + } + if (transformedOp != null) { + currentState = transformedOp.applyTo(currentState); // produce a new current state + } + final int numberOfMergedOperationsFromSource = numberOfMergedOperations.get(source) + 1; + numberOfMergedOperations.put(source, numberOfMergedOperationsFromSource); + // It's important that the following call to confirm is synchronized with the + // sending of updates to the source peer. Therefore, the confirm call is executed + // in the same serializing background thread: + scheduleTask(new Runnable() { + public void run() { + source.confirm(PeerImpl.this, numberOfMergedOperationsFromSource); + } + }); + updatePeers(transformedOp, /* except */source); + } catch (Exception e) { + logger.log(Level.SEVERE, "Exception during executing task in peer "+PeerImpl.this, e); + throw e; + } finally { + taskFinished(); + } } /** @@ -228,6 +251,9 @@ public class PeerImpl, S> implements Peer { public void run() { try { runnable.run(); + } catch (Exception e) { + logger.log(Level.SEVERE, "Exception during executing task in peer "+PeerImpl.this, e); + throw e; } finally { taskFinished(); } diff --git a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/Transformer.java b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/Transformer.java index 1dc7ea48479..62bf2108469 100755 --- a/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/Transformer.java +++ b/java/com.sap.sailing.operationaltransformation/src/com/sap/sailing/operationaltransformation/Transformer.java @@ -2,15 +2,18 @@ package com.sap.sailing.operationaltransformation; public interface Transformer> { /** - * Takes an operation from the client and an operation from the server, both - * based on the same state. The complementary pair of operations is computed - * such that if the client applies the server operation returned, and the - * server applies the client operation returned, both end up in equal states - * again.

+ * Takes an operation from the client and an operation from the server, both based on the same state. The + * complementary pair of operations is computed such that if the client applies the server operation returned, and + * the server applies the client operation returned, both end up in equal states again. + *

* - * If a resulting operation is supposed to not have any effects, return the - * {@link AbstractRacingEventServiceOperation#getNoOp()} operation, but never null - * as any of the operations in the resulting pair. + * If a resulting operation is supposed to not have any effects, return null as the operations in the + * resulting pair. + * + * @param clientOp + * operation that was executed on the CLIENT; never called with null + * @param serverOp + * operation that was executed on the SERVER; never called with null */ - ClientServerOperationPair transform(O transformedOp, O unconfirmedOperation); + ClientServerOperationPair transform(O clientOp, O serverOp); } diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java index dcaa9dcbc77..ce58ed53c01 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java @@ -55,9 +55,7 @@ public class RaceLogOperationalTransformationTest { RaceLogStartTimeEvent startTimeEvent = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), startTime, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTime); RaceLogStartTimeEventWithTransformationSupport e = new RaceLogStartTimeEventWithTransformationSupport(startTimeEvent); server.apply(e); - server.waitForNotRunning(); - client1.waitForNotRunning(); - client2.waitForNotRunning(); + waitForEventualConsistency(); raceLogClient1.lockForRead(); try { assertEquals(1, Util.size(raceLogClient1.getRawFixes())); @@ -87,4 +85,46 @@ public class RaceLogOperationalTransformationTest { raceLogServer.unlockAfterRead(); } } + + @Test + public void testConflictingApplyServerWins() { + Calendar cServer = new GregorianCalendar(2013, 6, 7, 13, 59, 33); + final MillisecondsTimePoint startTimeServer = new MillisecondsTimePoint(cServer.getTime()); + RaceLogStartTimeEvent startTimeEventServer = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), startTimeServer, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTimeServer); + RaceLogStartTimeEventWithTransformationSupport eServer = new RaceLogStartTimeEventWithTransformationSupport(startTimeEventServer); + server.apply(eServer); + Calendar cClient1 = new GregorianCalendar(2013, 6, 7, 13, 59, 33); + final MillisecondsTimePoint startTimeClient1 = new MillisecondsTimePoint(cClient1.getTime()); + RaceLogStartTimeEvent startTimeEventClient1 = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), startTimeClient1, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTimeClient1); + RaceLogStartTimeEventWithTransformationSupport eClient1 = new RaceLogStartTimeEventWithTransformationSupport(startTimeEventClient1); + client1.apply(eClient1); + waitForEventualConsistency(); + // now assert that the start time is equal on both clients and the server and equal to that set on the server + raceLogClient1.lockForRead(); + try { + assertEquals(1, Util.size(raceLogClient1.getRawFixes())); + assertEquals(startTimeServer, ((RaceLogStartTimeEvent) raceLogClient1.getLastRawFix()).getStartTime()); + } finally { + raceLogClient1.unlockAfterRead(); + } + raceLogClient2.lockForRead(); + try { + assertEquals(1, Util.size(raceLogClient2.getRawFixes())); + assertEquals(startTimeServer, ((RaceLogStartTimeEvent) raceLogClient2.getLastRawFix()).getStartTime()); + } finally { + raceLogClient2.unlockAfterRead(); + } + raceLogServer.lockForRead(); + try { + assertEquals(startTimeServer, ((RaceLogStartTimeEvent) raceLogServer.getLastRawFix()).getStartTime()); + } finally { + raceLogServer.unlockAfterRead(); + } + } + + private void waitForEventualConsistency() { + server.waitForNotRunning(); + client1.waitForNotRunning(); + client2.waitForNotRunning(); + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractRacingEventServiceOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractRacingEventServiceOperation.java index 3661c1e1152..6249bd627af 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractRacingEventServiceOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractRacingEventServiceOperation.java @@ -126,28 +126,6 @@ public abstract class AbstractRacingEventServiceOperation implements } public static RacingEventServiceOperation getNoOp() { - return new AbstractRacingEventServiceOperation() { - private static final long serialVersionUID = -7203280393485688834L; - - @Override - public Void internalApplyTo(RacingEventService toState) { - return null; - } - - @Override - public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) { - return this; - } - - @Override - public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) { - return this; - } - - @Override - public String toString() { - return "noop"; - } - }; + return null; } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java index 98003492d5d..9da6c827f68 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogEventWithTransformationSupport.java @@ -18,15 +18,19 @@ public abstract class RaceLogEventWithTransformationSupport transformClientOpForStartTimeEvent( - RaceLogStartTimeEventWithTransformationSupport raceLogStartTimeEventWithTransformationSupport) { - // TODO Auto-generated method stub - return null; + RaceLogStartTimeEventWithTransformationSupport raceLogStartTimeClientEventWithTransformationSupport) { + return this; } + /** + * By default, setting the start time on the SERVER is not transformed by any CLIENT operation for execution on the CLIENT. + */ public RaceLogEventWithTransformationSupport transformServerOpForStartTimeEvent( - RaceLogStartTimeEventWithTransformationSupport raceLogStartTimeEventWithTransformationSupport) { - // TODO Auto-generated method stub - return null; + RaceLogStartTimeEventWithTransformationSupport raceLogStartTimeServerEventWithTransformationSupport) { + return this; } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java index 610ea5b58bc..2c4176c3a8d 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/racelog/RaceLogStartTimeEventWithTransformationSupport.java @@ -16,4 +16,14 @@ public class RaceLogStartTimeEventWithTransformationSupport extends RaceLogEvent public RaceLogEventWithTransformationSupport transformServerOp(RaceLogEventWithTransformationSupport clientOp) { return clientOp.transformServerOpForStartTimeEvent(this); } + + /** + * This is the CLIENT operation, and the SERVER start time event collides with the CLIENT start time event. + * The server's start time is to be set as the one that is used, and the client's event is to be removed from the log. + */ + @Override + public RaceLogEventWithTransformationSupport transformClientOpForStartTimeEvent( + RaceLogStartTimeEventWithTransformationSupport raceLogStartTimeServerEventWithTransformationSupport) { + return null; + } } From ada6f4b129b2e1ff3ee0b933b683493968996888 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 16 Jul 2013 10:48:20 +0200 Subject: [PATCH 006/450] renamed anlyzation to analysis; some whitespace/formatting changes --- .../racelog/analyzing/impl/AbortingFlagFinder.java | 2 +- .../impl/ConfirmedFinishPositioningListFinder.java | 2 +- .../analyzing/impl/FinishPositioningListFinder.java | 2 +- .../racelog/analyzing/impl/FinishedTimeFinder.java | 2 +- .../racelog/analyzing/impl/FinishingTimeFinder.java | 2 +- .../analyzing/impl/GateLineOpeningTimeFinder.java | 2 +- .../racelog/analyzing/impl/IndividualRecallFinder.java | 2 +- .../domain/racelog/analyzing/impl/LastFlagsFinder.java | 8 ++++---- .../analyzing/impl/LastPublishedCourseDesignFinder.java | 2 +- .../domain/racelog/analyzing/impl/LastWindFixFinder.java | 2 +- .../domain/racelog/analyzing/impl/PathfinderFinder.java | 2 +- .../racelog/analyzing/impl/ProtestStartTimeFinder.java | 2 +- .../racelog/analyzing/impl/RRS26StartModeFlagFinder.java | 2 +- .../domain/racelog/analyzing/impl/RaceLogAnalyzer.java | 4 ++-- .../racelog/analyzing/impl/RaceStatusAnalyzer.java | 2 +- .../analyzing/impl/StartProcedureTypeAnalyzer.java | 2 +- .../domain/racelog/analyzing/impl/StartTimeFinder.java | 2 +- .../domain/racelog/analyzing/impl/WindFixesFinder.java | 2 +- .../app/services/sending/EventPersistenceManager.java | 9 +++++---- .../app/services/sending/EventSendingService.java | 6 ++++-- 20 files changed, 31 insertions(+), 28 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AbortingFlagFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AbortingFlagFinder.java index c3e606f939f..9c615632204 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AbortingFlagFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/AbortingFlagFinder.java @@ -12,7 +12,7 @@ public class AbortingFlagFinder extends RaceLogAnalyzer { } @Override - protected RaceLogFlagEvent performAnalyzation() { + protected RaceLogFlagEvent performAnalysis() { if (raceLog.getCurrentPassId() <= RaceLog.DefaultPassId) { return null; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ConfirmedFinishPositioningListFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ConfirmedFinishPositioningListFinder.java index 7784ec86be3..19b35a66560 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ConfirmedFinishPositioningListFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ConfirmedFinishPositioningListFinder.java @@ -16,7 +16,7 @@ public class ConfirmedFinishPositioningListFinder extends RaceLogAnalyzer> performAnalyzation() { + protected List> performAnalysis() { for (RaceLogEvent event : getPassEventsDescending()) { if (event instanceof RaceLogFinishPositioningConfirmedEvent) { RaceLogFinishPositioningConfirmedEvent finishPositioningEvent = (RaceLogFinishPositioningConfirmedEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishPositioningListFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishPositioningListFinder.java index 62d0d9c67cb..fcb0ff0bafe 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishPositioningListFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishPositioningListFinder.java @@ -16,7 +16,7 @@ public class FinishPositioningListFinder extends RaceLogAnalyzer> performAnalyzation() { + protected List> performAnalysis() { for (RaceLogEvent event : getPassEventsDescending()) { if (event instanceof RaceLogFinishPositioningListChangedEvent) { RaceLogFinishPositioningListChangedEvent finishPositioningEvent = (RaceLogFinishPositioningListChangedEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishedTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishedTimeFinder.java index 0181fca9421..a75f215fb3f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishedTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishedTimeFinder.java @@ -13,7 +13,7 @@ public class FinishedTimeFinder extends RaceLogAnalyzer { } @Override - protected TimePoint performAnalyzation() { + protected TimePoint performAnalysis() { for (RaceLogEvent event : getPassEventsDescending()) { if (event instanceof RaceLogRaceStatusEvent) { RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishingTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishingTimeFinder.java index e535008b5e7..76f683bf0b4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishingTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/FinishingTimeFinder.java @@ -13,7 +13,7 @@ public class FinishingTimeFinder extends RaceLogAnalyzer { } @Override - protected TimePoint performAnalyzation() { + protected TimePoint performAnalysis() { for (RaceLogEvent event : getPassEventsDescending()) { if (event instanceof RaceLogRaceStatusEvent) { RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/GateLineOpeningTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/GateLineOpeningTimeFinder.java index 864a3cf2cba..0b7399a2606 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/GateLineOpeningTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/GateLineOpeningTimeFinder.java @@ -11,7 +11,7 @@ public class GateLineOpeningTimeFinder extends RaceLogAnalyzer { } @Override - protected Long performAnalyzation() { + protected Long performAnalysis() { for (RaceLogEvent event : getPassEvents()) { if (event instanceof RaceLogGateLineOpeningTimeEvent) { return ((RaceLogGateLineOpeningTimeEvent) event).getGateLineOpeningTime(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallFinder.java index a9d1a7fc1fd..61a5f97a31c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/IndividualRecallFinder.java @@ -14,7 +14,7 @@ public abstract class IndividualRecallFinder extends RaceLogAnalyzer protected abstract boolean isRelevant(RaceLogFlagEvent flagEvent); @Override - protected TimePoint performAnalyzation() { + protected TimePoint performAnalysis() { for (RaceLogEvent event : getPassEvents()) { if (event instanceof RaceLogFlagEvent) { RaceLogFlagEvent flagEvent = (RaceLogFlagEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastFlagsFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastFlagsFinder.java index 30748e187a1..32c0aecbf84 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastFlagsFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastFlagsFinder.java @@ -12,7 +12,7 @@ import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; /** - * Analyzation returns the most recent {@link RaceLogFlagEvent}s. + * Analysis returns the most recent {@link RaceLogFlagEvent}s.

* * If there is no {@link RaceLogFlagEvent} in the current pass, null is returned. Otherwise a {@link List} * of {@link RaceLogFlagEvent} is returned containing all {@link RaceLogEvent}s with the most recent {@link TimePoint}. @@ -25,7 +25,7 @@ public class LastFlagsFinder extends RaceLogAnalyzer> { } @Override - protected List performAnalyzation() { + protected List performAnalysis() { Iterator iterator = getPassEventsDescending().iterator(); RaceLogFlagEvent flagEvent = getNextFlagEvent(iterator); @@ -62,8 +62,8 @@ public class LastFlagsFinder extends RaceLogAnalyzer> { } /** - * Use this method the obtain the most "interesting" {@link RaceLogFlagEvent} of the {@link LastFlagsFinder}'s - * analyzation result. + * Use this method to obtain the most "interesting" {@link RaceLogFlagEvent} of the {@link LastFlagsFinder}'s + * analysis result. * * If an empty list or null is passed, this method returns null. Otherwise the (most * recent) {@link RaceLogFlagEvent} with the highest ID is returned favoring events with diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastPublishedCourseDesignFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastPublishedCourseDesignFinder.java index e67fbfa26ba..c700b59c17a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastPublishedCourseDesignFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastPublishedCourseDesignFinder.java @@ -13,7 +13,7 @@ public class LastPublishedCourseDesignFinder extends RaceLogAnalyzer } @Override - protected CourseBase performAnalyzation() { + protected CourseBase performAnalysis() { for (RaceLogEvent event : getAllEventsDescending()) { if (event instanceof RaceLogCourseDesignChangedEvent) { RaceLogCourseDesignChangedEvent courseDesignEvent = (RaceLogCourseDesignChangedEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastWindFixFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastWindFixFinder.java index 996c0c0effa..9cbf1c716bf 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastWindFixFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/LastWindFixFinder.java @@ -12,7 +12,7 @@ public class LastWindFixFinder extends RaceLogAnalyzer { } @Override - protected Wind performAnalyzation() { + protected Wind performAnalysis() { for (RaceLogEvent event : getAllEventsDescending()) { if (event instanceof RaceLogWindFixEvent) { RaceLogWindFixEvent windFixEvent = (RaceLogWindFixEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/PathfinderFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/PathfinderFinder.java index d0849327c6c..a885ab5e5f0 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/PathfinderFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/PathfinderFinder.java @@ -11,7 +11,7 @@ public class PathfinderFinder extends RaceLogAnalyzer { } @Override - protected String performAnalyzation() { + protected String performAnalysis() { for (RaceLogEvent event : getPassEventsDescending()) { if (event instanceof RaceLogPathfinderEvent) { return ((RaceLogPathfinderEvent) event).getPathfinderId(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ProtestStartTimeFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ProtestStartTimeFinder.java index 38a3aa48248..18fb9bb852c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ProtestStartTimeFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/ProtestStartTimeFinder.java @@ -12,7 +12,7 @@ public class ProtestStartTimeFinder extends RaceLogAnalyzer { } @Override - protected TimePoint performAnalyzation() { + protected TimePoint performAnalysis() { for (RaceLogEvent event : getPassEventsDescending()) { if (event instanceof RaceLogProtestStartTimeEvent) { return ((RaceLogProtestStartTimeEvent) event).getProtestStartTime(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java index a018ee4f96a..2837c899871 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java @@ -30,7 +30,7 @@ public class RRS26StartModeFlagFinder extends RaceLogAnalyzer { } @Override - protected Flags performAnalyzation() { + protected Flags performAnalysis() { StartProcedureType type = procedureAnalyzer.analyze(); if (StartProcedureType.RRS26.equals(type)) { for (RaceLogEvent event : getPassEventsDescending()) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceLogAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceLogAnalyzer.java index aaf96731ae3..11ec94bebc8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceLogAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceLogAnalyzer.java @@ -24,13 +24,13 @@ public abstract class RaceLogAnalyzer { public ResultType analyze() { raceLog.lockForRead(); try { - return performAnalyzation(); + return performAnalysis(); } finally { raceLog.unlockAfterRead(); } } - protected abstract ResultType performAnalyzation(); + protected abstract ResultType performAnalysis(); protected Iterable getPassEvents() { return raceLog.getFixes(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceStatusAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceStatusAnalyzer.java index a351e5440c7..7ca600b5125 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceStatusAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RaceStatusAnalyzer.java @@ -12,7 +12,7 @@ public class RaceStatusAnalyzer extends RaceLogAnalyzer { } @Override - protected RaceLogRaceStatus performAnalyzation() { + protected RaceLogRaceStatus performAnalysis() { for (RaceLogEvent event : getPassEventsDescending()) { if (event instanceof RaceLogRaceStatusEvent) { RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartProcedureTypeAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartProcedureTypeAnalyzer.java index 1ccee75cd93..8d6bfc7db5a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartProcedureTypeAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartProcedureTypeAnalyzer.java @@ -12,7 +12,7 @@ public class StartProcedureTypeAnalyzer extends RaceLogAnalyzer { } @Override - protected TimePoint performAnalyzation() { + protected TimePoint performAnalysis() { for (RaceLogEvent event : getPassEventsDescending()) { if (event instanceof RaceLogStartTimeEvent) { return ((RaceLogStartTimeEvent) event).getStartTime(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/WindFixesFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/WindFixesFinder.java index 218bfd2c42e..0c94fc329c6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/WindFixesFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/WindFixesFinder.java @@ -15,7 +15,7 @@ public class WindFixesFinder extends RaceLogAnalyzer> { } @Override - protected List performAnalyzation() { + protected List performAnalysis() { final List windFixes = new ArrayList(); for (RaceLogEvent event : getAllEventsDescending()) { if (event instanceof RaceLogWindFixEvent) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java index 6811672ef6e..ba56de93561 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java @@ -130,7 +130,7 @@ public class EventPersistenceManager { } private void addEventToLog(String raceId, String serializedEvent) { - ExLog.i(TAG, String.format("Trying to readd event to race log of race %s.", raceId)); + ExLog.i(TAG, String.format("Trying to re-add event to race log of race %s.", raceId)); DataStore store = DataManager.create(this.context).getDataStore(); if (!store.hasRace(raceId)) { ExLog.w(TAG, String.format("There is no race %s.", raceId)); @@ -177,11 +177,12 @@ public class EventPersistenceManager { } private void writePersistedEventsToFile() { - String newFileContent = ""; + StringBuilder newFileContent = new StringBuilder(); for (String persistedEvent : persistedEvents) { - newFileContent += persistedEvent + "\n"; + newFileContent.append(persistedEvent); + newFileContent.append('\n'); } - writeToFile(newFileContent, Context.MODE_PRIVATE); + writeToFile(newFileContent.toString(), Context.MODE_PRIVATE); ExLog.i(TAG, "Wrote file content to file: " + newFileContent); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index f0bab86ed22..11fd779c04a 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -78,7 +78,8 @@ public class EventSendingService extends Service implements EventSendingListener } /** - * creates an intent that contains the event to be sent and the race id which shall be sent to the backend + * Creates an intent that contains the event to be sent and the race id which shall be sent to the back end. + * See constants in AddEntryToRaceLogJsonPostServlet for URL construction rules. * * @param context * the context of the app @@ -178,8 +179,9 @@ public class EventSendingService extends Service implements EventSendingListener List delayedIntents = persistenceManager.restoreEvents(); ExLog.i(TAG, String.format("Resending %d events...", delayedIntents.size())); - for (Intent intent : delayedIntents) + for (Intent intent : delayedIntents) { sendEvent(intent); + } } private void sendEvent(Intent intent) { From e3a300289856b253e23007a5d879315ab3cb5701 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 16 Jul 2013 13:39:21 +0200 Subject: [PATCH 007/450] added add(RaceLogEvent, UUID) to RaceLog which delivers non-delivered race log events to a client with a UUID --- .../impl/DomainObjectFactoryImpl.java | 4 +- .../impl/MongoRaceLogStoreImpl.java | 14 ++++--- .../sap/sailing/domain/racelog/RaceLog.java | 11 +++++ .../domain/racelog/impl/RaceLogImpl.java | 40 +++++++++++++++++++ .../sap/sailing/domain/test/RaceLogTest.java | 23 ++++++++++- 5 files changed, 82 insertions(+), 10 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 931fd011d15..2b8beef9aea 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 @@ -1010,9 +1010,9 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { DBCollection raceLog = database.getCollection(CollectionNames.RACE_LOGS.name()); for (DBObject o : raceLog.find(query)) { RaceLogEvent raceLogEvent = loadRaceLogEvent((DBObject) o.get(FieldNames.RACE_LOG_EVENT.name())); - - if (raceLogEvent != null) + if (raceLogEvent != null) { result.add(raceLogEvent); + } } } catch (Throwable t) { // something went wrong during DB access; report, then use empty new race log diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreImpl.java index 60303118cfa..72cc4376f82 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreImpl.java @@ -29,14 +29,16 @@ public class MongoRaceLogStoreImpl implements RaceLogStore { @Override public RaceLog getRaceLog(RaceLogIdentifier identifier, boolean ignoreCache) { + final RaceLog result; if (!ignoreCache && raceLogCache.containsKey(identifier)) { - return raceLogCache.get(identifier); + result = raceLogCache.get(identifier); + } else { + result = domainObjectFactory.loadRaceLog(identifier); + MongoRaceLogListener listener = new MongoRaceLogListener(identifier, mongoObjectFactory, db); + listeners.put(result, listener); + result.addListener(listener); + raceLogCache.put(identifier, result); } - RaceLog result = domainObjectFactory.loadRaceLog(identifier); - MongoRaceLogListener listener = new MongoRaceLogListener(identifier, mongoObjectFactory, db); - listeners.put(result, listener); - result.addListener(listener); - raceLogCache.put(identifier, result); return result; } 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 bef4dd32eda..a79f1a7a429 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,6 +1,7 @@ package com.sap.sailing.domain.racelog; import java.util.HashSet; +import java.util.UUID; import com.sap.sailing.domain.common.WithID; import com.sap.sailing.domain.racelog.impl.RaceLogEventComparator; @@ -66,4 +67,14 @@ public interface RaceLog extends Track, WithID { void addAllListeners(HashSet listeners); Iterable getAllListeners(); + + /** + * Adds an event to this race log and returns a superset of all race log events (excluding the new + * event) that were added to this race 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. + */ + Iterable add(RaceLogEvent event, UUID clientId); } 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 49dee9c8a51..e7c5fc6235b 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 @@ -3,9 +3,13 @@ package com.sap.sailing.domain.racelog.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; +import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Map; import java.util.NavigableSet; import java.util.Set; +import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; @@ -25,6 +29,11 @@ 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()); + /** + * Clients can use the {@link #add(RaceLogEvent, UUID)} method + */ + private final transient Map> eventsDeliveredToClient = new HashMap>(); + private final Serializable id; private transient Set listeners; private int currentPassId; @@ -81,6 +90,7 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { } if (isAdded) { logger.finer(String.format("%s (%s) was added to log.", event, event.getClass().getName())); + // 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)); notifyListenersAboutReceive(event); } else { @@ -89,6 +99,36 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { return isAdded; } + @Override + public Iterable add(RaceLogEvent event, UUID clientId) { + lockForWrite(); + try { + final boolean isAdded = getInternalRawFixes().add(event); + if (isAdded) { + logger.finer(String.format("%s (%s) was added to log.", event, event.getClass().getName())); + // 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)); + notifyListenersAboutReceive(event); + } else { + logger.warning(String.format("%s (%s) was not added to log. Ignoring", event, event.getClass().getName())); + } + LinkedHashSet stillToDeliverToClient = new LinkedHashSet(getInternalRawFixes()); + stillToDeliverToClient.remove(event); + Set deliveredToClient = eventsDeliveredToClient.get(clientId); + if (deliveredToClient != null) { + stillToDeliverToClient.removeAll(deliveredToClient); + } else { + deliveredToClient = new HashSet(); + eventsDeliveredToClient.put(clientId, deliveredToClient); + } + deliveredToClient.addAll(stillToDeliverToClient); + deliveredToClient.add(event); + return stillToDeliverToClient; + } finally { + unlockAfterWrite(); + } + } + protected void notifyListenersAboutReceive(RaceLogEvent event) { synchronized (listeners) { for (RaceLogEventVisitor listener : listeners) { 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 575f28d9510..b5493b836a9 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 @@ -2,6 +2,7 @@ package com.sap.sailing.domain.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; @@ -46,6 +47,26 @@ public class RaceLogTest { } } + @Test + public void testAddingEventsFromMultipleClients() { + RaceLog raceLog = new RaceLogImpl("RaceLogTest", "test-identifier"); + UUID client1Id = UUID.randomUUID(); + UUID client2Id = UUID.randomUUID(); + final MillisecondsTimePoint now = MillisecondsTimePoint.now(); + RaceLogStartTimeEvent startTimeEvent1 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now, 1, now.plus(1)); + Iterable empty = raceLog.add(startTimeEvent1, client1Id); + assertTrue(Util.isEmpty(empty)); + RaceLogStartTimeEvent startTimeEvent2 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now.plus(2), 1, now.plus(3)); + Iterable nonEmpty = raceLog.add(startTimeEvent2, client2Id); + assertEquals(1, Util.size(nonEmpty)); + assertSame(startTimeEvent1, nonEmpty.iterator().next()); + RaceLogStartTimeEvent startTimeEvent3 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now.plus(4), 1, now.plus(5)); + Iterable nonEmpty2 = raceLog.add(startTimeEvent3, client1Id); + assertEquals(1, Util.size(nonEmpty2)); + assertSame(startTimeEvent2, nonEmpty2.iterator().next()); + + } + @Test public void testAddOfEvent() { RaceLog rcEventTrack = new RaceLogImpl("RaceLogTest", "test-identifier"); @@ -65,9 +86,7 @@ public class RaceLogTest { assertSame(iterator.next(), rcEvent); count++; } while (iterator.hasNext()); - assertEquals(count, 1); - } finally { rcEventTrack.unlockAfterRead(); } From 55b3c9e0283ee27031f61c87cbd403feef95cf55 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 16 Jul 2013 16:04:25 +0200 Subject: [PATCH 008/450] Use URL-encoding for intent's RaceLogEvent to ensure there are no newlines contained; made clear where encoded and pure JSON version is passed --- .../domain/racelog/impl/RaceLogImpl.java | 3 +- .../racecommittee/app/AppConstants.java | 2 +- .../sending/EventPersistenceManager.java | 59 ++++++++----------- .../app/services/sending/EventSenderTask.java | 15 ++--- .../services/sending/EventSendingService.java | 50 ++++++++-------- 5 files changed, 59 insertions(+), 70 deletions(-) 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 e7c5fc6235b..e34af7f97cd 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 @@ -32,7 +32,7 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { /** * Clients can use the {@link #add(RaceLogEvent, UUID)} method */ - private final transient Map> eventsDeliveredToClient = new HashMap>(); + private transient Map> eventsDeliveredToClient = new HashMap>(); private final Serializable id; private transient Set listeners; @@ -177,6 +177,7 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); listeners = new HashSet(); + eventsDeliveredToClient = new HashMap>(); } @Override diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java index a02a1d9de91..425740e9eca 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java @@ -15,7 +15,7 @@ public class AppConstants { public final static String SERVICE_UNIQUE_ID = "serviceUID"; public final static String RACING_EVENT_TIME = "racingEventTime"; public final static String STARTPROCEDURE_SPECIFIC_EVENT_ID = "startProcedureSpecificEventId"; - public final static String EXTRAS_SERIALIZED_EVENT = "json"; + public final static String EXTRAS_JSON_SERIALIZED_EVENT = "json"; public final static String EXTRAS_URL = "url"; public final static String OPTIONAL_EXTRAS = "optionalExtra"; public final static String FLAG_KEY = "raceFlag"; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java index ba56de93561..cbd2b9ec269 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java @@ -4,7 +4,8 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.Serializable; +import java.net.URLDecoder; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; @@ -47,18 +48,15 @@ public class EventPersistenceManager { public void persistIntent(Intent intent) { Bundle extras = intent.getExtras(); - String raceId = extras.getString(AppConstants.RACE_ID_KEY); String url = extras.getString(AppConstants.EXTRAS_URL); - Serializable serializedEvent = extras.getSerializable(AppConstants.EXTRAS_SERIALIZED_EVENT); - - persistEvent(url, raceId, serializedEvent); + String serializedEventAsJson = extras.getString(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT); + persistEvent(url, raceId, serializedEventAsJson); } - private void persistEvent(String url, String raceId, Serializable serializedEvent) { - String eventLine = getSerializedIntentForPersistence(url, raceId, serializedEvent); + private void persistEvent(String url, String raceId, String serializedEventAsJson) { + String eventLine = getSerializedIntentForPersistence(url, raceId, serializedEventAsJson); ExLog.i(TAG, String.format("Persisting event \"%s\" for race %s.", eventLine, raceId)); - if (persistedEvents.contains(eventLine)) { ExLog.i(TAG, "The event already exists. Ignoring."); return; @@ -66,30 +64,28 @@ public class EventPersistenceManager { saveEvent(eventLine); } - private String getSerializedIntentForPersistence(String url, String raceId, Serializable serializedEvent) { - String eventLine = String.format("%s;%s;%s", raceId, serializedEvent, url); + /** + * @param serializedEventAsJson will be URL-encoded to ensure that the resulting string does not contain newlines + */ + private String getSerializedIntentForPersistence(String url, String raceId, String serializedEventAsJson) { + String eventLine = String.format("%s;%s;%s", raceId, URLEncoder.encode(serializedEventAsJson.toString()), url); return eventLine; } public void removeIntent(Intent intent) { Bundle extras = intent.getExtras(); - String url = extras.getString(AppConstants.EXTRAS_URL); String raceId = extras.getString(AppConstants.RACE_ID_KEY); - String serializedEvent = extras.getString(AppConstants.EXTRAS_SERIALIZED_EVENT); - - - removeEvent(url, raceId, serializedEvent); + String serializedEventAsJson = extras.getString(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT); + removeEvent(url, raceId, serializedEventAsJson); } - private void removeEvent(String url, String raceId, String serializedEvent) { - if (persistedEvents.isEmpty()) - return; - - ExLog.i(TAG, String.format("Removing event \"%s\" for race %s.", serializedEvent, raceId)); - String eventLine = getSerializedIntentForPersistence(url, raceId, serializedEvent); - - removePersistedEvent(eventLine); + private void removeEvent(String url, String raceId, String serializedEventAsUrlEncodedJson) { + if (!persistedEvents.isEmpty()) { + ExLog.i(TAG, String.format("Removing event \"%s\" for race %s.", serializedEventAsUrlEncodedJson, raceId)); + String eventLine = getSerializedIntentForPersistence(url, raceId, serializedEventAsUrlEncodedJson); + removePersistedEvent(eventLine); + } } /** @@ -109,27 +105,22 @@ public class EventPersistenceManager { public List restoreEvents() { List delayedIntents = new ArrayList(); - for (String persistedEvent : persistedEvents) { - String[] lineParts = persistedEvent.split(";"); String url = lineParts[2]; String raceId = lineParts[0]; - String serializedEvent = lineParts[1]; - - addEventToLog(raceId, serializedEvent); - - Intent eventIntent = EventSendingService.createEventIntent(context, url, raceId, serializedEvent); + String serializedEventAsUrlEncodedJson = lineParts[1]; + addEventToLog(raceId, serializedEventAsUrlEncodedJson); + Intent eventIntent = EventSendingService.createEventIntent(context, url, raceId, URLDecoder.decode(serializedEventAsUrlEncodedJson)); if (eventIntent != null) { delayedIntents.add(eventIntent); } } - ExLog.i(TAG, "Restored " + delayedIntents.size() + " events"); return delayedIntents; } - private void addEventToLog(String raceId, String serializedEvent) { + private void addEventToLog(String raceId, String serializedEventAsJson) { ExLog.i(TAG, String.format("Trying to re-add event to race log of race %s.", raceId)); DataStore store = DataManager.create(this.context).getDataStore(); if (!store.hasRace(raceId)) { @@ -138,10 +129,10 @@ public class EventPersistenceManager { } try { RaceLogEventDeserializer deserializer = RaceLogEventDeserializer.create(DomainFactoryImpl.INSTANCE); - RaceLogEvent event = deserializer.deserialize((JSONObject) new JSONParser().parse(serializedEvent)); + RaceLogEvent event = deserializer.deserialize((JSONObject) new JSONParser().parse(serializedEventAsJson)); boolean added = store.getRace(raceId).getRaceLog().add(event); if (added) { - ExLog.i(TAG, String.format("Event readded: %s", serializedEvent)); + ExLog.i(TAG, String.format("Event readded: %s", serializedEventAsJson)); } else { ExLog.i(TAG, "Event didn't need to be readded. Same event already in the log"); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java index acaf98078da..2bd23b3aa25 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java @@ -1,7 +1,7 @@ package com.sap.sailing.racecommittee.app.services.sending; -import java.io.Serializable; import java.net.URI; +import java.net.URLDecoder; import android.content.Intent; import android.os.AsyncTask; @@ -29,28 +29,25 @@ public class EventSenderTask extends AsyncTask doInBackground(Intent... params) { - Intent intent = params[0]; if (intent == null) { return Pair.create(intent, -1); } - Bundle extras = intent.getExtras(); - Serializable serializedEvent = extras.getSerializable(AppConstants.EXTRAS_SERIALIZED_EVENT); + String serializedEventAsJson = extras.getString(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT); String url = extras.getString(AppConstants.EXTRAS_URL); - if (serializedEvent == null || url == null) { + if (serializedEventAsJson == null || url == null) { return Pair.create(intent, -1); } - try { - ExLog.i(TAG, "Posting event: " + serializedEvent); - HttpRequest post = new HttpJsonPostRequest(URI.create(url), serializedEvent.toString()); + ExLog.i(TAG, "Posting event: " + serializedEventAsJson); + HttpRequest post = new HttpJsonPostRequest(URI.create(url), URLDecoder.decode(serializedEventAsJson)); try { post.execute().close(); } finally { post.disconnect(); } - ExLog.i(TAG, "Post successful for the following event: " + serializedEvent); + ExLog.i(TAG, "Post successful for the following event: " + serializedEventAsJson); } catch (Exception e) { ExLog.e(TAG, String.format("Post not successful, exception occured: %s", e.toString())); return Pair.create(intent, -1); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index 11fd779c04a..0e8e55b2adf 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -41,14 +41,20 @@ public class EventSendingService extends Service implements EventSendingListener private final IBinder mBinder = new EventSendingBinder(); private EventPersistenceManager persistenceManager; private boolean isHandlerSet; - + private EventSendingServiceLogger serviceLogger = new EventSendingServiceLogger() { - @Override public void onEventSentSuccessful() { } - @Override public void onEventSentFailed() { } + @Override + public void onEventSentSuccessful() { + } + + @Override + public void onEventSentFailed() { + } }; - + public interface EventSendingServiceLogger { public void onEventSentSuccessful(); + public void onEventSentFailed(); } @@ -78,32 +84,28 @@ public class EventSendingService extends Service implements EventSendingListener } /** - * Creates an intent that contains the event to be sent and the race id which shall be sent to the back end. - * See constants in AddEntryToRaceLogJsonPostServlet for URL construction rules. + * Creates an intent that contains the event to be sent and the race id which shall be sent to the back end. See + * constants in AddEntryToRaceLogJsonPostServlet for URL construction rules. * * @param context * the context of the app * @param race * the race for which the event was created - * @param serializedEvent + * @param serializedEventAsUrlEncodedJson * the event serizalized to JSON * @return the intent that shall be sent to the EventSendingService */ - public static Intent createEventIntent(Context context, ManagedRace race, Serializable serializedEvent) { - String url = String.format( - "%s/sailingserver/rc/racelog?leaderboard=%s&raceColumn=%s&fleet=%s", - AppPreferences.getServerBaseURL(context), - URLEncoder.encode(race.getRaceGroup().getName()), - URLEncoder.encode(race.getName()), - URLEncoder.encode(race.getFleet().getName())); - - return createEventIntent(context, url, race.getId(), serializedEvent); + public static Intent createEventIntent(Context context, ManagedRace race, String serializedEventAsJson) { + String url = String.format("%s/sailingserver/rc/racelog?leaderboard=%s&raceColumn=%s&fleet=%s", + AppPreferences.getServerBaseURL(context), URLEncoder.encode(race.getRaceGroup().getName()), + URLEncoder.encode(race.getName()), URLEncoder.encode(race.getFleet().getName())); + return createEventIntent(context, url, race.getId(), serializedEventAsJson); } - - public static Intent createEventIntent(Context context, String url, Serializable raceId, Serializable serializedEvent) { + + public static Intent createEventIntent(Context context, String url, Serializable raceId, String serializedEventAsJson) { Intent eventIntent = new Intent(AppConstants.INTENT_ACTION_SEND_EVENT); eventIntent.putExtra(AppConstants.RACE_ID_KEY, raceId); - eventIntent.putExtra(AppConstants.EXTRAS_SERIALIZED_EVENT, serializedEvent); + eventIntent.putExtra(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT, serializedEventAsJson); eventIntent.putExtra(AppConstants.EXTRAS_URL, url); ExLog.i(TAG, "Created event " + eventIntent + " for sending to backend"); return eventIntent; @@ -133,7 +135,6 @@ public class EventSendingService extends Service implements EventSendingListener ExLog.i(TAG, "Service is restarted."); return START_STICKY; } - ExLog.i(TAG, "Service is called by following intent: " + intent.getAction()); handleCommand(intent, startId); // We want this service to continue running until it is explicitly @@ -164,7 +165,6 @@ public class EventSendingService extends Service implements EventSendingListener private void handleDelayedEvents() { ExLog.i(TAG, String.format("Trying to resend stored events...")); - isHandlerSet = false; if (!isConnected()) { ExLog.i(TAG, String.format("Resend aborted because there is no connection.")); @@ -178,7 +178,6 @@ public class EventSendingService extends Service implements EventSendingListener private void sendDelayedEvents() { List delayedIntents = persistenceManager.restoreEvents(); ExLog.i(TAG, String.format("Resending %d events...", delayedIntents.size())); - for (Intent intent : delayedIntents) { sendEvent(intent); } @@ -200,10 +199,11 @@ public class EventSendingService extends Service implements EventSendingListener persistenceManager.persistIntent(intent); if (!isHandlerSet) { SendDelayedEventsCaller delayedCaller = new SendDelayedEventsCaller(this); - handler.postDelayed(delayedCaller, AppConstants.EventResendInterval); //after 30 sec, try the sending again + handler.postDelayed(delayedCaller, AppConstants.EventResendInterval); // after 30 sec, try the sending + // again isHandlerSet = true; } - + serviceLogger.onEventSentFailed(); } else { ExLog.i(TAG, "Event successfully send."); @@ -211,7 +211,7 @@ public class EventSendingService extends Service implements EventSendingListener persistenceManager.removeIntent(intent); } lastSuccessfulSend = Calendar.getInstance().getTime(); - + serviceLogger.onEventSentSuccessful(); } From 95078ba0ac3ec69ee69bb3b85bff258646885e42 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 16 Jul 2013 16:27:10 +0200 Subject: [PATCH 009/450] removed redundant URL decoding for JSON race log event in intent --- .../app/domain/state/impl/RaceStateImpl.java | 9 --------- .../app/services/sending/EventSenderTask.java | 3 +-- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java index af54e04b708..3818238813d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java @@ -125,29 +125,23 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { } public void setStartTime(TimePoint newStartTime) { - RaceLogRaceStatus status = getStatus(); if (status != RaceLogRaceStatus.UNSCHEDULED) { onRaceAborted(MillisecondsTimePoint.now()); } - TimePoint eventTime = startProcedure.getLogicalStartTimeEventTime(newStartTime); RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(eventTime, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newStartTime); this.raceLog.add(event); - fireStartTimeChange(newStartTime); } @Override public void createNewStartProcedure(StartProcedureType type) { if (!type.equals(startProcedureTypeAnalyzer.analyze())) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(MillisecondsTimePoint.now(), raceLog.getCurrentPassId(), type); this.raceLog.add(event); - registerStartProcedure(); - ExLog.i(TAG, String.format("Switch start procedure to %s", this.startProcedure.getClass().getSimpleName())); } } @@ -164,11 +158,9 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void setCourseDesign(CourseBase newCourseData) { TimePoint eventTime = MillisecondsTimePoint.now(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(eventTime, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newCourseData); this.raceLog.add(event); - fireCourseDesignChanged(); } @@ -176,7 +168,6 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { public void onRaceAborted(TimePoint eventTime) { /*RaceLogEvent abortEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, raceLog.getCurrentPassId(), RaceLogRaceStatus.UNSCHEDULED); this.raceLog.add(abortEvent);*/ - RaceLogEvent passChangeEvent = RaceLogEventFactory.INSTANCE.createPassChangeEvent(eventTime, raceLog.getCurrentPassId() + 1); this.raceLog.add(passChangeEvent); registerStartProcedure(); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java index 2bd23b3aa25..8da281a2720 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java @@ -1,7 +1,6 @@ package com.sap.sailing.racecommittee.app.services.sending; import java.net.URI; -import java.net.URLDecoder; import android.content.Intent; import android.os.AsyncTask; @@ -41,7 +40,7 @@ public class EventSenderTask extends AsyncTask Date: Tue, 16 Jul 2013 17:07:57 +0200 Subject: [PATCH 010/450] added TODO --- .../racecommittee/app/services/sending/EventSenderTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java index 8da281a2720..703ad085494 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java @@ -42,6 +42,7 @@ public class EventSenderTask extends AsyncTask Date: Tue, 16 Jul 2013 17:24:51 +0200 Subject: [PATCH 011/450] use Boolean instead of Integer encoding of success state --- .../app/services/sending/EventSenderTask.java | 18 ++++++++++-------- .../services/sending/EventSendingService.java | 3 +-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java index abcb168450b..2c83389e4d1 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java @@ -13,7 +13,7 @@ import com.sap.sailing.racecommittee.app.data.http.HttpJsonPostRequest; import com.sap.sailing.racecommittee.app.data.http.HttpRequest; import com.sap.sailing.racecommittee.app.logging.ExLog; -public class EventSenderTask extends AsyncTask> { +public class EventSenderTask extends AsyncTask> { private static String TAG = EventSenderTask.class.getName(); @@ -28,16 +28,17 @@ public class EventSenderTask extends AsyncTask doInBackground(Intent... params) { + protected Pair doInBackground(Intent... params) { + Pair result; Intent intent = params[0]; if (intent == null) { - return Pair.create(intent, -1); + return Pair.create(intent, false); } Bundle extras = intent.getExtras(); String serializedEventAsJson = extras.getString(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT); String url = extras.getString(AppConstants.EXTRAS_URL); if (serializedEventAsJson == null || url == null) { - return Pair.create(intent, -1); + return Pair.create(intent, false); } try { ExLog.i(TAG, "Posting event: " + serializedEventAsJson); @@ -50,17 +51,18 @@ public class EventSenderTask extends AsyncTask resultPair) { + protected void onPostExecute(Pair resultPair) { super.onPostExecute(resultPair); - listener.onResult(resultPair.first, resultPair.second == 0); + listener.onResult(resultPair.first, resultPair.second); } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index 0e8e55b2adf..800186eac65 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -199,8 +199,7 @@ public class EventSendingService extends Service implements EventSendingListener persistenceManager.persistIntent(intent); if (!isHandlerSet) { SendDelayedEventsCaller delayedCaller = new SendDelayedEventsCaller(this); - handler.postDelayed(delayedCaller, AppConstants.EventResendInterval); // after 30 sec, try the sending - // again + handler.postDelayed(delayedCaller, AppConstants.EventResendInterval); // after 30 sec, try the sending again isHandlerSet = true; } From 313062c031a7a8cc0240f6e3561fcbba37fa2239 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 17 Jul 2013 09:26:52 +0200 Subject: [PATCH 012/450] made RaceLogEvent fields final and private --- .../racelog/impl/RaceLogCourseAreaChangeEventImpl.java | 2 +- .../impl/RaceLogCourseDesignChangedEventImpl.java | 2 +- .../sailing/domain/racelog/impl/RaceLogEventImpl.java | 10 +++++----- .../impl/RaceLogFinishPositioningEventImpl.java | 2 +- .../domain/racelog/impl/RaceLogFlagEventImpl.java | 6 +++--- .../impl/RaceLogGateLineOpeningTimeEventImpl.java | 2 +- .../racelog/impl/RaceLogPathfinderEventImpl.java | 2 +- .../racelog/impl/RaceLogProtestStartTimeEventImpl.java | 2 +- .../racelog/impl/RaceLogRaceStatusEventImpl.java | 2 +- .../impl/RaceLogStartProcedureChangedEventImpl.java | 2 +- .../domain/racelog/impl/RaceLogStartTimeEventImpl.java | 2 +- 11 files changed, 17 insertions(+), 17 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java index 6304f0ff9f5..a1ca3cd9eb8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java @@ -12,7 +12,7 @@ public class RaceLogCourseAreaChangeEventImpl extends RaceLogEventImpl implement RaceLogCourseAreaChangedEvent { private static final long serialVersionUID = -3943108136024977860L; - private Serializable courseAreaId; + private final Serializable courseAreaId; public RaceLogCourseAreaChangeEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Serializable courseAreaId) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java index 53ca4ff32e2..1ea19b730db 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java @@ -12,7 +12,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventVisitor; public class RaceLogCourseDesignChangedEventImpl extends RaceLogEventImpl implements RaceLogCourseDesignChangedEvent { private static final long serialVersionUID = 1565936170747420547L; - private CourseBase courseDesign; + private final CourseBase courseDesign; public RaceLogCourseDesignChangedEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, CourseBase courseDesign) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java index 9af8367e157..fcbdb52e0fe 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java @@ -11,11 +11,11 @@ public abstract class RaceLogEventImpl implements RaceLogEvent { private static final long serialVersionUID = -5810258278984777732L; - private TimePoint createdAt; - private TimePoint logicalTimePoint; - private Serializable id; - private List involvedBoats; - private int passId; + private final TimePoint createdAt; + private final TimePoint logicalTimePoint; + private final Serializable id; + private final List involvedBoats; + private final int passId; public RaceLogEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java index cb7e21d9453..0d7d38dba65 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java @@ -13,7 +13,7 @@ public abstract class RaceLogFinishPositioningEventImpl extends RaceLogEventImpl private static final long serialVersionUID = -8168584588697908309L; - protected List> positionedCompetitors; + private final List> positionedCompetitors; public RaceLogFinishPositioningEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, List> positionedCompetitors) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java index d43cc2eb86c..4efe443caeb 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java @@ -12,9 +12,9 @@ import com.sap.sailing.domain.racelog.RaceLogFlagEvent; public class RaceLogFlagEventImpl extends RaceLogEventImpl implements RaceLogFlagEvent { private static final long serialVersionUID = 6333303528852541914L; - private Flags upperFlag; - private Flags lowerFlag; - private boolean isDisplayed; + private final Flags upperFlag; + private final Flags lowerFlag; + private final boolean isDisplayed; public RaceLogFlagEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Flags pUpperFlag, Flags pLowerFlag, boolean pIsDisplayed) { super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java index 0f90197e34c..a524ac95c51 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java @@ -11,7 +11,7 @@ import com.sap.sailing.domain.racelog.RaceLogGateLineOpeningTimeEvent; public class RaceLogGateLineOpeningTimeEventImpl extends RaceLogEventImpl implements RaceLogGateLineOpeningTimeEvent { private static final long serialVersionUID = 793529890804809490L; - private Long gateLineOpeningTime; + private final Long gateLineOpeningTime; public RaceLogGateLineOpeningTimeEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, Long gateLineOpeningTime) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java index 556ca263cc7..5001b7ccc29 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java @@ -11,7 +11,7 @@ import com.sap.sailing.domain.racelog.RaceLogPathfinderEvent; public class RaceLogPathfinderEventImpl extends RaceLogEventImpl implements RaceLogPathfinderEvent { private static final long serialVersionUID = -1654474931330970804L; - private String pathfinderId; + private final String pathfinderId; public RaceLogPathfinderEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, String pathfinderId) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java index 775fe9bfd91..b0bb3d5a283 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java @@ -11,7 +11,7 @@ import com.sap.sailing.domain.racelog.RaceLogProtestStartTimeEvent; public class RaceLogProtestStartTimeEventImpl extends RaceLogEventImpl implements RaceLogProtestStartTimeEvent { private static final long serialVersionUID = -1800827552916395996L; - private TimePoint protestStartTime; + private final TimePoint protestStartTime; public RaceLogProtestStartTimeEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, TimePoint protestStartTime) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java index 7461873ee56..0c80ff46ed6 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java @@ -12,7 +12,7 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; public class RaceLogRaceStatusEventImpl extends RaceLogEventImpl implements RaceLogRaceStatusEvent { private static final long serialVersionUID = -8809758843066724482L; - protected RaceLogRaceStatus nextStatus; + private final RaceLogRaceStatus nextStatus; public RaceLogRaceStatusEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, RaceLogRaceStatus nextStatus) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java index c530bec7006..6a5e151bb7f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java @@ -14,7 +14,7 @@ public class RaceLogStartProcedureChangedEventImpl extends RaceLogEventImpl impl private static final long serialVersionUID = -8102049547516570034L; - private StartProcedureType startProcedureType; + private final StartProcedureType startProcedureType; public RaceLogStartProcedureChangedEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, StartProcedureType startProcedureType) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java index ae69e2e4d0d..a8ea5e57480 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java @@ -12,7 +12,7 @@ import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; public class RaceLogStartTimeEventImpl extends RaceLogRaceStatusEventImpl implements RaceLogStartTimeEvent { private static final long serialVersionUID = 8185811395997196162L; - private TimePoint startTime; + private final TimePoint startTime; public RaceLogStartTimeEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, TimePoint pStartTime) { From decaf07a1795c76f3e8d5781fcd4fd16edc4fd21 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 17 Jul 2013 12:58:25 +0200 Subject: [PATCH 013/450] added the project.properties files again for the mobile projects which don't compile in Eclipse otherwise --- .gitignore | 2 -- .../project.properties | 16 ++++++++++++++++ .../project.properties | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100755 mobile/com.sap.sailing.racecommittee.app/project.properties create mode 100755 mobile/com.sap.sailing.racecommittee.glue/project.properties diff --git a/.gitignore b/.gitignore index c8cbdb2db9d..2e573fee3ef 100644 --- a/.gitignore +++ b/.gitignore @@ -27,5 +27,3 @@ java/com.sap.sailing.simulator/bin/com/sap/sailing/simulator/Simulator.gwt.xml /mobile/com.sap.sailing.racecommittee.app/res/values/keys.xml /mobile/google-play-services_lib/gen/* /mobile/google-play-services_lib/gen/com/google/android/gms/BuildConfig.java -/mobile/com.sap.sailing.racecommittee.app/project.properties -/mobile/com.sap.sailing.racecommittee.glue/project.properties diff --git a/mobile/com.sap.sailing.racecommittee.app/project.properties b/mobile/com.sap.sailing.racecommittee.app/project.properties new file mode 100755 index 00000000000..5a6e5af7129 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/project.properties @@ -0,0 +1,16 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=Google Inc.:Google APIs:13 +android.library.reference.1=..\\google-play-services_lib +android.library.reference.2=../com.sap.sailing.racecommittee.glue \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.glue/project.properties b/mobile/com.sap.sailing.racecommittee.glue/project.properties new file mode 100755 index 00000000000..f4fc70e6595 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.glue/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-13 +android.library=true From 40b2984fddc8d8bd8e1eb33ec37d691cef5455aa Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 17 Jul 2013 15:06:22 +0200 Subject: [PATCH 014/450] use constants consistently for servlet parameter names instead of using constant in one place and redundant string literal in another --- .../racelog/RaceLogServletConstants.java | 15 ++++++ .../test/MultipleJSONObjectsInStreamTest.java | 46 +++++++++++++++++++ .../rc/AddEntryToRaceLogJsonPostServlet.java | 46 +++++++++++++------ .../impl/rc/RaceGroupJsonExportServlet.java | 5 +- .../app/data/OnlineDataManager.java | 3 +- .../app/services/sending/EventSenderTask.java | 43 ++++++++++++----- .../services/sending/EventSendingService.java | 21 ++++++--- 7 files changed, 144 insertions(+), 35 deletions(-) create mode 100755 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogServletConstants.java create mode 100755 java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/MultipleJSONObjectsInStreamTest.java diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogServletConstants.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogServletConstants.java new file mode 100755 index 00000000000..4ed78fe2025 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogServletConstants.java @@ -0,0 +1,15 @@ +package com.sap.sailing.domain.racelog; + +/** + * Constants shared across race committee app and servlet implementation + * + * @author Axel Uhl (d043530) + * + */ +public interface RaceLogServletConstants { + static final String PARAMS_LEADERBOARD_NAME = "leaderboard"; + static final String PARAMS_RACE_COLUMN_NAME = "raceColumn"; + static final String PARAMS_RACE_FLEET_NAME = "fleet"; + static final String PARAMS_CLIENT_UUID = "clientuuid"; + static final String PARAM_COURSE_AREA_FILTER = "courseArea"; +} diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/MultipleJSONObjectsInStreamTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/MultipleJSONObjectsInStreamTest.java new file mode 100755 index 00000000000..8d44e51fa57 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/MultipleJSONObjectsInStreamTest.java @@ -0,0 +1,46 @@ +package com.sap.sailing.server.gateway.serialization.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.junit.Test; + +/** + * Demonstrates and validates how to write more than one JSON object into a single stream as a JSONArray + * + * @author Axel Uhl (d043530) + * + */ +public class MultipleJSONObjectsInStreamTest { + @Test + public void testMultipleJSONObjectsInOneStream() throws IOException, ParseException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + JSONObject o1 = new JSONObject(); + o1.put("o1", "o1"); + JSONObject o2 = new JSONObject(); + o2.put("o2", "o2"); + bos.write('['); + bos.write(o1.toJSONString().getBytes()); + bos.write(','); + bos.write(o2.toJSONString().getBytes()); + bos.write(']'); + bos.close(); + + ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); + JSONParser parser = new JSONParser(); + Object o = parser.parse(new InputStreamReader(bis)); + assertTrue(o instanceof JSONArray); + JSONArray a = (JSONArray) o; + assertEquals("o1", ((JSONObject) a.get(0)).get("o1")); + assertEquals("o2", ((JSONObject) a.get(1)).get("o2")); + } +} diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/AddEntryToRaceLogJsonPostServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/AddEntryToRaceLogJsonPostServlet.java index 4091fa059bc..a805c32aabe 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/AddEntryToRaceLogJsonPostServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/AddEntryToRaceLogJsonPostServlet.java @@ -1,9 +1,11 @@ package com.sap.sailing.server.gateway.impl.rc; import java.io.IOException; +import java.util.UUID; import java.util.logging.Logger; import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -16,43 +18,50 @@ import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.Helpers; import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer; +import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEventSerializer; public class AddEntryToRaceLogJsonPostServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = 7704668926551060433L; - public static final String PARAMS_LEADERBOARD_NAME = "leaderboard"; - public static final String PARAMS_RACE_COLUMN_NAME = "raceColumn"; - public static final String PARAMS_RACE_FLEET_NAME = "fleet"; - private final static Logger logger = Logger.getLogger(AddEntryToRaceLogJsonPostServlet.class.getName()); @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String clientUuidAsString = request.getParameter(RaceLogServletConstants.PARAMS_CLIENT_UUID); + final UUID clientUuid; + if (clientUuidAsString == null) { + clientUuid = null; + } else { + clientUuid = UUID.fromString(clientUuidAsString); + } - String leaderboardName = request.getParameter(PARAMS_LEADERBOARD_NAME); + String leaderboardName = request.getParameter(RaceLogServletConstants.PARAMS_LEADERBOARD_NAME); if (leaderboardName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_LEADERBOARD_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_LEADERBOARD_NAME)); return; } - String raceColumnName = request.getParameter(PARAMS_RACE_COLUMN_NAME); + String raceColumnName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME); if (raceColumnName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_COLUMN_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME)); return; } - String fleetName = request.getParameter(PARAMS_RACE_FLEET_NAME); + String fleetName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_FLEET_NAME); if (fleetName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_FLEET_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_FLEET_NAME)); return; } @@ -83,11 +92,22 @@ public class AddEntryToRaceLogJsonPostServlet extends AbstractJsonHttpServlet { Object requestBody = JSONValue.parseWithException(request.getReader()); JSONObject requestObject = Helpers.toJSONObjectSafe(requestBody); logger.fine("JSON requestObject is: " + requestObject.toString()); - RaceLogEvent logEvent = deserializer.deserialize(requestObject); logger.fine("JSON is deserialized to a RaceLogEvent"); - raceColumn.getRaceLog(fleet).add(logEvent); - + Iterable eventsToSendBackToClient = raceColumn.getRaceLog(fleet).add(logEvent, clientUuid); + JsonSerializer serializer = RaceLogEventSerializer.create(new CompetitorJsonSerializer()); + ServletOutputStream outputStream = response.getOutputStream(); + boolean first = true; + outputStream.write('['); + for (RaceLogEvent eventToSendBackToClient : eventsToSendBackToClient) { + if (first) { + first = false; + } else { + outputStream.write(','); + } + outputStream.write(serializer.serialize(eventToSendBackToClient).toJSONString().getBytes()); + } + outputStream.write(']'); } catch (ParseException pe) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, String.format("Invalid JSON in request body:\n%s", pe)); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java index 5c846bb4ae6..13738990c4d 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java @@ -13,6 +13,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.racegroup.RaceGroup; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.BoatClassJsonSerializer; @@ -35,12 +36,10 @@ import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogSerializ public class RaceGroupJsonExportServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = 4510175441769759252L; - private static final String PARAM_COURSE_AREA_FILTER = "courseArea"; - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String courseAreaFilter = request.getParameter(PARAM_COURSE_AREA_FILTER); + String courseAreaFilter = request.getParameter(RaceLogServletConstants.PARAM_COURSE_AREA_FILTER); if (courseAreaFilter == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Need to set a course area filter."); return; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index fe3e92097eb..88d8db2c1ec 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -16,6 +16,7 @@ import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.SharedDomainFactory; +import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.handlers.CompetitorsDataHandler; @@ -148,7 +149,7 @@ public class OnlineDataManager extends DataManager { DataHandler> handler = new ManagedRacesDataHandler(this, client); try { new DataLoader>(context, URI.create(AppPreferences.getServerBaseURL(context) - + "/sailingserver/rc/racegroups?courseArea=" + courseAreaId.toString()), parser, handler) + + "/sailingserver/rc/racegroups?"+RaceLogServletConstants.PARAM_COURSE_AREA_FILTER + "=" + courseAreaId.toString()), parser, handler) .forceLoad(); } catch (MalformedURLException e) { e.printStackTrace(); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java index 2c83389e4d1..37db9353a3a 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java @@ -1,24 +1,35 @@ package com.sap.sailing.racecommittee.app.services.sending; import java.io.InputStream; +import java.io.InputStreamReader; import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import android.util.Pair; +import com.sap.sailing.domain.base.SharedDomainFactory; +import com.sap.sailing.domain.common.impl.Util.Triple; +import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.data.http.HttpJsonPostRequest; import com.sap.sailing.racecommittee.app.data.http.HttpRequest; +import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; import com.sap.sailing.racecommittee.app.logging.ExLog; +import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer; -public class EventSenderTask extends AsyncTask> { +public class EventSenderTask extends AsyncTask>> { private static String TAG = EventSenderTask.class.getName(); public interface EventSendingListener { - public void onResult(Intent intent, boolean success); + public void onResult(Intent intent, boolean success, Iterable eventsToAddToRaceLog); } private EventSendingListener listener; @@ -28,41 +39,49 @@ public class EventSenderTask extends AsyncTask doInBackground(Intent... params) { - Pair result; + protected Triple> doInBackground(Intent... params) { + Triple> result; Intent intent = params[0]; if (intent == null) { - return Pair.create(intent, false); + return new Triple>(intent, false, null); } Bundle extras = intent.getExtras(); String serializedEventAsJson = extras.getString(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT); String url = extras.getString(AppConstants.EXTRAS_URL); if (serializedEventAsJson == null || url == null) { - return Pair.create(intent, false); + return new Triple>(intent, false, null); } + final List eventsToAdd = new ArrayList(); try { ExLog.i(TAG, "Posting event: " + serializedEventAsJson); HttpRequest post = new HttpJsonPostRequest(URI.create(url), serializedEventAsJson); + SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; try { // TODO read JSON-serialized race log events that need to be merged into the local race log because they were added on the server in the interim final InputStream inputStream = post.execute(); + JSONParser parser = new JSONParser(); + JSONArray eventsToAddAsJson = (JSONArray) parser.parse(new InputStreamReader(inputStream)); + for (Object o : eventsToAddAsJson) { + RaceLogEvent eventToAdd = RaceLogEventDeserializer.create(domainFactory).deserialize((JSONObject) o); + eventsToAdd.add(eventToAdd); + } inputStream.close(); } finally { post.disconnect(); } ExLog.i(TAG, "Post successful for the following event: " + serializedEventAsJson); - result = Pair.create(intent, true); + result = new Triple>(intent, true, eventsToAdd); } catch (Exception e) { ExLog.e(TAG, String.format("Post not successful, exception occured: %s", e.toString())); - result = Pair.create(intent, false); + result = new Triple>(intent, false, eventsToAdd); } return result; } @Override - protected void onPostExecute(Pair resultPair) { - super.onPostExecute(resultPair); - listener.onResult(resultPair.first, resultPair.second); + protected void onPostExecute(Triple> resultTriple) { + super.onPostExecute(resultTriple); + listener.onResult(resultTriple.getA(), resultTriple.getB(), resultTriple.getC()); } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index 800186eac65..ab05295515a 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -5,6 +5,7 @@ import java.net.URLEncoder; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.UUID; import android.app.Service; import android.content.Context; @@ -15,6 +16,8 @@ import android.os.Binder; import android.os.Handler; import android.os.IBinder; +import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.domain.ManagedRace; @@ -75,6 +78,11 @@ public class EventSendingService extends Service implements EventSendingListener private Date lastSuccessfulSend; + /** + * a UUID that identifies this client session; can be used, e.g., to let the server identify subsequent requests coming from the same client + */ + private final static UUID uuid = UUID.randomUUID(); + public int getDelayedIntentsCount() { return persistenceManager.getEventCount(); } @@ -96,9 +104,13 @@ public class EventSendingService extends Service implements EventSendingListener * @return the intent that shall be sent to the EventSendingService */ public static Intent createEventIntent(Context context, ManagedRace race, String serializedEventAsJson) { - String url = String.format("%s/sailingserver/rc/racelog?leaderboard=%s&raceColumn=%s&fleet=%s", + String url = String.format("%s/sailingserver/rc/racelog?"+ + RaceLogServletConstants.PARAMS_LEADERBOARD_NAME+"=%s&"+ + RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME+"=%s&"+ + RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=%s"+ + RaceLogServletConstants.PARAMS_CLIENT_UUID+"=%s", AppPreferences.getServerBaseURL(context), URLEncoder.encode(race.getRaceGroup().getName()), - URLEncoder.encode(race.getName()), URLEncoder.encode(race.getFleet().getName())); + URLEncoder.encode(race.getName()), URLEncoder.encode(race.getFleet().getName()), uuid); return createEventIntent(context, url, race.getId(), serializedEventAsJson); } @@ -193,7 +205,7 @@ public class EventSendingService extends Service implements EventSendingListener } @Override - public void onResult(Intent intent, boolean success) { + public void onResult(Intent intent, boolean success, Iterable eventsToAddToRaceLog) { if (!success) { ExLog.w(TAG, "Error while posting intent to server. Will persist intent..."); persistenceManager.persistIntent(intent); @@ -202,7 +214,6 @@ public class EventSendingService extends Service implements EventSendingListener handler.postDelayed(delayedCaller, AppConstants.EventResendInterval); // after 30 sec, try the sending again isHandlerSet = true; } - serviceLogger.onEventSentFailed(); } else { ExLog.i(TAG, "Event successfully send."); @@ -210,10 +221,8 @@ public class EventSendingService extends Service implements EventSendingListener persistenceManager.removeIntent(intent); } lastSuccessfulSend = Calendar.getInstance().getTime(); - serviceLogger.onEventSentSuccessful(); } - } /** From 9a9f3de2780460a6eb4ad12fbcb8d5bfb7e5406e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 17 Jul 2013 15:10:05 +0200 Subject: [PATCH 015/450] removed tabs; replaced by spaces --- .../app/data/clients/LoadClient.java | 5 +- .../racecommittee/app/domain/ManagedRace.java | 90 ++++++++++--------- 2 files changed, 50 insertions(+), 45 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/clients/LoadClient.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/clients/LoadClient.java index 3616ca89292..b27428b7acf 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/clients/LoadClient.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/clients/LoadClient.java @@ -1,6 +1,7 @@ package com.sap.sailing.racecommittee.app.data.clients; public interface LoadClient { - public void onLoadFailed(Exception reason); - public void onLoadSucceded(T data); + public void onLoadFailed(Exception reason); + + public void onLoadSucceded(T data); } 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 0cabf94d8f4..d4916fb6811 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 @@ -11,50 +11,54 @@ import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.racecommittee.app.domain.state.RaceState; public interface ManagedRace extends ManagedRaceIdentifier, Named, WithID { - - /** - * @return the identifier of the race. - */ - public ManagedRaceIdentifier getIdentifier(); - + /** + * @return the identifier of the race. + */ + public ManagedRaceIdentifier getIdentifier(); - /** - * @return the state of the race. - */ - public RaceState getState(); + /** + * @return the state of the race. + */ + public RaceState getState(); - /** - * Shortcut to {@link RaceState#getRaceLog()} of {@link ManagedRace#getState()}. - * @return the log of the race. - */ - public RaceLog getRaceLog(); - - /** - * Shortcut to {@link RaceState#getStatus()} of {@link ManagedRace#getState()}. - * @return the status of the race's state. - */ - public RaceLogRaceStatus getStatus(); - - /** - * the current course of the race - * @return the course of the race - */ - public CourseBase getCourseDesign(); - - /** - * returns the list of competitors for this race - * @return list of competitors - */ - public Collection getCompetitors(); - - public CourseBase getCourseOnServer(); - - public void setCourseOnServer(CourseBase course); - - /** - * sets the list of competitors for a race. As the competitors are retrieved later from the backend, the list of competitors has to be settable. - * @param competitors the retrieved list of competitors for this race - */ - public void setCompetitors(Collection competitors); + /** + * Shortcut to {@link RaceState#getRaceLog()} of {@link ManagedRace#getState()}. + * + * @return the log of the race. + */ + public RaceLog getRaceLog(); + /** + * Shortcut to {@link RaceState#getStatus()} of {@link ManagedRace#getState()}. + * + * @return the status of the race's state. + */ + public RaceLogRaceStatus getStatus(); + + /** + * the current course of the race + * + * @return the course of the race + */ + public CourseBase getCourseDesign(); + + /** + * returns the list of competitors for this race + * + * @return list of competitors + */ + public Collection getCompetitors(); + + public CourseBase getCourseOnServer(); + + public void setCourseOnServer(CourseBase course); + + /** + * sets the list of competitors for a race. As the competitors are retrieved later from the backend, the list of + * competitors has to be settable. + * + * @param competitors + * the retrieved list of competitors for this race + */ + public void setCompetitors(Collection competitors); } \ No newline at end of file From 99449a10beafa883b1418b97d758f1b68ccf7189 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 17 Jul 2013 15:15:58 +0200 Subject: [PATCH 016/450] use servlet parameter constants for marks servlet --- .../gateway/impl/rc/MarksJsonExportServlet.java | 17 +++++++---------- .../app/data/OnlineDataManager.java | 5 +++-- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java index c8dc7b30b6d..17e1cb66642 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java @@ -13,6 +13,7 @@ import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; @@ -21,31 +22,27 @@ import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSeri public class MarksJsonExportServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = 4510175441769759252L; - public static final String PARAMS_LEADERBOARD_NAME = "leaderboard"; - public static final String PARAMS_RACE_COLUMN_NAME = "raceColumn"; - public static final String PARAMS_RACE_FLEET_NAME = "fleet"; - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String leaderboardName = request.getParameter(PARAMS_LEADERBOARD_NAME); + String leaderboardName = request.getParameter(RaceLogServletConstants.PARAMS_LEADERBOARD_NAME); if (leaderboardName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_LEADERBOARD_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_LEADERBOARD_NAME)); return; } - String raceColumnName = request.getParameter(PARAMS_RACE_COLUMN_NAME); + String raceColumnName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME); if (raceColumnName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_COLUMN_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME)); return; } - String fleetName = request.getParameter(PARAMS_RACE_FLEET_NAME); + String fleetName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_FLEET_NAME); if (fleetName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_FLEET_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_FLEET_NAME)); return; } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index 88d8db2c1ec..decc74a399d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -178,8 +178,9 @@ public class OnlineDataManager extends DataManager { try { new DataLoader>(context, URI.create(AppPreferences.getServerBaseURL(context) - + "/sailingserver/rc/marks?leaderboard=" + raceGroupName + "&raceColumn=" + raceColumnName - + "&fleet=" + fleetName), parser, handler) + + "/sailingserver/rc/marks?"+RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + raceGroupName + + "&"+RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME+"=" + raceColumnName + + "&"+RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=" + fleetName), parser, handler) .forceLoad(); } catch (MalformedURLException e) { e.printStackTrace(); From c2e36861328628eb5e17b222f251c97a909bb79e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 17 Jul 2013 15:18:45 +0200 Subject: [PATCH 017/450] use RaceLogServletConstants also for other Race Log / RCApp related servlet calls --- .../racecommittee/app/data/OnlineDataManager.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index decc74a399d..8818851d501 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -209,9 +209,9 @@ public class OnlineDataManager extends DataManager { try { new DataLoader(context, URI.create(AppPreferences.getServerBaseURL(context) - + "/sailingserver/rc/currentcourse?leaderboard=" + raceGroupName + "&raceColumn=" + raceColumnName - + "&fleet=" + fleetName), parser, handler) - .forceLoad(); + + "/sailingserver/rc/currentcourse?" + RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + + raceGroupName + "&" + RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME + "=" + raceColumnName + + "&"+RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=" + fleetName), parser, handler).forceLoad(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { @@ -234,8 +234,8 @@ public class OnlineDataManager extends DataManager { try { new DataLoader>(context, URI.create(AppPreferences.getServerBaseURL(context) - + "/sailingserver/rc/competitors?leaderboard=" + raceGroupName + "&raceColumn=" + raceColumnName - + "&fleet=" + fleetName), parser, handler) + + "/sailingserver/rc/competitors?" + RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + raceGroupName + "&" + RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME + "=" + raceColumnName + + "&"+RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=" + fleetName), parser, handler) .forceLoad(); } catch (MalformedURLException e) { e.printStackTrace(); From e4a0ef3597c1e503182340ced3ba04eafc8ccf85 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 17 Jul 2013 15:25:25 +0200 Subject: [PATCH 018/450] made remaining race log servlets consistent with the use of RaceLogServletConstants --- .../impl/rc/CompetitorsJsonExportServlet.java | 17 +++++++---------- .../impl/rc/CourseJsonExportServlet.java | 17 +++++++---------- .../impl/rc/MarkPositionsJsonExportServlet.java | 17 +++++++---------- .../app/data/InMemoryDataStore.java | 6 ++++-- .../app/data/OnlineDataManager.java | 1 - 5 files changed, 25 insertions(+), 33 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/CompetitorsJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/CompetitorsJsonExportServlet.java index a48b1296aff..1142c15079f 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/CompetitorsJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/CompetitorsJsonExportServlet.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; @@ -23,31 +24,27 @@ import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer; public class CompetitorsJsonExportServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = 4510175441769759252L; - public static final String PARAMS_LEADERBOARD_NAME = "leaderboard"; - public static final String PARAMS_RACE_COLUMN_NAME = "raceColumn"; - public static final String PARAMS_RACE_FLEET_NAME = "fleet"; - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String leaderboardName = request.getParameter(PARAMS_LEADERBOARD_NAME); + String leaderboardName = request.getParameter(RaceLogServletConstants.PARAMS_LEADERBOARD_NAME); if (leaderboardName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_LEADERBOARD_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_LEADERBOARD_NAME)); return; } - String raceColumnName = request.getParameter(PARAMS_RACE_COLUMN_NAME); + String raceColumnName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME); if (raceColumnName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_COLUMN_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME)); return; } - String fleetName = request.getParameter(PARAMS_RACE_FLEET_NAME); + String fleetName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_FLEET_NAME); if (fleetName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_FLEET_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_FLEET_NAME)); return; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/CourseJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/CourseJsonExportServlet.java index 0fa05336e45..73335000d8e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/CourseJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/CourseJsonExportServlet.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; @@ -25,31 +26,27 @@ public class CourseJsonExportServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = -6604797426439916738L; - public static final String PARAMS_LEADERBOARD_NAME = "leaderboard"; - public static final String PARAMS_RACE_COLUMN_NAME = "raceColumn"; - public static final String PARAMS_RACE_FLEET_NAME = "fleet"; - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String leaderboardName = request.getParameter(PARAMS_LEADERBOARD_NAME); + String leaderboardName = request.getParameter(RaceLogServletConstants.PARAMS_LEADERBOARD_NAME); if (leaderboardName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_LEADERBOARD_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_LEADERBOARD_NAME)); return; } - String raceColumnName = request.getParameter(PARAMS_RACE_COLUMN_NAME); + String raceColumnName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME); if (raceColumnName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_COLUMN_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME)); return; } - String fleetName = request.getParameter(PARAMS_RACE_FLEET_NAME); + String fleetName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_FLEET_NAME); if (fleetName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_FLEET_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_FLEET_NAME)); return; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarkPositionsJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarkPositionsJsonExportServlet.java index 3055c85677e..35d436e7dca 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarkPositionsJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarkPositionsJsonExportServlet.java @@ -17,6 +17,7 @@ import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; @@ -28,31 +29,27 @@ public class MarkPositionsJsonExportServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = -5489857104922281761L; - public static final String PARAMS_LEADERBOARD_NAME = "leaderboard"; - public static final String PARAMS_RACE_COLUMN_NAME = "raceColumn"; - public static final String PARAMS_RACE_FLEET_NAME = "fleet"; - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String leaderboardName = request.getParameter(PARAMS_LEADERBOARD_NAME); + String leaderboardName = request.getParameter(RaceLogServletConstants.PARAMS_LEADERBOARD_NAME); if (leaderboardName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_LEADERBOARD_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_LEADERBOARD_NAME)); return; } - String raceColumnName = request.getParameter(PARAMS_RACE_COLUMN_NAME); + String raceColumnName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME); if (raceColumnName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_COLUMN_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME)); return; } - String fleetName = request.getParameter(PARAMS_RACE_FLEET_NAME); + String fleetName = request.getParameter(RaceLogServletConstants.PARAMS_RACE_FLEET_NAME); if (fleetName == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, - String.format("Missing parameter '%s'.", PARAMS_RACE_FLEET_NAME)); + String.format("Missing parameter '%s'.", RaceLogServletConstants.PARAMS_RACE_FLEET_NAME)); return; } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java index eac2d253fc3..8e698eb2311 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java @@ -82,8 +82,9 @@ public enum InMemoryDataStore implements DataStore { public CourseArea getCourseArea(Serializable id) { for (EventBase event : eventsById.values()) { for (CourseArea courseArea : getCourseAreas(event)) { - if (courseArea.getId().equals(id)) + if (courseArea.getId().equals(id)) { return courseArea; + } } } return null; @@ -92,8 +93,9 @@ public enum InMemoryDataStore implements DataStore { public boolean hasCourseArea(Serializable id) { for (EventBase event : eventsById.values()) { for (CourseArea courseArea : getCourseAreas(event)) { - if (courseArea.getId().equals(id)) + if (courseArea.getId().equals(id)) { return true; + } } } return false; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index 8818851d501..a384f930212 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -103,7 +103,6 @@ public class OnlineDataManager extends DataManager { } public void loadCourseAreas(final Serializable parentEventId, final LoadClient> client) { - if (dataStore.hasEvent(parentEventId)) { EventBase event = dataStore.getEvent(parentEventId); client.onLoadSucceded(dataStore.getCourseAreas(event)); From 9280d279e5aa3eaf25cc27b2e654ba80461d245e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 17 Jul 2013 16:35:43 +0200 Subject: [PATCH 019/450] added toString() for RaceLogEvent; a first attempt to receive RaceLogEvents as response to the event sending request --- .../domain/racelog/impl/RaceLogEventImpl.java | 5 +++++ .../services/sending/EventSendingService.java | 20 ++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java index fcbdb52e0fe..b51643f3850 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java @@ -51,4 +51,9 @@ public abstract class RaceLogEventImpl implements RaceLogEvent { return passId; } + @Override + public String toString() { + return getClass().getName() + ": createdAt: " + getCreatedAt() + ", logicalTimePoint: " + getTimePoint() + + ", id: " + getId() + ", involvedBoats: " + getInvolvedBoats() + ", passId: " + getPassId(); + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index ab05295515a..165de41e8cc 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -16,10 +16,13 @@ import android.os.Binder; import android.os.Handler; import android.os.IBinder; +import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.AppPreferences; +import com.sap.sailing.racecommittee.app.data.DataManager; +import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.receiver.ConnectivityChangedReceiver; @@ -43,6 +46,7 @@ public class EventSendingService extends Service implements EventSendingListener private Handler handler; private final IBinder mBinder = new EventSendingBinder(); private EventPersistenceManager persistenceManager; + private ReadonlyDataManager dataManager; private boolean isHandlerSet; private EventSendingServiceLogger serviceLogger = new EventSendingServiceLogger() { @@ -100,7 +104,7 @@ public class EventSendingService extends Service implements EventSendingListener * @param race * the race for which the event was created * @param serializedEventAsUrlEncodedJson - * the event serizalized to JSON + * the event serialized to JSON * @return the intent that shall be sent to the EventSendingService */ public static Intent createEventIntent(Context context, ManagedRace race, String serializedEventAsJson) { @@ -132,10 +136,9 @@ public class EventSendingService extends Service implements EventSendingListener public void onCreate() { connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); persistenceManager = new EventPersistenceManager(this); - + dataManager = DataManager.create(this); handler = new Handler(); isHandlerSet = false; - if (persistenceManager.areIntentsDelayed()) { handleDelayedEvents(); } @@ -222,6 +225,17 @@ public class EventSendingService extends Service implements EventSendingListener } lastSuccessfulSend = Calendar.getInstance().getTime(); serviceLogger.onEventSentSuccessful(); + String raceId = intent.getStringExtra(AppConstants.RACE_ID_KEY); + RaceLog raceLog = dataManager.getDataStore().getRace(raceId).getRaceLog(); + if (raceLog != null) { + ExLog.i(TAG, "Successfully retrieved race log for race ID " + raceId); + for (RaceLogEvent eventToAddToRaceLog : eventsToAddToRaceLog) { + raceLog.add(eventToAddToRaceLog); + ExLog.i(TAG, "added event "+eventToAddToRaceLog.toString()+" to client's race log"); + } + } else { + ExLog.w(TAG, "Couldn't retrieve race log for race ID "+raceId); + } } } From f957301ea08da75c75c753f88feee3d48e164bad Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 18 Jul 2013 18:13:21 +0200 Subject: [PATCH 020/450] fixed construction of URL for race log post event --- .../racecommittee/app/services/sending/EventSendingService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index 165de41e8cc..f637afc3ac7 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -111,7 +111,7 @@ public class EventSendingService extends Service implements EventSendingListener String url = String.format("%s/sailingserver/rc/racelog?"+ RaceLogServletConstants.PARAMS_LEADERBOARD_NAME+"=%s&"+ RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME+"=%s&"+ - RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=%s"+ + RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=%s&"+ RaceLogServletConstants.PARAMS_CLIENT_UUID+"=%s", AppPreferences.getServerBaseURL(context), URLEncoder.encode(race.getRaceGroup().getName()), URLEncoder.encode(race.getName()), URLEncoder.encode(race.getFleet().getName()), uuid); From e06da5e4122abd36b152112801f4c58981efbfdb Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 18 Jul 2013 23:53:18 +0200 Subject: [PATCH 021/450] mark race log events transmitted by RaceGroupJsonExportServlet as delivered for the client --- .../sap/sailing/domain/racelog/RaceLog.java | 7 ++++++ .../domain/racelog/impl/RaceLogImpl.java | 14 ++++++++++- .../racelog/impl/RaceLogSerializer.java | 8 +++++-- .../rc/AddEntryToRaceLogJsonPostServlet.java | 6 ++--- .../impl/rc/RaceGroupJsonExportServlet.java | 24 ++++++++++++++----- 5 files changed, 47 insertions(+), 12 deletions(-) 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 a79f1a7a429..a8f9fcb6793 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 @@ -77,4 +77,11 @@ public interface RaceLog extends Track, WithID { * stored, the entire set of all race log events would be delivered to the client once. */ Iterable add(RaceLogEvent event, 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(RaceLogEvent, UUID)}, the fixes returned by this call + * are already considered delivered to the client identified by clientId. + */ + Iterable getRawFixes(UUID clientId); } 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 e34af7f97cd..16a9dd2377b 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 @@ -210,5 +210,17 @@ public class RaceLogImpl extends TrackImpl implements RaceLog { public Iterable getAllListeners() { return this.listeners; } - + + @Override + public Iterable getRawFixes(UUID clientId) { + assertReadLock(); + NavigableSet result = getRawFixes(); + Set edtc = eventsDeliveredToClient.get(clientId); + if (edtc == null) { + edtc = new HashSet(); + eventsDeliveredToClient.put(clientId, edtc); + } + edtc.addAll(result); + 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 e37cde27517..bf847c9e7f5 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 @@ -1,5 +1,7 @@ package com.sap.sailing.server.gateway.serialization.racelog.impl; +import java.util.UUID; + import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -13,9 +15,11 @@ public class RaceLogSerializer implements JsonSerializer { public static final String FIELD_RACELOG_IDENTIFIER = "racelog_id"; private final JsonSerializer itemSerializer; + private final UUID clientUuid; - public RaceLogSerializer(JsonSerializer raceLogEventSerializer) { + public RaceLogSerializer(JsonSerializer raceLogEventSerializer, UUID clientUuid) { this.itemSerializer = raceLogEventSerializer; + this.clientUuid = clientUuid; } @Override @@ -24,7 +28,7 @@ public class RaceLogSerializer implements JsonSerializer { object.lockForRead(); try { JSONArray events = new JSONArray(); - for (RaceLogEvent event : object.getRawFixes()) { + for (RaceLogEvent event : object.getRawFixes(clientUuid)) { events.add(itemSerializer.serialize(event)); } result.put(FIELD_EVENTS, events); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/AddEntryToRaceLogJsonPostServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/AddEntryToRaceLogJsonPostServlet.java index a805c32aabe..d20bdc3d50d 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/AddEntryToRaceLogJsonPostServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/AddEntryToRaceLogJsonPostServlet.java @@ -69,19 +69,19 @@ public class AddEntryToRaceLogJsonPostServlet extends AbstractJsonHttpServlet { Leaderboard leaderboard = service.getLeaderboardByName(leaderboardName); if (leaderboard == null) { - response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such leaderboard found."); + response.sendError(HttpServletResponse.SC_NOT_FOUND, "Leaderboard "+leaderboardName+" not found."); return; } RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); if (raceColumn == null) { - response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such race column found."); + response.sendError(HttpServletResponse.SC_NOT_FOUND, "Race column "+raceColumnName+" not found."); return; } Fleet fleet = raceColumn.getFleetByName(fleetName); if (fleet == null) { - response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such fleet found."); + response.sendError(HttpServletResponse.SC_NOT_FOUND, "Fleet "+fleetName+" not found."); return; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java index 13738990c4d..9137dfc7497 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java @@ -55,8 +55,14 @@ public class RaceGroupJsonExportServlet extends AbstractJsonHttpServlet { response.sendError(HttpServletResponse.SC_NOT_FOUND, "No course area found with given UUID."); return; } - - JsonSerializer serializer = createSerializer(); + String clientUuidAsString = request.getParameter(RaceLogServletConstants.PARAMS_CLIENT_UUID); + final UUID clientUuid; + if (clientUuidAsString == null) { + clientUuid = null; + } else { + clientUuid = UUID.fromString(clientUuidAsString); + } + JsonSerializer serializer = createSerializer(clientUuid); JSONArray result = new JSONArray(); RaceGroupFactory raceGroupFactory = new RaceGroupFactory(); @@ -79,17 +85,23 @@ public class RaceGroupJsonExportServlet extends AbstractJsonHttpServlet { } } - private static JsonSerializer createSerializer() { + private static JsonSerializer createSerializer(UUID clientUuid) { return new RaceGroupJsonSerializer(new BoatClassJsonSerializer(), new CourseAreaJsonSerializer(), new SeriesWithRowsOfRaceGroupSerializer(new SeriesWithRowsJsonSerializer( new RaceRowsOfSeriesWithRowsSerializer(new RaceRowJsonSerializer(new FleetJsonSerializer( - new ColorJsonSerializer()), new RaceCellJsonSerializer(createRaceLogSerializer())))))); + new ColorJsonSerializer()), new RaceCellJsonSerializer(createRaceLogSerializer(clientUuid))))))); } - private static JsonSerializer createRaceLogSerializer() { + /** + * @param clientUuid + * used to tell the race log to which client the race log is delivered so that when the client asks later + * which race log events are new for that client, the race log already knows which events were already + * delivered + */ + private static JsonSerializer createRaceLogSerializer(UUID clientUuid) { return new RaceLogSerializer(RaceLogEventSerializer.create(new CompetitorJsonSerializer(new TeamJsonSerializer( - new PersonJsonSerializer(new NationalityJsonSerializer()))))); + new PersonJsonSerializer(new NationalityJsonSerializer())))), clientUuid); } } From 184d832cec47dcb8e58813c75381305eb1910fbe Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jul 2013 00:04:23 +0200 Subject: [PATCH 022/450] pass along the client UUID to the servlet for marking the events already fetched by that client --- .../sailing/racecommittee/app/data/OnlineDataManager.java | 5 ++++- .../app/services/sending/EventSendingService.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index a384f930212..979f12dd54f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -35,6 +35,7 @@ import com.sap.sailing.racecommittee.app.data.parsers.MarksDataParser; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; +import com.sap.sailing.racecommittee.app.services.sending.EventSendingService; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.coursedata.impl.ControlPointDeserializer; import com.sap.sailing.server.gateway.deserialization.coursedata.impl.CourseDataDeserializer; @@ -148,7 +149,9 @@ public class OnlineDataManager extends DataManager { DataHandler> handler = new ManagedRacesDataHandler(this, client); try { new DataLoader>(context, URI.create(AppPreferences.getServerBaseURL(context) - + "/sailingserver/rc/racegroups?"+RaceLogServletConstants.PARAM_COURSE_AREA_FILTER + "=" + courseAreaId.toString()), parser, handler) + + "/sailingserver/rc/racegroups?"+ + RaceLogServletConstants.PARAM_COURSE_AREA_FILTER + "=" + courseAreaId.toString()+"&"+ + RaceLogServletConstants.PARAMS_CLIENT_UUID + "=" + EventSendingService.uuid), parser, handler) .forceLoad(); } catch (MalformedURLException e) { e.printStackTrace(); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index f637afc3ac7..ff056c46fff 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -85,7 +85,7 @@ public class EventSendingService extends Service implements EventSendingListener /** * a UUID that identifies this client session; can be used, e.g., to let the server identify subsequent requests coming from the same client */ - private final static UUID uuid = UUID.randomUUID(); + public final static UUID uuid = UUID.randomUUID(); public int getDelayedIntentsCount() { return persistenceManager.getEventCount(); From 31750f527b47723eb9e3fdf9b3e84cbdccadfa8f Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jul 2013 14:38:06 +0200 Subject: [PATCH 023/450] fixed typo in identifier --- .../racecommittee/app/ui/fragments/RaceInfoFragment.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java index 54f2b4cfc76..2e6fbaed514 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java @@ -109,11 +109,11 @@ public class RaceInfoFragment extends RaceFragment implements RaceStateChangedLi } } - protected void switchToInfoFragment(RaceFragment choosenFragment) { - ExLog.i(TAG, String.format("Switched to %s fragment for race %s with status %s", choosenFragment.getClass() + protected void switchToInfoFragment(RaceFragment chosenFragment) { + ExLog.i(TAG, String.format("Switched to %s fragment for race %s with status %s", chosenFragment.getClass() .getName(), getRace().getId(), getRace().getStatus())); - this.infoFragment = choosenFragment; + this.infoFragment = chosenFragment; displayInfoFragment(); } From 8c4ffc756f094a03ad486a0f3dc4f3898cbf2de5 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jul 2013 15:21:48 +0200 Subject: [PATCH 024/450] introducing RaceLogEventAuthor with priority to decide precedences in competing multi-device scenarios --- .../impl/DomainObjectFactoryImpl.java | 28 +-- .../sailing/domain/racelog/RaceLogEvent.java | 9 +- .../domain/racelog/RaceLogEventAuthor.java | 25 +++ .../domain/racelog/RaceLogEventFactory.java | 92 ++++----- .../racelog/RaceLogEventRestoreFactory.java | 52 ++--- .../RaceLogCourseAreaChangeEventImpl.java | 5 +- .../RaceLogCourseDesignChangedEventImpl.java | 5 +- .../racelog/impl/RaceLogEventFactoryImpl.java | 191 +++++++++--------- .../domain/racelog/impl/RaceLogEventImpl.java | 12 +- .../impl/RaceLogEventRestoreFactoryImpl.java | 73 +++---- ...ogFinishPositioningConfirmedEventImpl.java | 5 +- .../RaceLogFinishPositioningEventImpl.java | 7 +- ...FinishPositioningListChangedEventImpl.java | 5 +- .../racelog/impl/RaceLogFlagEventImpl.java | 5 +- .../RaceLogGateLineOpeningTimeEventImpl.java | 5 +- .../impl/RaceLogPassChangeEventImpl.java | 7 +- .../impl/RaceLogPathfinderEventImpl.java | 5 +- .../RaceLogProtestStartTimeEventImpl.java | 7 +- .../impl/RaceLogRaceStatusEventImpl.java | 7 +- ...RaceLogStartProcedureChangedEventImpl.java | 7 +- .../impl/RaceLogStartTimeEventImpl.java | 7 +- .../racelog/impl/RaceLogWindFixEventImpl.java | 7 +- .../sap/sailing/domain/test/RaceLogTest.java | 34 ++-- .../test/StoreAndLoadRaceLogEventsTest.java | 18 +- ...tStoringAndRetrievingRaceLogEventData.java | 2 +- ...ingAndRetrievingRaceLogInLeaderboards.java | 28 +-- ...tStoringAndRetrievingRaceLogInRegatta.java | 28 +-- ...ourseDesignChangedEventSerializerTest.java | 2 +- .../racelog/RaceLogEventSerializerTest.java | 26 +-- ...sitioningConfirmedEventSerializerTest.java | 6 +- .../RaceLogWindFixEventSerializerTest.java | 2 +- ...LogCourseAreaChangedEventDeserializer.java | 4 +- ...gCourseDesignChangedEventDeserializer.java | 2 +- ...PositioningConfirmedEventDeserializer.java | 2 +- ...sitioningListChangedEventDeserializer.java | 2 +- .../impl/RaceLogFlagEventDeserializer.java | 2 +- ...gGateLineOpeningTimeEventDeserializer.java | 2 +- .../RaceLogPassChangeEventDeserializer.java | 2 +- .../RaceLogPathFinderEventDeserializer.java | 2 +- ...eLogProtestStartTimeEventDeserializer.java | 4 +- .../RaceLogRaceStatusEventDeserializer.java | 2 +- ...tartProcedureChangedEventDeserializer.java | 2 +- .../RaceLogStartTimeEventDeserializer.java | 4 +- .../impl/RaceLogWindFixEventDeserializer.java | 2 +- .../test/RaceLogReplicationTest.java | 12 +- .../server/test/MasterDataImportTest.java | 20 +- .../server/test/RaceLogInRaceColumnTest.java | 2 +- .../RaceLogOperationalTransformationTest.java | 6 +- .../server/test/WindByRaceLogTest.java | 12 +- .../app/data/OfflineDataManager.java | 8 +- .../ExtremeSailingSeriesStartProcedure.java | 58 +++--- .../impl/GateStartProcedure.java | 62 +++--- .../impl/RRS26StartProcedure.java | 66 +++--- .../app/domain/state/impl/RaceStateImpl.java | 28 +-- 54 files changed, 537 insertions(+), 481 deletions(-) create mode 100755 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventAuthor.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 2b8beef9aea..90b3bd6378d 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 @@ -1065,32 +1065,32 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { private RaceLogEvent loadRaceLogRaceLogWindFixEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Wind wind = loadWind((DBObject) dbObject.get(FieldNames.WIND.name())); - return raceLogEventFactory.createWindFixEvent(createdAt, timePoint, id, competitors, passId, wind); + return raceLogEventFactory.createWindFixEvent(createdAt, author, timePoint, id, competitors, passId, wind); } private RaceLogEvent loadRaceLogRaceLogProtestStartTimeEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { TimePoint protestStartTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_PROTEST_START_TIME); - return raceLogEventFactory.createProtestStartTimeEvent(createdAt, timePoint, id, competitors, passId, protestStartTime); + return raceLogEventFactory.createProtestStartTimeEvent(createdAt, author, timePoint, id, competitors, passId, protestStartTime); } private RaceLogEvent loadRaceLogStartProcedureChangedEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { StartProcedureType type = StartProcedureType.valueOf(dbObject.get(FieldNames.RACE_LOG_START_PROCEDURE_TYPE.name()).toString()); - return raceLogEventFactory.createStartProcedureChangedEvent(createdAt, timePoint, id, competitors, passId, type); + return raceLogEventFactory.createStartProcedureChangedEvent(createdAt, author, timePoint, id, competitors, passId, type); } private RaceLogEvent loadRaceLogGateLineOpeningTimeEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Number gateLineOpeningTime = (Number) dbObject.get(FieldNames.RACE_LOG_GATE_LINE_OPENING_TIME.name()); - return raceLogEventFactory.createGateLineOpeningTimeEvent(createdAt, timePoint, id, competitors, passId, - gateLineOpeningTime == null ? null : gateLineOpeningTime.longValue()); + return raceLogEventFactory.createGateLineOpeningTimeEvent(createdAt, author, timePoint, id, competitors, + passId, gateLineOpeningTime == null ? null : gateLineOpeningTime.longValue()); } private RaceLogEvent loadRaceLogPathfinderEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { String pathfinderId = dbObject.get(FieldNames.RACE_LOG_PATHFINDER_ID.name()).toString(); - return raceLogEventFactory.createPathfinderEvent(createdAt, timePoint, id, competitors, passId, pathfinderId); + return raceLogEventFactory.createPathfinderEvent(createdAt, author, timePoint, id, competitors, passId, pathfinderId); } private RaceLogEvent loadRaceLogFinishPositioningConfirmedEvent(TimePoint createdAt, TimePoint timePoint, @@ -1103,7 +1103,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { positionedCompetitors = loadPositionedCompetitors(dbPositionedCompetitorList); } - return raceLogEventFactory.createFinishPositioningConfirmedEvent(createdAt, timePoint, id, competitors, passId, positionedCompetitors); + return raceLogEventFactory.createFinishPositioningConfirmedEvent(createdAt, author, timePoint, id, competitors, passId, positionedCompetitors); } private RaceLogEvent loadRaceLogFinishPositioningListChangedEvent(TimePoint createdAt, TimePoint timePoint, @@ -1111,23 +1111,23 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { BasicDBList dbPositionedCompetitorList = (BasicDBList) dbObject.get(FieldNames.RACE_LOG_POSITIONED_COMPETITORS.name()); List> positionedCompetitors = loadPositionedCompetitors(dbPositionedCompetitorList); - return raceLogEventFactory.createFinishPositioningListChangedEvent(createdAt, timePoint, id, competitors, passId, positionedCompetitors); + return raceLogEventFactory.createFinishPositioningListChangedEvent(createdAt, author, timePoint, id, competitors, passId, positionedCompetitors); } private RaceLogEvent loadRaceLogPassChangeEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors) { - return raceLogEventFactory.createPassChangeEvent(createdAt, timePoint, id, competitors, passId); + return raceLogEventFactory.createPassChangeEvent(createdAt, author, timePoint, id, competitors, passId); } private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, TimePoint timePoint, 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, timePoint, id, competitors, passId, courseData); + return raceLogEventFactory.createCourseDesignChangedEvent(createdAt, author, timePoint, id, competitors, passId, courseData); } private RaceLogCourseAreaChangedEvent loadRaceLogCourseAreaChangedEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Serializable courseAreaId = (Serializable) dbObject.get(FieldNames.COURSE_AREA_ID.name()); - return raceLogEventFactory.createCourseAreaChangedEvent(createdAt, timePoint, id, competitors, passId, courseAreaId); + return raceLogEventFactory.createCourseAreaChangedEvent(createdAt, author, timePoint, id, competitors, passId, courseAreaId); } private List> loadPositionedCompetitors(BasicDBList dbPositionedCompetitorList) { @@ -1175,17 +1175,17 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return null; } - return raceLogEventFactory.createFlagEvent(createdAt, timePoint, id, competitors, passId, upperFlag, lowerFlag, displayed); + return raceLogEventFactory.createFlagEvent(createdAt, author, timePoint, id, competitors, passId, upperFlag, lowerFlag, displayed); } private RaceLogStartTimeEvent loadRaceLogStartTimeEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { TimePoint startTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_EVENT_START_TIME); - return raceLogEventFactory.createStartTimeEvent(createdAt, timePoint, id, competitors, passId, startTime); + return raceLogEventFactory.createStartTimeEvent(createdAt, author, timePoint, id, competitors, passId, startTime); } private RaceLogRaceStatusEvent loadRaceLogRaceStatusEvent(TimePoint createdAt, TimePoint timePoint, 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, timePoint, id, competitors, passId, nextStatus); + return raceLogEventFactory.createRaceStatusEvent(createdAt, author, timePoint, id, competitors, passId, nextStatus); } private CourseBase loadCourseData(BasicDBList dbCourseList, String courseName) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEvent.java index 1a90d3d51c8..fc94b6a976b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEvent.java @@ -36,7 +36,12 @@ import com.sap.sailing.domain.common.WithID; * * To ensure an ordering there should be no two {@link RaceLogEvent}s returning the same point in time on * {@link RaceLogEvent#getTimePoint()} per pass. - *

+ *

+ * + * 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 + * 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 RaceLogEvent extends Timed, WithID { @@ -68,4 +73,6 @@ public interface RaceLogEvent extends Timed, WithID { * Visitor pattern to implement certain {@link RaceLogEvent} subclass specific behavior. */ void accept(RaceLogEventVisitor visitor); + + RaceLogEventAuthor getAuthor(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventAuthor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventAuthor.java new file mode 100755 index 00000000000..69ed4641013 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventAuthor.java @@ -0,0 +1,25 @@ +package com.sap.sailing.domain.racelog; + +import com.sap.sailing.domain.common.Named; + +/** + * Multiple devices may concurrently post to a single {@link RaceLog}. 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. + * + * @author Axel Uhl (d043530) + * + */ +public interface RaceLogEventAuthor extends Named { + + /** + * A lesser number represents a higher priority. Suggested priority levels: + *

    + *
  1. Start Vessel
  2. + *
  3. Finish Vessel
  4. + *
  5. Short Control
  6. + *
+ */ + int getPriority(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java index a0b8c3860b3..a3de5bce368 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java @@ -17,77 +17,77 @@ import com.sap.sailing.domain.tracking.Wind; public interface RaceLogEventFactory { RaceLogEventFactory INSTANCE = new RaceLogEventFactoryImpl(); - RaceLogFlagEvent createFlagEvent(TimePoint timePoint, Serializable id, List involvedBoats, int passId, - Flags upperFlag, Flags lowerFlag, boolean isDisplayed); + RaceLogFlagEvent createFlagEvent(TimePoint timePoint, RaceLogEventAuthor author, Serializable id, List involvedBoats, + int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed); - RaceLogFlagEvent createFlagEvent(TimePoint timePoint, int passId, Flags upperFlag, Flags lowerFlag, - boolean isDisplayed); + RaceLogFlagEvent createFlagEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, Flags upperFlag, + Flags lowerFlag, boolean isDisplayed); - RaceLogStartTimeEvent createStartTimeEvent(TimePoint timePoint, Serializable id, List involvedBoats, - int passId, TimePoint startTime); + RaceLogStartTimeEvent createStartTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, Serializable id, + List involvedBoats, int passId, TimePoint startTime); - RaceLogStartTimeEvent createStartTimeEvent(TimePoint timePoint, int passId, TimePoint startTime); + RaceLogStartTimeEvent createStartTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, TimePoint startTime); - RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint timePoint, Serializable id, List competitors, - int passId, RaceLogRaceStatus nextStatus); + RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint timePoint, RaceLogEventAuthor author, Serializable id, + List competitors, int passId, RaceLogRaceStatus nextStatus); - RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint timePoint, int passId, RaceLogRaceStatus nextStatus); + RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, RaceLogRaceStatus nextStatus); - RaceLogPassChangeEvent createPassChangeEvent(TimePoint timePoint, Serializable id, List competitors, - int passId); + RaceLogPassChangeEvent createPassChangeEvent(TimePoint timePoint, RaceLogEventAuthor author, Serializable id, + List competitors, int passId); - RaceLogPassChangeEvent createPassChangeEvent(TimePoint timePoint, int passId); + RaceLogPassChangeEvent createPassChangeEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId); - RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, Serializable courseAreaId); + RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, Serializable courseAreaId); - RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint timePoint, int passId, - Serializable courseAreaId); + RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, Serializable courseAreaId); - RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, CourseBase courseData); + RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, CourseBase courseData); - RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, int passId, - CourseBase courseData); + RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, CourseBase courseData); RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint timePoint, - Serializable id, List competitors, int passId, - List> positionedCompetitors); + RaceLogEventAuthor author, Serializable id, List competitors, + int passId, List> positionedCompetitors); - RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint timePoint, int passId, - List> positionedCompetitors); + RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, List> positionedCompetitors); - RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, List> positionedCompetitors); + RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, List> positionedCompetitors); - RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint timePoint, int passId, - List> positionedCompetitors); + RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, List> positionedCompetitors); - RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, Serializable id, List competitors, - int passId, String pathfinderId); + RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, RaceLogEventAuthor author, Serializable id, + List competitors, int passId, String pathfinderId); - RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, int passId, String pathfinderId); + RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, String pathfinderId); - RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, Long gateLineOpeningTimeInMillis); + RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, Long gateLineOpeningTimeInMillis); - RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, int passId, - Long gateLineOpeningTimeInMillis); + RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, Long gateLineOpeningTimeInMillis); - RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, StartProcedureType type); + RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, StartProcedureType type); - RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, int passId, - StartProcedureType type); + RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, StartProcedureType type); - RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, TimePoint protestStartTime); + RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, TimePoint protestStartTime); - RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint timePoint, int passId, TimePoint protestStartTime); + RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, TimePoint protestStartTime); - RaceLogWindFixEvent createWindFixEvent(TimePoint eventTime, int currentPassId, Wind wind); + RaceLogWindFixEvent createWindFixEvent(TimePoint eventTime, RaceLogEventAuthor author, int currentPassId, Wind wind); - RaceLogWindFixEvent createWindFixEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, Wind wind); + RaceLogWindFixEvent createWindFixEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, Wind wind); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java index 9094f945cf1..b8fe469e3ff 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java @@ -17,44 +17,44 @@ import com.sap.sailing.domain.tracking.Wind; public interface RaceLogEventRestoreFactory extends RaceLogEventFactory { RaceLogEventRestoreFactory INSTANCE = new RaceLogEventRestoreFactoryImpl(); - RaceLogFlagEvent createFlagEvent(TimePoint createdAt, TimePoint logicalTimePoint, Serializable id, - List involvedBoats, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed); + RaceLogFlagEvent createFlagEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + Serializable id, List involvedBoats, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed); - RaceLogStartTimeEvent createStartTimeEvent(TimePoint createdAt, TimePoint logicalTimePoint, Serializable id, - List involvedBoats, int passId, TimePoint startTime); + RaceLogStartTimeEvent createStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + Serializable id, List involvedBoats, int passId, TimePoint startTime); - RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint createdAt, TimePoint logicalTimePoint, Serializable id, - List competitors, int passId, RaceLogRaceStatus nextStatus); + RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + Serializable id, List competitors, int passId, RaceLogRaceStatus nextStatus); - RaceLogPassChangeEvent createPassChangeEvent(TimePoint createdAt, TimePoint logicalTimePoint, Serializable id, - List competitors, int passId); + RaceLogPassChangeEvent createPassChangeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + Serializable id, List competitors, int passId); - RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint createdAt, TimePoint logicalTimePoint, - Serializable id, List competitors, int passId, Serializable courseAreaId); + RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, List competitors, int passId, Serializable courseAreaId); - RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint createdAt, TimePoint logicalTimePoint, - Serializable id, List competitors, int passId, CourseBase courseData); + RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CourseBase courseData); RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint createdAt, - TimePoint logicalTimePoint, Serializable id, List competitors, int passId, - List> positionedCompetitors); + RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, + int passId, List> positionedCompetitors); RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint createdAt, - TimePoint logicalTimePoint, Serializable id, List competitors, int passId, - List> positionedCompetitors); + RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, + int passId, List> positionedCompetitors); - RaceLogPathfinderEvent createPathfinderEvent(TimePoint createdAt, TimePoint logicalTimePoint, Serializable id, - List competitors, int passId, String pathfinderId); + RaceLogPathfinderEvent createPathfinderEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + Serializable id, List competitors, int passId, String pathfinderId); - RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, TimePoint logicalTimePoint, - Serializable id, List competitors, int passId, Long gateLineOpeningTime); + RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, List competitors, int passId, Long gateLineOpeningTime); - RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, TimePoint timePoint, - Serializable id, List competitors, int passId, StartProcedureType type); + RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, Serializable id, List competitors, int passId, StartProcedureType type); - RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint createdAt, TimePoint timePoint, - Serializable id, List competitors, int passId, TimePoint protestStartTime); + RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, Serializable id, List competitors, int passId, TimePoint protestStartTime); - RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, - List competitors, Integer passId, Wind wind); + RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, + Serializable id, List competitors, Integer passId, Wind wind); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java index a1ca3cd9eb8..8d987d89efb 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseAreaChangeEventImpl.java @@ -6,6 +6,7 @@ import java.util.List; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; public class RaceLogCourseAreaChangeEventImpl extends RaceLogEventImpl implements @@ -15,8 +16,8 @@ RaceLogCourseAreaChangedEvent { private final Serializable courseAreaId; public RaceLogCourseAreaChangeEventImpl(TimePoint createdAt, - TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Serializable courseAreaId) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); + RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Serializable courseAreaId) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.courseAreaId = courseAreaId; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java index 1ea19b730db..7448d221283 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogCourseDesignChangedEventImpl.java @@ -7,6 +7,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; public class RaceLogCourseDesignChangedEventImpl extends RaceLogEventImpl implements RaceLogCourseDesignChangedEvent { @@ -15,8 +16,8 @@ public class RaceLogCourseDesignChangedEventImpl extends RaceLogEventImpl implem private final CourseBase courseDesign; public RaceLogCourseDesignChangedEventImpl(TimePoint createdAt, - TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, CourseBase courseDesign) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); + RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, CourseBase courseDesign) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.courseDesign = courseDesign; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java index 3bb354693e4..5cdd0c97fd9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java @@ -16,6 +16,7 @@ import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.StartProcedureType; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; @@ -32,172 +33,172 @@ import com.sap.sailing.domain.tracking.Wind; public class RaceLogEventFactoryImpl implements RaceLogEventFactory { @Override - public RaceLogFlagEvent createFlagEvent(TimePoint timePoint, Serializable id, List involvedBoats, - int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed) { - return new RaceLogFlagEventImpl(MillisecondsTimePoint.now(), timePoint, id, involvedBoats, passId, upperFlag, + public RaceLogFlagEvent createFlagEvent(TimePoint timePoint, RaceLogEventAuthor author, Serializable id, + List involvedBoats, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed) { + return new RaceLogFlagEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, involvedBoats, passId, + upperFlag, lowerFlag, isDisplayed); + } + + @Override + public RaceLogFlagEvent createFlagEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, Flags upperFlag, + Flags lowerFlag, boolean isDisplayed) { + return createFlagEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId, upperFlag, lowerFlag, isDisplayed); } @Override - public RaceLogFlagEvent createFlagEvent(TimePoint timePoint, int passId, Flags upperFlag, Flags lowerFlag, - boolean isDisplayed) { - return createFlagEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, upperFlag, lowerFlag, - isDisplayed); + public RaceLogStartTimeEvent createStartTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List involvedBoats, int passId, TimePoint startTime) { + return new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, involvedBoats, + passId, startTime); } @Override - public RaceLogStartTimeEvent createStartTimeEvent(TimePoint timePoint, Serializable id, - List involvedBoats, int passId, TimePoint startTime) { - return new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), timePoint, id, involvedBoats, passId, - startTime); + public RaceLogStartTimeEvent createStartTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, TimePoint startTime) { + return createStartTimeEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId, startTime); } @Override - public RaceLogStartTimeEvent createStartTimeEvent(TimePoint timePoint, int passId, TimePoint startTime) { - return createStartTimeEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, startTime); + public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, RaceLogRaceStatus nextStatus) { + return new RaceLogRaceStatusEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, competitors, + passId, nextStatus); } @Override - public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, RaceLogRaceStatus nextStatus) { - return new RaceLogRaceStatusEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, passId, - nextStatus); + public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, RaceLogRaceStatus nextStatus) { + return createRaceStatusEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId, nextStatus); } @Override - public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint timePoint, int passId, RaceLogRaceStatus nextStatus) { - return createRaceStatusEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, nextStatus); + public RaceLogPassChangeEvent createPassChangeEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId) { + return new RaceLogPassChangeEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, competitors, passId); } @Override - public RaceLogPassChangeEvent createPassChangeEvent(TimePoint timePoint, Serializable id, - List competitors, int passId) { - return new RaceLogPassChangeEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, passId); + public RaceLogPassChangeEvent createPassChangeEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId) { + return createPassChangeEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId); } @Override - public RaceLogPassChangeEvent createPassChangeEvent(TimePoint timePoint, int passId) { - return createPassChangeEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId); + public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, Serializable courseAreaId) { + return new RaceLogCourseAreaChangeEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, competitors, + passId, courseAreaId); } @Override - public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, Serializable courseAreaId) { - return new RaceLogCourseAreaChangeEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, passId, - courseAreaId); + public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, Serializable courseAreaId) { + return createCourseAreaChangedEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), + passId, courseAreaId); } @Override - public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint timePoint, int passId, - Serializable courseAreaId) { - return createCourseAreaChangedEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, - courseAreaId); + public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, CourseBase courseData) { + return new RaceLogCourseDesignChangedEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, competitors, + passId, courseData); } @Override - public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, CourseBase courseData) { - return new RaceLogCourseDesignChangedEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, passId, - courseData); - } - - @Override - public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, int passId, - CourseBase courseData) { - return createCourseDesignChangedEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, - courseData); - } - - @Override - public RaceLogFinishPositioningListChangedEventImpl createFinishPositioningListChangedEvent(TimePoint timePoint, - Serializable id, List competitors, int passId, - List> positionedCompetitors) { - return new RaceLogFinishPositioningListChangedEventImpl(MillisecondsTimePoint.now(), timePoint, id, - competitors, passId, positionedCompetitors); + public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, CourseBase courseData) { + return createCourseDesignChangedEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), + passId, courseData); } @Override public RaceLogFinishPositioningListChangedEventImpl createFinishPositioningListChangedEvent(TimePoint timePoint, + RaceLogEventAuthor author, Serializable id, List competitors, int passId, List> positionedCompetitors) { - return createFinishPositioningListChangedEvent(timePoint, UUID.randomUUID(), new ArrayList(), - passId, positionedCompetitors); + return new RaceLogFinishPositioningListChangedEventImpl(MillisecondsTimePoint.now(), author, timePoint, + id, competitors, passId, positionedCompetitors); + } + + @Override + public RaceLogFinishPositioningListChangedEventImpl createFinishPositioningListChangedEvent(TimePoint timePoint, + RaceLogEventAuthor author, int passId, List> positionedCompetitors) { + return createFinishPositioningListChangedEvent(timePoint, author, UUID.randomUUID(), + new ArrayList(), passId, positionedCompetitors); } @Override public RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint timePoint, - Serializable id, List competitors, int passId, List> positionedCompetitors) { - return new RaceLogFinishPositioningConfirmedEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, - passId, positionedCompetitors); + RaceLogEventAuthor author, Serializable id, List competitors, int passId, List> positionedCompetitors) { + return new RaceLogFinishPositioningConfirmedEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, + competitors, passId, positionedCompetitors); } @Override - public RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint timePoint, int passId, - List> positionedCompetitors) { - return createFinishPositioningConfirmedEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, positionedCompetitors); + public RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, List> positionedCompetitors) { + return createFinishPositioningConfirmedEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId, positionedCompetitors); } @Override - public RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, String pathfinderId) { - return new RaceLogPathfinderEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, passId, - pathfinderId); + public RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, String pathfinderId) { + return new RaceLogPathfinderEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, competitors, + passId, pathfinderId); } @Override - public RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, int passId, String pathfinderId) { - return createPathfinderEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, pathfinderId); + public RaceLogPathfinderEvent createPathfinderEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, String pathfinderId) { + return createPathfinderEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId, pathfinderId); } @Override - public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, Long gateLineOpeningTimeInMillis) { - return new RaceLogGateLineOpeningTimeEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, passId, - gateLineOpeningTimeInMillis); + public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, Long gateLineOpeningTimeInMillis) { + return new RaceLogGateLineOpeningTimeEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, competitors, + passId, gateLineOpeningTimeInMillis); } @Override - public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, int passId, - Long gateLineOpeningTimeInMillis) { - return createGateLineOpeningTimeEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, - gateLineOpeningTimeInMillis); + public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, Long gateLineOpeningTimeInMillis) { + return createGateLineOpeningTimeEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), + passId, gateLineOpeningTimeInMillis); } @Override - public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, StartProcedureType type) { - return new RaceLogStartProcedureChangedEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, - passId, type); + public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, StartProcedureType type) { + return new RaceLogStartProcedureChangedEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, + competitors, passId, type); } @Override - public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, int passId, - StartProcedureType type) { - return createStartProcedureChangedEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, type); + public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, StartProcedureType type) { + return createStartProcedureChangedEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId, type); } @Override - public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint timePoint, Serializable id, - List competitors, int passId, TimePoint protestStartTime) { - return new RaceLogProtestStartTimeEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, + public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, + Serializable id, List competitors, int passId, TimePoint protestStartTime) { + return new RaceLogProtestStartTimeEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, + competitors, passId, protestStartTime); + } + + @Override + public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, + int passId, TimePoint protestStartTime) { + return createProtestStartTimeEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId, protestStartTime); } @Override - public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint timePoint, int passId, - TimePoint protestStartTime) { - return createProtestStartTimeEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, - protestStartTime); + public RaceLogWindFixEvent createWindFixEvent(TimePoint timePoint, RaceLogEventAuthor author, int passId, Wind wind) { + return createWindFixEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId, wind); } @Override - public RaceLogWindFixEvent createWindFixEvent(TimePoint timePoint, int passId, Wind wind) { - return createWindFixEvent(timePoint, UUID.randomUUID(), new ArrayList(), passId, wind); - } - - @Override - public RaceLogWindFixEvent createWindFixEvent(TimePoint timePoint, Serializable id, List competitors, - int passId, Wind wind) { - return new RaceLogWindFixEventImpl(MillisecondsTimePoint.now(), timePoint, id, competitors, passId, wind); + public RaceLogWindFixEvent createWindFixEvent(TimePoint timePoint, RaceLogEventAuthor author, Serializable id, + List competitors, int passId, Wind wind) { + return new RaceLogWindFixEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, competitors, passId, wind); } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java index b51643f3850..424b454c672 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java @@ -6,6 +6,7 @@ import java.util.List; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; public abstract class RaceLogEventImpl implements RaceLogEvent { @@ -16,10 +17,12 @@ public abstract class RaceLogEventImpl implements RaceLogEvent { private final Serializable id; private final List involvedBoats; private final int passId; + private final RaceLogEventAuthor author; - public RaceLogEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, - List pInvolvedBoats, int pPassId) { + public RaceLogEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + Serializable pId, List pInvolvedBoats, int pPassId) { this.createdAt = createdAt; + this.author = author; this.logicalTimePoint = pTimePoint; this.id = pId; this.involvedBoats = pInvolvedBoats; @@ -50,6 +53,11 @@ public abstract class RaceLogEventImpl implements RaceLogEvent { public int getPassId() { return passId; } + + @Override + public RaceLogEventAuthor getAuthor() { + return author; + } @Override public String toString() { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java index 3f793d6037d..c6a36a51ab8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java @@ -13,6 +13,7 @@ import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.StartProcedureType; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventRestoreFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; @@ -30,81 +31,81 @@ import com.sap.sailing.domain.tracking.Wind; public class RaceLogEventRestoreFactoryImpl extends RaceLogEventFactoryImpl implements RaceLogEventRestoreFactory { @Override - public RaceLogFlagEvent createFlagEvent(TimePoint createdAt, TimePoint logicalTimePoint, Serializable id, - List involvedBoats, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed) { - return new RaceLogFlagEventImpl(createdAt, logicalTimePoint, id, involvedBoats, passId, upperFlag, lowerFlag, isDisplayed); + public RaceLogFlagEvent createFlagEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + Serializable id, List involvedBoats, int passId, Flags upperFlag, Flags lowerFlag, boolean isDisplayed) { + return new RaceLogFlagEventImpl(createdAt, author, logicalTimePoint, id, involvedBoats, passId, upperFlag, lowerFlag, isDisplayed); } @Override - public RaceLogStartTimeEvent createStartTimeEvent(TimePoint createdAt, TimePoint logicalTimePoint, Serializable id, - List involvedBoats, int passId, TimePoint startTime) { - return new RaceLogStartTimeEventImpl(createdAt, logicalTimePoint, id, involvedBoats, passId, startTime); + public RaceLogStartTimeEvent createStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint logicalTimePoint, + Serializable id, List involvedBoats, int passId, TimePoint startTime) { + return new RaceLogStartTimeEventImpl(createdAt, author, logicalTimePoint, id, involvedBoats, passId, startTime); } @Override - public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint createdAt, TimePoint logicalTimePoint, - Serializable id, List competitors, int passId, RaceLogRaceStatus nextStatus) { - return new RaceLogRaceStatusEventImpl(createdAt, logicalTimePoint, id, competitors, passId, nextStatus); + public RaceLogRaceStatusEvent createRaceStatusEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, List competitors, int passId, RaceLogRaceStatus nextStatus) { + return new RaceLogRaceStatusEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, nextStatus); } @Override - public RaceLogPassChangeEvent createPassChangeEvent(TimePoint createdAt, TimePoint logicalTimePoint, - Serializable id, List competitors, int passId) { - return new RaceLogPassChangeEventImpl(createdAt, logicalTimePoint, id, competitors, passId); + public RaceLogPassChangeEvent createPassChangeEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, List competitors, int passId) { + return new RaceLogPassChangeEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId); } @Override - public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint createdAt, TimePoint logicalTimePoint, - Serializable id, List competitors, int passId, Serializable courseAreaId) { - return new RaceLogCourseAreaChangeEventImpl(createdAt, logicalTimePoint, id, competitors, passId, courseAreaId); + public RaceLogCourseAreaChangedEvent createCourseAreaChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, List competitors, int passId, Serializable courseAreaId) { + return new RaceLogCourseAreaChangeEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, courseAreaId); } @Override public RaceLogCourseDesignChangedEvent createCourseDesignChangedEvent(TimePoint createdAt, - TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CourseBase courseData) { - return new RaceLogCourseDesignChangedEventImpl(createdAt, logicalTimePoint, id, competitors, passId, courseData); + RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, CourseBase courseData) { + return new RaceLogCourseDesignChangedEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, courseData); } @Override public RaceLogFinishPositioningListChangedEvent createFinishPositioningListChangedEvent(TimePoint createdAt, - TimePoint logicalTimePoint, Serializable id, List competitors, int passId, List> positionedCompetitors) { - return new RaceLogFinishPositioningListChangedEventImpl(createdAt, logicalTimePoint, id, competitors, passId, positionedCompetitors); + RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, List> positionedCompetitors) { + return new RaceLogFinishPositioningListChangedEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, positionedCompetitors); } @Override public RaceLogFinishPositioningConfirmedEvent createFinishPositioningConfirmedEvent(TimePoint createdAt, - TimePoint logicalTimePoint, Serializable id, List competitors, int passId, List> positionedCompetitors) { - return new RaceLogFinishPositioningConfirmedEventImpl(createdAt, logicalTimePoint, id, competitors, passId, positionedCompetitors); + RaceLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, List competitors, int passId, List> positionedCompetitors) { + return new RaceLogFinishPositioningConfirmedEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, positionedCompetitors); } @Override - public RaceLogPathfinderEvent createPathfinderEvent(TimePoint createdAt, TimePoint logicalTimePoint, - Serializable id, List competitors, int passId, String pathfinderId) { - return new RaceLogPathfinderEventImpl(createdAt, logicalTimePoint, id, competitors, passId, pathfinderId); + public RaceLogPathfinderEvent createPathfinderEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, List competitors, int passId, String pathfinderId) { + return new RaceLogPathfinderEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, pathfinderId); } @Override - public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, TimePoint logicalTimePoint, - Serializable id, List competitors, int passId, Long gateLineOpeningTime) { - return new RaceLogGateLineOpeningTimeEventImpl(createdAt, logicalTimePoint, id, competitors, passId, gateLineOpeningTime); + public RaceLogGateLineOpeningTimeEvent createGateLineOpeningTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint logicalTimePoint, Serializable id, List competitors, int passId, Long gateLineOpeningTime) { + return new RaceLogGateLineOpeningTimeEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, gateLineOpeningTime); } @Override - public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, TimePoint timePoint, - Serializable id, List competitors, int passId, StartProcedureType type) { - return new RaceLogStartProcedureChangedEventImpl(createdAt, timePoint, id, competitors, passId, type); + public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, Serializable id, List competitors, int passId, StartProcedureType type) { + return new RaceLogStartProcedureChangedEventImpl(createdAt, author, timePoint, id, competitors, passId, type); } @Override - public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint createdAt, TimePoint timePoint, - Serializable id, List competitors, int passId, TimePoint protestStartTime) { - return new RaceLogProtestStartTimeEventImpl(createdAt, timePoint, id, competitors, passId, protestStartTime); + public RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, Serializable id, List competitors, int passId, TimePoint protestStartTime) { + return new RaceLogProtestStartTimeEventImpl(createdAt, author, timePoint, id, competitors, passId, protestStartTime); } @Override - public RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, - List competitors, Integer passId, Wind wind) { - return new RaceLogWindFixEventImpl(createdAt, timePoint, id, competitors, passId, wind); + public RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, + Serializable id, List competitors, Integer passId, Wind wind) { + return new RaceLogWindFixEventImpl(createdAt, author, timePoint, id, competitors, passId, wind); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningConfirmedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningConfirmedEventImpl.java index b57b8a28e23..e65646bc2b4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningConfirmedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningConfirmedEventImpl.java @@ -7,6 +7,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; @@ -15,8 +16,8 @@ public class RaceLogFinishPositioningConfirmedEventImpl extends RaceLogFinishPos private static final long serialVersionUID = 5028181339200048499L; public RaceLogFinishPositioningConfirmedEventImpl(TimePoint createdAt, - TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, List> positionedCompetitors) { - super(createdAt, pTimePoint, pId, pCompetitors, pPassId, positionedCompetitors); + RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, List> positionedCompetitors) { + super(createdAt, author, pTimePoint, pId, pCompetitors, pPassId, positionedCompetitors); } @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java index 0d7d38dba65..d2b1dfab096 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningEventImpl.java @@ -7,6 +7,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningEvent; public abstract class RaceLogFinishPositioningEventImpl extends RaceLogEventImpl implements RaceLogFinishPositioningEvent { @@ -15,9 +16,9 @@ public abstract class RaceLogFinishPositioningEventImpl extends RaceLogEventImpl private final List> positionedCompetitors; - public RaceLogFinishPositioningEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, - List pInvolvedBoats, int pPassId, List> positionedCompetitors) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); + public RaceLogFinishPositioningEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + Serializable pId, List pInvolvedBoats, int pPassId, List> positionedCompetitors) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.positionedCompetitors = positionedCompetitors; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningListChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningListChangedEventImpl.java index 266a3d72e9f..43e1ba1622c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningListChangedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFinishPositioningListChangedEventImpl.java @@ -7,6 +7,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; @@ -15,8 +16,8 @@ public class RaceLogFinishPositioningListChangedEventImpl extends RaceLogFinishP private static final long serialVersionUID = -8167472925561954739L; public RaceLogFinishPositioningListChangedEventImpl(TimePoint createdAt, - TimePoint pTimePoint, Serializable pId, List competitors, int pPassId, List> positionedCompetitors) { - super(createdAt, pTimePoint, pId, competitors, pPassId, positionedCompetitors); + RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List competitors, int pPassId, List> positionedCompetitors) { + super(createdAt, author, pTimePoint, pId, competitors, pPassId, positionedCompetitors); } @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java index 4efe443caeb..5e4a471092d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogFlagEventImpl.java @@ -6,6 +6,7 @@ import java.util.List; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.Flags; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; @@ -16,8 +17,8 @@ public class RaceLogFlagEventImpl extends RaceLogEventImpl implements RaceLogFla private final Flags lowerFlag; private final boolean isDisplayed; - public RaceLogFlagEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Flags pUpperFlag, Flags pLowerFlag, boolean pIsDisplayed) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); + public RaceLogFlagEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, Flags pUpperFlag, Flags pLowerFlag, boolean pIsDisplayed) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.upperFlag = pUpperFlag; this.lowerFlag = pLowerFlag; this.isDisplayed = pIsDisplayed; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java index a524ac95c51..e2901967842 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogGateLineOpeningTimeEventImpl.java @@ -5,6 +5,7 @@ import java.util.List; 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.RaceLogGateLineOpeningTimeEvent; @@ -14,8 +15,8 @@ public class RaceLogGateLineOpeningTimeEventImpl extends RaceLogEventImpl implem private final Long gateLineOpeningTime; public RaceLogGateLineOpeningTimeEventImpl(TimePoint createdAt, - TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, Long gateLineOpeningTime) { - super(createdAt, pTimePoint, pId, pCompetitors, pPassId); + RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, Long gateLineOpeningTime) { + super(createdAt, author, pTimePoint, pId, pCompetitors, pPassId); this.gateLineOpeningTime = gateLineOpeningTime; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPassChangeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPassChangeEventImpl.java index d6a211e079b..5c7e77dd0a4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPassChangeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPassChangeEventImpl.java @@ -5,15 +5,16 @@ import java.util.List; 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.RaceLogPassChangeEvent; public class RaceLogPassChangeEventImpl extends RaceLogEventImpl implements RaceLogPassChangeEvent { private static final long serialVersionUID = -3737606977320640630L; - public RaceLogPassChangeEventImpl(TimePoint createdAt, TimePoint pTimePoint, - Serializable pId, List pInvolvedBoats, int pPassId) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); + public RaceLogPassChangeEventImpl(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); } @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java index 5001b7ccc29..f8227d03b7b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogPathfinderEventImpl.java @@ -5,6 +5,7 @@ import java.util.List; 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.RaceLogPathfinderEvent; @@ -14,8 +15,8 @@ public class RaceLogPathfinderEventImpl extends RaceLogEventImpl implements Race private final String pathfinderId; public RaceLogPathfinderEventImpl(TimePoint createdAt, - TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, String pathfinderId) { - super(createdAt, pTimePoint, pId, pCompetitors, pPassId); + RaceLogEventAuthor author, TimePoint pTimePoint, Serializable pId, List pCompetitors, int pPassId, String pathfinderId) { + super(createdAt, author, pTimePoint, pId, pCompetitors, pPassId); this.pathfinderId = pathfinderId; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java index b0bb3d5a283..1ad2c53d865 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogProtestStartTimeEventImpl.java @@ -5,6 +5,7 @@ import java.util.List; 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.RaceLogProtestStartTimeEvent; @@ -13,9 +14,9 @@ public class RaceLogProtestStartTimeEventImpl extends RaceLogEventImpl implement private final TimePoint protestStartTime; - public RaceLogProtestStartTimeEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, - List pInvolvedBoats, int pPassId, TimePoint protestStartTime) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); + public RaceLogProtestStartTimeEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + Serializable pId, List pInvolvedBoats, int pPassId, TimePoint protestStartTime) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.protestStartTime = protestStartTime; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java index 0c80ff46ed6..7c9ddaa7113 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogRaceStatusEventImpl.java @@ -6,6 +6,7 @@ import java.util.List; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; @@ -14,9 +15,9 @@ public class RaceLogRaceStatusEventImpl extends RaceLogEventImpl implements Race private final RaceLogRaceStatus nextStatus; - public RaceLogRaceStatusEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, - List pInvolvedBoats, int pPassId, RaceLogRaceStatus nextStatus) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); + public RaceLogRaceStatusEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + Serializable pId, List pInvolvedBoats, int pPassId, RaceLogRaceStatus nextStatus) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.nextStatus = nextStatus; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java index 6a5e151bb7f..0fdd53102a8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java @@ -6,6 +6,7 @@ import java.util.List; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; @@ -16,9 +17,9 @@ public class RaceLogStartProcedureChangedEventImpl extends RaceLogEventImpl impl private final StartProcedureType startProcedureType; - public RaceLogStartProcedureChangedEventImpl(TimePoint createdAt, TimePoint pTimePoint, - Serializable pId, List pInvolvedBoats, int pPassId, StartProcedureType startProcedureType) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); + public RaceLogStartProcedureChangedEventImpl(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, StartProcedureType startProcedureType) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.startProcedureType = startProcedureType; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java index a8ea5e57480..313d8744d74 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartTimeEventImpl.java @@ -6,6 +6,7 @@ import java.util.List; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; @@ -14,9 +15,9 @@ public class RaceLogStartTimeEventImpl extends RaceLogRaceStatusEventImpl implem private static final long serialVersionUID = 8185811395997196162L; private final TimePoint startTime; - public RaceLogStartTimeEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, - List pInvolvedBoats, int pPassId, TimePoint pStartTime) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId, RaceLogRaceStatus.SCHEDULED); + public RaceLogStartTimeEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + Serializable pId, List pInvolvedBoats, int pPassId, TimePoint pStartTime) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId, RaceLogRaceStatus.SCHEDULED); this.startTime = pStartTime; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogWindFixEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogWindFixEventImpl.java index 44defb957d9..d4d5b22d757 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogWindFixEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogWindFixEventImpl.java @@ -5,6 +5,7 @@ import java.util.List; 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.RaceLogWindFixEvent; import com.sap.sailing.domain.tracking.Wind; @@ -14,9 +15,9 @@ public class RaceLogWindFixEventImpl extends RaceLogEventImpl implements RaceLog private final Wind windFix; - public RaceLogWindFixEventImpl(TimePoint createdAt, TimePoint pTimePoint, Serializable pId, - List pInvolvedBoats, int pPassId, Wind windFix) { - super(createdAt, pTimePoint, pId, pInvolvedBoats, pPassId); + public RaceLogWindFixEventImpl(TimePoint createdAt, RaceLogEventAuthor author, TimePoint pTimePoint, + Serializable pId, List pInvolvedBoats, int pPassId, Wind windFix) { + super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.windFix = windFix; } 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 b5493b836a9..b1b8b533b89 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 @@ -32,8 +32,8 @@ public class RaceLogTest { int passId = 0; 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); + RaceLogFlagEvent rcEvent1 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, author, author, UUID.randomUUID(), new ArrayList(), passId, Flags.CLASS, Flags.NONE, false); + RaceLogFlagEvent rcEvent2 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, author, author, UUID.randomUUID(), new ArrayList(), ++passId, Flags.CLASS, Flags.NONE, false); raceLog.add(rcEvent1); raceLog.add(rcEvent2); @@ -53,14 +53,14 @@ public class RaceLogTest { UUID client1Id = UUID.randomUUID(); UUID client2Id = UUID.randomUUID(); final MillisecondsTimePoint now = MillisecondsTimePoint.now(); - RaceLogStartTimeEvent startTimeEvent1 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now, 1, now.plus(1)); + RaceLogStartTimeEvent startTimeEvent1 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now, author, 1, now.plus(1)); Iterable empty = raceLog.add(startTimeEvent1, client1Id); assertTrue(Util.isEmpty(empty)); - RaceLogStartTimeEvent startTimeEvent2 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now.plus(2), 1, now.plus(3)); + RaceLogStartTimeEvent startTimeEvent2 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now.plus(2), author, 1, now.plus(3)); Iterable nonEmpty = raceLog.add(startTimeEvent2, client2Id); assertEquals(1, Util.size(nonEmpty)); assertSame(startTimeEvent1, nonEmpty.iterator().next()); - RaceLogStartTimeEvent startTimeEvent3 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now.plus(4), 1, now.plus(5)); + RaceLogStartTimeEvent startTimeEvent3 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now.plus(4), author, 1, now.plus(5)); Iterable nonEmpty2 = raceLog.add(startTimeEvent3, client1Id); assertEquals(1, Util.size(nonEmpty2)); assertSame(startTimeEvent2, nonEmpty2.iterator().next()); @@ -73,8 +73,8 @@ public class RaceLogTest { TimePoint t1 = MillisecondsTimePoint.now(); int passId = 0; boolean isDisplayed = true; - RaceLogFlagEvent rcEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, passId, Flags.CLASS, Flags.NONE, - isDisplayed); + RaceLogFlagEvent rcEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, author, passId, Flags.CLASS, + Flags.NONE, isDisplayed); rcEventTrack.add(rcEvent); rcEventTrack.lockForRead(); @@ -105,16 +105,16 @@ public class RaceLogTest { TimePoint tx = new MillisecondsTimePoint(t1.asMillis() - 7000); int passId = 0; - RaceLogFlagEvent rcEvent1 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, passId, Flags.CLASS, Flags.NONE, - false); - RaceLogFlagEvent rcEvent2 = RaceLogEventFactory.INSTANCE.createFlagEvent(t2, passId, Flags.PAPA, Flags.NONE, - false); - RaceLogFlagEvent rcEvent3 = RaceLogEventFactory.INSTANCE.createFlagEvent(t3, passId, Flags.PAPA, Flags.NONE, - true); - RaceLogFlagEvent rcEvent4 = RaceLogEventFactory.INSTANCE.createFlagEvent(t4, passId, Flags.CLASS, Flags.NONE, - true); - RaceLogStartTimeEvent rcEvent5 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(t5, passId, - t1); + RaceLogFlagEvent rcEvent1 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, author, passId, Flags.CLASS, + Flags.NONE, false); + RaceLogFlagEvent rcEvent2 = RaceLogEventFactory.INSTANCE.createFlagEvent(t2, author, passId, Flags.PAPA, + Flags.NONE, false); + RaceLogFlagEvent rcEvent3 = RaceLogEventFactory.INSTANCE.createFlagEvent(t3, author, passId, Flags.PAPA, + Flags.NONE, true); + RaceLogFlagEvent rcEvent4 = RaceLogEventFactory.INSTANCE.createFlagEvent(t4, author, passId, Flags.CLASS, + Flags.NONE, true); + RaceLogStartTimeEvent rcEvent5 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(t5, author, + passId, t1); rcEventTrack.add(rcEvent5); rcEventTrack.add(rcEvent3); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java index e266da59e2f..862c265c440 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java @@ -76,8 +76,8 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { Flags lowerFlag = Flags.BRAVO; boolean isDisplayed = true; - RaceLogFlagEvent expectedEvent = eventFactory.createFlagEvent(expectedEventTime, expectedId, - expectedInvolvedBoats, expectedPassId, upperFlag, lowerFlag, isDisplayed); + RaceLogFlagEvent expectedEvent = eventFactory.createFlagEvent(expectedEventTime, author, + author, expectedId, expectedInvolvedBoats, expectedPassId, upperFlag, lowerFlag, isDisplayed); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); RaceLogFlagEvent actualEvent = loadEvent(dbObject); @@ -93,7 +93,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { Serializable courseAreaId = UUID.randomUUID(); RaceLogCourseAreaChangedEvent expectedEvent = eventFactory.createCourseAreaChangedEvent( - expectedEventTime, expectedId, expectedInvolvedBoats, expectedPassId, courseAreaId); + expectedEventTime, author, author, expectedId, expectedInvolvedBoats, expectedPassId, courseAreaId); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); RaceLogCourseAreaChangedEvent actualEvent = loadEvent(dbObject); @@ -104,8 +104,8 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { @Test public void testStoreAndLoadPassChangeEvent() { - RaceLogPassChangeEvent expectedEvent = eventFactory.createPassChangeEvent(expectedEventTime, expectedId, - expectedInvolvedBoats, expectedPassId); + RaceLogPassChangeEvent expectedEvent = eventFactory.createPassChangeEvent(expectedEventTime, author, + author, expectedId, expectedInvolvedBoats, expectedPassId); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); RaceLogPassChangeEvent actualEvent = loadEvent(dbObject); @@ -116,8 +116,8 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { @Test public void testStoreAndLoadRaceStatusEvent() { RaceLogRaceStatus status = RaceLogRaceStatus.SCHEDULED; - RaceLogRaceStatusEvent expectedEvent = eventFactory.createRaceStatusEvent(expectedEventTime, expectedId, - expectedInvolvedBoats, expectedPassId, status); + RaceLogRaceStatusEvent expectedEvent = eventFactory.createRaceStatusEvent(expectedEventTime, author, + author, expectedId, expectedInvolvedBoats, expectedPassId, status); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); RaceLogRaceStatusEvent actualEvent = loadEvent(dbObject); @@ -129,8 +129,8 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { @Test public void testStoreAndLoadStartTimeEvent() { TimePoint startTime = new MillisecondsTimePoint(1337); - RaceLogStartTimeEvent expectedEvent = eventFactory.createStartTimeEvent(expectedEventTime, expectedId, - expectedInvolvedBoats, expectedPassId, startTime); + RaceLogStartTimeEvent expectedEvent = eventFactory.createStartTimeEvent(expectedEventTime, author, + author, expectedId, expectedInvolvedBoats, expectedPassId, startTime); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); RaceLogStartTimeEvent actualEvent = loadEvent(dbObject); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogEventData.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogEventData.java index 733c3f41dee..0854ba557df 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogEventData.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogEventData.java @@ -68,7 +68,7 @@ public class TestStoringAndRetrievingRaceLogEventData extends AbstractMongoDBTes @Test public void storeRaceLogFlagEvent() throws UnknownHostException, MongoException, InterruptedException { TimePoint now = MillisecondsTimePoint.now(); - RaceLogFlagEvent rcEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(now, 0, Flags.AP, Flags.ALPHA, true); + RaceLogFlagEvent rcEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(now, author, 0, Flags.AP, Flags.ALPHA, true); { DBObject rcEventForMongo = ((MongoObjectFactoryImpl) MongoFactory.INSTANCE.getDefaultMongoObjectFactory()) .storeRaceLogFlagEvent(rcEvent); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index f26e0bf0b9a..317f78dd1fa 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -101,7 +101,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogProtestStartTimeEvent() { - RaceLogProtestStartTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createProtestStartTimeEvent(now, 0, MillisecondsTimePoint.now()); + RaceLogProtestStartTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createProtestStartTimeEvent(now, author, 0, MillisecondsTimePoint.now()); addAndStoreRaceLogEvent(leaderboard, raceColumnName, expectedEvent); @@ -123,7 +123,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogStartProcedureChangedEvent() { - RaceLogStartProcedureChangedEvent expectedEvent = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(now, 0, StartProcedureType.ESS); + RaceLogStartProcedureChangedEvent expectedEvent = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(now, author, 0, StartProcedureType.ESS); addAndStoreRaceLogEvent(leaderboard, raceColumnName, expectedEvent); @@ -145,7 +145,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogGateLineOpeningTimeEvent() { - RaceLogGateLineOpeningTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(now, 0, 1234l); + RaceLogGateLineOpeningTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(now, author, 0, 1234l); addAndStoreRaceLogEvent(leaderboard, raceColumnName, expectedEvent); @@ -167,7 +167,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogPathfinderEvent() { - RaceLogPathfinderEvent expectedEvent = RaceLogEventFactory.INSTANCE.createPathfinderEvent(now, 0, "GER 20"); + RaceLogPathfinderEvent expectedEvent = RaceLogEventFactory.INSTANCE.createPathfinderEvent(now, author, 0, "GER 20"); addAndStoreRaceLogEvent(leaderboard, raceColumnName, expectedEvent); @@ -189,7 +189,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogPassChangeEvent() { - RaceLogPassChangeEvent event = RaceLogEventFactory.INSTANCE.createPassChangeEvent(now, 0); + RaceLogPassChangeEvent event = RaceLogEventFactory.INSTANCE.createPassChangeEvent(now, author, 0); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); @@ -214,7 +214,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD List> storedPositioningList = new ArrayList>(); storedPositioningList.add(new Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); - RaceLogFinishPositioningConfirmedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, 0, storedPositioningList); + RaceLogFinishPositioningConfirmedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); @@ -235,7 +235,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithBackwardsCompatibleRaceLogFinishPositioningConfirmedEvent() { - RaceLogFinishPositioningConfirmedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, 0, null); + RaceLogFinishPositioningConfirmedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, author, 0, null); createAndStoreOldRaceLogFinishPositioningConfirmedEventDBEntry(); @@ -283,7 +283,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD List> storedPositioningList = new ArrayList>(); storedPositioningList.add(new Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); - RaceLogFinishPositioningListChangedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningListChangedEvent(now, 0, storedPositioningList); + RaceLogFinishPositioningListChangedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningListChangedEvent(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); @@ -310,7 +310,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogCourseAreaChangeEvent() { final UUID uuid = UUID.randomUUID(); - RaceLogCourseAreaChangedEvent event = RaceLogEventFactory.INSTANCE.createCourseAreaChangedEvent(now, 0, uuid); + RaceLogCourseAreaChangedEvent event = RaceLogEventFactory.INSTANCE.createCourseAreaChangedEvent(now, author, 0, uuid); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); @@ -333,7 +333,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogRaceStatusEvent() { - RaceLogRaceStatusEvent event = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(now, 0, RaceLogRaceStatus.SCHEDULED); + RaceLogRaceStatusEvent event = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(now, author, 0, RaceLogRaceStatus.SCHEDULED); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); @@ -356,7 +356,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogStartTimeEvent() { - RaceLogStartTimeEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now, 0, now); + RaceLogStartTimeEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now, author, 0, now); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); @@ -380,7 +380,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFlagEvent() { - RaceLogFlagEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(now, 0, Flags.FIRSTSUBSTITUTE, Flags.NONE, true); + RaceLogFlagEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(now, author, 0, Flags.FIRSTSUBSTITUTE, Flags.NONE, true); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); @@ -404,7 +404,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogCourseDesignChangedEvent() { CourseBase course = createCourseBase(); - RaceLogCourseDesignChangedEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(now, 0, course); + RaceLogCourseDesignChangedEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(now, author, 0, course); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); @@ -427,7 +427,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogWindFixEvent() { Wind wind = createWindFix(); - RaceLogWindFixEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, 0, wind); + RaceLogWindFixEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, author, 0, wind); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index 52fdcbd6aa2..8a369599429 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -132,7 +132,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogProtestStartTimeEvent() { - RaceLogProtestStartTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createProtestStartTimeEvent(now, 0, MillisecondsTimePoint.now()); + RaceLogProtestStartTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createProtestStartTimeEvent(now, author, 0, MillisecondsTimePoint.now()); addAndStoreRaceLogEvent(regatta, raceColumnName, expectedEvent); @@ -154,7 +154,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogStartProcedureChangedEvent() { - RaceLogStartProcedureChangedEvent expectedEvent = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(now, 0, StartProcedureType.ESS); + RaceLogStartProcedureChangedEvent expectedEvent = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(now, author, 0, StartProcedureType.ESS); addAndStoreRaceLogEvent(regatta, raceColumnName, expectedEvent); @@ -176,7 +176,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogPathfinderEvent() { - RaceLogPathfinderEvent expectedEvent = RaceLogEventFactory.INSTANCE.createPathfinderEvent(now, 0, "GER 20"); + RaceLogPathfinderEvent expectedEvent = RaceLogEventFactory.INSTANCE.createPathfinderEvent(now, author, 0, "GER 20"); addAndStoreRaceLogEvent(regatta, raceColumnName, expectedEvent); @@ -198,7 +198,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogGateLineOpeningTimeEvent() { - RaceLogGateLineOpeningTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(now, 0, 1234l); + RaceLogGateLineOpeningTimeEvent expectedEvent = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(now, author, 0, 1234l); addAndStoreRaceLogEvent(regatta, raceColumnName, expectedEvent); @@ -220,7 +220,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogPassChangeEvent() { - RaceLogPassChangeEvent event = RaceLogEventFactory.INSTANCE.createPassChangeEvent(now, 0); + RaceLogPassChangeEvent event = RaceLogEventFactory.INSTANCE.createPassChangeEvent(now, author, 0); addAndStoreRaceLogEvent(regatta, raceColumnName, event); @@ -245,7 +245,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest List> storedPositioningList = new ArrayList>(); storedPositioningList.add(new Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); - RaceLogFinishPositioningListChangedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningListChangedEvent(now, 0, storedPositioningList); + RaceLogFinishPositioningListChangedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningListChangedEvent(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(regatta, raceColumnName, event); @@ -275,7 +275,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest List> storedPositioningList = new ArrayList>(); storedPositioningList.add(new Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); - RaceLogFinishPositioningConfirmedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, 0, storedPositioningList); + RaceLogFinishPositioningConfirmedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(regatta, raceColumnName, event); @@ -301,7 +301,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithBackwardsCompatibleRaceLogFinishPositioningConfirmedEvent() { - RaceLogFinishPositioningConfirmedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, 0, null); + RaceLogFinishPositioningConfirmedEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, author, 0, null); createAndStoreOldRaceLogFinishPositioningConfirmedEventDBEntry(); @@ -347,7 +347,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogCourseAreaChangeEvent() { final UUID uuid = UUID.randomUUID(); - RaceLogCourseAreaChangedEvent event = RaceLogEventFactory.INSTANCE.createCourseAreaChangedEvent(now, 0, uuid); + RaceLogCourseAreaChangedEvent event = RaceLogEventFactory.INSTANCE.createCourseAreaChangedEvent(now, author, 0, uuid); addAndStoreRaceLogEvent(regatta, raceColumnName, event); @@ -370,7 +370,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogRaceStatusEvent() { - RaceLogRaceStatusEvent event = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(now, 0, RaceLogRaceStatus.SCHEDULED); + RaceLogRaceStatusEvent event = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(now, author, 0, RaceLogRaceStatus.SCHEDULED); addAndStoreRaceLogEvent(regatta, raceColumnName, event); @@ -393,7 +393,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogStartTimeEvent() { - RaceLogStartTimeEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now, 0, now); + RaceLogStartTimeEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(now, author, 0, now); addAndStoreRaceLogEvent(regatta, raceColumnName, event); @@ -417,7 +417,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogFlagEvent() { - RaceLogFlagEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(now, 0, Flags.FIRSTSUBSTITUTE, Flags.NONE, true); + RaceLogFlagEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(now, author, 0, Flags.FIRSTSUBSTITUTE, Flags.NONE, true); addAndStoreRaceLogEvent(regatta, raceColumnName, event); @@ -441,7 +441,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogCourseDesignChangedEvent() { CourseBase course = createCourseBase(); - RaceLogCourseDesignChangedEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(now, 0, course); + RaceLogCourseDesignChangedEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(now, author, 0, course); addAndStoreRaceLogEvent(regatta, raceColumnName, event); @@ -464,7 +464,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogWindFixEvent() { Wind wind = createWindFix(); - RaceLogWindFixEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, 0, wind); + RaceLogWindFixEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, author, 0, wind); addAndStoreRaceLogEvent(regatta, raceColumnName, event); diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java index 6f89ef59867..9088b4f75d8 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java @@ -65,7 +65,7 @@ public class RaceLogCourseDesignChangedEventSerializerTest { factory), new GateDeserializer(factory, new MarkDeserializer(factory)))))); now = MillisecondsTimePoint.now(); - event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(now, 0, createCourseData()); + event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(now, author, 0, createCourseData()); } @Test diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index 4e5ec17ded8..438ee4b6194 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -62,7 +62,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesFlagEventSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createFlagEvent(null, 0, null, null, false); + RaceLogEvent event = factory.createFlagEvent(null, author, 0, null, null, false); serializer.serialize(event); verify(flagEventSerializer).serialize(event); } @@ -70,7 +70,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesStartTimeSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createStartTimeEvent(null, 0, null); + RaceLogEvent event = factory.createStartTimeEvent(null, author, 0, null); serializer.serialize(event); verify(startTimeSerializer).serialize(event); } @@ -78,7 +78,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesRaceStatusSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createRaceStatusEvent(null, 0, RaceLogRaceStatus.SCHEDULED); + RaceLogEvent event = factory.createRaceStatusEvent(null, author, 0, RaceLogRaceStatus.SCHEDULED); serializer.serialize(event); verify(raceStatusSerializer).serialize(event); } @@ -86,7 +86,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesCourseAreaChangedSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createCourseAreaChangedEvent(null, 0, null); + RaceLogEvent event = factory.createCourseAreaChangedEvent(null, author, 0, null); serializer.serialize(event); verify(courseAreaChangedEventSerializer).serialize(event); } @@ -94,7 +94,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesPassChangedSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createPassChangeEvent(null, 0); + RaceLogEvent event = factory.createPassChangeEvent(null, author, 0); serializer.serialize(event); verify(passChangedSerializer).serialize(event); } @@ -102,7 +102,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesCourseDesignChangedSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createCourseDesignChangedEvent(null, 0, null); + RaceLogEvent event = factory.createCourseDesignChangedEvent(null, author, 0, null); serializer.serialize(event); verify(courseDesignChangedEventSerializer).serialize(event); } @@ -110,7 +110,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesFinishPositioningListChangedSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createFinishPositioningListChangedEvent(null, 0, null); + RaceLogEvent event = factory.createFinishPositioningListChangedEvent(null, author, 0, null); serializer.serialize(event); verify(finishPositioningListChangedEventSerializer).serialize(event); } @@ -118,7 +118,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesFinishPositioningConfirmedSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createFinishPositioningConfirmedEvent(null, 0, null); + RaceLogEvent event = factory.createFinishPositioningConfirmedEvent(null, author, 0, null); serializer.serialize(event); verify(finishPositioningConfirmedEventSerializer).serialize(event); } @@ -126,7 +126,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesPathfinderSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createPathfinderEvent(null, 0, "GER 20"); + RaceLogEvent event = factory.createPathfinderEvent(null, author, 0, "GER 20"); serializer.serialize(event); verify(pathfinderEventSerializer).serialize(event); } @@ -134,7 +134,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesGateLineOpeningTimeSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createGateLineOpeningTimeEvent(null, 0, new Long(0)); + RaceLogEvent event = factory.createGateLineOpeningTimeEvent(null, author, 0, new Long(0)); serializer.serialize(event); verify(gateLineOpeningTimeEventSerializer).serialize(event); } @@ -142,7 +142,7 @@ public class RaceLogEventSerializerTest { @Test public void testStartProcedureTypeChangedSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createStartProcedureChangedEvent(null, 0, StartProcedureType.ESS); + RaceLogEvent event = factory.createStartProcedureChangedEvent(null, author, 0, StartProcedureType.ESS); serializer.serialize(event); verify(startProcedureTypeChangedEventSerializer).serialize(event); } @@ -150,7 +150,7 @@ public class RaceLogEventSerializerTest { @Test public void testProtestStartTimeSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createProtestStartTimeEvent(null, 0, null); + RaceLogEvent event = factory.createProtestStartTimeEvent(null, author, 0, null); serializer.serialize(event); verify(protestStartTimeEventSerializer).serialize(event); } @@ -158,7 +158,7 @@ public class RaceLogEventSerializerTest { @Test public void testWindFixSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createWindFixEvent(null, 0, null); + RaceLogEvent event = factory.createWindFixEvent(null, author, 0, null); serializer.serialize(event); verify(windFixEventSerializer).serialize(event); } diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java index 886f4a6e7c5..e186a7fe8e1 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java @@ -54,7 +54,7 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { public void testSerializeAndDeserializeRaceLogFinishPositioningConfirmedEvent() throws JsonDeserializationException { positioningList.add(new Triple(UUID.randomUUID(), "SAP Extreme", MaxPointsReason.NONE)); - event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, 0, positioningList); + event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, author, 0, positioningList); JSONObject jsonConfirmationEvent = serializer.serialize(event); RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer .deserialize(jsonConfirmationEvent); @@ -79,7 +79,7 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { @Test public void testSerializeAndDeserializeRaceLogFinishPositioningConfirmedEventWithoutPositioningBackwardsCompatible() throws JsonDeserializationException { - event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, 0, null); + event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, author, 0, null); JSONObject jsonConfirmationEvent = serializer.serialize(event); RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer .deserialize(jsonConfirmationEvent); @@ -97,7 +97,7 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { @Test public void testSerializeAndDeserializeRaceLogFinishPositioningConfirmedEventWithEmptyPositioning() throws JsonDeserializationException { - event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, 0, positioningList); + event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(now, author, 0, positioningList); JSONObject jsonConfirmationEvent = serializer.serialize(event); RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer .deserialize(jsonConfirmationEvent); diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java index 548b6d9de20..0d7a4e6eb86 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java @@ -53,7 +53,7 @@ public class RaceLogWindFixEventSerializerTest { now = MillisecondsTimePoint.now(); - event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, 0, createWindFix()); + event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, author, 0, createWindFix()); } @Test diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseAreaChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseAreaChangedEventDeserializer.java index 2044d531424..70f0a53d712 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseAreaChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseAreaChangedEventDeserializer.java @@ -25,8 +25,8 @@ public class RaceLogCourseAreaChangedEventDeserializer extends BaseRaceLogEventD Serializable courseAreaId = (Serializable) object.get(RaceLogCourseAreaChangedEventSerializer.FIELD_COURSE_AREA_ID); - return factory.createCourseAreaChangedEvent(createdAt, timePoint, id, competitors, passId, - Helpers.tryUuidConversion(courseAreaId)); + return factory.createCourseAreaChangedEvent(createdAt, author, timePoint, id, competitors, + passId, Helpers.tryUuidConversion(courseAreaId)); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java index 3a4e5dacd6d..ddcbd4dfc56 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java @@ -30,7 +30,7 @@ public class RaceLogCourseDesignChangedEventDeserializer extends BaseRaceLogEven JSONObject jsonCourseDesign = (JSONObject) object.get(RaceLogCourseDesignChangedEventSerializer.FIELD_COURSE_DESIGN); CourseBase courseData = courseDataDeserializer.deserialize(jsonCourseDesign); - return factory.createCourseDesignChangedEvent(createdAt, timePoint, id, competitors, passId, courseData); + return factory.createCourseDesignChangedEvent(createdAt, author, timePoint, id, competitors, passId, courseData); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java index 870c60e1c0d..1aacdf5e3c4 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java @@ -30,7 +30,7 @@ public class RaceLogFinishPositioningConfirmedEventDeserializer extends BaseRace JSONArray jsonPositionedCompetitors = Helpers.getNestedArraySafe(object, RaceLogFinishPositioningConfirmedEventSerializer.FIELD_POSITIONED_COMPETITORS); List> positionedCompetitors = deserializePositionedCompetitors(jsonPositionedCompetitors); - return factory.createFinishPositioningConfirmedEvent(createdAt, timePoint, id, competitors, passId, positionedCompetitors); + return factory.createFinishPositioningConfirmedEvent(createdAt, author, timePoint, id, competitors, passId, positionedCompetitors); } private List> deserializePositionedCompetitors(JSONArray jsonPositionedCompetitors) throws JsonDeserializationException { diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java index 75ebe5066f3..5d2b4393dfc 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java @@ -30,7 +30,7 @@ public class RaceLogFinishPositioningListChangedEventDeserializer extends BaseRa JSONArray jsonPositionedCompetitors = Helpers.getNestedArraySafe(object, RaceLogFinishPositioningListChangedEventSerializer.FIELD_POSITIONED_COMPETITORS); List> positionedCompetitors = deserializePositionedCompetitors(jsonPositionedCompetitors); - return factory.createFinishPositioningListChangedEvent(createdAt, timePoint, id, competitors, passId, positionedCompetitors); + return factory.createFinishPositioningListChangedEvent(createdAt, author, timePoint, id, competitors, passId, positionedCompetitors); } private List> deserializePositionedCompetitors(JSONArray jsonPositionedCompetitors) throws JsonDeserializationException { diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFlagEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFlagEventDeserializer.java index 2a6c5f9532e..0a0e142ce84 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFlagEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFlagEventDeserializer.java @@ -25,7 +25,7 @@ public class RaceLogFlagEventDeserializer extends BaseRaceLogEventDeserializer { Flags lowerFlag = Flags.valueOf(object.get(RaceLogFlagEventSerializer.FIELD_LOWER_FLAG).toString()); boolean isDisplayed = (Boolean) object.get(RaceLogFlagEventSerializer.FIELD_DISPLAYED); - return factory.createFlagEvent(createdAt, timePoint, id, competitors, passId, upperFlag, lowerFlag, isDisplayed); + return factory.createFlagEvent(createdAt, author, timePoint, id, competitors, passId, upperFlag, lowerFlag, isDisplayed); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java index f174dac7e73..f462edd3557 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java @@ -23,7 +23,7 @@ public class RaceLogGateLineOpeningTimeEventDeserializer extends BaseRaceLogEven protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { Long gateLineOpeningTime = (Long) object.get(RaceLogGateLineOpeningTimeEventSerializer.FIELD_GATE_LINE_OPENING_TIME); - return factory.createGateLineOpeningTimeEvent(timePoint, id, competitors, passId, gateLineOpeningTime); + return factory.createGateLineOpeningTimeEvent(timePoint, author, author, id, competitors, passId, gateLineOpeningTime); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPassChangeEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPassChangeEventDeserializer.java index 37e0403a4f0..f15e8388172 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPassChangeEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPassChangeEventDeserializer.java @@ -19,7 +19,7 @@ public class RaceLogPassChangeEventDeserializer extends BaseRaceLogEventDeserial @Override protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) { - return factory.createPassChangeEvent(createdAt, timePoint, id, competitors, passId); + return factory.createPassChangeEvent(createdAt, author, timePoint, id, competitors, passId); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPathFinderEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPathFinderEventDeserializer.java index 110fab48dc3..44c39fde75f 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPathFinderEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPathFinderEventDeserializer.java @@ -23,7 +23,7 @@ public class RaceLogPathFinderEventDeserializer extends BaseRaceLogEventDeserial protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { String pathfinderId = object.get(RaceLogPathfinderEventSerializer.FIELD_PATHFINDER_ID).toString(); - return factory.createPathfinderEvent(createdAt, timePoint, id, competitors, passId, pathfinderId); + return factory.createPathfinderEvent(createdAt, author, timePoint, id, competitors, passId, pathfinderId); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogProtestStartTimeEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogProtestStartTimeEventDeserializer.java index 4d4e10206bb..8b980af8499 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogProtestStartTimeEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogProtestStartTimeEventDeserializer.java @@ -23,8 +23,8 @@ public class RaceLogProtestStartTimeEventDeserializer extends BaseRaceLogEventDe protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { Long protestStartTime = (Long) object.get(RaceLogProtestStartTimeEventSerializer.FIELD_PROTEST_START_TIME); - return factory.createProtestStartTimeEvent(createdAt, timePoint, id, competitors, passId, - new MillisecondsTimePoint(protestStartTime)); + return factory.createProtestStartTimeEvent(createdAt, author, timePoint, id, competitors, + passId, new MillisecondsTimePoint(protestStartTime)); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogRaceStatusEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogRaceStatusEventDeserializer.java index dfc2f6c1bde..ef22460bfa3 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogRaceStatusEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogRaceStatusEventDeserializer.java @@ -26,7 +26,7 @@ public class RaceLogRaceStatusEventDeserializer extends BaseRaceLogEventDeserial String statusValue = object.get(RaceLogRaceStatusEventSerializer.FIELD_NEXT_STATUS).toString(); RaceLogRaceStatus nextStatus = RaceLogRaceStatus.valueOf(statusValue); - return factory.createRaceStatusEvent(createdAt, timePoint, id, competitors, passId, nextStatus); + return factory.createRaceStatusEvent(createdAt, author, timePoint, id, competitors, passId, nextStatus); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java index f1cb157b884..eba0da20243 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java @@ -23,7 +23,7 @@ public class RaceLogStartProcedureChangedEventDeserializer extends BaseRaceLogEv protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { StartProcedureType type = StartProcedureType.valueOf(object.get(RaceLogStartProcedureChangedEventSerializer.FIELD_START_PROCEDURE_TYPE).toString()); - return factory.createStartProcedureChangedEvent(createdAt, timePoint, id, competitors, passId, type); + return factory.createStartProcedureChangedEvent(createdAt, author, timePoint, id, competitors, passId, type); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartTimeEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartTimeEventDeserializer.java index 4a8108130b8..b69b55c15f4 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartTimeEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartTimeEventDeserializer.java @@ -28,8 +28,8 @@ public class RaceLogStartTimeEventDeserializer extends RaceLogRaceStatusEventDes RaceLogRaceStatusEvent event = (RaceLogRaceStatusEvent) super.deserialize(object, id, createdAt, timePoint, passId, competitors); - return factory.createStartTimeEvent(event.getCreatedAt(), event.getTimePoint(), event.getId(), event.getInvolvedBoats(), event.getPassId(), - new MillisecondsTimePoint(startTime)); + return factory.createStartTimeEvent(event.getCreatedAt(), author, event.getTimePoint(), event.getId(), event.getInvolvedBoats(), + event.getPassId(), new MillisecondsTimePoint(startTime)); } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java index 38683db4b37..062b106a548 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java @@ -30,7 +30,7 @@ public class RaceLogWindFixEventDeserializer extends BaseRaceLogEventDeserialize Wind wind = windDeserializer.deserialize(windJsonObject); - return factory.createWindFixEvent(createdAt, timePoint, id, competitors, passId, wind); + return factory.createWindFixEvent(createdAt, author, timePoint, id, competitors, passId, wind); } } diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RaceLogReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RaceLogReplicationTest.java index 26b840348f4..6777eadcd00 100644 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RaceLogReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RaceLogReplicationTest.java @@ -51,8 +51,8 @@ public class RaceLogReplicationTest extends AbstractServerReplicationTest { @Before public void setUp() throws Exception { - raceLogEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(new MillisecondsTimePoint(1), 42, RaceLogRaceStatus.UNKNOWN); - anotherRaceLogEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(new MillisecondsTimePoint(2), 42, RaceLogRaceStatus.UNKNOWN); + raceLogEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(new MillisecondsTimePoint(1), author, 42, RaceLogRaceStatus.UNKNOWN); + anotherRaceLogEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(new MillisecondsTimePoint(2), author, 42, RaceLogRaceStatus.UNKNOWN); try { replicationDescriptorPair = basicSetUp(true, null, null); } catch (Exception e) { @@ -152,14 +152,14 @@ public class RaceLogReplicationTest extends AbstractServerReplicationTest { Regatta masterRegatta = setupRegatta(regattaName); RaceLog masterLog = setupRaceColumn(masterRegatta, seriesName, raceColumnName, fleetName); - raceLogEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(), 43, createCourseData()); + raceLogEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(), author, 43, createCourseData()); masterLog.add(raceLogEvent); replicationDescriptorPair.getA().startToReplicateFrom(replicationDescriptorPair.getB()); RaceLog replicaLog = getReplicaLog(seriesName, fleetName, raceColumnName, masterRegatta); - anotherRaceLogEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(), 43, createCourseData()); + anotherRaceLogEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(), author, 43, createCourseData()); addAndValidateEventIds(masterLog, replicaLog, anotherRaceLogEvent); compareReplicatedCourseDesignEvent(replicaLog, (RaceLogCourseDesignChangedEvent) anotherRaceLogEvent); @@ -190,13 +190,13 @@ public class RaceLogReplicationTest extends AbstractServerReplicationTest { FlexibleLeaderboard masterLeaderboard = setupFlexibleLeaderboard(leaderboardName); RaceLog masterLog = setupRaceColumn(leaderboardName, fleetName, raceColumnName); - raceLogEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(), 43, createCourseData()); + raceLogEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(), author, 43, createCourseData()); masterLog.add(raceLogEvent); replicationDescriptorPair.getA().startToReplicateFrom(replicationDescriptorPair.getB()); RaceLog replicaLog = getReplicaLog(fleetName, raceColumnName, masterLeaderboard); - anotherRaceLogEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(), 43, createCourseData()); + anotherRaceLogEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(), author, 43, createCourseData()); addAndValidateEventIds(masterLog, replicaLog, anotherRaceLogEvent); compareReplicatedCourseDesignEvent(replicaLog, (RaceLogCourseDesignChangedEvent) anotherRaceLogEvent); } diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index 0e8e1385c3d..1498db8233a 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -202,8 +202,8 @@ public class MasterDataImportTest { // Set log event RaceLogEventFactory factory = new RaceLogEventFactoryImpl(); TimePoint logTimePoint = new MillisecondsTimePoint(1372489200000L); - RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, 1, - logTimePoint); + RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, author, + 1, logTimePoint); raceColumn.getRaceLog(testFleet1).add(logEvent); storedLogUUIDs.add(logEvent.getId()); @@ -366,7 +366,7 @@ public class MasterDataImportTest { // Set log event RaceLogEventFactory factory = new RaceLogEventFactoryImpl(); TimePoint logTimePoint = new MillisecondsTimePoint(1372489200000L); - RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, 1, logTimePoint); + RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, author, 1, logTimePoint); raceColumn.getRaceLog(testFleet1).add(logEvent); storedLogUUIDs.add(logEvent.getId()); @@ -507,8 +507,8 @@ public class MasterDataImportTest { // Set log event RaceLogEventFactory factory = new RaceLogEventFactoryImpl(); TimePoint logTimePoint = new MillisecondsTimePoint(1372489200000L); - RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, 1, - logTimePoint); + RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, author, + 1, logTimePoint); raceColumn.getRaceLog(testFleet1).add(logEvent); storedLogUUIDs.add(logEvent.getId()); @@ -685,8 +685,8 @@ public class MasterDataImportTest { // Set log event RaceLogEventFactory factory = new RaceLogEventFactoryImpl(); TimePoint logTimePoint = new MillisecondsTimePoint(1372489200000L); - RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, 1, - logTimePoint); + RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, author, + 1, logTimePoint); raceColumn.getRaceLog(testFleet1).add(logEvent); storedLogUUIDs.add(logEvent.getId()); @@ -856,8 +856,8 @@ public class MasterDataImportTest { // Set log event RaceLogEventFactory factory = new RaceLogEventFactoryImpl(); TimePoint logTimePoint = new MillisecondsTimePoint(1372489200000L); - RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, 1, - logTimePoint); + RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, author, + 1, logTimePoint); raceColumn.getRaceLog(testFleet1).add(logEvent); storedLogUUIDs.add(logEvent.getId()); @@ -986,7 +986,7 @@ public class MasterDataImportTest { // Set log event RaceLogEventFactory factory = new RaceLogEventFactoryImpl(); TimePoint logTimePoint = new MillisecondsTimePoint(1372489200000L); - RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, 1, logTimePoint); + RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, author, 1, logTimePoint); raceColumn.getRaceLog(testFleet1).add(logEvent); storedLogUUIDs.add(logEvent.getId()); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java index c0dc9b37d11..dbcc3277f62 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java @@ -59,7 +59,7 @@ public class RaceLogInRaceColumnTest { TimePoint t1 = MillisecondsTimePoint.now(); RaceLogEvent rlEvent = RaceLogEventFactory.INSTANCE.createFlagEvent( - t1, 0, Flags.CLASS, Flags.NONE, true); + t1, author, 0, Flags.CLASS, Flags.NONE, true); Leaderboard leaderboard = racingEventServiceServer.getLeaderboardByName(LEADERBOARDNAME); RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java index ce58ed53c01..40b45e7b18f 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java @@ -52,7 +52,7 @@ public class RaceLogOperationalTransformationTest { public void testSimpleApply() { Calendar c = new GregorianCalendar(2013, 6, 7, 13, 59, 33); final MillisecondsTimePoint startTime = new MillisecondsTimePoint(c.getTime()); - RaceLogStartTimeEvent startTimeEvent = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), startTime, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTime); + RaceLogStartTimeEvent startTimeEvent = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), author, startTime, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTime); RaceLogStartTimeEventWithTransformationSupport e = new RaceLogStartTimeEventWithTransformationSupport(startTimeEvent); server.apply(e); waitForEventualConsistency(); @@ -90,12 +90,12 @@ public class RaceLogOperationalTransformationTest { public void testConflictingApplyServerWins() { Calendar cServer = new GregorianCalendar(2013, 6, 7, 13, 59, 33); final MillisecondsTimePoint startTimeServer = new MillisecondsTimePoint(cServer.getTime()); - RaceLogStartTimeEvent startTimeEventServer = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), startTimeServer, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTimeServer); + RaceLogStartTimeEvent startTimeEventServer = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), author, startTimeServer, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTimeServer); RaceLogStartTimeEventWithTransformationSupport eServer = new RaceLogStartTimeEventWithTransformationSupport(startTimeEventServer); server.apply(eServer); Calendar cClient1 = new GregorianCalendar(2013, 6, 7, 13, 59, 33); final MillisecondsTimePoint startTimeClient1 = new MillisecondsTimePoint(cClient1.getTime()); - RaceLogStartTimeEvent startTimeEventClient1 = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), startTimeClient1, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTimeClient1); + RaceLogStartTimeEvent startTimeEventClient1 = new RaceLogStartTimeEventImpl(MillisecondsTimePoint.now(), author, startTimeClient1, UUID.randomUUID(), Collections. emptyList(), /* pass ID */ 1, startTimeClient1); RaceLogStartTimeEventWithTransformationSupport eClient1 = new RaceLogStartTimeEventWithTransformationSupport(startTimeEventClient1); client1.apply(eClient1); waitForEventualConsistency(); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java index ebc07d9e3da..465b897e285 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java @@ -125,8 +125,8 @@ public class WindByRaceLogTest { new KnotSpeedWithBearingImpl(15, new DegreeBearingImpl(234))); Wind wind2 = new WindImpl(new DegreePosition(49, 3), timeMinus2, new KnotSpeedWithBearingImpl(12, new DegreeBearingImpl(123))); - RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, 0, wind1); - RaceLogWindFixEvent windEvent2 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus2, 0, wind2); + RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, author, 0, wind1); + RaceLogWindFixEvent windEvent2 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus2, author, 0, wind2); raceLog.add(windEvent1); raceLog.add(windEvent2); @@ -155,7 +155,7 @@ public class WindByRaceLogTest { Wind wind1 = new WindImpl(new DegreePosition(50, 4), timeMinus3, new KnotSpeedWithBearingImpl(15, new DegreeBearingImpl(234))); - RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, 0, wind1); + RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, author, 0, wind1); raceLog.add(windEvent1); WindSource source = new WindSourceImpl(WindSourceType.RACECOMMITTEE); @@ -184,9 +184,9 @@ public class WindByRaceLogTest { new KnotSpeedWithBearingImpl(12, new DegreeBearingImpl(123))); Wind wind3 = new WindImpl(new DegreePosition(48, 1), timeMinus2, new KnotSpeedWithBearingImpl(18, new DegreeBearingImpl(270))); - RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, 0, wind1); - RaceLogWindFixEvent windEvent2 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus2, 0, wind2); - RaceLogWindFixEvent windEvent3 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus1, 0, wind3); + RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, author, 0, wind1); + RaceLogWindFixEvent windEvent2 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus2, author, 0, wind2); + RaceLogWindFixEvent windEvent3 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus1, author, 0, wind3); raceLog.add(windEvent1); raceLog.add(windEvent2); 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 315d1af4685..56ae889b45d 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 @@ -76,13 +76,13 @@ public class OfflineDataManager extends DataManager { RaceLog log = new RaceLogImpl(UUID.randomUUID()); log.add(factory.createStartTimeEvent( new MillisecondsTimePoint(new Date().getTime() - 2000), - 1, - new MillisecondsTimePoint(new Date().getTime() - 1000))); + author, + 1, new MillisecondsTimePoint(new Date().getTime() - 1000))); log.add(factory.createRaceStatusEvent( new MillisecondsTimePoint(new Date().getTime()), - 1, - RaceLogRaceStatus.FINISHING)); + author, + 1, RaceLogRaceStatus.FINISHING)); ManagedRace q1 = new ManagedRaceImpl( new ManagedRaceIdentifierImpl( diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java index 1cbf7c4962d..0e0e3ee22ae 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java @@ -113,8 +113,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { raceStateChangedListener.onRaceStartphaseEntered(eventTime); } - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.AP, Flags.NONE, /*isDisplayed*/false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.AP, Flags.NONE, /*isDisplayed*/false); raceLog.add(event); if (startPhaseEventListener != null) { @@ -123,8 +123,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleEssThreeUp(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.ESSTHREE, Flags.NONE, /*isDisplayed*/true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTHREE, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); if (startPhaseEventListener != null) { @@ -134,12 +134,12 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { private void handleEssTwoUpAndEssThreeDown(TimePoint eventTime) { - RaceLogEvent essThreeDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.ESSTHREE, Flags.NONE, /*isDisplayed*/false); + RaceLogEvent essThreeDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTHREE, Flags.NONE, /*isDisplayed*/false); raceLog.add(essThreeDownEvent); - RaceLogEvent essTwoUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.ESSTWO, Flags.NONE, /*isDisplayed*/true); + RaceLogEvent essTwoUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTWO, Flags.NONE, /*isDisplayed*/true); raceLog.add(essTwoUpEvent); if (startPhaseEventListener != null) { @@ -149,12 +149,12 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { private void handleEssOneUpAndEssTwoDown(TimePoint eventTime) { - RaceLogEvent essTwoDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.ESSTWO, Flags.NONE, /*isDisplayed*/false); + RaceLogEvent essTwoDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTWO, Flags.NONE, /*isDisplayed*/false); raceLog.add(essTwoDownEvent); - RaceLogEvent essOneUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.ESSONE, Flags.NONE, /*isDisplayed*/true); + RaceLogEvent essOneUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSONE, Flags.NONE, /*isDisplayed*/true); raceLog.add(essOneUpEvent); if (startPhaseEventListener != null) { @@ -163,8 +163,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleEssOneDown(TimePoint eventTime) { - RaceLogEvent essOneDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.ESSONE, Flags.NONE, /*isDisplayed*/false); + RaceLogEvent essOneDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSONE, Flags.NONE, /*isDisplayed*/false); raceLog.add(essOneDownEvent); if (raceStateChangedListener != null) { @@ -195,8 +195,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @Override public void setFinishing(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /*isDisplayed*/true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); StartTimeFinder startTimeFinder = new StartTimeFinder(raceLog); @@ -219,8 +219,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @Override public void setFinished(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /*isDisplayed*/false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /*isDisplayed*/false); raceLog.add(event); if (raceStateChangedListener != null) { @@ -242,8 +242,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleAPUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.AP, lowerFlag, /*isDisplayed*/true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.AP, lowerFlag, /*isDisplayed*/true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -265,8 +265,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleNovemberUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.NOVEMBER, lowerFlag, /*isDisplayed*/true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.NOVEMBER, lowerFlag, /*isDisplayed*/true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -276,8 +276,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @Override public void setGeneralRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.FIRSTSUBSTITUTE, Flags.NONE, /*isDisplayed*/true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.FIRSTSUBSTITUTE, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -286,8 +286,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } public void setIndividualRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.emptyList(), - raceLog.getCurrentPassId(), Flags.XRAY, Flags.NONE, /*isDisplayed*/true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.XRAY, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); TimePoint individualRecallRemovalFireTimePoint = eventTime.plus(individualRecallRemovalInterval); @@ -304,9 +304,9 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { public void setIndividualRecallRemoval(TimePoint eventTime) { if (this.isIndividualRecallDisplayed()) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.XRAY, Flags.NONE, /* isDisplayed */ - false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.XRAY, Flags.NONE, false); raceLog.add(event); if (runningRaceEventListener != null) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java index 08796d26c15..a0f41bef136 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java @@ -106,9 +106,9 @@ public class GateStartProcedure implements StartProcedure { raceStateChangedListener.onRaceStartphaseEntered(startPhaseTimePoint); } - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(startPhaseTimePoint, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.CLASS, Flags.GOLF, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(startPhaseTimePoint, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.CLASS, Flags.GOLF, true); raceLog.add(event); if (startPhaseEventListener != null) { @@ -117,9 +117,9 @@ public class GateStartProcedure implements StartProcedure { } private void handlePapaUp(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.PAPA, Flags.NONE, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.PAPA, Flags.NONE, true); raceLog.add(event); if (startPhaseEventListener != null) { @@ -130,9 +130,9 @@ public class GateStartProcedure implements StartProcedure { private void handlePapaDown(TimePoint eventTime) { TimePoint papaDownTimepoint = eventTime; - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(papaDownTimepoint, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.PAPA, Flags.NONE, /* isDisplayed */ - false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(papaDownTimepoint, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.PAPA, Flags.NONE, false); raceLog.add(event); if (startPhaseEventListener != null) { @@ -144,8 +144,8 @@ public class GateStartProcedure implements StartProcedure { TimePoint essOneDownTimePoint = eventTime; RaceLogEvent essOneDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(essOneDownTimePoint, - UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), Flags.CLASS, - Flags.NONE, /* isDisplayed */false); + author, author, UUID.randomUUID(), Collections. emptyList(), + raceLog.getCurrentPassId(), Flags.CLASS, Flags.NONE, /* isDisplayed */false); raceLog.add(essOneDownEvent); if (startPhaseEventListener != null) { @@ -187,9 +187,9 @@ public class GateStartProcedure implements StartProcedure { @Override public void setFinishing(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.BLUE, Flags.NONE, true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -204,9 +204,9 @@ public class GateStartProcedure implements StartProcedure { @Override public void setFinished(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /* isDisplayed */ - false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.BLUE, Flags.NONE, false); raceLog.add(event); if (raceStateChangedListener != null) { @@ -228,9 +228,9 @@ public class GateStartProcedure implements StartProcedure { } private void handleAPUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.AP, lowerFlag, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.AP, lowerFlag, true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -252,9 +252,9 @@ public class GateStartProcedure implements StartProcedure { } private void handleNovemberUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.NOVEMBER, lowerFlag, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.NOVEMBER, lowerFlag, true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -264,9 +264,9 @@ public class GateStartProcedure implements StartProcedure { @Override public void setGeneralRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.FIRSTSUBSTITUTE, Flags.NONE, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.FIRSTSUBSTITUTE, Flags.NONE, true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -319,9 +319,9 @@ public class GateStartProcedure implements StartProcedure { } public void setGolfRemoval(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.GOLF, Flags.NONE, /* isDisplayed */ - false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.GOLF, Flags.NONE, false); raceLog.add(event); if (runningRaceEventListener != null) { @@ -331,7 +331,7 @@ public class GateStartProcedure implements StartProcedure { public void setGateLineOpeningTime(Long gateLineOpeningTimeInMiliseconds) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(MillisecondsTimePoint.now(), - raceLog.getCurrentPassId(), gateLineOpeningTimeInMiliseconds); + author, raceLog.getCurrentPassId(), gateLineOpeningTimeInMiliseconds); raceLog.add(event); this.gateLineOpeningTime = gateLineOpeningTimeInMiliseconds; this.isGateLineOpeningTimeChosen = true; @@ -345,7 +345,7 @@ public class GateStartProcedure implements StartProcedure { public void setPathfinder(String sailingId) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createPathfinderEvent(MillisecondsTimePoint.now(), - raceLog.getCurrentPassId(), sailingId); + author, raceLog.getCurrentPassId(), sailingId); raceLog.add(event); this.pathFinder = sailingId; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java index 3f2c764cd71..02161eee958 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java @@ -112,9 +112,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt raceStateChangedListener.onRaceStartphaseEntered(eventTime); } - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.CLASS, Flags.NONE, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.CLASS, Flags.NONE, true); raceLog.add(event); if (startPhaseEventListener != null) { @@ -123,9 +123,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } private void handleStartRuleUp(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), this.startModeFlag, Flags.NONE, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + this.startModeFlag, Flags.NONE, true); raceLog.add(event); if (startPhaseEventListener != null) { @@ -135,9 +135,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private void handleStartRuleDown(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), this.startModeFlag, Flags.NONE, /* isDisplayed */ - false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + this.startModeFlag, Flags.NONE, false); raceLog.add(event); if (startPhaseEventListener != null) { @@ -147,9 +147,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private void handleClassDown(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.CLASS, Flags.NONE, /* isDisplayed */ - false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.CLASS, Flags.NONE, false); raceLog.add(event); if (startPhaseEventListener != null) { @@ -184,9 +184,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt @Override public void setFinishing(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.BLUE, Flags.NONE, true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -204,9 +204,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt @Override public void setFinished(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /* isDisplayed */ - false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.BLUE, Flags.NONE, false); raceLog.add(event); if (raceStateChangedListener != null) { @@ -228,9 +228,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } private void handleAPUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.AP, lowerFlag, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.AP, lowerFlag, true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -252,9 +252,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } private void handleNovemberUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.NOVEMBER, lowerFlag, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.NOVEMBER, lowerFlag, true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -264,9 +264,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt @Override public void setGeneralRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.FIRSTSUBSTITUTE, Flags.NONE, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.FIRSTSUBSTITUTE, Flags.NONE, true); raceLog.add(event); if (raceStateChangedListener != null) { @@ -275,9 +275,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } public void setIndividualRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.XRAY, Flags.NONE, /* isDisplayed */ - true); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.XRAY, Flags.NONE, true); raceLog.add(event); TimePoint individualRecallRemovalFireTimePoint = eventTime.plus(individualRecallRemovalInterval); @@ -294,9 +294,9 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt public void setIndividualRecallRemoval(TimePoint eventTime) { if (isIndividualRecallDisplayed()) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), Flags.XRAY, Flags.NONE, /* isDisplayed */ - false); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + Flags.XRAY, Flags.NONE, false); raceLog.add(event); if (runningRaceEventListener != null) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java index 3818238813d..d546e5e2be9 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java @@ -130,8 +130,8 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { onRaceAborted(MillisecondsTimePoint.now()); } TimePoint eventTime = startProcedure.getLogicalStartTimeEventTime(newStartTime); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), newStartTime); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newStartTime); this.raceLog.add(event); fireStartTimeChange(newStartTime); } @@ -139,7 +139,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void createNewStartProcedure(StartProcedureType type) { if (!type.equals(startProcedureTypeAnalyzer.analyze())) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(MillisecondsTimePoint.now(), raceLog.getCurrentPassId(), type); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(MillisecondsTimePoint.now(), author, raceLog.getCurrentPassId(), type); this.raceLog.add(event); registerStartProcedure(); ExLog.i(TAG, String.format("Switch start procedure to %s", this.startProcedure.getClass().getSimpleName())); @@ -158,8 +158,8 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void setCourseDesign(CourseBase newCourseData) { TimePoint eventTime = MillisecondsTimePoint.now(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(eventTime, UUID.randomUUID(), - Collections. emptyList(), raceLog.getCurrentPassId(), newCourseData); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(eventTime, author, + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newCourseData); this.raceLog.add(event); fireCourseDesignChanged(); } @@ -168,7 +168,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { public void onRaceAborted(TimePoint eventTime) { /*RaceLogEvent abortEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, raceLog.getCurrentPassId(), RaceLogRaceStatus.UNSCHEDULED); this.raceLog.add(abortEvent);*/ - RaceLogEvent passChangeEvent = RaceLogEventFactory.INSTANCE.createPassChangeEvent(eventTime, raceLog.getCurrentPassId() + 1); + RaceLogEvent passChangeEvent = RaceLogEventFactory.INSTANCE.createPassChangeEvent(eventTime, author, raceLog.getCurrentPassId() + 1); this.raceLog.add(passChangeEvent); registerStartProcedure(); fireRaceAborted(); @@ -176,19 +176,19 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void onRaceStartphaseEntered(TimePoint eventTime) { - RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, raceLog.getCurrentPassId(), RaceLogRaceStatus.STARTPHASE); + RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.STARTPHASE); this.raceLog.add(statusEvent); } @Override public void onRaceStarted(TimePoint eventTime) { - RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, raceLog.getCurrentPassId(), RaceLogRaceStatus.RUNNING); + RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.RUNNING); this.raceLog.add(statusEvent); } @Override public void onRaceFinishing(TimePoint eventTime) { - RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHING); + RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHING); this.raceLog.add(statusEvent); } @@ -200,7 +200,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void onRaceFinished(TimePoint eventTime) { - RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHED); + RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHED); this.raceLog.add(statusEvent); } @@ -222,7 +222,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { public void setFinishPositioningListChanged(List> positionedCompetitors) { TimePoint eventTime = MillisecondsTimePoint.now(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningListChangedEvent(eventTime, raceLog.getCurrentPassId(), positionedCompetitors); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningListChangedEvent(eventTime, author, raceLog.getCurrentPassId(), positionedCompetitors); this.raceLog.add(event); } @@ -237,14 +237,14 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { List> positionedCompetitors = getFinishPositioningList(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(eventTime, raceLog.getCurrentPassId(), positionedCompetitors); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(eventTime, author, raceLog.getCurrentPassId(), positionedCompetitors); this.raceLog.add(event); } @Override public void setProtestStartTime(TimePoint protestStartTime) { TimePoint eventTime = MillisecondsTimePoint.now(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createProtestStartTimeEvent(eventTime, raceLog.getCurrentPassId(), protestStartTime); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createProtestStartTimeEvent(eventTime, author, raceLog.getCurrentPassId(), protestStartTime); this.raceLog.add(event); fireProtestStartTimeChanged(); } @@ -257,7 +257,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void setWindFix(Wind windFix) { TimePoint eventTime = MillisecondsTimePoint.now(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(eventTime, raceLog.getCurrentPassId(), windFix); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(eventTime, author, raceLog.getCurrentPassId(), windFix); this.raceLog.add(event); } From 832e73e2ff6135c6999b3e93f13746cee66f7bc8 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jul 2013 16:30:28 +0200 Subject: [PATCH 025/450] added RaceLogEventAuthor to RaceLogEvent and factored this through all constructor / factory / persistence / serialization code --- .../impl/DomainObjectFactoryImpl.java | 78 +++++++++++-------- .../domain/persistence/impl/FieldNames.java | 3 +- .../impl/MongoObjectFactoryImpl.java | 9 +++ .../racelog/impl/RaceLogEventAuthorImpl.java | 19 +++++ .../sap/sailing/domain/test/RaceLogTest.java | 7 +- .../test/StoreAndLoadRaceLogEventsTest.java | 13 ++-- ...tStoringAndRetrievingRaceLogEventData.java | 5 +- ...ingAndRetrievingRaceLogInLeaderboards.java | 6 +- ...tStoringAndRetrievingRaceLogInRegatta.java | 7 +- ...ourseDesignChangedEventSerializerTest.java | 9 ++- .../racelog/RaceLogEventSerializerTest.java | 3 + ...sitioningConfirmedEventSerializerTest.java | 5 +- .../RaceLogWindFixEventSerializerTest.java | 5 +- .../impl/BaseRaceLogEventDeserializer.java | 19 +++-- ...LogCourseAreaChangedEventDeserializer.java | 5 +- ...gCourseDesignChangedEventDeserializer.java | 3 +- ...PositioningConfirmedEventDeserializer.java | 3 +- ...sitioningListChangedEventDeserializer.java | 3 +- .../impl/RaceLogFlagEventDeserializer.java | 3 +- ...gGateLineOpeningTimeEventDeserializer.java | 8 +- .../RaceLogPassChangeEventDeserializer.java | 3 +- .../RaceLogPathFinderEventDeserializer.java | 5 +- ...eLogProtestStartTimeEventDeserializer.java | 5 +- .../RaceLogRaceStatusEventDeserializer.java | 3 +- ...tartProcedureChangedEventDeserializer.java | 5 +- .../RaceLogStartTimeEventDeserializer.java | 5 +- .../impl/RaceLogWindFixEventDeserializer.java | 5 +- .../impl/BaseRaceLogEventSerializer.java | 6 ++ .../test/RaceLogReplicationTest.java | 3 + .../server/test/MasterDataImportTest.java | 3 + .../server/test/RaceLogInRaceColumnTest.java | 3 + .../RaceLogOperationalTransformationTest.java | 3 + .../server/test/WindByRaceLogTest.java | 3 + 33 files changed, 185 insertions(+), 80 deletions(-) create mode 100755 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.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 90b3bd6378d..24fede93b68 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 @@ -91,6 +91,7 @@ import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventRestoreFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; @@ -105,6 +106,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.impl.RaceLogEventAuthorImpl; import com.sap.sailing.domain.racelog.impl.RaceLogImpl; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.Wind; @@ -1029,72 +1031,80 @@ 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; + 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) { + author = new RaceLogEventAuthorImpl(authorName, authorPriority.intValue()); + } else { + author = null; + } String eventClass = (String) dbObject.get(FieldNames.RACE_LOG_EVENT_CLASS.name()); if (eventClass.equals(RaceLogStartTimeEvent.class.getSimpleName())) { - return loadRaceLogStartTimeEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogStartTimeEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogRaceStatusEvent.class.getSimpleName())) { - return loadRaceLogRaceStatusEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogRaceStatusEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogFlagEvent.class.getSimpleName())) { - return loadRaceLogFlagEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogFlagEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogPassChangeEvent.class.getSimpleName())) { - return loadRaceLogPassChangeEvent(createdAt, timePoint, id, passId, competitors); + return loadRaceLogPassChangeEvent(createdAt, author, timePoint, id, passId, competitors); } else if (eventClass.equals(RaceLogCourseAreaChangedEvent.class.getSimpleName())) { - return loadRaceLogCourseAreaChangedEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogCourseAreaChangedEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogCourseDesignChangedEvent.class.getSimpleName())) { - return loadRaceLogCourseDesignChangedEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogCourseDesignChangedEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogFinishPositioningListChangedEvent.class.getSimpleName())) { - return loadRaceLogFinishPositioningListChangedEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogFinishPositioningListChangedEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogFinishPositioningConfirmedEvent.class.getSimpleName())) { - return loadRaceLogFinishPositioningConfirmedEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogFinishPositioningConfirmedEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogPathfinderEvent.class.getSimpleName())) { - return loadRaceLogPathfinderEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogPathfinderEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogGateLineOpeningTimeEvent.class.getSimpleName())) { - return loadRaceLogGateLineOpeningTimeEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogGateLineOpeningTimeEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogStartProcedureChangedEvent.class.getSimpleName())) { - return loadRaceLogStartProcedureChangedEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogStartProcedureChangedEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogProtestStartTimeEvent.class.getSimpleName())) { - return loadRaceLogRaceLogProtestStartTimeEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogRaceLogProtestStartTimeEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogWindFixEvent.class.getSimpleName())) { - return loadRaceLogRaceLogWindFixEvent(createdAt, timePoint, id, passId, competitors, dbObject); + return loadRaceLogRaceLogWindFixEvent(createdAt, author, timePoint, id, passId, competitors, dbObject); } throw new IllegalStateException(String.format("Unknown RaceLogEvent type %s", eventClass)); } - private RaceLogEvent loadRaceLogRaceLogWindFixEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, - Integer passId, List competitors, DBObject dbObject) { + private RaceLogEvent loadRaceLogRaceLogWindFixEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, + Serializable id, Integer passId, List competitors, DBObject dbObject) { Wind wind = loadWind((DBObject) dbObject.get(FieldNames.WIND.name())); return raceLogEventFactory.createWindFixEvent(createdAt, author, timePoint, id, competitors, passId, wind); } - private RaceLogEvent loadRaceLogRaceLogProtestStartTimeEvent(TimePoint createdAt, TimePoint timePoint, - Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogEvent loadRaceLogRaceLogProtestStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { TimePoint protestStartTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_PROTEST_START_TIME); return raceLogEventFactory.createProtestStartTimeEvent(createdAt, author, timePoint, id, competitors, passId, protestStartTime); } - private RaceLogEvent loadRaceLogStartProcedureChangedEvent(TimePoint createdAt, TimePoint timePoint, - Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogEvent loadRaceLogStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { StartProcedureType type = StartProcedureType.valueOf(dbObject.get(FieldNames.RACE_LOG_START_PROCEDURE_TYPE.name()).toString()); return raceLogEventFactory.createStartProcedureChangedEvent(createdAt, author, timePoint, id, competitors, passId, type); } - private RaceLogEvent loadRaceLogGateLineOpeningTimeEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, - Integer passId, List competitors, DBObject dbObject) { + private RaceLogEvent loadRaceLogGateLineOpeningTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, + Serializable id, Integer passId, List competitors, DBObject dbObject) { Number gateLineOpeningTime = (Number) dbObject.get(FieldNames.RACE_LOG_GATE_LINE_OPENING_TIME.name()); return raceLogEventFactory.createGateLineOpeningTimeEvent(createdAt, author, timePoint, id, competitors, passId, gateLineOpeningTime == null ? null : gateLineOpeningTime.longValue()); } - private RaceLogEvent loadRaceLogPathfinderEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, - Integer passId, List competitors, DBObject dbObject) { + private RaceLogEvent loadRaceLogPathfinderEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, + Serializable id, Integer passId, List competitors, DBObject dbObject) { String pathfinderId = dbObject.get(FieldNames.RACE_LOG_PATHFINDER_ID.name()).toString(); return raceLogEventFactory.createPathfinderEvent(createdAt, author, timePoint, id, competitors, passId, pathfinderId); } - private RaceLogEvent loadRaceLogFinishPositioningConfirmedEvent(TimePoint createdAt, TimePoint timePoint, - Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogEvent loadRaceLogFinishPositioningConfirmedEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { BasicDBList dbPositionedCompetitorList = (BasicDBList) dbObject.get(FieldNames.RACE_LOG_POSITIONED_COMPETITORS.name()); List> positionedCompetitors = null; //When a confirmation event is loaded that does not contain the positioned competitors (this is the case for the ESS events in @@ -1106,26 +1116,26 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createFinishPositioningConfirmedEvent(createdAt, author, timePoint, id, competitors, passId, positionedCompetitors); } - private RaceLogEvent loadRaceLogFinishPositioningListChangedEvent(TimePoint createdAt, TimePoint timePoint, - Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogEvent loadRaceLogFinishPositioningListChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { BasicDBList dbPositionedCompetitorList = (BasicDBList) dbObject.get(FieldNames.RACE_LOG_POSITIONED_COMPETITORS.name()); List> positionedCompetitors = loadPositionedCompetitors(dbPositionedCompetitorList); return raceLogEventFactory.createFinishPositioningListChangedEvent(createdAt, author, timePoint, id, competitors, passId, positionedCompetitors); } - private RaceLogEvent loadRaceLogPassChangeEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, - Integer passId, List competitors) { + private RaceLogEvent loadRaceLogPassChangeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, + Serializable id, Integer passId, List competitors) { return raceLogEventFactory.createPassChangeEvent(createdAt, author, timePoint, id, competitors, passId); } - private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, 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, timePoint, id, competitors, passId, courseData); } - private RaceLogCourseAreaChangedEvent loadRaceLogCourseAreaChangedEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogCourseAreaChangedEvent loadRaceLogCourseAreaChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Serializable courseAreaId = (Serializable) dbObject.get(FieldNames.COURSE_AREA_ID.name()); return raceLogEventFactory.createCourseAreaChangedEvent(createdAt, author, timePoint, id, competitors, passId, courseAreaId); } @@ -1166,7 +1176,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return competitors; } - private RaceLogFlagEvent loadRaceLogFlagEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogFlagEvent loadRaceLogFlagEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, 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())); @@ -1178,12 +1188,12 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createFlagEvent(createdAt, author, timePoint, id, competitors, passId, upperFlag, lowerFlag, displayed); } - private RaceLogStartTimeEvent loadRaceLogStartTimeEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogStartTimeEvent loadRaceLogStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { TimePoint startTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_EVENT_START_TIME); return raceLogEventFactory.createStartTimeEvent(createdAt, author, timePoint, id, competitors, passId, startTime); } - private RaceLogRaceStatusEvent loadRaceLogRaceStatusEvent(TimePoint createdAt, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { + private RaceLogRaceStatusEvent loadRaceLogRaceStatusEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, 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, timePoint, id, competitors, passId, nextStatus); } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index 1ccaf2b5a3d..ef85214b119 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -69,7 +69,8 @@ public enum FieldNames { // race log RACE_LOG_IDENTIFIER, - RACE_LOG_EVENT, RACE_LOG_EVENT_PASS_ID, RACE_LOG_EVENT_ID, RACE_LOG_EVENT_CREATED_AT, RACE_LOG_EVENT_INVOLVED_BOATS, RACE_LOG_EVENT_FLAG_UPPER, RACE_LOG_EVENT_FLAG_LOWER, + RACE_LOG_EVENT, RACE_LOG_EVENT_PASS_ID, RACE_LOG_EVENT_ID, RACE_LOG_EVENT_CREATED_AT, RACE_LOG_EVENT_AUTHOR_NAME, RACE_LOG_EVENT_AUTHOR_PRIORITY, + RACE_LOG_EVENT_INVOLVED_BOATS, RACE_LOG_EVENT_FLAG_UPPER, RACE_LOG_EVENT_FLAG_LOWER, RACE_LOG_EVENT_FLAG_DISPLAYED, RACE_LOG_EVENT_START_TIME, RACE_LOG_EVENT_CLASS, RACE_LOG_EVENT_NEXT_STATUS, RACE_LOG_COURSE_DESIGN, WAYPOINT_ID, WAYPOINT_NAME, WAYPOINT_PASSINGSIDE, CONTROLPOINT, CONTROLPOINT_CLASS, MARK_ID, MARK_COLOR, MARK_NAME, MARK_PATTERN, MARK_SHAPE, MARK_TYPE, CONTROLPOINT_VALUE, GATE_ID, GATE_NAME, GATE_LEFT, GATE_RIGHT, RACE_LOG_POSITIONED_COMPETITORS, RACE_LOG_PATHFINDER_ID, RACE_LOG_GATE_LINE_OPENING_TIME, 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 f38d50af98b..82293372560 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 @@ -48,6 +48,7 @@ import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; @@ -533,6 +534,13 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { result.ensureIndex(new BasicDBObject(FieldNames.RACE_LOG_IDENTIFIER.name(), null)); return result; } + + private void storeRaceLogEventAuthor(DBObject dbObject, RaceLogEventAuthor 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()); + } + } public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogFlagEvent flagEvent) { BasicDBObject result = new BasicDBObject(); @@ -695,6 +703,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { result.put(FieldNames.RACE_LOG_EVENT_ID.name(), event.getId()); result.put(FieldNames.RACE_LOG_EVENT_PASS_ID.name(), event.getPassId()); result.put(FieldNames.RACE_LOG_EVENT_INVOLVED_BOATS.name(), storeInvolvedBoatsForRaceLogEvent(event.getInvolvedBoats())); + storeRaceLogEventAuthor(result, event.getAuthor()); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java new file mode 100755 index 00000000000..897a6785b85 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java @@ -0,0 +1,19 @@ +package com.sap.sailing.domain.racelog.impl; + +import com.sap.sailing.domain.common.impl.NamedImpl; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; + +public class RaceLogEventAuthorImpl extends NamedImpl implements RaceLogEventAuthor { + private static final long serialVersionUID = -5602802911563685812L; + private final int priority; + + public RaceLogEventAuthorImpl(String name, int priority) { + super(name); + this.priority = priority; + } + + @Override + public int getPriority() { + return priority; + } +} 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 b1b8b533b89..5184e05543b 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 @@ -19,12 +19,15 @@ import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.domain.racelog.impl.RaceLogImpl; public class RaceLogTest { + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); @Test public void testAddingTwoEventsOfDifferentPassesButSameTimestamps() { @@ -32,8 +35,8 @@ public class RaceLogTest { int passId = 0; RaceLog raceLog = new RaceLogImpl("RaceLogTest", "test-identifier"); - RaceLogFlagEvent rcEvent1 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, author, author, UUID.randomUUID(), new ArrayList(), passId, Flags.CLASS, Flags.NONE, false); - RaceLogFlagEvent rcEvent2 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, author, author, UUID.randomUUID(), new ArrayList(), ++passId, Flags.CLASS, Flags.NONE, false); + RaceLogFlagEvent rcEvent1 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, author, UUID.randomUUID(), new ArrayList(), passId, Flags.CLASS, Flags.NONE, false); + RaceLogFlagEvent rcEvent2 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, author, UUID.randomUUID(), new ArrayList(), ++passId, Flags.CLASS, Flags.NONE, false); raceLog.add(rcEvent1); raceLog.add(rcEvent2); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java index 862c265c440..4d5bd1ee842 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java @@ -29,12 +29,14 @@ import com.sap.sailing.domain.persistence.impl.FieldNames; import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; 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.impl.RaceLogEventAuthorImpl; public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { @@ -50,6 +52,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { protected Serializable expectedId = UUID.randomUUID(); protected List expectedInvolvedBoats = Collections.emptyList(); protected int expectedPassId = 42; + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); public StoreAndLoadRaceLogEventsTest() throws UnknownHostException, MongoException { super(); @@ -76,7 +79,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { Flags lowerFlag = Flags.BRAVO; boolean isDisplayed = true; - RaceLogFlagEvent expectedEvent = eventFactory.createFlagEvent(expectedEventTime, author, + RaceLogFlagEvent expectedEvent = eventFactory.createFlagEvent(expectedEventTime, author, expectedId, expectedInvolvedBoats, expectedPassId, upperFlag, lowerFlag, isDisplayed); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); @@ -93,7 +96,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { Serializable courseAreaId = UUID.randomUUID(); RaceLogCourseAreaChangedEvent expectedEvent = eventFactory.createCourseAreaChangedEvent( - expectedEventTime, author, author, expectedId, expectedInvolvedBoats, expectedPassId, courseAreaId); + expectedEventTime, author, expectedId, expectedInvolvedBoats, expectedPassId, courseAreaId); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); RaceLogCourseAreaChangedEvent actualEvent = loadEvent(dbObject); @@ -104,7 +107,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { @Test public void testStoreAndLoadPassChangeEvent() { - RaceLogPassChangeEvent expectedEvent = eventFactory.createPassChangeEvent(expectedEventTime, author, + RaceLogPassChangeEvent expectedEvent = eventFactory.createPassChangeEvent(expectedEventTime, author, expectedId, expectedInvolvedBoats, expectedPassId); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); @@ -116,7 +119,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { @Test public void testStoreAndLoadRaceStatusEvent() { RaceLogRaceStatus status = RaceLogRaceStatus.SCHEDULED; - RaceLogRaceStatusEvent expectedEvent = eventFactory.createRaceStatusEvent(expectedEventTime, author, + RaceLogRaceStatusEvent expectedEvent = eventFactory.createRaceStatusEvent(expectedEventTime, author, expectedId, expectedInvolvedBoats, expectedPassId, status); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); @@ -129,7 +132,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest { @Test public void testStoreAndLoadStartTimeEvent() { TimePoint startTime = new MillisecondsTimePoint(1337); - RaceLogStartTimeEvent expectedEvent = eventFactory.createStartTimeEvent(expectedEventTime, author, + RaceLogStartTimeEvent expectedEvent = eventFactory.createStartTimeEvent(expectedEventTime, author, expectedId, expectedInvolvedBoats, expectedPassId, startTime); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogEventData.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogEventData.java index 0854ba557df..71e627f8d07 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogEventData.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogEventData.java @@ -18,12 +18,15 @@ import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.persistence.MongoFactory; import com.sap.sailing.domain.persistence.impl.DomainObjectFactoryImpl; import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; public class TestStoringAndRetrievingRaceLogEventData extends AbstractMongoDBTest { private static final String RACELOG_TEST_COLLECTION = "racelog_test_collection"; - + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); + public TestStoringAndRetrievingRaceLogEventData() throws UnknownHostException, MongoException { super(); } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index 317f78dd1fa..ac64b7b2d46 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -43,6 +43,7 @@ import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; @@ -56,6 +57,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.impl.RaceLogEventAuthorImpl; import com.sap.sailing.domain.tracking.Wind; public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoDBTest { @@ -63,10 +65,10 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = null; - + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); + public TestStoringAndRetrievingRaceLogInLeaderboards() throws UnknownHostException, MongoException { super(); - } @Before diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index 8a369599429..5c0805e62f0 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -49,6 +49,7 @@ import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningListChangedEvent; @@ -62,6 +63,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.impl.RaceLogEventAuthorImpl; import com.sap.sailing.domain.tracking.Wind; public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest { @@ -73,10 +75,10 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest MongoObjectFactory mongoObjectFactory = null; DomainObjectFactory domainObjectFactory = null; Regatta regatta = null; + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); public TestStoringAndRetrievingRaceLogInRegatta() throws UnknownHostException, MongoException { super(); - } @Before @@ -86,7 +88,8 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest domainObjectFactory = MongoFactory.INSTANCE.getDomainObjectFactory(getMongoService()); BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("29erXX", /* typicallyStartsUpwind */ true); - regatta = createRegattaAndAddRaceColumns(1, regattaName, boatClass, true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT)); + regatta = createRegattaAndAddRaceColumns(1, regattaName, boatClass, true, + DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT)); } private Regatta createRegattaAndAddRaceColumns(final int numberOfQualifyingRaces, final String regattaBaseName, BoatClass boatClass, boolean persistent, ScoringScheme scoringScheme) { diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java index 9088b4f75d8..b5fe3fee53f 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java @@ -25,7 +25,9 @@ import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.coursedata.impl.ControlPointDeserializer; import com.sap.sailing.server.gateway.deserialization.coursedata.impl.CourseDataDeserializer; @@ -51,15 +53,16 @@ public class RaceLogCourseDesignChangedEventSerializerTest { private RaceLogCourseDesignChangedEventDeserializer deserializer; private RaceLogCourseDesignChangedEvent event; private TimePoint now; + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); @Before public void setUp() { SharedDomainFactory factory = DomainFactory.INSTANCE; NationalityJsonSerializer nationalityJsonSerializer = new NationalityJsonSerializer(); serializer = new RaceLogCourseDesignChangedEventSerializer(new CompetitorJsonSerializer(new TeamJsonSerializer( - new PersonJsonSerializer(nationalityJsonSerializer))), - new CourseBaseJsonSerializer(new WaypointJsonSerializer(new ControlPointJsonSerializer( - new MarkJsonSerializer(), new GateJsonSerializer(new MarkJsonSerializer()))))); + new PersonJsonSerializer(nationalityJsonSerializer))), new CourseBaseJsonSerializer( + new WaypointJsonSerializer(new ControlPointJsonSerializer(new MarkJsonSerializer(), + new GateJsonSerializer(new MarkJsonSerializer()))))); deserializer = new RaceLogCourseDesignChangedEventDeserializer(new CompetitorDeserializer(factory), new CourseDataDeserializer(new WaypointDeserializer(new ControlPointDeserializer(new MarkDeserializer( factory), new GateDeserializer(factory, new MarkDeserializer(factory)))))); diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index 438ee4b6194..24efbbd2ee2 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -9,7 +9,9 @@ import org.junit.Test; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.StartProcedureType; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEventSerializer; @@ -32,6 +34,7 @@ public class RaceLogEventSerializerTest { private JsonSerializer windFixEventSerializer; private RaceLogEventFactory factory; + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); @SuppressWarnings("unchecked") @Before diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java index e186a7fe8e1..82e2426069a 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java @@ -20,8 +20,10 @@ import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Triple; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFinishPositioningConfirmedEvent; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.impl.CompetitorDeserializer; import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogFinishPositioningConfirmedEventDeserializer; @@ -38,7 +40,8 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { private RaceLogFinishPositioningConfirmedEvent event; private TimePoint now; private List> positioningList; - + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); + @Before public void setUp() { SharedDomainFactory factory = DomainFactory.INSTANCE; diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java index 0d7a4e6eb86..8e6499e0f09 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java @@ -18,8 +18,10 @@ import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.Util; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; @@ -41,7 +43,8 @@ public class RaceLogWindFixEventSerializerTest { private RaceLogWindFixEventDeserializer deserializer; private RaceLogWindFixEvent event; private TimePoint now; - + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); + @Before public void setUp() { SharedDomainFactory factory = DomainFactory.INSTANCE; diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/BaseRaceLogEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/BaseRaceLogEventDeserializer.java index 8a3edae78e9..c6cfc7d8899 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/BaseRaceLogEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/BaseRaceLogEventDeserializer.java @@ -11,7 +11,9 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventRestoreFactory; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.Helpers; @@ -27,7 +29,7 @@ public abstract class BaseRaceLogEventDeserializer implements JsonDeserializer competitors) + protected abstract RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException; @Override @@ -46,14 +48,21 @@ public abstract class BaseRaceLogEventDeserializer implements JsonDeserializer competitors) + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { - Serializable courseAreaId = (Serializable) object.get(RaceLogCourseAreaChangedEventSerializer.FIELD_COURSE_AREA_ID); - return factory.createCourseAreaChangedEvent(createdAt, author, timePoint, id, competitors, passId, Helpers.tryUuidConversion(courseAreaId)); } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java index ddcbd4dfc56..2560dece218 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java @@ -9,6 +9,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.coursedata.impl.CourseDataDeserializer; @@ -24,7 +25,7 @@ public class RaceLogCourseDesignChangedEventDeserializer extends BaseRaceLogEven } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { JSONObject jsonCourseDesign = (JSONObject) object.get(RaceLogCourseDesignChangedEventSerializer.FIELD_COURSE_DESIGN); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java index 1aacdf5e3c4..d0e811f1cb1 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningConfirmedEventDeserializer.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.Helpers; @@ -24,7 +25,7 @@ public class RaceLogFinishPositioningConfirmedEventDeserializer extends BaseRace } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { JSONArray jsonPositionedCompetitors = Helpers.getNestedArraySafe(object, RaceLogFinishPositioningConfirmedEventSerializer.FIELD_POSITIONED_COMPETITORS); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java index 5d2b4393dfc..34fa750e2e2 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningListChangedEventDeserializer.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.Helpers; @@ -24,7 +25,7 @@ public class RaceLogFinishPositioningListChangedEventDeserializer extends BaseRa } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { JSONArray jsonPositionedCompetitors = Helpers.getNestedArraySafe(object, RaceLogFinishPositioningListChangedEventSerializer.FIELD_POSITIONED_COMPETITORS); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFlagEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFlagEventDeserializer.java index 0a0e142ce84..2852c80a812 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFlagEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFlagEventDeserializer.java @@ -9,6 +9,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFlagEventSerializer; @@ -19,7 +20,7 @@ public class RaceLogFlagEventDeserializer extends BaseRaceLogEventDeserializer { } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) { + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) { Flags upperFlag = Flags.valueOf(object.get(RaceLogFlagEventSerializer.FIELD_UPPER_FLAG).toString()); Flags lowerFlag = Flags.valueOf(object.get(RaceLogFlagEventSerializer.FIELD_LOWER_FLAG).toString()); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java index f462edd3557..a9e290de2ac 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogGateLineOpeningTimeEventDeserializer.java @@ -8,6 +8,7 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogGateLineOpeningTimeEventSerializer; @@ -20,10 +21,9 @@ public class RaceLogGateLineOpeningTimeEventDeserializer extends BaseRaceLogEven } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, - List competitors) throws JsonDeserializationException { + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, + int passId, List competitors) throws JsonDeserializationException { Long gateLineOpeningTime = (Long) object.get(RaceLogGateLineOpeningTimeEventSerializer.FIELD_GATE_LINE_OPENING_TIME); - return factory.createGateLineOpeningTimeEvent(timePoint, author, author, id, competitors, passId, gateLineOpeningTime); + return factory.createGateLineOpeningTimeEvent(timePoint, author, id, competitors, passId, gateLineOpeningTime); } - } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPassChangeEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPassChangeEventDeserializer.java index f15e8388172..e0b138f7778 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPassChangeEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPassChangeEventDeserializer.java @@ -8,6 +8,7 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; public class RaceLogPassChangeEventDeserializer extends BaseRaceLogEventDeserializer { @@ -17,7 +18,7 @@ public class RaceLogPassChangeEventDeserializer extends BaseRaceLogEventDeserial } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) { + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) { return factory.createPassChangeEvent(createdAt, author, timePoint, id, competitors, passId); } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPathFinderEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPathFinderEventDeserializer.java index 44c39fde75f..dbdb2d781f4 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPathFinderEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogPathFinderEventDeserializer.java @@ -8,6 +8,7 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogPathfinderEventSerializer; @@ -20,8 +21,8 @@ public class RaceLogPathFinderEventDeserializer extends BaseRaceLogEventDeserial } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, - List competitors) throws JsonDeserializationException { + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, + int passId, List competitors) throws JsonDeserializationException { String pathfinderId = object.get(RaceLogPathfinderEventSerializer.FIELD_PATHFINDER_ID).toString(); return factory.createPathfinderEvent(createdAt, author, timePoint, id, competitors, passId, pathfinderId); } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogProtestStartTimeEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogProtestStartTimeEventDeserializer.java index 8b980af8499..e579b13e50b 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogProtestStartTimeEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogProtestStartTimeEventDeserializer.java @@ -9,6 +9,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogProtestStartTimeEventSerializer; @@ -20,8 +21,8 @@ public class RaceLogProtestStartTimeEventDeserializer extends BaseRaceLogEventDe } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, - int passId, List competitors) throws JsonDeserializationException { + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { Long protestStartTime = (Long) object.get(RaceLogProtestStartTimeEventSerializer.FIELD_PROTEST_START_TIME); return factory.createProtestStartTimeEvent(createdAt, author, timePoint, id, competitors, passId, new MillisecondsTimePoint(protestStartTime)); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogRaceStatusEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogRaceStatusEventDeserializer.java index ef22460bfa3..0f6498c4a2e 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogRaceStatusEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogRaceStatusEventDeserializer.java @@ -9,6 +9,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogRaceStatusEventSerializer; @@ -20,7 +21,7 @@ public class RaceLogRaceStatusEventDeserializer extends BaseRaceLogEventDeserial } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { String statusValue = object.get(RaceLogRaceStatusEventSerializer.FIELD_NEXT_STATUS).toString(); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java index eba0da20243..6172a0daeb1 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java @@ -9,6 +9,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.racelog.StartProcedureType; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogStartProcedureChangedEventSerializer; @@ -20,8 +21,8 @@ public class RaceLogStartProcedureChangedEventDeserializer extends BaseRaceLogEv } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, - int passId, List competitors) throws JsonDeserializationException { + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { StartProcedureType type = StartProcedureType.valueOf(object.get(RaceLogStartProcedureChangedEventSerializer.FIELD_START_PROCEDURE_TYPE).toString()); return factory.createStartProcedureChangedEvent(createdAt, author, timePoint, id, competitors, passId, type); } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartTimeEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartTimeEventDeserializer.java index b69b55c15f4..b19153d0811 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartTimeEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartTimeEventDeserializer.java @@ -9,6 +9,7 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; @@ -21,12 +22,12 @@ public class RaceLogStartTimeEventDeserializer extends RaceLogRaceStatusEventDes } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, int passId, List competitors) + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { long startTime = (Long) object.get(RaceLogStartTimeEventSerializer.FIELD_START_TIME); - RaceLogRaceStatusEvent event = (RaceLogRaceStatusEvent) super.deserialize(object, id, createdAt, timePoint, passId, competitors); + RaceLogRaceStatusEvent event = (RaceLogRaceStatusEvent) super.deserialize(object, id, createdAt, author, timePoint, passId, competitors); return factory.createStartTimeEvent(event.getCreatedAt(), author, event.getTimePoint(), event.getId(), event.getInvolvedBoats(), event.getPassId(), new MillisecondsTimePoint(startTime)); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java index 062b106a548..49603f6ff72 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java @@ -8,6 +8,7 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; @@ -24,8 +25,8 @@ public class RaceLogWindFixEventDeserializer extends BaseRaceLogEventDeserialize } @Override - protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, TimePoint timePoint, - int passId, List competitors) throws JsonDeserializationException { + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, + TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { JSONObject windJsonObject = Helpers.getNestedObjectSafe(object, RaceLogWindFixEventSerializer.FIELD_WIND); Wind wind = windDeserializer.deserialize(windJsonObject); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/BaseRaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/BaseRaceLogEventSerializer.java index 00258c2b13c..1b0b9530e9d 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/BaseRaceLogEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/racelog/impl/BaseRaceLogEventSerializer.java @@ -14,6 +14,8 @@ public abstract class BaseRaceLogEventSerializer implements JsonSerializer, RacingEventService> server; + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); @Before public void setUp() { diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java index 40b45e7b18f..dc5aaf6b839 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java @@ -14,7 +14,9 @@ import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.domain.racelog.impl.RaceLogImpl; import com.sap.sailing.domain.racelog.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.operationaltransformation.OperationalTransformer; @@ -32,6 +34,7 @@ public class RaceLogOperationalTransformationTest { private Peer, RaceLog> client2; private Peer, RaceLog> server; private OperationalTransformer> transformer; + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); @Before public void setUp() { diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java index 465b897e285..1c11cdd3e67 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java @@ -38,8 +38,10 @@ import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogWindFixEvent; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindTrack; @@ -65,6 +67,7 @@ public class WindByRaceLogTest { private Fleet defaultFleet; private RacingEventService service; + private RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test Author", 1); @Before public void setup() throws Exception { From d23ec67104bb3de4807866883730ca6170294c7e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jul 2013 16:41:29 +0200 Subject: [PATCH 026/450] added test for author serialization and deserialization --- .../racelog/AbstractEventSerializerTest.java | 4 +++ .../test/racelog/BaseEventSerializerTest.java | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/AbstractEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/AbstractEventSerializerTest.java index cf3d7f500e5..23f5e83b30b 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/AbstractEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/AbstractEventSerializerTest.java @@ -16,6 +16,8 @@ import org.junit.Test; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.BaseRaceLogEventSerializer; @@ -29,6 +31,7 @@ public abstract class AbstractEventSerializerTest competitorSerializer; protected JsonSerializer serializer; protected EventType event; + protected final RaceLogEventAuthor author = new RaceLogEventAuthorImpl("Test author", 1); protected abstract EventType createMockEvent(); @@ -52,6 +55,7 @@ public abstract class AbstractEventSerializerTest emptyList()); + when(event.getAuthor()).thenReturn(author); } @Test diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/BaseEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/BaseEventSerializerTest.java index 001ced1dbc9..3bc6806d847 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/BaseEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/BaseEventSerializerTest.java @@ -1,15 +1,27 @@ package com.sap.sailing.server.gateway.serialization.test.racelog; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; +import java.util.Collections; + import org.json.simple.JSONObject; import org.junit.Test; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.DomainFactory; +import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; +import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; +import com.sap.sailing.domain.racelog.impl.RaceLogFlagEventImpl; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer; import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.BaseRaceLogEventSerializer; +import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEventSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFlagEventSerializer; public class BaseEventSerializerTest extends AbstractEventSerializerTest { @@ -45,5 +57,18 @@ public class BaseEventSerializerTest extends AbstractEventSerializerTestemptyList(), + /* pPassId */ 1, Flags.NOVEMBER, Flags.NONE, /* pIsDisplayed */ true)); + RaceLogEventDeserializer deserializer = RaceLogEventDeserializer.create(DomainFactory.INSTANCE); + RaceLogEvent deserializedEvent = deserializer.deserialize(json); + final RaceLogEventAuthor myAuthor = deserializedEvent.getAuthor(); + assertNotNull(myAuthor); + assertEquals(author.getName(), myAuthor.getName()); + assertEquals(author.getPriority(), myAuthor.getPriority()); + } } From e7459b88638eb349ac826eb1a3100fa08d3a87ca Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 21 Jul 2013 17:45:29 +0200 Subject: [PATCH 027/450] removed strange refactoring artifacts such as duplicate "author" arguments --- .../res/values/strings.xml | 1 + .../ExtremeSailingSeriesStartProcedure.java | 26 +++++++++---------- .../impl/GateStartProcedure.java | 20 +++++++------- .../impl/RRS26StartProcedure.java | 22 ++++++++-------- .../app/domain/state/impl/RaceStateImpl.java | 4 +-- .../app/ui/fragments/dialogs/LoginDialog.java | 2 +- 6 files changed, 38 insertions(+), 37 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml index 1b6998cdb0d..c7d764b645a 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml @@ -45,6 +45,7 @@ Gate start Fixed line start Select an event: + Login onto course area Select a course area: Please schedule the start time to Select a race starting mode diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java index 0e0e3ee22ae..c002469c0c7 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java @@ -113,7 +113,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { raceStateChangedListener.onRaceStartphaseEntered(eventTime); } - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.AP, Flags.NONE, /*isDisplayed*/false); raceLog.add(event); @@ -123,7 +123,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleEssThreeUp(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTHREE, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); @@ -134,11 +134,11 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { private void handleEssTwoUpAndEssThreeDown(TimePoint eventTime) { - RaceLogEvent essThreeDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent essThreeDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTHREE, Flags.NONE, /*isDisplayed*/false); raceLog.add(essThreeDownEvent); - RaceLogEvent essTwoUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent essTwoUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTWO, Flags.NONE, /*isDisplayed*/true); raceLog.add(essTwoUpEvent); @@ -149,11 +149,11 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { private void handleEssOneUpAndEssTwoDown(TimePoint eventTime) { - RaceLogEvent essTwoDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent essTwoDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTWO, Flags.NONE, /*isDisplayed*/false); raceLog.add(essTwoDownEvent); - RaceLogEvent essOneUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent essOneUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSONE, Flags.NONE, /*isDisplayed*/true); raceLog.add(essOneUpEvent); @@ -163,7 +163,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleEssOneDown(TimePoint eventTime) { - RaceLogEvent essOneDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent essOneDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSONE, Flags.NONE, /*isDisplayed*/false); raceLog.add(essOneDownEvent); @@ -195,7 +195,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @Override public void setFinishing(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); @@ -219,7 +219,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @Override public void setFinished(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /*isDisplayed*/false); raceLog.add(event); @@ -242,7 +242,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleAPUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.AP, lowerFlag, /*isDisplayed*/true); raceLog.add(event); @@ -265,7 +265,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleNovemberUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.NOVEMBER, lowerFlag, /*isDisplayed*/true); raceLog.add(event); @@ -276,7 +276,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @Override public void setGeneralRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.FIRSTSUBSTITUTE, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); @@ -286,7 +286,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } public void setIndividualRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.XRAY, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java index a0f41bef136..9a26f85f274 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java @@ -106,7 +106,7 @@ public class GateStartProcedure implements StartProcedure { raceStateChangedListener.onRaceStartphaseEntered(startPhaseTimePoint); } - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(startPhaseTimePoint, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(startPhaseTimePoint, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.CLASS, Flags.GOLF, true); raceLog.add(event); @@ -117,7 +117,7 @@ public class GateStartProcedure implements StartProcedure { } private void handlePapaUp(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.PAPA, Flags.NONE, true); raceLog.add(event); @@ -130,7 +130,7 @@ public class GateStartProcedure implements StartProcedure { private void handlePapaDown(TimePoint eventTime) { TimePoint papaDownTimepoint = eventTime; - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(papaDownTimepoint, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(papaDownTimepoint, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.PAPA, Flags.NONE, false); raceLog.add(event); @@ -144,7 +144,7 @@ public class GateStartProcedure implements StartProcedure { TimePoint essOneDownTimePoint = eventTime; RaceLogEvent essOneDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(essOneDownTimePoint, - author, author, UUID.randomUUID(), Collections. emptyList(), + author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), Flags.CLASS, Flags.NONE, /* isDisplayed */false); raceLog.add(essOneDownEvent); @@ -187,7 +187,7 @@ public class GateStartProcedure implements StartProcedure { @Override public void setFinishing(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.BLUE, Flags.NONE, true); raceLog.add(event); @@ -204,7 +204,7 @@ public class GateStartProcedure implements StartProcedure { @Override public void setFinished(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.BLUE, Flags.NONE, false); raceLog.add(event); @@ -228,7 +228,7 @@ public class GateStartProcedure implements StartProcedure { } private void handleAPUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.AP, lowerFlag, true); raceLog.add(event); @@ -252,7 +252,7 @@ public class GateStartProcedure implements StartProcedure { } private void handleNovemberUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.NOVEMBER, lowerFlag, true); raceLog.add(event); @@ -264,7 +264,7 @@ public class GateStartProcedure implements StartProcedure { @Override public void setGeneralRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.FIRSTSUBSTITUTE, Flags.NONE, true); raceLog.add(event); @@ -319,7 +319,7 @@ public class GateStartProcedure implements StartProcedure { } public void setGolfRemoval(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.GOLF, Flags.NONE, false); raceLog.add(event); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java index 02161eee958..ec39f62314d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java @@ -112,7 +112,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt raceStateChangedListener.onRaceStartphaseEntered(eventTime); } - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.CLASS, Flags.NONE, true); raceLog.add(event); @@ -123,7 +123,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } private void handleStartRuleUp(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ this.startModeFlag, Flags.NONE, true); raceLog.add(event); @@ -135,7 +135,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private void handleStartRuleDown(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ this.startModeFlag, Flags.NONE, false); raceLog.add(event); @@ -147,7 +147,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private void handleClassDown(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.CLASS, Flags.NONE, false); raceLog.add(event); @@ -184,7 +184,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt @Override public void setFinishing(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.BLUE, Flags.NONE, true); raceLog.add(event); @@ -204,7 +204,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt @Override public void setFinished(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.BLUE, Flags.NONE, false); raceLog.add(event); @@ -228,7 +228,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } private void handleAPUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.AP, lowerFlag, true); raceLog.add(event); @@ -252,7 +252,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } private void handleNovemberUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.NOVEMBER, lowerFlag, true); raceLog.add(event); @@ -264,7 +264,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt @Override public void setGeneralRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.FIRSTSUBSTITUTE, Flags.NONE, true); raceLog.add(event); @@ -275,7 +275,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } public void setIndividualRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.XRAY, Flags.NONE, true); raceLog.add(event); @@ -294,7 +294,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt public void setIndividualRecallRemoval(TimePoint eventTime) { if (isIndividualRecallDisplayed()) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.XRAY, Flags.NONE, false); raceLog.add(event); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java index d546e5e2be9..51b412c4bdb 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java @@ -130,7 +130,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { onRaceAborted(MillisecondsTimePoint.now()); } TimePoint eventTime = startProcedure.getLogicalStartTimeEventTime(newStartTime); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newStartTime); this.raceLog.add(event); fireStartTimeChange(newStartTime); @@ -158,7 +158,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void setCourseDesign(CourseBase newCourseData) { TimePoint eventTime = MillisecondsTimePoint.now(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(eventTime, author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newCourseData); this.raceLog.add(event); fireCourseDesignChanged(); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java index 3998bba8834..1896486f4df 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java @@ -44,7 +44,7 @@ public class LoginDialog extends ActivityAttachedDialogFragment { @Override protected Builder createDialog(Builder builder) { return builder - .setTitle("Login onto course area") + .setTitle(R.string.title_login_onto_course_area) .setIcon(R.drawable.ic_menu_login) .setSingleChoiceItems(loginTypeDescriptions, 0, new OnClickListener() { public void onClick(DialogInterface dialog, int which) { From 4b24f684099c1c1a00b7c41ab220a12a016e512c Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 21 Jul 2013 18:30:01 +0200 Subject: [PATCH 028/450] pass context along as far as needed to fetch RaceLogEventAuthor from AppPreferences where required --- .../res/values/strings.xml | 4 +- .../racecommittee/app/AppPreferences.java | 17 ++++++ .../racecommittee/app/data/DataManager.java | 2 +- .../app/data/OfflineDataManager.java | 54 ++++++++++--------- .../app/data/OnlineDataManager.java | 2 +- .../data/parsers/ManagedRacesDataParser.java | 10 ++-- .../app/domain/impl/ManagedRaceImpl.java | 8 +-- .../ExtremeSailingSeriesStartProcedure.java | 35 ++++++------ .../impl/GateStartProcedure.java | 29 +++++----- .../impl/RRS26StartProcedure.java | 27 +++++----- .../impl/StartProcedureFactory.java | 10 ++-- .../app/domain/state/impl/RaceStateImpl.java | 34 +++++++----- .../app/ui/activities/LoginActivity.java | 1 + .../app/ui/fragments/dialogs/LoginDialog.java | 27 ++++++++-- 14 files changed, 163 insertions(+), 97 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml index 61d5f4218e9..9304e7681be 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml @@ -50,7 +50,9 @@ Select a race starting mode Time to start (with time selected above) Race: - Login as race officer on the selected course. + Login as race officer on the selected course\'s start vessel. + Login as race officer on the selected course\'s finish vessel. + Login as shore control. Login as view-only (demo mode) user. Not yet scheduled Scheduled for %s diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java index 8f6aa5ad047..3399e722db4 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java @@ -8,6 +8,8 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.racecommittee.app.domain.coursedesign.BoatClassType; import com.sap.sailing.racecommittee.app.domain.coursedesign.CourseLayouts; import com.sap.sailing.racecommittee.app.domain.coursedesign.NumberOfRounds; @@ -20,6 +22,8 @@ public class AppPreferences { private final static String PREFERENCE_SERVICE_URL = "webserviceUrlPref"; private final static String PREFERENCE_SENDING_ACTIVE = "sendingActivePref"; + private final static String PREFERENCE_AUTHOR_NAME = "authorName"; + private final static String PREFERENCE_AUTHOR_PRIORITY = "authorPriority"; private final static String PREFERENCE_WIND_BEARING = "windBearingPref"; private final static String PREFERENCE_WIND_SPEED = "windSpeedPref"; @@ -153,6 +157,19 @@ public class AppPreferences { return sp.getString(PREFERENCE_MAIL_RECIPIENT, context.getString(R.string.settings_advanced_mail_default)); } + public static void setAuthor(Context context, RaceLogEventAuthor author) { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + sp.edit().putString(PREFERENCE_AUTHOR_NAME, author.getName()).apply(); + sp.edit().putInt(PREFERENCE_AUTHOR_PRIORITY, author.getPriority()).apply(); + } + + public static RaceLogEventAuthor getAuthor(Context context) { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + String authorName = sp.getString(PREFERENCE_AUTHOR_NAME, ""); + int authorPriority = sp.getInt(PREFERENCE_AUTHOR_PRIORITY, 0); + return new RaceLogEventAuthorImpl(authorName, authorPriority); + } + public static int getMaxRounds(Context context) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); String maxRoundsStr = sp.getString(PREFERENCE_MAX_ROUNDS, "3"); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java index 4fcc253ec4d..a1bcae63e6c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java @@ -8,7 +8,7 @@ public abstract class DataManager implements ReadonlyDataManager { public static ReadonlyDataManager create(Context context) { if (AppConstants.IS_DATA_OFFLINE) { - return new OfflineDataManager(InMemoryDataStore.INSTANCE); + return new OfflineDataManager(context, InMemoryDataStore.INSTANCE); } return new OnlineDataManager(context, InMemoryDataStore.INSTANCE); } 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 56ae889b45d..7f464d40063 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 @@ -8,6 +8,8 @@ import java.util.Date; import java.util.List; import java.util.UUID; +import android.content.Context; + import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; @@ -30,6 +32,7 @@ import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.impl.RaceLogEventFactoryImpl; import com.sap.sailing.domain.racelog.impl.RaceLogImpl; +import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceIdentifierImpl; @@ -38,10 +41,11 @@ import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceImpl; public class OfflineDataManager extends DataManager { private static boolean isInitialized = false; + private final Context context; - public OfflineDataManager(DataStore dataStore) { + public OfflineDataManager(Context context, DataStore dataStore) { super(dataStore); - + this.context = context; if (!isInitialized) { isInitialized = true; fillDataStore(dataStore); @@ -76,22 +80,22 @@ public class OfflineDataManager extends DataManager { RaceLog log = new RaceLogImpl(UUID.randomUUID()); log.add(factory.createStartTimeEvent( new MillisecondsTimePoint(new Date().getTime() - 2000), - author, + AppPreferences.getAuthor(context), 1, new MillisecondsTimePoint(new Date().getTime() - 1000))); log.add(factory.createRaceStatusEvent( new MillisecondsTimePoint(new Date().getTime()), - author, + AppPreferences.getAuthor(context), 1, RaceLogRaceStatus.FINISHING)); ManagedRace q1 = new ManagedRaceImpl( - new ManagedRaceIdentifierImpl( - "Q1", - new FleetImpl("Default"), - qualifying, - raceGroup), - StartProcedureType.ESS, - log); + context, + new ManagedRaceIdentifierImpl( + "Q1", + new FleetImpl("Default"), + qualifying, + raceGroup), + StartProcedureType.ESS, log); log = new RaceLogImpl(UUID.randomUUID()); /*log.add(factory.createStartTimeEvent( @@ -102,13 +106,13 @@ public class OfflineDataManager extends DataManager { */ ManagedRace q2 = new ManagedRaceImpl( - new ManagedRaceIdentifierImpl( - "Q2", - new FleetImpl("Default"), - qualifying, - raceGroup), - StartProcedureType.ESS, - log); + context, + new ManagedRaceIdentifierImpl( + "Q2", + new FleetImpl("Default"), + qualifying, + raceGroup), + StartProcedureType.ESS, log); log = new RaceLogImpl(UUID.randomUUID()); /*log.add(factory.createRaceStatusEvent( @@ -116,13 +120,13 @@ public class OfflineDataManager extends DataManager { 5, RaceLogRaceStatus.FINISHED));*/ ManagedRace q3 = new ManagedRaceImpl( - new ManagedRaceIdentifierImpl( - "Q3", - new FleetImpl("Default"), - qualifying, - raceGroup), - StartProcedureType.ESS, - log); + context, + new ManagedRaceIdentifierImpl( + "Q3", + new FleetImpl("Default"), + qualifying, + raceGroup), + StartProcedureType.ESS, log); /*ManagedRace m1 = new ManagedRaceImpl( new ManagedRaceIdentifierImpl( "M1", diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index 979f12dd54f..205bea4bcf7 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -142,7 +142,7 @@ public class OnlineDataManager extends DataManager { } SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; JsonDeserializer boatClassDeserializer = new BoatClassJsonDeserializer(domainFactory); - DataParser> parser = new ManagedRacesDataParser(new RaceGroupDeserializer( + DataParser> parser = new ManagedRacesDataParser(context, new RaceGroupDeserializer( boatClassDeserializer, new SeriesWithRowsDeserializer(new RaceRowDeserializer(new FleetDeserializer( new ColorDeserializer()), new RaceCellDeserializer( new RaceLogDeserializer(RaceLogEventDeserializer.create(domainFactory))))))); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java index 6213c5f9401..71308bba060 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java @@ -8,6 +8,8 @@ import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; +import android.content.Context; + import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.SeriesBase; import com.sap.sailing.domain.base.racegroup.RaceCell; @@ -27,8 +29,10 @@ public class ManagedRacesDataParser implements DataParser deserializer; + private final Context context; - public ManagedRacesDataParser(JsonDeserializer deserializer) { + public ManagedRacesDataParser(Context context, JsonDeserializer deserializer) { + this.context = context; this.deserializer = deserializer; } @@ -61,8 +65,8 @@ public class ManagedRacesDataParser implements DataParser competitors; private CourseBase courseOnServer; - public ManagedRaceImpl(ManagedRaceIdentifier identifier, StartProcedureType defaultStartProcedureType, - RaceLog raceLog) { - this(identifier, new RaceStateImpl(defaultStartProcedureType, raceLog)); + public ManagedRaceImpl(Context context, ManagedRaceIdentifier identifier, + StartProcedureType defaultStartProcedureType, RaceLog raceLog) { + this(identifier, new RaceStateImpl(context, defaultStartProcedureType, raceLog)); } public ManagedRaceImpl(ManagedRaceIdentifier identifier, RaceState state) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java index c002469c0c7..228853b8e94 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java @@ -20,6 +20,7 @@ import com.sap.sailing.domain.racelog.analyzing.impl.IndividualRecallDisplayedFi import com.sap.sailing.domain.racelog.analyzing.impl.IndividualRecallRemovedFinder; import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer; import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder; +import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.domain.startprocedure.RunningRaceEventListener; import com.sap.sailing.racecommittee.app.domain.startprocedure.StartPhaseEventListener; @@ -57,8 +58,10 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { private IndividualRecallDisplayedFinder individualRecallDisplayedFinder; private IndividualRecallRemovedFinder individualRecallRemovedFinder; + private final Context context; - public ExtremeSailingSeriesStartProcedure(RaceLog raceLog) { + public ExtremeSailingSeriesStartProcedure(Context context, RaceLog raceLog) { + this.context = context; this.raceLog = raceLog; startProcedureEventIntervals = new ArrayList(); raceStateChangedListener = null; @@ -113,7 +116,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { raceStateChangedListener.onRaceStartphaseEntered(eventTime); } - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.AP, Flags.NONE, /*isDisplayed*/false); raceLog.add(event); @@ -123,7 +126,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleEssThreeUp(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTHREE, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); @@ -134,11 +137,11 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { private void handleEssTwoUpAndEssThreeDown(TimePoint eventTime) { - RaceLogEvent essThreeDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent essThreeDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTHREE, Flags.NONE, /*isDisplayed*/false); raceLog.add(essThreeDownEvent); - RaceLogEvent essTwoUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent essTwoUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTWO, Flags.NONE, /*isDisplayed*/true); raceLog.add(essTwoUpEvent); @@ -149,11 +152,11 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { private void handleEssOneUpAndEssTwoDown(TimePoint eventTime) { - RaceLogEvent essTwoDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent essTwoDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSTWO, Flags.NONE, /*isDisplayed*/false); raceLog.add(essTwoDownEvent); - RaceLogEvent essOneUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent essOneUpEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSONE, Flags.NONE, /*isDisplayed*/true); raceLog.add(essOneUpEvent); @@ -163,7 +166,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleEssOneDown(TimePoint eventTime) { - RaceLogEvent essOneDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent essOneDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.ESSONE, Flags.NONE, /*isDisplayed*/false); raceLog.add(essOneDownEvent); @@ -195,7 +198,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @Override public void setFinishing(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); @@ -219,7 +222,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @Override public void setFinished(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.BLUE, Flags.NONE, /*isDisplayed*/false); raceLog.add(event); @@ -242,7 +245,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleAPUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.AP, lowerFlag, /*isDisplayed*/true); raceLog.add(event); @@ -265,7 +268,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } private void handleNovemberUp(TimePoint eventTime, Flags lowerFlag) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.NOVEMBER, lowerFlag, /*isDisplayed*/true); raceLog.add(event); @@ -276,7 +279,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @Override public void setGeneralRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.FIRSTSUBSTITUTE, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); @@ -286,7 +289,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } public void setIndividualRecall(TimePoint eventTime) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, AppPreferences.getAuthor(context), UUID.randomUUID(), Collections.emptyList(), raceLog.getCurrentPassId(), Flags.XRAY, Flags.NONE, /*isDisplayed*/true); raceLog.add(event); @@ -304,8 +307,8 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { public void setIndividualRecallRemoval(TimePoint eventTime) { if (this.isIndividualRecallDisplayed()) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, author, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.XRAY, Flags.NONE, false); raceLog.add(event); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java index 9a26f85f274..c41019ee94e 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java @@ -15,6 +15,7 @@ import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEventFactory; +import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.domain.startprocedure.RunningRaceEventListener; import com.sap.sailing.racecommittee.app.domain.startprocedure.StartPhaseEventListener; @@ -55,8 +56,10 @@ public class GateStartProcedure implements StartProcedure { private Long gateLineOpeningTime = startPhaseGolfDownStandardInterval; private boolean isPathFinderSet = false; private boolean isGateLineOpeningTimeChosen = false; + private final Context context; - public GateStartProcedure(RaceLog raceLog) { + public GateStartProcedure(Context context, RaceLog raceLog) { + this.context = context; this.raceLog = raceLog; startProcedureEventIntervals = new ArrayList(); raceStateChangedListener = null; @@ -107,7 +110,7 @@ public class GateStartProcedure implements StartProcedure { } RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(startPhaseTimePoint, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.CLASS, Flags.GOLF, true); raceLog.add(event); @@ -118,7 +121,7 @@ public class GateStartProcedure implements StartProcedure { private void handlePapaUp(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.PAPA, Flags.NONE, true); raceLog.add(event); @@ -131,7 +134,7 @@ public class GateStartProcedure implements StartProcedure { TimePoint papaDownTimepoint = eventTime; RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(papaDownTimepoint, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.PAPA, Flags.NONE, false); raceLog.add(event); @@ -144,7 +147,7 @@ public class GateStartProcedure implements StartProcedure { TimePoint essOneDownTimePoint = eventTime; RaceLogEvent essOneDownEvent = RaceLogEventFactory.INSTANCE.createFlagEvent(essOneDownTimePoint, - author, UUID.randomUUID(), Collections. emptyList(), + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), Flags.CLASS, Flags.NONE, /* isDisplayed */false); raceLog.add(essOneDownEvent); @@ -188,7 +191,7 @@ public class GateStartProcedure implements StartProcedure { @Override public void setFinishing(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.BLUE, Flags.NONE, true); raceLog.add(event); @@ -205,7 +208,7 @@ public class GateStartProcedure implements StartProcedure { @Override public void setFinished(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.BLUE, Flags.NONE, false); raceLog.add(event); @@ -229,7 +232,7 @@ public class GateStartProcedure implements StartProcedure { private void handleAPUp(TimePoint eventTime, Flags lowerFlag) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.AP, lowerFlag, true); raceLog.add(event); @@ -253,7 +256,7 @@ public class GateStartProcedure implements StartProcedure { private void handleNovemberUp(TimePoint eventTime, Flags lowerFlag) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.NOVEMBER, lowerFlag, true); raceLog.add(event); @@ -265,7 +268,7 @@ public class GateStartProcedure implements StartProcedure { @Override public void setGeneralRecall(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.FIRSTSUBSTITUTE, Flags.NONE, true); raceLog.add(event); @@ -320,7 +323,7 @@ public class GateStartProcedure implements StartProcedure { public void setGolfRemoval(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.GOLF, Flags.NONE, false); raceLog.add(event); @@ -331,7 +334,7 @@ public class GateStartProcedure implements StartProcedure { public void setGateLineOpeningTime(Long gateLineOpeningTimeInMiliseconds) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(MillisecondsTimePoint.now(), - author, raceLog.getCurrentPassId(), gateLineOpeningTimeInMiliseconds); + AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), gateLineOpeningTimeInMiliseconds); raceLog.add(event); this.gateLineOpeningTime = gateLineOpeningTimeInMiliseconds; this.isGateLineOpeningTimeChosen = true; @@ -345,7 +348,7 @@ public class GateStartProcedure implements StartProcedure { public void setPathfinder(String sailingId) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createPathfinderEvent(MillisecondsTimePoint.now(), - author, raceLog.getCurrentPassId(), sailingId); + AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), sailingId); raceLog.add(event); this.pathFinder = sailingId; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java index ec39f62314d..133b01735e1 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java @@ -19,6 +19,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.analyzing.impl.IndividualRecallDisplayedFinder; import com.sap.sailing.domain.racelog.analyzing.impl.IndividualRecallRemovedFinder; import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer; +import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.domain.startprocedure.RunningRaceEventListener; import com.sap.sailing.racecommittee.app.domain.startprocedure.StartModeChoosableStartProcedure; @@ -59,8 +60,10 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private Flags startModeFlag = Flags.PAPA; private String boatClassName = ""; private boolean startModeFlagChosen = false; + private final Context context; - public RRS26StartProcedure(RaceLog raceLog) { + public RRS26StartProcedure(Context context, RaceLog raceLog) { + this.context = context; this.raceLog = raceLog; startProcedureEventIntervals = new ArrayList(); raceStateChangedListener = null; @@ -113,7 +116,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.CLASS, Flags.NONE, true); raceLog.add(event); @@ -124,7 +127,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private void handleStartRuleUp(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ this.startModeFlag, Flags.NONE, true); raceLog.add(event); @@ -136,7 +139,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private void handleStartRuleDown(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ this.startModeFlag, Flags.NONE, false); raceLog.add(event); @@ -148,7 +151,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private void handleClassDown(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.CLASS, Flags.NONE, false); raceLog.add(event); @@ -185,7 +188,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt @Override public void setFinishing(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.BLUE, Flags.NONE, true); raceLog.add(event); @@ -205,7 +208,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt @Override public void setFinished(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.BLUE, Flags.NONE, false); raceLog.add(event); @@ -229,7 +232,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private void handleAPUp(TimePoint eventTime, Flags lowerFlag) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.AP, lowerFlag, true); raceLog.add(event); @@ -253,7 +256,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt private void handleNovemberUp(TimePoint eventTime, Flags lowerFlag) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.NOVEMBER, lowerFlag, true); raceLog.add(event); @@ -265,7 +268,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt @Override public void setGeneralRecall(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.FIRSTSUBSTITUTE, Flags.NONE, true); raceLog.add(event); @@ -276,7 +279,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt public void setIndividualRecall(TimePoint eventTime) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.XRAY, Flags.NONE, true); raceLog.add(event); @@ -295,7 +298,7 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt public void setIndividualRecallRemoval(TimePoint eventTime) { if (isIndividualRecallDisplayed()) { RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), /* isDisplayed */ Flags.XRAY, Flags.NONE, false); raceLog.add(event); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/StartProcedureFactory.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/StartProcedureFactory.java index b8a92dc8885..57977ba0795 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/StartProcedureFactory.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/StartProcedureFactory.java @@ -1,19 +1,21 @@ package com.sap.sailing.racecommittee.app.domain.startprocedure.impl; +import android.content.Context; + import com.sap.sailing.domain.common.racelog.StartProcedureType; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedure; public class StartProcedureFactory { - public static StartProcedure create(StartProcedureType type, RaceLog raceLog) { + public static StartProcedure create(Context context, StartProcedureType type, RaceLog raceLog) { switch (type) { case ESS: - return new ExtremeSailingSeriesStartProcedure(raceLog); + return new ExtremeSailingSeriesStartProcedure(context, raceLog); case GateStart: - return new GateStartProcedure(raceLog); + return new GateStartProcedure(context, raceLog); case RRS26: - return new RRS26StartProcedure(raceLog); + return new RRS26StartProcedure(context, raceLog); default: throw new UnsupportedOperationException("Not yet implemented start procedure."); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java index 51b412c4bdb..c06a53abdce 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import android.content.Context; + import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; @@ -27,6 +29,7 @@ import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer; import com.sap.sailing.domain.racelog.analyzing.impl.StartProcedureTypeAnalyzer; import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder; import com.sap.sailing.domain.tracking.Wind; +import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.domain.racelog.RaceLogChangedListener; import com.sap.sailing.racecommittee.app.domain.racelog.impl.RaceLogChangedVisitor; import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedure; @@ -58,7 +61,10 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { private StartProcedureTypeAnalyzer startProcedureTypeAnalyzer; private ProtestStartTimeFinder protestStartTimeAnalyzer; - public RaceStateImpl(StartProcedureType defaultStartProcedureType, RaceLog raceLog) { + private final Context context; + + public RaceStateImpl(Context context, StartProcedureType defaultStartProcedureType, RaceLog raceLog) { + this.context = context; this.defaultStartProcedureType = defaultStartProcedureType; this.raceLog = raceLog; @@ -108,7 +114,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { startProcedure.setStartProcedureListener(null); } StartProcedureType type = getStartProcedureType(); - startProcedure = StartProcedureFactory.create(type, raceLog); + startProcedure = StartProcedureFactory.create(context, type, raceLog); startProcedure.setStartProcedureListener(this); } @@ -131,7 +137,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { } TimePoint eventTime = startProcedure.getLogicalStartTimeEventTime(newStartTime); RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartTimeEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newStartTime); + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newStartTime); this.raceLog.add(event); fireStartTimeChange(newStartTime); } @@ -139,7 +145,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void createNewStartProcedure(StartProcedureType type) { if (!type.equals(startProcedureTypeAnalyzer.analyze())) { - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(MillisecondsTimePoint.now(), author, raceLog.getCurrentPassId(), type); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(MillisecondsTimePoint.now(), AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), type); this.raceLog.add(event); registerStartProcedure(); ExLog.i(TAG, String.format("Switch start procedure to %s", this.startProcedure.getClass().getSimpleName())); @@ -159,7 +165,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { public void setCourseDesign(CourseBase newCourseData) { TimePoint eventTime = MillisecondsTimePoint.now(); RaceLogEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(eventTime, - author, UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newCourseData); + AppPreferences.getAuthor(context), UUID.randomUUID(), Collections. emptyList(), raceLog.getCurrentPassId(), newCourseData); this.raceLog.add(event); fireCourseDesignChanged(); } @@ -168,7 +174,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { public void onRaceAborted(TimePoint eventTime) { /*RaceLogEvent abortEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, raceLog.getCurrentPassId(), RaceLogRaceStatus.UNSCHEDULED); this.raceLog.add(abortEvent);*/ - RaceLogEvent passChangeEvent = RaceLogEventFactory.INSTANCE.createPassChangeEvent(eventTime, author, raceLog.getCurrentPassId() + 1); + RaceLogEvent passChangeEvent = RaceLogEventFactory.INSTANCE.createPassChangeEvent(eventTime, AppPreferences.getAuthor(context), raceLog.getCurrentPassId() + 1); this.raceLog.add(passChangeEvent); registerStartProcedure(); fireRaceAborted(); @@ -176,19 +182,19 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void onRaceStartphaseEntered(TimePoint eventTime) { - RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.STARTPHASE); + RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), RaceLogRaceStatus.STARTPHASE); this.raceLog.add(statusEvent); } @Override public void onRaceStarted(TimePoint eventTime) { - RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.RUNNING); + RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), RaceLogRaceStatus.RUNNING); this.raceLog.add(statusEvent); } @Override public void onRaceFinishing(TimePoint eventTime) { - RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHING); + RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHING); this.raceLog.add(statusEvent); } @@ -200,7 +206,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void onRaceFinished(TimePoint eventTime) { - RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHED); + RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHED); this.raceLog.add(statusEvent); } @@ -222,7 +228,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { public void setFinishPositioningListChanged(List> positionedCompetitors) { TimePoint eventTime = MillisecondsTimePoint.now(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningListChangedEvent(eventTime, author, raceLog.getCurrentPassId(), positionedCompetitors); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningListChangedEvent(eventTime, AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), positionedCompetitors); this.raceLog.add(event); } @@ -237,14 +243,14 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { List> positionedCompetitors = getFinishPositioningList(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(eventTime, author, raceLog.getCurrentPassId(), positionedCompetitors); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFinishPositioningConfirmedEvent(eventTime, AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), positionedCompetitors); this.raceLog.add(event); } @Override public void setProtestStartTime(TimePoint protestStartTime) { TimePoint eventTime = MillisecondsTimePoint.now(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createProtestStartTimeEvent(eventTime, author, raceLog.getCurrentPassId(), protestStartTime); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createProtestStartTimeEvent(eventTime, AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), protestStartTime); this.raceLog.add(event); fireProtestStartTimeChanged(); } @@ -257,7 +263,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { @Override public void setWindFix(Wind windFix) { TimePoint eventTime = MillisecondsTimePoint.now(); - RaceLogEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(eventTime, author, raceLog.getCurrentPassId(), windFix); + RaceLogEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(eventTime, AppPreferences.getAuthor(context), raceLog.getCurrentPassId(), windFix); this.raceLog.add(event); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java index b534cabac1a..e6013490bfa 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java @@ -115,6 +115,7 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener @Override public void onDialogPositiveButton(BaseDialogFragment dialog) { + AppPreferences.setAuthor(LoginActivity.this, loginDialog.getAuthor()); switch (loginDialog.getSelectedLoginType()) { case OFFICER: ExLog.i(TAG, "Communication with backend is active."); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java index 00ef3a50ace..66a0acb007a 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/LoginDialog.java @@ -5,6 +5,8 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.logging.ExLog; @@ -17,20 +19,26 @@ public class LoginDialog extends ActivityAttachedDialogFragment { private CharSequence[] loginTypeDescriptions; private LoginType selectedLoginType; - + private RaceLogEventAuthor author; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - loginTypeDescriptions = new CharSequence[2]; - loginTypeDescriptions[0] = getString(R.string.login_type_officer); - loginTypeDescriptions[1] = getString(R.string.login_type_viewer); + loginTypeDescriptions = new CharSequence[] { getString(R.string.login_type_officer_on_start_vessel), + getString(R.string.login_type_officer_on_finish_vessel), + getString(R.string.login_type_shore_control), + getString(R.string.login_type_viewer) }; selectedLoginType = DefaultLoginType; } public LoginType getSelectedLoginType() { return selectedLoginType; } + + public RaceLogEventAuthor getAuthor() { + return author; + } @Override protected CharSequence getNegativeButtonLabel() { @@ -50,11 +58,22 @@ public class LoginDialog extends ActivityAttachedDialogFragment { .setSingleChoiceItems(loginTypeDescriptions, -1, new OnClickListener() { public void onClick(DialogInterface dialog, int which) { switch (which) { + // see loginTypeDescriptions for the indices of the login types case 0: selectedLoginType = LoginType.OFFICER; + author = new RaceLogEventAuthorImpl("Race Officer on Start Vessel", 0); break; case 1: + selectedLoginType = LoginType.OFFICER; + author = new RaceLogEventAuthorImpl("Race Officer on Finish Vessel", 1); + break; + case 2: + selectedLoginType = LoginType.OFFICER; + author = new RaceLogEventAuthorImpl("Shore Control", 2); + break; + case 3: selectedLoginType = LoginType.VIEWER; + author = new RaceLogEventAuthorImpl("Viewer", 3); break; default: selectedLoginType = LoginType.NONE; From 5c72e6d251181c75127142d4ef390581e13e54ab Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 21 Jul 2013 19:26:09 +0200 Subject: [PATCH 029/450] enriched toString of RaceLogEvent by author info --- .../sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java | 5 +++++ .../sap/sailing/domain/racelog/impl/RaceLogEventImpl.java | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java index 897a6785b85..98234581c25 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventAuthorImpl.java @@ -16,4 +16,9 @@ public class RaceLogEventAuthorImpl extends NamedImpl implements RaceLogEventAut public int getPriority() { return priority; } + + @Override + public String toString() { + return super.toString()+" with priority "+getPriority(); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java index 424b454c672..2e6cbf5f243 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventImpl.java @@ -62,6 +62,7 @@ public abstract class RaceLogEventImpl implements RaceLogEvent { @Override public String toString() { return getClass().getName() + ": createdAt: " + getCreatedAt() + ", logicalTimePoint: " + getTimePoint() - + ", id: " + getId() + ", involvedBoats: " + getInvolvedBoats() + ", passId: " + getPassId(); + + ", id: " + getId() + ", involvedBoats: " + getInvolvedBoats() + ", passId: " + getPassId() + + ", author: "+getAuthor(); } } From 4aa504741f891549e032d727544ecb148a9389e7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 17 Sep 2013 21:30:22 +0200 Subject: [PATCH 030/450] made compile again --- .../test/StoreAndLoadRaceLogsTest.java | 3 ++- .../test/racelog/BaseEventSerializerTest.java | 2 +- .../RaceLogOperationalTransformationTest.java | 2 +- .../app/data/OfflineDataManager.java | 17 +++++++------ .../app/data/OnlineDataManager.java | 23 ++++++++---------- .../data/parsers/ManagedRacesDataParser.java | 3 +-- .../app/services/sending/EventSenderTask.java | 24 +++++++++---------- 7 files changed, 34 insertions(+), 40 deletions(-) diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogsTest.java index 307c33159c2..d4577dc6e7f 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogsTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogsTest.java @@ -27,6 +27,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogIdentifierTemplate; +import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.domain.racelog.impl.RaceLogIdentifierImpl; public class StoreAndLoadRaceLogsTest extends AbstractMongoDBTest { @@ -145,7 +146,7 @@ public class StoreAndLoadRaceLogsTest extends AbstractMongoDBTest { } private RaceLogFlagEvent createRaceLogFlagEvent(Serializable id) { - return eventFactory.createFlagEvent(new MillisecondsTimePoint(42), id, Collections. emptyList(), + return eventFactory.createFlagEvent(new MillisecondsTimePoint(42), new RaceLogEventAuthorImpl("Test author", /* priority */ 1), id, Collections. emptyList(), 42, Flags.ALPHA, Flags.BRAVO, true); } diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/BaseEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/BaseEventSerializerTest.java index 3bc6806d847..39d63d87e81 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/BaseEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/BaseEventSerializerTest.java @@ -11,7 +11,7 @@ import org.junit.Test; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; -import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; +import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEventAuthor; diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java index dc5aaf6b839..60363217b7d 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java @@ -11,7 +11,7 @@ import org.junit.Before; import org.junit.Test; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; +import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEventAuthor; 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 9be499b9eed..c43f63325d0 100755 --- 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 @@ -12,8 +12,6 @@ import java.util.concurrent.Callable; import android.app.LoaderManager.LoaderCallbacks; import android.content.Context; -import android.content.Context; - import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; @@ -33,6 +31,7 @@ import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.StartProcedureType; import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.impl.RaceLogEventFactoryImpl; import com.sap.sailing.domain.racelog.impl.RaceLogImpl; @@ -59,8 +58,7 @@ public class OfflineDataManager extends DataManager { } private void fillDataStore(DataStore dataStore) { - dataStore - .addEvent(new EventBaseImpl("Extreme Sailing Series 2012 (Cardiff)", "Cardiff", "", true, "DUMBUUIDA")); + dataStore.addEvent(new EventBaseImpl("Extreme Sailing Series 2012 (Cardiff)", "Cardiff", "", true, "DUMBUUIDA")); dataStore.addEvent(new EventBaseImpl("Extreme Sailing Series 2012 (Nice)", "Nice", "", true, "DUMBUUIDB")); dataStore.addEvent(new EventBaseImpl("Extreme Sailing Series 2012 (Rio)", "Rio", "", true, "DUMBUUIDC")); EventBase newEvent = new EventBaseImpl("Extreme Sailing Series 2013 (Muscat)", "Muscat", "", true, "FIXUUID"); @@ -82,14 +80,15 @@ public class OfflineDataManager extends DataManager { RaceLogEventFactory factory = new RaceLogEventFactoryImpl(); RaceLog log = new RaceLogImpl(UUID.randomUUID()); - log.add(factory.createStartTimeEvent(new MillisecondsTimePoint(new Date().getTime() - 2000), 1, + final RaceLogEventAuthor author = AppPreferences.getAuthor(context); + log.add(factory.createStartTimeEvent(new MillisecondsTimePoint(new Date().getTime() - 2000), author, 1, new MillisecondsTimePoint(new Date().getTime() - 1000))); - log.add(factory.createRaceStatusEvent(new MillisecondsTimePoint(new Date().getTime()), 1, + log.add(factory.createRaceStatusEvent(new MillisecondsTimePoint(new Date().getTime()), AppPreferences.getAuthor(context), 1, RaceLogRaceStatus.FINISHING)); - ManagedRace q1 = new ManagedRaceImpl(new ManagedRaceIdentifierImpl("A.B", new FleetImpl("A"), qualifying, + ManagedRace q1 = new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl("A.B", new FleetImpl("A"), qualifying, raceGroup), StartProcedureType.ESS, log); log = new RaceLogImpl(UUID.randomUUID()); @@ -98,7 +97,7 @@ public class OfflineDataManager extends DataManager { * new MillisecondsTimePoint(new Date().getTime() + 100000))); */ - ManagedRace q2 = new ManagedRaceImpl(new ManagedRaceIdentifierImpl("B", new FleetImpl("A.A"), qualifying, + ManagedRace q2 = new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl("B", new FleetImpl("A.A"), qualifying, raceGroup), StartProcedureType.ESS, log); log = new RaceLogImpl(UUID.randomUUID()); @@ -106,7 +105,7 @@ public class OfflineDataManager extends DataManager { * log.add(factory.createRaceStatusEvent( new MillisecondsTimePoint(new Date()), 5, * RaceLogRaceStatus.FINISHED)); */ - ManagedRace q3 = new ManagedRaceImpl(new ManagedRaceIdentifierImpl("Q3", new FleetImpl("Default"), qualifying, + ManagedRace q3 = new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl("Q3", new FleetImpl("Default"), qualifying, raceGroup), StartProcedureType.ESS, log); /* * ManagedRace m1 = new ManagedRaceImpl( new ManagedRaceIdentifierImpl( "M1", new FleetImpl("Default"), medal, diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index 49e3334a9e4..de37dab5fce 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -142,14 +142,11 @@ public class OnlineDataManager extends DataManager { new RaceCellDeserializer(new RaceLogDeserializer( RaceLogEventDeserializer.create(domainFactory))))))); DataHandler> handler = new ManagedRacesDataHandler(OnlineDataManager.this); - + "/sailingserver/rc/racegroups?"+ - RaceLogServletConstants.PARAM_COURSE_AREA_FILTER + "=" + courseAreaId.toString()+"&"+ - RaceLogServletConstants.PARAMS_CLIENT_UUID + "=" + EventSendingService.uuid), parser, handler) - return new OnlineDataLoader>(context, new URL(AppPreferences .getServerBaseURL(context) - + "/sailingserver/rc/racegroups?courseArea=" - + courseAreaId.toString()), parser, handler); + + "/sailingserver/rc/racegroups?"+ + RaceLogServletConstants.PARAM_COURSE_AREA_FILTER + "=" + courseAreaId.toString()+"&"+ + RaceLogServletConstants.PARAMS_CLIENT_UUID + "=" + EventSendingService.uuid), parser, handler); } }); } @@ -175,7 +172,7 @@ public class OnlineDataManager extends DataManager { .getServerBaseURL(context) + "/sailingserver/rc/marks?"+RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + raceGroupName + "&"+RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME+"=" + raceColumnName - + "&"+RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=" + fleetName), parser, handler) + + "&"+RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=" + fleetName), parser, handler); } }); } @@ -202,7 +199,7 @@ public class OnlineDataManager extends DataManager { return new OnlineDataLoader(context, new URL(AppPreferences.getServerBaseURL(context) + "/sailingserver/rc/currentcourse?" + RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + raceGroupName + "&" + RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME + "=" + raceColumnName - + "&"+RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=" + fleetName), parser, handler).forceLoad(); + + "&"+RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=" + fleetName), parser, handler); } }); } @@ -226,11 +223,11 @@ public class OnlineDataManager extends DataManager { String raceColumnName = URLEncoder.encode(identifier.getRaceName()); String fleetName = URLEncoder.encode(identifier.getFleet().getName()); - return new OnlineDataLoader>(context, new URL(AppPreferences - .getServerBaseURL(context) - + "/sailingserver/rc/competitors?" + RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + raceGroupName + "&" + RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME + "=" + raceColumnName - + "&"+RaceLogServletConstants.PARAMS_RACE_FLEET_NAME+"=" + fleetName), parser, handler) - + return new OnlineDataLoader>(context, new URL( + AppPreferences.getServerBaseURL(context) + "/sailingserver/rc/competitors?" + + RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + raceGroupName + "&" + + RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME + "=" + raceColumnName + "&" + + RaceLogServletConstants.PARAMS_RACE_FLEET_NAME + "=" + fleetName), parser, handler); } }); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java index 51a0d10142a..ae1a0079d85 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java @@ -35,7 +35,6 @@ public class ManagedRacesDataParser implements DataParser deserializer) { this.context = context; this.deserializer = deserializer; - this.context = context; } public Collection parse(Reader reader) throws Exception { @@ -68,7 +67,7 @@ public class ManagedRacesDataParser implements DataParser eventsToAdd = new ArrayList(); try { ExLog.i(TAG, "Posting event: " + serializedEventAsJson); - HttpRequest post = new HttpJsonPostRequest(URI.create(url), serializedEventAsJson); + HttpRequest post = new HttpJsonPostRequest(new URL(url), serializedEventAsJson); SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; - try { - // TODO read JSON-serialized race log events that need to be merged into the local race log because they were added on the server in the interim - final InputStream inputStream = post.execute(); - JSONParser parser = new JSONParser(); - JSONArray eventsToAddAsJson = (JSONArray) parser.parse(new InputStreamReader(inputStream)); - for (Object o : eventsToAddAsJson) { - RaceLogEvent eventToAdd = RaceLogEventDeserializer.create(domainFactory).deserialize((JSONObject) o); - eventsToAdd.add(eventToAdd); - } - inputStream.close(); - } finally { - post.disconnect(); + // TODO read JSON-serialized race log events that need to be merged into the local race log because they + // were added on the server in the interim + final InputStream inputStream = post.execute(); + JSONParser parser = new JSONParser(); + JSONArray eventsToAddAsJson = (JSONArray) parser.parse(new InputStreamReader(inputStream)); + for (Object o : eventsToAddAsJson) { + RaceLogEvent eventToAdd = RaceLogEventDeserializer.create(domainFactory).deserialize((JSONObject) o); + eventsToAdd.add(eventToAdd); } + inputStream.close(); ExLog.i(TAG, "Post successful for the following event: " + serializedEventAsJson); result = new Triple>(intent, true, eventsToAdd); } catch (Exception e) { From 64e4fb34cc0abb595bebf1062fe11ce4fe8ee47f Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 19 Sep 2013 09:20:37 +0200 Subject: [PATCH 031/450] added failing test case for bug 1524 --- .../.classpath | 8 ++++ .../.gitignore | 1 + .../.project | 17 ++++++++ .../.settings/org.eclipse.jdt.core.prefs | 11 +++++ .../app/test/IdentifierTest.java | 40 +++++++++++++++++++ .../racecommittee/app/AppConstants.java | 1 + .../app/domain/impl/FleetIdentifierImpl.java | 2 +- 7 files changed, 79 insertions(+), 1 deletion(-) create mode 100755 mobile/com.sap.sailing.racecommittee.app.test/.classpath create mode 100755 mobile/com.sap.sailing.racecommittee.app.test/.gitignore create mode 100755 mobile/com.sap.sailing.racecommittee.app.test/.project create mode 100755 mobile/com.sap.sailing.racecommittee.app.test/.settings/org.eclipse.jdt.core.prefs create mode 100755 mobile/com.sap.sailing.racecommittee.app.test/src/com/sap/sailing/racecommittee/app/test/IdentifierTest.java diff --git a/mobile/com.sap.sailing.racecommittee.app.test/.classpath b/mobile/com.sap.sailing.racecommittee.app.test/.classpath new file mode 100755 index 00000000000..d2b47fd4ea9 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app.test/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mobile/com.sap.sailing.racecommittee.app.test/.gitignore b/mobile/com.sap.sailing.racecommittee.app.test/.gitignore new file mode 100755 index 00000000000..5e56e040ec0 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app.test/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/mobile/com.sap.sailing.racecommittee.app.test/.project b/mobile/com.sap.sailing.racecommittee.app.test/.project new file mode 100755 index 00000000000..009d7e4cc70 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app.test/.project @@ -0,0 +1,17 @@ + + + com.sap.sailing.racecommittee.app.test + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/mobile/com.sap.sailing.racecommittee.app.test/.settings/org.eclipse.jdt.core.prefs b/mobile/com.sap.sailing.racecommittee.app.test/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000000..7341ab1683c --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app.test/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/mobile/com.sap.sailing.racecommittee.app.test/src/com/sap/sailing/racecommittee/app/test/IdentifierTest.java b/mobile/com.sap.sailing.racecommittee.app.test/src/com/sap/sailing/racecommittee/app/test/IdentifierTest.java new file mode 100755 index 00000000000..609be590dc7 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app.test/src/com/sap/sailing/racecommittee/app/test/IdentifierTest.java @@ -0,0 +1,40 @@ +package com.sap.sailing.racecommittee.app.test; + +import static org.junit.Assert.assertFalse; + +import java.util.Collections; +import java.util.Set; + +import org.junit.Test; + +import com.sap.sailing.domain.base.impl.BoatClassImpl; +import com.sap.sailing.domain.base.impl.CourseAreaImpl; +import com.sap.sailing.domain.base.impl.FleetImpl; +import com.sap.sailing.domain.base.racegroup.RaceRow; +import com.sap.sailing.domain.base.racegroup.SeriesWithRows; +import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl; +import com.sap.sailing.domain.base.racegroup.impl.SeriesWithRowsImpl; +import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; +import com.sap.sailing.racecommittee.app.domain.impl.FleetIdentifierImpl; +import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceIdentifierImpl; + +public class IdentifierTest { + @Test + public void testManagedRaceIdentifierUniqueness() { + final Set raceRows1 = Collections.emptySet(); + final SeriesWithRows series1 = new SeriesWithRowsImpl("ghi", /* isMedal */ false, /* raceRows */ raceRows1); + final Set raceGroupSeries1 = Collections.singleton(series1); + ManagedRaceIdentifier i1 = new ManagedRaceIdentifierImpl("abc", new FleetIdentifierImpl(new FleetImpl("def"), series1, + new RaceGroupImpl("jkl.mno\\", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), new CourseAreaImpl("Alpha", "Alpha ID"), raceGroupSeries1))); + String i1ID = i1.getId().toString(); + + final Set raceRows2 = Collections.emptySet(); + final SeriesWithRows series2 = new SeriesWithRowsImpl("mno.ghi", /* isMedal */ false, /* raceRows */ raceRows2); + final Set raceGroupSeries2 = Collections.singleton(series2); + ManagedRaceIdentifier i2 = new ManagedRaceIdentifierImpl("abc", new FleetIdentifierImpl(new FleetImpl("def"), series2, + new RaceGroupImpl("jkl\\", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), new CourseAreaImpl("Alpha", "Alpha ID"), raceGroupSeries2))); + String i2ID = i2.getId().toString(); + + assertFalse(i1ID.equals(i2ID)); + } +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java index 9ea5a0d6c09..1fa2ddfe51b 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java @@ -15,6 +15,7 @@ public class AppConstants { public final static String RACING_EVENT_TIME = "racingEventTime"; public final static String STARTPROCEDURE_SPECIFIC_EVENT_ID = "startProcedureSpecificEventId"; public final static String EXTRAS_JSON_SERIALIZED_EVENT = "json"; + public final static String EXTRAS_EVENT_SENDER_RESPONSE_HANDLER_CALLBACK = "responseHandlerCallback"; public final static String EXTRAS_URL = "url"; public final static String OPTIONAL_EXTRAS = "optionalExtra"; public final static String FLAG_KEY = "raceFlag"; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java index ca8e4518cec..faa884bc3bc 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java @@ -39,7 +39,7 @@ public class FleetIdentifierImpl implements FleetIdentifier { } protected String escapeIdentifierFragment(String fragment) { - return fragment.replace(".", "\\."); + return fragment./* this is probably the fix for bug 1524: replace("\\", "\\\\"). */ replace(".", "\\."); } } From cbc2281aa4bd651ce1fa8c24f8a797d6e3a197fc Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 19 Sep 2013 09:41:24 +0200 Subject: [PATCH 032/450] provided fix for bug 1524 by also escaping the "\" character --- .../app/test/IdentifierTest.java | 38 +++++++++++++++++++ .../app/domain/impl/FleetIdentifierImpl.java | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/mobile/com.sap.sailing.racecommittee.app.test/src/com/sap/sailing/racecommittee/app/test/IdentifierTest.java b/mobile/com.sap.sailing.racecommittee.app.test/src/com/sap/sailing/racecommittee/app/test/IdentifierTest.java index 609be590dc7..0a725bc849c 100755 --- a/mobile/com.sap.sailing.racecommittee.app.test/src/com/sap/sailing/racecommittee/app/test/IdentifierTest.java +++ b/mobile/com.sap.sailing.racecommittee.app.test/src/com/sap/sailing/racecommittee/app/test/IdentifierTest.java @@ -37,4 +37,42 @@ public class IdentifierTest { assertFalse(i1ID.equals(i2ID)); } + + @Test + public void testManagedRaceIdentifierUniqueness2() { + final Set raceRows1 = Collections.emptySet(); + final SeriesWithRows series1 = new SeriesWithRowsImpl("ghi\\", /* isMedal */ false, /* raceRows */ raceRows1); + final Set raceGroupSeries1 = Collections.singleton(series1); + ManagedRaceIdentifier i1 = new ManagedRaceIdentifierImpl("abc", new FleetIdentifierImpl(new FleetImpl("mno.def"), series1, + new RaceGroupImpl("jkl", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), new CourseAreaImpl("Alpha", "Alpha ID"), raceGroupSeries1))); + String i1ID = i1.getId().toString(); + + final Set raceRows2 = Collections.emptySet(); + final SeriesWithRows series2 = new SeriesWithRowsImpl("ghi.mno\\", /* isMedal */ false, /* raceRows */ raceRows2); + final Set raceGroupSeries2 = Collections.singleton(series2); + ManagedRaceIdentifier i2 = new ManagedRaceIdentifierImpl("abc", new FleetIdentifierImpl(new FleetImpl("def"), series2, + new RaceGroupImpl("jkl", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), new CourseAreaImpl("Alpha", "Alpha ID"), raceGroupSeries2))); + String i2ID = i2.getId().toString(); + + assertFalse(i1ID.equals(i2ID)); + } + + @Test + public void testManagedRaceIdentifierUniqueness3() { + final Set raceRows1 = Collections.emptySet(); + final SeriesWithRows series1 = new SeriesWithRowsImpl("ghi", /* isMedal */ false, /* raceRows */ raceRows1); + final Set raceGroupSeries1 = Collections.singleton(series1); + ManagedRaceIdentifier i1 = new ManagedRaceIdentifierImpl("abc", new FleetIdentifierImpl(new FleetImpl("def.mno\\"), series1, + new RaceGroupImpl("jkl", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), new CourseAreaImpl("Alpha", "Alpha ID"), raceGroupSeries1))); + String i1ID = i1.getId().toString(); + + final Set raceRows2 = Collections.emptySet(); + final SeriesWithRows series2 = new SeriesWithRowsImpl("ghi", /* isMedal */ false, /* raceRows */ raceRows2); + final Set raceGroupSeries2 = Collections.singleton(series2); + ManagedRaceIdentifier i2 = new ManagedRaceIdentifierImpl("mno.abc", new FleetIdentifierImpl(new FleetImpl("def\\"), series2, + new RaceGroupImpl("jkl", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), new CourseAreaImpl("Alpha", "Alpha ID"), raceGroupSeries2))); + String i2ID = i2.getId().toString(); + + assertFalse(i1ID.equals(i2ID)); + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java index faa884bc3bc..0d4f76753d7 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java @@ -39,7 +39,7 @@ public class FleetIdentifierImpl implements FleetIdentifier { } protected String escapeIdentifierFragment(String fragment) { - return fragment./* this is probably the fix for bug 1524: replace("\\", "\\\\"). */ replace(".", "\\."); + return fragment.replace("\\", "\\\\").replace(".", "\\."); } } From baaa1bc107674fbdae70a46a157d7784900f7681 Mon Sep 17 00:00:00 2001 From: Fredrik Teschke Date: Thu, 19 Sep 2013 11:30:18 +0200 Subject: [PATCH 033/450] added generic callback to sending service --- .../racecommittee/app/AppConstants.java | 1 + .../sending/EventPersistenceManager.java | 35 ++++++++--- .../app/services/sending/EventSenderTask.java | 40 +++--------- .../services/sending/EventSendingService.java | 47 +++++++------- .../app/services/sending/RaceEventSender.java | 3 +- .../sending/RaceLogEventsCallback.java | 63 +++++++++++++++++++ .../services/sending/ServerReplyCallback.java | 24 +++++++ 7 files changed, 151 insertions(+), 62 deletions(-) create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceLogEventsCallback.java create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/ServerReplyCallback.java diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java index 1fa2ddfe51b..ffccd39525b 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppConstants.java @@ -17,6 +17,7 @@ public class AppConstants { public final static String EXTRAS_JSON_SERIALIZED_EVENT = "json"; public final static String EXTRAS_EVENT_SENDER_RESPONSE_HANDLER_CALLBACK = "responseHandlerCallback"; public final static String EXTRAS_URL = "url"; + public final static String EXTRAS_CALLBACK_CLASS = "callbackClass"; public final static String OPTIONAL_EXTRAS = "optionalExtra"; public final static String FLAG_KEY = "raceFlag"; public final static String EXTRAS_WIND_FIX = "windfix"; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java index f3bf9a14d5e..4812cd11666 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java @@ -51,11 +51,12 @@ public class EventPersistenceManager { String raceId = extras.getString(AppConstants.RACE_ID_KEY); String url = extras.getString(AppConstants.EXTRAS_URL); String serializedEventAsJson = extras.getString(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT); - persistEvent(url, raceId, serializedEventAsJson); + String callbackClass = extras.getString(AppConstants.EXTRAS_CALLBACK_CLASS); + persistEvent(url, raceId, serializedEventAsJson, callbackClass); } - private void persistEvent(String url, String raceId, String serializedEventAsJson) { - String eventLine = getSerializedIntentForPersistence(url, raceId, serializedEventAsJson); + private void persistEvent(String url, String raceId, String serializedEventAsJson, String callbackClass) { + String eventLine = getSerializedIntentForPersistence(url, raceId, serializedEventAsJson, callbackClass); ExLog.i(TAG, String.format("Persisting event \"%s\" for race %s.", eventLine, raceId)); if (persistedEvents.contains(eventLine)) { ExLog.i(TAG, "The event already exists. Ignoring."); @@ -67,8 +68,10 @@ public class EventPersistenceManager { /** * @param serializedEventAsJson will be URL-encoded to ensure that the resulting string does not contain newlines */ - private String getSerializedIntentForPersistence(String url, String raceId, String serializedEventAsJson) { - String eventLine = String.format("%s;%s;%s", raceId, URLEncoder.encode(serializedEventAsJson.toString()), url); + private String getSerializedIntentForPersistence(String url, String raceId, + String serializedEventAsJson, String callbackClass) { + String eventLine = String.format("%s;%s;%s;%s", raceId, URLEncoder.encode(serializedEventAsJson.toString()), + url, callbackClass); return eventLine; } @@ -77,13 +80,14 @@ public class EventPersistenceManager { String url = extras.getString(AppConstants.EXTRAS_URL); String raceId = extras.getString(AppConstants.RACE_ID_KEY); String serializedEventAsJson = extras.getString(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT); - removeEvent(url, raceId, serializedEventAsJson); + String callbackClass = extras.getString(AppConstants.EXTRAS_CALLBACK_CLASS); + removeEvent(url, raceId, serializedEventAsJson, callbackClass); } - private void removeEvent(String url, String raceId, String serializedEventAsUrlEncodedJson) { + private void removeEvent(String url, String raceId, String serializedEventAsUrlEncodedJson, String callbackClass) { if (!persistedEvents.isEmpty()) { ExLog.i(TAG, String.format("Removing event \"%s\" for race %s.", serializedEventAsUrlEncodedJson, raceId)); - String eventLine = getSerializedIntentForPersistence(url, raceId, serializedEventAsUrlEncodedJson); + String eventLine = getSerializedIntentForPersistence(url, raceId, serializedEventAsUrlEncodedJson, callbackClass); removePersistedEvent(eventLine); } } @@ -114,8 +118,21 @@ public class EventPersistenceManager { String url = lineParts[2]; String raceId = lineParts[0]; String serializedEventAsUrlEncodedJson = lineParts[1]; + String callbackClassString = lineParts[3]; addEventToLog(raceId, serializedEventAsUrlEncodedJson); - Intent eventIntent = EventSendingService.createEventIntent(context, url, raceId, URLDecoder.decode(serializedEventAsUrlEncodedJson)); + + Class callbackClass = null; + try { + @SuppressWarnings("unchecked") + Class tmp = + (Class) Class.forName(callbackClassString); + callbackClass = tmp; + } catch (ClassNotFoundException e) { + ExLog.e(TAG, "Could not find class for callback name: " + callbackClassString); + } + + Intent eventIntent = EventSendingService.createEventIntent(context, url, raceId, + URLDecoder.decode(serializedEventAsUrlEncodedJson), callbackClass); if (eventIntent != null) { delayedIntents.add(eventIntent); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java index 472a8f40789..cdc4254406e 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSenderTask.java @@ -1,35 +1,24 @@ package com.sap.sailing.racecommittee.app.services.sending; import java.io.InputStream; -import java.io.InputStreamReader; import java.net.URL; -import java.util.ArrayList; -import java.util.List; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.common.impl.Util.Triple; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.data.http.HttpJsonPostRequest; import com.sap.sailing.racecommittee.app.data.http.HttpRequest; -import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; import com.sap.sailing.racecommittee.app.logging.ExLog; -import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer; -public class EventSenderTask extends AsyncTask>> { +public class EventSenderTask extends AsyncTask> { private static String TAG = EventSenderTask.class.getName(); public interface EventSendingListener { - public void onResult(Intent intent, boolean success, Iterable eventsToAddToRaceLog); + public void onResult(Intent intent, boolean success, InputStream inputStream); } private EventSendingListener listener; @@ -39,44 +28,33 @@ public class EventSenderTask extends AsyncTask> doInBackground(Intent... params) { - Triple> result; + protected Triple doInBackground(Intent... params) { + Triple result; Intent intent = params[0]; if (intent == null) { - return new Triple>(intent, false, null); + return new Triple(intent, false, null); } Bundle extras = intent.getExtras(); String serializedEventAsJson = extras.getString(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT); String url = extras.getString(AppConstants.EXTRAS_URL); if (serializedEventAsJson == null || url == null) { - return new Triple>(intent, false, null); + return new Triple(intent, false, null); } - final List eventsToAdd = new ArrayList(); try { ExLog.i(TAG, "Posting event: " + serializedEventAsJson); HttpRequest post = new HttpJsonPostRequest(new URL(url), serializedEventAsJson); - SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; - // TODO read JSON-serialized race log events that need to be merged into the local race log because they - // were added on the server in the interim final InputStream inputStream = post.execute(); - JSONParser parser = new JSONParser(); - JSONArray eventsToAddAsJson = (JSONArray) parser.parse(new InputStreamReader(inputStream)); - for (Object o : eventsToAddAsJson) { - RaceLogEvent eventToAdd = RaceLogEventDeserializer.create(domainFactory).deserialize((JSONObject) o); - eventsToAdd.add(eventToAdd); - } - inputStream.close(); ExLog.i(TAG, "Post successful for the following event: " + serializedEventAsJson); - result = new Triple>(intent, true, eventsToAdd); + result = new Triple(intent, true, inputStream); } catch (Exception e) { ExLog.e(TAG, String.format("Post not successful, exception occured: %s", e.toString())); - result = new Triple>(intent, false, eventsToAdd); + result = new Triple(intent, false, null); } return result; } @Override - protected void onPostExecute(Triple> resultTriple) { + protected void onPostExecute(Triple resultTriple) { super.onPostExecute(resultTriple); listener.onResult(resultTriple.getA(), resultTriple.getB(), resultTriple.getC()); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index f50315fbae6..5761abb553d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -1,5 +1,7 @@ package com.sap.sailing.racecommittee.app.services.sending; +import java.io.IOException; +import java.io.InputStream; import java.io.Serializable; import java.net.URLEncoder; import java.util.Calendar; @@ -16,13 +18,9 @@ import android.os.Binder; import android.os.Handler; import android.os.IBinder; -import com.sap.sailing.domain.racelog.RaceLog; -import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogServletConstants; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.AppPreferences; -import com.sap.sailing.racecommittee.app.data.DataManager; -import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.receiver.ConnectivityChangedReceiver; @@ -46,7 +44,6 @@ public class EventSendingService extends Service implements EventSendingListener private Handler handler; private final IBinder mBinder = new EventSendingBinder(); private EventPersistenceManager persistenceManager; - private ReadonlyDataManager dataManager; private boolean isHandlerSet; private EventSendingServiceLogger serviceLogger = new EventSendingServiceLogger() { @@ -109,9 +106,12 @@ public class EventSendingService extends Service implements EventSendingListener * the race for which the event was created * @param serializedEventAsUrlEncodedJson * the event serialized to JSON + * @param callbackClass + * the class of the callback which should process the server reply * @return the intent that shall be sent to the EventSendingService */ - public static Intent createEventIntent(Context context, ManagedRace race, String serializedEventAsJson) { + public static Intent createEventIntent(Context context, ManagedRace race, String serializedEventAsJson, + Class callbackClass) { String url = String.format("%s/sailingserver/rc/racelog?"+ RaceLogServletConstants.PARAMS_LEADERBOARD_NAME+"=%s&"+ RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME+"=%s&"+ @@ -119,14 +119,16 @@ public class EventSendingService extends Service implements EventSendingListener RaceLogServletConstants.PARAMS_CLIENT_UUID+"=%s", AppPreferences.getServerBaseURL(context), URLEncoder.encode(race.getRaceGroup().getName()), URLEncoder.encode(race.getName()), URLEncoder.encode(race.getFleet().getName()), uuid); - return createEventIntent(context, url, race.getId(), serializedEventAsJson); + return createEventIntent(context, url, race.getId(), serializedEventAsJson, callbackClass); } - public static Intent createEventIntent(Context context, String url, Serializable raceId, String serializedEventAsJson) { + public static Intent createEventIntent(Context context, String url, Serializable raceId, String serializedEventAsJson, + Class callbackClass) { Intent eventIntent = new Intent(AppConstants.INTENT_ACTION_SEND_EVENT); eventIntent.putExtra(AppConstants.RACE_ID_KEY, raceId); eventIntent.putExtra(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT, serializedEventAsJson); eventIntent.putExtra(AppConstants.EXTRAS_URL, url); + eventIntent.putExtra(AppConstants.EXTRAS_CALLBACK_CLASS, callbackClass.getName()); ExLog.i(TAG, "Created event " + eventIntent + " for sending to backend"); return eventIntent; } @@ -140,7 +142,6 @@ public class EventSendingService extends Service implements EventSendingListener public void onCreate() { connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); persistenceManager = new EventPersistenceManager(this); - dataManager = DataManager.create(this); handler = new Handler(); isHandlerSet = false; if (persistenceManager.areIntentsDelayed()) { @@ -212,7 +213,7 @@ public class EventSendingService extends Service implements EventSendingListener } @Override - public void onResult(Intent intent, boolean success, Iterable eventsToAddToRaceLog) { + public void onResult(Intent intent, boolean success, InputStream inputStream) { if (!success) { ExLog.w(TAG, "Error while posting intent to server. Will persist intent..."); persistenceManager.persistIntent(intent); @@ -223,23 +224,27 @@ public class EventSendingService extends Service implements EventSendingListener } serviceLogger.onEventSentFailed(); } else { - ExLog.i(TAG, "Event successfully send."); + ExLog.i(TAG, "Event successfully sent."); if (persistenceManager.areIntentsDelayed()) { persistenceManager.removeIntent(intent); } lastSuccessfulSend = Calendar.getInstance().getTime(); serviceLogger.onEventSentSuccessful(); - String raceId = intent.getStringExtra(AppConstants.RACE_ID_KEY); - RaceLog raceLog = dataManager.getDataStore().getRace(raceId).getRaceLog(); - if (raceLog != null) { - ExLog.i(TAG, "Successfully retrieved race log for race ID " + raceId); - for (RaceLogEvent eventToAddToRaceLog : eventsToAddToRaceLog) { - raceLog.add(eventToAddToRaceLog); - ExLog.i(TAG, "added event "+eventToAddToRaceLog.toString()+" to client's race log"); - } - } else { - ExLog.w(TAG, "Couldn't retrieve race log for race ID "+raceId); + + String callbackClassString = intent.getStringExtra(AppConstants.EXTRAS_CALLBACK_CLASS); + ServerReplyCallback callback = null; + try { + callback = (ServerReplyCallback) Class.forName(callbackClassString).newInstance(); + } catch (Exception e) { + ExLog.e(TAG, "Error while passing server response to callback"); + e.printStackTrace(); } + if (callback != null) { + callback.onReply(intent, this, inputStream); + } + try { + inputStream.close(); + } catch (IOException e) {} } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java index 27bb15dcedc..95193c28023 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java @@ -24,7 +24,8 @@ public class RaceEventSender implements RaceLogChangedListener { public void eventAdded(RaceLogEvent event) { JSONObject serializedEvent = serializer.serialize(event); service.startService( - EventSendingService.createEventIntent(service, race, serializedEvent.toJSONString())); + EventSendingService.createEventIntent(service, race, serializedEvent.toJSONString(), + RaceLogEventsCallback.class)); } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceLogEventsCallback.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceLogEventsCallback.java new file mode 100644 index 00000000000..897dd25b1c1 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceLogEventsCallback.java @@ -0,0 +1,63 @@ +package com.sap.sailing.racecommittee.app.services.sending; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +import android.content.Context; +import android.content.Intent; + +import com.sap.sailing.domain.base.SharedDomainFactory; +import com.sap.sailing.domain.racelog.RaceLog; +import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.racecommittee.app.AppConstants; +import com.sap.sailing.racecommittee.app.data.DataManager; +import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; +import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; +import com.sap.sailing.racecommittee.app.logging.ExLog; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer; + +public class RaceLogEventsCallback implements ServerReplyCallback { + private static final String TAG = RaceLogEventsCallback.class.getName(); + + @Override + public void onReply(Intent originalIntent, Context context, InputStream inputStream) { + ReadonlyDataManager dataManager = DataManager.create(context); + final List eventsToAdd = new ArrayList(); + SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; + + JSONParser parser = new JSONParser(); + try { + JSONArray eventsToAddAsJson = (JSONArray) parser.parse(new InputStreamReader(inputStream)); + for (Object o : eventsToAddAsJson) { + try { + RaceLogEvent eventToAdd = RaceLogEventDeserializer.create(domainFactory).deserialize((JSONObject) o); + eventsToAdd.add(eventToAdd); + } catch (JsonDeserializationException e) { + ExLog.e(TAG, "Error deserializing Race Log event:\n" + o); + } + } + } catch (Exception e) { + ExLog.e(TAG, "Error parsing server response"); + } + + String raceId = originalIntent.getStringExtra(AppConstants.RACE_ID_KEY); + RaceLog raceLog = dataManager.getDataStore().getRace(raceId).getRaceLog(); + if (raceLog != null) { + ExLog.i(TAG, "Successfully retrieved race log for race ID " + raceId); + for (RaceLogEvent eventToAddToRaceLog : eventsToAdd) { + raceLog.add(eventToAddToRaceLog); + ExLog.i(TAG, "added event " + eventToAddToRaceLog.toString() + " to client's race log"); + } + } else { + ExLog.w(TAG, "Couldn't retrieve race log for race ID " + raceId); + } + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/ServerReplyCallback.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/ServerReplyCallback.java new file mode 100644 index 00000000000..ca5ab1d6fef --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/ServerReplyCallback.java @@ -0,0 +1,24 @@ +package com.sap.sailing.racecommittee.app.services.sending; + +import java.io.InputStream; + +import android.content.Context; +import android.content.Intent; + +import com.sap.sailing.domain.racelog.RaceLogEvent; + +/** + * This callback is used to attach an operation to the sending of a {@link RaceLogEvent}, so + * that the server reply to the performed POST request can be evaluated. + * + * Important: As the callback needs to be passed around in an {@link Intent} and also written + * to a file, a default public constructor without parameters is required. + * @author Fredrik Teschke + * + */ +public interface ServerReplyCallback { + /** + * The inputStream does not need to be closed by the implementing class. + */ + void onReply(Intent originalIntent, Context context, InputStream inputStream); +} From 51699ddde3f19052769fa74b22d9869e58b72b6c Mon Sep 17 00:00:00 2001 From: Fredrik Teschke Date: Thu, 19 Sep 2013 11:43:57 +0200 Subject: [PATCH 034/450] deal with null callback --- .../racelog/impl}/RaceLogEventsCallback.java | 3 ++- .../services/sending/EventPersistenceManager.java | 15 +++++++++------ .../app/services/sending/EventSendingService.java | 14 ++++++++------ .../app/services/sending/RaceEventSender.java | 1 + 4 files changed, 20 insertions(+), 13 deletions(-) rename mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/{services/sending => domain/racelog/impl}/RaceLogEventsCallback.java (95%) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceLogEventsCallback.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java similarity index 95% rename from mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceLogEventsCallback.java rename to mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java index 897dd25b1c1..11e5bfec8cb 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceLogEventsCallback.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java @@ -1,4 +1,4 @@ -package com.sap.sailing.racecommittee.app.services.sending; +package com.sap.sailing.racecommittee.app.domain.racelog.impl; import java.io.InputStream; import java.io.InputStreamReader; @@ -20,6 +20,7 @@ import com.sap.sailing.racecommittee.app.data.DataManager; import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; import com.sap.sailing.racecommittee.app.logging.ExLog; +import com.sap.sailing.racecommittee.app.services.sending.ServerReplyCallback; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java index 4812cd11666..8e799576f38 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java @@ -22,6 +22,7 @@ import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.data.DataManager; import com.sap.sailing.racecommittee.app.data.DataStore; import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; +import com.sap.sailing.racecommittee.app.domain.racelog.impl.RaceLogEventsCallback; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.utils.FileHandlerUtils; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; @@ -122,13 +123,15 @@ public class EventPersistenceManager { addEventToLog(raceId, serializedEventAsUrlEncodedJson); Class callbackClass = null; - try { - @SuppressWarnings("unchecked") - Class tmp = + if (! "null".equals(callbackClassString)) { + try { + @SuppressWarnings("unchecked") + Class tmp = (Class) Class.forName(callbackClassString); - callbackClass = tmp; - } catch (ClassNotFoundException e) { - ExLog.e(TAG, "Could not find class for callback name: " + callbackClassString); + callbackClass = tmp; + } catch (ClassNotFoundException e) { + ExLog.e(TAG, "Could not find class for callback name: " + callbackClassString); + } } Intent eventIntent = EventSendingService.createEventIntent(context, url, raceId, diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java index 5761abb553d..4ccbce0995b 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventSendingService.java @@ -128,7 +128,7 @@ public class EventSendingService extends Service implements EventSendingListener eventIntent.putExtra(AppConstants.RACE_ID_KEY, raceId); eventIntent.putExtra(AppConstants.EXTRAS_JSON_SERIALIZED_EVENT, serializedEventAsJson); eventIntent.putExtra(AppConstants.EXTRAS_URL, url); - eventIntent.putExtra(AppConstants.EXTRAS_CALLBACK_CLASS, callbackClass.getName()); + eventIntent.putExtra(AppConstants.EXTRAS_CALLBACK_CLASS, callbackClass == null ? null : callbackClass.getName()); ExLog.i(TAG, "Created event " + eventIntent + " for sending to backend"); return eventIntent; } @@ -233,11 +233,13 @@ public class EventSendingService extends Service implements EventSendingListener String callbackClassString = intent.getStringExtra(AppConstants.EXTRAS_CALLBACK_CLASS); ServerReplyCallback callback = null; - try { - callback = (ServerReplyCallback) Class.forName(callbackClassString).newInstance(); - } catch (Exception e) { - ExLog.e(TAG, "Error while passing server response to callback"); - e.printStackTrace(); + if (callbackClassString != null) { + try { + callback = (ServerReplyCallback) Class.forName(callbackClassString).newInstance(); + } catch (Exception e) { + ExLog.e(TAG, "Error while passing server response to callback"); + e.printStackTrace(); + } } if (callback != null) { callback.onReply(intent, this, inputStream); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java index 95193c28023..4706b78e6ac 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java @@ -7,6 +7,7 @@ import android.app.Service; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.racelog.RaceLogChangedListener; +import com.sap.sailing.racecommittee.app.domain.racelog.impl.RaceLogEventsCallback; import com.sap.sailing.server.gateway.serialization.JsonSerializer; public class RaceEventSender implements RaceLogChangedListener { From d4adb215156f3c8e7a178a2d70ddcebfd5199e9d Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Wed, 2 Oct 2013 14:33:29 +0200 Subject: [PATCH 035/450] # preparing the server for handling configuration requests of RC tablets --- .../WEB-INF/web.xml | 9 +++++ .../impl/rc/ConfigurationJsonGetServlet.java | 33 +++++++++++++++++++ .../app/data/handlers/NullDataHandler.java | 20 +++++++++++ 3 files changed, 62 insertions(+) create mode 100644 java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/NullDataHandler.java diff --git a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml index 6055572f575..f1a6e686bdf 100644 --- a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml +++ b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml @@ -23,6 +23,15 @@ /rc/racegroups + + RCConfiguration + com.sap.sailing.server.gateway.impl.rc.ConfigurationJsonGetServlet + + + RCConfiguration + /rc/configuration + + RCAddToRaceLog com.sap.sailing.server.gateway.impl.rc.AddEntryToRaceLogJsonPostServlet diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java new file mode 100644 index 00000000000..fd25552dea3 --- /dev/null +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java @@ -0,0 +1,33 @@ +package com.sap.sailing.server.gateway.impl.rc; + +import java.io.IOException; +import java.util.logging.Logger; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; + +public class ConfigurationJsonGetServlet extends AbstractJsonHttpServlet { + private static final long serialVersionUID = 7704668926551060433L; + + public static final String PARAMS_CLIENT_ID = "client"; + + private final static Logger logger = Logger.getLogger(ConfigurationJsonGetServlet.class.getName()); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String clientId = request.getParameter(PARAMS_CLIENT_ID); + if (clientId == null) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, + String.format("Missing parameter '%s'.", PARAMS_CLIENT_ID)); + return; + } + + logger.fine(String.format("Configuration requested by client %s.", clientId)); + + response.sendError(HttpServletResponse.SC_FORBIDDEN); + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/NullDataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/NullDataHandler.java new file mode 100644 index 00000000000..f5b68eb0d0e --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/NullDataHandler.java @@ -0,0 +1,20 @@ +package com.sap.sailing.racecommittee.app.data.handlers; + +import com.sap.sailing.racecommittee.app.data.DataManager; + + +/** + * Use this {@link DataHandler} whenever the {@link DataManager} should not know anything about the result. + */ +public class NullDataHandler extends DataHandler { + + public NullDataHandler() { + super(null); + } + + @Override + public void onResult(T data) { + // no operation + } + +} From 3ecd586cd687df10eecd55144be167f20827c1f1 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Fri, 4 Oct 2013 15:36:04 +0200 Subject: [PATCH 036/450] # rc-app requests configuration on choosing an event --- .../res/values-de/strings.xml | 3 ++ .../res/values/strings.xml | 3 ++ .../racecommittee/app/AppPreferences.java | 6 +++ .../app/data/OfflineDataManager.java | 11 +++++ .../app/data/OnlineDataManager.java | 35 +++++++++++++++ .../app/data/ReadonlyDataManager.java | 12 +++++ .../app/data/parsers/DataParser.java | 2 +- .../app/ui/activities/LoginActivity.java | 44 +++++++++++++++++-- 8 files changed, 112 insertions(+), 4 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml index b4fb1990fb1..672caedaef6 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml @@ -242,4 +242,7 @@ Wenn Sie sich abmelden wird kein Rennen mehr verwaltet. Abmelden + Lade Konfiguration... + Fehler beim Laden der Konfiguration. + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml index e2a0e3c0979..5239af87b26 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml @@ -270,4 +270,7 @@ Logging out stops automatic monitoring for all races. Logout + Loading configuration... + There was an error loading the configuration. + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java index 00c939bb43a..8c644943e09 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java @@ -6,6 +6,7 @@ import java.util.List; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; +import android.provider.Settings.Secure; import android.util.Log; import com.sap.sailing.domain.common.racelog.StartProcedureType; @@ -185,4 +186,9 @@ public class AppPreferences { StartProcedureType type = StartProcedureType.valueOf(defaultStartProcedureType); return type; } + + public static String getAndroidIdentifier(Context context) { + return Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); + } + } 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 99874650b15..558e7b8f586 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 @@ -191,4 +191,15 @@ public class OfflineDataManager extends DataManager { }); } + @Override + public LoaderCallbacks> createConfigurationLoader(String clientId, + LoadClient callback) { + return new ImmediateDataLoaderCallbacks(context, callback, new Callable() { + @Override + public String call() throws Exception { + return ""; + } + }); + } + } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index 1323242a216..46537044508 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -1,5 +1,7 @@ package com.sap.sailing.racecommittee.app.data; +import java.io.BufferedReader; +import java.io.Reader; import java.io.Serializable; import java.net.URL; import java.net.URLEncoder; @@ -26,6 +28,7 @@ import com.sap.sailing.racecommittee.app.data.handlers.DataHandler; import com.sap.sailing.racecommittee.app.data.handlers.EventsDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.ManagedRacesDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.MarksDataHandler; +import com.sap.sailing.racecommittee.app.data.handlers.NullDataHandler; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderCallbacks; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderCallbacks.LoaderCreator; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; @@ -228,4 +231,36 @@ public class OnlineDataManager extends DataManager { } }); } + + @Override + public LoaderCallbacks> createConfigurationLoader(final String clientId, + LoadClient callback) { + return new DataLoaderCallbacks(callback, new LoaderCreator() { + @Override + public Loader> create(int id, Bundle args) throws Exception { + ExLog.i(TAG, String.format("Creating Configuration-OnlineDataLoader %d", id)); + + DataHandler handler = new NullDataHandler(); + DataParser parser = new DataParser() { + @Override + public String parse(Reader reader) throws Exception { + BufferedReader in = null; + try { + in = new BufferedReader(reader); + return in.readLine(); + } finally { + if (in != null) { + in.close(); + } + } + } + }; + + return new OnlineDataLoader( + context, + new URL(AppPreferences.getServerBaseURL(context) + "/sailingserver/rc/configuration?client="+ clientId), + parser, handler); + } + }); + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java index 071d185fe3f..09abaa5b231 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java @@ -117,4 +117,16 @@ public interface ReadonlyDataManager { */ public LoaderCallbacks>> createCompetitorsLoader(ManagedRace managedRace, LoadClient> callback); + + /** + * Creates a new {@link LoaderCallbacks} object for loading a client's configuration. + * + * @param callback + * {@link LoadClient} implementing your data handling code. + * @return {@link LoaderCallbacks} to be used in + * {@link LoaderManager#initLoader(int, android.os.Bundle, LoaderCallbacks)} or + * {@link LoaderManager#restartLoader(int, android.os.Bundle, LoaderCallbacks)}. + */ + public LoaderCallbacks> createConfigurationLoader(String clientId, + LoadClient callback); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/DataParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/DataParser.java index 61534b4f9e2..c6132045b47 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/DataParser.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/DataParser.java @@ -4,6 +4,6 @@ import java.io.Reader; public interface DataParser { - T parse(Reader reader) throws Exception; + T parse(Reader reader) throws Exception; } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java index cb58b3ed9b4..9dac3b43ba3 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java @@ -4,6 +4,7 @@ import java.io.Serializable; import android.app.Fragment; import android.app.FragmentTransaction; +import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.view.Window; @@ -14,6 +15,9 @@ import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; +import com.sap.sailing.racecommittee.app.data.OnlineDataManager; +import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; +import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AttachedDialogFragment; import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.DialogListenerHost; @@ -82,16 +86,50 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.animator.slide_in, R.animator.slide_out); transaction.replace(R.id.login_view_right_container, fragment, CourseAreaListFragmentTag); - transaction.commit(); + transaction.commitAllowingStateLoss(); ExLog.i("LoginActivity", "CourseFragment created."); } private ItemSelectedListener eventSelectionListener = new ItemSelectedListener() { public void itemSelected(Fragment sender, EventBase event) { - Serializable eventId = event.getId(); + final Serializable eventId = event.getId(); ExLog.i(ExLog.EVENT_SELECTED, eventId.toString(), getBaseContext()); - showCourseAreaListFragment(eventId); + + setProgressBarIndeterminateVisibility(true); + final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this); + progressDialog.setMessage(getString(R.string.loading_configuration)); + progressDialog.setCancelable(false); + progressDialog.setIndeterminate(true); + progressDialog.show(); + + String identifier = AppPreferences.getAndroidIdentifier(getApplicationContext()); + ReadonlyDataManager dataManager = OnlineDataManager.create(LoginActivity.this); + getLoaderManager().restartLoader( + 0, + null, + dataManager.createConfigurationLoader(identifier, new LoadClient() { + + @Override + public void onLoadSucceded(String data, boolean isCached) { + setProgressBarIndeterminateVisibility(false); + progressDialog.dismiss(); + + Toast.makeText(getApplicationContext(), data, Toast.LENGTH_SHORT).show(); + showCourseAreaListFragment(eventId); + } + + @Override + public void onLoadFailed(Exception reason) { + setProgressBarIndeterminateVisibility(false); + progressDialog.dismiss(); + + Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_failed), Toast.LENGTH_LONG).show(); + ExLog.ex(TAG, reason); + + showCourseAreaListFragment(eventId); + } + })).forceLoad(); } }; From ccd6fa01592d651d819be2b8d37855500da52b69 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Tue, 8 Oct 2013 17:59:19 +0200 Subject: [PATCH 037/450] # Added TabletConfiguration to hold configuration --- .../domain/base/TabletConfiguration.java | 10 ++++++ .../base/TabletConfigurationIdentifier.java | 11 +++++++ .../TabletConfigurationIdentifierImpl.java | 18 ++++++++++ .../base/impl/TabletConfigurationImpl.java | 25 ++++++++++++++ .../TabletConfigurationJsonDeserializer.java | 33 +++++++++++++++++++ .../res/values-de/strings.xml | 1 + .../res/values/strings.xml | 1 + 7 files changed, 99 insertions(+) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfigurationIdentifier.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationIdentifierImpl.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java create mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java new file mode 100644 index 00000000000..e701c164d87 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java @@ -0,0 +1,10 @@ +package com.sap.sailing.domain.base; + +import java.util.Set; + +/** + * Interface holding information about tablet's (RCApp) configuration. + */ +public interface TabletConfiguration { + Set getAllowedCourseAreaNames(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfigurationIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfigurationIdentifier.java new file mode 100644 index 00000000000..46fbd11fb95 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfigurationIdentifier.java @@ -0,0 +1,11 @@ +package com.sap.sailing.domain.base; + +/** + * Each tablet configuration is bound to a specific client. Use this interface instead of a plain {@link String} to + * enable additions (like event-specific configurations). + */ +public interface TabletConfigurationIdentifier { + + String getClientIdentifier(); + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationIdentifierImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationIdentifierImpl.java new file mode 100644 index 00000000000..881454743a3 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationIdentifierImpl.java @@ -0,0 +1,18 @@ +package com.sap.sailing.domain.base.impl; + +import com.sap.sailing.domain.base.TabletConfigurationIdentifier; + +public class TabletConfigurationIdentifierImpl implements TabletConfigurationIdentifier { + + private final String clientIdentifier; + + public TabletConfigurationIdentifierImpl(String clientIdentifier) { + this.clientIdentifier = clientIdentifier; + } + + @Override + public String getClientIdentifier() { + return clientIdentifier; + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java new file mode 100644 index 00000000000..8c531b15219 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java @@ -0,0 +1,25 @@ +package com.sap.sailing.domain.base.impl; + +import java.util.HashSet; +import java.util.Set; + +import com.sap.sailing.domain.base.TabletConfiguration; + +public class TabletConfigurationImpl implements TabletConfiguration { + + private Set allowedCourseAreaNames; + + public TabletConfigurationImpl() { + this.allowedCourseAreaNames = new HashSet(); + } + + @Override + public Set getAllowedCourseAreaNames() { + return allowedCourseAreaNames; + } + + public void setAllowedCourseAreaNames(Set newAllowedCourseAreaNames) { + this.allowedCourseAreaNames = newAllowedCourseAreaNames; + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java new file mode 100644 index 00000000000..0b189e6f362 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java @@ -0,0 +1,33 @@ +package com.sap.sailing.server.gateway.deserialization.impl; + +import java.util.HashSet; +import java.util.Set; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.domain.base.impl.TabletConfigurationImpl; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; + +public class TabletConfigurationJsonDeserializer implements JsonDeserializer { + + @Override + public TabletConfiguration deserialize(JSONObject object) throws JsonDeserializationException { + TabletConfigurationImpl configuration = new TabletConfigurationImpl(); + + JSONArray courseAreaNames = Helpers.getNestedArraySafe( + object, + "courseAreaNames"); + Set allowedCourseAreaNames = new HashSet(); + for (Object name : courseAreaNames) { + allowedCourseAreaNames.add(name.toString()); + } + configuration.setAllowedCourseAreaNames(allowedCourseAreaNames); + + + return configuration; + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml index 672caedaef6..38d8f032742 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml @@ -244,5 +244,6 @@ Lade Konfiguration... Fehler beim Laden der Konfiguration. + Konfiguration vom Server übernommen. \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml index 5239af87b26..11db45b0abf 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml @@ -272,5 +272,6 @@ Loading configuration... There was an error loading the configuration. + Remote configuration applied. \ No newline at end of file From be5cdbf5118306ff3944c955e5abb1dcaec72207 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Tue, 8 Oct 2013 17:59:52 +0200 Subject: [PATCH 038/450] # TabletConfiguration is cached on client side # TabletConfiguration is applied --- .../racecommittee/app/AppPreferences.java | 11 ++++ .../racecommittee/app/data/DataStore.java | 5 ++ .../app/data/InMemoryDataStore.java | 13 ++++- .../app/data/OfflineDataManager.java | 12 ++-- .../app/data/OnlineDataManager.java | 37 +++++-------- .../app/data/ReadonlyDataManager.java | 6 +- .../TabletConfigurationDataHandler.java | 27 +++++++++ .../parsers/TabletConfigurationParser.java | 27 +++++++++ .../app/ui/activities/LoginActivity.java | 55 +++++++++++-------- .../app/utils/TabletConfigurationHelper.java | 14 +++++ 10 files changed, 151 insertions(+), 56 deletions(-) create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/TabletConfigurationDataHandler.java create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/TabletConfigurationParser.java create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java index 8c644943e09..b5509f2477f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java @@ -2,6 +2,7 @@ package com.sap.sailing.racecommittee.app; import java.util.Arrays; import java.util.List; +import java.util.Set; import android.content.Context; import android.content.SharedPreferences; @@ -110,6 +111,16 @@ public class AppPreferences { return Arrays.asList(managedCourseAreas); } + public static void setManagedCourseAreaNames(Context context, Set courseAreaNames) { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + StringBuilder builder = new StringBuilder(); + for (String name : courseAreaNames) { + builder.append(name); + builder.append(","); + } + sp.edit().putString(PREFERENCE_MANAGED_COURSE_AREAS, builder.substring(0, builder.length() - 1)).commit(); + } + public static double getWindBearingFromDirection(Context context) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); long windBearingAsLong = sp.getLong(PREFERENCE_WIND_BEARING, 0); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java index cc9566d5aff..638680dc7cd 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java @@ -7,7 +7,9 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.TabletConfiguration; import com.sap.sailing.racecommittee.app.domain.ManagedRace; +import com.sap.sailing.server.gateway.deserialization.impl.TabletConfigurationJsonDeserializer; public interface DataStore { @@ -35,4 +37,7 @@ public interface DataStore { public CourseBase getLastPublishedCourseDesign(); public void setLastPublishedCourseDesign(CourseBase courseData); + + public TabletConfiguration getTabletConfiguration(); + public void setTabletConfiguration(TabletConfiguration configuration); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java index eac2d253fc3..bfc5f852cd1 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java @@ -8,6 +8,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.TabletConfiguration; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.utils.CollectionUtils; @@ -18,6 +19,7 @@ public enum InMemoryDataStore implements DataStore { private HashMap managedRaceById; private HashMap marksById; private CourseBase courseData; + private TabletConfiguration configuration; private InMemoryDataStore() { reset(); @@ -28,7 +30,6 @@ public enum InMemoryDataStore implements DataStore { this.eventsById = new HashMap(); this.managedRaceById = new HashMap(); this.marksById = new HashMap(); - this.courseData = null; } /* @@ -162,4 +163,14 @@ public enum InMemoryDataStore implements DataStore { public void setLastPublishedCourseDesign(CourseBase courseData) { this.courseData = courseData; } + + @Override + public TabletConfiguration getTabletConfiguration() { + return configuration; + } + + @Override + public void setTabletConfiguration(TabletConfiguration configuration) { + this.configuration = configuration; + } } 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 558e7b8f586..76c4ad10e5d 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 @@ -17,6 +17,8 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.domain.base.TabletConfigurationIdentifier; import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CourseAreaImpl; @@ -192,12 +194,12 @@ public class OfflineDataManager extends DataManager { } @Override - public LoaderCallbacks> createConfigurationLoader(String clientId, - LoadClient callback) { - return new ImmediateDataLoaderCallbacks(context, callback, new Callable() { + public LoaderCallbacks> createConfigurationLoader(TabletConfigurationIdentifier identifier, + LoadClient callback) { + return new ImmediateDataLoaderCallbacks(context, callback, new Callable() { @Override - public String call() throws Exception { - return ""; + public TabletConfiguration call() throws Exception { + throw new IllegalStateException("No remote configuration in offline mode."); } }); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index 46537044508..207f34f859c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -1,7 +1,5 @@ package com.sap.sailing.racecommittee.app.data; -import java.io.BufferedReader; -import java.io.Reader; import java.io.Serializable; import java.net.URL; import java.net.URLEncoder; @@ -20,6 +18,8 @@ import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.SharedDomainFactory; +import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.domain.base.TabletConfigurationIdentifier; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.handlers.CompetitorsDataHandler; @@ -28,7 +28,7 @@ import com.sap.sailing.racecommittee.app.data.handlers.DataHandler; import com.sap.sailing.racecommittee.app.data.handlers.EventsDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.ManagedRacesDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.MarksDataHandler; -import com.sap.sailing.racecommittee.app.data.handlers.NullDataHandler; +import com.sap.sailing.racecommittee.app.data.handlers.TabletConfigurationDataHandler; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderCallbacks; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderCallbacks.LoaderCreator; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; @@ -40,6 +40,7 @@ import com.sap.sailing.racecommittee.app.data.parsers.DataParser; import com.sap.sailing.racecommittee.app.data.parsers.EventsDataParser; import com.sap.sailing.racecommittee.app.data.parsers.ManagedRacesDataParser; import com.sap.sailing.racecommittee.app.data.parsers.MarksDataParser; +import com.sap.sailing.racecommittee.app.data.parsers.TabletConfigurationParser; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; @@ -56,6 +57,7 @@ import com.sap.sailing.server.gateway.deserialization.impl.CompetitorDeserialize import com.sap.sailing.server.gateway.deserialization.impl.CourseAreaJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.EventBaseJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.FleetDeserializer; +import com.sap.sailing.server.gateway.deserialization.impl.TabletConfigurationJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.VenueJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.racegroup.impl.RaceCellDeserializer; import com.sap.sailing.server.gateway.deserialization.racegroup.impl.RaceGroupDeserializer; @@ -233,32 +235,19 @@ public class OnlineDataManager extends DataManager { } @Override - public LoaderCallbacks> createConfigurationLoader(final String clientId, - LoadClient callback) { - return new DataLoaderCallbacks(callback, new LoaderCreator() { + public LoaderCallbacks> createConfigurationLoader(final TabletConfigurationIdentifier identifier, + LoadClient callback) { + return new DataLoaderCallbacks(callback, new LoaderCreator() { @Override - public Loader> create(int id, Bundle args) throws Exception { + public Loader> create(int id, Bundle args) throws Exception { ExLog.i(TAG, String.format("Creating Configuration-OnlineDataLoader %d", id)); - DataHandler handler = new NullDataHandler(); - DataParser parser = new DataParser() { - @Override - public String parse(Reader reader) throws Exception { - BufferedReader in = null; - try { - in = new BufferedReader(reader); - return in.readLine(); - } finally { - if (in != null) { - in.close(); - } - } - } - }; + DataHandler handler = new TabletConfigurationDataHandler(OnlineDataManager.this); + DataParser parser = new TabletConfigurationParser(new TabletConfigurationJsonDeserializer()); - return new OnlineDataLoader( + return new OnlineDataLoader( context, - new URL(AppPreferences.getServerBaseURL(context) + "/sailingserver/rc/configuration?client="+ clientId), + new URL(AppPreferences.getServerBaseURL(context) + "/sailingserver/rc/configuration?client="+ identifier.getClientIdentifier()), parser, handler); } }); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java index 09abaa5b231..847e3ee5233 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java @@ -11,6 +11,8 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.domain.base.TabletConfigurationIdentifier; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; import com.sap.sailing.racecommittee.app.domain.ManagedRace; @@ -127,6 +129,6 @@ public interface ReadonlyDataManager { * {@link LoaderManager#initLoader(int, android.os.Bundle, LoaderCallbacks)} or * {@link LoaderManager#restartLoader(int, android.os.Bundle, LoaderCallbacks)}. */ - public LoaderCallbacks> createConfigurationLoader(String clientId, - LoadClient callback); + public LoaderCallbacks> createConfigurationLoader(TabletConfigurationIdentifier identifier, + LoadClient callback); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/TabletConfigurationDataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/TabletConfigurationDataHandler.java new file mode 100644 index 00000000000..812d77b652f --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/TabletConfigurationDataHandler.java @@ -0,0 +1,27 @@ +package com.sap.sailing.racecommittee.app.data.handlers; + +import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.racecommittee.app.data.OnlineDataManager; + +public class TabletConfigurationDataHandler extends DataHandler { + + public TabletConfigurationDataHandler(OnlineDataManager manager) { + super(manager); + } + + @Override + public boolean hasCachedResults() { + return manager.getDataStore().getTabletConfiguration() != null; + } + + @Override + public TabletConfiguration getCachedResults() { + return manager.getDataStore().getTabletConfiguration(); + } + + @Override + public void onResult(TabletConfiguration data) { + manager.getDataStore().setTabletConfiguration(data); + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/TabletConfigurationParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/TabletConfigurationParser.java new file mode 100644 index 00000000000..f436fa8ad70 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/TabletConfigurationParser.java @@ -0,0 +1,27 @@ +package com.sap.sailing.racecommittee.app.data.parsers; + +import java.io.Reader; + +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.deserialization.impl.Helpers; + +public class TabletConfigurationParser implements DataParser { + + private JsonDeserializer deserializer; + + public TabletConfigurationParser(JsonDeserializer deserializer) { + this.deserializer = deserializer; + } + + @Override + public TabletConfiguration parse(Reader reader) throws Exception { + Object parsedResult = JSONValue.parseWithException(reader); + JSONObject jsonObject = Helpers.toJSONObjectSafe(parsedResult); + return deserializer.deserialize(jsonObject); + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java index 9dac3b43ba3..8ea9fdc722c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java @@ -12,6 +12,9 @@ import android.widget.Toast; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.EventBase; +import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.domain.base.TabletConfigurationIdentifier; +import com.sap.sailing.domain.base.impl.TabletConfigurationIdentifierImpl; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; @@ -27,11 +30,12 @@ import com.sap.sailing.racecommittee.app.ui.fragments.lists.EventListFragment; import com.sap.sailing.racecommittee.app.ui.fragments.lists.selection.CourseAreaSelectedListenerHost; import com.sap.sailing.racecommittee.app.ui.fragments.lists.selection.EventSelectedListenerHost; import com.sap.sailing.racecommittee.app.ui.fragments.lists.selection.ItemSelectedListener; +import com.sap.sailing.racecommittee.app.utils.TabletConfigurationHelper; -public class LoginActivity extends BaseActivity implements EventSelectedListenerHost, - CourseAreaSelectedListenerHost, DialogListenerHost { +public class LoginActivity extends BaseActivity implements EventSelectedListenerHost, CourseAreaSelectedListenerHost, + DialogListenerHost { private final static String TAG = LoginActivity.class.getName(); - + private final static String CourseAreaListFragmentTag = "CourseAreaListFragmentTag"; private LoginDialog loginDialog; @@ -41,7 +45,7 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener this.loginDialog = new LoginDialog(); this.selectedCourseArea = null; } - + @Override protected boolean onReset() { Fragment courseAreaFragment = getFragmentManager().findFragmentByTag(CourseAreaListFragmentTag); @@ -57,9 +61,9 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener public void onCreate(Bundle savedInstanceState) { // features must be requested before anything else getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS); - + super.onCreate(savedInstanceState); - + setContentView(R.layout.login_view); setProgressBarIndeterminateVisibility(false); @@ -95,38 +99,40 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener public void itemSelected(Fragment sender, EventBase event) { final Serializable eventId = event.getId(); ExLog.i(ExLog.EVENT_SELECTED, eventId.toString(), getBaseContext()); - + setProgressBarIndeterminateVisibility(true); final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this); progressDialog.setMessage(getString(R.string.loading_configuration)); progressDialog.setCancelable(false); progressDialog.setIndeterminate(true); progressDialog.show(); - - String identifier = AppPreferences.getAndroidIdentifier(getApplicationContext()); + ReadonlyDataManager dataManager = OnlineDataManager.create(LoginActivity.this); - getLoaderManager().restartLoader( - 0, - null, - dataManager.createConfigurationLoader(identifier, new LoadClient() { - + TabletConfigurationIdentifier identifier = new TabletConfigurationIdentifierImpl( + AppPreferences.getAndroidIdentifier(getApplicationContext())); + getLoaderManager().restartLoader(0, null, + dataManager.createConfigurationLoader(identifier, new LoadClient() { + @Override - public void onLoadSucceded(String data, boolean isCached) { + public void onLoadSucceded(TabletConfiguration configuration, boolean isCached) { setProgressBarIndeterminateVisibility(false); progressDialog.dismiss(); - - Toast.makeText(getApplicationContext(), data, Toast.LENGTH_SHORT).show(); + + TabletConfigurationHelper.apply(getApplicationContext(), configuration); + Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_succeded), + Toast.LENGTH_LONG).show(); showCourseAreaListFragment(eventId); } - + @Override public void onLoadFailed(Exception reason) { setProgressBarIndeterminateVisibility(false); progressDialog.dismiss(); - - Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_failed), Toast.LENGTH_LONG).show(); + + Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_failed), + Toast.LENGTH_LONG).show(); ExLog.ex(TAG, reason); - + showCourseAreaListFragment(eventId); } })).forceLoad(); @@ -162,7 +168,7 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener @Override public DialogResultListener getListener() { return new DialogResultListener() { - + @Override public void onDialogPositiveButton(AttachedDialogFragment dialog) { switch (loginDialog.getSelectedLoginType()) { @@ -176,7 +182,8 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener break; default: ExLog.i(TAG, "An invalid log type, e.g. NONE, was selected"); - Toast.makeText(LoginActivity.this, getString(R.string.please_select_a_login_type), Toast.LENGTH_LONG).show(); + Toast.makeText(LoginActivity.this, getString(R.string.please_select_a_login_type), + Toast.LENGTH_LONG).show(); return; } @@ -190,7 +197,7 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener message.putExtra(AppConstants.COURSE_AREA_UUID_KEY, selectedCourseArea.getId()); fadeActivity(message); } - + @Override public void onDialogNegativeButton(AttachedDialogFragment dialog) { /* nothing here... */ diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java new file mode 100644 index 00000000000..acf185e3683 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java @@ -0,0 +1,14 @@ +package com.sap.sailing.racecommittee.app.utils; + +import android.content.Context; + +import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.racecommittee.app.AppPreferences; + +public class TabletConfigurationHelper { + + public static void apply(Context context, TabletConfiguration configuration) { + AppPreferences.setManagedCourseAreaNames(context, configuration.getAllowedCourseAreaNames()); + } + +} From 7b1b1fd5dfe5c60f0c20696019881cdacffb2133 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Fri, 11 Oct 2013 18:31:08 +0200 Subject: [PATCH 039/450] # configuration of min/max rounds allowed on course # configuration of results mail recipient --- .../domain/base/TabletConfiguration.java | 3 ++ .../base/impl/TabletConfigurationImpl.java | 30 ++++++++++++++++ .../TabletConfigurationJsonDeserializer.java | 34 +++++++++++++------ .../racecommittee/app/AppPreferences.java | 15 ++++++++ .../racecommittee/app/data/DataStore.java | 1 - .../app/utils/TabletConfigurationHelper.java | 13 ++++++- 6 files changed, 84 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java index e701c164d87..5092c89cf5b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java @@ -7,4 +7,7 @@ import java.util.Set; */ public interface TabletConfiguration { Set getAllowedCourseAreaNames(); + Integer getMinimumRoundsForCourse(); + Integer getMaximumRoundsForCourse(); + String getResultsMailRecipent(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java index 8c531b15219..57e8692acb4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java @@ -8,6 +8,9 @@ import com.sap.sailing.domain.base.TabletConfiguration; public class TabletConfigurationImpl implements TabletConfiguration { private Set allowedCourseAreaNames; + private Integer minRounds; + private Integer maxRounds; + private String resultsMailRecipent; public TabletConfigurationImpl() { this.allowedCourseAreaNames = new HashSet(); @@ -22,4 +25,31 @@ public class TabletConfigurationImpl implements TabletConfiguration { this.allowedCourseAreaNames = newAllowedCourseAreaNames; } + @Override + public Integer getMinimumRoundsForCourse() { + return minRounds; + } + + public void setMinimumRoundsForCourse(Integer minRounds) { + this.minRounds = minRounds; + } + + @Override + public Integer getMaximumRoundsForCourse() { + return maxRounds; + } + + public void setMaximumRoundsForCourse(Integer maxRounds) { + this.maxRounds = maxRounds; + } + + @Override + public String getResultsMailRecipent() { + return resultsMailRecipent; + } + + public void setResultsMailRecipent(String ResultsMailRecipent) { + this.resultsMailRecipent = ResultsMailRecipent; + } + } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java index 0b189e6f362..367ff13551f 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java @@ -16,17 +16,31 @@ public class TabletConfigurationJsonDeserializer implements JsonDeserializer allowedCourseAreaNames = new HashSet(); - for (Object name : courseAreaNames) { - allowedCourseAreaNames.add(name.toString()); + + if (object.containsKey("courseAreaNames")) { + JSONArray courseAreaNames = Helpers.getNestedArraySafe(object, "courseAreaNames"); + Set allowedCourseAreaNames = new HashSet(); + for (Object name : courseAreaNames) { + allowedCourseAreaNames.add(name.toString()); + } + configuration.setAllowedCourseAreaNames(allowedCourseAreaNames); } - configuration.setAllowedCourseAreaNames(allowedCourseAreaNames); - - + + if (object.containsKey("minRounds")) { + Number minRounds = (Number) object.get("minRounds"); + configuration.setMinimumRoundsForCourse(minRounds.intValue()); + } + + if (object.containsKey("maxRounds")) { + Number maxRounds = (Number) object.get("maxRounds"); + configuration.setMaximumRoundsForCourse(maxRounds.intValue()); + } + + if (object.containsKey("resultsRecipent")) { + String resultsMailRecipent = (String) object.get("resultsRecipent"); + configuration.setResultsMailRecipent(resultsMailRecipent); + } + return configuration; } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java index b5509f2477f..8b2940266dd 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java @@ -167,6 +167,11 @@ public class AppPreferences { return sp.getString(PREFERENCE_MAIL_RECIPIENT, context.getString(R.string.settings_advanced_mail_default)); } + public static void setMailRecipient(Context context, String mail) { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + sp.edit().putString(PREFERENCE_MAIL_RECIPIENT, mail).commit(); + } + public static int getMaxRounds(Context context) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); String maxRoundsStr = sp.getString(PREFERENCE_MAX_ROUNDS, "3"); @@ -179,6 +184,11 @@ public class AppPreferences { return maxRounds; } + public static void setMaxRounds(Context context, int maxRounds) { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + sp.edit().putString(PREFERENCE_MAX_ROUNDS, String.valueOf(maxRounds)).commit(); + } + public static int getMinRounds(Context context) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); String minRoundsStr = sp.getString(PREFERENCE_MIN_ROUNDS, "2"); @@ -191,6 +201,11 @@ public class AppPreferences { return minRounds; } + public static void setMinRounds(Context context, int minRounds) { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); + sp.edit().putString(PREFERENCE_MIN_ROUNDS, String.valueOf(minRounds)).commit(); + } + public static StartProcedureType getDefaultStartProcedureType(Context context) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); String defaultStartProcedureType = sp.getString(PREFERENCE_DEFAULT_START_PROCEDURE_TYPE, "RRS26"); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java index 638680dc7cd..9c73f24fbfa 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java @@ -9,7 +9,6 @@ import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.TabletConfiguration; import com.sap.sailing.racecommittee.app.domain.ManagedRace; -import com.sap.sailing.server.gateway.deserialization.impl.TabletConfigurationJsonDeserializer; public interface DataStore { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java index acf185e3683..0ef27f447cd 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java @@ -8,7 +8,18 @@ import com.sap.sailing.racecommittee.app.AppPreferences; public class TabletConfigurationHelper { public static void apply(Context context, TabletConfiguration configuration) { - AppPreferences.setManagedCourseAreaNames(context, configuration.getAllowedCourseAreaNames()); + if (configuration.getAllowedCourseAreaNames() != null) { + AppPreferences.setManagedCourseAreaNames(context, configuration.getAllowedCourseAreaNames()); + } + if (configuration.getMinimumRoundsForCourse() != null) { + AppPreferences.setMinRounds(context, configuration.getMinimumRoundsForCourse()); + } + if (configuration.getMaximumRoundsForCourse() != null) { + AppPreferences.setMaxRounds(context, configuration.getMaximumRoundsForCourse()); + } + if (configuration.getResultsMailRecipent() != null) { + AppPreferences.setMailRecipient(context, configuration.getResultsMailRecipent()); + } } } From 945b81d24892ac578cf8cc798d7af635290fa9fc Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Fri, 11 Oct 2013 18:33:37 +0200 Subject: [PATCH 040/450] typo --- .../sap/sailing/domain/base/TabletConfiguration.java | 2 +- .../domain/base/impl/TabletConfigurationImpl.java | 10 +++++----- .../impl/TabletConfigurationJsonDeserializer.java | 6 +++--- .../app/utils/TabletConfigurationHelper.java | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java index 5092c89cf5b..67e37359325 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java @@ -9,5 +9,5 @@ public interface TabletConfiguration { Set getAllowedCourseAreaNames(); Integer getMinimumRoundsForCourse(); Integer getMaximumRoundsForCourse(); - String getResultsMailRecipent(); + String getResultsMailRecipient(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java index 57e8692acb4..1c2894f3374 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java @@ -10,7 +10,7 @@ public class TabletConfigurationImpl implements TabletConfiguration { private Set allowedCourseAreaNames; private Integer minRounds; private Integer maxRounds; - private String resultsMailRecipent; + private String resultsMailRecipient; public TabletConfigurationImpl() { this.allowedCourseAreaNames = new HashSet(); @@ -44,12 +44,12 @@ public class TabletConfigurationImpl implements TabletConfiguration { } @Override - public String getResultsMailRecipent() { - return resultsMailRecipent; + public String getResultsMailRecipient() { + return resultsMailRecipient; } - public void setResultsMailRecipent(String ResultsMailRecipent) { - this.resultsMailRecipent = ResultsMailRecipent; + public void setResultsMailRecipient(String resultsMailRecipient) { + this.resultsMailRecipient = resultsMailRecipient; } } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java index 367ff13551f..0e1b8e193d0 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java @@ -36,9 +36,9 @@ public class TabletConfigurationJsonDeserializer implements JsonDeserializer Date: Fri, 11 Oct 2013 19:26:56 +0200 Subject: [PATCH 041/450] # added some logging when remote configuration is applied --- .../app/utils/TabletConfigurationHelper.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java index 911fa88c2f3..1634b39555b 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java @@ -4,22 +4,33 @@ import android.content.Context; import com.sap.sailing.domain.base.TabletConfiguration; import com.sap.sailing.racecommittee.app.AppPreferences; +import com.sap.sailing.racecommittee.app.logging.ExLog; public class TabletConfigurationHelper { + private static final String TAG = TabletConfigurationHelper.class.getName(); + public static void apply(Context context, TabletConfiguration configuration) { if (configuration.getAllowedCourseAreaNames() != null) { AppPreferences.setManagedCourseAreaNames(context, configuration.getAllowedCourseAreaNames()); + logApply("course areas", configuration.getAllowedCourseAreaNames()); } if (configuration.getMinimumRoundsForCourse() != null) { AppPreferences.setMinRounds(context, configuration.getMinimumRoundsForCourse()); + logApply("minimum rounds", configuration.getMinimumRoundsForCourse()); } if (configuration.getMaximumRoundsForCourse() != null) { AppPreferences.setMaxRounds(context, configuration.getMaximumRoundsForCourse()); + logApply("maximum rounds", configuration.getMaximumRoundsForCourse()); } if (configuration.getResultsMailRecipient() != null) { AppPreferences.setMailRecipient(context, configuration.getResultsMailRecipient()); + logApply("mail recipient", configuration.getResultsMailRecipient()); } } + + private static void logApply(String configurationName, Object value) { + ExLog.i(TAG, String.format("Applied %s configuration: %s", configurationName, value.toString())); + } } From 8a34842d147cdd42b1f50af2c853e317510e1bfd Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Wed, 16 Oct 2013 16:04:17 +0200 Subject: [PATCH 042/450] # renamed TabletConfiguration to DeviceConfiguration --- ...guration.java => DeviceConfiguration.java} | 7 +-- ...ava => DeviceConfigurationIdentifier.java} | 2 +- .../DeviceConfigurationIdentifierImpl.java | 23 +++++++++ ...Impl.java => DeviceConfigurationImpl.java} | 18 +++---- .../TabletConfigurationIdentifierImpl.java | 18 ------- .../DeviceConfigurationJsonDeserializer.java | 48 +++++++++++++++++++ .../TabletConfigurationJsonDeserializer.java | 47 ------------------ .../DeviceConfigurationJsonSerializer.java | 40 ++++++++++++++++ .../impl/rc/ConfigurationJsonGetServlet.java | 19 ++++++-- .../sailing/server/RacingEventService.java | 9 ++++ .../server/impl/RacingEventServiceImpl.java | 13 +++++ .../racecommittee/app/AppPreferences.java | 3 +- .../racecommittee/app/data/DataStore.java | 6 +-- .../app/data/InMemoryDataStore.java | 8 ++-- .../app/data/OfflineDataManager.java | 12 ++--- .../app/data/OnlineDataManager.java | 24 +++++----- .../app/data/ReadonlyDataManager.java | 8 ++-- ...va => DeviceConfigurationDataHandler.java} | 10 ++-- ...er.java => DeviceConfigurationParser.java} | 10 ++-- .../app/ui/activities/LoginActivity.java | 16 +++---- ...er.java => DeviceConfigurationHelper.java} | 8 ++-- 21 files changed, 212 insertions(+), 137 deletions(-) rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/{TabletConfiguration.java => DeviceConfiguration.java} (68%) rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/{TabletConfigurationIdentifier.java => DeviceConfigurationIdentifier.java} (84%) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationIdentifierImpl.java rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/{TabletConfigurationImpl.java => DeviceConfigurationImpl.java} (66%) delete mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationIdentifierImpl.java create mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/DeviceConfigurationJsonDeserializer.java delete mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java create mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/DeviceConfigurationJsonSerializer.java rename mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/{TabletConfigurationDataHandler.java => DeviceConfigurationDataHandler.java} (60%) rename mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/{TabletConfigurationParser.java => DeviceConfigurationParser.java} (64%) rename mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/{TabletConfigurationHelper.java => DeviceConfigurationHelper.java} (86%) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfiguration.java similarity index 68% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfiguration.java index 67e37359325..e8986f8308b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfiguration.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfiguration.java @@ -1,12 +1,13 @@ package com.sap.sailing.domain.base; -import java.util.Set; +import java.util.List; + /** * Interface holding information about tablet's (RCApp) configuration. */ -public interface TabletConfiguration { - Set getAllowedCourseAreaNames(); +public interface DeviceConfiguration { + List getAllowedCourseAreaNames(); Integer getMinimumRoundsForCourse(); Integer getMaximumRoundsForCourse(); String getResultsMailRecipient(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfigurationIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfigurationIdentifier.java similarity index 84% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfigurationIdentifier.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfigurationIdentifier.java index 46fbd11fb95..3a119979388 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/TabletConfigurationIdentifier.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfigurationIdentifier.java @@ -4,7 +4,7 @@ package com.sap.sailing.domain.base; * Each tablet configuration is bound to a specific client. Use this interface instead of a plain {@link String} to * enable additions (like event-specific configurations). */ -public interface TabletConfigurationIdentifier { +public interface DeviceConfigurationIdentifier { String getClientIdentifier(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationIdentifierImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationIdentifierImpl.java new file mode 100644 index 00000000000..9e2b14eb842 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationIdentifierImpl.java @@ -0,0 +1,23 @@ +package com.sap.sailing.domain.base.impl; + +import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; + +public class DeviceConfigurationIdentifierImpl implements DeviceConfigurationIdentifier { + + private final String clientIdentifier; + + public DeviceConfigurationIdentifierImpl(String clientIdentifier) { + this.clientIdentifier = clientIdentifier; + } + + @Override + public String getClientIdentifier() { + return clientIdentifier; + } + + @Override + public String toString() { + return "TabletConfigurationIdentifierImpl [clientIdentifier=" + clientIdentifier + "]"; + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationImpl.java similarity index 66% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationImpl.java index 1c2894f3374..39821ae3616 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationImpl.java @@ -1,27 +1,21 @@ package com.sap.sailing.domain.base.impl; +import java.util.List; -import java.util.HashSet; -import java.util.Set; +import com.sap.sailing.domain.base.DeviceConfiguration; -import com.sap.sailing.domain.base.TabletConfiguration; - -public class TabletConfigurationImpl implements TabletConfiguration { +public class DeviceConfigurationImpl implements DeviceConfiguration { - private Set allowedCourseAreaNames; + private List allowedCourseAreaNames; private Integer minRounds; private Integer maxRounds; private String resultsMailRecipient; - - public TabletConfigurationImpl() { - this.allowedCourseAreaNames = new HashSet(); - } @Override - public Set getAllowedCourseAreaNames() { + public List getAllowedCourseAreaNames() { return allowedCourseAreaNames; } - public void setAllowedCourseAreaNames(Set newAllowedCourseAreaNames) { + public void setAllowedCourseAreaNames(List newAllowedCourseAreaNames) { this.allowedCourseAreaNames = newAllowedCourseAreaNames; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationIdentifierImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationIdentifierImpl.java deleted file mode 100644 index 881454743a3..00000000000 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TabletConfigurationIdentifierImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sap.sailing.domain.base.impl; - -import com.sap.sailing.domain.base.TabletConfigurationIdentifier; - -public class TabletConfigurationIdentifierImpl implements TabletConfigurationIdentifier { - - private final String clientIdentifier; - - public TabletConfigurationIdentifierImpl(String clientIdentifier) { - this.clientIdentifier = clientIdentifier; - } - - @Override - public String getClientIdentifier() { - return clientIdentifier; - } - -} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/DeviceConfigurationJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/DeviceConfigurationJsonDeserializer.java new file mode 100644 index 00000000000..8fa26d106e2 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/DeviceConfigurationJsonDeserializer.java @@ -0,0 +1,48 @@ +package com.sap.sailing.server.gateway.deserialization.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.impl.DeviceConfigurationImpl; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.serialization.impl.DeviceConfigurationJsonSerializer; + +public class DeviceConfigurationJsonDeserializer implements JsonDeserializer { + + @Override + public DeviceConfiguration deserialize(JSONObject object) throws JsonDeserializationException { + DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); + + if (object.containsKey(DeviceConfigurationJsonSerializer.FIELD_COURSE_AREA_NAMES)) { + JSONArray courseAreaNames = Helpers.getNestedArraySafe(object, DeviceConfigurationJsonSerializer.FIELD_COURSE_AREA_NAMES); + List allowedCourseAreaNames = new ArrayList(); + for (Object name : courseAreaNames) { + allowedCourseAreaNames.add(name.toString()); + } + configuration.setAllowedCourseAreaNames(allowedCourseAreaNames); + } + + if (object.containsKey(DeviceConfigurationJsonSerializer.FIELD_MIN_ROUNDS)) { + Number minRounds = (Number) object.get(DeviceConfigurationJsonSerializer.FIELD_MIN_ROUNDS); + configuration.setMinimumRoundsForCourse(minRounds.intValue()); + } + + if (object.containsKey(DeviceConfigurationJsonSerializer.FIELD_MAX_ROUNDS)) { + Number maxRounds = (Number) object.get(DeviceConfigurationJsonSerializer.FIELD_MAX_ROUNDS); + configuration.setMaximumRoundsForCourse(maxRounds.intValue()); + } + + if (object.containsKey(DeviceConfigurationJsonSerializer.FIELD_RESULTS_RECIPIENT)) { + String resultsRecipient = (String) object.get(DeviceConfigurationJsonSerializer.FIELD_RESULTS_RECIPIENT); + configuration.setResultsMailRecipient(resultsRecipient); + } + + return configuration; + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java deleted file mode 100644 index 0e1b8e193d0..00000000000 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/TabletConfigurationJsonDeserializer.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.sap.sailing.server.gateway.deserialization.impl; - -import java.util.HashSet; -import java.util.Set; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.base.TabletConfiguration; -import com.sap.sailing.domain.base.impl.TabletConfigurationImpl; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; - -public class TabletConfigurationJsonDeserializer implements JsonDeserializer { - - @Override - public TabletConfiguration deserialize(JSONObject object) throws JsonDeserializationException { - TabletConfigurationImpl configuration = new TabletConfigurationImpl(); - - if (object.containsKey("courseAreaNames")) { - JSONArray courseAreaNames = Helpers.getNestedArraySafe(object, "courseAreaNames"); - Set allowedCourseAreaNames = new HashSet(); - for (Object name : courseAreaNames) { - allowedCourseAreaNames.add(name.toString()); - } - configuration.setAllowedCourseAreaNames(allowedCourseAreaNames); - } - - if (object.containsKey("minRounds")) { - Number minRounds = (Number) object.get("minRounds"); - configuration.setMinimumRoundsForCourse(minRounds.intValue()); - } - - if (object.containsKey("maxRounds")) { - Number maxRounds = (Number) object.get("maxRounds"); - configuration.setMaximumRoundsForCourse(maxRounds.intValue()); - } - - if (object.containsKey("resultsRecipient")) { - String resultsRecipient = (String) object.get("resultsRecipient"); - configuration.setResultsMailRecipient(resultsRecipient); - } - - return configuration; - } - -} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/DeviceConfigurationJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/DeviceConfigurationJsonSerializer.java new file mode 100644 index 00000000000..242bfd1a2ad --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/DeviceConfigurationJsonSerializer.java @@ -0,0 +1,40 @@ +package com.sap.sailing.server.gateway.serialization.impl; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; + +public class DeviceConfigurationJsonSerializer implements JsonSerializer { + + public static final String FIELD_COURSE_AREA_NAMES = "courseAreaNames"; + public static final String FIELD_MIN_ROUNDS = "minRounds"; + public static final String FIELD_MAX_ROUNDS = "maxRounds"; + public static final String FIELD_RESULTS_RECIPIENT = "resultsRecipient"; + + @Override + public JSONObject serialize(DeviceConfiguration object) { + JSONObject result = new JSONObject(); + + if (object.getAllowedCourseAreaNames() != null) { + JSONArray courseAreaNames = new JSONArray(); + for (String name : object.getAllowedCourseAreaNames()) { + courseAreaNames.add(name); + } + result.put(FIELD_COURSE_AREA_NAMES, courseAreaNames); + } + if (object.getMinimumRoundsForCourse() != null) { + result.put(FIELD_MIN_ROUNDS, object.getMinimumRoundsForCourse()); + } + if (object.getMaximumRoundsForCourse() != null) { + result.put(FIELD_MAX_ROUNDS, object.getMaximumRoundsForCourse()); + } + if (object.getResultsMailRecipient() != null) { + result.put(FIELD_RESULTS_RECIPIENT, object.getResultsMailRecipient()); + } + + return result; + } + +} diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java index fd25552dea3..4c40c6f348e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java @@ -7,7 +7,14 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.impl.DeviceConfigurationIdentifierImpl; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.DeviceConfigurationJsonSerializer; public class ConfigurationJsonGetServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = 7704668926551060433L; @@ -25,9 +32,15 @@ public class ConfigurationJsonGetServlet extends AbstractJsonHttpServlet { return; } - logger.fine(String.format("Configuration requested by client %s.", clientId)); - - response.sendError(HttpServletResponse.SC_FORBIDDEN); + DeviceConfigurationIdentifier identifier = new DeviceConfigurationIdentifierImpl(clientId); + + logger.fine(String.format("Configuration requested by client %s.", identifier)); + + DeviceConfiguration configuration = getService().getDeviceConfiguration(identifier); + + JsonSerializer serializer = new DeviceConfigurationJsonSerializer(); + JSONObject json = serializer.serialize(configuration); + json.writeJSONString(response.getWriter()); } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java index 68666ae0549..134bfe4d296 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java @@ -26,6 +26,8 @@ import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.RegattaRegistry; import com.sap.sailing.domain.base.Series; +import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.common.RaceFetcher; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaFetcher; @@ -552,4 +554,11 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch */ void setPersistentRegattaForRaceIDs(Regatta regatta, Iterable raceIdStrings, boolean override); + /** + * Returns a tablet's configuration. + * @param identifier of the client (may include event) + * @return the {@link DeviceConfiguration} + */ + DeviceConfiguration getDeviceConfiguration(DeviceConfigurationIdentifier identifier); + } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 154acd334ea..1ab708b0c8f 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -12,6 +12,7 @@ import java.net.URL; import java.net.UnknownHostException; import java.text.ParseException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -33,6 +34,8 @@ import java.util.logging.Logger; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; @@ -44,6 +47,7 @@ import com.sap.sailing.domain.base.RegattaListener; import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.impl.DeviceConfigurationImpl; import com.sap.sailing.domain.base.impl.EventImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.common.LeaderboardNameConstants; @@ -2092,4 +2096,13 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen } } + @Override + public DeviceConfiguration getDeviceConfiguration(DeviceConfigurationIdentifier identifier) { + DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); + configuration.setAllowedCourseAreaNames(Arrays.asList("Alpha", "Beta", "Stadium")); + configuration.setMaximumRoundsForCourse(3); + configuration.setResultsMailRecipient("lukas.niemeier@sap.com"); + return configuration; + } + } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java index 8b2940266dd..91cb37fa119 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java @@ -2,7 +2,6 @@ package com.sap.sailing.racecommittee.app; import java.util.Arrays; import java.util.List; -import java.util.Set; import android.content.Context; import android.content.SharedPreferences; @@ -111,7 +110,7 @@ public class AppPreferences { return Arrays.asList(managedCourseAreas); } - public static void setManagedCourseAreaNames(Context context, Set courseAreaNames) { + public static void setManagedCourseAreaNames(Context context, List courseAreaNames) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); StringBuilder builder = new StringBuilder(); for (String name : courseAreaNames) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java index 9c73f24fbfa..09efb191d0a 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java @@ -7,7 +7,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.domain.base.DeviceConfiguration; import com.sap.sailing.racecommittee.app.domain.ManagedRace; public interface DataStore { @@ -37,6 +37,6 @@ public interface DataStore { public CourseBase getLastPublishedCourseDesign(); public void setLastPublishedCourseDesign(CourseBase courseData); - public TabletConfiguration getTabletConfiguration(); - public void setTabletConfiguration(TabletConfiguration configuration); + public DeviceConfiguration getTabletConfiguration(); + public void setTabletConfiguration(DeviceConfiguration configuration); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java index bfc5f852cd1..17a4ba841f3 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.domain.base.DeviceConfiguration; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.utils.CollectionUtils; @@ -19,7 +19,7 @@ public enum InMemoryDataStore implements DataStore { private HashMap managedRaceById; private HashMap marksById; private CourseBase courseData; - private TabletConfiguration configuration; + private DeviceConfiguration configuration; private InMemoryDataStore() { reset(); @@ -165,12 +165,12 @@ public enum InMemoryDataStore implements DataStore { } @Override - public TabletConfiguration getTabletConfiguration() { + public DeviceConfiguration getTabletConfiguration() { return configuration; } @Override - public void setTabletConfiguration(TabletConfiguration configuration) { + public void setTabletConfiguration(DeviceConfiguration configuration) { this.configuration = configuration; } } 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 76c4ad10e5d..4798e682b79 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 @@ -15,10 +15,10 @@ import android.content.Context; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; +import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.base.TabletConfiguration; -import com.sap.sailing.domain.base.TabletConfigurationIdentifier; import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CourseAreaImpl; @@ -194,11 +194,11 @@ public class OfflineDataManager extends DataManager { } @Override - public LoaderCallbacks> createConfigurationLoader(TabletConfigurationIdentifier identifier, - LoadClient callback) { - return new ImmediateDataLoaderCallbacks(context, callback, new Callable() { + public LoaderCallbacks> createConfigurationLoader(DeviceConfigurationIdentifier identifier, + LoadClient callback) { + return new ImmediateDataLoaderCallbacks(context, callback, new Callable() { @Override - public TabletConfiguration call() throws Exception { + public DeviceConfiguration call() throws Exception { throw new IllegalStateException("No remote configuration in offline mode."); } }); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index 207f34f859c..3ef500967fd 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -15,11 +15,11 @@ import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; +import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.SharedDomainFactory; -import com.sap.sailing.domain.base.TabletConfiguration; -import com.sap.sailing.domain.base.TabletConfigurationIdentifier; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.handlers.CompetitorsDataHandler; @@ -28,7 +28,7 @@ import com.sap.sailing.racecommittee.app.data.handlers.DataHandler; import com.sap.sailing.racecommittee.app.data.handlers.EventsDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.ManagedRacesDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.MarksDataHandler; -import com.sap.sailing.racecommittee.app.data.handlers.TabletConfigurationDataHandler; +import com.sap.sailing.racecommittee.app.data.handlers.DeviceConfigurationDataHandler; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderCallbacks; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderCallbacks.LoaderCreator; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; @@ -40,7 +40,7 @@ import com.sap.sailing.racecommittee.app.data.parsers.DataParser; import com.sap.sailing.racecommittee.app.data.parsers.EventsDataParser; import com.sap.sailing.racecommittee.app.data.parsers.ManagedRacesDataParser; import com.sap.sailing.racecommittee.app.data.parsers.MarksDataParser; -import com.sap.sailing.racecommittee.app.data.parsers.TabletConfigurationParser; +import com.sap.sailing.racecommittee.app.data.parsers.DeviceConfigurationParser; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; @@ -55,9 +55,9 @@ import com.sap.sailing.server.gateway.deserialization.impl.BoatClassJsonDeserial import com.sap.sailing.server.gateway.deserialization.impl.ColorDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.CompetitorDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.CourseAreaJsonDeserializer; +import com.sap.sailing.server.gateway.deserialization.impl.DeviceConfigurationJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.EventBaseJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.FleetDeserializer; -import com.sap.sailing.server.gateway.deserialization.impl.TabletConfigurationJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.VenueJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.racegroup.impl.RaceCellDeserializer; import com.sap.sailing.server.gateway.deserialization.racegroup.impl.RaceGroupDeserializer; @@ -235,17 +235,17 @@ public class OnlineDataManager extends DataManager { } @Override - public LoaderCallbacks> createConfigurationLoader(final TabletConfigurationIdentifier identifier, - LoadClient callback) { - return new DataLoaderCallbacks(callback, new LoaderCreator() { + public LoaderCallbacks> createConfigurationLoader(final DeviceConfigurationIdentifier identifier, + LoadClient callback) { + return new DataLoaderCallbacks(callback, new LoaderCreator() { @Override - public Loader> create(int id, Bundle args) throws Exception { + public Loader> create(int id, Bundle args) throws Exception { ExLog.i(TAG, String.format("Creating Configuration-OnlineDataLoader %d", id)); - DataHandler handler = new TabletConfigurationDataHandler(OnlineDataManager.this); - DataParser parser = new TabletConfigurationParser(new TabletConfigurationJsonDeserializer()); + DataHandler handler = new DeviceConfigurationDataHandler(OnlineDataManager.this); + DataParser parser = new DeviceConfigurationParser(new DeviceConfigurationJsonDeserializer()); - return new OnlineDataLoader( + return new OnlineDataLoader( context, new URL(AppPreferences.getServerBaseURL(context) + "/sailingserver/rc/configuration?client="+ identifier.getClientIdentifier()), parser, handler); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java index 847e3ee5233..f26bcbabb8d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java @@ -9,10 +9,10 @@ import android.app.LoaderManager.LoaderCallbacks; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; +import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.base.TabletConfiguration; -import com.sap.sailing.domain.base.TabletConfigurationIdentifier; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; import com.sap.sailing.racecommittee.app.domain.ManagedRace; @@ -129,6 +129,6 @@ public interface ReadonlyDataManager { * {@link LoaderManager#initLoader(int, android.os.Bundle, LoaderCallbacks)} or * {@link LoaderManager#restartLoader(int, android.os.Bundle, LoaderCallbacks)}. */ - public LoaderCallbacks> createConfigurationLoader(TabletConfigurationIdentifier identifier, - LoadClient callback); + public LoaderCallbacks> createConfigurationLoader(DeviceConfigurationIdentifier identifier, + LoadClient callback); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/TabletConfigurationDataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DeviceConfigurationDataHandler.java similarity index 60% rename from mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/TabletConfigurationDataHandler.java rename to mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DeviceConfigurationDataHandler.java index 812d77b652f..e51da1085fb 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/TabletConfigurationDataHandler.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DeviceConfigurationDataHandler.java @@ -1,11 +1,11 @@ package com.sap.sailing.racecommittee.app.data.handlers; -import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.domain.base.DeviceConfiguration; import com.sap.sailing.racecommittee.app.data.OnlineDataManager; -public class TabletConfigurationDataHandler extends DataHandler { +public class DeviceConfigurationDataHandler extends DataHandler { - public TabletConfigurationDataHandler(OnlineDataManager manager) { + public DeviceConfigurationDataHandler(OnlineDataManager manager) { super(manager); } @@ -15,12 +15,12 @@ public class TabletConfigurationDataHandler extends DataHandler { +public class DeviceConfigurationParser implements DataParser { - private JsonDeserializer deserializer; + private JsonDeserializer deserializer; - public TabletConfigurationParser(JsonDeserializer deserializer) { + public DeviceConfigurationParser(JsonDeserializer deserializer) { this.deserializer = deserializer; } @Override - public TabletConfiguration parse(Reader reader) throws Exception { + public DeviceConfiguration parse(Reader reader) throws Exception { Object parsedResult = JSONValue.parseWithException(reader); JSONObject jsonObject = Helpers.toJSONObjectSafe(parsedResult); return deserializer.deserialize(jsonObject); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java index 8ea9fdc722c..e5b2bd39c00 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java @@ -11,10 +11,10 @@ import android.view.Window; import android.widget.Toast; import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.EventBase; -import com.sap.sailing.domain.base.TabletConfiguration; -import com.sap.sailing.domain.base.TabletConfigurationIdentifier; -import com.sap.sailing.domain.base.impl.TabletConfigurationIdentifierImpl; +import com.sap.sailing.domain.base.impl.DeviceConfigurationIdentifierImpl; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; @@ -30,7 +30,7 @@ import com.sap.sailing.racecommittee.app.ui.fragments.lists.EventListFragment; import com.sap.sailing.racecommittee.app.ui.fragments.lists.selection.CourseAreaSelectedListenerHost; import com.sap.sailing.racecommittee.app.ui.fragments.lists.selection.EventSelectedListenerHost; import com.sap.sailing.racecommittee.app.ui.fragments.lists.selection.ItemSelectedListener; -import com.sap.sailing.racecommittee.app.utils.TabletConfigurationHelper; +import com.sap.sailing.racecommittee.app.utils.DeviceConfigurationHelper; public class LoginActivity extends BaseActivity implements EventSelectedListenerHost, CourseAreaSelectedListenerHost, DialogListenerHost { @@ -108,17 +108,17 @@ public class LoginActivity extends BaseActivity implements EventSelectedListener progressDialog.show(); ReadonlyDataManager dataManager = OnlineDataManager.create(LoginActivity.this); - TabletConfigurationIdentifier identifier = new TabletConfigurationIdentifierImpl( + DeviceConfigurationIdentifier identifier = new DeviceConfigurationIdentifierImpl( AppPreferences.getAndroidIdentifier(getApplicationContext())); getLoaderManager().restartLoader(0, null, - dataManager.createConfigurationLoader(identifier, new LoadClient() { + dataManager.createConfigurationLoader(identifier, new LoadClient() { @Override - public void onLoadSucceded(TabletConfiguration configuration, boolean isCached) { + public void onLoadSucceded(DeviceConfiguration configuration, boolean isCached) { setProgressBarIndeterminateVisibility(false); progressDialog.dismiss(); - TabletConfigurationHelper.apply(getApplicationContext(), configuration); + DeviceConfigurationHelper.apply(getApplicationContext(), configuration); Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_succeded), Toast.LENGTH_LONG).show(); showCourseAreaListFragment(eventId); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/DeviceConfigurationHelper.java similarity index 86% rename from mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java rename to mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/DeviceConfigurationHelper.java index 1634b39555b..d24d4f41f82 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/TabletConfigurationHelper.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/DeviceConfigurationHelper.java @@ -2,15 +2,15 @@ package com.sap.sailing.racecommittee.app.utils; import android.content.Context; -import com.sap.sailing.domain.base.TabletConfiguration; +import com.sap.sailing.domain.base.DeviceConfiguration; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.logging.ExLog; -public class TabletConfigurationHelper { +public class DeviceConfigurationHelper { - private static final String TAG = TabletConfigurationHelper.class.getName(); + private static final String TAG = DeviceConfigurationHelper.class.getName(); - public static void apply(Context context, TabletConfiguration configuration) { + public static void apply(Context context, DeviceConfiguration configuration) { if (configuration.getAllowedCourseAreaNames() != null) { AppPreferences.setManagedCourseAreaNames(context, configuration.getAllowedCourseAreaNames()); logApply("course areas", configuration.getAllowedCourseAreaNames()); From 313085c4566f52edf0229b6ce7d09e22fab79b9b Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Wed, 23 Oct 2013 16:02:09 +0200 Subject: [PATCH 043/450] # added server code to create, edit and delete device configurations --- .../META-INF/MANIFEST.MF | 2 + .../DeviceConfiguration.java | 3 +- .../DeviceConfigurationIdentifier.java | 8 +- .../DeviceConfigurationMatcher.java | 12 ++ .../DeviceConfigurationIdentifierImpl.java | 13 +- .../impl/DeviceConfigurationImpl.java | 4 +- .../impl/DeviceConfigurationMapImpl.java | 51 +++++ .../impl/DeviceConfigurationMatcherAny.java | 21 ++ .../impl/DeviceConfigurationMatcherMulti.java | 57 +++++ .../DeviceConfigurationMatcherSingle.java | 54 +++++ .../adminconsole/AdminConsoleEntryPoint.java | 3 + .../DeviceConfigurationCreateDialog.java | 177 ++++++++++++++++ .../DeviceConfigurationDetailComposite.java | 197 ++++++++++++++++++ .../DeviceConfigurationListComposite.java | 162 ++++++++++++++ .../DeviceConfigurationPanel.java | 166 +++++++++++++++ .../sailing/gwt/ui/client/SailingService.java | 11 + .../gwt/ui/client/SailingServiceAsync.java | 11 + .../ui/client/SelectionChangeListener.java | 19 ++ .../gwt/ui/client/SelectionProvider.java | 25 +++ .../gwt/ui/client/SelectionProviderImpl.java | 92 ++++++++ .../gwt/ui/server/SailingServiceImpl.java | 98 +++++++++ .../gwt/ui/shared/DeviceConfigurationDTO.java | 14 ++ .../shared/DeviceConfigurationMatcherDTO.java | 30 +++ .../DeviceConfigurationJsonDeserializer.java | 4 +- .../DeviceConfigurationJsonSerializer.java | 2 +- .../impl/rc/ConfigurationJsonGetServlet.java | 17 +- .../sailing/server/RacingEventService.java | 26 ++- .../server/impl/RacingEventServiceImpl.java | 81 ++++++- .../racecommittee/app/data/DataStore.java | 2 +- .../app/data/InMemoryDataStore.java | 2 +- .../app/data/OfflineDataManager.java | 4 +- .../app/data/OnlineDataManager.java | 4 +- .../app/data/ReadonlyDataManager.java | 4 +- .../DeviceConfigurationDataHandler.java | 2 +- .../parsers/DeviceConfigurationParser.java | 2 +- .../app/ui/activities/LoginActivity.java | 6 +- .../app/utils/DeviceConfigurationHelper.java | 2 +- 37 files changed, 1335 insertions(+), 53 deletions(-) rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/{ => configuration}/DeviceConfiguration.java (85%) rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/{ => configuration}/DeviceConfigurationIdentifier.java (59%) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/{ => configuration}/impl/DeviceConfigurationIdentifierImpl.java (58%) rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/{ => configuration}/impl/DeviceConfigurationImpl.java (90%) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMapImpl.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationCreateDialog.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionChangeListener.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionProvider.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionProviderImpl.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationDTO.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationMatcherDTO.java 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 0a26e77fc02..8a2c32092f2 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 @@ -7,6 +7,8 @@ Bundle-Vendor: SAP Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0" Export-Package: com.sap.sailing.domain.base, + com.sap.sailing.domain.base.configuration, + com.sap.sailing.domain.base.configuration.impl, com.sap.sailing.domain.base.impl, com.sap.sailing.domain.base.racegroup, com.sap.sailing.domain.base.racegroup.impl, diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfiguration.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfiguration.java similarity index 85% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfiguration.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfiguration.java index e8986f8308b..df7e8c388b5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfiguration.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfiguration.java @@ -1,8 +1,7 @@ -package com.sap.sailing.domain.base; +package com.sap.sailing.domain.base.configuration; import java.util.List; - /** * Interface holding information about tablet's (RCApp) configuration. */ diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfigurationIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationIdentifier.java similarity index 59% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfigurationIdentifier.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationIdentifier.java index 3a119979388..3ba79ef24db 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/DeviceConfigurationIdentifier.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationIdentifier.java @@ -1,11 +1,11 @@ -package com.sap.sailing.domain.base; +package com.sap.sailing.domain.base.configuration; + +import java.io.Serializable; /** * Each tablet configuration is bound to a specific client. Use this interface instead of a plain {@link String} to * enable additions (like event-specific configurations). */ -public interface DeviceConfigurationIdentifier { - +public interface DeviceConfigurationIdentifier extends Serializable { String getClientIdentifier(); - } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java new file mode 100644 index 00000000000..d51ba5df2be --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java @@ -0,0 +1,12 @@ +package com.sap.sailing.domain.base.configuration; + +import java.io.Serializable; + +public interface DeviceConfigurationMatcher extends Serializable { + public final static int RANK_SINGLE = 1; + public final static int RANK_MULTI = 2; + public final static int RANK_ANY = 3; + + int getMatchingRank(); + boolean matches(DeviceConfigurationIdentifier identifier); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationIdentifierImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationIdentifierImpl.java similarity index 58% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationIdentifierImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationIdentifierImpl.java index 9e2b14eb842..eae7ede50ed 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationIdentifierImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationIdentifierImpl.java @@ -1,11 +1,13 @@ -package com.sap.sailing.domain.base.impl; +package com.sap.sailing.domain.base.configuration.impl; -import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; public class DeviceConfigurationIdentifierImpl implements DeviceConfigurationIdentifier { + + private static final long serialVersionUID = 2785847392322741468L; private final String clientIdentifier; - + public DeviceConfigurationIdentifierImpl(String clientIdentifier) { this.clientIdentifier = clientIdentifier; } @@ -15,9 +17,4 @@ public class DeviceConfigurationIdentifierImpl implements DeviceConfigurationIde return clientIdentifier; } - @Override - public String toString() { - return "TabletConfigurationIdentifierImpl [clientIdentifier=" + clientIdentifier + "]"; - } - } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationImpl.java similarity index 90% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationImpl.java index 39821ae3616..e1bdb872341 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DeviceConfigurationImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationImpl.java @@ -1,7 +1,7 @@ -package com.sap.sailing.domain.base.impl; +package com.sap.sailing.domain.base.configuration.impl; import java.util.List; -import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; public class DeviceConfigurationImpl implements DeviceConfiguration { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMapImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMapImpl.java new file mode 100644 index 00000000000..b15f290ae13 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMapImpl.java @@ -0,0 +1,51 @@ +package com.sap.sailing.domain.base.configuration.impl; + +import java.util.concurrent.ConcurrentHashMap; + +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; + +public class DeviceConfigurationMapImpl extends ConcurrentHashMap { + + private static final long serialVersionUID = -8009136964737670452L; + + private interface Action { + DeviceConfiguration call(DeviceConfigurationMatcher matcher); + } + + public DeviceConfiguration getByMatch(DeviceConfigurationIdentifier key) { + return doByMatch(key, new Action() { + @Override + public DeviceConfiguration call(DeviceConfigurationMatcher match) { + return get(match); + } + }); + } + + public DeviceConfiguration removeByMatch(DeviceConfigurationIdentifier key) { + return doByMatch(key, new Action() { + @Override + public DeviceConfiguration call(DeviceConfigurationMatcher match) { + return remove(match); + } + }); + } + + private DeviceConfiguration doByMatch(DeviceConfigurationIdentifier key, Action action) { + DeviceConfigurationMatcher match = null; + for (Entry entry : entrySet()) { + if (entry.getKey().matches(key)) { + if (match == null || match.getMatchingRank() > entry.getKey().getMatchingRank()) { + match = entry.getKey(); + } + } + } + if (match != null) { + return action.call(match); + } else { + return null; + } + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java new file mode 100644 index 00000000000..400e0cf0574 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java @@ -0,0 +1,21 @@ +package com.sap.sailing.domain.base.configuration.impl; + +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; + +public enum DeviceConfigurationMatcherAny implements DeviceConfigurationMatcher { + INSTANCE; + + private static final long serialVersionUID = 4574449656453672610L; + + @Override + public boolean matches(DeviceConfigurationIdentifier identifier) { + return true; + } + + @Override + public int getMatchingRank() { + return RANK_ANY; + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java new file mode 100644 index 00000000000..e6c64cead51 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java @@ -0,0 +1,57 @@ +package com.sap.sailing.domain.base.configuration.impl; + +import java.util.List; + +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; + +public class DeviceConfigurationMatcherMulti implements DeviceConfigurationMatcher { + + private static final long serialVersionUID = 2372299957258702516L; + + private final List clientIdentifiers; + + public DeviceConfigurationMatcherMulti(List matchingClientIdentifiers) { + this.clientIdentifiers = matchingClientIdentifiers; + } + + @Override + public boolean matches(DeviceConfigurationIdentifier identifier) { + return this.clientIdentifiers.contains(identifier.getClientIdentifier()); + } + + @Override + public int getMatchingRank() { + return RANK_MULTI; + } + + public List getClientIdentifiers() { + return clientIdentifiers; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((clientIdentifiers == null) ? 0 : clientIdentifiers.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DeviceConfigurationMatcherMulti other = (DeviceConfigurationMatcherMulti) obj; + if (clientIdentifiers == null) { + if (other.clientIdentifiers != null) + return false; + } else if (!clientIdentifiers.equals(other.clientIdentifiers)) + return false; + return true; + } + +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java new file mode 100644 index 00000000000..c1f695cb2e5 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java @@ -0,0 +1,54 @@ +package com.sap.sailing.domain.base.configuration.impl; + +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; + +public class DeviceConfigurationMatcherSingle implements DeviceConfigurationMatcher { + + private static final long serialVersionUID = -3662453614818373801L; + private final String clientIdentifier; + + public DeviceConfigurationMatcherSingle(String matchingClientIdentifier) { + this.clientIdentifier = matchingClientIdentifier; + } + + @Override + public boolean matches(DeviceConfigurationIdentifier identifier) { + return this.clientIdentifier.equals(identifier.getClientIdentifier()); + } + + @Override + public int getMatchingRank() { + return RANK_SINGLE; + } + + public String getClientIdentifier() { + return clientIdentifier; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((clientIdentifier == null) ? 0 : clientIdentifier.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DeviceConfigurationMatcherSingle other = (DeviceConfigurationMatcherSingle) obj; + if (clientIdentifier == null) { + if (other.clientIdentifier != null) + return false; + } else if (!clientIdentifier.equals(other.clientIdentifier)) + return false; + return true; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java index c394bea8708..40770d28c86 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java @@ -47,6 +47,9 @@ public class AdminConsoleEntryPoint extends AbstractEntryPoint implements Regatt tabPanel.setSize("99%", "95%"); verticalPanel.add(tabPanel); //, 10, 10); + final DeviceConfigurationPanel deviceConfigurationPanel = new DeviceConfigurationPanel(sailingService, stringMessages, this); + tabPanel.add(deviceConfigurationPanel, "Device Configuration", false); + regattaDisplayers = new HashSet(); SailingEventManagementPanel sailingEventManagementPanel = new SailingEventManagementPanel(sailingService, this, stringMessages); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationCreateDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationCreateDialog.java new file mode 100644 index 00000000000..6dce042585a --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationCreateDialog.java @@ -0,0 +1,177 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ChangeHandler; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.ListBox; +import com.google.gwt.user.client.ui.PushButton; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.DataEntryDialog; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO.Type; + +public class DeviceConfigurationCreateDialog extends DataEntryDialog { + + public static class DuplicationValidator implements Validator { + + private List allMatchers; + + public DuplicationValidator(List allMatchers) { + this.allMatchers = allMatchers; + } + + @Override + public String getErrorMessage(DeviceConfigurationMatcherDTO valueToValidate) { + for (DeviceConfigurationMatcherDTO existingMatcher : allMatchers) { + if (existingMatcher.type.equals(valueToValidate.type)) { + switch (valueToValidate.type) { + case SINGLE: + if (existingMatcher.clients.containsAll(valueToValidate.clients)) { + return "There is already a configuration for such a matcher."; + } + break; + case MULTI: + if (existingMatcher.clients.containsAll(valueToValidate.clients) && + valueToValidate.clients.containsAll(existingMatcher.clients)) { + return "There is already a configuration for such a matcher."; + } + break; + case ANY: + return "There is already a configuration matching all devices."; + default: + break; + } + } + } + return null; + } + + } + + private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class); + private ListBox typeBox; + private List devicesBoxes; + + public DeviceConfigurationCreateDialog(StringMessages stringMessages, + Validator validator, + com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback callback) { + super("Create Device Configuration", "Specify for which devices the new configuration should apply", + "Create", stringMessages.cancel(), validator, callback); + this.devicesBoxes = new ArrayList(); + } + + @Override + protected Widget getAdditionalWidget() { + final Grid valueGrid = new Grid(2, 2); + + valueGrid.setWidget(0, 0, createLabel("Matcher type")); + typeBox = createListBox(false); + typeBox.addItem(DeviceConfigurationMatcherDTO.Type.SINGLE.name()); + typeBox.addItem(DeviceConfigurationMatcherDTO.Type.MULTI.name()); + typeBox.addItem(DeviceConfigurationMatcherDTO.Type.ANY.name()); + valueGrid.setWidget(0, 1, typeBox); + valueGrid.setWidget(1, 0, createLabel("Matching devices")); + + final Grid devicesGrid = new Grid(2, 2); + TextBox firstDeviceBox = createTextBox(""); + devicesGrid.setWidget(0, 0, firstDeviceBox); + devicesBoxes.add(firstDeviceBox); + + final Button addDeviceButton = new Button("Add Device"); + addDeviceButton.setVisible(false); + addDeviceButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + devicesGrid.insertRow(0); + TextBox deviceBox = createTextBox(""); + devicesBoxes.add(deviceBox); + devicesGrid.setWidget(0, 0, deviceBox); + devicesGrid.setWidget(0, 1, createRemoveButton(devicesGrid)); + } + }); + devicesGrid.setWidget(1, 0, addDeviceButton); + valueGrid.setWidget(1, 1, devicesGrid); + + typeBox.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + Type type = DeviceConfigurationMatcherDTO.Type.valueOf(typeBox.getValue(typeBox.getSelectedIndex())); + switch (type) { + case SINGLE: + valueGrid.getWidget(1, 0).setVisible(true); + valueGrid.getWidget(1, 1).setVisible(true); + devicesGrid.getWidget(0, 0).setVisible(true); + devicesGrid.getWidget(1, 0).setVisible(false); + for (int i = 0; i < devicesGrid.getRowCount() - 2; i++) { + devicesGrid.getWidget(i, 0).setVisible(false); + devicesGrid.getWidget(i, 1).setVisible(false); + } + break; + case MULTI: + valueGrid.getWidget(1, 0).setVisible(true); + valueGrid.getWidget(1, 1).setVisible(true); + devicesGrid.getWidget(0, 0).setVisible(true); + devicesGrid.getWidget(1, 0).setVisible(true); + for (int i = 0; i < devicesGrid.getRowCount() - 2; i++) { + devicesGrid.getWidget(i, 0).setVisible(true); + devicesGrid.getWidget(i, 1).setVisible(true); + } + break; + default: + valueGrid.getWidget(1, 0).setVisible(false); + valueGrid.getWidget(1, 1).setVisible(false); + break; + } + } + }); + + return valueGrid; + } + + @Override + protected DeviceConfigurationMatcherDTO getResult() { + DeviceConfigurationMatcherDTO dto = new DeviceConfigurationMatcherDTO(); + dto.type = DeviceConfigurationMatcherDTO.Type.valueOf(typeBox.getValue(typeBox.getSelectedIndex())); + switch (dto.type) { + case SINGLE: + dto.clients = Arrays.asList(devicesBoxes.get(0).getText()); + break; + case MULTI: + dto.clients = new ArrayList(); + for (TextBox textBox : devicesBoxes) { + dto.clients.add(textBox.getText()); + } + break; + default: + dto.clients = Collections.emptyList(); + break; + } + return dto; + } + + private PushButton createRemoveButton(final Grid devicesGrid) { + PushButton removeButton = new PushButton(new Image(resources.removeIcon())); + removeButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + int rowToBeRemoved = devicesGrid.getCellForEvent(event).getRowIndex(); + devicesBoxes.remove(devicesGrid.getWidget(rowToBeRemoved, 0)); + devicesGrid.removeRow(rowToBeRemoved); + } + }); + return removeButton; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java new file mode 100644 index 00000000000..a169b346c94 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java @@ -0,0 +1,197 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.Arrays; + +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ChangeHandler; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.KeyUpEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.CaptionPanel; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.sap.sailing.gwt.ui.client.ErrorReporter; +import com.sap.sailing.gwt.ui.client.SailingServiceAsync; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO; + +public class DeviceConfigurationDetailComposite extends Composite { + + private final SailingServiceAsync sailingService; + private final ErrorReporter errorReporter; + + private CaptionPanel captionPanel; + private Grid mainGrid; + private Button updateButton; + + private DeviceConfigurationMatcherDTO matcher; + private DeviceConfigurationDTO configuration; + + private TextBox allowedCourseAreasBox; + private TextBox minRoundsBox; + private TextBox maxRoundsBox; + private TextBox mailRecipientBox; + + public DeviceConfigurationDetailComposite(final SailingServiceAsync sailingService, final ErrorReporter errorReporter, StringMessages stringMessages) { + this.sailingService = sailingService; + this.errorReporter = errorReporter; + + this.matcher = null; + this.configuration = null; + + captionPanel = new CaptionPanel("Configuration"); + VerticalPanel verticalPanel = new VerticalPanel(); + mainGrid = new Grid(4, 2); + updateButton = new Button("Update"); + updateButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + updateConfiguration(sailingService, errorReporter); + } + }); + + verticalPanel.add(mainGrid); + verticalPanel.add(updateButton); + captionPanel.add(verticalPanel); + initWidget(captionPanel); + } + + public void setConfiguration(final DeviceConfigurationMatcherDTO matcher) { + if (matcher == null) { + clearUi(); + } else { + sailingService.getDeviceConfiguration(matcher, new AsyncCallback() { + @Override + public void onSuccess(DeviceConfigurationDTO result) { + setupUi(matcher, result); + } + + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError(caught.getMessage()); + } + }); + } + } + + private void markAsDrity(boolean dirty) { + if (dirty) { + captionPanel.setCaptionText("Configuration*"); + } else { + captionPanel.setCaptionText("Configuration"); + } + } + + private void setupUi(DeviceConfigurationMatcherDTO matcher, DeviceConfigurationDTO result) { + clearUi(); + this.matcher = matcher; + this.configuration = result; + + allowedCourseAreasBox = new TextBox(); + allowedCourseAreasBox.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + if (allowedCourseAreasBox.getText().isEmpty()) { + configuration.allowedCourseAreaNames = null; + } else { + configuration.allowedCourseAreaNames = Arrays.asList(allowedCourseAreasBox.getText().split(",")); + } + } + }); + allowedCourseAreasBox.addKeyUpHandler(dirtyMarker); + if (result.allowedCourseAreaNames != null) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < result.allowedCourseAreaNames.size(); i++) { + builder.append(result.allowedCourseAreaNames.get(i)); + builder.append(','); + } + allowedCourseAreasBox.setText(builder.substring(0, builder.length() - 1)); + } + mainGrid.setWidget(0, 0, new Label("Allowed Course Areas")); + mainGrid.setWidget(0, 1, allowedCourseAreasBox); + + minRoundsBox = new TextBox(); + minRoundsBox.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + configuration.minRoundsForCourse = minRoundsBox.getText().isEmpty() ? null : Integer.valueOf(minRoundsBox.getText()); + } + }); + minRoundsBox.addKeyUpHandler(dirtyMarker); + if (result.minRoundsForCourse != null) { + minRoundsBox.setText(result.minRoundsForCourse.toString()); + } + mainGrid.setWidget(1, 0, new Label("Minimum Rounds for Course")); + mainGrid.setWidget(1, 1, minRoundsBox); + + maxRoundsBox = new TextBox(); + maxRoundsBox.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + configuration.maxRoundsForCourse = maxRoundsBox.getText().isEmpty() ? null : Integer.valueOf(maxRoundsBox.getText()); + } + }); + maxRoundsBox.addKeyUpHandler(dirtyMarker); + if (result.maxRoundsForCourse != null) { + maxRoundsBox.setText(result.maxRoundsForCourse.toString()); + } + mainGrid.setWidget(2, 0, new Label("Maximum Rounds for Course")); + mainGrid.setWidget(2, 1, maxRoundsBox); + + mailRecipientBox = new TextBox(); + mailRecipientBox.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent event) { + configuration.resultsMailRecipient = mailRecipientBox.getText().isEmpty() ? null : mailRecipientBox.getText(); + } + }); + mailRecipientBox.addKeyUpHandler(dirtyMarker); + if (result.resultsMailRecipient != null) { + mailRecipientBox.setText(result.resultsMailRecipient); + } + mainGrid.setWidget(3, 0, new Label("Results Mail Recipient")); + mainGrid.setWidget(3, 1, mailRecipientBox); + } + + private void clearUi() { + this.matcher = null; + this.configuration = null; + mainGrid.clear(); + } + + private void updateConfiguration(final SailingServiceAsync sailingService, final ErrorReporter errorReporter) { + if (matcher == null || configuration == null) { + errorReporter.reportError("Invalid state."); + return; + } + sailingService.addDeviceConfiguration(matcher.type, matcher.clients, + configuration.allowedCourseAreaNames, configuration.minRoundsForCourse, + configuration.maxRoundsForCourse, configuration.resultsMailRecipient, + new AsyncCallback() { + @Override + public void onSuccess(DeviceConfigurationMatcherDTO matcher) { + markAsDrity(false); + } + + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError(caught.getMessage()); + } + }); + } + + private KeyUpHandler dirtyMarker = new KeyUpHandler() { + @Override + public void onKeyUp(KeyUpEvent event) { + markAsDrity(true); + } + }; + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java new file mode 100644 index 00000000000..aaccf6c10f0 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java @@ -0,0 +1,162 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.cellview.client.CellTable; +import com.google.gwt.user.cellview.client.ColumnSortEvent; +import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; +import com.google.gwt.user.cellview.client.TextColumn; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.view.client.ListDataProvider; +import com.google.gwt.view.client.MultiSelectionModel; +import com.google.gwt.view.client.SelectionChangeEvent; +import com.google.gwt.view.client.SelectionModel; +import com.sap.sailing.gwt.ui.client.ErrorReporter; +import com.sap.sailing.gwt.ui.client.SailingServiceAsync; +import com.sap.sailing.gwt.ui.client.SelectionProvider; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO; + +public class DeviceConfigurationListComposite extends Composite { + + private final SelectionModel configurationSelectionModel; + private final CellTable configurationTable; + private ListDataProvider configurationsDataProvider; + + + private final SimplePanel mainPanel; + private final VerticalPanel panel; + + private final Label noConfigurationsLabel; + + private final SailingServiceAsync sailingService; + private final ErrorReporter errorReporter; + private final StringMessages stringMessages; + + private static AdminConsoleTableResources tableResource = GWT.create(AdminConsoleTableResources.class); + + public DeviceConfigurationListComposite(final SailingServiceAsync sailingService, + final SelectionProvider selectionProvider, + final ErrorReporter errorReporter, final StringMessages stringMessages) { + this.sailingService = sailingService; + this.errorReporter = errorReporter; + this.stringMessages = stringMessages; + + mainPanel = new SimplePanel(); + panel = new VerticalPanel(); + mainPanel.setWidget(panel); + + noConfigurationsLabel = new Label("There are no configurations."); + noConfigurationsLabel.setWordWrap(false); + panel.add(noConfigurationsLabel); + + configurationsDataProvider = new ListDataProvider(); + refreshTable(); + + configurationTable = createConfigurationTable(); + configurationTable.setVisible(true); + + configurationSelectionModel = new MultiSelectionModel(); + configurationSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { + @SuppressWarnings("unchecked") + @Override + public void onSelectionChange(SelectionChangeEvent event) { + selectionProvider.setSelection(getSelectedConfigurations()); + } + }); + configurationTable.setSelectionModel(configurationSelectionModel); + panel.add(configurationTable); + + initWidget(mainPanel); + } + + public void refreshTable() { + sailingService.getDeviceConfigurationMatchers(new AsyncCallback>() { + + @Override + public void onSuccess(List result) { + if (configurationsDataProvider.getList().isEmpty()) { + configurationTable.getColumnSortList().clear(); + configurationTable.getColumnSortList().push(configurationTable.getColumn(0)); + } + configurationsDataProvider.getList().clear(); + configurationsDataProvider.getList().addAll(result); + ColumnSortEvent.fire(configurationTable, configurationTable.getColumnSortList()); + + noConfigurationsLabel.setVisible(false); + } + + @Override + public void onFailure(Throwable caught) { + noConfigurationsLabel.setText("Error retrieving configuration data from server."); + noConfigurationsLabel.setVisible(true); + configurationTable.setVisible(false); + errorReporter.reportError("Error retrieving configuration data from server: " + caught.getMessage()); + } + }); + } + + private CellTable createConfigurationTable() { + CellTable table = new CellTable( + /* pageSize */10000, tableResource); + configurationsDataProvider.addDataDisplay(table); + table.setWidth("100%"); + + ListHandler columnSortHandler = + new ListHandler(configurationsDataProvider.getList()); + table.addColumnSortHandler(columnSortHandler); + + TextColumn identifierTypeColumn = + new TextColumn() { + @Override + public String getValue(DeviceConfigurationMatcherDTO identifier) { + return identifier.type.name(); + } + }; + identifierTypeColumn.setSortable(true); + columnSortHandler.setComparator(identifierTypeColumn, new Comparator() { + @Override + public int compare(DeviceConfigurationMatcherDTO r1, DeviceConfigurationMatcherDTO r2) { + return new Integer(r1.rank).compareTo(r2.rank); + } + }); + + TextColumn identifierNameColumn = + new TextColumn() { + @Override + public String getValue(DeviceConfigurationMatcherDTO identifier) { + return identifier.clients.toString(); + } + }; + identifierNameColumn.setSortable(true); + columnSortHandler.setComparator(identifierNameColumn, new Comparator() { + @Override + public int compare(DeviceConfigurationMatcherDTO r1, DeviceConfigurationMatcherDTO r2) { + return r1.toString().compareTo(r2.toString()); + } + }); + + table.addColumn(identifierTypeColumn, "Matcher"); + table.addColumn(identifierNameColumn, "Device"); + return table; + } + + private List getSelectedConfigurations() { + List result = new ArrayList(); + if (configurationsDataProvider != null) { + for (DeviceConfigurationMatcherDTO regatta : configurationsDataProvider.getList()) { + if (configurationSelectionModel.isSelected(regatta)) { + result.add(regatta); + } + } + } + return result; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java new file mode 100644 index 00000000000..e5dddad69dd --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java @@ -0,0 +1,166 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.Arrays; +import java.util.List; + +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback; +import com.sap.sailing.gwt.ui.client.DataEntryDialog.Validator; +import com.sap.sailing.gwt.ui.client.ErrorReporter; +import com.sap.sailing.gwt.ui.client.SailingServiceAsync; +import com.sap.sailing.gwt.ui.client.SelectionChangeListener; +import com.sap.sailing.gwt.ui.client.SelectionProvider; +import com.sap.sailing.gwt.ui.client.SelectionProviderImpl; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO; + +public class DeviceConfigurationPanel extends SimplePanel implements SelectionChangeListener { + + private final SailingServiceAsync sailingService; + private final StringMessages stringMessages; + private final ErrorReporter errorReporter; + + private Button addConfigurationButton; + private Button removeConfigurationButton; + private DeviceConfigurationListComposite listComposite; + private DeviceConfigurationDetailComposite detailComposite; + + private final SelectionProvider selectionProvider; + + public DeviceConfigurationPanel(SailingServiceAsync sailingService, StringMessages stringMessages, ErrorReporter reporter) { + this.sailingService = sailingService; + this.stringMessages = stringMessages; + this.errorReporter = reporter; + + this.selectionProvider = new SelectionProviderImpl(true); + this.selectionProvider.addSelectionChangeListener(this); + + setupUi(); + } + + private void setupUi() { + VerticalPanel mainPanel = new VerticalPanel(); + setWidget(mainPanel); + mainPanel.setWidth("100%"); + setupControlPanel(mainPanel); + setupConfigurationPanels(mainPanel); + } + + private void setupControlPanel(VerticalPanel mainPanel) { + HorizontalPanel deviceManagementControlPanel = new HorizontalPanel(); + deviceManagementControlPanel.setSpacing(5); + addConfigurationButton = new Button("Add Configuration"); + addConfigurationButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + addConfiguration(); + } + }); + deviceManagementControlPanel.add(addConfigurationButton); + + removeConfigurationButton = new Button(stringMessages.remove()); + removeConfigurationButton.setEnabled(false); + removeConfigurationButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + removeConfiguration(); + } + }); + deviceManagementControlPanel.add(removeConfigurationButton); + mainPanel.add(deviceManagementControlPanel); + } + + private void setupConfigurationPanels(VerticalPanel mainPanel) { + Grid grid = new Grid(1 ,2); + mainPanel.add(grid); + + listComposite = new DeviceConfigurationListComposite(sailingService, selectionProvider, + errorReporter, stringMessages); + grid.setWidget(0, 0, listComposite); + grid.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_TOP); + grid.getColumnFormatter().getElement(1).getStyle().setPaddingTop(2.0, Unit.EM); + + detailComposite = new DeviceConfigurationDetailComposite(sailingService, errorReporter, stringMessages); + detailComposite.setVisible(false); + grid.setWidget(0, 1, detailComposite); + } + + @Override + public void onSelectionChange(List selectedConfigurations) { + if (selectedConfigurations.size() == 1 && selectedConfigurations.iterator().hasNext()) { + detailComposite.setConfiguration(selectedConfigurations.iterator().next()); + detailComposite.setVisible(true); + } else { + detailComposite.setConfiguration(null); + detailComposite.setVisible(false); + } + removeConfigurationButton.setEnabled(!selectedConfigurations.isEmpty()); + } + + private void addConfiguration() { + sailingService.getDeviceConfigurationMatchers(new AsyncCallback>() { + @Override + public void onSuccess(List allMatchers) { + DeviceConfigurationCreateDialog dialog = new DeviceConfigurationCreateDialog( + stringMessages, + new DeviceConfigurationCreateDialog.DuplicationValidator(allMatchers), + new DialogCallback() { + @Override + public void ok(DeviceConfigurationMatcherDTO createdMatcher) { + sailingService.addDeviceConfiguration(createdMatcher.type, createdMatcher.clients, + null, null, null, null, new AsyncCallback() { + @Override + public void onSuccess(DeviceConfigurationMatcherDTO matcher) { + listComposite.refreshTable(); + onSelectionChange(Arrays.asList(matcher)); + } + + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError(caught.getMessage()); + } + }); + } + + @Override + public void cancel() { } + }); + dialog.show(); + } + + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError(caught.getMessage()); + } + }); + } + + private void removeConfiguration() { + detailComposite.setConfiguration(null); + detailComposite.setVisible(false); + for (DeviceConfigurationMatcherDTO identifier : selectionProvider.getSelectedItems()) { + sailingService.removeDeviceConfiguration(identifier.type, identifier.clients, new AsyncCallback() { + @Override + public void onSuccess(Boolean result) { + listComposite.refreshTable(); + } + + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError(caught.getMessage()); + } + }); + } + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 6a2d7dc78af..0e7a4fd382a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -36,6 +36,9 @@ import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO; import com.sap.sailing.gwt.ui.shared.ControlPointDTO; import com.sap.sailing.gwt.ui.shared.CourseAreaDTO; import com.sap.sailing.gwt.ui.shared.CoursePositionsDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO.Type; import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.GPSFixDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; @@ -328,4 +331,12 @@ public interface SailingService extends RemoteService { void reloadRaceLog(String selectedLeaderboardName, RaceColumnDTO raceColumnDTO, FleetDTO fleet); MasterDataImportObjectCreationCount importMasterData(String host, String[] groupNames, boolean override); + + List getDeviceConfigurationMatchers(); + + DeviceConfigurationDTO getDeviceConfiguration(DeviceConfigurationMatcherDTO matcher); + + DeviceConfigurationMatcherDTO addDeviceConfiguration(Type type, List clientIds, List allowedCourseAreaNames, Integer minRounds, Integer maxRounds, String mailRecipient); + + boolean removeDeviceConfiguration(Type type, List clientIds); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index d58579a2bb2..61d77f6290e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -36,6 +36,9 @@ import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO; import com.sap.sailing.gwt.ui.shared.ControlPointDTO; import com.sap.sailing.gwt.ui.shared.CourseAreaDTO; import com.sap.sailing.gwt.ui.shared.CoursePositionsDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO.Type; import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.GPSFixDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; @@ -450,6 +453,14 @@ public interface SailingServiceAsync { void importMasterData(String host, String[] names, boolean override, AsyncCallback asyncCallback); + + void getDeviceConfigurationMatchers(AsyncCallback> asyncCallback); + + void getDeviceConfiguration(DeviceConfigurationMatcherDTO matcher, AsyncCallback callback); + + void addDeviceConfiguration(Type type, List clientIds, List allowedCourseAreaNames, Integer minRounds, Integer maxRounds, String mailRecipient, AsyncCallback callback); + + void removeDeviceConfiguration(Type type, List clientIds, AsyncCallback asyncCallback); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionChangeListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionChangeListener.java new file mode 100644 index 00000000000..4ad12c87def --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionChangeListener.java @@ -0,0 +1,19 @@ +package com.sap.sailing.gwt.ui.client; + +import java.util.List; + +/** + * Allows UI components to observe a selector, such as a drop-down box showing a list of items. + * + * + */ +public interface SelectionChangeListener { + + /** + * The first element is the first one selected + * + * @param selectedItems a non-null list which is empty if nothing is selected + */ + void onSelectionChange(List selectedItems); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionProvider.java new file mode 100644 index 00000000000..baaefdcebcb --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionProvider.java @@ -0,0 +1,25 @@ +package com.sap.sailing.gwt.ui.client; + +import java.util.List; + +public interface SelectionProvider { + /** + * @return a non-null list which may be empty + */ + List getSelectedItems(); + + void addSelectionChangeListener(SelectionChangeListener listener); + + void removeSelectionChangeListener(SelectionChangeListener listener); + + void setSelection(List newSelection, SelectionChangeListener... listenersNotToNotify); + + boolean hasMultiSelection(); + + /** + * @return a non-null list which may be empty + */ + List getAllItems(); + + void setAllItems(List newAllItems, SelectionChangeListener... listenersNotToNotify); +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionProviderImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionProviderImpl.java new file mode 100644 index 00000000000..7a6b26b23ff --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SelectionProviderImpl.java @@ -0,0 +1,92 @@ +package com.sap.sailing.gwt.ui.client; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +public class SelectionProviderImpl implements SelectionProvider { + private final List selection; + + private final List allItems; + + private final Set> listeners; + + private final boolean hasMultiSelection; + + public SelectionProviderImpl(boolean hasMultiSelection) { + this.hasMultiSelection = hasMultiSelection; + this.selection = new ArrayList(); + this.allItems = new ArrayList(); + listeners = new HashSet>(); + } + + @Override + public List getSelectedItems() { + return Collections.unmodifiableList(selection); + } + + @Override + public void addSelectionChangeListener(SelectionChangeListener listener) { + listeners.add(listener); + } + + @Override + public void removeSelectionChangeListener(SelectionChangeListener listener) { + listeners.remove(listener); + } + + @Override + public void setSelection(List newSelection, SelectionChangeListener... listenersNotToNotify) { + boolean notify = !selection.equals(newSelection); + selection.clear(); + selection.addAll(newSelection); + if (notify) { + notifyListeners(listenersNotToNotify); + } + } + + private void notifyListeners(SelectionChangeListener[] listenersNotToNotify) { + List selectedRegattas = getSelectedItems(); + for (SelectionChangeListener listener : listeners) { + if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) { + listener.onSelectionChange(selectedRegattas); + } + } + } + + /** + * Sets the universe of all items from which this selection model may select. An equal list will subsequently be + * returned by {@link #getAllItems()}. Items from the {@link #getSelectedItems() selection} not in + * newAllItems are removed from the selection. If this happens, the selection listeners are notified. + */ + @Override + public void setAllItems(List newAllItems, SelectionChangeListener... listenersNotToNotify) { + allItems.clear(); + for (T r : newAllItems) { + allItems.add(r); + } + for (Iterator i = selection.iterator(); i.hasNext(); ) { + T selectedRegatta = i.next(); + if (!allItems.contains(selectedRegatta)) { + i.remove(); + } + } + // when setting all items, the underlying items will usually have changed their identity and maybe also their state; + // so notifying the selection listeners is necessary anyhow + notifyListeners(listenersNotToNotify); + } + + @Override + public List getAllItems() { + return Collections.unmodifiableList(allItems); + } + + @Override + public boolean hasMultiSelection() { + return hasMultiSelection; + } +} 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 cca7fe5ce2a..f79cc4475a9 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 @@ -66,6 +66,12 @@ import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherMulti; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.KnotSpeedImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; @@ -197,6 +203,9 @@ import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO; import com.sap.sailing.gwt.ui.shared.ControlPointDTO; import com.sap.sailing.gwt.ui.shared.CourseAreaDTO; import com.sap.sailing.gwt.ui.shared.CoursePositionsDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO; +import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO.Type; import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.GPSFixDTO; import com.sap.sailing.gwt.ui.shared.GateDTO; @@ -3327,4 +3336,93 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } } + @Override + public List getDeviceConfigurationMatchers() { + List configs = new ArrayList(); + for (Entry entry : + getService().getAllDeviceConfigurations().entrySet()) { + DeviceConfigurationMatcher matcher = entry.getKey(); + configs.add(convertToDeviceConfigurationMatcherDTO(matcher)); + } + return configs; + } + + @Override + public DeviceConfigurationDTO getDeviceConfiguration(DeviceConfigurationMatcherDTO matcherDto) { + DeviceConfigurationMatcher matcher = convertToDeviceConfigurationMatcher(matcherDto.type, matcherDto.clients); + DeviceConfiguration configuration = getService().getAllDeviceConfigurations().get(matcher); + if (configuration == null) { + return null; + } else { + return convertToDeviceConfigurationDTO(configuration); + } + } + + @Override + public DeviceConfigurationMatcherDTO addDeviceConfiguration(Type type, List clientIds, List allowedCourseAreaNames, Integer minRounds, Integer maxRounds, String mailRecipient) { + DeviceConfigurationMatcher matcher = convertToDeviceConfigurationMatcher(type, clientIds); + DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); + configuration.setAllowedCourseAreaNames(allowedCourseAreaNames); + configuration.setMinimumRoundsForCourse(minRounds); + configuration.setMaximumRoundsForCourse(maxRounds); + configuration.setResultsMailRecipient(mailRecipient); + getService().addDeviceConfiguration(matcher, configuration); + return convertToDeviceConfigurationMatcherDTO(matcher); + } + + @Override + public boolean removeDeviceConfiguration(Type type, List clientIds) { + DeviceConfigurationMatcher matcher = convertToDeviceConfigurationMatcher(type, clientIds); + getService().removeDeviceConfiguration(matcher); + return true; + } + + private DeviceConfigurationMatcherDTO convertToDeviceConfigurationMatcherDTO(DeviceConfigurationMatcher matcher) { + List clients = new ArrayList(); + DeviceConfigurationMatcherDTO.Type type = Type.UNKNOWN; + + if (matcher instanceof DeviceConfigurationMatcherSingle) { + type = Type.SINGLE; + clients.add(((DeviceConfigurationMatcherSingle)matcher).getClientIdentifier()); + } else if (matcher instanceof DeviceConfigurationMatcherMulti) { + type = Type.MULTI; + clients.addAll(((DeviceConfigurationMatcherMulti)matcher).getClientIdentifiers()); + } else if (matcher instanceof DeviceConfigurationMatcherAny) { + type = Type.ANY; + } + + DeviceConfigurationMatcherDTO dto = new DeviceConfigurationMatcherDTO( + type, + clients, + matcher.getMatchingRank()); + return dto; + } + + private DeviceConfigurationMatcher convertToDeviceConfigurationMatcher(Type type, List clientIds) { + DeviceConfigurationMatcher matcher = null; + switch (type) { + case SINGLE: + matcher = new DeviceConfigurationMatcherSingle(clientIds.get(0)); + break; + case MULTI: + matcher = new DeviceConfigurationMatcherMulti(clientIds); + break; + case ANY: + matcher = DeviceConfigurationMatcherAny.INSTANCE; + break; + default: + break; + } + return matcher; + } + + private DeviceConfigurationDTO convertToDeviceConfigurationDTO(DeviceConfiguration configuration) { + DeviceConfigurationDTO dto = new DeviceConfigurationDTO(); + dto.allowedCourseAreaNames = configuration.getAllowedCourseAreaNames(); + dto.minRoundsForCourse = configuration.getMinimumRoundsForCourse(); + dto.maxRoundsForCourse = configuration.getMaximumRoundsForCourse(); + dto.resultsMailRecipient = configuration.getResultsMailRecipient(); + return dto; + } + } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationDTO.java new file mode 100644 index 00000000000..6193c0e27b6 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationDTO.java @@ -0,0 +1,14 @@ +package com.sap.sailing.gwt.ui.shared; + +import java.util.List; + +import com.google.gwt.user.client.rpc.IsSerializable; + +public class DeviceConfigurationDTO implements IsSerializable { + + public List allowedCourseAreaNames; + public Integer minRoundsForCourse; + public Integer maxRoundsForCourse; + public String resultsMailRecipient; + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationMatcherDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationMatcherDTO.java new file mode 100644 index 00000000000..a8ed47c2e0b --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationMatcherDTO.java @@ -0,0 +1,30 @@ +package com.sap.sailing.gwt.ui.shared; + +import java.util.List; + +import com.google.gwt.user.client.rpc.IsSerializable; + +public class DeviceConfigurationMatcherDTO implements IsSerializable { + + public enum Type { + UNKNOWN, + SINGLE, + MULTI, + ANY + } + + public List clients; + public Type type; + public int rank; + + public DeviceConfigurationMatcherDTO() { + + } + + public DeviceConfigurationMatcherDTO(Type type, List clients, int rank) { + this.clients = clients; + this.type = type; + this.rank = rank; + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/DeviceConfigurationJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/DeviceConfigurationJsonDeserializer.java index 8fa26d106e2..1f21e1957af 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/DeviceConfigurationJsonDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/DeviceConfigurationJsonDeserializer.java @@ -6,8 +6,8 @@ import java.util.List; import org.json.simple.JSONArray; import org.json.simple.JSONObject; -import com.sap.sailing.domain.base.DeviceConfiguration; -import com.sap.sailing.domain.base.impl.DeviceConfigurationImpl; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.impl.DeviceConfigurationJsonSerializer; diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/DeviceConfigurationJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/DeviceConfigurationJsonSerializer.java index 242bfd1a2ad..f978564be06 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/DeviceConfigurationJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/DeviceConfigurationJsonSerializer.java @@ -3,7 +3,7 @@ package com.sap.sailing.server.gateway.serialization.impl; import org.json.simple.JSONArray; import org.json.simple.JSONObject; -import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.server.gateway.serialization.JsonSerializer; public class DeviceConfigurationJsonSerializer implements JsonSerializer { diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java index 4c40c6f348e..3a07b84e60e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ConfigurationJsonGetServlet.java @@ -9,9 +9,9 @@ import javax.servlet.http.HttpServletResponse; import org.json.simple.JSONObject; -import com.sap.sailing.domain.base.DeviceConfiguration; -import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; -import com.sap.sailing.domain.base.impl.DeviceConfigurationIdentifierImpl; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationIdentifierImpl; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.DeviceConfigurationJsonSerializer; @@ -37,10 +37,13 @@ public class ConfigurationJsonGetServlet extends AbstractJsonHttpServlet { logger.fine(String.format("Configuration requested by client %s.", identifier)); DeviceConfiguration configuration = getService().getDeviceConfiguration(identifier); - - JsonSerializer serializer = new DeviceConfigurationJsonSerializer(); - JSONObject json = serializer.serialize(configuration); - json.writeJSONString(response.getWriter()); + if (configuration != null) { + JsonSerializer serializer = new DeviceConfigurationJsonSerializer(); + JSONObject json = serializer.serialize(configuration); + json.writeJSONString(response.getWriter()); + } else { + response.sendError(HttpServletResponse.SC_NOT_FOUND, "No configuration for given identifier."); + } } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java index 134bfe4d296..f29c4c030e1 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java @@ -26,8 +26,9 @@ import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.RegattaRegistry; import com.sap.sailing.domain.base.Series; -import com.sap.sailing.domain.base.DeviceConfiguration; -import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.common.RaceFetcher; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaFetcher; @@ -555,10 +556,29 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch void setPersistentRegattaForRaceIDs(Regatta regatta, Iterable raceIdStrings, boolean override); /** - * Returns a tablet's configuration. + * Returns a mobile device's configuration. * @param identifier of the client (may include event) * @return the {@link DeviceConfiguration} */ DeviceConfiguration getDeviceConfiguration(DeviceConfigurationIdentifier identifier); + + /** + * Adds a device configuration. + * @param matcher defining for which the configuration applies. + * @param configuration of the device. + */ + void addDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration); + + /** + * Removes a configuration by its matching object. + * @param matcher + */ + void removeDeviceConfiguration(DeviceConfigurationMatcher matcher); + + /** + * Returns all configurations and their matching objects. + * @return the {@link DeviceConfiguration}s. + */ + Map getAllDeviceConfigurations(); } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 1ab708b0c8f..d5c01c60841 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -34,8 +34,6 @@ import java.util.logging.Logger; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.CourseArea; -import com.sap.sailing.domain.base.DeviceConfiguration; -import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; @@ -47,7 +45,14 @@ import com.sap.sailing.domain.base.RegattaListener; import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.base.Waypoint; -import com.sap.sailing.domain.base.impl.DeviceConfigurationImpl; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMapImpl; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherMulti; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle; import com.sap.sailing.domain.base.impl.EventImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.common.LeaderboardNameConstants; @@ -191,7 +196,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen /** * Leaderboards managed by this racing event service - */ + */ private final ConcurrentHashMap leaderboardsByName; private final ConcurrentHashMap leaderboardGroupsByName; @@ -229,6 +234,8 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen private final MediaDB mediaDB; private final MediaLibrary mediaLibrary; + + protected final DeviceConfigurationMapImpl configurationMap; public RacingEventServiceImpl() { this(MongoFactory.INSTANCE.getDefaultDomainObjectFactory(), MongoFactory.INSTANCE @@ -272,6 +279,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen this.raceLogScoringReplicator = new RaceLogScoringReplicator(this); this.mediaDB = mediaDb; this.mediaLibrary = new MediaLibrary(); + this.configurationMap = new DeviceConfigurationMapImpl(); // Add one default leaderboard that aggregates all races currently tracked by this service. // This is more for debugging purposes than for anything else. @@ -282,6 +290,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen loadRaceIDToRegattaAssociations(); loadStoredLeaderboardsAndGroups(); loadMediaLibary(); + loadStoredDeviceConfigurations(); } public RacingEventServiceImpl(MongoDBService mongoDBService) { @@ -347,6 +356,30 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen mediaTrackAdded(mediaTrack); } } + + private void loadStoredDeviceConfigurations() { + DeviceConfigurationMatcher anyMatcher = DeviceConfigurationMatcherAny.INSTANCE; + DeviceConfigurationImpl configuration1 = new DeviceConfigurationImpl(); + configuration1.setAllowedCourseAreaNames(Arrays.asList("Alpha", "Beta", "Stadium")); + configuration1.setMaximumRoundsForCourse(3); + configuration1.setResultsMailRecipient("lukas.niemeier@sap.com"); + + DeviceConfigurationMatcher multiIdentifier = new DeviceConfigurationMatcherMulti(Arrays.asList("2", "3")); + DeviceConfigurationImpl configuration2 = new DeviceConfigurationImpl(); + configuration2.setAllowedCourseAreaNames(Arrays.asList("GAMMA")); + configuration2.setMaximumRoundsForCourse(3); + + DeviceConfigurationMatcher identifier = new DeviceConfigurationMatcherSingle("3"); + DeviceConfigurationImpl configuration3 = new DeviceConfigurationImpl(); + configuration3.setAllowedCourseAreaNames(Arrays.asList("Timo")); + configuration3.setMaximumRoundsForCourse(1); + + synchronized (configurationMap) { + configurationMap.put(anyMatcher, configuration1); + configurationMap.put(identifier, configuration3); + configurationMap.put(multiIdentifier, configuration2); + } + } @Override public void addLeaderboard(Leaderboard leaderboard) { @@ -1769,7 +1802,14 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen for (MediaTrack lg : mediaLibrary.allTracks()) { logoutput.append(String.format("%3s\n", lg.toString())); } - + + logger.info("Serializing configuration map..."); + oos.writeObject(configurationMap); + logoutput.append("Serialized " + configurationMap.size() + " configuration entries\n"); + for (DeviceConfigurationMatcher matcher : configurationMap.keySet()) { + logoutput.append(String.format("%3s\n", matcher.toString())); + } + logger.info(logoutput.toString()); } @@ -1851,6 +1891,12 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen for (MediaTrack mediatrack : mediaLibrary.allTracks()) { logoutput.append(String.format("%3s\n", mediatrack.toString())); } + + configurationMap.putAll((DeviceConfigurationMapImpl) ois.readObject()); + logoutput.append("Received " + configurationMap.size() + " NEW configuration entries\n"); + for (DeviceConfigurationMatcher matcher : configurationMap.keySet()) { + logoutput.append(String.format("%3s\n", matcher.toString())); + } logger.info(logoutput.toString()); logger.info("Done with initial replication on " + this); @@ -2098,11 +2144,26 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen @Override public DeviceConfiguration getDeviceConfiguration(DeviceConfigurationIdentifier identifier) { - DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); - configuration.setAllowedCourseAreaNames(Arrays.asList("Alpha", "Beta", "Stadium")); - configuration.setMaximumRoundsForCourse(3); - configuration.setResultsMailRecipient("lukas.niemeier@sap.com"); - return configuration; + return configurationMap.getByMatch(identifier); + } + + @Override + public void addDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) { + synchronized (configurationMap) { + configurationMap.put(matcher, configuration); + } + } + + @Override + public void removeDeviceConfiguration(DeviceConfigurationMatcher matcher) { + synchronized (configurationMap) { + configurationMap.remove(matcher); + } + } + + @Override + public Map getAllDeviceConfigurations() { + return new HashMap(configurationMap); } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java index 09efb191d0a..4eb22f77f07 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java @@ -7,7 +7,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.racecommittee.app.domain.ManagedRace; public interface DataStore { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java index 17a4ba841f3..4b301afe3d6 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.utils.CollectionUtils; 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 4798e682b79..1eec293471d 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 @@ -15,10 +15,10 @@ import android.content.Context; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; -import com.sap.sailing.domain.base.DeviceConfiguration; -import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CourseAreaImpl; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index 3ef500967fd..105d964bef5 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -15,11 +15,11 @@ import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; -import com.sap.sailing.domain.base.DeviceConfiguration; -import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.SharedDomainFactory; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.handlers.CompetitorsDataHandler; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java index f26bcbabb8d..b3d08039945 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/ReadonlyDataManager.java @@ -9,10 +9,10 @@ import android.app.LoaderManager.LoaderCallbacks; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; -import com.sap.sailing.domain.base.DeviceConfiguration; -import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; import com.sap.sailing.racecommittee.app.domain.ManagedRace; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DeviceConfigurationDataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DeviceConfigurationDataHandler.java index e51da1085fb..0d189ba0a4f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DeviceConfigurationDataHandler.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DeviceConfigurationDataHandler.java @@ -1,6 +1,6 @@ package com.sap.sailing.racecommittee.app.data.handlers; -import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.racecommittee.app.data.OnlineDataManager; public class DeviceConfigurationDataHandler extends DataHandler { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/DeviceConfigurationParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/DeviceConfigurationParser.java index 11c42cc0318..d910f50b972 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/DeviceConfigurationParser.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/DeviceConfigurationParser.java @@ -5,7 +5,7 @@ import java.io.Reader; import org.json.simple.JSONObject; import org.json.simple.JSONValue; -import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.Helpers; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java index e5b2bd39c00..450822814d6 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java @@ -11,10 +11,10 @@ import android.view.Window; import android.widget.Toast; import com.sap.sailing.domain.base.CourseArea; -import com.sap.sailing.domain.base.DeviceConfiguration; -import com.sap.sailing.domain.base.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.EventBase; -import com.sap.sailing.domain.base.impl.DeviceConfigurationIdentifierImpl; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationIdentifierImpl; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/DeviceConfigurationHelper.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/DeviceConfigurationHelper.java index d24d4f41f82..127114b67e0 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/DeviceConfigurationHelper.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/DeviceConfigurationHelper.java @@ -2,7 +2,7 @@ package com.sap.sailing.racecommittee.app.utils; import android.content.Context; -import com.sap.sailing.domain.base.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.logging.ExLog; From 4418418545060942a16a4af2a9ffd3711d6f7dbf Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Thu, 24 Oct 2013 19:24:24 +0200 Subject: [PATCH 044/450] # added persistence to device configurations --- .../persistence/DomainObjectFactory.java | 5 ++ .../persistence/MongoObjectFactory.java | 6 ++ .../persistence/impl/CollectionNames.java | 7 +- .../impl/DomainObjectFactoryImpl.java | 66 +++++++++++++++++++ .../domain/persistence/impl/FieldNames.java | 5 +- .../impl/MongoObjectFactoryImpl.java | 60 +++++++++++++++++ .../DeviceConfigurationMatcher.java | 24 ++++++- .../DeviceConfigurationIdentifierImpl.java | 5 ++ .../impl/DeviceConfigurationMatcherAny.java | 14 +++- .../impl/DeviceConfigurationMatcherMulti.java | 48 +++++--------- .../DeviceConfigurationMatcherSingle.java | 33 +++------- .../sailing/domain/base/DomainFactory.java | 4 ++ .../domain/base/impl/DomainFactoryImpl.java | 35 ++++++++++ .../DeviceConfigurationDetailComposite.java | 1 + .../gwt/ui/server/SailingServiceImpl.java | 19 ++---- .../server/impl/RacingEventServiceImpl.java | 32 ++------- 16 files changed, 268 insertions(+), 96 deletions(-) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/DomainObjectFactory.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/DomainObjectFactory.java index 5de97fc304e..8384a68d7c6 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/DomainObjectFactory.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/DomainObjectFactory.java @@ -1,12 +1,15 @@ package com.sap.sailing.domain.persistence; import java.util.Map; +import java.util.Map.Entry; import com.mongodb.DBObject; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.RegattaRegistry; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.leaderboard.Leaderboard; @@ -86,4 +89,6 @@ public interface DomainObjectFactory { Map loadRaceIDToRegattaAssociations(RegattaRegistry regattaRegistry); RaceLog loadRaceLog(RaceLogIdentifier identifier); + + Iterable> loadAllDeviceConfigurations(); } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoObjectFactory.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoObjectFactory.java index 5559035221f..57dd1f62e96 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoObjectFactory.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/MongoObjectFactory.java @@ -7,6 +7,8 @@ import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; @@ -86,4 +88,8 @@ public interface MongoObjectFactory { void removeRegattaForRaceID(String raceIDAsString, Regatta regatta); + void storeDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration); + + void removeDeviceConfiguration(DeviceConfigurationMatcher matcher); + } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/CollectionNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/CollectionNames.java index 0ebd6597a1b..efb941be916 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/CollectionNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/CollectionNames.java @@ -51,5 +51,10 @@ public enum CollectionNames { /** * Stores the race log events for a tracked race. */ - RACE_LOGS; + RACE_LOGS, + + /** + * Stores configurations for mobile devices. + */ + CONFIGURATIONS; } 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 5012cdb002a..2b015e765de 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 @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import java.util.logging.Level; @@ -37,6 +38,10 @@ import com.sap.sailing.domain.base.RegattaRegistry; import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Venue; import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher.Type; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl; import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.base.impl.EventImpl; import com.sap.sailing.domain.base.impl.FleetImpl; @@ -1257,4 +1262,65 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { Mark mark = DomainFactory.INSTANCE.getOrCreateMark(markId, markName, markType, markColor, markShape, markPattern); return mark; } + + @Override + public Iterable> loadAllDeviceConfigurations() { + Map result = new HashMap<>(); + DBCollection configurationCollection = database.getCollection(CollectionNames.CONFIGURATIONS.name()); + + try { + for (DBObject dbObject : configurationCollection.find()) { + Pair entry = loadConfigurationEntry(dbObject); + result.put(entry.getA(), entry.getB()); + } + } catch (Exception e) { + logger.log(Level.SEVERE, "Error connecting to MongoDB, unable to load configurations."); + logger.log(Level.SEVERE, "loadAllDeviceConfigurations", e); + } + + return result.entrySet(); + } + + private Pair loadConfigurationEntry(DBObject dbObject) { + DBObject matcherObject = (DBObject) dbObject.get(FieldNames.CONFIGURATION_MATCHER.name()); + DBObject configObject = (DBObject) dbObject.get(FieldNames.CONFIGURATION_CONFIG.name()); + return new Pair(loadConfigurationMatcher(matcherObject), loadConfiguration(configObject)); + } + + private DeviceConfigurationMatcher loadConfigurationMatcher(DBObject matcherObject) { + List clientIdentifiers = new ArrayList(); + BasicDBList clientIdentifiersObject = (BasicDBList) matcherObject.get(FieldNames.CONFIGURATION_MATCHER_CLIENTS.name()); + for (Object clientIdentifier : clientIdentifiersObject) { + clientIdentifiers.add(clientIdentifier.toString()); + } + String type = (String) matcherObject.get(FieldNames.CONFIGURATION_MATCHER_TYPE.name()); + return DomainFactory.INSTANCE.getOrCreateDeviceConfigurationMatcher(Type.valueOf(type), clientIdentifiers); + } + + private DeviceConfiguration loadConfiguration(DBObject configObject) { + DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); + + Object allowedCourseAreaObjects = configObject.get(FieldNames.CONFIGURATION_CONFIG_ALLOWED_COURSE_AREA_NAMES.name()); + if (allowedCourseAreaObjects != null) { + List allowedCourseAreas = new ArrayList(); + for (Object allowedCourseAreaObject : (BasicDBList)allowedCourseAreaObjects) { + allowedCourseAreas.add(allowedCourseAreaObject.toString()); + } + configuration.setAllowedCourseAreaNames(allowedCourseAreas); + } + Object minRounds = configObject.get(FieldNames.CONFIGURATION_CONFIG_MIN_ROUNDS.name()); + if (minRounds != null) { + configuration.setMinimumRoundsForCourse(((Number)minRounds).intValue()); + } + Object maxRounds = configObject.get(FieldNames.CONFIGURATION_CONFIG_MAX_ROUNDS.name()); + if (maxRounds != null) { + configuration.setMaximumRoundsForCourse(((Number)maxRounds).intValue()); + } + Object mail = configObject.get(FieldNames.CONFIGURATION_CONFIG_RESULTS_MAIL.name()); + if (mail != null) { + configuration.setResultsMailRecipient(mail.toString()); + } + + return configuration; + } } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index 1ccaf2b5a3d..78664dd3093 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -73,5 +73,8 @@ public enum FieldNames { RACE_LOG_EVENT_FLAG_DISPLAYED, RACE_LOG_EVENT_START_TIME, RACE_LOG_EVENT_CLASS, RACE_LOG_EVENT_NEXT_STATUS, RACE_LOG_COURSE_DESIGN, WAYPOINT_ID, WAYPOINT_NAME, WAYPOINT_PASSINGSIDE, CONTROLPOINT, CONTROLPOINT_CLASS, MARK_ID, MARK_COLOR, MARK_NAME, MARK_PATTERN, MARK_SHAPE, MARK_TYPE, CONTROLPOINT_VALUE, GATE_ID, GATE_NAME, GATE_LEFT, GATE_RIGHT, RACE_LOG_POSITIONED_COMPETITORS, RACE_LOG_PATHFINDER_ID, RACE_LOG_GATE_LINE_OPENING_TIME, - RACE_LOG_START_PROCEDURE_TYPE, RACE_LOG_PROTEST_START_TIME, RACE_LOG_COURSE_DESIGN_NAME; + RACE_LOG_START_PROCEDURE_TYPE, RACE_LOG_PROTEST_START_TIME, RACE_LOG_COURSE_DESIGN_NAME, + + // configurations + CONFIGURATION_MATCHER, CONFIGURATION_CONFIG, CONFIGURATION_MATCHER_ID, CONFIGURATION_MATCHER_TYPE, CONFIGURATION_MATCHER_CLIENTS, CONFIGURATION_CONFIG_ALLOWED_COURSE_AREA_NAMES, CONFIGURATION_CONFIG_MIN_ROUNDS, CONFIGURATION_CONFIG_MAX_ROUNDS, CONFIGURATION_CONFIG_RESULTS_MAIL; } 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 540da2d9cee..e0eecce108e 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 @@ -27,6 +27,10 @@ import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Timed; import com.sap.sailing.domain.base.Venue; import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherMulti; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.MaxPointsReason; @@ -36,6 +40,7 @@ import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.WindSource; +import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; @@ -855,4 +860,59 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return passing; } + @Override + public void storeDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) { + DBCollection configurationsCollections = database.getCollection(CollectionNames.CONFIGURATIONS.name()); + + DBObject query = new BasicDBObject(); + query.put(FieldNames.CONFIGURATION_MATCHER_ID.name(), matcher.getMatcherIdentifier()); + + DBObject entryObject = new BasicDBObject(); + entryObject.put(FieldNames.CONFIGURATION_MATCHER_ID.name(), matcher.getMatcherIdentifier()); + entryObject.put(FieldNames.CONFIGURATION_MATCHER.name(), storeDeviceConfigurationMatcher(matcher)); + entryObject.put(FieldNames.CONFIGURATION_CONFIG.name(), storeDeviceConfigurationObject(configuration)); + + configurationsCollections.update(query, entryObject, /* upsrt */ true, /* multi */ false); + } + + private DBObject storeDeviceConfigurationMatcher(DeviceConfigurationMatcher matcher) { + DBObject matcherObject = new BasicDBObject(); + matcherObject.put(FieldNames.CONFIGURATION_MATCHER_TYPE.name(), matcher.getMatcherType().name()); + if (matcher instanceof DeviceConfigurationMatcherSingle) { + BasicDBList client = new BasicDBList(); + client.add(((DeviceConfigurationMatcherSingle)matcher).getClientIdentifier()); + matcherObject.put(FieldNames.CONFIGURATION_MATCHER_CLIENTS.name(), client); + } else if (matcher instanceof DeviceConfigurationMatcherMulti) { + BasicDBList clients = new BasicDBList(); + Util.addAll(((DeviceConfigurationMatcherMulti)matcher).getClientIdentifiers(), clients); + matcherObject.put(FieldNames.CONFIGURATION_MATCHER_CLIENTS.name(), clients); + } + return matcherObject; + } + + private DBObject storeDeviceConfigurationObject(DeviceConfiguration configuration) { + DBObject configurationObject = new BasicDBObject(); + if (configuration.getAllowedCourseAreaNames() != null) { + BasicDBList clients = new BasicDBList(); + clients.addAll(configuration.getAllowedCourseAreaNames()); + configurationObject.put(FieldNames.CONFIGURATION_CONFIG_ALLOWED_COURSE_AREA_NAMES.name(), clients); + } + if (configuration.getMinimumRoundsForCourse() != null) { + configurationObject.put(FieldNames.CONFIGURATION_CONFIG_MIN_ROUNDS.name(), configuration.getMinimumRoundsForCourse()); + } + if (configuration.getMaximumRoundsForCourse() != null) { + configurationObject.put(FieldNames.CONFIGURATION_CONFIG_MAX_ROUNDS.name(), configuration.getMaximumRoundsForCourse()); + } + if (configuration.getResultsMailRecipient() != null) { + configurationObject.put(FieldNames.CONFIGURATION_CONFIG_RESULTS_MAIL.name(), configuration.getResultsMailRecipient()); + } + return configurationObject; + } + + @Override + public void removeDeviceConfiguration(DeviceConfigurationMatcher matcher) { + // TODO Auto-generated method stub + + } + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java index d51ba5df2be..d504d5d2a3a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java @@ -3,10 +3,28 @@ package com.sap.sailing.domain.base.configuration; import java.io.Serializable; public interface DeviceConfigurationMatcher extends Serializable { - public final static int RANK_SINGLE = 1; - public final static int RANK_MULTI = 2; - public final static int RANK_ANY = 3; + final static int RANK_SINGLE = 1; + final static int RANK_MULTI = 2; + final static int RANK_ANY = 3; + public enum Type { + SINGLE(RANK_SINGLE), + MULTI(RANK_MULTI), + ANY(RANK_ANY); + + private int matchingRank; + + private Type(int rank) { + this.matchingRank = rank; + } + + public int getRank() { + return matchingRank; + } + } + + Type getMatcherType(); int getMatchingRank(); boolean matches(DeviceConfigurationIdentifier identifier); + Serializable getMatcherIdentifier(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationIdentifierImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationIdentifierImpl.java index eae7ede50ed..3ca6aa1dc99 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationIdentifierImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationIdentifierImpl.java @@ -17,4 +17,9 @@ public class DeviceConfigurationIdentifierImpl implements DeviceConfigurationIde return clientIdentifier; } + @Override + public String toString() { + return "DeviceConfigurationIdentifierImpl [clientIdentifier=" + clientIdentifier + "]"; + } + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java index 400e0cf0574..51c9be5cd77 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.base.configuration.impl; +import java.io.Serializable; + import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -13,9 +15,19 @@ public enum DeviceConfigurationMatcherAny implements DeviceConfigurationMatcher return true; } + @Override + public Type getMatcherType() { + return Type.ANY; + } + @Override public int getMatchingRank() { - return RANK_ANY; + return getMatcherType().getRank(); + } + + @Override + public Serializable getMatcherIdentifier() { + return DeviceConfigurationMatcherAny.class.getSimpleName(); } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java index e6c64cead51..9360726a7e7 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java @@ -1,6 +1,9 @@ package com.sap.sailing.domain.base.configuration.impl; +import java.io.Serializable; import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -9,10 +12,20 @@ public class DeviceConfigurationMatcherMulti implements DeviceConfigurationMatch private static final long serialVersionUID = 2372299957258702516L; - private final List clientIdentifiers; + private final SortedSet clientIdentifiers; public DeviceConfigurationMatcherMulti(List matchingClientIdentifiers) { - this.clientIdentifiers = matchingClientIdentifiers; + this.clientIdentifiers = new TreeSet(matchingClientIdentifiers); + } + + @Override + public Type getMatcherType() { + return Type.MULTI; + } + + @Override + public int getMatchingRank() { + return getMatcherType().getRank(); } @Override @@ -20,38 +33,13 @@ public class DeviceConfigurationMatcherMulti implements DeviceConfigurationMatch return this.clientIdentifiers.contains(identifier.getClientIdentifier()); } - @Override - public int getMatchingRank() { - return RANK_MULTI; - } - - public List getClientIdentifiers() { + public Iterable getClientIdentifiers() { return clientIdentifiers; } @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((clientIdentifiers == null) ? 0 : clientIdentifiers.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - DeviceConfigurationMatcherMulti other = (DeviceConfigurationMatcherMulti) obj; - if (clientIdentifiers == null) { - if (other.clientIdentifiers != null) - return false; - } else if (!clientIdentifiers.equals(other.clientIdentifiers)) - return false; - return true; + public Serializable getMatcherIdentifier() { + return String.format("%s%s", DeviceConfigurationMatcherMulti.class.getSimpleName(), clientIdentifiers.toString()); } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java index c1f695cb2e5..486a17f97cb 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.base.configuration.impl; +import java.io.Serializable; + import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -17,9 +19,14 @@ public class DeviceConfigurationMatcherSingle implements DeviceConfigurationMatc return this.clientIdentifier.equals(identifier.getClientIdentifier()); } + @Override + public Type getMatcherType() { + return Type.SINGLE; + } + @Override public int getMatchingRank() { - return RANK_SINGLE; + return getMatcherType().getRank(); } public String getClientIdentifier() { @@ -27,28 +34,8 @@ public class DeviceConfigurationMatcherSingle implements DeviceConfigurationMatc } @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((clientIdentifier == null) ? 0 : clientIdentifier.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - DeviceConfigurationMatcherSingle other = (DeviceConfigurationMatcherSingle) obj; - if (clientIdentifier == null) { - if (other.clientIdentifier != null) - return false; - } else if (!clientIdentifier.equals(other.clientIdentifier)) - return false; - return true; + public Serializable getMatcherIdentifier() { + return String.format("%s%s", DeviceConfigurationMatcherSingle.class.getSimpleName(), clientIdentifier); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java index a51fca91bd0..6d6ae18134e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java @@ -4,7 +4,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.util.List; +import java.util.UUID; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.base.impl.DomainFactoryImpl; import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.NauticalSide; @@ -111,5 +113,7 @@ public interface DomainFactory extends SharedDomainFactory { * @param trackedRace must not be null */ void updateRaceDTOWithTrackedRaceData(TrackedRace trackedRace, RaceDTO raceDTO); + + DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcher.Type type, List clientIdentifiers); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java index be0e2aee039..211953cdac2 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java @@ -31,6 +31,11 @@ import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.ObjectInputStreamResolvingAgainstDomainFactory; import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher.Type; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherMulti; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle; import com.sap.sailing.domain.common.CountryCode; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.MarkType; @@ -102,6 +107,8 @@ public class DomainFactoryImpl implements DomainFactory { private final ReferenceQueue waypointCacheReferenceQueue; private final WeakHashMap weakCompetitorDTOCache; + + private final Map configurationMatcherCache; /** * Weak references to {@link Waypoint} objects of this type are registered with @@ -139,6 +146,7 @@ public class DomainFactoryImpl implements DomainFactory { waypointCache = new ConcurrentHashMap(); mayStartWithNoUpwindLeg = new HashSet(Arrays.asList(new String[] { "extreme40", "ess", "ess40" })); courseAreaCache = new HashMap<>(); + configurationMatcherCache = new HashMap<>(); } @Override @@ -491,4 +499,31 @@ public class DomainFactoryImpl implements DomainFactory { return courseAreaCache.get(courseAreaId); } + @Override + public DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(Type type, List clientIdentifiers) { + DeviceConfigurationMatcher probe = createMatcher(type, clientIdentifiers); + DeviceConfigurationMatcher matcher = configurationMatcherCache.get(probe.getMatcherIdentifier()); + if (matcher == null) { + configurationMatcherCache.put(probe.getMatcherIdentifier(), probe); + matcher = probe; + } + return matcher; + } + + private DeviceConfigurationMatcher createMatcher(Type type, List clientIdentifiers) { + DeviceConfigurationMatcher matcher = null; + switch (type) { + case SINGLE: + matcher = new DeviceConfigurationMatcherSingle(clientIdentifiers.get(0)); + break; + case MULTI: + matcher = new DeviceConfigurationMatcherMulti(clientIdentifiers); + break; + case ANY: + matcher = DeviceConfigurationMatcherAny.INSTANCE; + break; + } + return matcher; + } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java index a169b346c94..367c56fadbc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java @@ -95,6 +95,7 @@ public class DeviceConfigurationDetailComposite extends Composite { this.configuration = result; allowedCourseAreasBox = new TextBox(); + allowedCourseAreasBox.setText("Alpha,Bravo,Charlie"); allowedCourseAreasBox.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { 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 f79cc4475a9..bd4f7b4804c 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 @@ -331,11 +331,11 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S private final com.sap.sailing.domain.common.CountryCodeFactory countryCodeFactory; private final Executor executor; + + private final com.sap.sailing.domain.base.DomainFactory baseDomainFactory; private final DomainFactory tractracDomainFactory; - private final com.sap.sailing.domain.base.DomainFactory baseDomainFactory; - private final Map polarSheetGenerationWorkers; private static final int LEADERBOARD_BY_NAME_RESULTS_CACHE_BY_ID_SIZE = 100; @@ -3386,7 +3386,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S clients.add(((DeviceConfigurationMatcherSingle)matcher).getClientIdentifier()); } else if (matcher instanceof DeviceConfigurationMatcherMulti) { type = Type.MULTI; - clients.addAll(((DeviceConfigurationMatcherMulti)matcher).getClientIdentifiers()); + Util.addAll(((DeviceConfigurationMatcherMulti)matcher).getClientIdentifiers(), clients); } else if (matcher instanceof DeviceConfigurationMatcherAny) { type = Type.ANY; } @@ -3399,21 +3399,16 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } private DeviceConfigurationMatcher convertToDeviceConfigurationMatcher(Type type, List clientIds) { - DeviceConfigurationMatcher matcher = null; switch (type) { case SINGLE: - matcher = new DeviceConfigurationMatcherSingle(clientIds.get(0)); - break; + return baseDomainFactory.getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcher.Type.SINGLE, clientIds); case MULTI: - matcher = new DeviceConfigurationMatcherMulti(clientIds); - break; + return baseDomainFactory.getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcher.Type.MULTI, clientIds); case ANY: - matcher = DeviceConfigurationMatcherAny.INSTANCE; - break; + return baseDomainFactory.getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcher.Type.ANY, clientIds); default: - break; + return null; } - return matcher; } private DeviceConfigurationDTO convertToDeviceConfigurationDTO(DeviceConfiguration configuration) { diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index d5c01c60841..a1e2f8bee52 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -12,7 +12,6 @@ import java.net.URL; import java.net.UnknownHostException; import java.text.ParseException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -22,6 +21,7 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -48,11 +48,7 @@ import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; -import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl; import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMapImpl; -import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; -import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherMulti; -import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle; import com.sap.sailing.domain.base.impl.EventImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.common.LeaderboardNameConstants; @@ -358,26 +354,10 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen } private void loadStoredDeviceConfigurations() { - DeviceConfigurationMatcher anyMatcher = DeviceConfigurationMatcherAny.INSTANCE; - DeviceConfigurationImpl configuration1 = new DeviceConfigurationImpl(); - configuration1.setAllowedCourseAreaNames(Arrays.asList("Alpha", "Beta", "Stadium")); - configuration1.setMaximumRoundsForCourse(3); - configuration1.setResultsMailRecipient("lukas.niemeier@sap.com"); - - DeviceConfigurationMatcher multiIdentifier = new DeviceConfigurationMatcherMulti(Arrays.asList("2", "3")); - DeviceConfigurationImpl configuration2 = new DeviceConfigurationImpl(); - configuration2.setAllowedCourseAreaNames(Arrays.asList("GAMMA")); - configuration2.setMaximumRoundsForCourse(3); - - DeviceConfigurationMatcher identifier = new DeviceConfigurationMatcherSingle("3"); - DeviceConfigurationImpl configuration3 = new DeviceConfigurationImpl(); - configuration3.setAllowedCourseAreaNames(Arrays.asList("Timo")); - configuration3.setMaximumRoundsForCourse(1); - - synchronized (configurationMap) { - configurationMap.put(anyMatcher, configuration1); - configurationMap.put(identifier, configuration3); - configurationMap.put(multiIdentifier, configuration2); + for (Entry entry : domainObjectFactory.loadAllDeviceConfigurations()) { + synchronized (configurationMap) { + configurationMap.put(entry.getKey(), entry.getValue()); + } } } @@ -2151,6 +2131,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen public void addDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) { synchronized (configurationMap) { configurationMap.put(matcher, configuration); + mongoObjectFactory.storeDeviceConfiguration(matcher, configuration); } } @@ -2158,6 +2139,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen public void removeDeviceConfiguration(DeviceConfigurationMatcher matcher) { synchronized (configurationMap) { configurationMap.remove(matcher); + mongoObjectFactory.removeDeviceConfiguration(matcher); } } From dda35a025c27b4845ed614812fdafc52fa80c7c7 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Thu, 24 Oct 2013 19:36:12 +0200 Subject: [PATCH 045/450] # fixed bug when persisting any device matchers --- .../persistence/impl/DomainObjectFactoryImpl.java | 10 ++++++---- .../impl/DeviceConfigurationMatcherMulti.java | 14 ++++++++++---- .../impl/DeviceConfigurationMatcherSingle.java | 5 +++++ 3 files changed, 21 insertions(+), 8 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 2b015e765de..fdbde122e74 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 @@ -1288,13 +1288,15 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } private DeviceConfigurationMatcher loadConfigurationMatcher(DBObject matcherObject) { + Type type = Type.valueOf(matcherObject.get(FieldNames.CONFIGURATION_MATCHER_TYPE.name()).toString()); List clientIdentifiers = new ArrayList(); BasicDBList clientIdentifiersObject = (BasicDBList) matcherObject.get(FieldNames.CONFIGURATION_MATCHER_CLIENTS.name()); - for (Object clientIdentifier : clientIdentifiersObject) { - clientIdentifiers.add(clientIdentifier.toString()); + if (clientIdentifiersObject != null) { + for (Object clientIdentifier : clientIdentifiersObject) { + clientIdentifiers.add(clientIdentifier.toString()); + } } - String type = (String) matcherObject.get(FieldNames.CONFIGURATION_MATCHER_TYPE.name()); - return DomainFactory.INSTANCE.getOrCreateDeviceConfigurationMatcher(Type.valueOf(type), clientIdentifiers); + return DomainFactory.INSTANCE.getOrCreateDeviceConfigurationMatcher(type, clientIdentifiers); } private DeviceConfiguration loadConfiguration(DBObject configObject) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java index 9360726a7e7..2f3b8e625b2 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java @@ -1,9 +1,9 @@ package com.sap.sailing.domain.base.configuration.impl; import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -12,10 +12,11 @@ public class DeviceConfigurationMatcherMulti implements DeviceConfigurationMatch private static final long serialVersionUID = 2372299957258702516L; - private final SortedSet clientIdentifiers; + private final List clientIdentifiers; public DeviceConfigurationMatcherMulti(List matchingClientIdentifiers) { - this.clientIdentifiers = new TreeSet(matchingClientIdentifiers); + this.clientIdentifiers = new ArrayList(matchingClientIdentifiers); + Collections.sort(this.clientIdentifiers); } @Override @@ -41,5 +42,10 @@ public class DeviceConfigurationMatcherMulti implements DeviceConfigurationMatch public Serializable getMatcherIdentifier() { return String.format("%s%s", DeviceConfigurationMatcherMulti.class.getSimpleName(), clientIdentifiers.toString()); } + + @Override + public String toString() { + return "DeviceConfigurationMatcherMulti [clientIdentifiers=" + clientIdentifiers + "]"; + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java index 486a17f97cb..14317582ef1 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java @@ -38,4 +38,9 @@ public class DeviceConfigurationMatcherSingle implements DeviceConfigurationMatc return String.format("%s%s", DeviceConfigurationMatcherSingle.class.getSimpleName(), clientIdentifier); } + @Override + public String toString() { + return "DeviceConfigurationMatcherSingle [clientIdentifier=" + clientIdentifier + "]"; + } + } From d8192aa7b2eae2f6057c92dfa4a1b5089a942ba0 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Thu, 24 Oct 2013 19:38:51 +0200 Subject: [PATCH 046/450] # added removing of device configurations (persistence) --- .../domain/persistence/impl/MongoObjectFactoryImpl.java | 6 ++++-- .../com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 2 +- .../src/com/sap/sailing/server/RacingEventService.java | 2 +- .../com/sap/sailing/server/impl/RacingEventServiceImpl.java | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) 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 e0eecce108e..a407e73f278 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 @@ -911,8 +911,10 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { @Override public void removeDeviceConfiguration(DeviceConfigurationMatcher matcher) { - // TODO Auto-generated method stub - + DBCollection configurationsCollections = database.getCollection(CollectionNames.CONFIGURATIONS.name()); + DBObject query = new BasicDBObject(); + query.put(FieldNames.CONFIGURATION_MATCHER_ID.name(), matcher.getMatcherIdentifier()); + configurationsCollections.remove(query); } } 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 bd4f7b4804c..e36e34d5193 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 @@ -3366,7 +3366,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S configuration.setMinimumRoundsForCourse(minRounds); configuration.setMaximumRoundsForCourse(maxRounds); configuration.setResultsMailRecipient(mailRecipient); - getService().addDeviceConfiguration(matcher, configuration); + getService().createOrUpdateDeviceConfiguration(matcher, configuration); return convertToDeviceConfigurationMatcherDTO(matcher); } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java index f29c4c030e1..f5f9b1784ee 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java @@ -567,7 +567,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch * @param matcher defining for which the configuration applies. * @param configuration of the device. */ - void addDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration); + void createOrUpdateDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration); /** * Removes a configuration by its matching object. diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index a1e2f8bee52..02389d4e3bd 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -2128,7 +2128,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen } @Override - public void addDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) { + public void createOrUpdateDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) { synchronized (configurationMap) { configurationMap.put(matcher, configuration); mongoObjectFactory.storeDeviceConfiguration(matcher, configuration); From 5230799349c4e7d16450298d979d166333002b9b Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Thu, 24 Oct 2013 20:00:39 +0200 Subject: [PATCH 047/450] # added replication to device configuratiom --- .../domain/base/SharedDomainFactory.java | 4 +++ .../DeviceConfigurationMatcher.java | 4 ++- .../impl/DeviceConfigurationMatcherAny.java | 8 ++++++ .../impl/DeviceConfigurationMatcherMulti.java | 7 +++++ .../DeviceConfigurationMatcherSingle.java | 8 ++++++ .../sailing/domain/base/DomainFactory.java | 2 -- .../DeviceConfigurationReplicationTest.java | 27 +++++++++++++++++++ .../server/impl/RacingEventServiceImpl.java | 8 ++++-- .../AbstractDeviceConfigurationOperation.java | 27 +++++++++++++++++++ .../CreateOrUpdateDeviceConfiguration.java | 24 +++++++++++++++++ .../RemoveDeviceConfiguration.java | 21 +++++++++++++++ .../app/domain/impl/DomainFactoryImpl.java | 9 +++++++ 12 files changed, 144 insertions(+), 5 deletions(-) create mode 100644 java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java create mode 100644 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractDeviceConfigurationOperation.java create mode 100644 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateOrUpdateDeviceConfiguration.java create mode 100644 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveDeviceConfiguration.java diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java index 03d08f83a2f..fe540d2ebbe 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java @@ -1,8 +1,10 @@ package com.sap.sailing.domain.base; import java.io.Serializable; +import java.util.List; import java.util.UUID; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.NauticalSide; @@ -81,6 +83,8 @@ public interface SharedDomainFactory { CourseArea getOrCreateCourseArea(Serializable courseAreaId, String name); CourseArea getExistingCourseAreaById(Serializable courseAreaId); + + DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcher.Type type, List clientIdentifiers); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java index d504d5d2a3a..4bbcab44985 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java @@ -2,7 +2,9 @@ package com.sap.sailing.domain.base.configuration; import java.io.Serializable; -public interface DeviceConfigurationMatcher extends Serializable { +import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; + +public interface DeviceConfigurationMatcher extends IsManagedBySharedDomainFactory, Serializable { final static int RANK_SINGLE = 1; final static int RANK_MULTI = 2; final static int RANK_ANY = 3; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java index 51c9be5cd77..5d748b32365 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java @@ -1,7 +1,10 @@ package com.sap.sailing.domain.base.configuration.impl; import java.io.Serializable; +import java.util.Collections; +import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -30,4 +33,9 @@ public enum DeviceConfigurationMatcherAny implements DeviceConfigurationMatcher return DeviceConfigurationMatcherAny.class.getSimpleName(); } + @Override + public IsManagedBySharedDomainFactory resolve(SharedDomainFactory domainFactory) { + return domainFactory.getOrCreateDeviceConfigurationMatcher(getMatcherType(), Collections.emptyList()); + } + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java index 2f3b8e625b2..e1898af6b02 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java @@ -5,6 +5,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -47,5 +49,10 @@ public class DeviceConfigurationMatcherMulti implements DeviceConfigurationMatch public String toString() { return "DeviceConfigurationMatcherMulti [clientIdentifiers=" + clientIdentifiers + "]"; } + + @Override + public IsManagedBySharedDomainFactory resolve(SharedDomainFactory domainFactory) { + return domainFactory.getOrCreateDeviceConfigurationMatcher(getMatcherType(), clientIdentifiers); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java index 14317582ef1..32df2da8a02 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java @@ -1,7 +1,10 @@ package com.sap.sailing.domain.base.configuration.impl; import java.io.Serializable; +import java.util.Arrays; +import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; @@ -43,4 +46,9 @@ public class DeviceConfigurationMatcherSingle implements DeviceConfigurationMatc return "DeviceConfigurationMatcherSingle [clientIdentifier=" + clientIdentifier + "]"; } + @Override + public IsManagedBySharedDomainFactory resolve(SharedDomainFactory domainFactory) { + return domainFactory.getOrCreateDeviceConfigurationMatcher(getMatcherType(), Arrays.asList(clientIdentifier)); + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java index 6d6ae18134e..1d134a5af02 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java @@ -113,7 +113,5 @@ public interface DomainFactory extends SharedDomainFactory { * @param trackedRace must not be null */ void updateRaceDTOWithTrackedRaceData(TrackedRace trackedRace, RaceDTO raceDTO); - - DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcher.Type type, List clientIdentifiers); } diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java new file mode 100644 index 00000000000..cb61afdfa1d --- /dev/null +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java @@ -0,0 +1,27 @@ +package com.sap.sailing.server.replication.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Map; + +import org.junit.Test; + +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; + +public class DeviceConfigurationReplicationTest extends AbstractServerReplicationTest { + + @Test + public void testEventReplication() throws InterruptedException { + DeviceConfigurationMatcher matcher = DeviceConfigurationMatcherAny.INSTANCE; + DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); + master.createOrUpdateDeviceConfiguration(matcher, configuration); + + Thread.sleep(1000); + Map configurationMap = replica.getAllDeviceConfigurations(); + assertEquals(1, configurationMap.size()); + assertEquals(matcher.getMatcherType(), configurationMap.keySet().iterator().next().getMatcherType()); + } +} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 02389d4e3bd..b72c61ea323 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -131,10 +131,12 @@ import com.sap.sailing.server.operationaltransformation.AddRaceDefinition; import com.sap.sailing.server.operationaltransformation.AddSpecificRegatta; import com.sap.sailing.server.operationaltransformation.ConnectTrackedRaceToLeaderboardColumn; import com.sap.sailing.server.operationaltransformation.CreateEvent; +import com.sap.sailing.server.operationaltransformation.CreateOrUpdateDeviceConfiguration; import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; import com.sap.sailing.server.operationaltransformation.RecordCompetitorGPSFix; import com.sap.sailing.server.operationaltransformation.RecordMarkGPSFix; import com.sap.sailing.server.operationaltransformation.RecordWindFix; +import com.sap.sailing.server.operationaltransformation.RemoveDeviceConfiguration; import com.sap.sailing.server.operationaltransformation.RemoveEvent; import com.sap.sailing.server.operationaltransformation.RemoveMediaTrackOperation; import com.sap.sailing.server.operationaltransformation.RemoveWindFix; @@ -2131,16 +2133,18 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen public void createOrUpdateDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) { synchronized (configurationMap) { configurationMap.put(matcher, configuration); - mongoObjectFactory.storeDeviceConfiguration(matcher, configuration); } + mongoObjectFactory.storeDeviceConfiguration(matcher, configuration); + replicate(new CreateOrUpdateDeviceConfiguration(matcher, configuration)); } @Override public void removeDeviceConfiguration(DeviceConfigurationMatcher matcher) { synchronized (configurationMap) { configurationMap.remove(matcher); - mongoObjectFactory.removeDeviceConfiguration(matcher); } + mongoObjectFactory.removeDeviceConfiguration(matcher); + replicate(new RemoveDeviceConfiguration(matcher)); } @Override diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractDeviceConfigurationOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractDeviceConfigurationOperation.java new file mode 100644 index 00000000000..5e1853c025f --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractDeviceConfigurationOperation.java @@ -0,0 +1,27 @@ +package com.sap.sailing.server.operationaltransformation; + +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.server.RacingEventServiceOperation; + +public abstract class AbstractDeviceConfigurationOperation extends AbstractRacingEventServiceOperation { + + private static final long serialVersionUID = -4918619894046424881L; + + protected DeviceConfigurationMatcher matcher; + + public AbstractDeviceConfigurationOperation(DeviceConfigurationMatcher matcher) { + this.matcher = matcher; + } + + @Override + public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) { + return null; + } + + @Override + public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) { + return null; + } + + +} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateOrUpdateDeviceConfiguration.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateOrUpdateDeviceConfiguration.java new file mode 100644 index 00000000000..69c7d3e966b --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreateOrUpdateDeviceConfiguration.java @@ -0,0 +1,24 @@ +package com.sap.sailing.server.operationaltransformation; + +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.server.RacingEventService; + +public class CreateOrUpdateDeviceConfiguration extends AbstractDeviceConfigurationOperation { + + private static final long serialVersionUID = -3859272800957110301L; + + private DeviceConfiguration configuration; + + public CreateOrUpdateDeviceConfiguration(DeviceConfigurationMatcher matcher, DeviceConfiguration configuration) { + super(matcher); + this.configuration = configuration; + } + + @Override + public Void internalApplyTo(RacingEventService toState) throws Exception { + toState.createOrUpdateDeviceConfiguration(matcher, configuration); + return null; + } + +} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveDeviceConfiguration.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveDeviceConfiguration.java new file mode 100644 index 00000000000..4f3a22b8db7 --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RemoveDeviceConfiguration.java @@ -0,0 +1,21 @@ +package com.sap.sailing.server.operationaltransformation; + +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.server.RacingEventService; + +public class RemoveDeviceConfiguration extends AbstractDeviceConfigurationOperation { + + private static final long serialVersionUID = 4558840313811769137L; + + public RemoveDeviceConfiguration(DeviceConfigurationMatcher matcher) { + super(matcher); + } + + @Override + public Void internalApplyTo(RacingEventService toState) throws Exception { + toState.removeDeviceConfiguration(matcher); + return null; + } + + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/DomainFactoryImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/DomainFactoryImpl.java index 0104e18fb39..90cd0669611 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/DomainFactoryImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/DomainFactoryImpl.java @@ -4,11 +4,13 @@ import java.io.Serializable; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import android.annotation.SuppressLint; + import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -20,6 +22,8 @@ import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher.Type; import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CourseAreaImpl; @@ -167,4 +171,9 @@ public enum DomainFactoryImpl implements SharedDomainFactory { return courseAreaCache.get(courseAreaId); } + @Override + public DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(Type type, List clientIdentifiers) { + throw new UnsupportedOperationException("Not yet implemented"); + } + } From e94dcf286e6c428cec314be40d23d09c7ab61af1 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Tue, 29 Oct 2013 22:17:51 +0100 Subject: [PATCH 048/450] # added replication tests --- .../configuration/DeviceConfiguration.java | 3 +- .../impl/DeviceConfigurationImpl.java | 2 ++ .../DeviceConfigurationReplicationTest.java | 36 +++++++++++++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfiguration.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfiguration.java index df7e8c388b5..478d9a0c55e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfiguration.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfiguration.java @@ -1,11 +1,12 @@ package com.sap.sailing.domain.base.configuration; +import java.io.Serializable; import java.util.List; /** * Interface holding information about tablet's (RCApp) configuration. */ -public interface DeviceConfiguration { +public interface DeviceConfiguration extends Serializable { List getAllowedCourseAreaNames(); Integer getMinimumRoundsForCourse(); Integer getMaximumRoundsForCourse(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationImpl.java index e1bdb872341..a1c43e0e81b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationImpl.java @@ -4,6 +4,8 @@ import java.util.List; import com.sap.sailing.domain.base.configuration.DeviceConfiguration; public class DeviceConfigurationImpl implements DeviceConfiguration { + + private static final long serialVersionUID = 6084215932610324314L; private List allowedCourseAreaNames; private Integer minRounds; diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java index cb61afdfa1d..18b7ab03abe 100644 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DeviceConfigurationReplicationTest.java @@ -10,18 +10,50 @@ import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl; import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle; public class DeviceConfigurationReplicationTest extends AbstractServerReplicationTest { @Test - public void testEventReplication() throws InterruptedException { + public void testCreateConfiguration() throws InterruptedException { DeviceConfigurationMatcher matcher = DeviceConfigurationMatcherAny.INSTANCE; DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); - master.createOrUpdateDeviceConfiguration(matcher, configuration); + master.createOrUpdateDeviceConfiguration(matcher, configuration); Thread.sleep(1000); + Map configurationMap = replica.getAllDeviceConfigurations(); assertEquals(1, configurationMap.size()); assertEquals(matcher.getMatcherType(), configurationMap.keySet().iterator().next().getMatcherType()); } + + @Test + public void testUpdateConfiguration() throws InterruptedException { + DeviceConfigurationMatcher matcher = new DeviceConfigurationMatcherSingle("23"); + DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); + + configuration.setMinimumRoundsForCourse(2); + master.createOrUpdateDeviceConfiguration(matcher, configuration); + configuration.setMinimumRoundsForCourse(42); + master.createOrUpdateDeviceConfiguration(matcher, configuration); + Thread.sleep(1000); + + Map configurationMap = replica.getAllDeviceConfigurations(); + assertEquals(1, configurationMap.size()); + assertEquals(configuration.getMinimumRoundsForCourse(), configurationMap.values().iterator().next().getMinimumRoundsForCourse()); + } + + @Test + public void testRemoveConfiguration() throws InterruptedException { + DeviceConfigurationMatcher matcher = new DeviceConfigurationMatcherSingle("24"); + DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); + + master.createOrUpdateDeviceConfiguration(matcher, configuration); + Thread.sleep(1000); + master.removeDeviceConfiguration(matcher); + Thread.sleep(1000); + + Map configurationMap = replica.getAllDeviceConfigurations(); + assertEquals(0, configurationMap.size()); + } } From be66f2e38069c5ee03d0a9300a864e3d480576ae Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Tue, 29 Oct 2013 22:26:19 +0100 Subject: [PATCH 049/450] # added some missing comments --- .../DeviceConfigurationMatcher.java | 48 +++++++++++++++---- .../impl/DeviceConfigurationMapImpl.java | 17 +++++-- .../impl/DeviceConfigurationMatcherAny.java | 3 ++ .../impl/DeviceConfigurationMatcherMulti.java | 3 ++ .../DeviceConfigurationMatcherSingle.java | 3 ++ 5 files changed, 63 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java index 4bbcab44985..387f82d6d0d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/DeviceConfigurationMatcher.java @@ -3,30 +3,62 @@ package com.sap.sailing.domain.base.configuration; import java.io.Serializable; import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMapImpl; +/** + *

+ * Classes implementing this interface are matching {@link DeviceConfigurationIdentifier}s to associate them with a + * {@link DeviceConfiguration}. + *

+ * + *

The rank (see {@link DeviceConfigurationMatcher#getMatchingRank()}) is used as a priority when multiple matchers + * are matching a {@link DeviceConfigurationIdentifier} (see also {@link DeviceConfigurationMapImpl}).

+ */ public interface DeviceConfigurationMatcher extends IsManagedBySharedDomainFactory, Serializable { final static int RANK_SINGLE = 1; final static int RANK_MULTI = 2; final static int RANK_ANY = 3; - + public enum Type { - SINGLE(RANK_SINGLE), - MULTI(RANK_MULTI), - ANY(RANK_ANY); - + SINGLE(RANK_SINGLE), MULTI(RANK_MULTI), ANY(RANK_ANY); + private int matchingRank; - + private Type(int rank) { this.matchingRank = rank; } - + public int getRank() { return matchingRank; } } - + + /** + * Returns the kind of matching used by this matcher. + * + * @return the {@link Type}. + */ Type getMatcherType(); + + /** + * Gets the matcher's rank. + * + * @return the rank. + */ int getMatchingRank(); + + /** + * Returns true if this {@link DeviceConfigurationMatcher} matches the given + * {@link DeviceConfigurationIdentifier}; otherwise false. + * + * @param identifier + */ boolean matches(DeviceConfigurationIdentifier identifier); + + /** + * Gets this matcher's identifier. + * + * @return the identifier. + */ Serializable getMatcherIdentifier(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMapImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMapImpl.java index b15f290ae13..fe420eb5a44 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMapImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMapImpl.java @@ -1,19 +1,30 @@ package com.sap.sailing.domain.base.configuration.impl; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +/** + *

+ * Helper class providing a {@link Map} of {@link DeviceConfigurationMatcher}s associated with their + * {@link DeviceConfiguration}. + *

+ * + *

+ * When searching for a match, the highest ranked {@link DeviceConfigurationMatcher} (i.e. lowest number) wins. + *

+ */ public class DeviceConfigurationMapImpl extends ConcurrentHashMap { private static final long serialVersionUID = -8009136964737670452L; - + private interface Action { DeviceConfiguration call(DeviceConfigurationMatcher matcher); } - + public DeviceConfiguration getByMatch(DeviceConfigurationIdentifier key) { return doByMatch(key, new Action() { @Override @@ -31,7 +42,7 @@ public class DeviceConfigurationMapImpl extends ConcurrentHashMap entry : entrySet()) { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java index 5d748b32365..8512e1c7b6f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java @@ -8,6 +8,9 @@ import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +/** + * Matches all {@link DeviceConfigurationIdentifier}. + */ public enum DeviceConfigurationMatcherAny implements DeviceConfigurationMatcher { INSTANCE; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java index e1898af6b02..dc4c67edc5f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherMulti.java @@ -10,6 +10,9 @@ import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +/** + * Matches a set of {@link DeviceConfigurationIdentifier}s. + */ public class DeviceConfigurationMatcherMulti implements DeviceConfigurationMatcher { private static final long serialVersionUID = 2372299957258702516L; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java index 32df2da8a02..510c98f276b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherSingle.java @@ -8,6 +8,9 @@ import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +/** + * Matches a single {@link DeviceConfigurationIdentifier}. + */ public class DeviceConfigurationMatcherSingle implements DeviceConfigurationMatcher { private static final long serialVersionUID = -3662453614818373801L; From acdc62d244cbf9b0a2d31fa07567c62e601995d5 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Tue, 29 Oct 2013 22:45:35 +0100 Subject: [PATCH 050/450] # added tests for device configuration (persistence) --- .../StoreAndLoadDeviceConfigurationsTest.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceConfigurationsTest.java diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceConfigurationsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceConfigurationsTest.java new file mode 100644 index 00000000000..3dba67f1f4c --- /dev/null +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceConfigurationsTest.java @@ -0,0 +1,89 @@ +package com.sap.sailing.mongodb.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Map.Entry; + +import org.junit.Test; + +import com.mongodb.MongoException; +import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationImpl; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; +import com.sap.sailing.domain.common.impl.Util; +import com.sap.sailing.domain.persistence.MongoFactory; +import com.sap.sailing.domain.persistence.impl.DomainObjectFactoryImpl; +import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; + +public class StoreAndLoadDeviceConfigurationsTest extends AbstractMongoDBTest { + + public StoreAndLoadDeviceConfigurationsTest() throws UnknownHostException, MongoException { + super(); + } + + protected MongoObjectFactoryImpl mongoFactory = (MongoObjectFactoryImpl) MongoFactory.INSTANCE + .getMongoObjectFactory(getMongoService()); + protected DomainObjectFactoryImpl domainFactory = (DomainObjectFactoryImpl) MongoFactory.INSTANCE + .getDomainObjectFactory(getMongoService()); + + @Test + public void testStoreEmptyConfiguration() { + DeviceConfigurationMatcher matcher = DeviceConfigurationMatcherAny.INSTANCE; + DeviceConfiguration configuration = new DeviceConfigurationImpl(); + mongoFactory.storeDeviceConfiguration(matcher, configuration); + + Iterable> configurations = domainFactory + .loadAllDeviceConfigurations(); + + assertEquals(1, Util.size(configurations)); + Entry entry = configurations.iterator().next(); + assertEquals(matcher, entry.getKey()); + assertNull(entry.getValue().getAllowedCourseAreaNames()); + assertNull(entry.getValue().getMinimumRoundsForCourse()); + assertNull(entry.getValue().getMaximumRoundsForCourse()); + assertNull(entry.getValue().getResultsMailRecipient()); + } + + @Test + public void testStoreConfiguration() { + DeviceConfigurationMatcher matcher = DeviceConfigurationMatcherAny.INSTANCE; + DeviceConfigurationImpl configuration = new DeviceConfigurationImpl(); + configuration.setAllowedCourseAreaNames(Arrays.asList("a","b")); + configuration.setMinimumRoundsForCourse(4); + configuration.setMaximumRoundsForCourse(5); + configuration.setResultsMailRecipient("abc"); + mongoFactory.storeDeviceConfiguration(matcher, configuration); + + Iterable> configurations = domainFactory + .loadAllDeviceConfigurations(); + + assertEquals(1, Util.size(configurations)); + Entry entry = configurations.iterator().next(); + assertEquals(matcher, entry.getKey()); + assertNotNull(entry.getValue().getAllowedCourseAreaNames()); + assertEquals(2, entry.getValue().getAllowedCourseAreaNames().size()); + assertEquals(new Integer(4), entry.getValue().getMinimumRoundsForCourse()); + assertEquals(new Integer(5), entry.getValue().getMaximumRoundsForCourse()); + assertEquals("abc", entry.getValue().getResultsMailRecipient()); + } + + @Test + public void testRemoveConfiguration() { + DeviceConfigurationMatcher matcher = DeviceConfigurationMatcherAny.INSTANCE; + DeviceConfiguration configuration = new DeviceConfigurationImpl(); + mongoFactory.storeDeviceConfiguration(matcher, configuration); + + Iterable> configurations = domainFactory + .loadAllDeviceConfigurations(); + assertEquals(1, Util.size(configurations)); + mongoFactory.removeDeviceConfiguration(matcher); + configurations = domainFactory.loadAllDeviceConfigurations(); + + assertEquals(0, Util.size(configurations)); + } +} From 92c6914371ba09eac8c5b34782c0d65125ff1361 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Mon, 4 Nov 2013 02:21:19 +0100 Subject: [PATCH 051/450] # moved some hardcoded strings to StringMessages --- .../adminconsole/AdminConsoleEntryPoint.java | 2 +- .../DeviceConfigurationDetailComposite.java | 18 ++++++++++-------- .../DeviceConfigurationListComposite.java | 7 ++++--- .../adminconsole/DeviceConfigurationPanel.java | 4 +--- .../sailing/gwt/ui/client/StringMessages.java | 8 ++++++++ .../gwt/ui/client/StringMessages.properties | 10 +++++++++- .../gwt/ui/client/StringMessages_de.properties | 10 +++++++++- 7 files changed, 42 insertions(+), 17 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java index 84fbb239655..60154535f69 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java @@ -124,7 +124,7 @@ public class AdminConsoleEntryPoint extends AbstractEntryPoint implements Regatt tabPanel.add(masterDataImportPanel, stringMessages.masterDataImportPanel(), /* asHTML */ false); final DeviceConfigurationPanel deviceConfigurationPanel = new DeviceConfigurationPanel(sailingService, stringMessages, this); - tabPanel.add(deviceConfigurationPanel, "Device Configuration", false); + tabPanel.add(deviceConfigurationPanel, stringMessages.deviceConfiguration(), false); tabPanel.selectTab(0); tabPanel.addSelectionHandler(new SelectionHandler() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java index 367c56fadbc..99d6ec4a633 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationDetailComposite.java @@ -26,6 +26,7 @@ public class DeviceConfigurationDetailComposite extends Composite { private final SailingServiceAsync sailingService; private final ErrorReporter errorReporter; + private final StringMessages stringMessages; private CaptionPanel captionPanel; private Grid mainGrid; @@ -42,14 +43,15 @@ public class DeviceConfigurationDetailComposite extends Composite { public DeviceConfigurationDetailComposite(final SailingServiceAsync sailingService, final ErrorReporter errorReporter, StringMessages stringMessages) { this.sailingService = sailingService; this.errorReporter = errorReporter; + this.stringMessages = stringMessages; this.matcher = null; this.configuration = null; - captionPanel = new CaptionPanel("Configuration"); + captionPanel = new CaptionPanel(stringMessages.configuration()); VerticalPanel verticalPanel = new VerticalPanel(); mainGrid = new Grid(4, 2); - updateButton = new Button("Update"); + updateButton = new Button(stringMessages.save()); updateButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -83,9 +85,9 @@ public class DeviceConfigurationDetailComposite extends Composite { private void markAsDrity(boolean dirty) { if (dirty) { - captionPanel.setCaptionText("Configuration*"); + captionPanel.setCaptionText(stringMessages.configuration() + "*"); } else { - captionPanel.setCaptionText("Configuration"); + captionPanel.setCaptionText(stringMessages.configuration()); } } @@ -115,7 +117,7 @@ public class DeviceConfigurationDetailComposite extends Composite { } allowedCourseAreasBox.setText(builder.substring(0, builder.length() - 1)); } - mainGrid.setWidget(0, 0, new Label("Allowed Course Areas")); + mainGrid.setWidget(0, 0, new Label(stringMessages.allowedCourseAreas())); mainGrid.setWidget(0, 1, allowedCourseAreasBox); minRoundsBox = new TextBox(); @@ -129,7 +131,7 @@ public class DeviceConfigurationDetailComposite extends Composite { if (result.minRoundsForCourse != null) { minRoundsBox.setText(result.minRoundsForCourse.toString()); } - mainGrid.setWidget(1, 0, new Label("Minimum Rounds for Course")); + mainGrid.setWidget(1, 0, new Label(stringMessages.minimumRoundsForCourse())); mainGrid.setWidget(1, 1, minRoundsBox); maxRoundsBox = new TextBox(); @@ -143,7 +145,7 @@ public class DeviceConfigurationDetailComposite extends Composite { if (result.maxRoundsForCourse != null) { maxRoundsBox.setText(result.maxRoundsForCourse.toString()); } - mainGrid.setWidget(2, 0, new Label("Maximum Rounds for Course")); + mainGrid.setWidget(2, 0, new Label(stringMessages.maximumRoundsForCourse())); mainGrid.setWidget(2, 1, maxRoundsBox); mailRecipientBox = new TextBox(); @@ -157,7 +159,7 @@ public class DeviceConfigurationDetailComposite extends Composite { if (result.resultsMailRecipient != null) { mailRecipientBox.setText(result.resultsMailRecipient); } - mainGrid.setWidget(3, 0, new Label("Results Mail Recipient")); + mainGrid.setWidget(3, 0, new Label(stringMessages.resultsMailRecipient())); mainGrid.setWidget(3, 1, mailRecipientBox); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java index 0257478b14d..8934e5fa650 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationListComposite.java @@ -30,7 +30,6 @@ public class DeviceConfigurationListComposite extends Composite { private final CellTable configurationTable; private ListDataProvider configurationsDataProvider; - private final SimplePanel mainPanel; private final VerticalPanel panel; @@ -38,6 +37,7 @@ public class DeviceConfigurationListComposite extends Composite { private final SailingServiceAsync sailingService; private final ErrorReporter errorReporter; + private final StringMessages stringMessages; private static AdminConsoleTableResources tableResource = GWT.create(AdminConsoleTableResources.class); @@ -46,12 +46,13 @@ public class DeviceConfigurationListComposite extends Composite { final ErrorReporter errorReporter, final StringMessages stringMessages) { this.sailingService = sailingService; this.errorReporter = errorReporter; + this.stringMessages = stringMessages; mainPanel = new SimplePanel(); panel = new VerticalPanel(); mainPanel.setWidget(panel); - noConfigurationsLabel = new Label("There are no configurations."); + noConfigurationsLabel = new Label(stringMessages.noConfigurations()); noConfigurationsLabel.setWordWrap(false); panel.add(noConfigurationsLabel); @@ -93,7 +94,7 @@ public class DeviceConfigurationListComposite extends Composite { @Override public void onFailure(Throwable caught) { - noConfigurationsLabel.setText("Error retrieving configuration data from server."); + noConfigurationsLabel.setText(stringMessages.errorRetrievingConfiguration()); noConfigurationsLabel.setVisible(true); configurationTable.setVisible(false); errorReporter.reportError("Error retrieving configuration data from server: " + caught.getMessage()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java index e5dddad69dd..583caffc762 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceConfigurationPanel.java @@ -14,14 +14,12 @@ import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback; -import com.sap.sailing.gwt.ui.client.DataEntryDialog.Validator; import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SelectionChangeListener; import com.sap.sailing.gwt.ui.client.SelectionProvider; import com.sap.sailing.gwt.ui.client.SelectionProviderImpl; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO; import com.sap.sailing.gwt.ui.shared.DeviceConfigurationMatcherDTO; public class DeviceConfigurationPanel extends SimplePanel implements SelectionChangeListener { @@ -59,7 +57,7 @@ public class DeviceConfigurationPanel extends SimplePanel implements SelectionCh private void setupControlPanel(VerticalPanel mainPanel) { HorizontalPanel deviceManagementControlPanel = new HorizontalPanel(); deviceManagementControlPanel.setSpacing(5); - addConfigurationButton = new Button("Add Configuration"); + addConfigurationButton = new Button(stringMessages.addConfiguration()); addConfigurationButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 78d41b57312..230d9d5338f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -816,4 +816,12 @@ public interface StringMessages extends Messages { String raceTimeDownwindTooltip(); String raceTimeReachingTooltip(); String raceTimeUpwindTooltip(); + String addConfiguration(); + String noConfigurations(); + String errorRetrievingConfiguration(); + String allowedCourseAreas(); + String minimumRoundsForCourse(); + String maximumRoundsForCourse(); + String resultsMailRecipient(); + String deviceConfiguration(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 9cb493e7fe9..7e88a716ffe 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -808,4 +808,12 @@ timeUpwind=Time Upwind raceTimeTooltip=Total time traveled in this race raceTimeDownwindTooltip=Total time traveled downwind in this race raceTimeReachingTooltip=Total time traveled reaching in this race -raceTimeUpwindTooltip=Total time traveled upwind in this race \ No newline at end of file +raceTimeUpwindTooltip=Total time traveled upwind in this race +addConfiguration=Add Configuration +noConfigurations=There are no configurations. +errorRetrievingConfiguration=Error retrieving configuration data from server. +allowedCourseAreas=Allowed Course Areas +minimumRoundsForCourse=Minimum Rounds for Course +maximumRoundsForCourse=Maximum Rounds for Course +resultsMailRecipient=Results Mail Recipient +deviceConfiguration=Device Configuration \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index a1922cbc5ef..7d65496a1bc 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -804,4 +804,12 @@ timeUpwind=Zeit Kreuz raceTimeTooltip=Die für dieses Rennen benötigte Zeit raceTimeDownwindTooltip=Die in diesem Rennen auf Vorwind gesegelte Zeit raceTimeReachingTooltip=Die in diesem Rennen auf Holeschlage gesegelte Zeit -raceTimeUpwindTooltip=Diw in diesem Rennen auf Kreuz gesegelte Zeit \ No newline at end of file +raceTimeUpwindTooltip=Diw in diesem Rennen auf Kreuz gesegelte Zeit +addConfiguration=Konfiguration hinzufügen +noConfigurations=Keine Konfigurationen vorhanden. +errorRetrievingConfiguration=Fehler beim Laden der Konfiguration. +allowedCourseAreas=Erlaubte Rennbahnen +minimumRoundsForCourse=Minimale Rundenanzahl +maximumRoundsForCourse=Maximale Rundenanzahl +resultsMailRecipient=Empfänger der Ergebnislisten +deviceConfiguration=Device Configuration \ No newline at end of file From ac0e9f3d83650d6a77d57a2124d9f22ee671e285 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Mon, 4 Nov 2013 02:29:49 +0100 Subject: [PATCH 052/450] added device identifier label to expert view --- .../res/layout/system_information_view.xml | 14 ++++++++++++++ .../res/values/strings.xml | 1 + .../ui/activities/SystemInformationActivity.java | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/system_information_view.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/system_information_view.xml index 6e09cfb5a97..50959c61531 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/system_information_view.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/system_information_view.xml @@ -11,6 +11,20 @@ android:layout_height="wrap_content" android:text="@string/application_information" android:textAppearance="?android:attr/textAppearanceLarge" /> + + + + Start
Application Information + Identifier Version Install Date Persistence Status diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SystemInformationActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SystemInformationActivity.java index 221c3a5be18..a65b0635cf3 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SystemInformationActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SystemInformationActivity.java @@ -10,6 +10,7 @@ import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; +import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; public class SystemInformationActivity extends BaseActivity { @@ -41,6 +42,9 @@ public class SystemInformationActivity extends BaseActivity { } private void setupVersionView() { + TextView identifierView = (TextView) findViewById(R.id.system_information_application_identifier); + identifierView.setText(AppPreferences.getAndroidIdentifier(getApplicationContext())); + TextView versionView = (TextView) findViewById(R.id.system_information_application_version); PackageInfo info = getPackageInfo(); if (info == null) { From 939d852a5956b8f9d7dcd5590c5e0cfb29f1a1a4 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Mon, 4 Nov 2013 02:30:07 +0100 Subject: [PATCH 053/450] cleaned up some imports --- .../sap/sailing/racecommittee/app/AppPreferences.java | 2 +- .../sailing/racecommittee/app/data/DataManager.java | 4 ++-- .../racecommittee/app/data/OnlineDataManager.java | 6 +++--- .../racecommittee/app/logging/FileLoggingTask.java | 4 ++-- .../app/ui/activities/SessionActivity.java | 10 +++++----- .../app/ui/adapters/finishing/CompetitorsAdapter.java | 6 +++--- .../ui/fragments/dialogs/AbortTypeSelectionDialog.java | 10 +++++----- .../racecommittee/app/ui/views/DigitalClock.java | 6 +++--- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java index 91ec7e0422a..37b1bf0e192 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java @@ -9,8 +9,8 @@ import android.preference.PreferenceManager; import android.provider.Settings.Secure; import android.util.Log; -import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.racecommittee.app.domain.coursedesign.BoatClassType; import com.sap.sailing.racecommittee.app.domain.coursedesign.CourseLayouts; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java index c345b12ea53..8e93a13c79f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java @@ -1,9 +1,9 @@ package com.sap.sailing.racecommittee.app.data; -import com.sap.sailing.racecommittee.app.AppConstants; - import android.content.Context; +import com.sap.sailing.racecommittee.app.AppConstants; + /** * Base class for all data managers. Use {@link DataManager#create(Context)} for creating your {@link DataManager}. */ diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index ad36d81d974..ca7d510b13b 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -26,10 +26,10 @@ import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.handlers.CompetitorsDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.CourseBaseHandler; import com.sap.sailing.racecommittee.app.data.handlers.DataHandler; +import com.sap.sailing.racecommittee.app.data.handlers.DeviceConfigurationDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.EventsDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.ManagedRacesDataHandler; import com.sap.sailing.racecommittee.app.data.handlers.MarksDataHandler; -import com.sap.sailing.racecommittee.app.data.handlers.DeviceConfigurationDataHandler; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderCallbacks; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderCallbacks.LoaderCreator; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; @@ -38,15 +38,15 @@ import com.sap.sailing.racecommittee.app.data.loaders.OnlineDataLoader; import com.sap.sailing.racecommittee.app.data.parsers.CompetitorsDataParser; import com.sap.sailing.racecommittee.app.data.parsers.CourseBaseParser; import com.sap.sailing.racecommittee.app.data.parsers.DataParser; +import com.sap.sailing.racecommittee.app.data.parsers.DeviceConfigurationParser; import com.sap.sailing.racecommittee.app.data.parsers.EventsDataParser; import com.sap.sailing.racecommittee.app.data.parsers.ManagedRacesDataParser; import com.sap.sailing.racecommittee.app.data.parsers.MarksDataParser; -import com.sap.sailing.racecommittee.app.data.parsers.DeviceConfigurationParser; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; -import com.sap.sailing.racecommittee.app.services.sending.EventSendingService; import com.sap.sailing.racecommittee.app.logging.ExLog; +import com.sap.sailing.racecommittee.app.services.sending.EventSendingService; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.coursedata.impl.ControlPointDeserializer; import com.sap.sailing.server.gateway.deserialization.coursedata.impl.CourseBaseDeserializer; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/logging/FileLoggingTask.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/logging/FileLoggingTask.java index 6343407f047..78b50e42c80 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/logging/FileLoggingTask.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/logging/FileLoggingTask.java @@ -11,11 +11,11 @@ import java.util.Date; import java.util.Locale; import java.util.concurrent.BlockingQueue; -import com.sap.sailing.racecommittee.app.AppConstants; - import android.os.Environment; import android.util.Log; +import com.sap.sailing.racecommittee.app.AppConstants; + public class FileLoggingTask implements Runnable { private final static String TAG = FileLoggingTask.class.getName(); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SessionActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SessionActivity.java index 0f2acc0f1d3..d59b966956b 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SessionActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SessionActivity.java @@ -1,16 +1,16 @@ package com.sap.sailing.racecommittee.app.ui.activities; -import com.sap.sailing.racecommittee.app.AppConstants; -import com.sap.sailing.racecommittee.app.R; -import com.sap.sailing.racecommittee.app.logging.ExLog; - import android.app.ActionBar; import android.app.AlertDialog; import android.content.DialogInterface; -import android.content.Intent; import android.content.DialogInterface.OnClickListener; +import android.content.Intent; import android.os.Bundle; +import com.sap.sailing.racecommittee.app.AppConstants; +import com.sap.sailing.racecommittee.app.R; +import com.sap.sailing.racecommittee.app.logging.ExLog; + public class SessionActivity extends BaseActivity { private static final String TAG = BaseActivity.class.getName(); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/finishing/CompetitorsAdapter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/finishing/CompetitorsAdapter.java index 3ea736cfa83..8492cd81678 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/finishing/CompetitorsAdapter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/finishing/CompetitorsAdapter.java @@ -2,9 +2,6 @@ package com.sap.sailing.racecommittee.app.ui.adapters.finishing; import java.util.List; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.racecommittee.app.R; - import android.content.Context; import android.view.LayoutInflater; import android.view.View; @@ -12,6 +9,9 @@ import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.racecommittee.app.R; + public class CompetitorsAdapter extends ArrayAdapter { public CompetitorsAdapter(Context context, int textViewResourceId, List competitors) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortTypeSelectionDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortTypeSelectionDialog.java index e50f8a5653e..91864f58965 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortTypeSelectionDialog.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortTypeSelectionDialog.java @@ -1,10 +1,5 @@ package com.sap.sailing.racecommittee.app.ui.fragments.dialogs; -import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.racecommittee.app.AppConstants; -import com.sap.sailing.racecommittee.app.R; -import com.sap.sailing.racecommittee.app.logging.ExLog; - import android.app.FragmentManager; import android.os.Bundle; import android.view.LayoutInflater; @@ -13,6 +8,11 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageButton; +import com.sap.sailing.domain.common.racelog.Flags; +import com.sap.sailing.racecommittee.app.AppConstants; +import com.sap.sailing.racecommittee.app.R; +import com.sap.sailing.racecommittee.app.logging.ExLog; + public class AbortTypeSelectionDialog extends RaceDialogFragment { private ImageButton apFlag; private ImageButton novemberFlag; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/views/DigitalClock.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/views/DigitalClock.java index cc7a58ea2d4..c42fc7fd72f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/views/DigitalClock.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/views/DigitalClock.java @@ -2,14 +2,14 @@ package com.sap.sailing.racecommittee.app.ui.views; import java.util.Calendar; -import com.sap.sailing.racecommittee.app.utils.TickListener; -import com.sap.sailing.racecommittee.app.utils.TickSingleton; - import android.content.Context; import android.text.format.DateFormat; import android.util.AttributeSet; import android.widget.TextView; +import com.sap.sailing.racecommittee.app.utils.TickListener; +import com.sap.sailing.racecommittee.app.utils.TickSingleton; + public class DigitalClock extends TextView implements TickListener { Calendar calendar = Calendar.getInstance(); From c0cbb177852ec9b05630ae8e28fd452dfa471a13 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Mon, 11 Nov 2013 00:58:31 +0100 Subject: [PATCH 054/450] # renamed StartProcedureType to RacingProcedureType # tested new Comparator including author --- ...dureType.java => RacingProcedureType.java} | 4 +- .../impl/DomainObjectFactoryImpl.java | 4 +- .../test/RaceLogEventComparatorTest.java | 78 +++++++++++++++---- .../domain/racelog/test/RaceLogTest.java | 72 ++++++++++++----- .../domain/racelog/RaceLogEventFactory.java | 6 +- .../racelog/RaceLogEventRestoreFactory.java | 4 +- .../RaceLogStartProcedureChangedEvent.java | 4 +- .../impl/RRS26StartModeFlagFinder.java | 10 +-- ....java => RacingProcedureTypeAnalyzer.java} | 8 +- .../racelog/impl/RaceLogEventComparator.java | 21 +++-- .../racelog/impl/RaceLogEventFactoryImpl.java | 6 +- .../impl/RaceLogEventRestoreFactoryImpl.java | 4 +- ...RaceLogStartProcedureChangedEventImpl.java | 8 +- .../gwt/ui/server/SailingServiceImpl.java | 8 +- .../sailing/gwt/ui/shared/RaceInfoDTO.java | 4 +- ...ingAndRetrievingRaceLogInLeaderboards.java | 4 +- ...tStoringAndRetrievingRaceLogInRegatta.java | 4 +- .../racelog/RaceLogEventSerializerTest.java | 4 +- ...tartProcedureChangedEventDeserializer.java | 4 +- .../racecommittee/app/AppPreferences.java | 6 +- .../app/data/OfflineDataManager.java | 8 +- .../data/parsers/ManagedRacesDataParser.java | 4 +- .../app/domain/impl/ManagedRaceImpl.java | 4 +- .../impl/StartProcedureFactory.java | 4 +- .../app/domain/state/RaceState.java | 6 +- .../app/domain/state/impl/RaceStateImpl.java | 20 ++--- .../app/ui/activities/SettingsActivity.java | 4 +- .../raceinfo/SetStartTimeRaceFragment.java | 16 ++-- .../lint.xml | 4 +- 29 files changed, 202 insertions(+), 131 deletions(-) rename java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/{StartProcedureType.java => RacingProcedureType.java} (78%) rename java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/{StartProcedureTypeAnalyzer.java => RacingProcedureTypeAnalyzer.java} (70%) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/StartProcedureType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/RacingProcedureType.java similarity index 78% rename from java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/StartProcedureType.java rename to java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/RacingProcedureType.java index 0bd82f959ba..6b4b7c7e13e 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/StartProcedureType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/RacingProcedureType.java @@ -1,13 +1,13 @@ package com.sap.sailing.domain.common.racelog; -public enum StartProcedureType { +public enum RacingProcedureType { RRS26("Fix Line Start (RRS26)"), GateStart("Gate Start"), ESS("\"Extreme Sailing Series\"-Start"); private String displayName; - private StartProcedureType(String displayName) { + private RacingProcedureType(String displayName) { this.displayName = displayName; } 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 260762ceb70..d760599ae93 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 @@ -73,7 +73,7 @@ import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.leaderboard.DelayedLeaderboardCorrections; import com.sap.sailing.domain.leaderboard.DelayedLeaderboardCorrections.LeaderboardCorrectionsResolvedListener; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; @@ -1097,7 +1097,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { private RaceLogEvent loadRaceLogStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { - StartProcedureType type = StartProcedureType.valueOf(dbObject.get(FieldNames.RACE_LOG_START_PROCEDURE_TYPE.name()).toString()); + RacingProcedureType type = RacingProcedureType.valueOf(dbObject.get(FieldNames.RACE_LOG_START_PROCEDURE_TYPE.name()).toString()); return raceLogEventFactory.createStartProcedureChangedEvent(createdAt, author, timePoint, id, competitors, passId, type); } 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 d947d06a9b4..e3186a2c666 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 @@ -10,12 +10,14 @@ import org.junit.Test; import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.impl.RaceLogEventComparator; public class RaceLogEventComparatorTest { private RaceLogEvent eventOne; private RaceLogEvent eventTwo; + private RaceLogEventAuthor author; private RaceLogEventComparator comparator; @@ -23,13 +25,15 @@ public class RaceLogEventComparatorTest { public void setUp() { eventOne = mock(RaceLogEvent.class); eventTwo = mock(RaceLogEvent.class); + author = mock(RaceLogEventAuthor.class); comparator = RaceLogEventComparator.INSTANCE; } @Test public void testEqualsOnSame() { - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(1)); + when(eventOne.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class)); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); when(eventOne.getId()).thenReturn("a"); int result = comparator.compare(eventOne, eventOne); @@ -37,12 +41,14 @@ public class RaceLogEventComparatorTest { } @Test - public void testSamePassAndSameTimeSameId() { + public void testSamePassAndSameAuthorAndSameTimeAndSameId() { when(eventOne.getPassId()).thenReturn(0); - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getAuthor()).thenReturn(author); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(0); - when(eventTwo.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getAuthor()).thenReturn(author); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventTwo.getId()).thenReturn("a"); int result = comparator.compare(eventOne, eventTwo); @@ -50,12 +56,14 @@ public class RaceLogEventComparatorTest { } @Test - public void testSamePassAndSameTimeDifferentId() { + public void testSamePassAndSameAuthorAndSameTimeButDifferentId() { when(eventOne.getPassId()).thenReturn(0); - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getAuthor()).thenReturn(author); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(0); - when(eventTwo.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getAuthor()).thenReturn(author); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventTwo.getId()).thenReturn("b"); int result = comparator.compare(eventOne, eventTwo); @@ -63,22 +71,58 @@ public class RaceLogEventComparatorTest { } @Test - public void testSamePassLowerHigherTime() { + public void testSamePassAndSameAuthorButLowerHigherTime() { when(eventOne.getPassId()).thenReturn(0); - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(1)); + when(eventOne.getAuthor()).thenReturn(author); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); when(eventTwo.getPassId()).thenReturn(0); - when(eventTwo.getTimePoint()).thenReturn(new MillisecondsTimePoint(2)); + when(eventTwo.getAuthor()).thenReturn(author); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2)); int result = comparator.compare(eventOne, eventTwo); assertTrue(result < 0); } @Test - public void testSamePassHigherLowerTime() { + public void testSamePassAndSameAuthorButHigherLowerTime() { when(eventOne.getPassId()).thenReturn(0); - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(2)); + when(eventOne.getAuthor()).thenReturn(author); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2)); when(eventTwo.getPassId()).thenReturn(0); - when(eventTwo.getTimePoint()).thenReturn(new MillisecondsTimePoint(1)); + when(eventTwo.getAuthor()).thenReturn(author); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); + + int result = comparator.compare(eventOne, eventTwo); + assertTrue(result > 0); + } + + @Test + public void testSamePassButLowerHigherAuthor() { + RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class); + when(minorAuthor.getPriority()).thenReturn(2); + RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class); + when(majorAuthor.getPriority()).thenReturn(1); + + when(eventOne.getPassId()).thenReturn(0); + when(eventOne.getAuthor()).thenReturn(minorAuthor); + when(eventTwo.getPassId()).thenReturn(0); + when(eventTwo.getAuthor()).thenReturn(majorAuthor); + + int result = comparator.compare(eventOne, eventTwo); + assertTrue(result < 0); + } + + @Test + public void testSamePassButHigherLowerAuthor() { + RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class); + when(minorAuthor.getPriority()).thenReturn(2); + RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class); + when(majorAuthor.getPriority()).thenReturn(1); + + when(eventOne.getPassId()).thenReturn(0); + when(eventOne.getAuthor()).thenReturn(majorAuthor); + when(eventTwo.getPassId()).thenReturn(0); + when(eventTwo.getAuthor()).thenReturn(minorAuthor); int result = comparator.compare(eventOne, eventTwo); assertTrue(result > 0); @@ -87,9 +131,9 @@ public class RaceLogEventComparatorTest { @Test public void testPassLowerHigher() { when(eventOne.getPassId()).thenReturn(0); - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(2)); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2)); when(eventTwo.getPassId()).thenReturn(1); - when(eventTwo.getTimePoint()).thenReturn(new MillisecondsTimePoint(1)); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); int result = comparator.compare(eventOne, eventTwo); assertTrue(result < 0); @@ -98,9 +142,9 @@ public class RaceLogEventComparatorTest { @Test public void testPassHigherLower() { when(eventOne.getPassId()).thenReturn(1); - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(1)); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); when(eventTwo.getPassId()).thenReturn(0); - when(eventTwo.getTimePoint()).thenReturn(new MillisecondsTimePoint(2)); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2)); 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/RaceLogTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RaceLogTest.java index ce1773c8a6f..cdf2790c846 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 @@ -18,6 +18,7 @@ import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEvent; +import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.impl.RaceLogImpl; @@ -59,15 +60,17 @@ public class RaceLogTest { } @Test - public void testAddEventDifferentPassSameTimePoint() { + public void testAddEventDifferentPassButSameTimePoint() { RaceLogEvent eventOne = mock(RaceLogEvent.class); RaceLogEvent eventTwo = mock(RaceLogEvent.class); when(eventOne.getPassId()).thenReturn(0); - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class)); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(1); - when(eventTwo.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getAuthor()).thenReturn(mock(RaceLogEventAuthor.class)); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventTwo.getId()).thenReturn("b"); assertTrue(raceLog.add(eventOne)); @@ -80,15 +83,18 @@ public class RaceLogTest { } @Test - public void testAddEventSamePassSameTimePointDifferentId() { + public void testAddEventSamePassAndSameAuthorAndSameTimePointButDifferentId() { RaceLogEvent eventOne = mock(RaceLogEvent.class); RaceLogEvent eventTwo = mock(RaceLogEvent.class); + RaceLogEventAuthor author = mock(RaceLogEventAuthor.class); when(eventOne.getPassId()).thenReturn(0); - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getAuthor()).thenReturn(author); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(0); - when(eventTwo.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getAuthor()).thenReturn(author); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventTwo.getId()).thenReturn("b"); assertTrue(raceLog.add(eventOne)); @@ -101,15 +107,18 @@ public class RaceLogTest { } @Test - public void testWontAddEventSamePassSameTimePointSameId() { + public void testWontAddEventSamePassAndSameAuthorAndSameTimePointAndSameId() { RaceLogEvent eventOne = mock(RaceLogEvent.class); RaceLogEvent eventTwo = mock(RaceLogEvent.class); + RaceLogEventAuthor author = mock(RaceLogEventAuthor.class); when(eventOne.getPassId()).thenReturn(0); - when(eventOne.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventOne.getAuthor()).thenReturn(author); + when(eventOne.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventOne.getId()).thenReturn("a"); when(eventTwo.getPassId()).thenReturn(0); - when(eventTwo.getTimePoint()).thenReturn(new MillisecondsTimePoint(0)); + when(eventTwo.getAuthor()).thenReturn(author); + when(eventTwo.getCreatedAt()).thenReturn(new MillisecondsTimePoint(0)); when(eventTwo.getId()).thenReturn("a"); assertTrue(raceLog.add(eventOne)); @@ -151,19 +160,26 @@ public class RaceLogTest { RaceLogEvent event1 = mock(RaceLogEvent.class); RaceLogEvent event2 = mock(RaceLogEvent.class); RaceLogEvent event3 = mock(RaceLogEvent.class); + RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class); + when(minorAuthor.getPriority()).thenReturn(3); + RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class); + when(majorAuthor.getPriority()).thenReturn(1); - when(event1.getTimePoint()).thenReturn(new MillisecondsTimePoint(1)); - when(event2.getTimePoint()).thenReturn(new MillisecondsTimePoint(2)); - when(event3.getTimePoint()).thenReturn(new MillisecondsTimePoint(3)); + when(event1.getAuthor()).thenReturn(majorAuthor); + when(event1.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); + when(event2.getAuthor()).thenReturn(minorAuthor); + when(event2.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2)); + when(event3.getAuthor()).thenReturn(minorAuthor); + when(event3.getCreatedAt()).thenReturn(new MillisecondsTimePoint(3)); raceLog.add(event1); raceLog.add(event2); raceLog.add(event3); raceLog.lockForRead(); - assertEquals(event3, Util.get(raceLog.getRawFixesDescending(), 0)); - assertEquals(event2, Util.get(raceLog.getRawFixesDescending(), 1)); - assertEquals(event1, Util.get(raceLog.getRawFixesDescending(), 2)); + assertEquals(event1, Util.get(raceLog.getRawFixesDescending(), 0)); + assertEquals(event3, Util.get(raceLog.getRawFixesDescending(), 1)); + assertEquals(event2, Util.get(raceLog.getRawFixesDescending(), 2)); raceLog.unlockAfterRead(); } @@ -172,21 +188,35 @@ public class RaceLogTest { RaceLogEvent event1 = mock(RaceLogEvent.class); RaceLogEvent event2 = mock(RaceLogEvent.class); RaceLogEvent event3 = mock(RaceLogEvent.class); + RaceLogEvent event4 = mock(RaceLogEvent.class); + RaceLogEventAuthor minorAuthor = mock(RaceLogEventAuthor.class); + when(minorAuthor.getPriority()).thenReturn(3); + RaceLogEventAuthor majorAuthor = mock(RaceLogEventAuthor.class); + when(majorAuthor.getPriority()).thenReturn(1); when(event1.getPassId()).thenReturn(1); - when(event1.getTimePoint()).thenReturn(new MillisecondsTimePoint(1)); + when(event1.getAuthor()).thenReturn(majorAuthor); + when(event1.getCreatedAt()).thenReturn(new MillisecondsTimePoint(1)); when(event2.getPassId()).thenReturn(1); - when(event2.getTimePoint()).thenReturn(new MillisecondsTimePoint(2)); - when(event3.getPassId()).thenReturn(0); - when(event3.getTimePoint()).thenReturn(new MillisecondsTimePoint(3)); + when(event2.getAuthor()).thenReturn(minorAuthor); + when(event2.getCreatedAt()).thenReturn(new MillisecondsTimePoint(2)); + when(event3.getPassId()).thenReturn(1); + when(event3.getAuthor()).thenReturn(minorAuthor); + when(event3.getCreatedAt()).thenReturn(new MillisecondsTimePoint(3)); + when(event4.getPassId()).thenReturn(0); + when(event4.getAuthor()).thenReturn(majorAuthor); + when(event4.getCreatedAt()).thenReturn(new MillisecondsTimePoint(4)); raceLog.add(event1); raceLog.add(event2); raceLog.add(event3); + raceLog.add(event4); raceLog.lockForRead(); - assertEquals(event2, Util.get(raceLog.getFixesDescending(), 0)); - assertEquals(event1, Util.get(raceLog.getFixesDescending(), 1)); + assertEquals(3, Util.size(raceLog.getFixesDescending())); + assertEquals(event1, Util.get(raceLog.getFixesDescending(), 0)); + assertEquals(event3, Util.get(raceLog.getFixesDescending(), 1)); + assertEquals(event2, Util.get(raceLog.getFixesDescending(), 2)); raceLog.unlockAfterRead(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java index a3de5bce368..48f83f727b1 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventFactory.java @@ -10,7 +10,7 @@ import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.impl.RaceLogEventFactoryImpl; import com.sap.sailing.domain.tracking.Wind; @@ -75,10 +75,10 @@ public interface RaceLogEventFactory { int passId, Long gateLineOpeningTimeInMillis); RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, - Serializable id, List competitors, int passId, StartProcedureType type); + Serializable id, List competitors, int passId, RacingProcedureType type); RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, - int passId, StartProcedureType type); + int passId, RacingProcedureType type); RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint timePoint, RaceLogEventAuthor author, Serializable id, List competitors, int passId, TimePoint protestStartTime); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java index b8fe469e3ff..a891c7d4d66 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogEventRestoreFactory.java @@ -10,7 +10,7 @@ import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.impl.RaceLogEventRestoreFactoryImpl; import com.sap.sailing.domain.tracking.Wind; @@ -50,7 +50,7 @@ public interface RaceLogEventRestoreFactory extends RaceLogEventFactory { TimePoint logicalTimePoint, Serializable id, List competitors, int passId, Long gateLineOpeningTime); RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, - TimePoint timePoint, Serializable id, List competitors, int passId, StartProcedureType type); + TimePoint timePoint, Serializable id, List competitors, int passId, RacingProcedureType type); RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, Serializable id, List competitors, int passId, TimePoint protestStartTime); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartProcedureChangedEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartProcedureChangedEvent.java index 01cc4f46a61..85ee71f1297 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartProcedureChangedEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/RaceLogStartProcedureChangedEvent.java @@ -1,9 +1,9 @@ package com.sap.sailing.domain.racelog; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; public interface RaceLogStartProcedureChangedEvent extends RaceLogEvent { - StartProcedureType getStartProcedureType(); + RacingProcedureType getStartProcedureType(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java index 2837c899871..c554fd45e58 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RRS26StartModeFlagFinder.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Arrays; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent; @@ -12,7 +12,7 @@ import com.sap.sailing.domain.racelog.RaceLogFlagEvent; public class RRS26StartModeFlagFinder extends RaceLogAnalyzer { private final List startModeFlags = Arrays.asList(Flags.PAPA, Flags.ZULU, Flags.BLACK, Flags.INDIA); - private StartProcedureTypeAnalyzer procedureAnalyzer; + private RacingProcedureTypeAnalyzer procedureAnalyzer; /** * Searches for the start mode flag of a RRS26 race. @@ -21,7 +21,7 @@ public class RRS26StartModeFlagFinder extends RaceLogAnalyzer { * to be used to ensure a RRS26 race. Must operate on the same race log. Otherwise a * {@link IllegalArgumentException} is thrown. */ - public RRS26StartModeFlagFinder(StartProcedureTypeAnalyzer procedureAnalyzer, RaceLog raceLog) { + public RRS26StartModeFlagFinder(RacingProcedureTypeAnalyzer procedureAnalyzer, RaceLog raceLog) { super(raceLog); if (raceLog != procedureAnalyzer.getRaceLog()) { throw new IllegalArgumentException("Both analyzers must operate on the same race log."); @@ -31,8 +31,8 @@ public class RRS26StartModeFlagFinder extends RaceLogAnalyzer { @Override protected Flags performAnalysis() { - StartProcedureType type = procedureAnalyzer.analyze(); - if (StartProcedureType.RRS26.equals(type)) { + RacingProcedureType type = procedureAnalyzer.analyze(); + if (RacingProcedureType.RRS26.equals(type)) { for (RaceLogEvent event : getPassEventsDescending()) { if (event instanceof RaceLogFlagEvent) { RaceLogFlagEvent flagEvent = (RaceLogFlagEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartProcedureTypeAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RacingProcedureTypeAnalyzer.java similarity index 70% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartProcedureTypeAnalyzer.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RacingProcedureTypeAnalyzer.java index 8d6bfc7db5a..ba23a9ab451 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/StartProcedureTypeAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/analyzing/impl/RacingProcedureTypeAnalyzer.java @@ -1,18 +1,18 @@ package com.sap.sailing.domain.racelog.analyzing.impl; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; -public class StartProcedureTypeAnalyzer extends RaceLogAnalyzer { +public class RacingProcedureTypeAnalyzer extends RaceLogAnalyzer { - public StartProcedureTypeAnalyzer(RaceLog raceLog) { + public RacingProcedureTypeAnalyzer(RaceLog raceLog) { super(raceLog); } @Override - protected StartProcedureType performAnalysis() { + protected RacingProcedureType performAnalysis() { for (RaceLogEvent event : getAllEventsDescending()) { if (event instanceof RaceLogStartProcedureChangedEvent) { RaceLogStartProcedureChangedEvent startProcedureEvent = (RaceLogStartProcedureChangedEvent) event; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventComparator.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventComparator.java index f7e1bb326b2..db7b74affe9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventComparator.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventComparator.java @@ -5,38 +5,35 @@ import java.util.Comparator; import com.sap.sailing.domain.base.Timed; import com.sap.sailing.domain.racelog.RaceLogEvent; -import com.sap.sailing.domain.tracking.impl.TimedComparator; public enum RaceLogEventComparator implements Comparator, Serializable { INSTANCE; - private Comparator timedComparator; - - private RaceLogEventComparator() { - 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); + throw new UnsupportedOperationException("Must provide objects of type " + RaceLogEvent.class.getName()); } private int compareEvents(RaceLogEvent e1, RaceLogEvent e2) { int result = comparePasses(e1, e2); - return result == 0 ? compareTimes(e1, e2) : result; + return result == 0 ? comparePriorities(e1, e2) : result; } private int comparePasses(RaceLogEvent e1, RaceLogEvent e2) { return e1.getPassId() - e2.getPassId(); } + + private int comparePriorities(RaceLogEvent e1, RaceLogEvent e2) { + int result = new Integer(e2.getAuthor().getPriority()).compareTo(e1.getAuthor().getPriority()); + return result == 0 ? compareCreatedAtTimes(e1, e2) : result; + } - private int compareTimes(RaceLogEvent e1, RaceLogEvent e2) { - int result = timedComparator.compare(e1, e2); + private int compareCreatedAtTimes(RaceLogEvent e1, RaceLogEvent e2) { + int result = e1.getCreatedAt().compareTo(e2.getCreatedAt()); return result == 0 ? compareIds(e1, e2) : result; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java index c4fb3dc3b64..06456768f9f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventFactoryImpl.java @@ -13,7 +13,7 @@ import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEventAuthor; @@ -165,14 +165,14 @@ public class RaceLogEventFactoryImpl implements RaceLogEventFactory { @Override public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, - Serializable id, List competitors, int passId, StartProcedureType type) { + Serializable id, List competitors, int passId, RacingProcedureType type) { return new RaceLogStartProcedureChangedEventImpl(MillisecondsTimePoint.now(), author, timePoint, id, competitors, passId, type); } @Override public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint timePoint, RaceLogEventAuthor author, - int passId, StartProcedureType type) { + int passId, RacingProcedureType type) { return createStartProcedureChangedEvent(timePoint, author, UUID.randomUUID(), new ArrayList(), passId, type); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java index c6a36a51ab8..d51cd01cdc0 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogEventRestoreFactoryImpl.java @@ -10,7 +10,7 @@ import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.racelog.RaceLogEventAuthor; @@ -92,7 +92,7 @@ public class RaceLogEventRestoreFactoryImpl extends RaceLogEventFactoryImpl impl @Override public RaceLogStartProcedureChangedEvent createStartProcedureChangedEvent(TimePoint createdAt, RaceLogEventAuthor author, - TimePoint timePoint, Serializable id, List competitors, int passId, StartProcedureType type) { + TimePoint timePoint, Serializable id, List competitors, int passId, RacingProcedureType type) { return new RaceLogStartProcedureChangedEventImpl(createdAt, author, timePoint, id, competitors, passId, type); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java index 0fdd53102a8..0f85f2b7572 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelog/impl/RaceLogStartProcedureChangedEventImpl.java @@ -5,7 +5,7 @@ import java.util.List; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent; @@ -15,17 +15,17 @@ public class RaceLogStartProcedureChangedEventImpl extends RaceLogEventImpl impl private static final long serialVersionUID = -8102049547516570034L; - private final StartProcedureType startProcedureType; + private final RacingProcedureType startProcedureType; public RaceLogStartProcedureChangedEventImpl(TimePoint createdAt, RaceLogEventAuthor author, - TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, StartProcedureType startProcedureType) { + TimePoint pTimePoint, Serializable pId, List pInvolvedBoats, int pPassId, RacingProcedureType startProcedureType) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.startProcedureType = startProcedureType; } @Override - public StartProcedureType getStartProcedureType() { + public RacingProcedureType getStartProcedureType() { return startProcedureType; } 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 26830218e25..56a8e99a4e4 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 @@ -132,7 +132,7 @@ import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; @@ -159,7 +159,7 @@ import com.sap.sailing.domain.racelog.analyzing.impl.PathfinderFinder; import com.sap.sailing.domain.racelog.analyzing.impl.ProtestStartTimeFinder; import com.sap.sailing.domain.racelog.analyzing.impl.RRS26StartModeFlagFinder; import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer; -import com.sap.sailing.domain.racelog.analyzing.impl.StartProcedureTypeAnalyzer; +import com.sap.sailing.domain.racelog.analyzing.impl.RacingProcedureTypeAnalyzer; import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder; import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration; @@ -708,8 +708,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } private void fillStartProcedureSpecifics(RaceInfoDTO raceInfoDTO, RaceLog raceLog) { - StartProcedureTypeAnalyzer procedureAnalyzer = new StartProcedureTypeAnalyzer(raceLog); - StartProcedureType type = procedureAnalyzer.analyze(); + RacingProcedureTypeAnalyzer procedureAnalyzer = new RacingProcedureTypeAnalyzer(raceLog); + RacingProcedureType type = procedureAnalyzer.analyze(); if (type != null) { raceInfoDTO.startProcedure = type; RaceInfoExtensionDTO info = null; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceInfoDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceInfoDTO.java index eebf534abec..485186a356e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceInfoDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceInfoDTO.java @@ -6,7 +6,7 @@ import com.google.gwt.user.client.rpc.IsSerializable; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; public class RaceInfoDTO implements IsSerializable { public interface RaceInfoExtensionDTO extends IsSerializable { @@ -55,7 +55,7 @@ public class RaceInfoDTO implements IsSerializable { public RaceCourseDTO lastCourseDesign; public String lastCourseName; public WindDTO lastWind; - public StartProcedureType startProcedure; + public RacingProcedureType startProcedure; public RaceInfoExtensionDTO startProcedureDTO; // for GWT serialization diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index c6c270bb391..8579e87964f 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -27,7 +27,7 @@ import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; @@ -124,7 +124,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogStartProcedureChangedEvent() { - RaceLogStartProcedureChangedEvent expectedEvent = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(now, author, 0, StartProcedureType.ESS); + RaceLogStartProcedureChangedEvent expectedEvent = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(now, author, 0, RacingProcedureType.ESS); addAndStoreRaceLogEvent(leaderboard, raceColumnName, expectedEvent); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index e09c807675d..bf6a73a0823 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -36,7 +36,7 @@ import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoFactory; @@ -157,7 +157,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogStartProcedureChangedEvent() { - RaceLogStartProcedureChangedEvent expectedEvent = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(now, author, 0, StartProcedureType.ESS); + RaceLogStartProcedureChangedEvent expectedEvent = RaceLogEventFactory.INSTANCE.createStartProcedureChangedEvent(now, author, 0, RacingProcedureType.ESS); addAndStoreRaceLogEvent(regatta, raceColumnName, expectedEvent); diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index 24efbbd2ee2..2d6f9b550f0 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -7,7 +7,7 @@ import org.junit.Before; import org.junit.Test; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; @@ -145,7 +145,7 @@ public class RaceLogEventSerializerTest { @Test public void testStartProcedureTypeChangedSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createStartProcedureChangedEvent(null, author, 0, StartProcedureType.ESS); + RaceLogEvent event = factory.createStartProcedureChangedEvent(null, author, 0, RacingProcedureType.ESS); serializer.serialize(event); verify(startProcedureTypeChangedEventSerializer).serialize(event); } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java index 6172a0daeb1..50e8f72f564 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogStartProcedureChangedEventDeserializer.java @@ -7,7 +7,7 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.TimePoint; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; @@ -23,7 +23,7 @@ public class RaceLogStartProcedureChangedEventDeserializer extends BaseRaceLogEv @Override protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, RaceLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { - StartProcedureType type = StartProcedureType.valueOf(object.get(RaceLogStartProcedureChangedEventSerializer.FIELD_START_PROCEDURE_TYPE).toString()); + RacingProcedureType type = RacingProcedureType.valueOf(object.get(RaceLogStartProcedureChangedEventSerializer.FIELD_START_PROCEDURE_TYPE).toString()); return factory.createStartProcedureChangedEvent(createdAt, author, timePoint, id, competitors, passId, type); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java index 37b1bf0e192..d65761e1d5c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java @@ -9,7 +9,7 @@ import android.preference.PreferenceManager; import android.provider.Settings.Secure; import android.util.Log; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl; import com.sap.sailing.racecommittee.app.domain.coursedesign.BoatClassType; @@ -222,10 +222,10 @@ public class AppPreferences { sp.edit().putString(PREFERENCE_MIN_ROUNDS, String.valueOf(minRounds)).commit(); } - public static StartProcedureType getDefaultStartProcedureType(Context context) { + public static RacingProcedureType getDefaultStartProcedureType(Context context) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); String defaultStartProcedureType = sp.getString(PREFERENCE_DEFAULT_START_PROCEDURE_TYPE, "RRS26"); - StartProcedureType type = StartProcedureType.valueOf(defaultStartProcedureType); + RacingProcedureType type = RacingProcedureType.valueOf(defaultStartProcedureType); return type; } 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 0e48de3d988..7fc4be5fd9d 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 @@ -31,7 +31,7 @@ import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl; import com.sap.sailing.domain.base.racegroup.impl.SeriesWithRowsImpl; import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLogEventAuthor; import com.sap.sailing.domain.racelog.RaceLogEventFactory; @@ -91,7 +91,7 @@ public class OfflineDataManager extends DataManager { 1, RaceLogRaceStatus.FINISHING)); ManagedRace q1 = new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl("A.B", new FleetImpl("A"), qualifying, - raceGroup), StartProcedureType.ESS, log); + raceGroup), RacingProcedureType.ESS, log); log = new RaceLogImpl(UUID.randomUUID()); /* @@ -100,7 +100,7 @@ public class OfflineDataManager extends DataManager { */ ManagedRace q2 = new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl("B", new FleetImpl("A.A"), qualifying, - raceGroup), StartProcedureType.ESS, log); + raceGroup), RacingProcedureType.ESS, log); log = new RaceLogImpl(UUID.randomUUID()); /* @@ -108,7 +108,7 @@ public class OfflineDataManager extends DataManager { * RaceLogRaceStatus.FINISHED)); */ ManagedRace q3 = new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl("Q3", new FleetImpl("Default"), qualifying, - raceGroup), StartProcedureType.ESS, log); + raceGroup), RacingProcedureType.ESS, log); /* * ManagedRace m1 = new ManagedRaceImpl( new ManagedRaceIdentifierImpl( "M1", new FleetImpl("Default"), medal, * raceGroup), null); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java index ae1a0079d85..8ddfbe07b06 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/parsers/ManagedRacesDataParser.java @@ -16,7 +16,7 @@ import com.sap.sailing.domain.base.racegroup.RaceCell; import com.sap.sailing.domain.base.racegroup.RaceGroup; import com.sap.sailing.domain.base.racegroup.RaceRow; import com.sap.sailing.domain.base.racegroup.SeriesWithRows; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.domain.ManagedRace; @@ -66,7 +66,7 @@ public class ManagedRacesDataParser implements DataParser entries = new ArrayList(); List entryValues = new ArrayList(); - for (StartProcedureType type : StartProcedureType.values()) { + for (RacingProcedureType type : RacingProcedureType.values()) { entries.add(type.toString()); entryValues.add(type.name()); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/SetStartTimeRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/SetStartTimeRaceFragment.java index cb3b7ee5bf0..bb4d9ff188c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/SetStartTimeRaceFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/SetStartTimeRaceFragment.java @@ -23,7 +23,7 @@ import android.widget.TimePicker; import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.racelog.Flags; -import com.sap.sailing.domain.common.racelog.StartProcedureType; +import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.domain.ManagedRace; @@ -43,7 +43,7 @@ public class SetStartTimeRaceFragment extends RaceFragment implements UserRequir } protected boolean isReset; - private StartProcedureType selectedStartProcedureType; + private RacingProcedureType selectedStartProcedureType; protected Spinner spinnerStartProcedure; protected TimePicker pickerTime; @@ -142,13 +142,13 @@ public class SetStartTimeRaceFragment extends RaceFragment implements UserRequir } private void setupStartProcedureSpinner() { - ArrayAdapter adapter = new ArrayAdapter(getActivity(), - android.R.layout.simple_spinner_dropdown_item, StartProcedureType.values()); + ArrayAdapter adapter = new ArrayAdapter(getActivity(), + android.R.layout.simple_spinner_dropdown_item, RacingProcedureType.values()); spinnerStartProcedure.setAdapter(adapter); spinnerStartProcedure.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView adapterView, View view, int position, long id) { - selectedStartProcedureType = (StartProcedureType) adapterView.getItemAtPosition(position); + selectedStartProcedureType = (RacingProcedureType) adapterView.getItemAtPosition(position); } @Override @@ -157,12 +157,12 @@ public class SetStartTimeRaceFragment extends RaceFragment implements UserRequir }); //TODO read the preferences from AppPreferences - StartProcedureType type = StartProcedureType.ESS; + RacingProcedureType type = RacingProcedureType.ESS; boolean overrideStartProcedureType = PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean( "overrideDefaultStartProcedureType", false); if (overrideStartProcedureType) { - type = StartProcedureType.valueOf(PreferenceManager.getDefaultSharedPreferences(getActivity()).getString( - "defaultStartProcedureType", StartProcedureType.ESS.name())); + type = RacingProcedureType.valueOf(PreferenceManager.getDefaultSharedPreferences(getActivity()).getString( + "defaultStartProcedureType", RacingProcedureType.ESS.name())); } else { type = getRace().getState().getStartProcedureType(); } diff --git a/mobile/com.sap.sailing.racecommittee.glue/lint.xml b/mobile/com.sap.sailing.racecommittee.glue/lint.xml index 694ca087b0a..ee0eead5bb7 100644 --- a/mobile/com.sap.sailing.racecommittee.glue/lint.xml +++ b/mobile/com.sap.sailing.racecommittee.glue/lint.xml @@ -1,3 +1,3 @@ - - + + \ No newline at end of file From dac0fd3494eb99fe9f5e80cd1f77cb31a0c382ca Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Mon, 11 Nov 2013 03:27:10 +0100 Subject: [PATCH 055/450] # added SharedDomainFactoryImpl implementing SharedDomainFactory # DomainFactoryImpl extends SharedDomainFactoryImpl (code reuse) # Split SharedDomainFactory and CompetitorStore interfaces (no more forwarding) --- .../impl/DomainObjectFactoryImpl.java | 2 +- .../sailing/domain/base/CompetitorStore.java | 85 +++++ .../domain/base/SharedDomainFactory.java | 8 +- .../base/impl/SharedDomainFactoryImpl.java | 299 +++++++++++++++++ .../impl/TransientCompetitorStoreImpl.java | 16 +- .../impl/DomainFactoryImpl.java | 8 +- .../impl/DomainFactoryImpl.java | 8 +- .../domain/base/impl/DomainFactoryImpl.java | 304 +----------------- ...ingAndRetrievingRaceLogInLeaderboards.java | 4 +- ...tStoringAndRetrievingRaceLogInRegatta.java | 4 +- .../test/CompetitorJsonSerializerTest.java | 2 +- ...sitioningConfirmedEventSerializerTest.java | 2 +- .../RaceLogWindFixEventSerializerTest.java | 2 +- .../impl/CompetitorJsonDeserializer.java | 16 +- .../CompetitorMasterDataDeserializer.java | 2 +- .../impl/RaceLogEventDeserializer.java | 2 +- .../test/CompetitorReplicationTest.java | 2 +- .../TrackedRaceContentsReplicationTest.java | 2 +- .../server/test/MasterDataImportTest.java | 14 +- .../server/test/WindByRaceLogTest.java | 2 +- .../server/impl/RaceLogScoringReplicator.java | 2 +- .../CreatePersistentCompetitor.java | 2 +- .../app/data/OnlineDataManager.java | 3 +- .../racelog/impl/RaceLogEventsCallback.java | 1 - .../sending/EventPersistenceManager.java | 1 - .../app/services/sending/RaceEventSender.java | 1 + .../dialogs/PositioningFragment.java | 1 - 27 files changed, 443 insertions(+), 352 deletions(-) create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorStore.java create mode 100644 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java rename java/{com.sap.sailing.domain => com.sap.sailing.domain.shared.android}/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java (92%) 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 1c63ab69968..603f78873d5 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 @@ -1196,7 +1196,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { List competitors = new ArrayList(); for (Object object : dbCompetitorList) { Serializable competitorId = (Serializable) object; - Competitor competitor = baseDomainFactory.getExistingCompetitorById(competitorId); + Competitor competitor = baseDomainFactory.getCompetitorStore().getExistingCompetitorById(competitorId); competitors.add(competitor); } return competitors; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorStore.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorStore.java new file mode 100644 index 00000000000..8458da5a167 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/CompetitorStore.java @@ -0,0 +1,85 @@ +package com.sap.sailing.domain.base; + +import java.io.Serializable; +import java.util.UUID; + +import com.sap.sailing.domain.base.impl.DynamicBoat; +import com.sap.sailing.domain.base.impl.DynamicCompetitor; +import com.sap.sailing.domain.base.impl.DynamicTeam; +import com.sap.sailing.domain.common.dto.CompetitorDTO; + +/** + * Manages a set of {@link Competitor} objects. There may be a transient implementation based on a simple cache, + * and there may be persistent implementations. + * + * @author Axel Uhl (d043530) + * + */ +public interface CompetitorStore { + /** + * If a valid competitor is returned and the caller has information available that could be used to update the competitor, + * the caller must check the result of {@link #isCompetitorToUpdateDuringGetOrCreate(Competitor)}, and if true, + * must call {@link #getOrCreateCompetitor(Serializable, String, DynamicTeam, DynamicBoat)} to cause an update of the + * competitor's values. + */ + Competitor getExistingCompetitorById(Serializable competitorId); + + /** + * If a valid competitor is returned and the caller has information available that could be used to update the competitor, + * the caller must check the result of {@link #isCompetitorToUpdateDuringGetOrCreate(Competitor)}, and if true, + * must call {@link #getOrCreateCompetitor(Serializable, String, DynamicTeam, DynamicBoat)} to cause an update of the + * competitor's values. + */ + Competitor getExistingCompetitorByIdAsString(String idAsString); + + /** + * Checks if the competitor shall be updated from the default provided by, e.g., a tracking infrastructure. + * Callers of {@link #getExistingCompetitorById(Serializable)} or {@link #getExistingCompetitorByIdAsString(String)} + * must call this method in case they retrieve a valid competitor by ID and have data available that can be used to update + * the competitor. + */ + boolean isCompetitorToUpdateDuringGetOrCreate(Competitor result); + + Competitor getOrCreateCompetitor(Serializable competitorId, String name, DynamicTeam team, DynamicBoat boat); + + DynamicCompetitor getOrCreateDynamicCompetitor(UUID fromString, String name, DynamicTeam team, DynamicBoat boat); + + /** + * When a competitor is queried using {@link #getOrCreateCompetitor(Serializable, String, DynamicTeam, DynamicBoat)} + * , and the competitor object for that ID already exists, it is generally returned unchanged, and the name, team + * and boat parameters are not evaluated. This makes the data in this competitor store generally "write-once." This + * method can be used to reset a competitor object to what a tracking provider or an external system supplies to + * {@link #getOrCreateCompetitor(Serializable, String, DynamicTeam, DynamicBoat)}. After calling this method, the + * next call to {@link #getOrCreateCompetitor(Serializable, String, DynamicTeam, DynamicBoat)} with + * competitor's {@link Competitor#getId() ID} will + * {@link #updateCompetitor(String, String, String, Nationality)} the competitor in its updatable properties such as + * the name, the sail ID and the nationality. + */ + void allowCompetitorResetToDefaults(Competitor competitor); + + int size(); + + /** + * Removes all competitors from this store. Use with due care. + */ + void clear(); + + /** + * Obtains a non-live snapshot of the list of competitors managed by this store. + */ + Iterable getCompetitors(); + + void removeCompetitor(Competitor competitor); + + /** + * Updates the competitor with {@link Competitor#getId() ID} id by setting the name, sail ID and nationality to + * the values provided. Doing so will not fire any events nor will it replicate this change from a master to any replicas. + * The calling client has to make sure that the changes applied will reach replicas and all other interested clients. It will + * be sufficient to ensure that subsequent DTOs produced from the competitor modified will reflect the changes.

+ * + * If no competitor with the ID requested is found, the call is a no-op, doing nothing, not even throwing an exception. + */ + Competitor updateCompetitor(String idAsString, String newName, String newSailId, Nationality newNationality); + + CompetitorDTO convertToCompetitorDTO(Competitor c); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java index fe540d2ebbe..5cf9a7a5a85 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SharedDomainFactory.java @@ -74,12 +74,8 @@ public interface SharedDomainFactory { */ BoatClass getOrCreateBoatClass(String name); - Competitor getExistingCompetitorById(Serializable competitorId); - - Competitor createCompetitor(Serializable id, String name, Team team, Boat boat); - - Competitor getOrCreateCompetitor(Serializable competitorId, String name, Team team, Boat boat); - + CompetitorStore getCompetitorStore(); + CourseArea getOrCreateCourseArea(Serializable courseAreaId, String name); CourseArea getExistingCourseAreaById(Serializable courseAreaId); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java new file mode 100644 index 00000000000..6e35f483af8 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java @@ -0,0 +1,299 @@ +package com.sap.sailing.domain.base.impl; + +import java.io.Serializable; +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import com.sap.sailing.domain.base.BoatClass; +import com.sap.sailing.domain.base.CompetitorStore; +import com.sap.sailing.domain.base.ControlPoint; +import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.Gate; +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.Nationality; +import com.sap.sailing.domain.base.SharedDomainFactory; +import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher.Type; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherMulti; +import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle; +import com.sap.sailing.domain.common.MarkType; +import com.sap.sailing.domain.common.NauticalSide; +import com.sap.sailing.domain.common.WithID; + +public class SharedDomainFactoryImpl implements SharedDomainFactory { + + /** + * Ensure that the same string is used as key that is also used to set the {@link Nationality} + * object's {@link Nationality#getThreeLetterIOCAcronym() IOC code}. + */ + private final Map nationalityCache; + + private final Map markCache; + + /** + * For all marks ever created by this factory, the mark {@link WithID#getId() ID}'s string representation + * is mapped here to the actual ID. This allows clients to send only the string representation to the server + * and still be able to identify a mark uniquely this way. + */ + private final Map markIdCache; + + private final Map boatClassCache; + + protected final CompetitorStore competitorStore; + + private final Map courseAreaCache; + + /** + * Weakly references the waypoints. If a waypoint is no longer strongly referenced, the corresponding reference contained + * as value will have its referred object be null. In this case, the methods reading from this cache will purge + * the record and behave as if the record hadn't existed at the time of the read operation. + */ + private final ConcurrentHashMap waypointCache; + + private final ReferenceQueue waypointCacheReferenceQueue; + + private final Map configurationMatcherCache; + + /** + * Weak references to {@link Waypoint} objects of this type are registered with + * {@link DomainFactoryImpl#waypointCacheReferenceQueue} upon construction so that when their referents are no + * longer strongly referenced and the reference was nulled, they are entered into that queue. + * Methods managing the {@link #waypointCache} can poll the queue and then remove cache entries based on + * the {@link #id} stored in the reference. + * + * @author Axel Uhl (D043530) + * + */ + private class WeakWaypointReference extends WeakReference { + private final Serializable id; + + public WeakWaypointReference(Waypoint waypoint) { + super(waypoint, waypointCacheReferenceQueue); + this.id = waypoint.getId(); + } + + public void removeCacheEntry() { + waypointCache.remove(id); + } + } + + private final Set mayStartWithNoUpwindLeg; + + /** + * Uses a transient competitor store + */ + public SharedDomainFactoryImpl() { + this(new TransientCompetitorStoreImpl()); + } + + public SharedDomainFactoryImpl(CompetitorStore competitorStore) { + waypointCacheReferenceQueue = new ReferenceQueue(); + nationalityCache = new HashMap(); + markCache = new HashMap(); + markIdCache = new HashMap(); + boatClassCache = new HashMap(); + this.competitorStore = competitorStore; + waypointCache = new ConcurrentHashMap(); + mayStartWithNoUpwindLeg = new HashSet(Arrays.asList(new String[] { "extreme40", "ess", "ess40" })); + courseAreaCache = new HashMap(); + configurationMatcherCache = new HashMap(); + } + + @Override + public Nationality getOrCreateNationality(String threeLetterIOCCode) { + synchronized (nationalityCache) { + Nationality result = nationalityCache.get(threeLetterIOCCode); + if (result == null) { + result = new NationalityImpl(threeLetterIOCCode); + nationalityCache.put(threeLetterIOCCode, result); + } + return result; + } + } + + @Override + public Mark getOrCreateMark(String name) { + return getOrCreateMark(name, name); + } + + @Override + public Mark getOrCreateMark(Serializable id, String name) { + Mark result = markCache.get(id); + if (result == null) { + result = new MarkImpl(id, name); + cacheMark(id, result); + } + return result; + } + + @Override + public Mark getOrCreateMark(String toStringRepresentationOfID, String name) { + final Mark result; + if (markIdCache.containsKey(toStringRepresentationOfID)) { + Serializable id = markIdCache.get(toStringRepresentationOfID); + result = getOrCreateMark(id, name); + } else { + result = new MarkImpl(toStringRepresentationOfID, name); + cacheMark(toStringRepresentationOfID, result); + } + return result; + } + + private void cacheMark(Serializable id, Mark result) { + markCache.put(id, result); + markIdCache.put(id.toString(), id); + } + + + + @Override + public Mark getOrCreateMark(Serializable id, String name, MarkType type, String color, String shape, String pattern) { + Mark result = markCache.get(id); + if (result == null) { + result = new MarkImpl(id, name, type, color, shape, pattern); + cacheMark(id, result); + } + return result; + } + + @Override + public Gate createGate(Mark left, Mark right, String name) { + return new GateImpl(left, right, name); + } + + @Override + public Gate createGate(Serializable id, Mark left, Mark right, String name) { + return new GateImpl(id, left, right, name); + } + + @Override + public Waypoint createWaypoint(ControlPoint controlPoint, NauticalSide passingSide) { + synchronized (waypointCache) { + expungeStaleWaypointCacheEntries(); + Waypoint result = new WaypointImpl(controlPoint, passingSide); + waypointCache.put(result.getId(), new WeakWaypointReference(result)); + return result; + } + } + + @Override + public Waypoint getExistingWaypointById(Waypoint waypointPrototype) { + synchronized (waypointCache) { + expungeStaleWaypointCacheEntries(); + Waypoint result = null; + Reference ref = waypointCache.get(waypointPrototype.getId()); + if (ref != null) { + result = ref.get(); + if (result == null) { + // waypoint was finalized; remove entry from cache + waypointCache.remove(waypointPrototype.getId()); + } + } + return result; + } + } + + @Override + public Waypoint getExistingWaypointByIdOrCache(Waypoint waypoint) { + synchronized (waypointCache) { + expungeStaleWaypointCacheEntries(); + Waypoint result = null; + Reference ref = waypointCache.get(waypoint.getId()); + if (ref != null) { + result = ref.get(); + if (result == null) { + // waypoint was finalized; remove entry from cache and add anew + result = waypoint; + waypointCache.put(waypoint.getId(), new WeakWaypointReference(waypoint)); + } // else, result is the waypoint found in the cache; return it + } else { + // No entry found in the cache; not even a stale, finalized one. Create a new entry: + result = waypoint; + waypointCache.put(waypoint.getId(), new WeakWaypointReference(waypoint)); + } + return result; + } + } + + private void expungeStaleWaypointCacheEntries() { + Reference ref; + while ((ref=waypointCacheReferenceQueue.poll()) != null) { + ((WeakWaypointReference) ref).removeCacheEntry(); + } + } + + @Override + public BoatClass getOrCreateBoatClass(String name, boolean typicallyStartsUpwind) { + synchronized (boatClassCache) { + BoatClass result = boatClassCache.get(name); + if (result == null) { + result = new BoatClassImpl(name, typicallyStartsUpwind); + boatClassCache.put(name, result); + } + return result; + } + } + + @Override + public BoatClass getOrCreateBoatClass(String name) { + return getOrCreateBoatClass(name, /* typicallyStartsUpwind */!mayStartWithNoUpwindLeg.contains(name.toLowerCase())); + } + + @Override + public CourseArea getOrCreateCourseArea(Serializable courseAreaId, String name) { + CourseArea result = getExistingCourseAreaById(courseAreaId); + if (result == null) { + result = new CourseAreaImpl(name, courseAreaId); + courseAreaCache.put(courseAreaId, result); + } + return result; + } + + @Override + public CourseArea getExistingCourseAreaById(Serializable courseAreaId) { + return courseAreaCache.get(courseAreaId); + } + + @Override + public CompetitorStore getCompetitorStore() { + return competitorStore; + } + + @Override + public DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(Type type, List clientIdentifiers) { + DeviceConfigurationMatcher probe = createMatcher(type, clientIdentifiers); + DeviceConfigurationMatcher matcher = configurationMatcherCache.get(probe.getMatcherIdentifier()); + if (matcher == null) { + configurationMatcherCache.put(probe.getMatcherIdentifier(), probe); + matcher = probe; + } + return matcher; + } + + private DeviceConfigurationMatcher createMatcher(Type type, List clientIdentifiers) { + DeviceConfigurationMatcher matcher = null; + switch (type) { + case SINGLE: + matcher = new DeviceConfigurationMatcherSingle(clientIdentifiers.get(0)); + break; + case MULTI: + matcher = new DeviceConfigurationMatcherMulti(clientIdentifiers); + break; + case ANY: + matcher = DeviceConfigurationMatcherAny.INSTANCE; + break; + } + return matcher; + } + +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java similarity index 92% rename from java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java index ea5f4f1f6da..0063f66b575 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.WeakHashMap; import com.sap.sailing.domain.base.Competitor; @@ -38,15 +39,15 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab public TransientCompetitorStoreImpl() { lock = new NamedReentrantReadWriteLock("CompetitorStore", /* fair */ false); - competitorCache = new HashMap<>(); - competitorsByIdAsString = new HashMap<>(); - competitorsToUpdateDuringGetOrCreate = new HashSet<>(); - weakCompetitorDTOCache = new WeakHashMap<>(); + competitorCache = new HashMap(); + competitorsByIdAsString = new HashMap(); + competitorsToUpdateDuringGetOrCreate = new HashSet(); + weakCompetitorDTOCache = new WeakHashMap(); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); - weakCompetitorDTOCache = new WeakHashMap<>(); + weakCompetitorDTOCache = new WeakHashMap(); } private Competitor createCompetitor(Serializable id, String name, DynamicTeam team, DynamicBoat boat) { @@ -89,6 +90,11 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab } return result; } + + @Override + public DynamicCompetitor getOrCreateDynamicCompetitor(UUID fromString, String name, DynamicTeam team, DynamicBoat boat) { + return (DynamicCompetitor) getOrCreateCompetitor(fromString, name, team, boat); + } private void competitorNoLongerToUpdateDuringGetOrCreate(Competitor result) { competitorsToUpdateDuringGetOrCreate.remove(result); diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java index 734e68c8d1c..7abaec0eee0 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java @@ -11,6 +11,7 @@ import java.util.logging.Logger; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CompetitorStore; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.RaceDefinition; @@ -107,7 +108,7 @@ public class DomainFactoryImpl implements DomainFactory { @Override public Competitor getCompetitorByBoatIDAndRaceType(String boatID, RaceType raceType) { - return baseDomainFactory.getExistingCompetitorById(getCompetitorID(boatID, raceType)); + return baseDomainFactory.getCompetitorStore().getExistingCompetitorById(getCompetitorID(boatID, raceType)); } @Override @@ -127,7 +128,8 @@ public class DomainFactoryImpl implements DomainFactory { @Override public Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor, RaceType raceType) { Competitor result = getCompetitorByBoatIDAndRaceType(competitor.getBoatID(), raceType); - if (result == null || baseDomainFactory.isCompetitorToUpdateDuringGetOrCreate(result)) { + CompetitorStore competitorStore = baseDomainFactory.getCompetitorStore(); + if (result == null || competitorStore.isCompetitorToUpdateDuringGetOrCreate(result)) { DynamicBoat boat = new BoatImpl(competitor.getName(), raceType.getBoatClass(), competitor.getBoatID()); List teamMembers = new ArrayList(); for (String teamMemberName : competitor.getName().split("[-+&]")) { @@ -135,7 +137,7 @@ public class DomainFactoryImpl implements DomainFactory { /* dateOfBirth */ null, teamMemberName.trim())); } DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null); - result = baseDomainFactory.getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceType), + result = competitorStore.getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceType), competitor.getName(), team, boat); } return result; diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java index 3ed6f4520d2..0b13a5cb365 100644 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java @@ -21,6 +21,7 @@ import java.util.logging.Logger; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CompetitorStore; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Mark; @@ -235,8 +236,9 @@ public class DomainFactoryImpl implements DomainFactory { @Override public Competitor getOrCreateCompetitor(final UUID competitorId, final String competitorClassName, final String nationalityAsString, final String name, final String shortName) { - Competitor result = baseDomainFactory.getExistingCompetitorById(competitorId); - if (result == null || baseDomainFactory.isCompetitorToUpdateDuringGetOrCreate(result)) { + CompetitorStore competitorStore = baseDomainFactory.getCompetitorStore(); + Competitor result = competitorStore.getExistingCompetitorById(competitorId); + if (result == null || competitorStore.isCompetitorToUpdateDuringGetOrCreate(result)) { BoatClass boatClass = getOrCreateBoatClass(competitorClassName); Nationality nationality; try { @@ -248,7 +250,7 @@ public class DomainFactoryImpl implements DomainFactory { } DynamicTeam team = getOrCreateTeam(name, nationality, competitorId); DynamicBoat boat = new BoatImpl(shortName, boatClass, shortName); - result = baseDomainFactory.getOrCreateCompetitor(competitorId, name, team, boat); + result = competitorStore.getOrCreateCompetitor(competitorId, name, team, boat); } return result; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java index 9a3bbd07bbc..c6490602736 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java @@ -2,47 +2,24 @@ package com.sap.sailing.domain.base.impl; import java.io.IOException; import java.io.InputStream; -import java.io.Serializable; -import java.lang.ref.Reference; -import java.lang.ref.ReferenceQueue; -import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; -import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CompetitorStore; -import com.sap.sailing.domain.base.ControlPoint; -import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.base.Gate; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.ObjectInputStreamResolvingAgainstDomainFactory; import com.sap.sailing.domain.base.Waypoint; -import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; -import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher.Type; -import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherAny; -import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherMulti; -import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle;import com.sap.sailing.domain.common.Distance; -import com.sap.sailing.domain.common.MarkType; -import com.sap.sailing.domain.common.NauticalSide; +import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.Placemark; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.TimePoint; -import com.sap.sailing.domain.common.WithID; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.PlacemarkDTO; @@ -68,207 +45,18 @@ import com.sap.sailing.domain.tracking.impl.MarkPassingImpl; import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl; import com.sap.sailing.geocoding.ReverseGeocoder; -public class DomainFactoryImpl implements DomainFactory { +public class DomainFactoryImpl extends SharedDomainFactoryImpl implements DomainFactory { private static Logger logger = Logger.getLogger(DomainFactoryImpl.class.getName()); - /** - * Ensure that the same string is used as key that is also used to set the {@link Nationality} - * object's {@link Nationality#getThreeLetterIOCAcronym() IOC code}. - */ - private final Map nationalityCache; - - private final Map markCache; - - /** - * For all marks ever created by this factory, the mark {@link WithID#getId() ID}'s string representation - * is mapped here to the actual ID. This allows clients to send only the string representation to the server - * and still be able to identify a mark uniquely this way. - */ - private final Map markIdCache; - - private final Map boatClassCache; - - private final CompetitorStore competitorStore; - - private final Map courseAreaCache; - - /** - * Weakly references the waypoints. If a waypoint is no longer strongly referenced, the corresponding reference contained - * as value will have its referred object be null. In this case, the methods reading from this cache will purge - * the record and behave as if the record hadn't existed at the time of the read operation. - */ - private final ConcurrentHashMap waypointCache; - - private final ReferenceQueue waypointCacheReferenceQueue; - - private final Map configurationMatcherCache; - - /** - * Weak references to {@link Waypoint} objects of this type are registered with - * {@link DomainFactoryImpl#waypointCacheReferenceQueue} upon construction so that when their referents are no - * longer strongly referenced and the reference was nulled, they are entered into that queue. - * Methods managing the {@link #waypointCache} can poll the queue and then remove cache entries based on - * the {@link #id} stored in the reference. - * - * @author Axel Uhl (D043530) - * - */ - private class WeakWaypointReference extends WeakReference { - private final Serializable id; - - public WeakWaypointReference(Waypoint waypoint) { - super(waypoint, waypointCacheReferenceQueue); - this.id = waypoint.getId(); - } - - public void removeCacheEntry() { - waypointCache.remove(id); - } - } - - private final Set mayStartWithNoUpwindLeg; - /** * Uses a transient competitor store */ public DomainFactoryImpl() { - this(new TransientCompetitorStoreImpl()); + super(new TransientCompetitorStoreImpl()); } public DomainFactoryImpl(CompetitorStore competitorStore) { - waypointCacheReferenceQueue = new ReferenceQueue(); - nationalityCache = new HashMap(); - markCache = new HashMap(); - markIdCache = new HashMap<>(); - boatClassCache = new HashMap(); - this.competitorStore = competitorStore; - waypointCache = new ConcurrentHashMap(); - mayStartWithNoUpwindLeg = new HashSet(Arrays.asList(new String[] { "extreme40", "ess", "ess40" })); - courseAreaCache = new HashMap<>(); - configurationMatcherCache = new HashMap<>(); - } - - @Override - public Nationality getOrCreateNationality(String threeLetterIOCCode) { - synchronized (nationalityCache) { - Nationality result = nationalityCache.get(threeLetterIOCCode); - if (result == null) { - result = new NationalityImpl(threeLetterIOCCode); - nationalityCache.put(threeLetterIOCCode, result); - } - return result; - } - } - - @Override - public Mark getOrCreateMark(String name) { - return getOrCreateMark(name, name); - } - - @Override - public Mark getOrCreateMark(Serializable id, String name) { - Mark result = markCache.get(id); - if (result == null) { - result = new MarkImpl(id, name); - cacheMark(id, result); - } - return result; - } - - @Override - public Mark getOrCreateMark(String toStringRepresentationOfID, String name) { - final Mark result; - if (markIdCache.containsKey(toStringRepresentationOfID)) { - Serializable id = markIdCache.get(toStringRepresentationOfID); - result = getOrCreateMark(id, name); - } else { - result = new MarkImpl(toStringRepresentationOfID, name); - cacheMark(toStringRepresentationOfID, result); - } - return result; - } - - private void cacheMark(Serializable id, Mark result) { - markCache.put(id, result); - markIdCache.put(id.toString(), id); - } - - - - @Override - public Mark getOrCreateMark(Serializable id, String name, MarkType type, String color, String shape, String pattern) { - Mark result = markCache.get(id); - if (result == null) { - result = new MarkImpl(id, name, type, color, shape, pattern); - cacheMark(id, result); - } - return result; - } - - @Override - public Gate createGate(Mark left, Mark right, String name) { - return new GateImpl(left, right, name); - } - - @Override - public Gate createGate(Serializable id, Mark left, Mark right, String name) { - return new GateImpl(id, left, right, name); - } - - @Override - public Waypoint createWaypoint(ControlPoint controlPoint, NauticalSide passingSide) { - synchronized (waypointCache) { - expungeStaleWaypointCacheEntries(); - Waypoint result = new WaypointImpl(controlPoint, passingSide); - waypointCache.put(result.getId(), new WeakWaypointReference(result)); - return result; - } - } - - @Override - public Waypoint getExistingWaypointById(Waypoint waypointPrototype) { - synchronized (waypointCache) { - expungeStaleWaypointCacheEntries(); - Waypoint result = null; - Reference ref = waypointCache.get(waypointPrototype.getId()); - if (ref != null) { - result = ref.get(); - if (result == null) { - // waypoint was finalized; remove entry from cache - waypointCache.remove(waypointPrototype.getId()); - } - } - return result; - } - } - - @Override - public Waypoint getExistingWaypointByIdOrCache(Waypoint waypoint) { - synchronized (waypointCache) { - expungeStaleWaypointCacheEntries(); - Waypoint result = null; - Reference ref = waypointCache.get(waypoint.getId()); - if (ref != null) { - result = ref.get(); - if (result == null) { - // waypoint was finalized; remove entry from cache and add anew - result = waypoint; - waypointCache.put(waypoint.getId(), new WeakWaypointReference(waypoint)); - } // else, result is the waypoint found in the cache; return it - } else { - // No entry found in the cache; not even a stale, finalized one. Create a new entry: - result = waypoint; - waypointCache.put(waypoint.getId(), new WeakWaypointReference(waypoint)); - } - return result; - } - } - - private void expungeStaleWaypointCacheEntries() { - Reference ref; - while ((ref=waypointCacheReferenceQueue.poll()) != null) { - ((WeakWaypointReference) ref).removeCacheEntry(); - } + super(competitorStore); } @Override @@ -276,43 +64,6 @@ public class DomainFactoryImpl implements DomainFactory { return new MarkPassingImpl(timePoint, waypoint, competitor); } - @Override - public BoatClass getOrCreateBoatClass(String name, boolean typicallyStartsUpwind) { - synchronized (boatClassCache) { - BoatClass result = boatClassCache.get(name); - if (result == null) { - result = new BoatClassImpl(name, typicallyStartsUpwind); - boatClassCache.put(name, result); - } - return result; - } - } - - @Override - public BoatClass getOrCreateBoatClass(String name) { - return getOrCreateBoatClass(name, /* typicallyStartsUpwind */!mayStartWithNoUpwindLeg.contains(name.toLowerCase())); - } - - @Override - public Competitor getExistingCompetitorById(Serializable competitorId) { - return competitorStore.getExistingCompetitorById(competitorId); - } - - @Override - public boolean isCompetitorToUpdateDuringGetOrCreate(Competitor competitor) { - return competitorStore.isCompetitorToUpdateDuringGetOrCreate(competitor); - } - - @Override - public synchronized Competitor getOrCreateCompetitor(Serializable competitorId, String name, DynamicTeam team, DynamicBoat boat) { - return competitorStore.getOrCreateCompetitor(competitorId, name, team, boat); - } - - @Override - public DynamicCompetitor getOrCreateDynamicCompetitor(UUID fromString, String name, DynamicTeam team, DynamicBoat boat) { - return (DynamicCompetitor) getOrCreateCompetitor(fromString, name, team, boat); - } - @Override public ObjectInputStreamResolvingAgainstDomainFactory createObjectInputStreamResolvingAgainstThisFactory(InputStream inputStream) throws IOException { return new ObjectInputStreamResolvingAgainstDomainFactoryImpl(inputStream, this); @@ -470,51 +221,4 @@ public class DomainFactoryImpl implements DomainFactory { return result; } - @Override - public CourseArea getOrCreateCourseArea(Serializable courseAreaId, String name) { - CourseArea result = getExistingCourseAreaById(courseAreaId); - if (result == null) { - result = new CourseAreaImpl(name, courseAreaId); - courseAreaCache.put(courseAreaId, result); - } - return result; - } - - @Override - public CourseArea getExistingCourseAreaById(Serializable courseAreaId) { - return courseAreaCache.get(courseAreaId); - } - - @Override - public CompetitorStore getCompetitorStore() { - return competitorStore; - } - - @Override - public DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(Type type, List clientIdentifiers) { - DeviceConfigurationMatcher probe = createMatcher(type, clientIdentifiers); - DeviceConfigurationMatcher matcher = configurationMatcherCache.get(probe.getMatcherIdentifier()); - if (matcher == null) { - configurationMatcherCache.put(probe.getMatcherIdentifier(), probe); - matcher = probe; - } - return matcher; - } - - private DeviceConfigurationMatcher createMatcher(Type type, List clientIdentifiers) { - DeviceConfigurationMatcher matcher = null; - switch (type) { - case SINGLE: - matcher = new DeviceConfigurationMatcherSingle(clientIdentifiers.get(0)); - break; - case MULTI: - matcher = new DeviceConfigurationMatcherMulti(clientIdentifiers); - break; - case ANY: - matcher = DeviceConfigurationMatcherAny.INSTANCE; - break; - } - return matcher; - } - } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index 718e7452e9c..2f4a5b5f1e1 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -211,7 +211,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningConfirmedEvent() { - Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null); + Competitor storedCompetitor = DomainFactory.INSTANCE.getCompetitorStore().getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null); List> storedPositioningList = new ArrayList>(); storedPositioningList.add(new Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); @@ -280,7 +280,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningListChangeEvent() { - Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null); + Competitor storedCompetitor = DomainFactory.INSTANCE.getCompetitorStore().getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null); List> storedPositioningList = new ArrayList>(); storedPositioningList.add(new Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index 1d0d2681ee1..f2b62c1e89a 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -244,7 +244,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningListChangeEvent() { - Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null); + Competitor storedCompetitor = DomainFactory.INSTANCE.getCompetitorStore().getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null); List> storedPositioningList = new ArrayList>(); storedPositioningList.add(new Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); @@ -274,7 +274,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends RaceLogMongoDBTest @Test public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningConfirmedEvent() { - Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null); + Competitor storedCompetitor = DomainFactory.INSTANCE.getCompetitorStore().getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null); List> storedPositioningList = new ArrayList>(); storedPositioningList.add(new Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/CompetitorJsonSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/CompetitorJsonSerializerTest.java index 510f4e92d90..b9075417471 100755 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/CompetitorJsonSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/CompetitorJsonSerializerTest.java @@ -30,7 +30,7 @@ public class CompetitorJsonSerializerTest { competitor = mock(Competitor.class); when(competitor.getTeam()).thenReturn(mock(Team.class)); serializer = new CompetitorJsonSerializer(); - deserializer = new CompetitorJsonDeserializer(DomainFactory.INSTANCE); + deserializer = new CompetitorJsonDeserializer(DomainFactory.INSTANCE.getCompetitorStore()); } /** diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java index 9b943d9cd40..eef8a1cc9e8 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java @@ -47,7 +47,7 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { SharedDomainFactory factory = DomainFactory.INSTANCE; serializer = new RaceLogFinishPositioningConfirmedEventSerializer(new CompetitorJsonSerializer( new TeamJsonSerializer(new PersonJsonSerializer(new NationalityJsonSerializer())), null)); - deserializer = new RaceLogFinishPositioningConfirmedEventDeserializer(new CompetitorJsonDeserializer(factory, null, /* boatDeserializer */ null)); + deserializer = new RaceLogFinishPositioningConfirmedEventDeserializer(new CompetitorJsonDeserializer(factory.getCompetitorStore(), null, /* boatDeserializer */ null)); now = MillisecondsTimePoint.now(); positioningList = new ArrayList>(); diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java index df90bf3e7d7..033bc5b9606 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java @@ -51,7 +51,7 @@ public class RaceLogWindFixEventSerializerTest { serializer = new RaceLogWindFixEventSerializer(new CompetitorJsonSerializer(new TeamJsonSerializer( new PersonJsonSerializer(new NationalityJsonSerializer())), null), new WindJsonSerializer( new PositionJsonSerializer())); - deserializer = new RaceLogWindFixEventDeserializer(new CompetitorJsonDeserializer(factory, null, /* boatDeserializer */ null), + deserializer = new RaceLogWindFixEventDeserializer(new CompetitorJsonDeserializer(factory.getCompetitorStore(), null, /* boatDeserializer */ null), new WindJsonDeserializer(new PositionJsonDeserializer())); now = MillisecondsTimePoint.now(); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java index 56be056c23e..87c07e0c578 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java @@ -7,8 +7,8 @@ import java.util.UUID; import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CompetitorStore; import com.sap.sailing.domain.base.DomainFactory; -import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.impl.DynamicBoat; import com.sap.sailing.domain.base.impl.DynamicTeam; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; @@ -16,21 +16,21 @@ import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer; public class CompetitorJsonDeserializer implements JsonDeserializer { - protected final SharedDomainFactory factory; + protected final CompetitorStore competitorStore; protected final JsonDeserializer teamJsonDeserializer; protected final JsonDeserializer boatJsonDeserializer; public static CompetitorJsonDeserializer create(DomainFactory baseDomainFactory) { - return new CompetitorJsonDeserializer(baseDomainFactory, new TeamJsonDeserializer(new PersonJsonDeserializer( + return new CompetitorJsonDeserializer(baseDomainFactory.getCompetitorStore(), new TeamJsonDeserializer(new PersonJsonDeserializer( new NationalityJsonDeserializer(baseDomainFactory))), new BoatJsonDeserializer(new BoatClassJsonDeserializer(baseDomainFactory))); } - public CompetitorJsonDeserializer(SharedDomainFactory factory) { - this(factory, null, /* boatDeserializer */ null); + public CompetitorJsonDeserializer(CompetitorStore store) { + this(store, null, /* boatDeserializer */ null); } - public CompetitorJsonDeserializer(SharedDomainFactory factory, JsonDeserializer teamJsonDeserializer, JsonDeserializer boatDeserializer) { - this.factory = factory; + public CompetitorJsonDeserializer(CompetitorStore competitorStore, JsonDeserializer teamJsonDeserializer, JsonDeserializer boatDeserializer) { + this.competitorStore = competitorStore; this.teamJsonDeserializer = teamJsonDeserializer; this.boatJsonDeserializer = boatDeserializer; } @@ -57,7 +57,7 @@ public class CompetitorJsonDeserializer implements JsonDeserializer boat = boatJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object, CompetitorJsonSerializer.FIELD_BOAT)); } - Competitor competitor = factory.getOrCreateCompetitor(competitorId, name, team, boat); + Competitor competitor = competitorStore.getOrCreateCompetitor(competitorId, name, team, boat); return competitor; } catch (Exception e) { throw new JsonDeserializationException(e); diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/masterdata/impl/CompetitorMasterDataDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/masterdata/impl/CompetitorMasterDataDeserializer.java index 0cbbc254cc6..7f3d5b37e28 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/masterdata/impl/CompetitorMasterDataDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/masterdata/impl/CompetitorMasterDataDeserializer.java @@ -35,7 +35,7 @@ public class CompetitorMasterDataDeserializer implements JsonDeserializer { public static RaceLogEventDeserializer create(SharedDomainFactory domainFactory) { - JsonDeserializer competitorDeserializer = new CompetitorJsonDeserializer(domainFactory, null, /* boatDeserializer */ null); + JsonDeserializer competitorDeserializer = new CompetitorJsonDeserializer(domainFactory.getCompetitorStore(), null, /* boatDeserializer */ null); return new RaceLogEventDeserializer( new RaceLogFlagEventDeserializer(competitorDeserializer), new RaceLogStartTimeEventDeserializer(competitorDeserializer), diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java index bc889ab847e..70ad866a0b8 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/CompetitorReplicationTest.java @@ -71,7 +71,7 @@ public class CompetitorReplicationTest extends AbstractServerReplicationTest { /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null); Iterable emptyWaypointList = Collections.emptyList(); final String competitorName = "Der mit dem Kiel zieht"; - Competitor competitor = master.getBaseDomainFactory().getOrCreateCompetitor( + Competitor competitor = master.getBaseDomainFactory().getCompetitorStore().getOrCreateCompetitor( 123, competitorName, new TeamImpl("STG", Collections.singleton(new PersonImpl(competitorName, new NationalityImpl("GER"), /* dateOfBirth */null, "This is famous " + competitorName)), new PersonImpl("Rigo van Maas", diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java index 1d8c7c9d145..f0124a53127 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java @@ -68,7 +68,7 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio // FIXME use master DomainFactory; see bug 592 final DomainFactory masterDomainFactory = DomainFactory.INSTANCE; BoatClass boatClass = masterDomainFactory.getOrCreateBoatClass(boatClassName, /* typicallyStartsUpwind */true); - competitor = masterDomainFactory.getOrCreateCompetitor("GER 61", "Tina Lutz", new TeamImpl("Tina Lutz + Susann Beucke", + competitor = masterDomainFactory.getCompetitorStore().getOrCreateCompetitor("GER 61", "Tina Lutz", new TeamImpl("Tina Lutz + Susann Beucke", (List) Arrays.asList(new PersonImpl[] { new PersonImpl("Tina Lutz", DomainFactory.INSTANCE.getOrCreateNationality("GER"), null, null), new PersonImpl("Tina Lutz", DomainFactory.INSTANCE.getOrCreateNationality("GER"), null, null) }), new PersonImpl("Rigo de Mas", DomainFactory.INSTANCE.getOrCreateNationality("NED"), null, null)), diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index bbc4bd2c166..4e0fd6248ec 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -269,7 +269,7 @@ public class MasterDataImportTest { Assert.assertNotNull(raceColumnOnTarget); Assert.assertTrue(leaderboardOnTarget.getScoreCorrection().hasCorrectionFor(raceColumnOnTarget)); - Competitor competitorOnTarget = domainFactory.getExistingCompetitorById(competitorUUID); + Competitor competitorOnTarget = domainFactory.getCompetitorStore().getExistingCompetitorById(competitorUUID); Set competitorsCreatedOnTarget = new HashSet(); competitorsCreatedOnTarget.add(competitorOnTarget); @@ -297,7 +297,7 @@ public class MasterDataImportTest { // Check for suppressed competitor Assert.assertTrue(leaderboardOnTarget.getSuppressedCompetitors().iterator().hasNext()); - Competitor suppressedCompetitorOnTarget = domainFactory.getExistingCompetitorById(competitorToSuppressUUID); + Competitor suppressedCompetitorOnTarget = domainFactory.getCompetitorStore().getExistingCompetitorById(competitorToSuppressUUID); Assert.assertEquals(suppressedCompetitorOnTarget, leaderboardOnTarget.getSuppressedCompetitors().iterator() .next()); @@ -429,8 +429,8 @@ public class MasterDataImportTest { Assert.assertNotNull(raceColumnOnTarget); Assert.assertTrue(leaderboardOnTarget.getScoreCorrection().hasCorrectionFor(raceColumnOnTarget)); - Competitor competitorOnTarget = domainFactory.getExistingCompetitorById(competitorUUID); - Competitor competitorOnTarget2 = domainFactory.getExistingCompetitorById(competitor2UUID); + Competitor competitorOnTarget = domainFactory.getCompetitorStore().getExistingCompetitorById(competitorUUID); + Competitor competitorOnTarget2 = domainFactory.getCompetitorStore().getExistingCompetitorById(competitor2UUID); Set competitorsCreatedOnTarget = new HashSet(); competitorsCreatedOnTarget.add(competitorOnTarget); @@ -512,7 +512,7 @@ public class MasterDataImportTest { DynamicTeam team = new TeamImpl("Pros", sailors, coach); BoatClass boatClass = new BoatClassImpl("H16", true); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133"); - Competitor competitor = sourceDomainFactory.getOrCreateCompetitor(competitorUUID, "Froderik", team, boat); + Competitor competitor = sourceDomainFactory.getCompetitorStore().getOrCreateCompetitor(competitorUUID, "Froderik", team, boat); competitors.add(competitor); UUID competitor2UUID = UUID.randomUUID(); Set sailors2 = new HashSet(); @@ -520,7 +520,7 @@ public class MasterDataImportTest { Person coach2 = new PersonImpl("Max Test", new NationalityImpl("GER"), new Date(645487200000L), "desc"); DynamicTeam team2 = new TeamImpl("Pros2", sailors2, coach2); DynamicBoat boat2 = new BoatImpl("FastBoat", boatClass, "GER70133"); - Competitor competitor2 = sourceDomainFactory.getOrCreateCompetitor(competitor2UUID, "Froderik", team2, boat2); + Competitor competitor2 = sourceDomainFactory.getCompetitorStore().getOrCreateCompetitor(competitor2UUID, "Froderik", team2, boat2); competitors.add(competitor2); TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta); @@ -578,7 +578,7 @@ public class MasterDataImportTest { Assert.assertNotNull(raceColumnOnTarget); Assert.assertTrue(leaderboardOnTarget.getScoreCorrection().hasCorrectionFor(raceColumnOnTarget)); - Competitor competitorOnTarget = domainFactory.getExistingCompetitorById(competitorUUID); + Competitor competitorOnTarget = domainFactory.getCompetitorStore().getExistingCompetitorById(competitorUUID); Set competitorsCreatedOnTarget = new HashSet(); competitorsCreatedOnTarget.add(competitorOnTarget); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java index a163728fffd..4f3a5cc78c3 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java @@ -101,7 +101,7 @@ public class WindByRaceLogTest { } private Competitor createCompetitor(final DomainFactory masterDomainFactory) { - return masterDomainFactory.getOrCreateCompetitor("GER 61", "Sailor", new TeamImpl("Sailor", + return masterDomainFactory.getCompetitorStore().getOrCreateCompetitor("GER 61", "Sailor", new TeamImpl("Sailor", (List) Arrays.asList(new PersonImpl[] { new PersonImpl("Sailor 1", DomainFactory.INSTANCE.getOrCreateNationality("GER"), null, null)}), new PersonImpl("Sailor 2", DomainFactory.INSTANCE.getOrCreateNationality("NED"), null, null)), new BoatImpl("GER 61", DomainFactory.INSTANCE.getOrCreateBoatClass("470", /* typicallyStartsUpwind */ true), "GER 61")); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java index 21386648ecc..65509caeb78 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java @@ -139,7 +139,7 @@ public class RaceLogScoringReplicator implements RaceColumnListener { if (positioningList != null) { for (Triple positionedCompetitor : positioningList) { - Competitor competitor = service.getBaseDomainFactory().getExistingCompetitorById(positionedCompetitor.getA()); + Competitor competitor = service.getBaseDomainFactory().getCompetitorStore().getExistingCompetitorById(positionedCompetitor.getA()); if (positionedCompetitor.getC().equals(MaxPointsReason.NONE)) { try { diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreatePersistentCompetitor.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreatePersistentCompetitor.java index 4c00b5a1524..42d4597bc12 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreatePersistentCompetitor.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreatePersistentCompetitor.java @@ -28,7 +28,7 @@ public class CreatePersistentCompetitor extends AbstractRacingEventServiceOperat @Override public Competitor internalApplyTo(RacingEventService toState) { - return toState.getBaseDomainFactory().getOrCreateCompetitor(id, name, team, boat); + return toState.getBaseDomainFactory().getCompetitorStore().getOrCreateCompetitor(id, name, team, boat); } @Override diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index a72d2cf6b74..f70d4b6c6be 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -44,7 +44,6 @@ import com.sap.sailing.racecommittee.app.data.parsers.ManagedRacesDataParser; import com.sap.sailing.racecommittee.app.data.parsers.MarksDataParser; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; -import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.services.sending.EventSendingService; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; @@ -217,7 +216,7 @@ public class OnlineDataManager extends DataManager { public Loader>> create(int id, Bundle args) throws Exception { ExLog.i(TAG, String.format("Creating Competitor-OnlineDataLoader %d", id)); SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; - JsonDeserializer competitorDeserializer = new CompetitorJsonDeserializer(domainFactory); + JsonDeserializer competitorDeserializer = new CompetitorJsonDeserializer(domainFactory.getCompetitorStore()); DataParser> parser = new CompetitorsDataParser(competitorDeserializer); DataHandler> handler = new CompetitorsDataHandler(OnlineDataManager.this, managedRace); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java index 11e5bfec8cb..51497c5df66 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java @@ -18,7 +18,6 @@ import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.data.DataManager; import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; -import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.services.sending.ServerReplyCallback; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java index 8e799576f38..9e67f50a9e1 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java @@ -21,7 +21,6 @@ import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.data.DataManager; import com.sap.sailing.racecommittee.app.data.DataStore; -import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; import com.sap.sailing.racecommittee.app.domain.racelog.impl.RaceLogEventsCallback; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.utils.FileHandlerUtils; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java index 4706b78e6ac..c639225cfc9 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/RaceEventSender.java @@ -22,6 +22,7 @@ public class RaceEventSender implements RaceLogChangedListener { this.race = race; } + @Override public void eventAdded(RaceLogEvent event) { JSONObject serializedEvent = serializer.serialize(event); service.startService( diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java index a62fbdf83b0..427314bd137 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java @@ -33,7 +33,6 @@ import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.data.OnlineDataManager; import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; -import com.sap.sailing.racecommittee.app.domain.impl.DomainFactoryImpl; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.ui.adapters.finishing.CompetitorPositioningListAdapter; import com.sap.sailing.racecommittee.app.ui.adapters.finishing.CompetitorsAdapter; From a3718749040b5be83d70b42307b15ee9f0cfae71 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Tue, 12 Nov 2013 01:48:42 +0100 Subject: [PATCH 056/450] # integrated SharedDomainFactoryImpl into app code --- .../impl/DeviceConfigurationMatcherAny.java | 3 +-- .../sailing/racecommittee/app/data/DataManager.java | 10 +++++++--- .../sailing/racecommittee/app/data/DataStore.java | 3 +++ .../racecommittee/app/data/InMemoryDataStore.java | 11 +++++++++++ .../racecommittee/app/data/OfflineDataManager.java | 5 +++-- .../racecommittee/app/data/OnlineDataManager.java | 9 ++------- .../domain/racelog/impl/RaceLogEventsCallback.java | 3 ++- .../services/sending/EventPersistenceManager.java | 2 +- .../app/ui/activities/BaseActivity.java | 5 +++++ .../ui/fragments/dialogs/PositioningFragment.java | 12 +++++++++--- 10 files changed, 44 insertions(+), 19 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java index 8512e1c7b6f..c4f7a9b8b9c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/configuration/impl/DeviceConfigurationMatcherAny.java @@ -1,7 +1,6 @@ package com.sap.sailing.domain.base.configuration.impl; import java.io.Serializable; -import java.util.Collections; import com.sap.sailing.domain.base.IsManagedBySharedDomainFactory; import com.sap.sailing.domain.base.SharedDomainFactory; @@ -38,7 +37,7 @@ public enum DeviceConfigurationMatcherAny implements DeviceConfigurationMatcher @Override public IsManagedBySharedDomainFactory resolve(SharedDomainFactory domainFactory) { - return domainFactory.getOrCreateDeviceConfigurationMatcher(getMatcherType(), Collections.emptyList()); + return DeviceConfigurationMatcherAny.INSTANCE; } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java index 8e93a13c79f..045743eecd3 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataManager.java @@ -2,6 +2,7 @@ package com.sap.sailing.racecommittee.app.data; import android.content.Context; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.racecommittee.app.AppConstants; /** @@ -10,18 +11,21 @@ import com.sap.sailing.racecommittee.app.AppConstants; public abstract class DataManager implements ReadonlyDataManager { public static ReadonlyDataManager create(Context context) { + DataStore dataStore = InMemoryDataStore.INSTANCE; if (AppConstants.IS_DATA_OFFLINE) { - return new OfflineDataManager(context, InMemoryDataStore.INSTANCE); + return new OfflineDataManager(context, dataStore, dataStore.getDomainFactory()); } - return new OnlineDataManager(context, InMemoryDataStore.INSTANCE); + return new OnlineDataManager(context, dataStore, dataStore.getDomainFactory()); } protected Context context; protected DataStore dataStore; + protected SharedDomainFactory domainFactory; - public DataManager(Context context, DataStore dataStore) { + protected DataManager(Context context, DataStore dataStore, SharedDomainFactory domainFactory) { this.context = context; this.dataStore = dataStore; + this.domainFactory = domainFactory; } public DataStore getDataStore() { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java index 4eb22f77f07..2d2495c3206 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java @@ -7,12 +7,15 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.racecommittee.app.domain.ManagedRace; public interface DataStore { public void reset(); + + public SharedDomainFactory getDomainFactory(); public Collection getEvents(); public EventBase getEvent(Serializable id); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java index d8bb7d2655f..fe24cbbf190 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java @@ -8,7 +8,9 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfiguration; +import com.sap.sailing.domain.base.impl.SharedDomainFactoryImpl; import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.utils.CollectionUtils; @@ -20,6 +22,7 @@ public enum InMemoryDataStore implements DataStore { private HashMap marksById; private CourseBase courseData; private DeviceConfiguration configuration; + private SharedDomainFactory domainFactory; private InMemoryDataStore() { reset(); @@ -30,6 +33,14 @@ public enum InMemoryDataStore implements DataStore { this.eventsById = new HashMap(); this.managedRaceById = new HashMap(); this.marksById = new HashMap(); + this.courseData = null; + this.configuration = null; + this.domainFactory = new SharedDomainFactoryImpl(); + } + + @Override + public SharedDomainFactory getDomainFactory() { + return domainFactory; } /* 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 0e48de3d988..9c2771af105 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 @@ -17,6 +17,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier; import com.sap.sailing.domain.base.impl.BoatClassImpl; @@ -50,8 +51,8 @@ public class OfflineDataManager extends DataManager { private static boolean isInitialized = false; private final Context context; - public OfflineDataManager(Context context, DataStore dataStore) { - super(context, dataStore); + protected OfflineDataManager(Context context, DataStore dataStore, SharedDomainFactory domainFactory) { + super(context, dataStore, domainFactory); this.context = context; if (!isInitialized) { isInitialized = true; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java index f70d4b6c6be..7218c5b14e1 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/OnlineDataManager.java @@ -73,8 +73,8 @@ import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventD public class OnlineDataManager extends DataManager { private static final String TAG = OnlineDataManager.class.getName(); - OnlineDataManager(Context context, DataStore dataStore) { - super(context, dataStore); + protected OnlineDataManager(Context context, DataStore dataStore, SharedDomainFactory domainFactory) { + super(context, dataStore, domainFactory); } public void addEvents(Collection events) { @@ -101,7 +101,6 @@ public class OnlineDataManager extends DataManager { return new DataLoaderCallbacks>(callback, new LoaderCreator>() { @Override public Loader>> create(int id, Bundle args) throws Exception { - SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; DataParser> parser = new EventsDataParser(new EventBaseJsonDeserializer( new VenueJsonDeserializer(new CourseAreaJsonDeserializer(domainFactory)))); DataHandler> handler = new EventsDataHandler(OnlineDataManager.this); @@ -138,7 +137,6 @@ public class OnlineDataManager extends DataManager { return new DataLoaderCallbacks>(callback, new LoaderCreator>() { @Override public Loader>> create(int id, Bundle args) throws Exception { - SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; JsonDeserializer boatClassDeserializer = new BoatClassJsonDeserializer(domainFactory); DataParser> parser = new ManagedRacesDataParser(context, new RaceGroupDeserializer(boatClassDeserializer, new SeriesWithRowsDeserializer( @@ -161,7 +159,6 @@ public class OnlineDataManager extends DataManager { return new DataLoaderCallbacks>(callback, new LoaderCreator>() { @Override public Loader>> create(int id, Bundle args) throws Exception { - SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; JsonDeserializer markDeserializer = new MarkDeserializer(domainFactory); DataParser> parser = new MarksDataParser(markDeserializer); DataHandler> handler = new MarksDataHandler(OnlineDataManager.this); @@ -187,7 +184,6 @@ public class OnlineDataManager extends DataManager { return new DataLoaderCallbacks(callback, new LoaderCreator() { @Override public Loader> create(int id, Bundle args) throws Exception { - SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; JsonDeserializer courseBaseDeserializer = new CourseBaseDeserializer( new WaypointDeserializer(new ControlPointDeserializer(new MarkDeserializer(domainFactory), new GateDeserializer(domainFactory, new MarkDeserializer(domainFactory))))); @@ -215,7 +211,6 @@ public class OnlineDataManager extends DataManager { @Override public Loader>> create(int id, Bundle args) throws Exception { ExLog.i(TAG, String.format("Creating Competitor-OnlineDataLoader %d", id)); - SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; JsonDeserializer competitorDeserializer = new CompetitorJsonDeserializer(domainFactory.getCompetitorStore()); DataParser> parser = new CompetitorsDataParser(competitorDeserializer); DataHandler> handler = new CompetitorsDataHandler(OnlineDataManager.this, diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java index 51497c5df66..3fe7dbdb5dd 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/racelog/impl/RaceLogEventsCallback.java @@ -30,7 +30,7 @@ public class RaceLogEventsCallback implements ServerReplyCallback { public void onReply(Intent originalIntent, Context context, InputStream inputStream) { ReadonlyDataManager dataManager = DataManager.create(context); final List eventsToAdd = new ArrayList(); - SharedDomainFactory domainFactory = DomainFactoryImpl.INSTANCE; + SharedDomainFactory domainFactory = DataManager.create(context).getDataStore().getDomainFactory(); JSONParser parser = new JSONParser(); try { @@ -45,6 +45,7 @@ public class RaceLogEventsCallback implements ServerReplyCallback { } } catch (Exception e) { ExLog.e(TAG, "Error parsing server response"); + ExLog.ex(TAG, e); } String raceId = originalIntent.getStringExtra(AppConstants.RACE_ID_KEY); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java index 9e67f50a9e1..bbf8e5b5d8c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/sending/EventPersistenceManager.java @@ -151,7 +151,7 @@ public class EventPersistenceManager { return; } try { - RaceLogEventDeserializer deserializer = RaceLogEventDeserializer.create(DomainFactoryImpl.INSTANCE); + RaceLogEventDeserializer deserializer = RaceLogEventDeserializer.create(DataManager.create(context).getDataStore().getDomainFactory()); RaceLogEvent event = deserializer.deserialize((JSONObject) new JSONParser().parse(serializedEventAsJson)); boolean added = store.getRace(raceId).getRaceLog().add(event); if (added) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/BaseActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/BaseActivity.java index 82099658cb6..f25b3926cd6 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/BaseActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/BaseActivity.java @@ -14,6 +14,7 @@ import android.widget.Toast; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; +import com.sap.sailing.racecommittee.app.RaceApplication; import com.sap.sailing.racecommittee.app.data.InMemoryDataStore; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.services.sending.EventSendingService; @@ -175,4 +176,8 @@ public abstract class BaseActivity extends LoggableActivity { startActivity(intent); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } + + public RaceApplication getRaceApplication() { + return (RaceApplication) getApplication(); + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java index 427314bd137..37c99c7d0fb 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/PositioningFragment.java @@ -25,11 +25,13 @@ import android.widget.Toast; import com.mobeta.android.dslv.DragSortController; import com.mobeta.android.dslv.DragSortListView; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CompetitorStore; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.Named; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.racecommittee.app.R; +import com.sap.sailing.racecommittee.app.data.DataManager; import com.sap.sailing.racecommittee.app.data.OnlineDataManager; import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; @@ -202,7 +204,7 @@ public class PositioningFragment extends RaceDialogFragment { private void deleteObsoleteCompetitorsFromPositionedList(Collection validCompetitors) { List> toBeDeleted = new ArrayList>(); for (Triple positionedItem : positionedCompetitors) { - if (!validCompetitors.contains(DomainFactoryImpl.INSTANCE.getExistingCompetitorById(positionedItem.getA()))) { + if (!validCompetitors.contains(getCompetitorStore().getExistingCompetitorById(positionedItem.getA()))) { toBeDeleted.add(positionedItem); } } @@ -211,7 +213,7 @@ public class PositioningFragment extends RaceDialogFragment { private void deletePositionedCompetitorsFromUnpositionedList() { for (Triple positionedItem : positionedCompetitors) { - Competitor competitor = DomainFactoryImpl.INSTANCE.getExistingCompetitorById(positionedItem.getA()); + Competitor competitor = getCompetitorStore().getExistingCompetitorById(positionedItem.getA()); competitors.remove(competitor); } } @@ -298,7 +300,7 @@ public class PositioningFragment extends RaceDialogFragment { } protected void onCompetitorRemovedFromPositioningList(Triple item) { - Competitor competitor = DomainFactoryImpl.INSTANCE.getExistingCompetitorById(item.getA()); + Competitor competitor = getCompetitorStore().getExistingCompetitorById(item.getA()); addNewCompetitorToCompetitorList(competitor); removeCompetitorFromPositionings(item); getRace().getState().setFinishPositioningListChanged(positionedCompetitors); @@ -315,4 +317,8 @@ public class PositioningFragment extends RaceDialogFragment { positioningAdapter.notifyDataSetChanged(); } + private CompetitorStore getCompetitorStore() { + return DataManager.create(getActivity()).getDataStore().getDomainFactory().getCompetitorStore(); + } + } From 31af5bbe69d11df19964b981bd7a5acf97684953 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Tue, 12 Nov 2013 02:07:23 +0100 Subject: [PATCH 057/450] # added ability to remove pending events --- .../res/layout/system_information_view.xml | 9 ++++++++- .../res/values/strings.xml | 1 + .../sending/EventPersistenceManager.java | 8 ++++++++ .../services/sending/EventSendingService.java | 16 ++++++++++----- .../activities/SystemInformationActivity.java | 20 +++++++++++++++++++ 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/system_information_view.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/system_information_view.xml index 50959c61531..f176643d1ba 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/system_information_view.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/system_information_view.xml @@ -80,7 +80,14 @@ + +