/**
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.waveprotocol.wave.model.supplement;
import org.waveprotocol.wave.model.id.WaveletId;
import org.waveprotocol.wave.model.util.CollectionUtils;
import org.waveprotocol.wave.model.util.CopyOnWriteSet;
import org.waveprotocol.wave.model.util.ReadableStringMap;
import org.waveprotocol.wave.model.version.HashedVersion;
import java.util.Set;
/**
* A wrapper around primitive supplement to allow for dummy POJO versions
* to sit in place of the presentation model when the usePresentationModel
* flag is disabled and to suppress all private gadget state requests when
* the usePrivateGadgetStates flag is disabled.
*
*/
public final class PartitioningPrimitiveSupplement implements ObservablePrimitiveSupplement {
private final ObservablePrimitiveSupplement realPrimitive;
private final CopyOnWriteSet<Listener> listeners = CopyOnWriteSet.create();
/**
* The primitive supplement to use for presentation actions. When the
* usePresentationModel client flag is disabled, this is reset every
* time stopPartitioning is called, otherwise it just refers to the
* same object as realPrimitive. Non-null.
*/
private ObservablePrimitiveSupplement presentationPrimitive;
private final boolean usePrivateGadgetStates;
public PartitioningPrimitiveSupplement (ObservablePrimitiveSupplement realPrimitive,
boolean usePresentationModel, boolean usePrivateGadgetStates) {
this.realPrimitive = realPrimitive;
this.usePrivateGadgetStates = usePrivateGadgetStates;
presentationPrimitive = !usePresentationModel ? new PrimitiveSupplementImpl() : realPrimitive;
}
@Override
public void addFolder(int id) {
realPrimitive.addFolder(id);
}
@Override
public void addWantedEvaluation(WantedEvaluation evaluation) {
realPrimitive.addWantedEvaluation(evaluation);
}
@Override
public void archiveAtVersion(WaveletId waveletId, int waveletVersion) {
realPrimitive.archiveAtVersion(waveletId, waveletVersion);
}
@Override
public void clearArchiveState() {
realPrimitive.clearArchiveState();
}
@Override
public void clearBlipReadState(WaveletId waveletId, String blipId) {
realPrimitive.clearBlipReadState(waveletId, blipId);
}
@Override
public void clearFollow() {
realPrimitive.clearFollow();
}
@Override
public void clearPendingNotification() {
realPrimitive.clearPendingNotification();
}
@Override
public void clearReadState() {
realPrimitive.clearReadState();
}
@Override
public void follow() {
realPrimitive.follow();
}
@Override
public int getArchiveWaveletVersion(WaveletId waveletId) {
return realPrimitive.getArchiveWaveletVersion(waveletId);
}
@Override
public Iterable<WaveletId> getArchiveWavelets() {
return realPrimitive.getArchiveWavelets();
}
@Override
public Iterable<Integer> getFolders() {
return realPrimitive.getFolders();
}
@Override
public Boolean getFollowed() {
return realPrimitive.getFollowed();
}
@Override
public int getLastReadBlipVersion(WaveletId waveletId, String blipId) {
return realPrimitive.getLastReadBlipVersion(waveletId, blipId);
}
@Override
public int getLastReadParticipantsVersion(WaveletId waveletId) {
return realPrimitive.getLastReadParticipantsVersion(waveletId);
}
@Override
public int getLastReadTagsVersion(WaveletId waveletId) {
return realPrimitive.getLastReadTagsVersion(waveletId);
}
@Override
public int getLastReadWaveletVersion(WaveletId waveletId) {
return realPrimitive.getLastReadWaveletVersion(waveletId);
}
@Override
public boolean getPendingNotification() {
return realPrimitive.getPendingNotification();
}
@Override
public Iterable<String> getReadBlips(WaveletId waveletId) {
return realPrimitive.getReadBlips(waveletId);
}
@Override
public Iterable<WaveletId> getReadWavelets() {
return realPrimitive.getReadWavelets();
}
@Override
public HashedVersion getSeenVersion(WaveletId waveletId) {
return realPrimitive.getSeenVersion(waveletId);
}
@Override
public int getNotifiedVersion(WaveletId waveletId) {
return realPrimitive.getNotifiedVersion(waveletId);
}
@Override
public Set<WaveletId> getSeenWavelets() {
return realPrimitive.getSeenWavelets();
}
@Override
public Set<WaveletId> getNotifiedWavelets() {
return realPrimitive.getNotifiedWavelets();
}
@Override
public Iterable<String> getStatefulThreads(WaveletId waveletId) {
return presentationPrimitive.getStatefulThreads(waveletId);
}
@Override
public ThreadState getThreadState(WaveletId waveletId, String threadId) {
return presentationPrimitive.getThreadState(waveletId, threadId);
}
@Override
public Set<WantedEvaluation> getWantedEvaluations() {
return realPrimitive.getWantedEvaluations();
}
@Override
public Iterable<WaveletId> getWaveletsWithThreadState() {
return presentationPrimitive.getWaveletsWithThreadState();
}
@Override
public boolean isInFolder(int id) {
return realPrimitive.isInFolder(id);
}
@Override
public void removeAllFolders() {
realPrimitive.removeAllFolders();
}
@Override
public void removeFolder(int id) {
realPrimitive.removeFolder(id);
}
@Override
public void setLastReadBlipVersion(WaveletId waveletId, String blipId, int version) {
realPrimitive.setLastReadBlipVersion(waveletId, blipId, version);
}
@Override
public void setLastReadParticipantsVersion(WaveletId waveletId, int version) {
realPrimitive.setLastReadParticipantsVersion(waveletId, version);
}
@Override
public void setLastReadTagsVersion(WaveletId waveletId, int version) {
realPrimitive.setLastReadTagsVersion(waveletId, version);
}
@Override
public void setLastReadWaveletVersion(WaveletId waveletId, int version) {
realPrimitive.setLastReadWaveletVersion(waveletId, version);
}
@Override
public void setNotifiedVersion(WaveletId waveletId, int version) {
realPrimitive.setNotifiedVersion(waveletId, version);
}
@Override
public void setSeenVersion(WaveletId waveletId, HashedVersion signature) {
realPrimitive.setSeenVersion(waveletId, signature);
}
@Override
public void clearSeenVersion(WaveletId waveletId) {
realPrimitive.clearSeenVersion(waveletId);
}
@Override
public void setThreadState(WaveletId waveletId, String threadId, ThreadState newState) {
presentationPrimitive.setThreadState(waveletId, threadId, newState);
}
@Override
public void unfollow() {
realPrimitive.unfollow();
}
@Override
public void addListener(Listener listener) {
realPrimitive.addListener(listener);
listeners.add(listener);
if (realPrimitive != presentationPrimitive) {
presentationPrimitive.addListener(listener);
}
}
@Override
public void removeListener(Listener listener) {
realPrimitive.removeListener(listener);
listeners.remove(listener);
if (realPrimitive != presentationPrimitive) {
presentationPrimitive.removeListener(listener);
}
}
/**
* Begins use of POJO versions, if required by client flags.
*/
public void startPartitioning() {
// don't need to do anything
}
/**
* Resets POJO supplement, if the client flag is disabled.
*/
public void stopPartitioning() {
if (presentationPrimitive != realPrimitive) {
// If we're filtering presentation state into a pojo, then blast it away
// and create a new one.
presentationPrimitive = new PrimitiveSupplementImpl();
for (Listener listener : listeners) {
presentationPrimitive.addListener(listener);
}
}
}
@Override
public ReadableStringMap<String> getGadgetState(String gadgetId) {
return usePrivateGadgetStates ?
realPrimitive.getGadgetState(gadgetId) : CollectionUtils.<String> emptyMap();
}
@Override
public void setGadgetState(String gadgetId, String key, String value) {
if (usePrivateGadgetStates) {
realPrimitive.setGadgetState(gadgetId, key, value);
}
}
}