diff --git a/java/com.sap.sailing.mongodb/src/com/sap/sailing/mongodb/internal/MongoDBServiceImpl.java b/java/com.sap.sailing.mongodb/src/com/sap/sailing/mongodb/internal/MongoDBServiceImpl.java index 357cdeb3955..afe463ca781 100644 --- a/java/com.sap.sailing.mongodb/src/com/sap/sailing/mongodb/internal/MongoDBServiceImpl.java +++ b/java/com.sap.sailing.mongodb/src/com/sap/sailing/mongodb/internal/MongoDBServiceImpl.java @@ -35,18 +35,16 @@ public class MongoDBServiceImpl implements MongoDBService { return configuration; } - public void setConfiguration(MongoDBConfiguration configuration) - { + public void setConfiguration(MongoDBConfiguration configuration) { this.configuration = configuration; logger.info("Used Mongo configuration: host:port/DBName: "+configuration.getHostName()+":"+configuration.getPort()+"/"+configuration.getDatabaseName()); } public DB getDB() { - if(configuration == null) { + if (configuration == null) { configuration = MongoDBConfiguration.getDefaultTestConfiguration(); logger.info("Used default Mongo configuration: host:port/DBName: "+configuration.getHostName()+":"+configuration.getPort()+"/"+configuration.getDatabaseName()); } - try { return getDB(configuration); } catch (UnknownHostException e) { 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 8f581cbe5f5..e3472cf9980 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 @@ -104,7 +104,7 @@ public class PeerImpl, S> implements Peer { @Override public S addPeer(Peer peer) { - if ( role == Role.CLIENT && getPeers().size() > 0) { + if (role == Role.CLIENT && getPeers().size() > 0) { throw new RuntimeException("A client must be connected to at most one server"); } unmergedOperationsForPeer.put(peer, new UnmergedOperationsQueue()); @@ -193,6 +193,7 @@ public class PeerImpl, S> implements Peer { * by this peer's apply(...) method. */ peer.apply(PeerImpl.this, operation, numberOfMergedOpsForPeer); + // TODO what to do if apply throws a RuntimeException? } }); } diff --git a/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF index 2244ea56194..9afc9a3761a 100755 --- a/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF @@ -10,7 +10,10 @@ Require-Bundle: com.sap.sailing.server, com.sap.sailing.domain.tractracadapter, com.sap.sailing.domain.swisstimingadapter, com.sap.sailing.domain.common, - com.sap.sailing.expeditionconnector + com.sap.sailing.expeditionconnector, + com.sap.sailing.operationaltransformation, + com.sap.sailing.mongodb, + com.mongodb.driver;bundle-version="2.6.2" Import-Package: junit.framework;version="4.8.1", org.junit;version="4.8.1", com.tractrac.clientmodule, 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 new file mode 100755 index 00000000000..0f34d9dc1dd --- /dev/null +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java @@ -0,0 +1,56 @@ +package com.sap.sailing.server.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.domain.common.DefaultLeaderboardName; +import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.mongodb.MongoDBService; +import com.sap.sailing.operationaltransformation.Peer; +import com.sap.sailing.operationaltransformation.Peer.Role; +import com.sap.sailing.operationaltransformation.PeerImpl; +import com.sap.sailing.server.RacingEventService; +import com.sap.sailing.server.impl.RacingEventServiceImpl; +import com.sap.sailing.server.operationaltransformation.AddLeaderboard; +import com.sap.sailing.server.operationaltransformation.OperationalTransformer; +import com.sap.sailing.server.operationaltransformation.RacingEventServiceOperation; + +public class OperationalTransformationTest { + private static final String LEADERBOARDNAME = "TESTBOARD"; + + private RacingEventService racingEventServiceServer; + private RacingEventService racingEventServiceReplica; + private Peer server; + private Peer replica; + + @Before + public void setUp() { + // ensure that leaderboards will be loaded from and stored to the test database which is + MongoDBService.INSTANCE.getDB().dropDatabase(); + racingEventServiceServer = new RacingEventServiceImpl(); + racingEventServiceReplica = new RacingEventServiceImpl(); + OperationalTransformer transformer = new OperationalTransformer(); + server = new PeerImpl<>(transformer, racingEventServiceServer, Role.SERVER); + replica = new PeerImpl<>(transformer, racingEventServiceReplica, Role.CLIENT); + // wire the peers: + server.addPeer(replica); + replica.addPeer(server); + } + + @Test + public void testAddLeaderboard() { + RacingEventServiceOperation addLeaderboardOp = new AddLeaderboard(LEADERBOARDNAME, new int[] { 5 }); + server.apply(addLeaderboardOp); + server.waitForNotRunning(); + Map replicaLeaderboards = racingEventServiceReplica.getLeaderboards(); + assertEquals(2, replicaLeaderboards.size()); // expected to include the default leaderboard + assertEquals(new HashSet(Arrays.asList(new String[] { DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, LEADERBOARDNAME })), + replicaLeaderboards.keySet()); + } +} diff --git a/java/com.sap.sailing.server/META-INF/MANIFEST.MF b/java/com.sap.sailing.server/META-INF/MANIFEST.MF index 8dd357ce14e..ee48fabe5d5 100755 --- a/java/com.sap.sailing.server/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server/META-INF/MANIFEST.MF @@ -30,5 +30,6 @@ Export-Package: com.sap.sailing.server, x-friends:="com.sap.sailing.mongodb.test, com.sap.sailing.server.test, com.sap.sailing.domain.swisstimingadapter.test, - com.sap.sailing.gwt.ui.test" + com.sap.sailing.gwt.ui.test", + com.sap.sailing.server.operationaltransformation Web-ContextPath: /sailingserver diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddLeaderboard.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddLeaderboard.java new file mode 100755 index 00000000000..ab81a226efa --- /dev/null +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddLeaderboard.java @@ -0,0 +1,33 @@ +package com.sap.sailing.server.operationaltransformation; + +import com.sap.sailing.server.RacingEventService; + +public class AddLeaderboard extends AbstractRacingEventServiceOperation { + private final String leaderboardName; + private final int[] discardThresholds; + + public AddLeaderboard(String leaderboardName, int[] discardThresholds) { + super(); + this.leaderboardName = leaderboardName; + this.discardThresholds = discardThresholds; + } + + @Override + public RacingEventService applyTo(RacingEventService toState) { + toState.addLeaderboard(leaderboardName, discardThresholds); + return toState; + } + + @Override + public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) { + // TODO Auto-generated method stub + return null; + } + + @Override + public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) { + // TODO Auto-generated method stub + return null; + } + +}