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