annotate src/treecms/memory/OnMemoryTreeEditor.java @ 7:fc19e38b669b

added concurrent access client for cassandr
author shoshi
date Thu, 17 Mar 2011 23:24:08 +0900
parents 12604eb6b615
children f96193babac0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
1 package treecms.memory;
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
2
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
3 import java.util.LinkedList;
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
4
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
5 import treecms.api.Node;
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
6 import treecms.api.NodeData;
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
7 import treecms.api.NodeID;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
8 import treecms.api.TreeEditor;
3
5fa718b63cd5 finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents: 2
diff changeset
9 import treecms.merger.Merger;
5fa718b63cd5 finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents: 2
diff changeset
10 import treecms.merger.ReplaceMerger;
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
11 import treecms.tree.util.NodePathFinder;
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
12 import treecms.tree.util.PathNotFoundException;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
13
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
14 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
15 * 木構造を非破壊的に編集するオンメモリの実装です。
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
16 * @author shoshi
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
17 */
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
18 final class OnMemoryTreeEditor implements TreeEditor
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
19 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
20 private OnMemoryTree m_tree;
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
21 private OnMemoryNode m_backup;
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
22 private OnMemoryNode m_root;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
23
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
24 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
25 * コンストラクタです。
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
26 * @param _tree 監視の対象とするOnMemoryTree
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
27 */
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
28 public OnMemoryTreeEditor(OnMemoryTree _tree)
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
29 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
30 m_root = (OnMemoryNode)_tree.getRoot();
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
31 m_backup = m_root;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
32 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
33
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
34 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
35 * 変更を元の木構造にコミットします。この操作はコミット先が先にアップデートされていた場合は失敗します
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
36 * @param _force trueの場合は強制的に置き換えます。
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
37 * @return コミットが成功した場合true
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
38 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
39 @Override
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
40 public boolean commit(boolean _force)
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
41 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
42 return m_tree.compareAndSwapRootNode(m_backup,m_root,_force);
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
43 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
44
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
45 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
46 * 監視している木構造のルートと自身のルートに上書きします。
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
47 * @return true
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
48 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
49 @Override
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
50 public boolean pull()
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
51 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
52 m_root = (OnMemoryNode)m_tree.getRoot();
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
53 m_backup = m_root;
3
5fa718b63cd5 finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents: 2
diff changeset
54 return true;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
55 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
56
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
57 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
58 * 監視している木構造が更新されていないか確認します。
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
59 * @return 更新されている場合true、されていない場合はfalse
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
60 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
61 @Override
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
62 public boolean check()
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
63 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
64 if(m_tree.getRoot().getID().equals(m_root.getID())){
3
5fa718b63cd5 finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents: 2
diff changeset
65 return false;
5fa718b63cd5 finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents: 2
diff changeset
66 }
5fa718b63cd5 finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents: 2
diff changeset
67 return true;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
68 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
69
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
70 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
71 * 監視している木構造の内容を自分の木構造にマージします
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
72 * 最新版の木構造とマージする場合は、先にpull()を実行してください。
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
73 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
74 @Override
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
75 public void merge()
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
76 {
3
5fa718b63cd5 finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents: 2
diff changeset
77 Merger merger = new ReplaceMerger();
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
78 m_root = (OnMemoryNode)merger.merge(m_backup,m_root);
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
79 }
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
80
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
81 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
82 * 木構造を非破壊的に更新します.
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
83 * @param _target 更新する対象
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
84 * @param _newData 更新に適用されるNodeData
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
85 * @return 更新されたNode
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
86 * @throws ルートNodeから_targetまでのパスが見つからない場合、PathNotFoundException
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
87 */
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
88 @Override
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
89 public synchronized Node updateTree(Node _target,NodeData _newData) throws PathNotFoundException
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
90 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
91 NodePathFinder finder = new NodePathFinder(m_root,_target);
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
92 OnMemoryForest forest = (OnMemoryForest)m_tree.getForest();
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
93
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
94 for(Node path : finder){
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
95 NodeData data = path.getData();
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
96 NodeID newID = path.getID().update();
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
97 Node clone = forest.createNode(newID,data);
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
98 }
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
99
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
100 return null;
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
101 }
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
102
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
103 private LinkedList<OnMemoryNode> findAndClone(OnMemoryNode _parent,OnMemoryNode _target,NodeData _newData)
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
104 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
105 OnMemoryForest forest = (OnMemoryForest)_target.getForest();
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
106 if(_parent.getID().equals(_target.getID())){
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
107 LinkedList<OnMemoryNode> path = new LinkedList<OnMemoryNode>();
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
108 OnMemoryNode clone = forest.createNode(_target.getID().update(),_newData);
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
109 path.addFirst(clone);
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
110 return path;
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
111 }
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
112
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
113 for(Node child : _parent.children()){
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
114 LinkedList<OnMemoryNode> path = findAndClone((OnMemoryNode)child,_target,_newData);
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
115 if(path != null){
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
116 path.addFirst(_parent);
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
117 return path;
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
118 }
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
119 }
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
120
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
121 return null;
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
122 }
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
123
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
124 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
125 * ルートNodeを取得します。
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
126 * @return この木構造のルートNode
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
127 * */
6
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
128 @Override
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
129 public Node getRoot()
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
130 {
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
131 return m_root;
12604eb6b615 added javadoc
shoshi
parents: 3
diff changeset
132 }
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
133 }