annotate src/treecms/proto/cassandra/v1/CassEditor.java @ 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 src/treecms/proto/cassandra/CassEditor.java@a72718a0bccf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
51
d4709911e0ed moved old Cassandra Monotonic-Tree implementation from "cassandra" to "cassandra.v1"
shoshi
parents: 50
diff changeset
1 package treecms.proto.cassandra.v1;
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
2
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
3 import treecms.proto.api.Editor;
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
4 import java.util.List;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
5
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
6 import java.util.LinkedList;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
7
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
8 import treecms.proto.api.Browser;
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
9 import treecms.proto.api.Node;
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
10 import treecms.proto.api.NodeID;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
11 import treecms.proto.marge.Marger;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
12 import treecms.proto.marge.ReplaceMarger;
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
13
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
14 public class CassEditor implements Editor
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
15 {
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
16 private Node m_local;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
17 private Node m_remote;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
18
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
19 private Browser m_browser;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
20
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
21 public CassEditor(Browser _browser)
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
22 {
50
a72718a0bccf added demo tree builder
shoshi
parents: 48
diff changeset
23 m_browser = _browser;
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
24 update();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
25 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
26
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
27 public void copyNode(Node _from,Node _to)
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
28 {
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
29 _to.setClassName(_from.getClassName());
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
30 _to.setTitle(_from.getTitle());
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
31
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
32 for(String _key : _from.getAttributeKeys()){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
33 _to.setAttribute(_key,_from.getAttribute(_key));
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
34 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
35
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
36 _to.addChildren(_from.getChildren());
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
37 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
38
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
39 @Override
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
40 public boolean check()
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
41 {
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
42 NodeID remoteID = m_remote.getID();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
43 if(remoteID.equals(remoteID.getTip())){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
44 return false;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
45 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
46 return true;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
47 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
49 public boolean commit(boolean _force)
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
50 {
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
51 if(_force || !check()){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
52 Node target = m_remote.cloneNode();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
53 target.clearChildren();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
54 copyNode(m_local,target);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
55 return true;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
56 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
57
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
58 return false;
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
59 }
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
60
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
61 public void merge()
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
62 {
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
63 Marger marger = new ReplaceMarger();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
64 m_local = marger.merge(m_remote,m_local);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
65 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
66
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
67 public void discard()
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
68 {
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
69 copyNode(m_remote,m_local);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
70 }
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
71
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
72 @Override
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
73 public Node useContents()
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
74 {
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
75 return m_local;
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
76 }
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
77
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
78 @Override
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
79 public void login(String user, String pass)
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
80 {
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
81 }
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
82
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
83 @Override
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
84 public void logout()
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
85 {
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
86 }
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
87
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
88 @Override
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
89 public Node edit(Node _target)
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
90 {
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
91 LinkedList<Node> path = findPath(m_local,_target);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
92 if(path.isEmpty()){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
93 return null;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
94 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
95
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
96 LinkedList<Node> change = new LinkedList<Node>();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
97 Node root = path.poll().cloneNode();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
98 change.add(root);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
99 cloneTree(path,root,change);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
100
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
101 m_local = root;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
102
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
103 Node clone = change.peekLast();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
104 return clone;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
105 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
106
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
107 private void cloneTree(LinkedList<Node> _path,Node _parent,LinkedList<Node> _change)
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
108 {
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
109 List<Node> children = _parent.getChildren();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
110 Node target = _path.poll();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
111 if(target == null){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
112 return;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
113 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
114 for(int i = 0;i < children.size();i ++){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
115 Node _child = children.get(i);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
116 if(_child.getID().isFamily(target.getID())){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
117 //clone node
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
118 Node clone = _child.cloneNode();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
119 _change.add(clone);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
120
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
121 //remove old node from clonedTree
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
122 _parent.replace(_child,clone);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
123
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
124 cloneTree(_path,clone,_change);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
125 break;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
126 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
127 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
128 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
129
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
130 private LinkedList<Node> findPath(Node _root,Node _child)
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
131 {
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
132 LinkedList<Node> list = new LinkedList<Node>();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
133 if(findPath(_root,_child,list)){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
134 list.addFirst(_root);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
135 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
136 return list;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
137 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
138
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
139 private boolean findPath(Node _root,Node _child,LinkedList<Node> _list)
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
140 {
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
141 if(_root.getID().isFamily(_child.getID())){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
142 return true;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
143 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
144
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
145 for(Node child : _root.getChildren()){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
146 if(findPath(child,_child,_list)){
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
147 _list.addFirst(child);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
148 return true;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
149 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
150 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
151 return false;
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
152 }
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
153
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
154 @Override
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
155 public Node getUncommited()
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
156 {
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
157 return m_local;
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
158 }
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
159
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
160 @Override
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
161 public boolean update()
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
162 {
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
163 m_remote = m_browser.useContents();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
164 m_local = m_remote.createNode();
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
165
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
166 copyNode(m_remote,m_local);
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
167 return true;
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
168 }
48
ecba122dd3de added CassEditor,CassLink,CassNode
shoshi
parents: 39
diff changeset
169 }
39
ea7f0a4eacaf added cassandra
suika6039
parents:
diff changeset
170