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;
+  }
 }


Reply via email to