/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.wave; import org.waveprotocol.wave.model.wave.opbased.ObservableWaveView; 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.util.CollectionUtils; import org.waveprotocol.wave.model.util.Preconditions; import java.util.Collections; import java.util.Map; /** * A read-only ObservableWaveView * */ public class ReadOnlyWaveView implements ObservableWaveView { private final WaveId waveId; private final Map<WaveletId, ObservableWavelet> wavelets = CollectionUtils.newHashMap(); public ReadOnlyWaveView(WaveId waveId) { this.waveId = waveId; } @Override public WaveId getWaveId() { return waveId; } /** * Returns the conversational root wavelet, if such a wavelet is in view. */ @Override public ObservableWavelet getRoot() { for (ObservableWavelet w : wavelets.values()) { if (IdUtil.isConversationRootWaveletId(w.getId())) { return w; } } return null; } @Override public ObservableWavelet createRoot() { throw new UnsupportedOperationException("Read only wave views are read-only"); } @Override public Iterable<? extends ObservableWavelet> getWavelets() { return Collections.unmodifiableCollection(wavelets.values()); } @Override public ObservableWavelet getWavelet(WaveletId waveletId) { return wavelets.get(waveletId); } @Override public ObservableWavelet createWavelet() { throw new UnsupportedOperationException("Read only wave views are read-only"); } /** * @throws UnsupportedOperationException always */ @Override public ObservableWavelet getUserData() { throw new UnsupportedOperationException("Read only wave views don't support" + " user data wavelets"); } /** * @throws UnsupportedOperationException always */ @Override public ObservableWavelet createUserData() { throw new UnsupportedOperationException("Read only wave views don't support" + " user data wavelets"); } /** * Listeners are ignored in this read-only view. */ @Override public void addListener(WaveViewListener listener) { // Listeners are ignored. } /** * Listeners are ignored in this read-only view. */ @Override public void removeListener(WaveViewListener listener) { // Listeners are ignored. } /** * Adds a wavelet to this view. * * @param wavelet the wavelet to add * @throws IllegalArgumentException if a wavelet with the same id is already * in the view or the wavelet is from a different wave */ public void addWavelet(ObservableWavelet wavelet) { Preconditions.checkArgument(wavelet.getWaveId().equals(waveId), "Attempted to add wavelet to wrong view"); Preconditions.checkArgument(!wavelets.containsKey(wavelet.getId()), "Attempted to add duplicate wavelet to view"); wavelets.put(wavelet.getId(), wavelet); } }