package org.swellrt.beta.client.wave; import java.util.HashMap; import java.util.Map; import org.swellrt.beta.model.remote.SubstrateId; import org.waveprotocol.wave.model.document.operation.DocInitialization; import org.waveprotocol.wave.model.id.InvalidIdException; import org.waveprotocol.wave.model.id.ModernIdSerialiser; import org.waveprotocol.wave.model.id.WaveletId; import org.waveprotocol.wave.model.wave.data.DocumentFactory; import org.waveprotocol.wave.model.wave.data.DocumentOperationSink; import com.google.common.base.Preconditions; /** * Manages the creation of all documents in a particular wave. * This class is called from {@see WaveletDataImpl} if is properly * configured by its factory. * <p> * Based on original WaveDocuments class, adapted version for SwellRT * * @author pablojan@gmail.con (Pablo Ojanguren) * */ public final class SWaveDocuments<TextDocument extends DocumentOperationSink> implements DocumentFactory<DocumentOperationSink> { /** * Creates a wave's document collection. * * @param blipDocFactory factory for blip documents * @param dataDocFactory factory for data documents. */ public static <B extends DocumentOperationSink> SWaveDocuments<B> create( DocumentFactory<B> textDocFactory, DocumentFactory<?> dataDocFactory) { return new SWaveDocuments<B>(textDocFactory, dataDocFactory); } private final DocumentFactory<TextDocument> textDocFactory; private final DocumentFactory<?> dataDocFactory; private final Map<SubstrateId, TextDocument> textDocRegistry = new HashMap<SubstrateId, TextDocument>(); private SWaveDocuments(DocumentFactory<TextDocument> textDocFactory, DocumentFactory<?> dataDocFactory) { this.dataDocFactory = dataDocFactory; this.textDocFactory = textDocFactory; } @Override public DocumentOperationSink create(WaveletId waveletId, String docId, DocInitialization content) { if (SubstrateId.isText(docId)) { SubstrateId substrateId = SubstrateId.ofText(waveletId, docId); Preconditions.checkState(!textDocRegistry.containsKey(substrateId)); TextDocument textDoc = textDocFactory.create(waveletId, docId, content); textDocRegistry.put(substrateId, textDoc); return textDoc; } else { return dataDocFactory.create(waveletId, docId, content); } } public TextDocument getTextDocument(SubstrateId substrateId) { return textDocRegistry.get(substrateId); } public TextDocument getTextDocument(String waveletId, String docId) { SubstrateId substrateId; try { substrateId = SubstrateId.ofText(ModernIdSerialiser.INSTANCE.deserialiseWaveletId(waveletId), docId); } catch (InvalidIdException e) { return null; } catch (IllegalArgumentException e) { return null; } return getTextDocument(substrateId); } }