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 e3472cf9980..81bd4e099fe 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.Logger; /** @@ -19,6 +20,7 @@ import java.util.concurrent.Executors; * @param type of state managed by this server to which the operations can be applied */ public class PeerImpl, S> implements Peer { + private static final Logger logger = Logger.getLogger(PeerImpl.class.getName()); private String name; @@ -42,20 +44,20 @@ public class PeerImpl, S> implements Peer { * confirmed, the first operation from the queue is removed because operations sent * from this peer to the remote peer are processed in order. */ - private Map, UnmergedOperationsQueue> unmergedOperationsForPeer = new HashMap, UnmergedOperationsQueue>(); + private final Map, UnmergedOperationsQueue> unmergedOperationsForPeer = new HashMap, UnmergedOperationsQueue>(); /** * Remembers per peer how many of that peer's operations this peer has already * applied locally. */ - private Map, Integer> numberOfMergedOperations = new HashMap, Integer>(); + private final Map, Integer> numberOfMergedOperations = new HashMap, Integer>(); - private Transformer transformer; + private final Transformer transformer; /** * The background task handler which sends out the asynchronous updates to the peers. */ - private ExecutorService merger; + private final ExecutorService merger; public PeerImpl(Transformer transformer, S initialState, Role role) { this.transformer = transformer; @@ -234,6 +236,7 @@ public class PeerImpl, S> implements Peer { } private void taskScheduled() { + logger.fine(""+this+" taskScheduled incrementing scheduleOrRunning from "+scheduledOrRunning+" to "+(scheduledOrRunning+1)); scheduledOrRunning++; } @@ -242,8 +245,10 @@ public class PeerImpl, S> implements Peer { * Unblocks {@link #waitForNotRunning()} if the merger's queue got empty by this. */ private synchronized void taskFinished() { + logger.fine(""+this+" taskFinished decrementing scheduleOrRunning from "+scheduledOrRunning+" to "+(scheduledOrRunning-1)); scheduledOrRunning--; if (scheduledOrRunning == 0) { + logger.fine(""+this+" taskFinished notifying waiters"); notifyAll(); } } @@ -253,6 +258,7 @@ public class PeerImpl, S> implements Peer { while (scheduledOrRunning > 0) { try { wait(); + logger.fine(""+this+" waitForNotRunning scheduleOrRunning: "+scheduledOrRunning); } catch (InterruptedException e) { // ignore interruption, try again } 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 1bd53516a22..119377844b1 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 @@ -59,14 +59,14 @@ public class OperationalTransformationTest { } @Test - public void testAddColumnToLeaderboardOnClientAndRemoveLeaderboardOnServer() { + public void testAddColumnToLeaderboardOnClientAndRemoveLeaderboardOnServer() throws InterruptedException { RacingEventServiceOperation addLeaderboardColumn = new AddColumnToLeaderboard( "newColumn", DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, /* medalRace */ true); server.apply(addLeaderboardColumn); RacingEventServiceOperation removeDefaultLeaderboard = new RemoveLeaderboard(DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME); replica.apply(removeDefaultLeaderboard); - server.waitForNotRunning(); replica.waitForNotRunning(); + server.waitForNotRunning(); assertEquals(0, racingEventServiceReplica.getLeaderboards().size()); assertEquals(0, racingEventServiceServer.getLeaderboards().size()); } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractLeaderboardColumnOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractLeaderboardColumnOperation.java index d92b65d71e7..eedbb080031 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractLeaderboardColumnOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractLeaderboardColumnOperation.java @@ -20,7 +20,7 @@ public abstract class AbstractLeaderboardColumnOperation extends AbstractLeaderb @Override - public RacingEventServiceOperation transformServerRemoveColumnFromLeaderboard( + public RacingEventServiceOperation transformRemoveColumnFromLeaderboardServerOp( RemoveColumnFromLeaderboard removeColumnFromLeaderboardServerOp) { if (affectsSameColumn(removeColumnFromLeaderboardServerOp)) { // skip server's remove and hence only apply the client's remove operation @@ -31,7 +31,7 @@ public abstract class AbstractLeaderboardColumnOperation extends AbstractLeaderb } @Override - public RacingEventServiceOperation transformClientRemoveColumnFromLeaderboard( + public RacingEventServiceOperation transformRemoveColumnFromLeaderboardClientOp( RemoveColumnFromLeaderboard removeColumnFromLeaderboardClientOp) { if (affectsSameColumn(removeColumnFromLeaderboardClientOp)) { // skip client's remove and hence only apply the server's remove operation diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractLeaderboardOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractLeaderboardOperation.java index d247a4ce86e..01ab18bdcbb 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractLeaderboardOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractLeaderboardOperation.java @@ -18,23 +18,4 @@ public abstract class AbstractLeaderboardOperation extends AbstractRacingEventSe return getLeaderboardName().equals(other.getLeaderboardName()); } - @Override - public RacingEventServiceOperation transformRemoveLeaderboardClientOp(RemoveLeaderboard removeLeaderboard) { - if (affectsSameLeaderboard(removeLeaderboard)) { - return AbstractRacingEventServiceOperation.getNoOp(); - } else { - return this; - } - } - - - @Override - public RacingEventServiceOperation transformRemoveLeaderboardServerOp(RemoveLeaderboard removeLeaderboard) { - if (affectsSameLeaderboard(removeLeaderboard)) { - return AbstractRacingEventServiceOperation.getNoOp(); - } else { - return this; - } - } - } 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 a90686cf509..6c5b7cc45e0 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 @@ -33,27 +33,39 @@ public abstract class AbstractRacingEventServiceOperation implements RacingEvent } @Override - public RacingEventServiceOperation transformClientRenameLeaderboardColumnOp( + public RacingEventServiceOperation transformRenameLeaderboardColumnClientOp( RenameLeaderboardColumn renameLeaderboardColumnClientOp) { return renameLeaderboardColumnClientOp; } @Override - public RacingEventServiceOperation transformServerRenameLeaderboardColumnOp( + public RacingEventServiceOperation transformRenameLeaderboardColumnServerOp( RenameLeaderboardColumn renameLeaderboardColumnServerOp) { return renameLeaderboardColumnServerOp; } @Override - public RacingEventServiceOperation transformServerRemoveColumnFromLeaderboard(RemoveColumnFromLeaderboard removeColumnFromLeaderboardServerOp) { + public RacingEventServiceOperation transformRemoveColumnFromLeaderboardServerOp(RemoveColumnFromLeaderboard removeColumnFromLeaderboardServerOp) { return removeColumnFromLeaderboardServerOp; } @Override - public RacingEventServiceOperation transformClientRemoveColumnFromLeaderboard(RemoveColumnFromLeaderboard removeColumnFromLeaderboardClientOp) { + public RacingEventServiceOperation transformRemoveColumnFromLeaderboardClientOp(RemoveColumnFromLeaderboard removeColumnFromLeaderboardClientOp) { return removeColumnFromLeaderboardClientOp; } + @Override + public RacingEventServiceOperation transformAddColumnToLeaderboardClientOp( + AddColumnToLeaderboard addColumnToLeaderboard) { + return addColumnToLeaderboard; + } + + @Override + public RacingEventServiceOperation transformAddColumnToLeaderboardServerOp( + AddColumnToLeaderboard addColumnToLeaderboard) { + return addColumnToLeaderboard; + } + public static RacingEventServiceOperation getNoOp() { return new AbstractRacingEventServiceOperation() { @Override @@ -63,12 +75,17 @@ public abstract class AbstractRacingEventServiceOperation implements RacingEvent @Override public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) { - return serverOp; + return this; } @Override public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) { - return clientOp; + return this; + } + + @Override + public String toString() { + return "noop"; } }; } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddColumnToLeaderboard.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddColumnToLeaderboard.java index b4ca749b45d..ba842dcaa3c 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddColumnToLeaderboard.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddColumnToLeaderboard.java @@ -25,13 +25,11 @@ public class AddColumnToLeaderboard extends AbstractLeaderboardColumnOperation { @Override public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) { - // TODO Auto-generated method stub - return null; + return serverOp.transformAddColumnToLeaderboardClientOp(this); } @Override public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) { - // TODO Auto-generated method stub - return null; + return clientOp.transformAddColumnToLeaderboardServerOp(this); } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RacingEventServiceOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RacingEventServiceOperation.java index 2594b2a877a..3aaf890613d 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RacingEventServiceOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/RacingEventServiceOperation.java @@ -29,13 +29,13 @@ public interface RacingEventServiceOperation extends OperationremoveColumnFromLeaderboardClientOp, * the result will be null, meaning that this operation cannot be applied after the column has been removed. */ - RacingEventServiceOperation transformClientRemoveColumnFromLeaderboard(RemoveColumnFromLeaderboard removeColumnFromLeaderboardClientOp); + RacingEventServiceOperation transformRemoveColumnFromLeaderboardClientOp(RemoveColumnFromLeaderboard removeColumnFromLeaderboardClientOp); - RacingEventServiceOperation transformServerRemoveColumnFromLeaderboard(RemoveColumnFromLeaderboard removeColumnFromLeaderboardServerOp); + RacingEventServiceOperation transformRemoveColumnFromLeaderboardServerOp(RemoveColumnFromLeaderboard removeColumnFromLeaderboardServerOp); - RacingEventServiceOperation transformClientRenameLeaderboardColumnOp(RenameLeaderboardColumn renameLeaderboardColumnClientOp); + RacingEventServiceOperation transformRenameLeaderboardColumnClientOp(RenameLeaderboardColumn renameLeaderboardColumnClientOp); - RacingEventServiceOperation transformServerRenameLeaderboardColumnOp(RenameLeaderboardColumn renameLeaderboardColumnServerOp); + RacingEventServiceOperation transformRenameLeaderboardColumnServerOp(RenameLeaderboardColumn renameLeaderboardColumnServerOp); RacingEventServiceOperation transformAddLeaderboardClientOp(AddLeaderboard addLeaderboard); @@ -44,4 +44,8 @@ public interface RacingEventServiceOperation extends Operation