/** Deserializes a protobuf to a HashedVersion POJO. */ public static HashedVersion deserialize(ProtocolHashedVersion hashedVersion) { final ByteString historyHash = hashedVersion.getHistoryHash(); return HashedVersion.of(hashedVersion.getVersion(), historyHash.toByteArray()); }
/** * Return the version zero hash for the given wavelet name. */ public static ProtocolHashedVersion createVersionZero(WaveletName waveletName) { byte[] initialHash = HASH_FACTORY.createVersionZero(waveletName).getHistoryHash(); return ProtocolHashedVersion.newBuilder() .setVersion(0) .setHistoryHash(ByteString.copyFrom(initialHash)) .build(); }
private void getDeltas(OperationContext context, WaveletName waveletName, ParticipantId participant, HashedVersion fromVersion, HashedVersion toVersion, RawDeltasListener listener) throws InvalidRequestException { final List<byte[]> deltaBytes = new LinkedList<byte[]>(); final AtomicReference<HashedVersion> version = new AtomicReference<HashedVersion>(); final AtomicInteger length = new AtomicInteger(0); context.getDeltas(waveletName, participant, fromVersion, toVersion, new Receiver<TransformedWaveletDelta>() { @Override public boolean put(TransformedWaveletDelta delta) { ProtocolWaveletDelta protoDelta = CoreWaveletOperationSerializer.serialize(delta); byte[] bytes = protoDelta.toByteArray(); deltaBytes.add(bytes); version.set(delta.getResultingVersion()); return length.addAndGet(bytes.length) < GET_HISTORY_BYTES_LENGTH_LIMIT; } }); listener.onSuccess(deltaBytes, CoreWaveletOperationSerializer.serialize(version.get()).toByteArray()); }
currentVersion = waveletSnapshot.snapshot.getVersion(); if (currentVersion == delta.getHashedVersion().getVersion()) { if (importedFromVersion == -1) { importedFromVersion = currentVersion; + delta.getHashedVersion().getVersion() + ", but current version is " + currentVersion + "." + "Possibly wavelet is modified during import."); return;
+ delta.getHashedVersion().getVersion() + " with " + delta.getOperationCount() + " ops");
if (delta.getHashedVersion().getVersion() == 0) { LOG.warning("Remote user tried to submit delta at version 0 - disallowed. " + signedDelta); listener.onFailure(FederationErrors.badRequest("Remote users may not create wavelets."));
listener.onSuccess(deltaHistoryBytes.build(), endVersion, endVersion.getVersion());
wavelet.setVersion(snapshot.getVersion().getVersion()); wavelet.setLastModifiedTime(snapshot.getLastModifiedTime());
@Override public void submitRequest(WaveletName waveletName, ProtocolWaveletDelta delta, final SubmitRequestListener listener) { Preconditions.checkState(initialized, "Wave server not yet initialized"); if (delta.getOperationCount() == 0) { listener.onFailure("Empty delta at version " + delta.getHashedVersion().getVersion()); return; } // The serialised version of this delta happens now. This should be the only place, ever! ProtocolSignedDelta signedDelta = certificateManager.signDelta(ByteStringMessage.serializeMessage(delta)); submitDelta(waveletName, delta, signedDelta, new SubmitResultListener() { @Override public void onFailure(FederationError errorMessage) { listener.onFailure(errorMessage.getErrorMessage()); } @Override public void onSuccess(int operationsApplied, ProtocolHashedVersion hashedVersionAfterApplication, long applicationTimestamp) { listener.onSuccess(operationsApplied, CoreWaveletOperationSerializer.deserialize(hashedVersionAfterApplication), applicationTimestamp); } }); }
/** * Sets correct version hash to delta. * * @param delta the source delta. * @param waveletSnapshot to append delta. * @param waveletName name of wavelet. * @return the delta to import. * @throws InvalidParticipantAddress deserialize of participant error. */ ProtocolWaveletDelta setVersionHash(ProtocolWaveletDelta delta, CommittedWaveletSnapshot waveletSnapshot, WaveletName waveletName) throws InvalidParticipantAddress { ProtocolWaveletDelta.Builder newDelta = ProtocolWaveletDelta.newBuilder(delta); if (waveletSnapshot == null) { ProtocolHashedVersion ver = ProtocolHashedVersion.newBuilder(delta.getHashedVersion()). setHistoryHash(ByteString.copyFrom(HASH_FACTORY.createVersionZero(waveletName).getHistoryHash())). build(); newDelta.setHashedVersion(ver); } else { ProtocolHashedVersion ver = ProtocolHashedVersion.newBuilder(delta.getHashedVersion()). setHistoryHash(ByteString.copyFrom(waveletSnapshot.snapshot.getHashedVersion().getHistoryHash())). build(); newDelta.setHashedVersion(ver); } return newDelta.build(); } }
/** * Assert that an operation is unchanged when serialised then deserialised. * * @param op operation to check */ private static void assertReversible(WaveletOperation op) { // Test both (de)serialising a single operation... assertEquals(op, CoreWaveletOperationSerializer.deserialize( CoreWaveletOperationSerializer.serialize(op), OP_CONTEXT)); List<WaveletOperation> ops = ImmutableList.of(op, op, op); ParticipantId author = new ParticipantId("kalman@google.com"); HashedVersion hashedVersion = HashedVersion.unsigned(0); WaveletDelta delta = new WaveletDelta(author, hashedVersion, ops); ProtocolWaveletDelta serialized = CoreWaveletOperationSerializer.serialize(delta); WaveletDelta deserialized = CoreWaveletOperationSerializer.deserialize(serialized); assertEquals(hashedVersion.getVersion(), serialized.getHashedVersion().getVersion()); assertTrue(Arrays.equals(hashedVersion.getHistoryHash(), serialized.getHashedVersion().getHistoryHash().toByteArray())); assertDeepEquals(delta, deserialized); }
/** * Assert that an operation is unchanged when serialised then deserialised. * * @param op operation to check */ private static void assertReversible(WaveletOperation op) { // Test both (de)serialising a single operation... assertEquals(op, CoreWaveletOperationSerializer.deserialize( CoreWaveletOperationSerializer.serialize(op), OP_CONTEXT)); List<WaveletOperation> ops = ImmutableList.of(op, op, op); ParticipantId author = new ParticipantId("kalman@google.com"); HashedVersion hashedVersion = HashedVersion.unsigned(0); WaveletDelta delta = new WaveletDelta(author, hashedVersion, ops); ProtocolWaveletDelta serialized = CoreWaveletOperationSerializer.serialize(delta); WaveletDelta deserialized = CoreWaveletOperationSerializer.deserialize(serialized); assertEquals(hashedVersion.getVersion(), serialized.getHashedVersion().getVersion()); assertTrue(Arrays.equals(hashedVersion.getHistoryHash(), serialized.getHashedVersion().getHistoryHash().toByteArray())); assertDeepEquals(delta, deserialized); }
/** * Return the updated ProtocolHashedVersion for the given input. * * @param appliedDeltaBytes raw bytes of appliedDelta * @param appliedAt version delta was applied at, must match appliedDelta * @param operationsApplied number of operations applied, must match appliedDelta * @return new ProtocolHashedVersion */ public static ProtocolHashedVersion create(ByteString appliedDeltaBytes, ProtocolHashedVersion appliedAt, int operationsApplied) { // TODO(thorogood): verify appliedAt and operationsApplied against the raw bytes? return ProtocolHashedVersion.newBuilder() .setVersion(appliedAt.getVersion() + operationsApplied) .setHistoryHash(nextHash(appliedAt.getHistoryHash(), appliedDeltaBytes)) .build(); }
private HashedVersion getVersionParameter(OperationRequest operation, ParamsProperty parameter) throws InvalidRequestException { byte[] bytes = OperationUtil.<byte[]>getRequiredParameter( operation, parameter); ProtocolHashedVersion protoVersion; try { protoVersion = ProtocolHashedVersion.parseFrom(bytes); } catch (InvalidProtocolBufferException ex) { throw new InvalidRequestException("Invalid version " + parameter.key(), operation, ex); } return CoreWaveletOperationSerializer.deserialize(protoVersion); } }
/** Serializes a HashedVersion POJO to a protobuf. */ public static ProtocolHashedVersion serialize(HashedVersion hashedVersion) { return ProtocolHashedVersion.newBuilder().setVersion(hashedVersion.getVersion()). setHistoryHash(ByteString.copyFrom(hashedVersion.getHistoryHash())).build(); }