Author: yurize
Date: Sat Jan 12 20:23:03 2013
New Revision: 1432503
URL: http://svn.apache.org/viewvc?rev=1432503&view=rev
Log:
Fixes WAVE-354: SimpleSearch.DigestProxy should update only the opened
wave on changes. By rocklund
https://reviews.apache.org/r/7683
Modified:
incubator/wave/trunk/src/org/waveprotocol/box/common/Snippets.java
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelView.java
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelWidget.java
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPresenter.java
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SimpleSearch.java
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/WaveBasedDigest.java
incubator/wave/trunk/src/org/waveprotocol/wave/concurrencycontrol/wave/CcBasedWavelet.java
incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/Wavelet.java
incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/opbased/OpBasedWavelet.java
Modified: incubator/wave/trunk/src/org/waveprotocol/box/common/Snippets.java
URL:
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/common/Snippets.java?rev=1432503&r1=1432502&r2=1432503&view=diff
==============================================================================
--- incubator/wave/trunk/src/org/waveprotocol/box/common/Snippets.java
(original)
+++ incubator/wave/trunk/src/org/waveprotocol/box/common/Snippets.java Sat Jan
12 20:23:03 2013
@@ -44,6 +44,8 @@ import java.util.Set;
*/
public final class Snippets {
+ public static final int DIGEST_SNIPPET_LENGTH = 140;
+
/**
* Concatenates all of the text for the given documents in
* {@link WaveletData}.
Modified:
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelView.java
URL:
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelView.java?rev=1432503&r1=1432502&r2=1432503&view=diff
==============================================================================
---
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelView.java
(original)
+++
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelView.java
Sat Jan 12 20:23:03 2013
@@ -58,6 +58,12 @@ public interface SearchPanelView {
/** @return the search toolbar. */
GroupingToolbar.View getToolbar();
+ /** @return the first digest. */
+ DigestView getFirst();
+
+ /** @return the last digest. */
+ DigestView getLast();
+
/** @return the digest view after another. */
DigestView getNext(DigestView ref);
@@ -67,6 +73,9 @@ public interface SearchPanelView {
/** @return a rendering of {@code digest}. */
DigestView insertBefore(DigestView ref, Digest digest);
+ /** @return a rendering of {@code digest}. */
+ DigestView insertAfter(DigestView ref, Digest digest);
+
/** Removes all digest views. */
void clearDigests();
Modified:
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelWidget.java
URL:
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelWidget.java?rev=1432503&r1=1432502&r2=1432503&view=diff
==============================================================================
---
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelWidget.java
(original)
+++
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPanelWidget.java
Sat Jan 12 20:23:03 2013
@@ -161,6 +161,16 @@ public class SearchPanelWidget extends C
}
@Override
+ public DigestDomImpl getFirst() {
+ return digests.getFirst();
+ }
+
+ @Override
+ public DigestDomImpl getLast() {
+ return digests.getLast();
+ }
+
+ @Override
public DigestDomImpl getNext(DigestView ref) {
return digests.getNext(narrow(ref));
}
@@ -185,6 +195,24 @@ public class SearchPanelWidget extends C
}
@Override
+ public DigestDomImpl insertAfter(DigestView ref, Digest digest) {
+ DigestDomImpl digestUi = digestPool.get();
+ renderer.render(digest, digestUi);
+
+ DigestDomImpl refDomImpl = narrow(ref);
+ Element refElement = refDomImpl != null ? refDomImpl.getElement() :
showMore;
+ byId.put(digestUi.getId(), digestUi);
+ if (refElement != showMore) {
+ digests.insertAfter(refDomImpl, digestUi);
+ list.insertAfter(digestUi.getElement(), refElement);
+ } else {
+ digests.insertBefore(refDomImpl, digestUi);
+ list.insertBefore(digestUi.getElement(), refElement);
+ }
+ return digestUi;
+ }
+
+ @Override
public void clearDigests() {
while (!digests.isEmpty()) {
digests.getFirst().remove(); // onDigestRemoved removes it from digests.
Modified:
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPresenter.java
URL:
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPresenter.java?rev=1432503&r1=1432502&r2=1432503&view=diff
==============================================================================
---
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPresenter.java
(original)
+++
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SearchPresenter.java
Sat Jan 12 20:23:03 2013
@@ -98,9 +98,10 @@ public final class SearchPresenter
private int querySize = DEFAULT_PAGE_SIZE;
/** Current selected digest. */
private DigestView selected;
-
+
/** The dispatcher of profiles events. */
SourcesEvents<ProfileListener> profiles;
+ private boolean isRenderingInProgress = false;
SearchPresenter(TimerService scheduler, Search search, SearchPanelView
searchUi,
WaveActionHandler actionHandler, SourcesEvents<ProfileListener>
profiles) {
@@ -221,6 +222,7 @@ public final class SearchPresenter
}
private void renderDigests() {
+ isRenderingInProgress = true;
// Preserve selection on re-rendering.
WaveId toSelect = selected != null ? digestUis.get(selected).getWaveId() :
null;
searchUi.clearDigests();
@@ -237,6 +239,7 @@ public final class SearchPresenter
setSelected(digestUi);
}
}
+ isRenderingInProgress = false;
}
private void renderShowMore() {
@@ -315,9 +318,60 @@ public final class SearchPresenter
renderLater();
}
+ /**
+ * Find the DigestView that contains a certain digest
+ *
+ * @param digest the digest the DigestView should contain.
+ * @return the DigestView containing the digest. {@null} if the digest is
+ * not found.
+ */
+ private DigestView findDigestView(Digest digest) {
+ DigestView digestUi = searchUi.getFirst();
+ while(digestUi != null) {
+ if (digestUis.get(digestUi).equals(digest)) {
+ return digestUi;
+ }
+ digestUi = searchUi.getNext(digestUi);
+ }
+ return null;
+ }
+
+ /**
+ * Insert a digest before amongst the currently shown digests
+ *
+ * @param insertRef the DigestView to insert the new digest before. The new
digest
+ * is inserted last if insertRef is {@null}.
+ * @param digest the digest to insert.
+ * @return the newly inserted DigestView.
+ */
+ private DigestView insertDigest(DigestView insertRef, Digest digest) {
+ DigestView newDigestUi = null;
+ if (insertRef != null) {
+ newDigestUi = searchUi.insertBefore(insertRef, digest);
+ digestUis.put(newDigestUi, digest);
+ } else {
+ insertRef = searchUi.getLast();
+ newDigestUi = searchUi.insertAfter(insertRef, digest);
+ digestUis.put(newDigestUi, digest);
+ }
+ return newDigestUi;
+ }
+
@Override
public void onDigestReady(int index, Digest digest) {
- renderLater();
+ if (isRenderingInProgress) {
+ return;
+ }
+
+ setSelected(null);
+ DigestView digestToRemove = findDigestView(digest);
+ if (digestToRemove == null) {
+ return;
+ }
+ DigestView insertRef = searchUi.getNext(digestToRemove);
+ digestToRemove.remove();
+ DigestView newDigestUi = insertDigest(insertRef, digest);
+ setSelected(newDigestUi);
}
@Override
Modified:
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SimpleSearch.java
URL:
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SimpleSearch.java?rev=1432503&r1=1432502&r2=1432503&view=diff
==============================================================================
---
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SimpleSearch.java
(original)
+++
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/SimpleSearch.java
Sat Jan 12 20:23:03 2013
@@ -83,7 +83,7 @@ public final class SimpleSearch implemen
*/
void activate(WaveContext wave) {
Preconditions.checkState(dynamicDigest == null);
- dynamicDigest = WaveBasedDigest.create(wave, staticDigest);
+ dynamicDigest = WaveBasedDigest.create(wave);
dynamicDigest.addListener(this);
fireOnChanged();
}
@@ -103,14 +103,11 @@ public final class SimpleSearch implemen
}
/**
- * Updates the static digest. If this proxy is not currently live, this
- * fires a change event.
+ * Updates the static digest. Do nothing if this digest is currently live.
*/
void update(DigestSnapshot snapshot) {
staticDigest = snapshot;
- if (dynamicDigest != null) {
- dynamicDigest.setDelegate(staticDigest);
- } else {
+ if (dynamicDigest == null) {
fireOnChanged();
}
}
@@ -332,19 +329,17 @@ public final class SimpleSearch implemen
DigestProxy oldDigest = getDigest(i);
results.remove(i);
digests.remove(ModernIdSerialiser.INSTANCE.serialiseWaveId(oldDigest.getWaveId()));
- fireOnDigestRemoved(i, oldDigest);
oldDigest.destroy();
}
// Now grow from nothing up to the new result size.
if (this.total != total) {
this.total = total;
- fireOnTotalChanged(total);
}
ensureMinimumSize(total == Search.UNKNOWN_SIZE ? from +
newDigests.size() : total);
for (int to = from + newDigests.size(), i = from; i < to; i++) {
results.set(i, newDigests.get(i - from));
- fireOnDigestReady(i, getDigest(i));
}
+ fireOnTotalChanged(total);
fireOnStateChanged();
}
}
Modified:
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/WaveBasedDigest.java
URL:
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/WaveBasedDigest.java?rev=1432503&r1=1432502&r2=1432503&view=diff
==============================================================================
---
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/WaveBasedDigest.java
(original)
+++
incubator/wave/trunk/src/org/waveprotocol/box/webclient/search/WaveBasedDigest.java
Sat Jan 12 20:23:03 2013
@@ -19,9 +19,11 @@
package org.waveprotocol.box.webclient.search;
+import org.waveprotocol.box.common.Snippets;
import org.waveprotocol.wave.client.state.BlipReadStateMonitor;
import org.waveprotocol.wave.model.conversation.Conversation;
import org.waveprotocol.wave.model.conversation.ConversationStructure;
+import org.waveprotocol.wave.model.conversation.TitleHelper;
import org.waveprotocol.wave.model.id.IdUtil;
import org.waveprotocol.wave.model.id.WaveId;
import org.waveprotocol.wave.model.util.CollectionUtils;
@@ -33,8 +35,10 @@ import org.waveprotocol.wave.model.wave.
import org.waveprotocol.wave.model.wave.WaveViewListener;
import org.waveprotocol.wave.model.wave.Wavelet;
import org.waveprotocol.wave.model.wave.WaveletListener;
+import org.waveprotocol.wave.model.wave.data.ObservableWaveletData;
import java.util.List;
+import java.util.Set;
/**
* Produces a digest from a wave.
@@ -49,8 +53,6 @@ public final class WaveBasedDigest
/** The wave to digest. */
private final WaveContext wave;
- /** An alternative digest for this wave - really just used for the snippet.
*/
- private Digest delegate;
/** Observers of this digest. */
// TODO(hearnden): make a single listener.
private final CopyOnWriteSet<Listener> listeners = CopyOnWriteSet.create();
@@ -59,17 +61,17 @@ public final class WaveBasedDigest
private List<ParticipantId> participantSnippet;
private ParticipantId author;
private double lastModified = NO_TIME;
+ String snippet = null;
- WaveBasedDigest(WaveContext wave, Digest delegate) {
+ WaveBasedDigest(WaveContext wave) {
this.wave = wave;
- this.delegate = delegate;
}
/**
* Creates a digest.
*/
- public static WaveBasedDigest create(WaveContext wave, Digest delegate) {
- WaveBasedDigest digest = new WaveBasedDigest(wave, delegate);
+ public static WaveBasedDigest create(WaveContext wave) {
+ WaveBasedDigest digest = new WaveBasedDigest(wave);
digest.init();
return digest;
}
@@ -86,7 +88,6 @@ public final class WaveBasedDigest
* Releases listeners from observed resources.
*/
void destroy() {
- setDelegate(null);
wave.getBlipMonitor().removeListener(this);
wave.getWave().removeListener(this);
for (ObservableWavelet wavelet : wave.getWave().getWavelets()) {
@@ -94,16 +95,6 @@ public final class WaveBasedDigest
}
}
- /**
- * Sets this digest's delegate. This digest sources answers from its delegate
- * for queries that it is unable to compute from the wave itself. The
delegate
- * may be replaced.
- */
- void setDelegate(Digest delegate) {
- this.delegate = delegate;
- fireOnChanged();
- }
-
private void ensureParticipants() {
if (participantSnippet != null) {
return;
@@ -188,14 +179,14 @@ public final class WaveBasedDigest
@Override
public String getTitle() {
- // Titles are not yet supported in Conversation model.
- return delegate.getTitle();
+ return TitleHelper.extractTitle(
+
wave.getConversations().getRoot().getRootThread().getFirstBlip().getContent());
}
@Override
public String getSnippet() {
- // Client-side snippeting is not supported.
- return delegate.getSnippet();
+ updateSnippet(wave.getWave().getRoot());
+ return snippet;
}
@Override
@@ -250,10 +241,27 @@ public final class WaveBasedDigest
fireOnChanged();
}
+ private void updateSnippet(ObservableWavelet wavelet) {
+ ObservableWaveletData waveletData = wavelet.getWaveletData();
+ if (waveletData != null){
+ Set<String> docsIds = waveletData.getDocumentIds();
+ if (!docsIds.contains("conversation")) {
+ return;
+ }
+ snippet = Snippets.renderSnippet(waveletData,
Snippets.DIGEST_SNIPPET_LENGTH).trim();
+ String title = getTitle();
+ if (snippet.startsWith(title) && !title.isEmpty()) {
+ // Strip the title from the snippet if the snippet starts with the
title.
+ snippet = snippet.substring(title.length());
+ }
+ }
+ }
+
@Override
public void onLastModifiedTimeChanged(ObservableWavelet wavelet, long
oldTime, long newTime) {
- // TODO (Yuri Z.): Invoke fireOnChanged() here in case lastModifiedTime
changed after solving
- // the issue https://issues.apache.org/jira/browse/WAVE-354.
+ if (newTime != oldTime) {
+ fireOnChanged();
+ }
}
@Override
Modified:
incubator/wave/trunk/src/org/waveprotocol/wave/concurrencycontrol/wave/CcBasedWavelet.java
URL:
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/wave/concurrencycontrol/wave/CcBasedWavelet.java?rev=1432503&r1=1432502&r2=1432503&view=diff
==============================================================================
---
incubator/wave/trunk/src/org/waveprotocol/wave/concurrencycontrol/wave/CcBasedWavelet.java
(original)
+++
incubator/wave/trunk/src/org/waveprotocol/wave/concurrencycontrol/wave/CcBasedWavelet.java
Sat Jan 12 20:23:03 2013
@@ -406,4 +406,9 @@ public final class CcBasedWavelet implem
public String toString() {
return wavelet.toString();
}
+
+ @Override
+ public ObservableWaveletData getWaveletData() {
+ return wavelet.getWaveletData();
+ }
}
Modified: incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/Wavelet.java
URL:
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/Wavelet.java?rev=1432503&r1=1432502&r2=1432503&view=diff
==============================================================================
--- incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/Wavelet.java
(original)
+++ incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/Wavelet.java Sat
Jan 12 20:23:03 2013
@@ -23,6 +23,7 @@ import org.waveprotocol.wave.model.docum
import org.waveprotocol.wave.model.id.WaveId;
import org.waveprotocol.wave.model.id.WaveletId;
import org.waveprotocol.wave.model.version.HashedVersion;
+import org.waveprotocol.wave.model.wave.data.ObservableWaveletData;
import java.util.Set;
@@ -161,4 +162,6 @@ public interface Wavelet {
* @return this wavelet's wave id
*/
WaveId getWaveId();
+
+ ObservableWaveletData getWaveletData();
}
Modified:
incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/opbased/OpBasedWavelet.java
URL:
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/opbased/OpBasedWavelet.java?rev=1432503&r1=1432502&r2=1432503&view=diff
==============================================================================
---
incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/opbased/OpBasedWavelet.java
(original)
+++
incubator/wave/trunk/src/org/waveprotocol/wave/model/wave/opbased/OpBasedWavelet.java
Sat Jan 12 20:23:03 2013
@@ -590,4 +590,9 @@ public class OpBasedWavelet implements O
public void touch() {
authoriseApplyAndSend(new NoOp(createContext()));
}
+
+ @Override
+ public ObservableWaveletData getWaveletData() {
+ return wavelet;
+ }
}