package org.swellrt.model.adt; import org.waveprotocol.wave.model.adt.BasicMap; import org.waveprotocol.wave.model.document.Doc; import org.waveprotocol.wave.model.document.Document; import org.waveprotocol.wave.model.document.util.DocHelper; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class UnmutableBasicMap<K, V> implements BasicMap<K, V> { public interface ElementAdapter<K, V> { Entry<K, V> fromElement(Doc.E element); } private final Document document; private final Doc.E parent; private final ElementAdapter<K, V> adapter; private Map<K, V> values; @SuppressWarnings("rawtypes") public static UnmutableBasicMap<?, ?> create(ElementAdapter<?, ?> adapter, Doc.E parent, Document document) { @SuppressWarnings("unchecked") UnmutableBasicMap<?, ?> map = new UnmutableBasicMap(adapter, parent, document); map.load(); return map; } private UnmutableBasicMap(ElementAdapter<K, V> adapter, Doc.E parent, Document document) { this.document = document; this.parent = parent; this.adapter = adapter; this.values = new HashMap<K, V>(); } private void load() { Doc.E entry = DocHelper.getFirstChildElement(document, parent); while (entry != null) { Entry<K, V> mapEntry = adapter.fromElement(entry); values.put(mapEntry.getKey(), mapEntry.getValue()); entry = DocHelper.getNextSiblingElement(document, entry); } } @Override public V get(K key) { return values.get(key); } @Override public boolean put(K key, V value) { throw new UnsupportedOperationException(); } @Override public Set<K> keySet() { return values.keySet(); } @Override public void remove(K key) { throw new UnsupportedOperationException(); } }