package org.swellrt.model.unmutable; import org.swellrt.model.ReadableMap; import org.swellrt.model.ReadableModel; import org.swellrt.model.ReadableType; import org.swellrt.model.generic.Model; import org.swellrt.model.shared.ModelUtils; 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.wave.ParticipantId; import org.waveprotocol.wave.model.wave.data.ReadableBlipData; import org.waveprotocol.wave.model.wave.data.ReadableWaveletData; import java.util.Set; /** * An unmutable SwellRT data model that parse all Document's into Java objects * at construction time. * * @author pablojan@gmail.com (Pablo Ojanguren) * */ public class UnmutableModel implements ReadableModel { private final ReadableWaveletData waveletData; private final Document document; private ReadableMap root = null; public static UnmutableModel create(ReadableWaveletData waveletData) { // Avoid trouble with old swellrt wavelets if (waveletData.getDocument(Model.DOC_MODEL_ROOT) == null || waveletData.getDocument(Model.DOC_MODEL_ROOT).getContent() == null || waveletData.getDocument(Model.DOC_MODEL_ROOT).getContent().getMutableDocument() == null) return null; return new UnmutableModel(waveletData); } private UnmutableModel(ReadableWaveletData waveletData) { // Get wavelet and root document this.waveletData = waveletData; this.document = waveletData.getDocument(Model.DOC_MODEL_ROOT).getContent().getMutableDocument(); } protected Document getDocument(String documentId) { if (waveletData.getDocument(documentId) == null || waveletData.getDocument(documentId).getContent() == null) { ModelUtils.log(ModelUtils.serialize(this.getWaveId()) + " wavelet doesn't have content document for blip " + documentId); return null; } return waveletData.getDocument(documentId).getContent().getMutableDocument(); } protected ReadableBlipData getBlipData(String documentId) { return waveletData.getDocument(documentId); } @Override public String getId() { return getWaveId().serialise(); } @Override public WaveId getWaveId() { return waveletData.getWaveId(); } @Override public WaveletId getWaveletId() { return waveletData.getWaveletId(); } @Override public Set<ParticipantId> getParticipants() { return waveletData.getParticipants(); } @Override public ReadableMap getRoot() { if (root == null) root = (ReadableMap) UnmutableTypeFactory.deserialize(this, null, Model.DOC_MAP_ROOT); return root; } @Override public ReadableType fromPath(String path) { return ModelUtils.fromPath(this, path); } }