changeset 15:22cd920986c5

commit
author misaka
date Tue, 17 May 2011 21:25:17 +0900
parents 8bf59f161b23
children bb9760760744
files src/treecms/api/Forest.java src/treecms/api/MonotonicTree.java src/treecms/api/Node.java src/treecms/api/NodeData.java src/treecms/api/TreeNode.java src/treecms/memory/OnMemoryForest.java src/treecms/memory/OnMemoryMonotonicTree.java src/treecms/memory/OnMemoryMonotonicTreeNode.java src/treecms/memory/OnMemoryNode.java src/treecms/memory/OnMemoryTreeNode.java src/treecms/tree/util/NodeChildrenImpl.java
diffstat 11 files changed, 155 insertions(+), 127 deletions(-) [+]
line wrap: on
line diff
--- a/src/treecms/api/Forest.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/api/Forest.java	Tue May 17 21:25:17 2011 +0900
@@ -38,7 +38,7 @@
 	 * @param _tree 対象
 	 * @return TreeEditor
 	 */
-	MonotonicTree getMonotonicTree(Tree _tree);
+	MonotonicTree getMonotonicTree(SingleNode _root);
 	
 	/**
 	 * NodeDataを保持する新しいNodeを作成します.このメソッドで作成されるNodeは新しいUUIDを持ちます.
--- a/src/treecms/api/MonotonicTree.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/api/MonotonicTree.java	Tue May 17 21:25:17 2011 +0900
@@ -37,5 +37,5 @@
 	 * この木構造のルートNodeを返します。
 	 * @return この木構造のルートNode
 	 */
-	public SingleNode getRoot();
+	public MonotonicTreeNode getRoot();
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/api/Node.java	Tue May 17 21:25:17 2011 +0900
@@ -0,0 +1,5 @@
+package treecms.api;
+
+public interface Node<T extends Node<T>> extends NodeContext , NodeAttributes , NodeChildren<T>
+{
+}
--- a/src/treecms/api/NodeData.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/api/NodeData.java	Tue May 17 21:25:17 2011 +0900
@@ -21,9 +21,19 @@
 	private NodeChildrenImpl<T> m_children;
 	private NodeAttributesImpl m_attrs;
 	
+	public NodeData()
+	{
+		this(null,null);
+	}
+	
+	public NodeData(NodeData<T> _newData)
+	{
+		this(_newData.m_children,_newData.m_attrs);
+	}
+	
 	public NodeData(NodeChildren<T> _children,NodeAttributes _attrs)
 	{
-		m_children = new NodeChildrenImpl<T>();
+		m_children = new NodeChildrenImpl<T>(_children);
 		m_attrs = new NodeAttributesImpl();
 	}
 
--- a/src/treecms/api/TreeNode.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/api/TreeNode.java	Tue May 17 21:25:17 2011 +0900
@@ -14,5 +14,5 @@
 public interface TreeNode extends Node<TreeNode>
 {
 	public TreeNode getParent();
-	public TreeNode getNode();
+	public SingleNode getNode();
 }
--- a/src/treecms/memory/OnMemoryForest.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/memory/OnMemoryForest.java	Tue May 17 21:25:17 2011 +0900
@@ -5,9 +5,9 @@
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import treecms.api.Forest;
-import treecms.api.Node;
 import treecms.api.NodeData;
 import treecms.api.NodeID;
+import treecms.api.SingleNode;
 import treecms.api.Tree;
 import treecms.api.MonotonicTree;
 import treecms.tree.id.AbstractRandomNodeID;
@@ -43,10 +43,10 @@
 	 * @param _newData Nodeが保持するNodeData
 	 * @return 作成されたOnMemoryNode
 	 */
-	public OnMemoryNode createNode(NodeID _id,NodeData _newData)
+	public OnMemoryNode createNode(NodeID _id,NodeData<SingleNode> _newData)
 	{
 		NodeID newID = (_id != null) ? _id : createID();
-		NodeData newData = (_newData != null) ? _newData : new NodeData();
+		NodeData<SingleNode> newData = (_newData != null) ? _newData : new NodeData<SingleNode>();
 		
 		//newIDとnewDataを元にOnMemoryNodeを生成する.
 		OnMemoryNode newNode = new OnMemoryNode(this,newID,newData);
@@ -72,7 +72,7 @@
 	 * @return NodeIDに対応するNode
 	 */
 	@Override
-	public Node get(NodeID _id)
+	public SingleNode get(NodeID _id)
 	{
 		return m_table.get(_id);
 	}
@@ -83,7 +83,7 @@
 	 * @return Tree
 	 */
 	@Override
-	public Tree getTree(Node _node)
+	public Tree getTree(SingleNode _node)
 	{
 		Forest forest = _node.getForest();
 		if(forest != this){
@@ -99,14 +99,14 @@
 	 * @return TreeEditor
 	 */
 	@Override
-	public MonotonicTree getMonotonicTree(Tree _tree)
+	public MonotonicTree getMonotonicTree(SingleNode _node)
 	{
-		Forest forest = _tree.getRoot().getNode().getForest();
+		Forest forest = _node.getForest();
 		if(forest != this){
 			throw new IllegalArgumentException();
 		}
 		
-		return new OnMemoryMonotonicTree((OnMemoryTree)_tree);
+		return new OnMemoryMonotonicTree((OnMemoryNode)_node);
 	}
 	
 	/**
@@ -114,7 +114,7 @@
 	 * @return 新しいNode
 	 */
 	@Override
-	public Node create()
+	public SingleNode create()
 	{
 		return createNode(null,null);
 	}
@@ -124,7 +124,7 @@
 	 * @return NodeDataを保持した新しいNode 
 	 */
 	@Override
-	public Node create(NodeData _data)
+	public SingleNode create(NodeData<SingleNode> _data)
 	{
 		return createNode(null,_data);
 	}
@@ -134,7 +134,7 @@
 	 * @return UUIDに対応する最新のNode
 	 */
 	@Override
-	public Node getTip(String _uuid)
+	public SingleNode getTip(String _uuid)
 	{
 		return m_tipTable.get(_uuid);
 	}
--- a/src/treecms/memory/OnMemoryMonotonicTree.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/memory/OnMemoryMonotonicTree.java	Tue May 17 21:25:17 2011 +0900
@@ -1,13 +1,11 @@
 package treecms.memory;
 
 import treecms.api.MonotonicTree;
-import treecms.api.Node;
-import treecms.api.NodeData;
-import treecms.tree.util.PathNotFoundException;
+import treecms.api.MonotonicTreeNode;
 
 public class OnMemoryMonotonicTree implements MonotonicTree
 {
-	public OnMemoryMonotonicTree(OnMemoryTree _tree)
+	public OnMemoryMonotonicTree(OnMemoryNode _node)
 	{
 		
 	}
@@ -31,27 +29,14 @@
 	}
 
 	@Override
-	public void merge() {
-		// TODO Auto-generated method stub
-		
+	public void merge()
+	{
+		//merge here
 	}
 
 	@Override
-	public Node getRoot() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Node updateTree(Node _target, NodeData _newData)
-			throws PathNotFoundException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Node updateTree(Node _target, NodeData _newData, Node[] _path)
-			throws PathNotFoundException {
+	public MonotonicTreeNode getRoot()
+	{
 		// TODO Auto-generated method stub
 		return null;
 	}
--- a/src/treecms/memory/OnMemoryMonotonicTreeNode.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/memory/OnMemoryMonotonicTreeNode.java	Tue May 17 21:25:17 2011 +0900
@@ -9,8 +9,12 @@
 import treecms.api.Forest;
 import treecms.api.MonotonicTreeNode;
 import treecms.api.Node;
+import treecms.api.NodeAttributes;
+import treecms.api.NodeChildren;
 import treecms.api.NodeID;
+import treecms.api.SingleNode;
 import treecms.api.TreeNode;
+import treecms.tree.util.NodeChildrenImpl;
 
 /**
  * SingleLinkedなNodeをラップしたDoubleLinkedなNodeの実装です.
@@ -18,7 +22,6 @@
  */
 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode
 {
-	private OnMemoryMonotonicTree m_tree;
 	private OnMemoryNode m_node;
 	private OnMemoryMonotonicTreeNode m_parent;
 	
@@ -28,19 +31,14 @@
 	 * @param _parent このDoubleLinked Nodeの親,RootNodeならnull
 	 * @param _tree このNodeがRootNodeなら,nullではいけない.
 	 */
-	public OnMemoryMonotonicTreeNode(OnMemoryNode _target,OnMemoryMonotonicTreeNode _parent,OnMemoryMonotonicTree _tree)
+	public OnMemoryMonotonicTreeNode(OnMemoryNode _target,OnMemoryMonotonicTreeNode _parent)
 	{
 		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;
 	}
 	
 	/*
@@ -66,7 +64,7 @@
 	}
 
 	@Override
-	public Node getNode()
+	public SingleNode getNode()
 	{
 		return m_node;
 	}
@@ -82,7 +80,7 @@
 	}
 
 	@Override
-	public Map<ByteBuffer, ByteBuffer> getAll()
+	public NodeAttributes getAll()
 	{
 		return m_node.getAll();
 	}
@@ -94,7 +92,7 @@
 	}
 
 	@Override
-	public void putAll(Map<ByteBuffer, ByteBuffer> _map)
+	public void putAll(NodeAttributes _map)
 	{
 		m_node.putAll(_map);
 	}
@@ -112,9 +110,9 @@
 	}
 
 	@Override
-	public void clear()
+	public void clearAttributes()
 	{
-		m_node.clear();
+		m_node.clearAttributes();
 	}
 	
 	/**
@@ -129,7 +127,8 @@
 	 */
 	public void transmit(OnMemoryNode _orig,OnMemoryNode _edit)
 	{
-		Node clone = m_node.cloneNode(null);
+		OnMemoryForest f = (OnMemoryForest)m_node.getForest();
+		OnMemoryNode clone = f.createNode(m_node.getID(),null);
 		clone.replaceChild(_orig,_edit);
 		
 		if(m_parent != null){
@@ -143,56 +142,50 @@
 	/*
 	 * 子供関連のメソッド
 	 */
-
 	@Override
-	public Iterator<MonotonicTreeNode> getChildren()
+	public List<MonotonicTreeNode> getList()
 	{
 		//NodeのリストよりMonotonicTreeNodeのリストを作成する.
-		LinkedList<MonotonicTreeNode> res = new LinkedList<MonotonicTreeNode>();
-		for(Iterator<Node> it = m_node.getChildren();it.hasNext();){
+		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,null));
+			res.add(new OnMemoryMonotonicTreeNode(n,this));
 		}
 		
-		return res.iterator();
+		return res.getList();
 	}
 
 	@Override
-	public void addChild(MonotonicTreeNode _n)
+	public boolean add(MonotonicTreeNode _n)
 	{
-		m_node.addChild(_n.getNode());
+		return m_node.add(_n.getNode());
 	}
 
 	@Override
-	public void addChildren(List<MonotonicTreeNode> _list)
+	public boolean addAll(NodeChildren<MonotonicTreeNode> _list)
 	{
 		//MotonicTreeNodeのリストからNodeのリストを作成する.
-		LinkedList<Node> res = new LinkedList<Node>();
-		for(Iterator<MonotonicTreeNode> it = _list.iterator();it.hasNext();){
+		NodeChildren<SingleNode> res = new NodeChildrenImpl<SingleNode>();
+		for(Iterator<MonotonicTreeNode> it = _list.getList().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());
+		return m_node.addAll(res);
 	}
 
 	@Override
-	public void removeChildren(List<MonotonicTreeNode> _list)
+	public MonotonicTreeNode remove(String _uuid)
 	{
-		//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);
+		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,null);
 	}
 
 	@Override
@@ -200,5 +193,4 @@
 	{
 		m_node.clearChildren();
 	}
-
 }
--- a/src/treecms/memory/OnMemoryNode.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/memory/OnMemoryNode.java	Tue May 17 21:25:17 2011 +0900
@@ -1,15 +1,15 @@
 package treecms.memory;
 
 import treecms.api.Forest;
-import treecms.api.Node;
 import treecms.api.NodeData;
 import treecms.api.NodeID;
+import treecms.api.SingleNode;
 
 /**
  * オンメモリ上でのNodeの実装です。 
  * @author shoshi
  */
-class OnMemoryNode extends NodeData implements Node
+class OnMemoryNode extends NodeData<SingleNode> implements SingleNode
 {
 	private OnMemoryForest m_forest;
 	private NodeID m_id;
@@ -20,7 +20,7 @@
 	 * @param _id このNodeのNodeIDです.
 	 * @param _newData このNodeに割り当てるNodeDataです.防御的にコピーします.
 	 */
-	public OnMemoryNode(OnMemoryForest _forest,NodeID _id,NodeData _newData)
+	public OnMemoryNode(OnMemoryForest _forest,NodeID _id,NodeData<SingleNode> _newData)
 	{
 		super(_newData);
 		m_id = _id;
@@ -34,20 +34,8 @@
 	}
 
 	@Override
-	public NodeData getData()
-	{
-		return new NodeData(this);
-	}
-
-	@Override
 	public Forest getForest()
 	{
 		return m_forest;
 	}
-
-	@Override
-	public Node cloneNode(NodeData _newData)
-	{
-		return m_forest.createNode(m_id,_newData);
-	}
 }
--- a/src/treecms/memory/OnMemoryTreeNode.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/memory/OnMemoryTreeNode.java	Tue May 17 21:25:17 2011 +0900
@@ -8,9 +8,12 @@
 import java.util.Map;
 import java.util.Set;
 import treecms.api.Forest;
-import treecms.api.Node;
+import treecms.api.NodeAttributes;
+import treecms.api.NodeChildren;
 import treecms.api.NodeID;
+import treecms.api.SingleNode;
 import treecms.api.TreeNode;
+import treecms.tree.util.NodeChildrenImpl;
 
 /**
  * DoubleLinkedなNodeであるTreeNodeのOnMemory実装です. 
@@ -50,7 +53,7 @@
 	}
 	
 	@Override
-	public Node getNode()
+	public SingleNode getNode()
 	{
 		return m_node;
 	}
@@ -72,57 +75,53 @@
 	 */
 
 	@Override
-	public Iterator<TreeNode> getChildren()
+	public List<TreeNode> getList()
 	{
 		/* 
 		 * m_node(対象ノード)のリストにはNodeが格納されており、TreeNodeのリストを取得するためにはTreeNodeで要素を構成する必要がある.
 		 */
 		LinkedList<TreeNode> ret = new LinkedList<TreeNode>();
-		for(Iterator<Node> it = m_node.getList().iterator();it.hasNext();){
+		for(Iterator<SingleNode> it = m_node.getList().iterator();it.hasNext();){
 			OnMemoryNode n = (OnMemoryNode)it.next();
 			ret.add(new OnMemoryTreeNode(n,this));
 		}
 		
-		return Collections.unmodifiableList(ret).iterator();
+		return Collections.unmodifiableList(ret);
 	}
 	
 	@Override
-	public void add(TreeNode _child)
+	public boolean add(TreeNode _child)
 	{
-		m_node.add(_child.getNode());
+		return m_node.add(_child.getNode());
 	}
 
 	@Override
-	public void addAll(NodeChildren _children)
+	public boolean addAll(NodeChildren<TreeNode> _children)
 	{
 		/*
 		 * TreeNodeのリストからNodeのリストへ変換する
 		 */
-		LinkedList<Node> res = new LinkedList<Node>();
-		for(Iterator<TreeNode> it = _children.iterator();it.hasNext();){
+		NodeChildren<SingleNode> res = new NodeChildrenImpl<SingleNode>();
+		for(Iterator<TreeNode> it = _children.getList().iterator();it.hasNext();){
 			TreeNode tn = it.next();
 			res.add(tn.getNode());
 		}
 		
-		m_node.addAll(res);
-	}
-	
-	@Override
-	public void removeChild(TreeNode _child)
-	{
-		m_node.removeChild(_child.getNode());
+		return m_node.addAll(res);
 	}
 	
 	@Override
-	public void removeChildren(List<TreeNode> _children)
+	public TreeNode remove(String _uuid)
 	{
-		LinkedList<Node> res = new LinkedList<Node>();
-		for(Iterator<TreeNode> it = _children.iterator();it.hasNext();){
-			TreeNode tn = it.next();
-			res.add(tn.getNode());
-		}
-		
-		m_node.removeChildren(res);
+		SingleNode n = m_node.remove(_uuid);
+		return new OnMemoryTreeNode((OnMemoryNode)n,this);
+	}
+	
+	@Override
+	public TreeNode remove(int _index)
+	{
+		SingleNode n = m_node.remove(_index);
+		return new OnMemoryTreeNode((OnMemoryNode)n,this);
 	}
 	
 	@Override
@@ -130,10 +129,6 @@
 	{
 		m_node.clearChildren();
 	}
-
-	/*
-	 * 属性関連のメソッド
-	 */
 	
 	@Override
 	public ByteBuffer get(ByteBuffer _key)
@@ -142,7 +137,7 @@
 	}
 
 	@Override
-	public Map<ByteBuffer, ByteBuffer> getAll()
+	public NodeAttributes getAll()
 	{
 		return m_node.getAll();
 	}
@@ -154,7 +149,7 @@
 	}
 	
 	@Override
-	public void putAll(Map<ByteBuffer,ByteBuffer> _map)
+	public void putAll(NodeAttributes _map)
 	{
 		m_node.putAll(_map);
 	}
@@ -172,8 +167,59 @@
 	}
 	
 	@Override
-	public void clear()
+	public void clearAttributes()
+	{
+		m_node.clearAttributes();
+	}
+
+	@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 TreeNode get(String _uuid)
 	{
-		m_node.clear();
+		SingleNode n = m_node.get(_uuid);
+		return new OnMemoryTreeNode((OnMemoryNode)n,this);
+	}
+
+	@Override
+	public TreeNode get(int _index)
+	{
+		SingleNode n = m_node.get(_index);
+		return new OnMemoryTreeNode((OnMemoryNode)n,this);
+	}
+
+	@Override
+	public TreeNode replace(TreeNode _newChild)
+	{
+		SingleNode n = m_node.replace(_newChild.getNode());
+		return new OnMemoryTreeNode((OnMemoryNode)n,this);
+	}
+
+	@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);
 	}
 }
--- a/src/treecms/tree/util/NodeChildrenImpl.java	Tue May 17 18:44:14 2011 +0900
+++ b/src/treecms/tree/util/NodeChildrenImpl.java	Tue May 17 21:25:17 2011 +0900
@@ -27,12 +27,14 @@
 		m_set = new HashSet<String>();
 	}
 	
-	public NodeChildrenImpl(NodeChildrenImpl<T> _list)
+	public NodeChildrenImpl(NodeChildren<T> _list)
 	{
 		this();
 		
 		if(_list != null){
 			addAll(_list);
+		}else{
+			throw new NullPointerException("_list must not be null.");
 		}
 	}