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);