annotate src/treecms/proto/simple/SimpleEditor.java @ 32:02ef906d0341

2010/11/18 added GUIEditor Monotonic-tree GUI editor. modified Editor API bug fix (not done yet , still buggy)
author shoshi
date Thu, 18 Nov 2010 19:05:23 +0900
parents 174bc0d21712
children c0a0fa870e6e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
1 package treecms.proto.simple;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
2
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
3 import java.util.List;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
4 import java.util.concurrent.atomic.AtomicReference;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
5 import java.util.LinkedList;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
6 import treecms.proto.api.Editor;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
7 import treecms.proto.api.Node;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
8
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
9 public class SimpleEditor implements Editor
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
10 {
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
11 private AtomicReference<Node> m_repository;
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
12 private Node m_tip,m_latest;
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
13
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
14 private LinkedList<Node> m_log;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
15
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
16 public SimpleEditor(AtomicReference<Node> _contents)
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
17 {
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
18 m_repository = _contents;
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
19 m_tip = m_repository.get();
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
20 m_latest = m_tip;
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
21 m_log = new LinkedList<Node>();
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
22 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
23
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
24 public boolean checkUpdate()
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
25 {
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
26 return !m_repository.compareAndSet(m_latest,m_latest);
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
27 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
29 public boolean commit(boolean _force)
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
30 {
29
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
31 if(_force){
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
32 m_repository.set(m_tip);
29
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
33 update();
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
34 return true;
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
35 }
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
36 return m_repository.compareAndSet(m_latest,m_tip);
29
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
37 }
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
38
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
39 public void merge()
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
40 {
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
41 LinkedList<Node> log = new LinkedList<Node>(m_log);
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
42
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
43 update(); //update first.
29
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
44 for(Node node : log){
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
45 edit(node); //edit again;
29
174bc0d21712 modified SimpleEditor.merge .commit
ShoshiTAMAKI
parents: 28
diff changeset
46 }
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
47 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
48
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
49 public void discard()
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
50 {
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
51 m_tip = m_latest;
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
52 m_log.clear();
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
53 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
54
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
55 @Override
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
56 public Node useContents()
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
57 {
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
58 return m_latest;
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
59 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
60
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
61 @Override
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
62 public void login(String user, String pass)
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
63 {
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
64 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
65
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
66 @Override
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
67 public void logout()
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
68 {
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
69 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
70
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
71 @Override
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
72 public Node edit(Node _target)
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
73 {
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
74 LinkedList<Node> path = findPath(m_tip,_target);
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
75 if(path.isEmpty()){
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
76 return null;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
77 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
78
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
79 LinkedList<Node> change = new LinkedList<Node>();
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
80 Node root = path.poll().cloneNode();
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
81 change.add(root);
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
82 cloneTree(path,root,change);
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
83
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
84 m_tip = root;
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
85 m_log.add(change.peekLast()); //add to change log.
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
86
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
87 return change.peekLast();
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
88 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
89
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
90 private void cloneTree(LinkedList<Node> _path,Node _parent,LinkedList<Node> _change)
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
91 {
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
92 List<Node> children = _parent.getChildren();
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
93 Node target = _path.poll();
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
94 if(target == null){
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
95 return;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
96 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
97 for(int i = 0;i < children.size();i ++){
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
98 Node _child = children.get(i);
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
99 if(_child.getID().compare(target.getID()) != -2){
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
100 //clone node
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
101 Node clone = _child.cloneNode();
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
102 _change.add(clone);
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
103
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
104 //remove old node from clonedTree
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
105 _parent.replace(_child,clone);
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
106
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
107 cloneTree(_path,clone,_change);
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
108 break;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
109 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
110 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
111 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
112
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
113 private LinkedList<Node> findPath(Node _root,Node _child)
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
114 {
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
115 LinkedList<Node> list = new LinkedList<Node>();
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
116 findPath(_root,_child,list);
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
117 list.addFirst(_root);
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
118 return list;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
119 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
120
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
121 private boolean findPath(Node _root,Node _child,LinkedList<Node> _list)
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
122 {
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
123 if(_root == _child){
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
124 return true;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
125 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
126
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
127 for(Node child : _root.getChildren()){
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
128 if(findPath(child,_child,_list)){
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
129 _list.addFirst(child);
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
130 return true;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
131 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
132 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
133 return false;
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
134 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
135
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
136 @Override
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
137 public Node getUncommited()
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
138 {
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
139 return m_tip;
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
140 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
141
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
142 @Override
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
143 public boolean update()
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
144 {
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
145 discard();
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
146 m_latest = m_repository.get();
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
147 m_tip = m_latest;
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
148 return true;
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
149 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
150
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
151 @Override
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
152 public boolean check()
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
153 {
32
02ef906d0341 2010/11/18
shoshi
parents: 29
diff changeset
154 return checkUpdate();
28
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
155 }
64359341c04a merge added
ShoshiTAMAKI
parents:
diff changeset
156 }