changeset 1:bdde898e8ef9

add Forest
author shoshi
date Wed, 16 Feb 2011 17:06:51 +0900
parents 7ecb9273581d
children 4a5ee88f02cf
files src/treecms/api/Forest.java src/treecms/api/Node.java src/treecms/api/NodeID.java src/treecms/api/Tree.java src/treecms/tree/id/RandomNodeID.java src/treecms/tree/memory/OnMemoryNode.java src/treecms/tree/memory/OnMemoryTree.java src/treecms/tree/memory/OnMemoryTreeEditor.java src/treecms/util/PreOrderTreeWalker.java
diffstat 9 files changed, 20 insertions(+), 494 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/api/Forest.java	Wed Feb 16 17:06:51 2011 +0900
@@ -0,0 +1,7 @@
+package treecms.api;
+
+public interface Forest
+{
+	Node get(NodeID _id);
+	Tree tree(Node _newRoot);
+}
--- a/src/treecms/api/Node.java	Wed Feb 16 14:27:35 2011 +0900
+++ b/src/treecms/api/Node.java	Wed Feb 16 17:06:51 2011 +0900
@@ -1,23 +1,8 @@
 package treecms.api;
 
-import java.util.Map;
-import java.util.Set;
-
 public interface Node extends Iterable<Node>
 {
 	public NodeID getID();
-	public Node createNode();
-	
-	public byte[] getAttribute(String _attr);
-	public Set<String> getAttributeKeys();
-	public Map<String,byte[]> getAttributeMap();
-	public Set<Node> getChildren();
-	public boolean isChild(Node _child);
-	
-	public Node addChild(Node _child);
-	public Node removeChild(Node _child);
-	public Node setAttributeMap(Map<String,byte[]> _map);
-	public Node addChildren(Set<Node> _child);
-	public Node clearChildren();
-	public Node setAttribute(String _attr,byte[] _value);
+	public NodeData getData();
+	public NodeData newData();
 }
\ No newline at end of file
--- a/src/treecms/api/NodeID.java	Wed Feb 16 14:27:35 2011 +0900
+++ b/src/treecms/api/NodeID.java	Wed Feb 16 17:06:51 2011 +0900
@@ -9,5 +9,5 @@
 	public String toString();
 	
 	public boolean isFamily(NodeID _id);
-	public boolean equals(NodeID _id);
+	public boolean equals(Object _id);
 }
--- a/src/treecms/api/Tree.java	Wed Feb 16 14:27:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-package treecms.api;
-
-public interface Tree
-{
-	Node useContents();
-}
--- a/src/treecms/tree/id/RandomNodeID.java	Wed Feb 16 14:27:35 2011 +0900
+++ b/src/treecms/tree/id/RandomNodeID.java	Wed Feb 16 17:06:51 2011 +0900
@@ -23,11 +23,17 @@
 		return false;
 	}
 	
-	public boolean equals(NodeID _id)
+	public boolean equals(Object _id)
 	{
-		if(isFamily(_id) && getVersion().equals(_id.getVersion())){
-			return true;
+		try{
+			RandomNodeID target = (RandomNodeID)_id;
+			if(isFamily(target) && getVersion().equals(target.getVersion())){
+				return true;
+			}
+			return false;
+		}catch(Exception _e){
+			_e.printStackTrace();
+			return false;
 		}
-		return false;
 	}
 }
--- a/src/treecms/tree/memory/OnMemoryNode.java	Wed Feb 16 14:27:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-package treecms.tree.memory;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import treecms.api.Node;
-import treecms.api.NodeID;
-
-public class OnMemoryNode implements Node
-{
-	NodeID m_id;
-	OnMemoryTree m_tree;
-	
-	HashSet<Node> m_children;
-	HashMap<String,byte[]> m_attrs;
-	
-	public OnMemoryNode(NodeID _id,OnMemoryTree _tree)
-	{
-		m_id = _id;
-		m_tree = _tree;
-		m_children = new HashSet<Node>();
-		m_attrs = new HashMap<String,byte[]>();
-	}
-
-	@Override
-	public Node createNode()
-	{
-		OnMemoryNode child = m_tree.createNode(null);
-		return child;
-	}
-
-	@Override
-	public NodeID getID()
-	{
-		return m_id;
-	}
-
-	@Override
-	public Iterator<Node> iterator()
-	{
-		return Collections.unmodifiableSet(m_children).iterator();
-	}
-
-	@Override
-	public Node addChild(Node _child)
-	{
-		OnMemoryTree.NodeData data = m_tree.extractData(this);
-		data.m_children.add(_child);
-		OnMemoryNode newNode = m_tree.clonetree(this,data);
-		if(newNode == null){
-			m_children.add(_child);
-			return this;
-		}
-		return newNode;
-	}
-
-	@Override
-	public Node addChildren(Set<Node> _children)
-	{
-		OnMemoryTree.NodeData data = m_tree.extractData(this);
-		data.m_children.addAll(_children);
-		OnMemoryNode newNode = m_tree.clonetree(this,data);
-		if(newNode == null){
-			m_children.addAll(_children);
-			return this;
-		}
-		return newNode;
-	}
-
-	@Override
-	public Node clearChildren()
-	{
-		OnMemoryTree.NodeData data = m_tree.extractData(this);
-		data.m_children.clear();
-		OnMemoryNode newNode = m_tree.clonetree(this,data);
-		if(newNode == null){
-			m_children.clear();
-			return this;
-		}
-		return newNode;
-	}
-	
-	@Override
-	public Node removeChild(Node _child)
-	{
-		OnMemoryTree.NodeData data = m_tree.extractData(this);
-		data.m_children.remove(_child);
-		OnMemoryNode newNode = m_tree.clonetree(this,data);
-		if(newNode == null){
-			m_children.remove(_child);
-			return this;
-		}
-		return newNode;
-	}
-	
-	@Override
-	public Node setAttribute(String _attr,byte[] _value)
-	{
-		OnMemoryTree.NodeData data = m_tree.extractData(this);
-		data.m_attrs.put(_attr,_value);
-		OnMemoryNode newNode = m_tree.clonetree(this,data);
-		if(newNode == null){
-			m_attrs.put(_attr,_value);
-			return this;
-		}
-		return newNode;
-	}
-	
-	@Override
-	public Node setAttributeMap(Map<String,byte[]> _map)
-	{
-		OnMemoryTree.NodeData data = m_tree.extractData(this);
-		data.m_attrs.putAll(_map);
-		OnMemoryNode newNode = m_tree.clonetree(this,data);
-		if(newNode == null){
-			m_attrs.putAll(_map);
-			return this;
-		}
-		return newNode;
-	}
-
-	@Override
-	public byte[] getAttribute(String _attr)
-	{
-		return m_attrs.get(_attr);
-	}
-
-	@Override
-	public Set<String> getAttributeKeys()
-	{
-		return m_attrs.keySet();
-	}
-
-	@Override
-	public Map<String, byte[]> getAttributeMap()
-	{
-		return Collections.unmodifiableMap(m_attrs);
-	}
-
-	@Override
-	public Set<Node> getChildren()
-	{
-		return Collections.unmodifiableSet(m_children);
-	}
-	
-	@Override
-	public String toString()
-	{
-		return m_id.toString();
-	}
-
-	@Override
-	public boolean isChild(Node _child)
-	{
-		return m_children.contains(_child);
-	}
-
-	@Override
-	public Node useContents()
-	{
-		return m_tree.useContents();
-	}
-}
--- a/src/treecms/tree/memory/OnMemoryTree.java	Wed Feb 16 14:27:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-package treecms.tree.memory;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-import java.util.UUID;
-import treecms.api.Node;
-import treecms.api.NodeID;
-import treecms.api.Tree;
-import treecms.tree.id.RandomNodeID;
-
-public class OnMemoryTree implements Tree
-{
-	public OnMemoryNode m_root;
-	
-	public static void main(String _args[])
-	{
-		OnMemoryTree tree = new OnMemoryTree();
-		
-		Node root = tree.useContents();
-		Node child1 = root.createNode();
-		child1.setAttribute("hogehoge","fugafuga".getBytes());
-		Node newRoot = root.addChild(child1);
-	}
-	
-	public OnMemoryTree()
-	{
-		m_root = createNode(null);
-	}
-	
-	@Override
-	public Node useContents()
-	{
-		return m_root;
-	}
-	
-	public synchronized OnMemoryNode clonetree(OnMemoryNode _target,NodeData _newData)
-	{
-		LinkedList<OnMemoryNode> path  = findAndClone(m_root,_target,_newData);
-		
-		if(path == null){
-			return null;
-		}
-		
-		//replace.
-		m_root = path.peekFirst();
-		return path.peekLast();
-	}
-	
-	public LinkedList<OnMemoryNode> findAndClone(OnMemoryNode _parent,OnMemoryNode _target,NodeData _newData)
-	{
-		if(_parent.getID().isFamily(_target.getID())){
-			//find.
-			OnMemoryNode clone = cloneNode(_target,_newData);
-			LinkedList<OnMemoryNode> path = new LinkedList<OnMemoryNode>();
-			path.add(clone);
-			return path;
-		}
-		
-		for(Node child : _parent.getChildren()){
-			LinkedList<OnMemoryNode> path = findAndClone((OnMemoryNode)child,_target,_newData);
-			if(path != null){
-				OnMemoryNode clone = cloneNode(_parent,null);
-				clone.removeChild(child);
-				clone.addChild(path.peekFirst());
-				path.addFirst(clone);
-				return path;
-			}
-		}
-		
-		return null;
-	}
-	
-	public OnMemoryNode cloneNode(OnMemoryNode _target,NodeData _newData)
-	{
-		OnMemoryNode node = createNode(_target.getID().update());
-		
-		if(_newData != null){
-			node.m_attrs.putAll(_newData.m_attrs);
-			node.m_children.addAll(_newData.m_children);
-			return node;
-		}
-		
-		node.m_attrs.putAll(_target.m_attrs);
-		node.m_children.addAll(_target.m_children);
-		return node;
-	}
-	
-	public NodeData extractData(OnMemoryNode _target)
-	{
-		NodeData data = new NodeData();
-		data.m_attrs.putAll(_target.getAttributeMap());
-		data.m_children.addAll(_target.getChildren());
-		return data;
-	}
-	
-	public OnMemoryNode createNode(NodeID _id)
-	{
-		OnMemoryNode newNode;
-		if(_id != null){
-			newNode = new OnMemoryNode(_id,this);
-		}else{
-			newNode = new OnMemoryNode(createID(),this);
-		}
-		return newNode;
-	}
-	
-	public NodeID createID()
-	{
-		return new RandomNodeIDImpl(null);
-	}
-	
-	class NodeData
-	{
-		Tree m_tree;
-		Set<Node> m_children;
-		Map<String,byte[]> m_attrs;
-		
-		public NodeData()
-		{
-			m_tree = null;
-			m_children = new HashSet<Node>();
-			m_attrs = new HashMap<String,byte[]>();
-		}
-	}
-	
-	class RandomNodeIDImpl extends RandomNodeID
-	{
-		private String m_uuid;
-		private Long m_version;
-		
-		public RandomNodeIDImpl(String _uuid)
-		{
-			if(_uuid != null){
-				m_uuid = _uuid;
-			}else{
-				m_uuid = UUID.randomUUID().toString();
-			}
-			
-			m_version = (new Random()).nextLong();
-		}
-		
-		@Override
-		public NodeID create()
-		{
-			return new RandomNodeIDImpl(null);
-		}
-
-		@Override
-		public String getUUID()
-		{
-			return m_uuid;
-		}
-
-		@Override
-		public String getVersion()
-		{
-			return Long.toHexString(m_version);
-		}
-		
-		@Override
-		public String toString()
-		{
-			return m_uuid + "@" + Long.toHexString(m_version);
-		}
-
-		@Override
-		public NodeID update()
-		{
-			RandomNodeIDImpl newID = new RandomNodeIDImpl(m_uuid);
-			return newID;
-		}
-	}
-}
--- a/src/treecms/tree/memory/OnMemoryTreeEditor.java	Wed Feb 16 14:27:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-package treecms.tree.memory;
-
-import treecms.api.TreeEditor;
-import treecms.api.Node;
-
-public class OnMemoryTreeEditor extends OnMemoryTree implements TreeEditor
-{
-	
-	public OnMemoryTreeEditor(OnMemoryTree _tree)
-	{
-		
-	}
-	
-	public Node copyNode(Node _node)
-	{
-		return null;
-	}
-
-	@Override
-	public boolean check()
-	{
-		return false;
-	}
-
-	@Override
-	public boolean commit(boolean force)
-	{
-		return false;
-	}
-
-	@Override
-	public void merge()
-	{
-		
-	}
-
-	@Override
-	public boolean pull()
-	{
-		return false;
-	}
-
-	@Override
-	public Node useContents()
-	{
-		return null;
-	}
-}
--- a/src/treecms/util/PreOrderTreeWalker.java	Wed Feb 16 14:27:35 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-package treecms.util;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import treecms.api.Node;
-
-public class PreOrderTreeWalker implements Iterable<Node>
-{
-	private Node m_root;
-	
-	public PreOrderTreeWalker(Node _root)
-	{
-		m_root = _root;
-	}
-
-	@Override
-	public Iterator<Node> iterator()
-	{
-		return new PreOrderRecursiveIterator(m_root);
-	}
-
-	class PreOrderRecursiveIterator implements Iterator<Node>
-	{
-		private LinkedList<Node> nextList;
-		
-		public PreOrderRecursiveIterator(Node _root)
-		{
-			nextList = new LinkedList<Node>();
-			getChildren(_root, nextList);
-		}
-		
-		void getChildren(Node node, LinkedList<Node>list) {
-			list.add(node);
-			for(Node child : node.getChildren()){
-				getChildren(child,list);
-			}
-		}
-		
-		@Override
-		public boolean hasNext()
-		{
-			return !nextList.isEmpty();
-		}
-
-		@Override
-		public Node next()
-		{
-			return nextList.poll();
-		}
-
-		@Override
-		public void remove()
-		{
-			throw new UnsupportedOperationException("cant remove from itrerator");
-		}
-	}
-	
-	public LinkedList<Node> findPath(Node root, Node node) {
-		LinkedList<Node> list = new LinkedList<Node>();
-		list.addFirst(root);
-		findPath(root,node,list);
-		return list;
-	}
-
-	private boolean findPath(Node root, Node node, LinkedList<Node> list) {
-		if (root==node) return true;
-		for(Node child : node.getChildren()){
-			if (findPath(child,node,list)) {
-				list.addFirst(child);
-				return true;
-			}
-		}
-		return false; // backtrack
-	}
-}