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