Mercurial > hg > Members > shoshi > TreeCMSv2
view src/treecms/memory/OnMemoryTree.java @ 8:f96193babac0
changed byte[] to ByteBuffer
added TreeEditor.updateTree(Node,NodeData,Node[]) for node path is known.
added GUIEditor
author | shoshi |
---|---|
date | Thu, 31 Mar 2011 02:08:44 +0900 |
parents | fc19e38b669b |
children | 17ed97ca9960 |
line wrap: on
line source
package treecms.memory; import java.nio.ByteBuffer; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import treecms.api.Forest; import treecms.api.Node; import treecms.api.NodeData; import treecms.api.NodeID; import treecms.api.Tree; /** * オンメモリのTree実装です。 * 木構造のルートとなるNodeをメンバーとして持ち、操作はすべて転送します。 * @author shoshi */ final class OnMemoryTree implements Tree { private AtomicReference<OnMemoryNode> m_ref; /** * コンストラクタです。 * @param _newRoot 木構造のルートノードです。 */ public OnMemoryTree(OnMemoryNode _newRoot) { m_ref = new AtomicReference<OnMemoryNode>(_newRoot); } /** * Nodeが属するForestを取得します. * @return Nodeが属するForest */ @Override public Forest getForest() { return m_ref.get().getForest(); } /** * Nodeに対応するNodeIDを取得します. * @return Nodeに対応するNodeID */ @Override public NodeID getID() { return m_ref.get().getID(); } /** * Nodeが保持するデータを取得します.クライアントはこのメソッドを用いて取得されるNodeDataを用いてNodeの内容を<b>変更できません</b>。 * @return Nodeが保持するNodeData */ @Override public NodeData getData() { return m_ref.get().getData(); } /** * この木構造のルートNodeを取得します. * @return ルートNode */ @Override public Node getRoot() { return m_ref.get(); } /** * 指定されたNodeを子供Nodeとして追加します. * @param _child */ @Override public void add(Node _child) { m_ref.get().add(_child); } /** * 指定されたリストに含まれるNodeを,すべて子供Nodeとして追加します. * @param _children 追加される子供Nodeを保持するリスト */ @Override public void addAll(List<Node> _children) { m_ref.get().addAll(_children); } /** * 子供Nodeのリストを取得します.. * @return 子供Nodeのリスト */ @Override public List<Node> children() { return m_ref.get().children(); } /** * このNodeが保持する値の中で指定されたキーと対応する値を取得します. * @param _key データに対応するキー * @return キーと対応する値,見つからない場合はnull */ @Override public ByteBuffer get(ByteBuffer _key) { return m_ref.get().get(_key); } /** * このNodeが保持するデータをマップとしてすべて取得します. * @return Nodeが保持するすべてのデータのマップ */ @Override public Map<ByteBuffer,ByteBuffer> getAll() { return m_ref.get().getAll(); } /** * キーとそれに対応する値を保存します.キーが重複した場合は上書きされます. * @param _key キー * @param _value 値 */ @Override public void put(ByteBuffer _key,ByteBuffer _value) { m_ref.get().put(_key,_value); } /** * キーとそれに対応する値を複数保持するマップを引数としてとり,マップが保持する値をすべて追加します. * @param _map 追加される値のマップ */ @Override public void putAll(Map<ByteBuffer, ByteBuffer> _map) { m_ref.get().putAll(_map); } /** * キーとそれに対応する値を削除します。 * @param _key キー */ @Override public void remove(ByteBuffer _key) { m_ref.get().remove(_key); } /** * 子供Nodeを削除します。 * @param _child */ @Override public void remove(Node _child) { m_ref.get().remove(_child); } /** * ルートNodeを比較して置き換えます. * @param _except 比較する対象 * @param _newRoot 一致した場合置き換える対象 */ public boolean compareAndSwapRootNode(OnMemoryNode _except,OnMemoryNode _newRoot,boolean _force) { if(_force){ return m_ref.compareAndSet(_except,_newRoot); } m_ref.set(_newRoot); return true; } }