if (areSame(client, server)) { List<WaveletOperation> outServer = CollectionUtils.newArrayList();
/** * Detect if the whole delta is an echo back. If it is then take it as if it was an ack. * Echo back is a result of reconnection/recovery. * @return If the delta is a echo back. * @throws TransformException */ private boolean detectEchoBack(TransformedWaveletDelta serverDelta) throws TransformException { // We have got all the initial list of operations. So do nothing. if (endOfStartingDelta == null || endOfStartingDelta.getVersion() <= serverDelta.getAppliedAtVersion()) { return false; } // Check to see if we are getting a delta that was sent by us, in case the // server echos back our own delta from a recovery scenario. if (unacknowledged != null && DeltaPair.areSame(serverDelta, unacknowledged)) { // If we completely match then take it as an ack. onSuccess(serverDelta.size(), serverDelta.getResultingVersion()); return true; } // We've just got to the end of the initial list of operations // and there is no match. That means we need to merge the unacknowledged // ops and resend again. if (endOfStartingDelta.equals(serverDelta.getResultingVersion())) { mergeToClientQueue(inferredServerPath.size()); } return false; }
/** * Simple test for deltas that have the same operations and the same author. * @throws TransformException */ public void testIsSame() throws TransformException { // Client insert ".A.B" List<WaveletOperation> client = CollectionUtils.newArrayList(); client.add(CLIENT_UTIL.insert(1, "A", 1, null)); client.add(CLIENT_UTIL.insert(3, "B", 0, null)); // Server insert ".A.B HashedVersion resultingVersion = HashedVersion.of(1L, new byte[] {1, 2, 3, 4}); List<WaveletOperation> server = CollectionUtils.newArrayList(); // Use CLIENT_UTIL to get the same author info. server.add(CLIENT_UTIL.insert(1, "A", 1, null)); server.add(CLIENT_UTIL.insert(3, "B", 0, resultingVersion)); // Deltas with same ops are the same, other info should be ignored assertTrue(DeltaPair.areSame(client, server)); // Transforming the ops should result in only version update server ops DeltaPair pair = new DeltaPair(client, server); pair = pair.transform(); assertEquals(0, pair.getClient().size()); assertEquals(2, pair.getServer().size()); checkVersionUpdate(pair.getServer().get(0), 1, null); checkVersionUpdate(pair.getServer().get(1), 1, resultingVersion); }
/** * Simple test for deltas that have the same operations and the same author. * @throws TransformException */ public void testIsSame() throws TransformException { // Client insert ".A.B" List<WaveletOperation> client = CollectionUtils.newArrayList(); client.add(CLIENT_UTIL.insert(1, "A", 1, null)); client.add(CLIENT_UTIL.insert(3, "B", 0, null)); // Server insert ".A.B HashedVersion resultingVersion = HashedVersion.of(1L, new byte[] {1, 2, 3, 4}); List<WaveletOperation> server = CollectionUtils.newArrayList(); // Use CLIENT_UTIL to get the same author info. server.add(CLIENT_UTIL.insert(1, "A", 1, null)); server.add(CLIENT_UTIL.insert(3, "B", 0, resultingVersion)); // Deltas with same ops are the same, other info should be ignored assertTrue(DeltaPair.areSame(client, server)); // Transforming the ops should result in only version update server ops DeltaPair pair = new DeltaPair(client, server); pair = pair.transform(); assertEquals(0, pair.getClient().size()); assertEquals(2, pair.getServer().size()); checkVersionUpdate(pair.getServer().get(0), 1, null); checkVersionUpdate(pair.getServer().get(1), 1, resultingVersion); }