Mercurial > hg > Members > shoshi > TreeCMSv2
view src/treecms/memory/OnMemoryMonotonicTreeNode.java @ 14:8bf59f161b23
separete Node methods to NodeContext , NodeAttribute , NodeChildren
author | misaka |
---|---|
date | Tue, 17 May 2011 18:44:14 +0900 |
parents | c8601b0fa8a3 |
children | 22cd920986c5 |
line wrap: on
line source
package treecms.memory; import java.nio.ByteBuffer; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import treecms.api.Forest; import treecms.api.MonotonicTreeNode; import treecms.api.Node; import treecms.api.NodeID; import treecms.api.TreeNode; /** * SingleLinkedなNodeをラップしたDoubleLinkedなNodeの実装です. * @author shoshi */ public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode { private OnMemoryMonotonicTree m_tree; private OnMemoryNode m_node; private OnMemoryMonotonicTreeNode m_parent; /** * コンストラクタです. * @param _target 対象となるSingleLinked Node * @param _parent このDoubleLinked Nodeの親,RootNodeならnull * @param _tree このNodeがRootNodeなら,nullではいけない. */ public OnMemoryMonotonicTreeNode(OnMemoryNode _target,OnMemoryMonotonicTreeNode _parent,OnMemoryMonotonicTree _tree) { if(_target == null){ throw new NullPointerException("_target must not be null."); } if(_parent == null && _tree == null){ throw new NullPointerException("_parent or _tree must not be null."); } m_node = _target; m_parent = _parent; m_tree = _tree; } /* * 親関連のメソッド */ @Override public NodeID getID() { return m_node.getID(); } @Override public Forest getForest() { return m_node.getForest(); } @Override public MonotonicTreeNode getParent() { return m_parent; } @Override public Node getNode() { return m_node; } /* * 属性関連のメソッド */ @Override public ByteBuffer get(ByteBuffer _key) { return m_node.get(_key); } @Override public Map<ByteBuffer, ByteBuffer> getAll() { return m_node.getAll(); } @Override public void put(ByteBuffer _key, ByteBuffer _value) { m_node.put(_key,_value); } @Override public void putAll(Map<ByteBuffer, ByteBuffer> _map) { m_node.putAll(_map); } @Override public void remove(ByteBuffer _key) { m_node.remove(_key); } @Override public void removeAll(Set<ByteBuffer> _keys) { m_node.removeAll(_keys); } @Override public void clear() { m_node.clear(); } /** * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます. * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します. * * RootNodeまで伝搬すると親のNodeはnullとなる.親Nodeは担当するMonotonicTreeのオブジェクトを保持しており,そこにRootNodeが変更されたことを通知する. * 通知が終わり,処理が戻ってきた時に自身のOnMemoryNodeをクローンした新しいものに書き換えます. * * _fromがnullの場合は,自身が編集元であることを示します. * @param _from 編集元のOnMemoryMonotonicTreeNode */ public void transmit(OnMemoryNode _orig,OnMemoryNode _edit) { Node clone = m_node.cloneNode(null); clone.replaceChild(_orig,_edit); if(m_parent != null){ m_parent.transmit(m_node,(OnMemoryNode)clone); return; } //なにかしたい } /* * 子供関連のメソッド */ @Override public Iterator<MonotonicTreeNode> getChildren() { //NodeのリストよりMonotonicTreeNodeのリストを作成する. LinkedList<MonotonicTreeNode> res = new LinkedList<MonotonicTreeNode>(); for(Iterator<Node> it = m_node.getChildren();it.hasNext();){ OnMemoryNode n = (OnMemoryNode)it.next(); res.add(new OnMemoryMonotonicTreeNode(n,this,null)); } return res.iterator(); } @Override public void addChild(MonotonicTreeNode _n) { m_node.addChild(_n.getNode()); } @Override public void addChildren(List<MonotonicTreeNode> _list) { //MotonicTreeNodeのリストからNodeのリストを作成する. LinkedList<Node> res = new LinkedList<Node>(); for(Iterator<MonotonicTreeNode> it = _list.iterator();it.hasNext();){ MonotonicTreeNode mono = (MonotonicTreeNode)it.next(); res.add(mono.getNode()); } m_node.addChildren(res); } @Override public void removeChild(MonotonicTreeNode _n) { m_node.removeChild(_n.getNode()); } @Override public void removeChildren(List<MonotonicTreeNode> _list) { //MonotonicTreeNodeのリスト LinkedList<Node> res = new LinkedList<Node>(); for(Iterator<MonotonicTreeNode> it = _list.iterator();it.hasNext();){ MonotonicTreeNode mono = it.next(); res.add(mono.getNode()); } m_node.removeChildren(res); } @Override public void clearChildren() { m_node.clearChildren(); } }