Mercurial > hg > Members > shoshi > TreeCMSv2
view src/treecms/api/NodeData.java @ 12:fbbb7e414346
modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
author | shoshi |
---|---|
date | Wed, 11 May 2011 03:34:01 +0900 |
parents | 85061e874775 |
children | c8601b0fa8a3 |
line wrap: on
line source
package treecms.api; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.collections.list.SetUniqueList; /** * Node が保持するデータのスナップショットです.Node を大きく変更するときや新しく作成される場合に使用されます. * 通常このクラスのインスタンスを Node から取得した場合,NodeData インスタンスに変更(set,add)を加えても元の Node に変更は反映されません. * その様に実装してください. * * このクラスは Node が保持するデータのうち 子供ノードのリスト・属性のマップ のみ保持しています.つまり,ノードが持っているはずの ID は保持していません. * getID,getForest を呼び出すと UnsupportedOperationException をスローします. * @author shoshi */ public final class NodeData implements Node { /** * 子供 Node の List * 子供 Node の List は重複する Node を許可しない. */ private List<Node> m_children; /** * Key と対応する Value の Map */ private Map<ByteBuffer,ByteBuffer> m_attrs; /** * コンストラクタです.なにもしません */ public NodeData() { this(null); } /** * コピーコンストラクタです. * NodeData の内容を防御的にコピーします. * @param _data */ public NodeData(NodeData _data) { if(_data != null){ // SetUniqueList を使用することにより,List の重複要素を許可しない. m_children = SetUniqueList.decorate(_data.m_children); m_attrs = new HashMap<ByteBuffer,ByteBuffer>(_data.m_attrs); return; } m_children = SetUniqueList.decorate(new ArrayList<Node>()); m_attrs = new HashMap<ByteBuffer,ByteBuffer>(); } /** * 内部でコピーコンストラクタを呼び出します. * @return この NodeData のコピー */ public NodeData deepCopy() { return new NodeData(this); } @Override public NodeID getID() { //このクラスはデータのみ保持する. return null; } @Override public NodeData getData() { return new NodeData(this); } @Override public Forest getForest() { //このクラスはデータのみ保持する. return null; } /* * 属性関連 */ public Set<ByteBuffer> keySet() { return m_attrs.keySet(); } @Override public ByteBuffer get(ByteBuffer _name) { return m_attrs.get(_name); } @Override public Map<ByteBuffer,ByteBuffer> getAll() { return Collections.unmodifiableMap(this.m_attrs); } @Override public void put(ByteBuffer _name,ByteBuffer _value) { m_attrs.put(_name,_value); } @Override public void putAll(Map<ByteBuffer,ByteBuffer> _map) { m_attrs.putAll(_map); } @Override public void remove(ByteBuffer _name) { m_attrs.remove(_name); } @Override public void removeAll(Set<ByteBuffer> _keySet) { for(ByteBuffer _key : _keySet){ m_attrs.remove(_key); } } @Override public void clear() { m_attrs.clear(); } /* * 子供関連 */ @Override public Iterator<Node> getChildren() { return Collections.unmodifiableList(m_children).iterator(); } @Override public void addChild(Node _child) { m_children.add(_child); } @Override public void addChildren(List<Node> _child) { m_children.addAll(_child); } @Override public void removeChild(Node _child) { m_children.remove(_child); } @Override public void removeChildren(List<Node> _child) { m_children.removeAll(_child); } @Override public void clearChildren() { m_children.clear(); } }