Author: yurize
Date: Wed Jul 18 18:57:41 2012
New Revision: 1363045

URL: http://svn.apache.org/viewvc?rev=1363045&view=rev
Log:
Fixes WAVE-360 - Waves disappears from inbox when removing a user.
https://reviews.apache.org/r/6015/

Modified:
    
incubator/wave/trunk/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java

Modified: 
incubator/wave/trunk/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/wave/trunk/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java?rev=1363045&r1=1363044&r2=1363045&view=diff
==============================================================================
--- 
incubator/wave/trunk/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java
 (original)
+++ 
incubator/wave/trunk/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java
 Wed Jul 18 18:57:41 2012
@@ -207,7 +207,7 @@ public class LucenePerUserWaveViewHandle
 
   @Override
   public ListenableFuture<Void> onParticipantRemoved(final WaveletName 
waveletName,
-      ParticipantId participant) {
+      final ParticipantId participant) {
     Preconditions.checkNotNull(waveletName);
     Preconditions.checkNotNull(participant);
 
@@ -219,7 +219,7 @@ public class LucenePerUserWaveViewHandle
         try {
           waveletData = waveletProvider.getReadableWaveletData(waveletName);
           try {
-            removeIndex(waveletData, nrtManager);
+            removeParticipantfromIndex(waveletData, participant, nrtManager);
           } catch (CorruptIndexException e) {
             LOG.log(Level.SEVERE, "Failed to update index for " + waveletName, 
e);
             throw e;
@@ -306,6 +306,43 @@ public class LucenePerUserWaveViewHandle
     nrtManager.deleteDocuments(query);
   }
 
+  private static void removeParticipantfromIndex(ReadableWaveletData wavelet,
+      ParticipantId participant, NRTManager nrtManager) throws 
CorruptIndexException, IOException {
+    BooleanQuery query = new BooleanQuery();
+    Term waveIdTerm = new Term(WAVEID.toString(), 
wavelet.getWaveId().serialise());
+    query.add(new TermQuery(waveIdTerm), BooleanClause.Occur.MUST);
+    query.add(new TermQuery(new Term(WAVELETID.toString(), 
wavelet.getWaveletId().serialise())),
+        BooleanClause.Occur.MUST);
+    SearcherManager searcherManager = nrtManager.getSearcherManager(true);
+    IndexSearcher indexSearcher = searcherManager.acquire();
+    try {
+      TopDocs hints = indexSearcher.search(query, MAX_WAVES);
+      for (ScoreDoc hint : hints.scoreDocs) {
+        Document document = indexSearcher.doc(hint.doc);
+        String[] participantValues = document.getValues(WITH.toString());
+        document.removeFields(WITH.toString());
+        for (String address : participantValues) {
+          if (address.equals(participant.getAddress())) {
+            continue;
+          }
+          document.add(new Field(WITH.toString(), address, Field.Store.YES,
+              Field.Index.NOT_ANALYZED));
+        }
+        nrtManager.updateDocument(waveIdTerm, document);
+      }
+    } catch (IOException e) {
+      LOG.log(Level.WARNING, "Failed to fetch from index " + 
wavelet.toString(), e);
+    } finally {
+      try {
+        searcherManager.release(indexSearcher);
+      } catch (IOException e) {
+        LOG.log(Level.WARNING, "Failed to close searcher. ", e);
+      }
+      indexSearcher = null;
+    }
+  }
+
+
   @Override
   public Multimap<WaveId, WaveletId> retrievePerUserWaveView(ParticipantId 
user) {
     Preconditions.checkNotNull(user);


Reply via email to