/** * Returns the name of this wavelet. */ public WaveletName getWaveletName() { return WaveletDataUtil.waveletNameOf(snapshot); }
/** * Constructs a new {@link RobotWaveletData}. The given * {@link ReadableWaveletData} will be copied by the constructor. * * @param snapshot the base {@link ReadableWaveletData} from which * {@link OpBasedWavelet} are created. * @param committedVersion the committed version of the given snapshot, used * to generate deltas. */ public RobotWaveletData(ReadableWaveletData snapshot, HashedVersion committedVersion) { this.snapshot = WaveletDataUtil.copyWavelet(snapshot); this.snapshotVersion = committedVersion; }
public static String addParameter(String url, String name, String value) { int qpos = url.indexOf('?'); int hpos = url.indexOf('#'); char sep = qpos == -1 ? '?' : '&'; String seg = sep + encodeUrl(name) + '=' + encodeUrl(value); return hpos == -1 ? url + seg : url.substring(0, hpos) + seg + url.substring(hpos); }
public void testBuildWaveletFromOneDelta() throws Exception { WaveletData wavelet = build( delta(addParticipant(CREATOR, 1093L, HashedVersion.unsigned(1))) ); assertEquals(WAVELET_NAME, WaveletDataUtil.waveletNameOf(wavelet)); assertEquals(CREATOR, wavelet.getCreator()); assertEquals(1093L, wavelet.getCreationTime()); assertEquals(1093L, wavelet.getLastModifiedTime()); assertEquals(HashedVersion.unsigned(1), wavelet.getHashedVersion()); assertEquals(ImmutableSet.of(), wavelet.getDocumentIds()); assertEquals(ImmutableSet.of(CREATOR), wavelet.getParticipants()); }
public void testBase64CharacterSpreadInLongId() { final int chars = 40000; final double variance = 0.2; // % difference for (RandomBase64Generator generator : generators) { int[] histogram = new int[256]; String id = generator.next(chars); for (byte b : id.getBytes()) histogram[b + 128]++; verifyBase64Spread(histogram, id.length(), variance); } }
public void testBase64IdLengths() { for (RandomBase64Generator generator : generators) for (int i = 0; i < 100; i++) assertEquals(i, generator.next(i).length()); }
public void testUniqueness() { for (RandomBase64Generator generator : generators) { HashSet<String> set = new HashSet<String>(); // Len starts at 4 because collisions in really small strings are // actually likely. for (int len = 4; len < 10; len++) { // Expect at most 1 collision among (2^i)+1 pseudo-random strings // of length i set.clear(); int collisions = 0; for (int j = 0; j < (1 << len) + 1; j++) { if (!set.add(generator.next(len))) collisions++; } assertTrue("improbable " + collisions + " collisions in set of " + set.size(), collisions <= 1); } } }
private WaveletOperation addParticipant(ParticipantId user, long time, HashedVersion version) { return new AddParticipant(opContext(time, version), user); }
public void testBuildWaveletFromOneDelta() throws Exception { WaveletData wavelet = build( delta(addParticipant(CREATOR, 1093L, HashedVersion.unsigned(1))) ); assertEquals(WAVELET_NAME, WaveletDataUtil.waveletNameOf(wavelet)); assertEquals(CREATOR, wavelet.getCreator()); assertEquals(1093L, wavelet.getCreationTime()); assertEquals(1093L, wavelet.getLastModifiedTime()); assertEquals(HashedVersion.unsigned(1), wavelet.getHashedVersion()); assertEquals(ImmutableSet.of(), wavelet.getDocumentIds()); assertEquals(ImmutableSet.of(CREATOR), wavelet.getParticipants()); }
public void testBase64CharacterSpreadInLongId() { final int chars = 40000; final double variance = 0.2; // % difference for (RandomBase64Generator generator : generators) { int[] histogram = new int[256]; String id = generator.next(chars); for (byte b : id.getBytes()) histogram[b + 128]++; verifyBase64Spread(histogram, id.length(), variance); } }
public void testBase64IdLengths() { for (RandomBase64Generator generator : generators) for (int i = 0; i < 100; i++) assertEquals(i, generator.next(i).length()); }
public void testUniqueness() { for (RandomBase64Generator generator : generators) { HashSet<String> set = new HashSet<String>(); // Len starts at 4 because collisions in really small strings are // actually likely. for (int len = 4; len < 10; len++) { // Expect at most 1 collision among (2^i)+1 pseudo-random strings // of length i set.clear(); int collisions = 0; for (int j = 0; j < (1 << len) + 1; j++) { if (!set.add(generator.next(len))) collisions++; } assertTrue("improbable " + collisions + " collisions in set of " + set.size(), collisions <= 1); } } }
/** * Creates an empty wavelet. * * @param waveletName the name of the wavelet. * @param author the author of the wavelet. * @param creationTimestamp the time at which the wavelet is created. */ public static ObservableWaveletData createEmptyWavelet(WaveletName waveletName, ParticipantId author, HashedVersion version, long creationTimestamp) { return copyWavelet(new EmptyWaveletSnapshot(waveletName.waveId, waveletName.waveletId, author, version, creationTimestamp)); }
/** * Constructs a {@link WaveletAndDeltas} from the given {@link WaveletData} * and {@link WaveletDelta}s. * * @param preDeltasSnapshot the state of the wavelet before the deltas have * been applied. * @param postDeltasSnapshot the state of the wavelet after the deltas have * been applied. * @param deltas deltas in the order they have been applied to the wavelet. */ private WaveletAndDeltas(ObservableWaveletData preDeltasSnapshot, ObservableWaveletData postDeltasSnapshot, DeltaSequence deltas) { this.snapshotBeforeDeltas = preDeltasSnapshot; this.deltas = deltas; this.snapshotAfterDeltas = postDeltasSnapshot; this.waveletName = WaveletDataUtil.waveletNameOf(preDeltasSnapshot); }
private WaveletOperation addParticipant(ParticipantId user, long time, HashedVersion version) { return new AddParticipant(opContext(time, version), user); }
public void testBase64IdCharacterSpreadAtFixedCharPosition() { final int count = 40000; final double variance = 0.3; // % difference // Pick a fixed id length (in quads) and a fixed char position therein. final int chars = 4 + (int) (Math.random() * 10); // between 4 and 14 characters final int index = (int) (Math.random() * chars); // index into id strings for (RandomBase64Generator generator : generators) { int[] histogram = new int[256]; for (int i = 0; i < count; i++) { String id = generator.next(chars); byte b = id.getBytes()[index]; // char at fixed position histogram[b + 128]++; } verifyBase64Spread(histogram, count, variance); } }
public List<ObservableWaveletData> copyWaveletData() { // This data object already has an op-based owner on top. Must copy it. return ImmutableList.of(WaveletDataUtil.copyWavelet(waveletData), WaveletDataUtil.copyWavelet(userWaveletData)); }
public void testBase64IdCharacterSpreadAtFixedCharPosition() { final int count = 40000; final double variance = 0.3; // % difference // Pick a fixed id length (in quads) and a fixed char position therein. final int chars = 4 + (int) (Math.random() * 10); // between 4 and 14 characters final int index = (int) (Math.random() * chars); // index into id strings for (RandomBase64Generator generator : generators) { int[] histogram = new int[256]; for (int i = 0; i < count; i++) { String id = generator.next(chars); byte b = id.getBytes()[index]; // char at fixed position histogram[b + 128]++; } verifyBase64Spread(histogram, count, variance); } }
public List<ObservableWaveletData> copyWaveletData() { // This data object already has an op-based owner on top. Must copy it. return ImmutableList.of(WaveletDataUtil.copyWavelet(waveletData), WaveletDataUtil.copyWavelet(userWaveletData)); }
@Override public ObservableWaveletData copyWaveletData() throws WaveletStateException { awaitLoad(); acquireReadLock(); try { checkStateOk(); return WaveletDataUtil.copyWavelet(waveletState.getSnapshot()); } finally { releaseReadLock(); } }