# HG changeset patch # User shoshi # Date 1297404477 -32400 # Node ID d4709911e0ede3889099a1360fa2c630430dbe26 # Parent a72718a0bccf6888e1df6c7ae95eec1d4fdd7f48 moved old Cassandra Monotonic-Tree implementation from "cassandra" to "cassandra.v1" diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/CassBrowser.java --- 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 children = new LinkedList(); - 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 tmp = new LinkedList(); - tmp.add(_child); - addChildren(_id,tmp); - return _child; - } - - public void addChildren(NodeID _id,List _children) - { - String children = getChildrenRaw(_id); - Map set = new HashMap(); - 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 getChildren(NodeID _id) - { - LinkedList children = new LinkedList(); - - 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 columns = m_cassandra.get_slice(m_keySpace,_id.toString(),new ColumnParent(m_colFamily),sp,ConsistencyLevel.ALL); - Map> cfmap = new HashMap>(); - 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 getAttributeKeys(NodeID _id) - { - Set attrs = new HashSet(); - - SliceRange sr = new SliceRange(); - sr.setStart(new byte[0]); - sr.setFinish(new byte[0]); - - SlicePredicate sp = new SlicePredicate(); - sp.setSlice_range(sr); - - try{ - List 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 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()); - } -} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/CassDecNodeID.java --- 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); - } -} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/CassEditor.java --- 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 path = findPath(m_local,_target); - if(path.isEmpty()){ - return null; - } - - LinkedList change = new LinkedList(); - 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 _path,Node _parent,LinkedList _change) - { - List 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 findPath(Node _root,Node _child) - { - LinkedList list = new LinkedList(); - if(findPath(_root,_child,list)){ - list.addFirst(_root); - } - return list; - } - - private boolean findPath(Node _root,Node _child,LinkedList _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; - } -} - diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/CassLink.java --- 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 _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 getAttributeKeys() - { - return getNode().getAttributeKeys(); - } - - @Override - public List 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 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); - } -} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/CassNode.java --- 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 _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 getAttributeKeys() - { - return getBrowser().getAttributeKeys(m_id); - } - - @Override - public List 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 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); - } -} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/CassTreeImporter.java --- 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 list = listNode(_root); - - Cassandra.Client client = m_browser.getClient(); - - Map>> mutation = new HashMap>>(); - Map> map = new HashMap>(); - for(Node node : list){ - LinkedList columns = new LinkedList(); - - 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 listNode(Node _root) - { - LinkedList list = new LinkedList(); - list.addAll(_root.getChildren()); - for(Node child : list){ - list.addAll(listNode(child)); - } - return list; - } -} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/test/CassGetSliceTest.java --- 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 list = new LinkedList(); - - 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> map = new HashMap>(); - 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 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 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 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())); - } - } - } -} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/test/CassLinkTest.java --- 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()); - } -} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/test/CassNodeTest.java --- 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 diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/test/CassStringTest.java --- 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)); - } -} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/CassBrowser.java --- /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 children = new LinkedList(); + 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 tmp = new LinkedList(); + tmp.add(_child); + addChildren(_id,tmp); + return _child; + } + + public void addChildren(NodeID _id,List _children) + { + String children = getChildrenRaw(_id); + Map set = new HashMap(); + 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 getChildren(NodeID _id) + { + LinkedList children = new LinkedList(); + + 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 columns = m_cassandra.get_slice(m_keySpace,_id.toString(),new ColumnParent(m_colFamily),sp,ConsistencyLevel.ALL); + Map> cfmap = new HashMap>(); + 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 getAttributeKeys(NodeID _id) + { + Set attrs = new HashSet(); + + SliceRange sr = new SliceRange(); + sr.setStart(new byte[0]); + sr.setFinish(new byte[0]); + + SlicePredicate sp = new SlicePredicate(); + sp.setSlice_range(sr); + + try{ + List 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 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()); + } +} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/CassDecNodeID.java --- /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); + } +} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/CassEditor.java --- /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 path = findPath(m_local,_target); + if(path.isEmpty()){ + return null; + } + + LinkedList change = new LinkedList(); + 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 _path,Node _parent,LinkedList _change) + { + List 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 findPath(Node _root,Node _child) + { + LinkedList list = new LinkedList(); + if(findPath(_root,_child,list)){ + list.addFirst(_root); + } + return list; + } + + private boolean findPath(Node _root,Node _child,LinkedList _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; + } +} + diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/CassLink.java --- /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 _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 getAttributeKeys() + { + return getNode().getAttributeKeys(); + } + + @Override + public List 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 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); + } +} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/CassNode.java --- /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 _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 getAttributeKeys() + { + return getBrowser().getAttributeKeys(m_id); + } + + @Override + public List 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 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); + } +} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/CassTreeImporter.java --- /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 list = listNode(_root); + + Cassandra.Client client = m_browser.getClient(); + + Map>> mutation = new HashMap>>(); + Map> map = new HashMap>(); + for(Node node : list){ + LinkedList columns = new LinkedList(); + + 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 listNode(Node _root) + { + LinkedList list = new LinkedList(); + list.addAll(_root.getChildren()); + for(Node child : list){ + list.addAll(listNode(child)); + } + return list; + } +} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/test/CassGetSliceTest.java --- /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 list = new LinkedList(); + + 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> map = new HashMap>(); + 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 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 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 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())); + } + } + } +} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/test/CassLinkTest.java --- /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()); + } +} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/test/CassNodeTest.java --- /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 diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/cassandra/v1/test/CassStringTest.java --- /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)); + } +} diff -r a72718a0bccf -r d4709911e0ed src/treecms/proto/gui/GraphicalMonotonicTreeEditor.java --- 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 {