Mercurial > hg > Members > shoshi > TreeCMSv2
diff 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 diff
--- a/src/treecms/api/NodeData.java Fri May 06 00:42:57 2011 +0900 +++ b/src/treecms/api/NodeData.java Wed May 11 03:34:01 2011 +0900 @@ -1,28 +1,35 @@ 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 java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; +import org.apache.commons.collections.list.SetUniqueList; /** - * Nodeが保持するデータの集合です.Nodeを大きく変更するときや新しく作成される場合に使用されます. - * 通常このクラスのインスタンスをNodeから取得した場合,NodeDataインスタンスに変更(set,add)を加えても元のNodeに変更は反映されません. + * Node が保持するデータのスナップショットです.Node を大きく変更するときや新しく作成される場合に使用されます. + * 通常このクラスのインスタンスを Node から取得した場合,NodeData インスタンスに変更(set,add)を加えても元の Node に変更は反映されません. * その様に実装してください. + * + * このクラスは Node が保持するデータのうち 子供ノードのリスト・属性のマップ のみ保持しています.つまり,ノードが持っているはずの ID は保持していません. + * getID,getForest を呼び出すと UnsupportedOperationException をスローします. * @author shoshi */ public final class NodeData implements Node { /** - * 子供Nodeのリスト + * 子供 Node の List + * 子供 Node の List は重複する Node を許可しない. */ private List<Node> m_children; /** - * キーと対応する値のマップ + * Key と対応する Value の Map */ private Map<ByteBuffer,ByteBuffer> m_attrs; @@ -35,154 +42,141 @@ } /** - * コピーコンストラクタです.NodeDataの内容を防御的にコピーします. + * コピーコンストラクタです. + * NodeData の内容を防御的にコピーします. * @param _data */ public NodeData(NodeData _data) { if(_data != null){ - m_children = new CopyOnWriteArrayList<Node>(_data.m_children); - m_attrs = new ConcurrentHashMap<ByteBuffer,ByteBuffer>(_data.m_attrs); + // SetUniqueList を使用することにより,List の重複要素を許可しない. + m_children = SetUniqueList.decorate(_data.m_children); + m_attrs = new HashMap<ByteBuffer,ByteBuffer>(_data.m_attrs); return; } - m_children = new CopyOnWriteArrayList<Node>(); - m_attrs = new ConcurrentHashMap<ByteBuffer,ByteBuffer>(); + m_children = SetUniqueList.decorate(new ArrayList<Node>()); + m_attrs = new HashMap<ByteBuffer,ByteBuffer>(); } /** * 内部でコピーコンストラクタを呼び出します. - * @return このNodeDataのコピー + * @return この NodeData のコピー */ public NodeData deepCopy() { return new NodeData(this); } - /** - * キーのセットを取得します. - * @return キーのセット - */ - public Set<ByteBuffer> keySet() - { - return m_attrs.keySet(); - } - - /** - * キーに対応する値を取得します. - * @param _name - * @return キーに対応する値 - */ - public ByteBuffer get(ByteBuffer _name) - { - return m_attrs.get(_name); - } - - /** - * キーとそれに対応する値を追加します. - * @param _name キー - * @param _value 値 - */ - public void put(ByteBuffer _name,ByteBuffer _value) - { - m_attrs.put(_name,_value); - } - - /** - * キーとその対応する値をマップから削除します - * @param _name - */ - public void remove(ByteBuffer _name) - { - m_attrs.remove(_name); - } - - /** - * キーとそれに対応する値のマップ全体を追加します. - * @param _map - */ - public void putAll(Map<ByteBuffer,ByteBuffer> _map) - { - m_attrs.putAll(_map); - } - - /** - * 子供Nodeのリストを取得します.<br/> - * この取得されたリストは編集できません.編集はadd,addAllより行ってください. - * @return 子供Nodeのリスト - */ - public List<Node> children() - { - return Collections.unmodifiableList(m_children); - } - - /** - * 子供Nodeを追加します. - * @param _child - */ - public void add(Node _child) - { - m_children.add(_child); - } - - /** - * 子供Nodeリスト全部を子供Nodeとして追加します. - * @param _child - */ - public void addAll(List<Node> _child) - { - m_children.addAll(_child); - } - - /** - * 指定されたNodeを子供Nodeのリストから削除します. - * @param _child - */ - public void remove(Node _child) - { - m_children.remove(_child); - } - - /** - * 指定されたNodeのリストに含まれるすべてのNodeを子供Nodeのリストから削除します. - * @param _child - */ - public void removeAll(List<Node> _child) - { - m_children.removeAll(_child); - } - - /** - * NodeDataが保持しているすべてのキーと値の組のマップを返します. - * @return すべてのキーと値のマップ - */ - public Map<ByteBuffer,ByteBuffer> getAll() - { - return Collections.unmodifiableMap(m_attrs); - } - - /** - * 子供Nodeのリストをクリアします.(すべて削除します.) - */ - public void clear() - { - m_children.clear(); - } - @Override public NodeID getID() { + //このクラスはデータのみ保持する. return null; } @Override public NodeData getData() { - return this; + 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(); + } }