Mercurial > hg > Members > shoshi > TreeCMSv2
view src/treecms/memory/OnMemoryMonotonicTreeNode.java @ 16:bb9760760744
commit
author | shoshi |
---|---|
date | Sat, 21 May 2011 04:46:00 +0900 |
parents | 22cd920986c5 |
children | 168deb591f21 |
line wrap: on
line source
package treecms.memory; import java.nio.ByteBuffer; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import treecms.api.Forest; import treecms.api.MonotonicTreeNode; import treecms.api.NodeAttributes; import treecms.api.NodeChildren; import treecms.api.NodeID; import treecms.api.SingleNode; import treecms.tree.util.NodeChildrenImpl; import treecms.tree.util.NodeData; /** * SingleLinkedなNodeをラップしたDoubleLinkedなNodeの実装です. * @author shoshi */ public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode { private OnMemoryNode m_node; private OnMemoryMonotonicTreeNode m_parent; private OnMemoryMonotonicTree m_tree; /** * コンストラクタです. * @param _target 対象となるSingleLinked Node * @param _parent このDoubleLinked Nodeの親,RootNodeならnull * @param _tree このNodeがRootNodeなら,nullではいけない. */ public OnMemoryMonotonicTreeNode(OnMemoryNode _target,OnMemoryMonotonicTreeNode _parent) { m_node = _target; m_parent = _parent; } public OnMemoryMonotonicTreeNode(OnMemoryNode _root,OnMemoryMonotonicTree _tree) { m_node = _root; m_tree = _tree; m_parent = null; } @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 SingleNode getNode() { return m_node; } /* * 属性関連のメソッド */ @Override public ByteBuffer get(ByteBuffer _key) { return m_node.get(_key); } @Override public NodeAttributes getAll() { return m_node.getAll(); } @Override public void put(ByteBuffer _key, ByteBuffer _value) { m_node.put(_key,_value); } @Override public void putAll(NodeAttributes _map) { m_node.putAll(_map); } @Override public void remove(ByteBuffer _key) { m_node.remove(_key); } @Override public void removeAll(Set<ByteBuffer> _keys) { NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); d.removeAll(_keys); cloneAndTransmit(d); } @Override public void clearAttributes() { NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); d.clearAttributes(); cloneAndTransmit(d); } public void cloneAndTransmit(NodeData<SingleNode> _d) { OnMemoryForest f = (OnMemoryForest)m_node.getForest(); OnMemoryNode clone = f.createNode(m_node.getID().update(),_d); transmit(m_node,clone); } /** * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます. * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します. * * RootNodeまで伝搬すると親のNodeはnullとなる.親Nodeは担当するMonotonicTreeのオブジェクトを保持しており,そこにRootNodeが変更されたことを通知する. * 通知が終わり,処理が戻ってきた時に自身のOnMemoryNodeをクローンした新しいものに書き換えます. * * _fromがnullの場合は,自身が編集元であることを示します. * @param _from 編集元のOnMemoryMonotonicTreeNode */ public void transmit(OnMemoryNode _orig,OnMemoryNode _edit) { OnMemoryForest f = (OnMemoryForest)m_node.getForest(); OnMemoryNode clone = f.createNode(m_node.getID().update(),null); clone.replace(_edit); if(m_parent != null){ m_parent.transmit(m_node,(OnMemoryNode)clone); return; } } /* * 子供関連のメソッド */ @Override public List<MonotonicTreeNode> getList() { //NodeのリストよりMonotonicTreeNodeのリストを作成する. NodeChildren<MonotonicTreeNode> res = new NodeChildrenImpl<MonotonicTreeNode>(); for(Iterator<SingleNode> it = m_node.getList().iterator();it.hasNext();){ OnMemoryNode n = (OnMemoryNode)it.next(); res.add(new OnMemoryMonotonicTreeNode(n,this)); } return res.getList(); } @Override public boolean add(MonotonicTreeNode _n) { return m_node.add(_n.getNode()); } @Override public boolean addAll(NodeChildren<MonotonicTreeNode> _list) { //MotonicTreeNodeのリストからNodeのリストを作成する. NodeChildren<SingleNode> res = new NodeChildrenImpl<SingleNode>(); for(Iterator<MonotonicTreeNode> it = _list.getList().iterator();it.hasNext();){ MonotonicTreeNode mono = (MonotonicTreeNode)it.next(); res.add(mono.getNode()); } return m_node.addAll(res); } @Override public MonotonicTreeNode remove(String _uuid) { SingleNode n = m_node.remove(_uuid); return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,this); } @Override public MonotonicTreeNode remove(int _index) { SingleNode n = m_node.remove(_index); return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null); } @Override public void clearChildren() { m_node.clearChildren(); } @Override public Map<ByteBuffer, ByteBuffer> asMap() { return m_node.asMap(); } @Override public Set<ByteBuffer> getKeySet() { return m_node.getKeySet(); } @Override public Set<String> getUUIDSet() { return m_node.getUUIDSet(); } @Override public MonotonicTreeNode get(String _uuid) { SingleNode n = m_node.get(_uuid); return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,this); } @Override public MonotonicTreeNode get(int _index) { SingleNode n = m_node.get(_index); return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,this); } @Override public MonotonicTreeNode replace(MonotonicTreeNode _newChild) { SingleNode n = m_node.replace(_newChild.getNode()); return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null); } @Override public boolean contains(String _id) { return m_node.contains(_id); } @Override public boolean swap(String _uuid1, String _uuid2) { return m_node.swap(_uuid1,_uuid2); } }