WAVE-311 Refactored title construction by adding getWavelet method to WaveMap and moving the code into base class.
Project: http://git-wip-us.apache.org/repos/asf/incubator-wave/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-wave/commit/2c4a3504 Tree: http://git-wip-us.apache.org/repos/asf/incubator-wave/tree/2c4a3504 Diff: http://git-wip-us.apache.org/repos/asf/incubator-wave/diff/2c4a3504 Branch: refs/heads/fulltextsearch Commit: 2c4a3504d002742ae91b6c5f4794c60aa2dac58f Parents: 6c7bc7a Author: Yuri Zelikov <[email protected]> Authored: Fri Apr 25 23:59:59 2014 +0300 Committer: Yuri Zelikov <[email protected]> Committed: Wed Aug 27 19:17:55 2014 +0300 ---------------------------------------------------------------------- .../waveserver/AbstractSearchProviderImpl.java | 27 ------ .../server/waveserver/AbstractWaveIndexer.java | 43 +++++++++ .../server/waveserver/SolrWaveIndexerImpl.java | 96 +------------------- .../box/server/waveserver/WaveMap.java | 18 ++++ 4 files changed, 63 insertions(+), 121 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/2c4a3504/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java ---------------------------------------------------------------------- diff --git a/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java b/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java index 7d55812..673a02e 100644 --- a/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java +++ b/src/org/waveprotocol/box/server/waveserver/AbstractSearchProviderImpl.java @@ -107,33 +107,6 @@ public abstract class AbstractSearchProviderImpl implements SearchProvider { WaveletContainer waveletContainer = null; WaveletName waveletname = WaveletName.of(waveId, waveletId); - // TODO (alown): Find some way to use isLocalWavelet to do this properly! - try { - if (LOG.isFineLoggable()) { - LOG.fine("Trying as a remote wavelet"); - } - waveletContainer = waveMap.getRemoteWavelet(waveletname); - } catch (WaveletStateException e) { - LOG.severe(String.format("Failed to get remote wavelet %s", waveletname.toString()), e); - } catch (NullPointerException e) { - // This is a fairly normal case of it being a local-only wave. - // Yet this only seems to appear in the test suite. - // Continuing is completely harmless here. - LOG.info( - String.format("%s is definitely not a remote wavelet. (Null key)", - waveletname.toString()), e); - } - - if (waveletContainer == null) { - try { - if (LOG.isFineLoggable()) { - LOG.fine("Trying as a local wavelet"); - } - waveletContainer = waveMap.getLocalWavelet(waveletname); - } catch (WaveletStateException e) { - LOG.severe(String.format("Failed to get local wavelet %s", waveletname.toString()), e); - } - } // TODO (Yuri Z.) This loop collects all the wavelets that match the // query, so the view is determined by the query. Instead we should http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/2c4a3504/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java ---------------------------------------------------------------------- diff --git a/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java b/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java index 13f1283..18b88e1 100644 --- a/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java +++ b/src/org/waveprotocol/box/server/waveserver/AbstractWaveIndexer.java @@ -20,9 +20,21 @@ package org.waveprotocol.box.server.waveserver; import org.waveprotocol.box.common.ExceptionalIterator; +import org.waveprotocol.box.server.robots.util.ConversationUtil; +import org.waveprotocol.wave.model.conversation.ObservableConversation; +import org.waveprotocol.wave.model.conversation.ObservableConversationBlip; +import org.waveprotocol.wave.model.conversation.ObservableConversationView; +import org.waveprotocol.wave.model.conversation.TitleHelper; +import org.waveprotocol.wave.model.conversation.WaveletBasedConversation; +import org.waveprotocol.wave.model.document.Document; import org.waveprotocol.wave.model.id.WaveId; import org.waveprotocol.wave.model.id.WaveletId; import org.waveprotocol.wave.model.id.WaveletName; +import org.waveprotocol.wave.model.wave.data.ObservableWaveletData; +import org.waveprotocol.wave.model.wave.data.impl.WaveViewDataImpl; +import org.waveprotocol.wave.model.wave.opbased.OpBasedWavelet; + +import javax.annotation.Nullable; /** * Base implementation of {@link WaveIndexer}. @@ -39,6 +51,37 @@ public abstract class AbstractWaveIndexer implements WaveIndexer { this.waveMap = waveMap; } + /* + * TODO (Frank R.) move to TitleHelper. Currently, WaveletContainer is of + * default visibility, which prevents the re-factoring. + */ + // TODO (yurize) : the method is not used, should we remove it? + @Nullable + static String constructTitle(WaveId waveId, WaveletId waveletId, WaveMap waveMap, + ConversationUtil conversationUtil) throws WaveletStateException { + + String title = null; + + WaveViewDataImpl wave = WaveViewDataImpl.create(waveId); + + WaveletName waveletname = WaveletName.of(waveId, waveletId); + WaveletContainer waveletContainer = waveMap.getWavelet(waveletname); + + wave.addWavelet(waveletContainer.copyWaveletData()); + for (ObservableWaveletData waveletData : wave.getWavelets()) { + OpBasedWavelet wavelet = OpBasedWavelet.createReadOnly(waveletData); + if (WaveletBasedConversation.waveletHasConversation(wavelet)) { + ObservableConversationView conversations = conversationUtil.buildConversation(wavelet); + ObservableConversation root = conversations.getRoot(); + ObservableConversationBlip firstBlip = root.getRootThread().getFirstBlip(); + Document firstBlipContents = firstBlip.getContent(); + title = TitleHelper.extractTitle(firstBlipContents).trim(); + break; + } + } + return title; + } + /** * Forces all waves to be loaded into memory and processes each wavelet. */ http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/2c4a3504/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java ---------------------------------------------------------------------- diff --git a/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java b/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java index de3178e..3a7afa3 100644 --- a/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java +++ b/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java @@ -40,24 +40,13 @@ import org.apache.http.HttpStatus; import org.waveprotocol.box.common.DeltaSequence; import org.waveprotocol.box.common.Snippets; import org.waveprotocol.box.server.robots.util.ConversationUtil; -import org.waveprotocol.wave.model.conversation.ObservableConversation; -import org.waveprotocol.wave.model.conversation.ObservableConversationBlip; -import org.waveprotocol.wave.model.conversation.ObservableConversationView; -import org.waveprotocol.wave.model.conversation.TitleHelper; -import org.waveprotocol.wave.model.conversation.WaveletBasedConversation; -import org.waveprotocol.wave.model.document.Document; import org.waveprotocol.wave.model.document.operation.DocInitialization; import org.waveprotocol.wave.model.id.IdUtil; -import org.waveprotocol.wave.model.id.WaveId; -import org.waveprotocol.wave.model.id.WaveletId; import org.waveprotocol.wave.model.id.WaveletName; import org.waveprotocol.wave.model.version.HashedVersion; import org.waveprotocol.wave.model.wave.ParticipantId; -import org.waveprotocol.wave.model.wave.data.ObservableWaveletData; import org.waveprotocol.wave.model.wave.data.ReadableBlipData; import org.waveprotocol.wave.model.wave.data.ReadableWaveletData; -import org.waveprotocol.wave.model.wave.data.impl.WaveViewDataImpl; -import org.waveprotocol.wave.model.wave.opbased.OpBasedWavelet; import org.waveprotocol.wave.model.waveref.WaveRef; import org.waveprotocol.wave.util.escapers.jvm.JavaWaverefEncoder; import org.waveprotocol.wave.util.logging.Log; @@ -80,11 +69,6 @@ PerUserWaveViewBus.Listener { // TODO (Yuri Z.): Inject executor. private static final Executor executor = Executors.newSingleThreadExecutor(); - /* - * (regression alert) for getting the title of a wave - */ - // private final ConversationUtil conversationUtil; - private final ReadableWaveletDataProvider waveletDataProvider; @@ -97,11 +81,6 @@ PerUserWaveViewBus.Listener { this.waveletDataProvider = waveletDataProvider; - /* - * (regression alert) for getting the title of a wave - */ - // this.conversationUtil = conversationUtil; - notificationDispatcher.subscribe(this); return; @@ -241,80 +220,12 @@ PerUserWaveViewBus.Listener { return; } - /* - * TODO (Frank R.) move to TitleHelper. Currently, WaveletContainer is of - * default visibility, which prevents the refactoring. - */ - public static String getTitle(WaveId waveId, WaveletId waveletId, WaveMap waveMap, - ConversationUtil conversationUtil) { - - String title = null; - - WaveViewDataImpl wave = WaveViewDataImpl.create(waveId); - - WaveletContainer waveletContainer = null; - WaveletName waveletname = WaveletName.of(waveId, waveletId); - - /*- - * copied from - * - org.waveprotocol.box.server.waveserver.SimpleSearchProviderImpl.filterWavesViewBySearchCriteria(Function<ReadableWaveletData, - Boolean>, Multimap<WaveId, WaveletId>) - */ - // TODO (alown): Find some way to use isLocalWavelet to do this properly! - try { - if (LOG.isFineLoggable()) { - LOG.fine("Trying as a remote wavelet"); - } - waveletContainer = waveMap.getRemoteWavelet(waveletname); - } catch (WaveletStateException e) { - LOG.severe(String.format("Failed to get remote wavelet %s", waveletname.toString()), e); - } catch (NullPointerException e) { - // This is a fairly normal case of it being a local-only wave. - // Yet this only seems to appear in the test suite. - // Continuing is completely harmless here. - LOG.info(String.format("%s is definitely not a remote wavelet. (Null key)", - waveletname.toString()), e); - } - - if (waveletContainer == null) { - try { - if (LOG.isFineLoggable()) { - LOG.fine("Trying as a local wavelet"); - } - waveletContainer = waveMap.getLocalWavelet(waveletname); - } catch (WaveletStateException e) { - LOG.severe(String.format("Failed to get local wavelet %s", waveletname.toString()), e); - } - } - - try { - wave.addWavelet(waveletContainer.copyWaveletData()); - for (ObservableWaveletData waveletData : wave.getWavelets()) { - OpBasedWavelet wavelet = OpBasedWavelet.createReadOnly(waveletData); - if (WaveletBasedConversation.waveletHasConversation(wavelet)) { - ObservableConversationView conversations = conversationUtil.buildConversation(wavelet); - ObservableConversation root = conversations.getRoot(); - ObservableConversationBlip firstBlip = root.getRootThread().getFirstBlip(); - Document firstBlipContents = firstBlip.getContent(); - title = TitleHelper.extractTitle(firstBlipContents).trim(); - break; - } - } - } catch (WaveletStateException e) { - LOG.warning("Failed to access wavelet " + waveletContainer.getWaveletName(), e); - } - - return title; - } - @Override public void waveletUpdate(final ReadableWaveletData wavelet, DeltaSequence deltas) { /* - * (regression alert) commented out for optimization, see - * waveletCommitted(WaveletName, HashedVersion) + * Overridden out for optimization, see waveletCommitted(WaveletName, + * HashedVersion) */ - // updateIndex(wavelet); } @Override @@ -322,9 +233,6 @@ PerUserWaveViewBus.Listener { Preconditions.checkNotNull(waveletName); - /* - * (regression alert) don't update on current thread to prevent lock error - */ ListenableFutureTask<Void> task = ListenableFutureTask.create(new Callable<Void>() { @Override http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/2c4a3504/src/org/waveprotocol/box/server/waveserver/WaveMap.java ---------------------------------------------------------------------- diff --git a/src/org/waveprotocol/box/server/waveserver/WaveMap.java b/src/org/waveprotocol/box/server/waveserver/WaveMap.java index 3854f40..68c1ed1 100644 --- a/src/org/waveprotocol/box/server/waveserver/WaveMap.java +++ b/src/org/waveprotocol/box/server/waveserver/WaveMap.java @@ -145,6 +145,24 @@ public class WaveMap { } } + public WaveletContainer getWavelet(WaveletName waveletName) throws WaveletStateException { + WaveletContainer waveletContainer = null; + try { + waveletContainer = getRemoteWavelet(waveletName); + } catch (WaveletStateException e) { + // Ignored. + } catch (NullPointerException e) { + // This is a fairly normal case of it being a local-only wave. + // Yet this only seems to appear in the test suite. + // Continuing is completely harmless here. + } + + if (waveletContainer == null) { + waveletContainer = getLocalWavelet(waveletName); + } + return waveletContainer; + } + public LocalWaveletContainer getLocalWavelet(WaveletName waveletName) throws WaveletStateException { try {
