changeset 51:d4709911e0ed

moved old Cassandra Monotonic-Tree implementation from "cassandra" to "cassandra.v1"
author shoshi
date Fri, 11 Feb 2011 15:07:57 +0900
parents a72718a0bccf
children 1b78f1f3add3
files src/treecms/proto/cassandra/CassBrowser.java src/treecms/proto/cassandra/CassDecNodeID.java src/treecms/proto/cassandra/CassEditor.java src/treecms/proto/cassandra/CassLink.java src/treecms/proto/cassandra/CassNode.java src/treecms/proto/cassandra/CassTreeImporter.java src/treecms/proto/cassandra/test/CassGetSliceTest.java src/treecms/proto/cassandra/test/CassLinkTest.java src/treecms/proto/cassandra/test/CassNodeTest.java src/treecms/proto/cassandra/test/CassStringTest.java src/treecms/proto/cassandra/v1/CassBrowser.java src/treecms/proto/cassandra/v1/CassDecNodeID.java src/treecms/proto/cassandra/v1/CassEditor.java src/treecms/proto/cassandra/v1/CassLink.java src/treecms/proto/cassandra/v1/CassNode.java src/treecms/proto/cassandra/v1/CassTreeImporter.java src/treecms/proto/cassandra/v1/test/CassGetSliceTest.java src/treecms/proto/cassandra/v1/test/CassLinkTest.java src/treecms/proto/cassandra/v1/test/CassNodeTest.java src/treecms/proto/cassandra/v1/test/CassStringTest.java src/treecms/proto/gui/GraphicalMonotonicTreeEditor.java
diffstat 21 files changed, 1391 insertions(+), 1390 deletions(-) [+]
line wrap: on
line diff
--- a/src/treecms/proto/cassandra/CassBrowser.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,551 +0,0 @@
-package treecms.proto.cassandra;
-
-import java.nio.CharBuffer;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import treecms.proto.api.Browser;
-import treecms.proto.api.Node;
-import treecms.proto.api.NodeID;
-
-import org.apache.thrift.transport.TTransport;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransportException;
-import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.cassandra.thrift.Cassandra;
-import org.apache.cassandra.thrift.ColumnOrSuperColumn;
-import org.apache.cassandra.thrift.ColumnParent;
-import org.apache.cassandra.thrift.ColumnPath;
-import org.apache.cassandra.thrift.ConsistencyLevel;
-import org.apache.cassandra.thrift.KeySlice;
-import org.apache.cassandra.thrift.NotFoundException;
-import org.apache.cassandra.thrift.SlicePredicate;
-import org.apache.cassandra.thrift.SliceRange;
-
-public class CassBrowser implements Browser
-{
-	private Cassandra.Client m_cassandra;
-	private String m_host,m_port;
-	private String m_keySpace,m_colFamily;
-	
-	public static final String TREEINFO = "TreeInfo";
-	public static final String ROOTNODE = "RootNode";
-	public static final String MARKER = "Marker"; // because of can't create null row entry.
-	public static final String CLASSNAME = "ClassName";
-	public static final String TITLE = "Title";
-	public static final String CHILDREN = "Children";
-	public static final String LINKUUID = "LinkUUID";
-	public static final String CHILDREN_DELIM = ",";
-	
-	private static final String ATTR_PREFIX = "_";
-	
-	public static void main(String _args[])
-	{
-		CassBrowser cass = CassBrowser.createInstance("localhost","9160","TreeCMSKS","TreeCMSCF03");
-		Node node = cass.useContents();
-		node.setTitle("fugafuga");
-		node.setClassName("hogehoge");
-		
-		node.setAttribute("fuga","higa");
-		node.setAttribute("Title","higa");
-		
-		System.out.println(node.getTitle());
-		
-		for(String key : node.getAttributeKeys()){
-			System.out.println(key);
-			System.out.println(node.getAttribute(key));
-		}
-		
-		Node clone = node.cloneNode();
-		System.out.println(clone.getID().toString());
-		clone.setTitle("cloned1");
-		
-		LinkedList<Node> children = new LinkedList<Node>();
-		Node child1 = clone.createNode();
-		child1.setTitle("fugafuga");
-		children.add(child1);
-		Node child2 = clone.createNode();
-		child1.setTitle("hugahuga");
-		children.add(child2);
-		
-		clone.addChildren(children);
-		
-		Node child3 = clone.createNode();
-		child3.setTitle("xfgafuga");
-		
-		clone.addChild(child3);
-	}
-	
-	private CassBrowser(String _host,String _port) throws TTransportException
-	{
-		m_host = _host;
-		m_port = _port;
-		m_cassandra = null;
-		
-		connect();
-	}
-	
-	private boolean initialize()
-	{
-		try{
-			ColumnPath column = new ColumnPath();
-			column.column_family = m_colFamily;
-			column.column = ROOTNODE.getBytes();
-			
-			m_cassandra.get(m_keySpace,TREEINFO,column,ConsistencyLevel.ALL);
-			
-		}catch(NotFoundException _e){
-			_e.printStackTrace();
-			System.out.println("Initializing ColumFamily["+m_colFamily+"]");
-			
-			Node root = createNode();
-			ColumnPath path = new ColumnPath();
-			path.column = ROOTNODE.getBytes();
-			path.column_family = m_colFamily;
-			
-			try {
-				m_cassandra.insert(m_keySpace,TREEINFO,path,root.getID().getUUID().getBytes(),System.currentTimeMillis()/1000,ConsistencyLevel.ALL);
-			}catch(Exception _e2){
-				_e2.printStackTrace();
-				return false;
-			}
-		}catch(Exception _e){
-			_e.printStackTrace();
-		}
-		
-		return true;
-	}
-	
-	public Cassandra.Client getClient()
-	{
-		return m_cassandra;
-	}
-	
-	public String getKeySpace()
-	{
-		return m_keySpace;
-	}
-	
-	public String getColumnFamily()
-	{
-		return m_colFamily;
-	}
-	
-	public synchronized void connect() throws TTransportException 
-	{
-		if(m_cassandra != null && m_cassandra.getOutputProtocol().getTransport().isOpen()){
-			return;
-		}
-		
-		TTransport tr = new TSocket(m_host,Integer.parseInt(m_port));
-		TProtocol proto = new TBinaryProtocol(tr);
-		m_cassandra = new Cassandra.Client(proto);
-		
-		tr.open();
-		
-	}
-	
-	public static CassBrowser createInstance(String _host,String _port,String _ks,String _cf)
-	{
-		CassBrowser browser = null;
-		try{
-			browser = new CassBrowser(_host,_port);
-			browser.m_keySpace = _ks;
-			browser.m_colFamily = _cf;
-			if(!browser.initialize()){
-				return null;
-			}
-		}catch(Exception _err){
-			_err.printStackTrace();
-		}
-		return browser;
-	}
-	
-	public Node addChild(NodeID _id,Node _child)
-	{
-		LinkedList<Node> tmp = new LinkedList<Node>();
-		tmp.add(_child);
-		addChildren(_id,tmp);
-		return _child;
-	}
-	
-	public void addChildren(NodeID _id,List<Node> _children)
-	{
-		String children = getChildrenRaw(_id);
-		Map<String,Boolean> set = new HashMap<String,Boolean>();
-		StringTokenizer st = new StringTokenizer(children,CHILDREN_DELIM);
-		while(st.hasMoreElements()){
-			set.put(st.nextToken(),Boolean.TRUE);
-		}
-		
-		StringBuffer buf = new StringBuffer(children);
-		
-		if(buf.length() != 0){
-			buf.append(CHILDREN_DELIM);
-		}
-		
-		String prefix = "";
-		for(int i = 0;i < _children.size();i ++){
-			String key = _children.get(i).getID().toString();
-			if(set.get(key) != null){
-				return;
-			}
-			
-			buf.append(prefix).append(key);
-			prefix = CHILDREN_DELIM;
-		}
-		
-		setColumn(_id.toString(),CHILDREN,buf.toString());
-	}
-	
-	public void clearChildren(NodeID _id)
-	{
-		setColumn(_id.toString(),CHILDREN,"");
-	}
-	
-	public boolean removeChild(NodeID _id,Node _child)
-	{
-		String raw = getChildrenRaw(_id);
-		StringTokenizer token = new StringTokenizer(raw,CHILDREN_DELIM);
-		
-		//CharBuffer buf = CharBuffer.allocate(raw.length());
-		StringBuffer buf = new StringBuffer();
-		
-		boolean changed = false;
-		
-		while(token.hasMoreElements()){
-			String child = token.nextToken();
-			if(child.equals(_child.getID().toString())){
-				changed = true;
-				continue;
-			}
-			
-			buf.append(child);
-			break;
-		}
-		
-		while(token.hasMoreElements()){
-			String child = token.nextToken();
-			if(child.equals(_child.getID().toString())){
-				changed = true;
-				continue;
-			}
-			
-			buf.append(CHILDREN_DELIM+child);
-		}
-		
-		if(changed){
-			setColumn(_id.toString(),CHILDREN,buf.toString());
-		}
-		
-		return changed;
-	}
-	
-	public void replace(NodeID _id,Node _child1,Node _child2)
-	{
-		String children = getChildrenRaw(_id);
-		//CharBuffer buf = CharBuffer.allocate(children.length());
-		StringBuffer buf = new StringBuffer();
-		StringTokenizer tokens = new StringTokenizer(children,CHILDREN_DELIM);
-
-		boolean flag = false;
-		String id1 = _child1.getID().toString();
-		String id2 = _child2.getID().toString();
-		for(String prefix = "";tokens.hasMoreElements();prefix = CHILDREN_DELIM){
-			String token = tokens.nextToken();
-			if(token.equals(id1)){
-				buf.append(prefix+id2);
-				flag = true;
-			}else{
-				buf.append(prefix+token);
-			}
-		}
-		
-		if(flag){
-//			setColumn(_id.toString(),CHILDREN,new String(buf.array()));
-			setColumn(_id.toString(),CHILDREN,buf.toString());
-		}
-	}
-	
-	public void down(NodeID _id,Node _child)
-	{
-		String children = getChildrenRaw(_id);
-		String id = _child.getID().toString();
-		//CharBuffer buf = CharBuffer.allocate(children.length());
-		StringBuffer buf = new StringBuffer();
-		StringTokenizer tokens = new StringTokenizer(children,CHILDREN_DELIM);
-		
-		for(String prefix = "";tokens.hasMoreElements();prefix = CHILDREN_DELIM){
-			String token = tokens.nextToken();
-			if(token.equals(id)){
-				if(tokens.hasMoreElements()){
-					String next = tokens.nextToken();
-					buf.append(prefix+next);
-					buf.append(CHILDREN_DELIM+_child.getID().toString());
-				}else{
-					buf.append(prefix+_child.getID().toString());
-				}
-				continue;
-			}
-			
-			buf.append(prefix+token);
-		}
-		
-		//setColumn(_id.toString(),CHILDREN,new String(buf.array()));
-		setColumn(_id.toString(),CHILDREN,buf.toString());
-	}
-	
-	public void up(NodeID _id,Node _child)
-	{
-		String children = getChildrenRaw(_id);
-		String id = _child.getID().toString();
-		//CharBuffer buf = CharBuffer.allocate(children.length());
-		StringBuffer buf = new StringBuffer();
-		StringTokenizer tokens = new StringTokenizer(children,CHILDREN_DELIM);
-		
-		int diff = 0;
-		while(tokens.hasMoreElements()){
-			String token = tokens.nextToken();
-			if(token.equals(id)){
-				int size = buf.length();
-				buf.insert(size - diff,CHILDREN_DELIM+token);
-			}else{
-				buf.append(CHILDREN_DELIM+token);
-			}
-		
-			diff = buf.length() - diff;
-		}
-		
-		String result = buf.toString().substring(1);
-		setColumn(_id.toString(),CHILDREN,result);
-	}
-	
-	public void setClassName(NodeID _id,String _className)
-	{
-		setColumn(_id.toString(),CLASSNAME,_className);
-	}
-	
-	public Node createNode()
-	{
-		NodeID newID = new CassDecNodeID(this);
-	
-		try{
-			ColumnPath path = new ColumnPath();
-			path.column_family = m_colFamily;
-			path.column = MARKER.getBytes();
-			
-			m_cassandra.insert(m_keySpace,newID.toString(),path,"null".getBytes(),System.currentTimeMillis()/1000,ConsistencyLevel.ALL);
-		}catch(Exception _e){
-			_e.printStackTrace();
-		}
-		
-		return new CassNode(this,newID);
-	}
-	
-	public List<Node> getChildren(NodeID _id)
-	{
-		LinkedList<Node> children = new LinkedList<Node>();
-		
-		String raw = getChildrenRaw(_id);
-		StringTokenizer tokens = new StringTokenizer(raw,CHILDREN_DELIM);
-		
-		while(tokens.hasMoreElements()){
-			String first = tokens.nextToken();
-			StringTokenizer sparator = new StringTokenizer(first,"@");
-			String uuid = sparator.nextToken();
-			long ver = Long.parseLong(sparator.nextToken());
-			NodeID id = new CassDecNodeID(this,uuid,ver);
-			children.add(new CassNode(this,id));
-		}
-		
-		return children;
-	}
-	
-	public CassNode cloneNode(NodeID _id)
-	{
-		NodeID newID = _id.update();
-		
-		SliceRange sr = new SliceRange();
-		sr.setStart(new byte[0]);
-		sr.setFinish(new byte[0]);
-		
-		SlicePredicate sp = new SlicePredicate();
-		sp.setSlice_range(sr);
-		
-		try{
-			List<ColumnOrSuperColumn> columns = m_cassandra.get_slice(m_keySpace,_id.toString(),new ColumnParent(m_colFamily),sp,ConsistencyLevel.ALL);
-			Map<String,List<ColumnOrSuperColumn>> cfmap = new HashMap<String,List<ColumnOrSuperColumn>>();
-			cfmap.put(m_colFamily,columns);
-			
-			m_cassandra.batch_insert(m_keySpace,newID.toString(),cfmap,ConsistencyLevel.ALL);
-		}catch(Exception _e){
-			_e.printStackTrace();
-		}
-		
-		return new CassNode(this,newID);
-	}
-	
-	public CassLink createLink(NodeID _id)
-	{
-		//must create link entries on cassandra
-		Node link = createNode();
-		setNode(link.getID(),_id);
-		return new CassLink(link.getID(),this);
-	}
-	
-	public boolean isChild(NodeID _id,Node _child)
-	{
-		String raw = getChildrenRaw(_id);
-		if(raw.indexOf(_child.getID().toString()) != -1){
-			return true;
-		}
-		return false;
-	}
-	
-	public String getClassName(NodeID _id)
-	{
-		return getColumn(_id.toString(),CLASSNAME);
-	}
-	
-	public String getChildrenRaw(NodeID _id)
-	{
-		String res = getColumn(_id.toString(),CHILDREN);
-		if(res == null){
-			return "";
-		}
-		return res;
-	}
-	
-	public String getTitle(NodeID _id)
-	{
-		return getColumn(_id.toString(),TITLE);
-	}
-	
-	public void setTitle(NodeID _id,String _title)
-	{
-		setColumn(_id.toString(),TITLE,_title);
-	}
-	
-	public String getAttribute(NodeID _id,String _attr)
-	{
-		return getColumn(_id.toString(),ATTR_PREFIX+_attr);
-	}
-	
-	public void setAttribute(NodeID _id,String _attr,String _value)
-	{
-		setColumn(_id.toString(),ATTR_PREFIX+_attr,_value);
-	}
-	
-	public Set<String> getAttributeKeys(NodeID _id)
-	{
-		Set<String> attrs = new HashSet<String>();
-		
-		SliceRange sr = new SliceRange();
-		sr.setStart(new byte[0]);
-		sr.setFinish(new byte[0]);
-		
-		SlicePredicate sp = new SlicePredicate();
-		sp.setSlice_range(sr);
-		
-		try{
-			List<ColumnOrSuperColumn> columns = m_cassandra.get_slice(m_keySpace,_id.toString(),new ColumnParent(m_colFamily),sp,ConsistencyLevel.ALL);
-			for(ColumnOrSuperColumn column : columns){
-				String key = new String(column.column.name);
-				if(key.startsWith(ATTR_PREFIX)){
-					attrs.add(key.replace(ATTR_PREFIX,""));
-				}
-			}
-		}catch(Exception _e){
-			_e.printStackTrace();
-		}
-		
-		return attrs;
-	}
-	
-	public NodeID getTipIDFromUUID(String _uuid)
-	{
-		SliceRange sliceRange = new SliceRange();
-		sliceRange.setStart(_uuid.getBytes());
-		sliceRange.setFinish(new byte[0]);
-		
-		SlicePredicate slicePredicate = new SlicePredicate();
-		slicePredicate.setSlice_range(sliceRange);
-		
-		try {
-			List<KeySlice> values = m_cassandra.get_range_slice(m_keySpace,new ColumnParent(m_colFamily),slicePredicate,_uuid,"",1,ConsistencyLevel.ALL);
-			String key = values.get(0).getKey();
-			
-			String tip = key.replaceFirst((_uuid+"@").intern(),"");
-			return new CassDecNodeID(this,_uuid,Long.parseLong(tip));
-		}catch(Exception _e){
-			_e.printStackTrace();
-		}
-		
-		return null;
-	}
-	
-	private String getColumn(String _row,String _colName)
-	{
-		ColumnPath path = new ColumnPath();
-		path.column_family = m_colFamily;
-		path.column = _colName.getBytes();
-		
-		String value = "";
-		try{
-			ColumnOrSuperColumn column;
-			column = m_cassandra.get(m_keySpace,_row,path,ConsistencyLevel.ALL);
-			value = new String(column.column.value);
-		}catch(Exception _e){
-			_e.printStackTrace();
-		}
-		
-		return value;
-	}
-	
-	private boolean setColumn(String _row,String _colName,String _value)
-	{
-		ColumnPath path = new ColumnPath();
-		path.column_family = m_colFamily;
-		path.column = _colName.getBytes();
-	
-		try{
-			m_cassandra.insert(m_keySpace,_row,path,_value.getBytes(),System.currentTimeMillis()/1000,ConsistencyLevel.ALL);
-			return true;
-		}catch(Exception _e){
-			_e.printStackTrace();
-		}
-		
-		return false;
-	}
-	
-	public Node getNodeByID(NodeID _id)
-	{
-		return new CassNode(this,_id);
-	}
-
-	@Override
-	public Node useContents()
-	{
-		String uuid = getColumn(TREEINFO,ROOTNODE);
-		NodeID rootID = getTipIDFromUUID(uuid);
-		return new CassNode(this,rootID);
-	}
-	
-	public Node getNode(NodeID m_id)
-	{
-		String uuid = getColumn(m_id.toString(),LINKUUID);
-		NodeID id = getTipIDFromUUID(uuid);
-		return new CassNode(this,id);
-	}
-	
-	public void setNode(NodeID m_id,NodeID _link)
-	{
-		setColumn(m_id.toString(),LINKUUID,_link.getUUID());
-	}
-}
--- a/src/treecms/proto/cassandra/CassDecNodeID.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-package treecms.proto.cassandra;
-
-import java.util.UUID;
-import treecms.proto.api.NodeID;
-import treecms.proto.id.DecrementalNodeID;
-
-public class CassDecNodeID extends DecrementalNodeID
-{
-	private String m_uuid;
-	private long m_version;
-	
-	private CassBrowser m_cassandra;
-	
-	public CassDecNodeID(CassBrowser _browser)
-	{
-		m_uuid = UUID.randomUUID().toString();
-		m_version = START_VALUE;
-		m_cassandra = _browser;
-	}
-	
-	public CassDecNodeID(CassBrowser _browser,String _uuid,long _version)
-	{
-		m_cassandra = _browser;
-		m_uuid = _uuid;
-		m_version = _version;
-	}
-
-	@Override
-	public NodeID create()
-	{
-		return new CassDecNodeID(m_cassandra);
-	}
-
-	@Override
-	public NodeID getTip()
-	{
-		NodeID tip = m_cassandra.getTipIDFromUUID(m_uuid);
-		if(tip == null){
-			return this;
-		}
-		return tip;
-	}
-
-	@Override
-	public String getUUID()
-	{
-		return m_uuid;
-	}
-
-	@Override
-	public String getVersion()
-	{
-		return Long.toString(m_version);
-	}
-
-	@Override
-	public NodeID update()
-	{
-		return new CassDecNodeID(m_cassandra,m_uuid,m_version - 1);
-	}
-}
--- a/src/treecms/proto/cassandra/CassEditor.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,170 +0,0 @@
-package treecms.proto.cassandra;
-
-import treecms.proto.api.Editor;
-import java.util.List;
-
-import java.util.LinkedList;
-
-import treecms.proto.api.Browser;
-import treecms.proto.api.Node;
-import treecms.proto.api.NodeID;
-import treecms.proto.marge.Marger;
-import treecms.proto.marge.ReplaceMarger;
-
-public class CassEditor implements Editor
-{
-	private Node m_local;
-	private Node m_remote;
-	
-	private Browser m_browser;
-	
-	public CassEditor(Browser _browser)
-	{
-		m_browser = _browser;
-		update();
-	}
-	
-	public void copyNode(Node _from,Node _to)
-	{
-		_to.setClassName(_from.getClassName());
-		_to.setTitle(_from.getTitle());
-		
-		for(String _key : _from.getAttributeKeys()){
-			_to.setAttribute(_key,_from.getAttribute(_key));
-		}
-		
-		_to.addChildren(_from.getChildren());
-	}
-	
-	@Override
-	public boolean check()
-	{
-		NodeID remoteID = m_remote.getID();
-		if(remoteID.equals(remoteID.getTip())){
-			return false;
-		}
-		return true;
-	}
-	
-	public boolean commit(boolean _force)
-	{
-		if(_force || !check()){
-			Node target = m_remote.cloneNode();
-			target.clearChildren();
-			copyNode(m_local,target);
-			return true;
-		}
-		
-		return false;
-	}
-	
-	public void merge()
-	{
-		Marger marger = new ReplaceMarger();
-		m_local = marger.merge(m_remote,m_local);
-	}
-	
-	public void discard()
-	{
-		copyNode(m_remote,m_local);
-	}
-
-	@Override
-	public Node useContents()
-	{
-		return m_local;
-	}
-
-	@Override
-	public void login(String user, String pass)
-	{
-	}
-
-	@Override
-	public void logout()
-	{
-	}
-
-	@Override
-	public Node edit(Node _target)
-	{
-		LinkedList<Node> path = findPath(m_local,_target);
-		if(path.isEmpty()){
-			return null;
-		}
-		
-		LinkedList<Node> change = new LinkedList<Node>();
-		Node root = path.poll().cloneNode();
-		change.add(root);
-		cloneTree(path,root,change);
-		
-		m_local = root;
-		
-		Node clone = change.peekLast();
-		return clone;
-	}
-	
-	private void cloneTree(LinkedList<Node> _path,Node _parent,LinkedList<Node> _change)
-	{
-		List<Node> children = _parent.getChildren();
-		Node target = _path.poll();
-		if(target == null){
-			return;
-		}
-		for(int i = 0;i < children.size();i ++){
-			Node _child = children.get(i);
-			if(_child.getID().isFamily(target.getID())){
-				//clone node
-				Node clone = _child.cloneNode();
-				_change.add(clone);
-				
-				//remove old node from clonedTree
-				_parent.replace(_child,clone);
-				
-				cloneTree(_path,clone,_change);
-				break;
-			}
-		}
-	}
-	
-	private LinkedList<Node> findPath(Node _root,Node _child)
-	{
-		LinkedList<Node> list = new LinkedList<Node>();
-		if(findPath(_root,_child,list)){
-			list.addFirst(_root);
-		}
-		return list;
-	}
-	
-	private boolean findPath(Node _root,Node _child,LinkedList<Node> _list)
-	{
-		if(_root.getID().isFamily(_child.getID())){
-			return true;
-		}
-		
-		for(Node child : _root.getChildren()){
-			if(findPath(child,_child,_list)){
-				_list.addFirst(child);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public Node getUncommited()
-	{
-		return m_local;
-	}
-
-	@Override
-	public boolean update()
-	{
-		m_remote = m_browser.useContents();
-		m_local = m_remote.createNode();
-		
-		copyNode(m_remote,m_local);
-		return true;
-	}
-}
-
--- a/src/treecms/proto/cassandra/CassLink.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,161 +0,0 @@
-package treecms.proto.cassandra;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import treecms.proto.api.Link;
-import treecms.proto.api.Node;
-import treecms.proto.api.NodeID;
-
-public class CassLink implements Link
-{
-	private NodeID m_id;
-	
-	private CassBrowser m_browser;
-	
-	public CassLink(NodeID _id,CassBrowser _browser)
-	{
-		m_id = _id;
-		
-		m_browser = _browser;
-	}
-	
-	@Override
-	public Node getNode()
-	{
-		return m_browser.getNode(m_id);
-	}
-
-	@Override
-	public void setNode(Node _link)
-	{
-		m_browser.setNode(m_id,_link.getID());
-	}
-
-	@Override
-	public Node addChild(Node _child)
-	{
-		return getNode().addChild(_child);
-	}
-
-	@Override
-	public void addChildren(List<Node> _children)
-	{
-		getNode().addChildren(_children);
-	}
-
-	@Override
-	public void clearChildren()
-	{
-		getNode().clearChildren();
-	}
-
-	@Override
-	public Node cloneNode()
-	{
-		return getNode().cloneNode();
-	}
-
-	@Override
-	public Link createLink()
-	{
-		return getNode().createLink();
-	}
-
-	@Override
-	public Node createNode()
-	{
-		return m_browser.createNode();
-	}
-
-	@Override
-	public void down(Node _child)
-	{
-		getNode().down(_child);
-	}
-
-	@Override
-	public String getAttribute(String _attr)
-	{
-		return getNode().getAttribute(_attr);
-	}
-
-	@Override
-	public Set<String> getAttributeKeys()
-	{
-		return getNode().getAttributeKeys();
-	}
-
-	@Override
-	public List<Node> getChildren()
-	{
-		return getNode().getChildren();
-	}
-
-	@Override
-	public String getClassName()
-	{
-		return getNode().getClassName();
-	}
-
-	@Override
-	public NodeID getID()
-	{
-		return m_id;
-	}
-
-	@Override
-	public String getTitle()
-	{
-		return getNode().getTitle();
-	}
-
-	@Override
-	public boolean isChild(Node _child)
-	{
-		return getNode().isChild(_child);
-	}
-
-	@Override
-	public Iterator<Node> iterator()
-	{
-		return getNode().iterator();
-	}
-
-	@Override
-	public boolean removeChild(Node _child)
-	{
-		return getNode().removeChild(_child);
-	}
-
-	@Override
-	public void replace(Node _target,Node _newChild)
-	{
-		getNode().replace(_target,_newChild);
-	}
-
-	@Override
-	public void setAttribute(String _attr,String _value)
-	{
-		getNode().setAttribute(_attr,_value);
-	}
-
-	@Override
-	public void setClassName(String _className)
-	{
-		getNode().setClassName(_className);
-	}
-
-	@Override
-	public void setTitle(String _title)
-	{
-		getNode().setTitle(_title);
-	}
-
-	@Override
-	public void up(Node _child)
-	{
-		getNode().up(_child);
-	}
-}
--- a/src/treecms/proto/cassandra/CassNode.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,161 +0,0 @@
-package treecms.proto.cassandra;
-
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import treecms.proto.api.Link;
-import treecms.proto.api.Node;
-import treecms.proto.api.NodeID;
-
-public class CassNode implements Node
-{
-	private CassBrowser m_browser;
-	private NodeID m_id;
-	
-	public CassNode(CassBrowser _browser,NodeID _id)
-	{
-		m_browser = _browser;
-		m_id = _id;
-	}
-	
-	/*
-	 * for implement connection pool
-	 */
-	private CassBrowser getBrowser()
-	{
-		return m_browser;
-	}
-
-	@Override
-	public Node addChild(Node _child)
-	{
-		return getBrowser().addChild(m_id,_child);
-	}
-
-	@Override
-	public void addChildren(List<Node> _children)
-	{
-		getBrowser().addChildren(m_id,_children);
-	}
-	
-	public String toString()
-	{
-		return getTitle()+"["+getID().toString()+"]";
-	}
-	
-	@Override
-	public void clearChildren()
-	{
-		getBrowser().clearChildren(m_id);
-	}
-
-	@Override
-	public Node cloneNode()
-	{
-		return getBrowser().cloneNode(m_id);
-	}
-
-	@Override
-	public Link createLink()
-	{
-		return getBrowser().createLink(m_id);
-	}
-
-	@Override
-	public Node createNode()
-	{
-		return getBrowser().createNode();
-	}
-
-	@Override
-	public void down(Node _child)
-	{
-		getBrowser().down(m_id,_child);
-	}
-
-	@Override
-	public String getAttribute(String _attr)
-	{
-		return getBrowser().getAttribute(m_id,_attr);
-	}
-
-	@Override
-	public Set<String> getAttributeKeys()
-	{
-		return getBrowser().getAttributeKeys(m_id);
-	}
-
-	@Override
-	public List<Node> getChildren()
-	{
-		return getBrowser().getChildren(m_id);
-	}
-
-	@Override
-	public String getClassName()
-	{
-		return getBrowser().getClassName(m_id);
-	}
-
-	@Override
-	public NodeID getID()
-	{
-		return m_id;
-	}
-
-	@Override
-	public String getTitle()
-	{
-		return getBrowser().getTitle(m_id);
-	}
-
-	@Override
-	public boolean isChild(Node _child)
-	{
-		return getBrowser().isChild(m_id,_child);
-	}
-
-	@Override
-	public Iterator<Node> iterator()
-	{
-		return getChildren().iterator();
-	}
-
-	@Override
-	public boolean removeChild(Node _child)
-	{
-		return getBrowser().removeChild(m_id,_child);
-	}
-
-	@Override
-	public void replace(Node _target, Node _newChild)
-	{
-		getBrowser().replace(m_id,_target,_newChild);
-	}
-
-	@Override
-	public void setAttribute(String _attr, String _value)
-	{
-		getBrowser().setAttribute(m_id,_attr,_value);
-	}
-
-	@Override
-	public void setClassName(String _className)
-	{
-		getBrowser().setClassName(m_id,_className);
-	}
-
-	@Override
-	public void setTitle(String _title)
-	{
-		getBrowser().setTitle(m_id,_title);
-	}
-
-	@Override
-	public void up(Node _child)
-	{
-		getBrowser().up(m_id,_child);
-	}
-}
--- a/src/treecms/proto/cassandra/CassTreeImporter.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-package treecms.proto.cassandra;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cassandra.thrift.Cassandra;
-import org.apache.cassandra.thrift.Column;
-import org.apache.cassandra.thrift.ColumnOrSuperColumn;
-import org.apache.cassandra.thrift.ConsistencyLevel;
-import org.apache.cassandra.thrift.Mutation;
-
-import treecms.proto.api.Node;
-
-public class CassTreeImporter
-{
-	public CassBrowser m_browser;
-	
-	public CassTreeImporter(CassBrowser _browser)
-	{
-		m_browser = _browser;
-	}
-	
-	public void importTree(Node _root)
-	{
-		List<Node> list = listNode(_root);
-		
-		Cassandra.Client client = m_browser.getClient();
-		
-		Map<String,Map<String,List<Mutation>>> mutation = new HashMap<String,Map<String,List<Mutation>>>();
-		Map<String,List<Mutation>> map = new HashMap<String,List<Mutation>>();
-		for(Node node : list){
-			LinkedList<Mutation> columns = new LinkedList<Mutation>();
-			
-			Column className = new Column();
-			className.name = CassBrowser.CLASSNAME.getBytes();
-			className.value = node.getClassName().getBytes();
-			columns.add(packColumn(className));
-			
-			Column title = new Column();
-			title.name = CassBrowser.TITLE.getBytes();
-			title.value = node.getTitle().getBytes();
-			columns.add(packColumn(title));
-			
-			for(String key : node.getAttributeKeys()){
-				Column attr = new Column();
-				attr.name = key.getBytes();
-				attr.value = node.getAttribute(key).getBytes();
-				columns.add(packColumn(attr));
-			}
-			
-			map.put(node.getID().toString(),columns);
-		}
-		
-		mutation.put(m_browser.getColumnFamily(),map);
-		
-		try{
-			client.batch_mutate(m_browser.getKeySpace(),mutation,ConsistencyLevel.ONE);
-		}catch(Exception _e){
-			_e.printStackTrace();
-		}
-	}
-	
-	public Mutation packColumn(Column _col)
-	{
-		ColumnOrSuperColumn cors = new ColumnOrSuperColumn();
-		
-		cors.column = _col;
-
-		Mutation mut = new Mutation();
-		mut.column_or_supercolumn = cors;
-		
-		return mut;
-	}
-	
-	private List<Node> listNode(Node _root)
-	{
-		LinkedList<Node> list = new LinkedList<Node>();
-		list.addAll(_root.getChildren());
-		for(Node child : list){
-			list.addAll(listNode(child));
-		}
-		return list;
-	}
-}
--- a/src/treecms/proto/cassandra/test/CassGetSliceTest.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-package treecms.proto.cassandra.test;
-
-/*
- * Cassandra get_slice , get_range_slice test
- * 
- * 2011/01/19 Shoshi TAMAKI
- */
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cassandra.thrift.Cassandra;
-import org.apache.cassandra.thrift.Column;
-import org.apache.cassandra.thrift.ColumnOrSuperColumn;
-import org.apache.cassandra.thrift.ColumnParent;
-import org.apache.cassandra.thrift.ColumnPath;
-import org.apache.cassandra.thrift.ConsistencyLevel;
-import org.apache.cassandra.thrift.InvalidRequestException;
-import org.apache.cassandra.thrift.KeySlice;
-import org.apache.cassandra.thrift.NotFoundException;
-import org.apache.cassandra.thrift.SlicePredicate;
-import org.apache.cassandra.thrift.SliceRange;
-import org.apache.cassandra.thrift.TimedOutException;
-import org.apache.cassandra.thrift.UnavailableException;
-import org.apache.thrift.TException;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransport;
-
-public class CassGetSliceTest
-{
-	public static void main(String _args[])throws Exception
-	{
-		Cassandra.Client client;
-		
-		String host = "localhost";
-		int port = 9160;
-		
-		TTransport tr = new TSocket(host,port);
-		TProtocol proto = new TBinaryProtocol(tr);
-		client = new Cassandra.Client(proto);
-		
-		tr.open();
-		
-		System.out.println("ClusterName = "+client.describe_cluster_name());
-		testGetRangeSlice(client);
-		//testBatchInsert(client);
-		
-		tr.close();
-	}
-	
-	public static void testBatchInsert(Cassandra.Client _client) throws InvalidRequestException, UnavailableException, TimedOutException, TException
-	{
-		List<ColumnOrSuperColumn> list = new LinkedList<ColumnOrSuperColumn>();
-		
-		ColumnOrSuperColumn c1 = new ColumnOrSuperColumn();
-		c1.column = new Column();
-		c1.column.name = "hogehoge".getBytes();
-		c1.column.value = "fugafuga".getBytes();
-		c1.column.timestamp = System.currentTimeMillis()/1000;
-		
-		ColumnOrSuperColumn c2 = new ColumnOrSuperColumn();
-		c2.column = new Column();
-		c2.column.name = "abc".getBytes();
-		c2.column.value = "abcabc".getBytes();
-		c2.column.timestamp = System.currentTimeMillis()/1000;
-		
-		ColumnOrSuperColumn c3 = new ColumnOrSuperColumn();
-		c3.column = new Column();
-		c3.column.name = "def".getBytes();
-		c3.column.value = "defdef".getBytes();
-		c3.column.timestamp = System.currentTimeMillis()/1000;
-		
-		list.add(c1);
-		list.add(c2);
-		list.add(c3);
-		
-		Map<String,List<ColumnOrSuperColumn>> map = new HashMap<String,List<ColumnOrSuperColumn>>();
-		map.put("TreeCMSCF01",list);
-		
-		_client.batch_insert("TreeCMSKS","hoge",map,ConsistencyLevel.ONE);
-		
-		SliceRange sr = new SliceRange();
-		sr.setStart(new byte[0]);
-		sr.setFinish(new byte[0]);
-		
-		SlicePredicate sp = new SlicePredicate();
-		sp.setSlice_range(sr);
-		
-		List<ColumnOrSuperColumn> result = _client.get_slice("TreeCMSKS","hoge",new ColumnParent("TreeCMSCF01"),sp,ConsistencyLevel.ONE);
-		
-		for(ColumnOrSuperColumn val : result){
-			System.out.print("name:"+new String(val.column.name));
-			System.out.println("\tvalue:"+new String(val.column.value));
-		}
-	}
-	
-	public static void testGet(Cassandra.Client _client) throws InvalidRequestException, NotFoundException, UnavailableException, TimedOutException, TException
-	{
-		ColumnPath path = new ColumnPath();
-		path.column_family = "TreeCMSCF01";
-		path.column = "value".getBytes();
-		
-		ColumnOrSuperColumn value = _client.get("TreeCMSKS","uuid@01",path,ConsistencyLevel.ONE);
-		
-		System.out.println(new String(value.column.getValue()));
-	}
-	
-	public static void testGetSlice(Cassandra.Client _client) throws InvalidRequestException, NotFoundException, UnavailableException, TimedOutException, TException
-	{
-		SliceRange sliceRange = new SliceRange();
-		sliceRange.setStart(new byte[0]);
-		sliceRange.setFinish(new byte[0]);
-		
-		SlicePredicate slicePredicate = new SlicePredicate();
-		slicePredicate.setSlice_range(sliceRange);
-		
-		List<ColumnOrSuperColumn> values = _client.get_slice("TreeCMSKS","",new ColumnParent("TreeCMSCF03"),slicePredicate,ConsistencyLevel.ONE);
-		
-		for(ColumnOrSuperColumn value : values){
-			System.out.println(new String(value.column.getName())+":"+new String(value.column.getValue()));
-		}
-	}
-	
-	public static void testGetRangeSlice(Cassandra.Client _client) throws InvalidRequestException, NotFoundException, UnavailableException, TimedOutException, TException
-	{
-		SliceRange sliceRange = new SliceRange();
-		sliceRange.setStart(new byte[0]);
-		sliceRange.setFinish(new byte[0]);
-		
-		SlicePredicate slicePredicate = new SlicePredicate();
-		slicePredicate.setSlice_range(sliceRange);
-		
-		List<KeySlice> values = _client.get_range_slice("TreeCMSKS",new ColumnParent("TreeCMSCF03"),slicePredicate,"","",100,ConsistencyLevel.ONE);
-		
-		for(KeySlice key : values){
-			System.out.println(new String(key.getKey()));
-			for(ColumnOrSuperColumn column : key.getColumns()){
-				System.out.println("\t"+new String(column.column.getName())+":"+new String(column.column.getValue()));
-			}
-		}
-	}
-}
--- a/src/treecms/proto/cassandra/test/CassLinkTest.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-package treecms.proto.cassandra.test;
-
-import org.junit.runner.JUnitCore;
-
-import treecms.proto.cassandra.CassBrowser;
-import treecms.proto.test.LinkTest;
-
-public class CassLinkTest extends LinkTest
-{
-	public static void main(String _arg[])
-	{
-		JUnitCore.main(CassLinkTest.class.getName());
-	}
-	
-	public CassLinkTest()
-	{
-		super(CassBrowser.createInstance("localhost","9160","TreeCMSKS","TreeCMSCF03").useContents());
-	}
-}
--- a/src/treecms/proto/cassandra/test/CassNodeTest.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-package treecms.proto.cassandra.test;
-
-
-import org.junit.runner.JUnitCore;
-
-import treecms.proto.cassandra.CassBrowser;
-import treecms.proto.test.NodeTest;
-
-public class CassNodeTest extends NodeTest
-{
-	public static void main(String _args[])
-	{
-		JUnitCore.main(CassNodeTest.class.getName());
-	}
-	
-	public CassNodeTest()
-	{
-		super(CassBrowser.createInstance("localhost","9160","TreeCMSKS","TreeCMSCF03").useContents());
-	}
-}
\ No newline at end of file
--- a/src/treecms/proto/cassandra/test/CassStringTest.java	Tue Feb 01 16:28:49 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-package treecms.proto.cassandra.test;
-
-public class CassStringTest
-{
-	public static void main(String _args[])
-	{
-		String key1 = "hogehoge";
-		String key2 = "fuga";
-		
-		System.out.println(key1.compareTo(key2));
-		System.out.println(key2.compareTo(key1));
-	}
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/CassBrowser.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,552 @@
+package treecms.proto.cassandra.v1;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import treecms.proto.api.Browser;
+import treecms.proto.api.Node;
+import treecms.proto.api.NodeID;
+
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TSocket;
+import org.apache.thrift.transport.TTransportException;
+import org.apache.thrift.protocol.TProtocol;
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.cassandra.thrift.Cassandra;
+import org.apache.cassandra.thrift.ColumnOrSuperColumn;
+import org.apache.cassandra.thrift.ColumnParent;
+import org.apache.cassandra.thrift.ColumnPath;
+import org.apache.cassandra.thrift.ConsistencyLevel;
+import org.apache.cassandra.thrift.KeySlice;
+import org.apache.cassandra.thrift.NotFoundException;
+import org.apache.cassandra.thrift.SlicePredicate;
+import org.apache.cassandra.thrift.SliceRange;
+
+public class CassBrowser implements Browser
+{
+	private Cassandra.Client m_cassandra;
+	private String m_host,m_port;
+	private String m_keySpace,m_colFamily;
+	
+	public static final String TREEINFO = "TreeInfo";
+	public static final String ROOTNODE = "RootNode";
+	public static final String MARKER = "Marker"; // because of can't create null row entry.
+	public static final String CLASSNAME = "ClassName";
+	public static final String TITLE = "Title";
+	public static final String CHILDREN = "Children";
+	public static final String LINKUUID = "LinkUUID";
+	public static final String CHILDREN_DELIM = ",";
+	
+	private static final String ATTR_PREFIX = "_";
+	
+	public static void main(String _args[])
+	{
+		CassBrowser cass = CassBrowser.createInstance("localhost","9160","TreeCMSKS","TreeCMSCF03");
+		Node node = cass.useContents();
+		node.setTitle("fugafuga");
+		node.setClassName("hogehoge");
+		
+		node.setAttribute("fuga","higa");
+		node.setAttribute("Title","higa");
+		
+		System.out.println(node.getTitle());
+		
+		for(String key : node.getAttributeKeys()){
+			System.out.println(key);
+			System.out.println(node.getAttribute(key));
+		}
+		
+		Node clone = node.cloneNode();
+		System.out.println(clone.getID().toString());
+		clone.setTitle("cloned1");
+		
+		LinkedList<Node> children = new LinkedList<Node>();
+		Node child1 = clone.createNode();
+		child1.setTitle("fugafuga");
+		children.add(child1);
+		Node child2 = clone.createNode();
+		child1.setTitle("hugahuga");
+		children.add(child2);
+		
+		clone.addChildren(children);
+		
+		Node child3 = clone.createNode();
+		child3.setTitle("xfgafuga");
+		
+		clone.addChild(child3);
+	}
+	
+	private CassBrowser(String _host,String _port) throws TTransportException
+	{
+		m_host = _host;
+		m_port = _port;
+		m_cassandra = null;
+		
+		connect();
+	}
+	
+	private boolean initialize()
+	{
+		try{
+			ColumnPath column = new ColumnPath();
+			column.column_family = m_colFamily;
+			column.column = ROOTNODE.getBytes();
+			
+			m_cassandra.get(m_keySpace,TREEINFO,column,ConsistencyLevel.ALL);
+			
+		}catch(NotFoundException _e){
+			_e.printStackTrace();
+			System.out.println("Initializing ColumFamily["+m_colFamily+"]");
+			
+			Node root = createNode();
+			ColumnPath path = new ColumnPath();
+			path.column = ROOTNODE.getBytes();
+			path.column_family = m_colFamily;
+			
+			try {
+				m_cassandra.insert(m_keySpace,TREEINFO,path,root.getID().getUUID().getBytes(),System.currentTimeMillis()/1000,ConsistencyLevel.ALL);
+			}catch(Exception _e2){
+				_e2.printStackTrace();
+				return false;
+			}
+		}catch(Exception _e){
+			_e.printStackTrace();
+		}
+		
+		return true;
+	}
+	
+	public Cassandra.Client getClient()
+	{
+		return m_cassandra;
+	}
+	
+	public String getKeySpace()
+	{
+		return m_keySpace;
+	}
+	
+	public String getColumnFamily()
+	{
+		return m_colFamily;
+	}
+	
+	public synchronized void connect() throws TTransportException 
+	{
+		if(m_cassandra != null && m_cassandra.getOutputProtocol().getTransport().isOpen()){
+			return;
+		}
+		
+		TTransport tr = new TSocket(m_host,Integer.parseInt(m_port));
+		TProtocol proto = new TBinaryProtocol(tr);
+		m_cassandra = new Cassandra.Client(proto);
+		
+		tr.open();
+		
+	}
+	
+	public static CassBrowser createInstance(String _host,String _port,String _ks,String _cf)
+	{
+		CassBrowser browser = null;
+		try{
+			browser = new CassBrowser(_host,_port);
+			browser.m_keySpace = _ks;
+			browser.m_colFamily = _cf;
+			if(!browser.initialize()){
+				return null;
+			}
+		}catch(Exception _err){
+			_err.printStackTrace();
+		}
+		return browser;
+	}
+	
+	public Node addChild(NodeID _id,Node _child)
+	{
+		LinkedList<Node> tmp = new LinkedList<Node>();
+		tmp.add(_child);
+		addChildren(_id,tmp);
+		return _child;
+	}
+	
+	public void addChildren(NodeID _id,List<Node> _children)
+	{
+		String children = getChildrenRaw(_id);
+		Map<String,Boolean> set = new HashMap<String,Boolean>();
+		StringTokenizer st = new StringTokenizer(children,CHILDREN_DELIM);
+		while(st.hasMoreElements()){
+			set.put(st.nextToken(),Boolean.TRUE);
+		}
+		
+		StringBuffer buf = new StringBuffer(children);
+		
+		if(buf.length() != 0){
+			buf.append(CHILDREN_DELIM);
+		}
+		
+		String prefix = "";
+		for(int i = 0;i < _children.size();i ++){
+			String key = _children.get(i).getID().toString();
+			if(set.get(key) != null){
+				return;
+			}
+			
+			buf.append(prefix).append(key);
+			prefix = CHILDREN_DELIM;
+		}
+		
+		setColumn(_id.toString(),CHILDREN,buf.toString());
+	}
+	
+	public void clearChildren(NodeID _id)
+	{
+		setColumn(_id.toString(),CHILDREN,"");
+	}
+	
+	public boolean removeChild(NodeID _id,Node _child)
+	{
+		String raw = getChildrenRaw(_id);
+		StringTokenizer token = new StringTokenizer(raw,CHILDREN_DELIM);
+		
+		//CharBuffer buf = CharBuffer.allocate(raw.length());
+		StringBuffer buf = new StringBuffer();
+		
+		boolean changed = false;
+		
+		while(token.hasMoreElements()){
+			String child = token.nextToken();
+			if(child.equals(_child.getID().toString())){
+				changed = true;
+				continue;
+			}
+			
+			buf.append(child);
+			break;
+		}
+		
+		while(token.hasMoreElements()){
+			String child = token.nextToken();
+			if(child.equals(_child.getID().toString())){
+				changed = true;
+				continue;
+			}
+			
+			buf.append(CHILDREN_DELIM+child);
+		}
+		
+		if(changed){
+			setColumn(_id.toString(),CHILDREN,buf.toString());
+		}
+		
+		return changed;
+	}
+	
+	public void replace(NodeID _id,Node _child1,Node _child2)
+	{
+		String children = getChildrenRaw(_id);
+		//CharBuffer buf = CharBuffer.allocate(children.length());
+		StringBuffer buf = new StringBuffer();
+		StringTokenizer tokens = new StringTokenizer(children,CHILDREN_DELIM);
+
+		boolean flag = false;
+		String id1 = _child1.getID().toString();
+		String id2 = _child2.getID().toString();
+		for(String prefix = "";tokens.hasMoreElements();prefix = CHILDREN_DELIM){
+			String token = tokens.nextToken();
+			if(token.equals(id1)){
+				buf.append(prefix+id2);
+				flag = true;
+			}else{
+				buf.append(prefix+token);
+			}
+		}
+		
+		if(flag){
+//			setColumn(_id.toString(),CHILDREN,new String(buf.array()));
+			setColumn(_id.toString(),CHILDREN,buf.toString());
+		}
+	}
+	
+	public void down(NodeID _id,Node _child)
+	{
+		String children = getChildrenRaw(_id);
+		String id = _child.getID().toString();
+		//CharBuffer buf = CharBuffer.allocate(children.length());
+		StringBuffer buf = new StringBuffer();
+		StringTokenizer tokens = new StringTokenizer(children,CHILDREN_DELIM);
+		
+		for(String prefix = "";tokens.hasMoreElements();prefix = CHILDREN_DELIM){
+			String token = tokens.nextToken();
+			if(token.equals(id)){
+				if(tokens.hasMoreElements()){
+					String next = tokens.nextToken();
+					buf.append(prefix+next);
+					buf.append(CHILDREN_DELIM+_child.getID().toString());
+				}else{
+					buf.append(prefix+_child.getID().toString());
+				}
+				continue;
+			}
+			
+			buf.append(prefix+token);
+		}
+		
+		//setColumn(_id.toString(),CHILDREN,new String(buf.array()));
+		setColumn(_id.toString(),CHILDREN,buf.toString());
+	}
+	
+	public void up(NodeID _id,Node _child)
+	{
+		String children = getChildrenRaw(_id);
+		String id = _child.getID().toString();
+		//CharBuffer buf = CharBuffer.allocate(children.length());
+		StringBuffer buf = new StringBuffer();
+		StringTokenizer tokens = new StringTokenizer(children,CHILDREN_DELIM);
+		
+		int diff = 0;
+		while(tokens.hasMoreElements()){
+			String token = tokens.nextToken();
+			if(token.equals(id)){
+				int size = buf.length();
+				buf.insert(size - diff,CHILDREN_DELIM+token);
+			}else{
+				buf.append(CHILDREN_DELIM+token);
+			}
+		
+			diff = buf.length() - diff;
+		}
+		
+		String result = buf.toString().substring(1);
+		setColumn(_id.toString(),CHILDREN,result);
+	}
+	
+	public void setClassName(NodeID _id,String _className)
+	{
+		setColumn(_id.toString(),CLASSNAME,_className);
+	}
+	
+	public Node createNode()
+	{
+		NodeID newID = new CassDecNodeID(this);
+	
+		try{
+			ColumnPath path = new ColumnPath();
+			path.column_family = m_colFamily;
+			path.column = MARKER.getBytes();
+			
+			m_cassandra.insert(m_keySpace,newID.toString(),path,"null".getBytes(),System.currentTimeMillis()/1000,ConsistencyLevel.ALL);
+		}catch(Exception _e){
+			_e.printStackTrace();
+		}
+		
+		return new CassNode(this,newID);
+	}
+	
+	public List<Node> getChildren(NodeID _id)
+	{
+		LinkedList<Node> children = new LinkedList<Node>();
+		
+		String raw = getChildrenRaw(_id);
+		StringTokenizer tokens = new StringTokenizer(raw,CHILDREN_DELIM);
+		
+		while(tokens.hasMoreElements()){
+			String first = tokens.nextToken();
+			StringTokenizer sparator = new StringTokenizer(first,"@");
+			String uuid = sparator.nextToken();
+			long ver = Long.parseLong(sparator.nextToken());
+			NodeID id = new CassDecNodeID(this,uuid,ver);
+			children.add(new CassNode(this,id));
+		}
+		
+		return children;
+	}
+	
+	public CassNode cloneNode(NodeID _id)
+	{
+		NodeID newID = _id.update();
+		
+		SliceRange sr = new SliceRange();
+		sr.setStart(new byte[0]);
+		sr.setFinish(new byte[0]);
+		
+		SlicePredicate sp = new SlicePredicate();
+		sp.setSlice_range(sr);
+		
+		try{
+			List<ColumnOrSuperColumn> columns = m_cassandra.get_slice(m_keySpace,_id.toString(),new ColumnParent(m_colFamily),sp,ConsistencyLevel.ALL);
+			Map<String,List<ColumnOrSuperColumn>> cfmap = new HashMap<String,List<ColumnOrSuperColumn>>();
+			cfmap.put(m_colFamily,columns);
+			
+			m_cassandra.batch_insert(m_keySpace,newID.toString(),cfmap,ConsistencyLevel.ALL);
+		}catch(Exception _e){
+			_e.printStackTrace();
+		}
+		
+		return new CassNode(this,newID);
+	}
+	
+	public CassLink createLink(NodeID _id)
+	{
+		//must create link entries on cassandra
+		Node link = createNode();
+		setNode(link.getID(),_id);
+		return new CassLink(link.getID(),this);
+	}
+	
+	public boolean isChild(NodeID _id,Node _child)
+	{
+		String raw = getChildrenRaw(_id);
+		if(raw.indexOf(_child.getID().toString()) != -1){
+			return true;
+		}
+		return false;
+	}
+	
+	public String getClassName(NodeID _id)
+	{
+		return getColumn(_id.toString(),CLASSNAME);
+	}
+	
+	public String getChildrenRaw(NodeID _id)
+	{
+		String res = getColumn(_id.toString(),CHILDREN);
+		if(res == null){
+			return "";
+		}
+		return res;
+	}
+	
+	public String getTitle(NodeID _id)
+	{
+		return getColumn(_id.toString(),TITLE);
+	}
+	
+	public void setTitle(NodeID _id,String _title)
+	{
+		setColumn(_id.toString(),TITLE,_title);
+	}
+	
+	public String getAttribute(NodeID _id,String _attr)
+	{
+		return getColumn(_id.toString(),ATTR_PREFIX+_attr);
+	}
+	
+	public void setAttribute(NodeID _id,String _attr,String _value)
+	{
+		setColumn(_id.toString(),ATTR_PREFIX+_attr,_value);
+	}
+	
+	public Set<String> getAttributeKeys(NodeID _id)
+	{
+		Set<String> attrs = new HashSet<String>();
+		
+		SliceRange sr = new SliceRange();
+		sr.setStart(new byte[0]);
+		sr.setFinish(new byte[0]);
+		
+		SlicePredicate sp = new SlicePredicate();
+		sp.setSlice_range(sr);
+		
+		try{
+			List<ColumnOrSuperColumn> columns = m_cassandra.get_slice(m_keySpace,_id.toString(),new ColumnParent(m_colFamily),sp,ConsistencyLevel.ALL);
+			for(ColumnOrSuperColumn column : columns){
+				String key = new String(column.column.name);
+				if(key.startsWith(ATTR_PREFIX)){
+					attrs.add(key.replace(ATTR_PREFIX,""));
+				}
+			}
+		}catch(Exception _e){
+			_e.printStackTrace();
+		}
+		
+		return attrs;
+	}
+	
+	public NodeID getTipIDFromUUID(String _uuid)
+	{
+		SliceRange sliceRange = new SliceRange();
+		sliceRange.setStart(_uuid.getBytes());
+		sliceRange.setFinish(new byte[0]);
+		
+		SlicePredicate slicePredicate = new SlicePredicate();
+		slicePredicate.setSlice_range(sliceRange);
+		
+		try {
+			List<KeySlice> values = m_cassandra.get_range_slice(m_keySpace,new ColumnParent(m_colFamily),slicePredicate,_uuid,"",1,ConsistencyLevel.ALL);
+			String key = values.get(0).getKey();
+			
+			String tip = key.replaceFirst((_uuid+"@").intern(),"");
+			return new CassDecNodeID(this,_uuid,Long.parseLong(tip));
+		}catch(Exception _e){
+			_e.printStackTrace();
+		}
+		
+		return null;
+	}
+	
+	private String getColumn(String _row,String _colName)
+	{
+		ColumnPath path = new ColumnPath();
+		path.column_family = m_colFamily;
+		path.column = _colName.getBytes();
+		
+		String value = "";
+		try{
+			ColumnOrSuperColumn column;
+			column = m_cassandra.get(m_keySpace,_row,path,ConsistencyLevel.ALL);
+			value = new String(column.column.value);
+		}catch(NotFoundException _e){
+			System.out.println("column not found ["+_row+"]["+_colName+"]");
+		}catch(Exception _e){
+			_e.printStackTrace();
+		}
+		
+		return value;
+	}
+	
+	private boolean setColumn(String _row,String _colName,String _value)
+	{
+		ColumnPath path = new ColumnPath();
+		path.column_family = m_colFamily;
+		path.column = _colName.getBytes();
+	
+		try{
+			m_cassandra.insert(m_keySpace,_row,path,_value.getBytes(),System.currentTimeMillis()/1000,ConsistencyLevel.ALL);
+			return true;
+		}catch(Exception _e){
+			_e.printStackTrace();
+		}
+		
+		return false;
+	}
+	
+	public Node getNodeByID(NodeID _id)
+	{
+		return new CassNode(this,_id);
+	}
+
+	@Override
+	public Node useContents()
+	{
+		String uuid = getColumn(TREEINFO,ROOTNODE);
+		NodeID rootID = getTipIDFromUUID(uuid);
+		return new CassNode(this,rootID);
+	}
+	
+	public Node getNode(NodeID m_id)
+	{
+		String uuid = getColumn(m_id.toString(),LINKUUID);
+		NodeID id = getTipIDFromUUID(uuid);
+		return new CassNode(this,id);
+	}
+	
+	public void setNode(NodeID m_id,NodeID _link)
+	{
+		setColumn(m_id.toString(),LINKUUID,_link.getUUID());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/CassDecNodeID.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,61 @@
+package treecms.proto.cassandra.v1;
+
+import java.util.UUID;
+import treecms.proto.api.NodeID;
+import treecms.proto.id.DecrementalNodeID;
+
+public class CassDecNodeID extends DecrementalNodeID
+{
+	private String m_uuid;
+	private long m_version;
+	
+	private CassBrowser m_cassandra;
+	
+	public CassDecNodeID(CassBrowser _browser)
+	{
+		m_uuid = UUID.randomUUID().toString();
+		m_version = START_VALUE;
+		m_cassandra = _browser;
+	}
+	
+	public CassDecNodeID(CassBrowser _browser,String _uuid,long _version)
+	{
+		m_cassandra = _browser;
+		m_uuid = _uuid;
+		m_version = _version;
+	}
+
+	@Override
+	public NodeID create()
+	{
+		return new CassDecNodeID(m_cassandra);
+	}
+
+	@Override
+	public NodeID getTip()
+	{
+		NodeID tip = m_cassandra.getTipIDFromUUID(m_uuid);
+		if(tip == null){
+			return this;
+		}
+		return tip;
+	}
+
+	@Override
+	public String getUUID()
+	{
+		return m_uuid;
+	}
+
+	@Override
+	public String getVersion()
+	{
+		return Long.toString(m_version);
+	}
+
+	@Override
+	public NodeID update()
+	{
+		return new CassDecNodeID(m_cassandra,m_uuid,m_version - 1);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/CassEditor.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,170 @@
+package treecms.proto.cassandra.v1;
+
+import treecms.proto.api.Editor;
+import java.util.List;
+
+import java.util.LinkedList;
+
+import treecms.proto.api.Browser;
+import treecms.proto.api.Node;
+import treecms.proto.api.NodeID;
+import treecms.proto.marge.Marger;
+import treecms.proto.marge.ReplaceMarger;
+
+public class CassEditor implements Editor
+{
+	private Node m_local;
+	private Node m_remote;
+	
+	private Browser m_browser;
+	
+	public CassEditor(Browser _browser)
+	{
+		m_browser = _browser;
+		update();
+	}
+	
+	public void copyNode(Node _from,Node _to)
+	{
+		_to.setClassName(_from.getClassName());
+		_to.setTitle(_from.getTitle());
+		
+		for(String _key : _from.getAttributeKeys()){
+			_to.setAttribute(_key,_from.getAttribute(_key));
+		}
+		
+		_to.addChildren(_from.getChildren());
+	}
+	
+	@Override
+	public boolean check()
+	{
+		NodeID remoteID = m_remote.getID();
+		if(remoteID.equals(remoteID.getTip())){
+			return false;
+		}
+		return true;
+	}
+	
+	public boolean commit(boolean _force)
+	{
+		if(_force || !check()){
+			Node target = m_remote.cloneNode();
+			target.clearChildren();
+			copyNode(m_local,target);
+			return true;
+		}
+		
+		return false;
+	}
+	
+	public void merge()
+	{
+		Marger marger = new ReplaceMarger();
+		m_local = marger.merge(m_remote,m_local);
+	}
+	
+	public void discard()
+	{
+		copyNode(m_remote,m_local);
+	}
+
+	@Override
+	public Node useContents()
+	{
+		return m_local;
+	}
+
+	@Override
+	public void login(String user, String pass)
+	{
+	}
+
+	@Override
+	public void logout()
+	{
+	}
+
+	@Override
+	public Node edit(Node _target)
+	{
+		LinkedList<Node> path = findPath(m_local,_target);
+		if(path.isEmpty()){
+			return null;
+		}
+		
+		LinkedList<Node> change = new LinkedList<Node>();
+		Node root = path.poll().cloneNode();
+		change.add(root);
+		cloneTree(path,root,change);
+		
+		m_local = root;
+		
+		Node clone = change.peekLast();
+		return clone;
+	}
+	
+	private void cloneTree(LinkedList<Node> _path,Node _parent,LinkedList<Node> _change)
+	{
+		List<Node> children = _parent.getChildren();
+		Node target = _path.poll();
+		if(target == null){
+			return;
+		}
+		for(int i = 0;i < children.size();i ++){
+			Node _child = children.get(i);
+			if(_child.getID().isFamily(target.getID())){
+				//clone node
+				Node clone = _child.cloneNode();
+				_change.add(clone);
+				
+				//remove old node from clonedTree
+				_parent.replace(_child,clone);
+				
+				cloneTree(_path,clone,_change);
+				break;
+			}
+		}
+	}
+	
+	private LinkedList<Node> findPath(Node _root,Node _child)
+	{
+		LinkedList<Node> list = new LinkedList<Node>();
+		if(findPath(_root,_child,list)){
+			list.addFirst(_root);
+		}
+		return list;
+	}
+	
+	private boolean findPath(Node _root,Node _child,LinkedList<Node> _list)
+	{
+		if(_root.getID().isFamily(_child.getID())){
+			return true;
+		}
+		
+		for(Node child : _root.getChildren()){
+			if(findPath(child,_child,_list)){
+				_list.addFirst(child);
+				return true;
+			}
+		}
+		return false;
+	}
+
+	@Override
+	public Node getUncommited()
+	{
+		return m_local;
+	}
+
+	@Override
+	public boolean update()
+	{
+		m_remote = m_browser.useContents();
+		m_local = m_remote.createNode();
+		
+		copyNode(m_remote,m_local);
+		return true;
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/CassLink.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,161 @@
+package treecms.proto.cassandra.v1;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import treecms.proto.api.Link;
+import treecms.proto.api.Node;
+import treecms.proto.api.NodeID;
+
+public class CassLink implements Link
+{
+	private NodeID m_id;
+	
+	private CassBrowser m_browser;
+	
+	public CassLink(NodeID _id,CassBrowser _browser)
+	{
+		m_id = _id;
+		
+		m_browser = _browser;
+	}
+	
+	@Override
+	public Node getNode()
+	{
+		return m_browser.getNode(m_id);
+	}
+
+	@Override
+	public void setNode(Node _link)
+	{
+		m_browser.setNode(m_id,_link.getID());
+	}
+
+	@Override
+	public Node addChild(Node _child)
+	{
+		return getNode().addChild(_child);
+	}
+
+	@Override
+	public void addChildren(List<Node> _children)
+	{
+		getNode().addChildren(_children);
+	}
+
+	@Override
+	public void clearChildren()
+	{
+		getNode().clearChildren();
+	}
+
+	@Override
+	public Node cloneNode()
+	{
+		return getNode().cloneNode();
+	}
+
+	@Override
+	public Link createLink()
+	{
+		return getNode().createLink();
+	}
+
+	@Override
+	public Node createNode()
+	{
+		return m_browser.createNode();
+	}
+
+	@Override
+	public void down(Node _child)
+	{
+		getNode().down(_child);
+	}
+
+	@Override
+	public String getAttribute(String _attr)
+	{
+		return getNode().getAttribute(_attr);
+	}
+
+	@Override
+	public Set<String> getAttributeKeys()
+	{
+		return getNode().getAttributeKeys();
+	}
+
+	@Override
+	public List<Node> getChildren()
+	{
+		return getNode().getChildren();
+	}
+
+	@Override
+	public String getClassName()
+	{
+		return getNode().getClassName();
+	}
+
+	@Override
+	public NodeID getID()
+	{
+		return m_id;
+	}
+
+	@Override
+	public String getTitle()
+	{
+		return getNode().getTitle();
+	}
+
+	@Override
+	public boolean isChild(Node _child)
+	{
+		return getNode().isChild(_child);
+	}
+
+	@Override
+	public Iterator<Node> iterator()
+	{
+		return getNode().iterator();
+	}
+
+	@Override
+	public boolean removeChild(Node _child)
+	{
+		return getNode().removeChild(_child);
+	}
+
+	@Override
+	public void replace(Node _target,Node _newChild)
+	{
+		getNode().replace(_target,_newChild);
+	}
+
+	@Override
+	public void setAttribute(String _attr,String _value)
+	{
+		getNode().setAttribute(_attr,_value);
+	}
+
+	@Override
+	public void setClassName(String _className)
+	{
+		getNode().setClassName(_className);
+	}
+
+	@Override
+	public void setTitle(String _title)
+	{
+		getNode().setTitle(_title);
+	}
+
+	@Override
+	public void up(Node _child)
+	{
+		getNode().up(_child);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/CassNode.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,161 @@
+package treecms.proto.cassandra.v1;
+
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import treecms.proto.api.Link;
+import treecms.proto.api.Node;
+import treecms.proto.api.NodeID;
+
+public class CassNode implements Node
+{
+	private CassBrowser m_browser;
+	private NodeID m_id;
+	
+	public CassNode(CassBrowser _browser,NodeID _id)
+	{
+		m_browser = _browser;
+		m_id = _id;
+	}
+	
+	/*
+	 * for implement connection pool
+	 */
+	private CassBrowser getBrowser()
+	{
+		return m_browser;
+	}
+
+	@Override
+	public Node addChild(Node _child)
+	{
+		return getBrowser().addChild(m_id,_child);
+	}
+
+	@Override
+	public void addChildren(List<Node> _children)
+	{
+		getBrowser().addChildren(m_id,_children);
+	}
+	
+	public String toString()
+	{
+		return getTitle()+"["+getID().toString()+"]";
+	}
+	
+	@Override
+	public void clearChildren()
+	{
+		getBrowser().clearChildren(m_id);
+	}
+
+	@Override
+	public Node cloneNode()
+	{
+		return getBrowser().cloneNode(m_id);
+	}
+
+	@Override
+	public Link createLink()
+	{
+		return getBrowser().createLink(m_id);
+	}
+
+	@Override
+	public Node createNode()
+	{
+		return getBrowser().createNode();
+	}
+
+	@Override
+	public void down(Node _child)
+	{
+		getBrowser().down(m_id,_child);
+	}
+
+	@Override
+	public String getAttribute(String _attr)
+	{
+		return getBrowser().getAttribute(m_id,_attr);
+	}
+
+	@Override
+	public Set<String> getAttributeKeys()
+	{
+		return getBrowser().getAttributeKeys(m_id);
+	}
+
+	@Override
+	public List<Node> getChildren()
+	{
+		return getBrowser().getChildren(m_id);
+	}
+
+	@Override
+	public String getClassName()
+	{
+		return getBrowser().getClassName(m_id);
+	}
+
+	@Override
+	public NodeID getID()
+	{
+		return m_id;
+	}
+
+	@Override
+	public String getTitle()
+	{
+		return getBrowser().getTitle(m_id);
+	}
+
+	@Override
+	public boolean isChild(Node _child)
+	{
+		return getBrowser().isChild(m_id,_child);
+	}
+
+	@Override
+	public Iterator<Node> iterator()
+	{
+		return getChildren().iterator();
+	}
+
+	@Override
+	public boolean removeChild(Node _child)
+	{
+		return getBrowser().removeChild(m_id,_child);
+	}
+
+	@Override
+	public void replace(Node _target, Node _newChild)
+	{
+		getBrowser().replace(m_id,_target,_newChild);
+	}
+
+	@Override
+	public void setAttribute(String _attr, String _value)
+	{
+		getBrowser().setAttribute(m_id,_attr,_value);
+	}
+
+	@Override
+	public void setClassName(String _className)
+	{
+		getBrowser().setClassName(m_id,_className);
+	}
+
+	@Override
+	public void setTitle(String _title)
+	{
+		getBrowser().setTitle(m_id,_title);
+	}
+
+	@Override
+	public void up(Node _child)
+	{
+		getBrowser().up(m_id,_child);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/CassTreeImporter.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,86 @@
+package treecms.proto.cassandra.v1;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cassandra.thrift.Cassandra;
+import org.apache.cassandra.thrift.Column;
+import org.apache.cassandra.thrift.ColumnOrSuperColumn;
+import org.apache.cassandra.thrift.ConsistencyLevel;
+import org.apache.cassandra.thrift.Mutation;
+
+import treecms.proto.api.Node;
+
+public class CassTreeImporter
+{
+	public CassBrowser m_browser;
+	
+	public CassTreeImporter(CassBrowser _browser)
+	{
+		m_browser = _browser;
+	}
+	
+	public void importTree(Node _root)
+	{
+		List<Node> list = listNode(_root);
+		
+		Cassandra.Client client = m_browser.getClient();
+		
+		Map<String,Map<String,List<Mutation>>> mutation = new HashMap<String,Map<String,List<Mutation>>>();
+		Map<String,List<Mutation>> map = new HashMap<String,List<Mutation>>();
+		for(Node node : list){
+			LinkedList<Mutation> columns = new LinkedList<Mutation>();
+			
+			Column className = new Column();
+			className.name = CassBrowser.CLASSNAME.getBytes();
+			className.value = node.getClassName().getBytes();
+			columns.add(packColumn(className));
+			
+			Column title = new Column();
+			title.name = CassBrowser.TITLE.getBytes();
+			title.value = node.getTitle().getBytes();
+			columns.add(packColumn(title));
+			
+			for(String key : node.getAttributeKeys()){
+				Column attr = new Column();
+				attr.name = key.getBytes();
+				attr.value = node.getAttribute(key).getBytes();
+				columns.add(packColumn(attr));
+			}
+			
+			map.put(node.getID().toString(),columns);
+		}
+		
+		mutation.put(m_browser.getColumnFamily(),map);
+		
+		try{
+			client.batch_mutate(m_browser.getKeySpace(),mutation,ConsistencyLevel.ONE);
+		}catch(Exception _e){
+			_e.printStackTrace();
+		}
+	}
+	
+	public Mutation packColumn(Column _col)
+	{
+		ColumnOrSuperColumn cors = new ColumnOrSuperColumn();
+		
+		cors.column = _col;
+
+		Mutation mut = new Mutation();
+		mut.column_or_supercolumn = cors;
+		
+		return mut;
+	}
+	
+	private List<Node> listNode(Node _root)
+	{
+		LinkedList<Node> list = new LinkedList<Node>();
+		list.addAll(_root.getChildren());
+		for(Node child : list){
+			list.addAll(listNode(child));
+		}
+		return list;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/test/CassGetSliceTest.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,146 @@
+package treecms.proto.cassandra.v1.test;
+
+/*
+ * Cassandra get_slice , get_range_slice test
+ * 
+ * 2011/01/19 Shoshi TAMAKI
+ */
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cassandra.thrift.Cassandra;
+import org.apache.cassandra.thrift.Column;
+import org.apache.cassandra.thrift.ColumnOrSuperColumn;
+import org.apache.cassandra.thrift.ColumnParent;
+import org.apache.cassandra.thrift.ColumnPath;
+import org.apache.cassandra.thrift.ConsistencyLevel;
+import org.apache.cassandra.thrift.InvalidRequestException;
+import org.apache.cassandra.thrift.KeySlice;
+import org.apache.cassandra.thrift.NotFoundException;
+import org.apache.cassandra.thrift.SlicePredicate;
+import org.apache.cassandra.thrift.SliceRange;
+import org.apache.cassandra.thrift.TimedOutException;
+import org.apache.cassandra.thrift.UnavailableException;
+import org.apache.thrift.TException;
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TProtocol;
+import org.apache.thrift.transport.TSocket;
+import org.apache.thrift.transport.TTransport;
+
+public class CassGetSliceTest
+{
+	public static void main(String _args[])throws Exception
+	{
+		Cassandra.Client client;
+		
+		String host = "localhost";
+		int port = 9160;
+		
+		TTransport tr = new TSocket(host,port);
+		TProtocol proto = new TBinaryProtocol(tr);
+		client = new Cassandra.Client(proto);
+		
+		tr.open();
+		
+		System.out.println("ClusterName = "+client.describe_cluster_name());
+		testGetRangeSlice(client);
+		//testBatchInsert(client);
+		
+		tr.close();
+	}
+	
+	public static void testBatchInsert(Cassandra.Client _client) throws InvalidRequestException, UnavailableException, TimedOutException, TException
+	{
+		List<ColumnOrSuperColumn> list = new LinkedList<ColumnOrSuperColumn>();
+		
+		ColumnOrSuperColumn c1 = new ColumnOrSuperColumn();
+		c1.column = new Column();
+		c1.column.name = "hogehoge".getBytes();
+		c1.column.value = "fugafuga".getBytes();
+		c1.column.timestamp = System.currentTimeMillis()/1000;
+		
+		ColumnOrSuperColumn c2 = new ColumnOrSuperColumn();
+		c2.column = new Column();
+		c2.column.name = "abc".getBytes();
+		c2.column.value = "abcabc".getBytes();
+		c2.column.timestamp = System.currentTimeMillis()/1000;
+		
+		ColumnOrSuperColumn c3 = new ColumnOrSuperColumn();
+		c3.column = new Column();
+		c3.column.name = "def".getBytes();
+		c3.column.value = "defdef".getBytes();
+		c3.column.timestamp = System.currentTimeMillis()/1000;
+		
+		list.add(c1);
+		list.add(c2);
+		list.add(c3);
+		
+		Map<String,List<ColumnOrSuperColumn>> map = new HashMap<String,List<ColumnOrSuperColumn>>();
+		map.put("TreeCMSCF01",list);
+		
+		_client.batch_insert("TreeCMSKS","hoge",map,ConsistencyLevel.ONE);
+		
+		SliceRange sr = new SliceRange();
+		sr.setStart(new byte[0]);
+		sr.setFinish(new byte[0]);
+		
+		SlicePredicate sp = new SlicePredicate();
+		sp.setSlice_range(sr);
+		
+		List<ColumnOrSuperColumn> result = _client.get_slice("TreeCMSKS","hoge",new ColumnParent("TreeCMSCF01"),sp,ConsistencyLevel.ONE);
+		
+		for(ColumnOrSuperColumn val : result){
+			System.out.print("name:"+new String(val.column.name));
+			System.out.println("\tvalue:"+new String(val.column.value));
+		}
+	}
+	
+	public static void testGet(Cassandra.Client _client) throws InvalidRequestException, NotFoundException, UnavailableException, TimedOutException, TException
+	{
+		ColumnPath path = new ColumnPath();
+		path.column_family = "TreeCMSCF01";
+		path.column = "value".getBytes();
+		
+		ColumnOrSuperColumn value = _client.get("TreeCMSKS","uuid@01",path,ConsistencyLevel.ONE);
+		
+		System.out.println(new String(value.column.getValue()));
+	}
+	
+	public static void testGetSlice(Cassandra.Client _client) throws InvalidRequestException, NotFoundException, UnavailableException, TimedOutException, TException
+	{
+		SliceRange sliceRange = new SliceRange();
+		sliceRange.setStart(new byte[0]);
+		sliceRange.setFinish(new byte[0]);
+		
+		SlicePredicate slicePredicate = new SlicePredicate();
+		slicePredicate.setSlice_range(sliceRange);
+		
+		List<ColumnOrSuperColumn> values = _client.get_slice("TreeCMSKS","",new ColumnParent("TreeCMSCF03"),slicePredicate,ConsistencyLevel.ONE);
+		
+		for(ColumnOrSuperColumn value : values){
+			System.out.println(new String(value.column.getName())+":"+new String(value.column.getValue()));
+		}
+	}
+	
+	public static void testGetRangeSlice(Cassandra.Client _client) throws InvalidRequestException, NotFoundException, UnavailableException, TimedOutException, TException
+	{
+		SliceRange sliceRange = new SliceRange();
+		sliceRange.setStart(new byte[0]);
+		sliceRange.setFinish(new byte[0]);
+		
+		SlicePredicate slicePredicate = new SlicePredicate();
+		slicePredicate.setSlice_range(sliceRange);
+		
+		List<KeySlice> values = _client.get_range_slice("TreeCMSKS",new ColumnParent("TreeCMSCF03"),slicePredicate,"","",100,ConsistencyLevel.ONE);
+		
+		for(KeySlice key : values){
+			System.out.println(new String(key.getKey()));
+			for(ColumnOrSuperColumn column : key.getColumns()){
+				System.out.println("\t"+new String(column.column.getName())+":"+new String(column.column.getValue()));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/test/CassLinkTest.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,19 @@
+package treecms.proto.cassandra.v1.test;
+
+import org.junit.runner.JUnitCore;
+
+import treecms.proto.cassandra.v1.CassBrowser;
+import treecms.proto.test.LinkTest;
+
+public class CassLinkTest extends LinkTest
+{
+	public static void main(String _arg[])
+	{
+		JUnitCore.main(CassLinkTest.class.getName());
+	}
+	
+	public CassLinkTest()
+	{
+		super(CassBrowser.createInstance("localhost","9160","TreeCMSKS","TreeCMSCF03").useContents());
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/test/CassNodeTest.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,20 @@
+package treecms.proto.cassandra.v1.test;
+
+
+import org.junit.runner.JUnitCore;
+
+import treecms.proto.cassandra.v1.CassBrowser;
+import treecms.proto.test.NodeTest;
+
+public class CassNodeTest extends NodeTest
+{
+	public static void main(String _args[])
+	{
+		JUnitCore.main(CassNodeTest.class.getName());
+	}
+	
+	public CassNodeTest()
+	{
+		super(CassBrowser.createInstance("localhost","9160","TreeCMSKS","TreeCMSCF03").useContents());
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/proto/cassandra/v1/test/CassStringTest.java	Fri Feb 11 15:07:57 2011 +0900
@@ -0,0 +1,13 @@
+package treecms.proto.cassandra.v1.test;
+
+public class CassStringTest
+{
+	public static void main(String _args[])
+	{
+		String key1 = "hogehoge";
+		String key2 = "fuga";
+		
+		System.out.println(key1.compareTo(key2));
+		System.out.println(key2.compareTo(key1));
+	}
+}
--- a/src/treecms/proto/gui/GraphicalMonotonicTreeEditor.java	Tue Feb 01 16:28:49 2011 +0900
+++ b/src/treecms/proto/gui/GraphicalMonotonicTreeEditor.java	Fri Feb 11 15:07:57 2011 +0900
@@ -23,8 +23,8 @@
 import javax.swing.tree.DefaultTreeModel;
 import treecms.proto.api.Editor;
 import treecms.proto.api.Node;
-import treecms.proto.cassandra.CassBrowser;
-import treecms.proto.cassandra.CassEditor;
+import treecms.proto.cassandra.v1.CassBrowser;
+import treecms.proto.cassandra.v1.CassEditor;
 
 public class GraphicalMonotonicTreeEditor extends JFrame
 {