annotate chapter3.tex @ 8:b75c564064a8 default tip

fix undefined reference , multiply defined references
author Shoshi TAMAKI
date Thu, 21 Feb 2013 22:53:20 +0900
parents 44a95cddab8a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bf82975fa7f5 hg init and added files
Shoshi TAMAKI
parents:
diff changeset
1 \chapter{分散コンテンツマネージメントシステムの実装}
bf82975fa7f5 hg init and added files
Shoshi TAMAKI
parents:
diff changeset
2
4
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
3 本章では, 分散コンテンツマネージメントシステムのサーバーサイド部分の実装について述べる. 前章では, 我々のシステムのおおまかな設計について説明した.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
4 そこでは, サーバーサイドで木構造を管理するデータベースがあると述べた. ここでは, その木構造データベースについて詳細な設計について説明する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
5 最初に, 実装した木構造データベースの利用方法について述べ, 次に詳細な設計と実装について述べる.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
6
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
7 \section{木構造データベースJungle}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
8 木構造データベースJungleは, Javaで実装された分散コンテンツマネージメントシステムのための木構造データベースである.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
9 非破壊的木構造の方法に則ったAPIと, 木構造のトラバースするための方法を提供する. 分散コンテンツマネージメントシステムに組み込んで利用する予定で実装されているため, 他のシステムに組み込んで利用することも可能である.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
10
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
11 \subsubsection{木の作成}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
12 はじめに, データベースオブジェクトと木の作成方法について述べる.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
13 Jungleは複数の木を保持することが出来る. 木には名前がついており, 名前を利用して作成・編集・削除を行うことが出来る.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
14
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
15 \begin{lstlisting}[frame=lrbt,label=src:create_jungle,caption=データベースオブジェクトと木の作成,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
16 import jp.ac.u_ryukyu.cr.ie.shoshi.jungle.*;
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
17 import jp.ac.u_ryukyu.cr.ie.shoshi.jungle.traverser.*;
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
18 import jp.ac.u_ryukyu.cr.ie.shohsi.jungle.editor.*;
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
19
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
20 DefaultTraverser traverser = new DefaultTraverser();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
21 DefaultTreeEditor editor = new DefaultTreeEditor(traverser);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
22 DefaultJungle jungle = new DefaultJungle(null,"sample",editor);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
23
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
24 JungleTree tree = jungle.createTree("name of new tree here");
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
25 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
26
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
27 DeafultJungleが, 木構造データベースのオブジェクトとなる.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
28 jungle.createTreeメソッドを利用して木構造を作成する. もし, すでに木構造が存在している場合は, nullが返される.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
29
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
30 \subsubsection{木と木を構成するノード}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
31 データベースオブジェクトを作成し, 木構造とルートノードを取得するためには以下のように記述する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
32
8
b75c564064a8 fix undefined reference , multiply defined references
Shoshi TAMAKI
parents: 7
diff changeset
33 \begin{lstlisting}[frame=lrbt,label=src:get_jungle,caption=木とノードの取得,numbers=left]
4
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
34 /* データベースの取得まで省略 */
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
35 JungleTree tree = jungle.getTreeByName("your tree name here");
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
36
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
37 Node root = tree.getRootNode();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
38
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
39 Children<Node> children = root.getChildren(); // 子供ノードのリスト
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
40 Attributes attributes = root.getAttributes(); // ノードが保持する辞書
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
41
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
42 ByteBuffer value = attributes.get("key name");
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
43 Node child = children.at(2);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
44 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
45
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
46 jungle.getTreeByNameメソッドで名前を指定して木構造を取得し, tree.getRootNodeメソッドでルートノードを取得することが出来る.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
47 ノードは, 子供ノードのリストと辞書を保持しており, それぞれ, root.getChildren()とroot.getAttributes()で取得することが出来る.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
48
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
49 \subsubsection{木の編集}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
50 木の編集は, 通常Nodeを書き換えるためNodeのAPIとして提供されることが多いが, JungleではJungleTreeEditorを利用して行う.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
51 JungleTreeEditorには編集するためのいくつかのメソッドが用意されており, NodePathと呼ばれるルートノードからノードまでのパスを指定することでノードが編集される.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
52 NodePathは, ルートノードからスタートし, ノードの子供の場所を次々に指定していくことで編集対象のノードの場所を表す.(図\ref{fig:nodepath})
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
53
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
54 \begin{figure}[!htbp]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
55 \begin{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
56 \includegraphics[width=80mm]{./images/nodepath.pdf}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
57 \end{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
58 \caption{NodePath}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
59 \label{fig:nodepath}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
60 \end{figure}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
61
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
62 \begin{lstlisting}[frame=lrbt,label=src:treeeditor,caption=木の編集を行うTreeEditor,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
63 /* データベースの取得まで省略 */
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
64 JungleTree tree = jungle.getTreeByName("your tree name here");
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
65
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
66 JungleTreeEditor editor = tree.getEditor();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
67
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
68 //パスの生成
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
69 DefaultNodePath path = new DefaultNodePath();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
70 path = path.add(1).add(2).add(3);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
71
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
72 // トランザクションの始まり
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
73 Either<Error,JungleTreeEditor> e = editor.addNewChildAt(path,0);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
74 if(e.isA()){
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
75 // エラーが起きた場合のコード
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
76 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
77 editor = e.b();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
78 e = editor.putAttribute(path,"key",ByteBuffer.wrap("value".getBytes());
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
79 if(e.isA()){
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
80 // エラーが起きた場合のコード
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
81 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
82 editor = e.b();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
83 editor.success();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
84 // トランザクションの終わり
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
85 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
86
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
87 JungleTreeEditorはtree.getEditor()で取得することが出来る.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
88 JungleTreeEditorはJungleTreeを非破壊的に編集し, Either$<$Error,JungleTreeEditor$>$型を返す. これは, エラーの場合はErrorが格納されており, 正常に編集が成功した場合はJungleTreeEditorを保持する型である.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
89 木構造の編集により返されるJungleTreeEditorは, 編集された木構造を保持しており編集前の木構造を保持するJungleTreeEditorは別のオブジェクトである.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
90 非破壊的に編集を繰り返した後, editor.successにより今までの編集をコミットすることが出来る, このとき他のJungleTreeEditorなどでJungleTreeがすでに更新されていた場合はコミットは失敗する. そのため, 最初からやり直す必要がある.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
91
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
92 \subsubsection{木の編集にNodeEditorを利用する}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
93 木の編集にはNodeEditorを利用することも出来る, NodeEditorにはNodeの編集手順を記述しJungleTreeEditorに渡す. ソース\ref{src:treeeditor}と同等な処理を行うNodeEditorを以下に示す.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
94
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
95 \begin{lstlisting}[frame=lrbt,label=src:nodeeditor,caption=同等の処理を行うNodeEditor,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
96 /* データベースの取得まで省略 */
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
97 JungleTree tree = jungle.getTreeByName("your tree name here");
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
98
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
99 JungleTreeEditor treeEditor = tree.getEditor();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
100
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
101 NodeEditor nodeEditor = new NodeEditor(){
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
102 public <T extends EditableNode<T>> edit(T node){
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
103 Either<Error,T> e = node.addNewChildAt(0);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
104 if(e.isA()){
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
105 // エラーが起きた場合のコード
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
106 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
107 node = e.b();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
108 e = node.putAttribute("key",ByteBuffer.wrap("value".getBytes()));
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
109 if(e.isA()){
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
110 // エラーが起きた場合のコード
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
111 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
112 return e.b();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
113 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
114 };
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
115
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
116 DefaultNodePath path = new DefaultNodePath();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
117 path = path.add(1).add(2).add(3);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
118
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
119 // トランザクションの始まり
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
120 Either<Error,JungleTreeEditor> e = editor.edit(path,nodeEditor);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
121 if(e.isA()){
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
122 // エラーが起きた場合のコード
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
123 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
124 editor.success();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
125 // トランザクションの終わり
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
126 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
127
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
128 \subsubsection{木のトラバース}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
129 木をトラバースするためには, Traverserを利用する. Traverserは木を対象にせずNodeを対象に取るため, 木の任意の部分から走査を始めることが可能である.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
130 Traverserは目的のノードまでに通ったノードをすべて列挙するため, JungleTreeEditorはNodePathとTraverserを用いて編集対象のノードまでの全てのノードを取得している.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
131 以下のコードはNodePathを用いて目的のノードまでをトラバースするコードである.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
132
8
b75c564064a8 fix undefined reference , multiply defined references
Shoshi TAMAKI
parents: 7
diff changeset
133 \begin{lstlisting}[frame=lrbt,label=src:tree_traverse,caption=NodePathを用いた木のトラバース,numbers=left]
4
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
134 /* データベースの取得まで省略 */
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
135 JungleTree tree = jungle.getTreeByName("your tree name here");
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
136
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
137 DefaultNodePath path = new DefaultNodePath();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
138 path = path.add(1).add(2).add(3);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
139 DefaultEvaluator evaluator = new DefaultEvaluator(path);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
140
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
141 Node root = tree.getRootNode();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
142 TraversableNodeWrapper<Node> wrapper = new TraversableNodeWrapper<Node>(root);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
143
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
144 // Traverserの作成
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
145 DefaultTraverser traverser = new DefaultTraverser();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
146 Traversal result = traverser.traverse(wrapper,evaluator);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
147
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
148 for(Direction d : result){ // パスの分だけDirectionが生成される
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
149 int pos = d.getPosition();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
150 Node node = d.getTraget();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
151 // etc etc..
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
152 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
153 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
154
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
155 Evaluator,Directionなどのクラスの説明については後述する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
156 これまでに, Jungleの基本的な利用方法について述べた. 以降はJungleの更に細かい部分の実装について説明する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
157
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
158 \section{木構造データベースJungleの実装}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
159 \subsection{開発環境}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
160 \subsubsection{言語}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
161 本システムではサーバーサイドの実装にJavaを用いる. Javaは豊富なライブラリと開発環境が整っているため使いやすい言語である.\\
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
162 また, 外部ライブラリとしてFunctionalJavaを用いる. このライブラリはJavaで関数型スタイルのプログラミングを行うために開発された. 本システムでは, 非破壊的木構造をメインのデータ構造とする, そのため, 多くの非破壊的データ構造を利用できるFunctionalJavaは有効に利用できる.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
163
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
164 \subsection{全体の構造}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
165 全体木構造データベースは木構造を表現するNodeと, Nodeを非破壊的に編集するNodeEditor, Nodeの集合である木構造を非破壊的に編集するTreeEditorから構成される. 以下に, 述べたコンポーネントとその他の構成要素の表を示す.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
166
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
167 \begin{table}[!htbp]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
168 \caption{コンポーネント一覧}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
169 \label{tab:components}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
170 \begin{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
171 \begin{tabular}{|c||c|} \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
172 名前 & 概要 \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
173 Node & 基本的なデータ構造, 読み込み専用の親子関係を表現する \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
174 NodeEditor & ノードを編集する \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
175 TreeEditor & 複数のノードから構成される木構造を編集する \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
176 Traverser & 木構造を走査し目的のNodeを取得する \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
177 JungleTreeEditor & TreeEditorに加え, トランザクションを管理する \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
178 JungleTree & JungleTreeEditorなど, 木の情報を管理する \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
179 Jungle & 木の作成・取得・削除を担当する. \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
180 \end{tabular}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
181 \end{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
182 \end{table}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
183
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
184 \subsection{型パラメータつきインターフェイスParentの導入}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
185 我々は, Javaで木構造を表すためにParent,Childrenというインターフェイスを作成する. これは非常に複雑であるが, 親子関係を表すのに有用な仕組みだと思われる. 定義を以下に示す.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
186
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
187 \begin{lstlisting}[frame=lrbt,label=src:parent,caption=Parentの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
188 public interface Parent<T> {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
189 public Children<T> getChildren();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
190 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
191 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
192
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
193 \begin{lstlisting}[frame=lrbt,label=src:child,caption=Childrenの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
194 public interface Children<T> extends Iterable<T>{
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
195 public int size();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
196 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
197 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
198
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
199 これらのインターフェイスを利用するためには, まず, ソース\ref{src:node}のようにして継承したインターフェイスを作成する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
200 ここで型パラメータTはNodeを継承した型として宣言する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
201
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
202 \begin{lstlisting}[frame=lrbt,label=src:node,caption=Nodeの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
203 public interface Node<T extends Node<T>> implements Parent<T> {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
204 public Children<T> getChildren();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
205 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
206 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
207
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
208 NodeはParentの定義よりT型の子供を保持するインターフェイスとして宣言できる. そしてT型はNode型を継承する型なので, 再帰的な構造を表現することが出来る.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
209 このインターフェイスを実装すると以下のようになる.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
210
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
211 \begin{lstlisting}[frame=lrbt,label=src:nodeimpl,caption=NodeImplの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
212 public class NodeImpl implements Node<NodeImpl> {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
213 public Children<NodeImpl> getChildren();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
214 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
215 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
216
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
217 このNodeの実装では, Childrenの型パラメータがNodeImplになる. こうすることで, 実装を知らないクラスに引数として渡しても型パラメータが失われることがないコードを記述できるようになる.\\
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
218 例えば, 我々のシステムでは, 主に非破壊的なデータ構造を扱う. すなわち, 非破壊的オブジェクトを編集して返すメソッドがあるクラスに存在する場合, その返されたオブジェクトは元々のオブジェクトと異なるため, 型の情報が失われてしまうためキャストが必要になる.\\
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
219 しかし, この方法では, キャストは必要なく常に型パラメータは保持される.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
220
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
221 \begin{lstlisting}[frame=lrbt,label=src:parent_example,caption=Parentが有用な例,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
222 class EditorA {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
223 public Node edit(Node obj) { .... }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
224 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
225 class EditorB {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
226 public <T extends Node<T>> edit(T obj) { .... }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
227 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
228 class Obj implements Node<Obj> {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
229 public static void main(String args[]){
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
230 Obj o = new Obj();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
231 EditorA a = new EditorA();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
232 EditorB b = new EditorB();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
233 Node n = a.edit(o); // 型が失われてNodeになるキャストが必要
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
234 Obj newObj = b.edit(o); // 型は失われない.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
235 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
236 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
237 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
238
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
239 我々の実装で, 親子関係を扱うコンポーネントはすべてこのインターフェイスを継承する. 次に, 他の構成するコンポーネントについて述べる.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
240
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
241 \newpage
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
242
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
243 \section{Node}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
244 Nodeは, 木構造を表現するためのコンポーネントである. 木構造は子供と辞書を保持する. (図\ref{fig:node_components})
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
245 我々はNodeのAPIをソース\ref{src:definition_of_node}のように定義した.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
246 基本的に, Nodeは読み込み専用であり, 編集操作を持たない.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
247 \begin{figure}[!htbp]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
248 \begin{center}
6
Shoshi TAMAKI
parents: 4
diff changeset
249 \includegraphics[width=110mm]{./images/node_component.pdf}
4
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
250 \end{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
251 \caption{Nodeの構成要素}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
252 \label{fig:node_components}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
253 \end{figure}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
254
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
255 \begin{lstlisting}[frame=lrbt,label=src:definition_of_node,caption=Nodeの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
256 public class Node implements Children<Node>
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
257 ,AttributesContainer {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
258 public Attribute getAttribute();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
259 public Children<NodeImpl> getChildren();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
260 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
261 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
262
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
263 getAttributesは辞書オブジェクトを取得するメソッドで, getChildrenは子ノードのリストを取得するメソッドである.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
264 Childrenの定義は前述したとおりで, Attributesの定義を以下に示す.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
265
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
266 \begin{lstlisting}[frame=lrbt,label=src:definition_of_children,caption=Nodeの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
267 public interface Attributes {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
268 public ByteBuffer get(String key);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
269 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
270 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
271
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
272 ここで, ByteBufferはjava.nio.ByteBufferである. ここでは, 辞書に格納するものが文字列に限らないことを考慮しByteBuffer型を採用した.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
273
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
274 \newpage
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
275
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
276 \section{NodeEditor}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
277 前章で述べたとおり, 非破壊的木構造は編集対象までのNodeをRootからすべてコピーした後, 編集対象のNodeを書き換える.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
278 よって, Nodeを書き換える仕組みが必要である. NodeEditorはNodeを(木構造ではない)を編集するためのコンポーネントである.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
279 NodeEditorを構成する要素を表\ref{tab:nodeeditor_components}に示す.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
280
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
281 \begin{figure}[!htbp]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
282 \begin{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
283 \includegraphics[width=150mm]{./images/nodeeditor_component.pdf}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
284 \end{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
285 \caption{NodeEditorのイメージ}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
286 \label{fig:nodeeditor_component}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
287 \end{figure}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
288
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
289 \begin{table}[!htbp]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
290 \caption{NodeEditorを構成する要素}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
291 \label{tab:nodeeditor_components}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
292 \begin{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
293 \begin{tabular}{|c||p{25zw}|} \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
294 クラス名 & 概要 \\ \hline \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
295 EditableNode & 非破壊的に編集できるNode \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
296 EditableAttribute & 非破壊的に編集できる辞書, 編集の際に新しいEditableNodeを返す. \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
297 EditableChildren & 非破壊的に編集できる子Nodeリスト, 編集の際に新しいEditableNodeを返す. \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
298 NodeEditor & Nodeの編集処理を記述するためのシングルメソッドクラス. \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
299 \end{tabular}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
300 \end{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
301 \end{table}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
302
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
303 \subsubsection{EditableNode}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
304 EditableNodeは, Parentを継承した非破壊的に編集できることを示すNodeである. EditableAttributesとEditableChildrenをここから取得することが出来る.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
305
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
306 \subsubsection{EditableAttributes}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
307 EditableAttributeは, Attributesを拡張し編集操作を加えたインターフェイスである. 辞書への追加, 削除が定義されている.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
308 また, 辞書への追加, 削除の操作が行われると新しくEditableNodeが作成される. この作成されたEditableNodeは辞書を元々保持していたEditableNodeのコピーを編集したものでる.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
309
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
310 \begin{lstlisting}[frame=lrbt,label=src:definition_of_editableattributes,caption=EditableAttributesの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
311 public interface EditableAttributes<T extends EditableNode<T>>
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
312 implements Attributes {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
313 public void put(String key,ByteBuffer value);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
314 public void delete(String key);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
315 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
316 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
317
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
318 \subsubsection{EditableChildren}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
319 EditableChildrenは, Childrenを拡張し編集操作を加えたインターフェイスである. 子リストへのNodeの新規追加, 削除を行うことが出来る.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
320 EditableAttributes同様に, リストを編集すると新しくコピーされたオブジェクトを作成し, それを編集して返却する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
321
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
322 \begin{lstlisting}[frame=lrbt,label=src:definition_of_editablechildren,caption=EditableChildrenの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
323 public interface EditableChildren<T extends EditableNode<T>>
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
324 implements Children<T> {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
325 public Either<Error,T> addNewChildAt(int pos);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
326 public Either<Error,T> deleteChildAt(int pos);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
327 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
328 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
329
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
330 \subsubsection{NodeEditor}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
331 NodeEditorは, Nodeの編集を手順を記述するためのインターフェイスである. メソッドeditを持ち引数としてEditableNodeを取る, edit内部に編集手順を記述し, 戻り値として編集されたEditableNodeを返す.\\
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
332 このインターフェイスは, ユーザー側がNodeを編集するための手順をクラス化し, 木構造を編集するコンポーネント(後述)に渡すことで, 柔軟な編集を実現することが出来る.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
333
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
334 \begin{lstlisting}[frame=lrbt,label=src:definition_of_nodeeditor,caption=NodeEditorの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
335 public interface NodeEditor {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
336 public <T extends EditableNode<T>> Either<Error,T> edit(T node);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
337 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
338 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
339
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
340 例えば, あるNodeの辞書に名前と生年月日, 研究室を追加するNodeEditorは以下のように記述する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
341
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
342 \begin{lstlisting}[frame=lrbt,label=src:nodeditor_sample,caption=NodeEditorのサンプル実装,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
343 public class AddProfile implements NodeEditor {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
344 public <T extends EditableNode<T>> Either<Error,T> edit(T node){
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
345 node = node.getAttributes().put(key_name,name).b();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
346 node = node.getAttributes().put(key_birth,birth).b();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
347 node = node.getAttributes().put(key_lab,laboname).b();
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
348 return node;
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
349 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
350 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
351 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
352
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
353 \newpage
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
354
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
355 \subsection{TreeEditor}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
356 TreeEditorは木構造を非破壊的に編集するためのコンポーネントでありNodeEditorを利用して実装される.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
357 非破壊的木構造の編集方法通り, TreeEditorは編集対象のNodeまでをコピーする. コピーした編集対象のNodeをNodeEditorを使って編集する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
358 NodeEditorはNodeを編集するためのコンポーネントだが, TreeEditorは木を構成するためのコンポーネントであるため木を構成するためのNodeを持つ.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
359 TreeEditorを構成する要素を表\ref{tab:treeeditor_components}に示す.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
360
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
361 \begin{table}[!htbp]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
362 \caption{TreeEditorの構成要素}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
363 \label{tab:treeeditor_components}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
364 \begin{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
365 \begin{tabular}{|c||c|} \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
366 クラス名 & 概要 \\ \hline \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
367 TreeNode & 木を構成するノード \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
368 TreeNodeChildren & 子供ノードのリスト \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
369 TreeNodeAttributes & ノードが保持する辞書 \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
370 TreeEditor & 木を編集するためのメソッドを持つエディタ \\ \hline
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
371 \end{tabular}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
372 \end{center}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
373 \end{table}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
374
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
375 \subsubsection{TreeNode}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
376 TreeNodeは, EditableNodeとほぼ同じであるが木を構成するために適したメソッドを保持するTreeNodeAttributeとTreeNodeChildrenを保持する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
377
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
378 \subsubsection{TreeAttribute}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
379 TreeNodeAttributeは, Attributesを拡張し編集操作を加えたインターフェイスである. EditableAttribute同様, 辞書への追加, 削除が定義されている.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
380 また, 辞書への追加, 削除の操作が行われると新しくTreeNodeが作成される.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
381
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
382 \subsubsection{TreeNodeChildren}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
383 TreeNodeChildrenは, Childrenを拡張し編集操作を加えたインターフェイスである. 子リストへのNodeの新規追加, 削除を行うことが出来る.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
384 EditableChildrenは, 子供Nodeとして既存のNodeを追加することが出来ないが, TreeNodeChildrenはそれが可能であるため, 効率よく木を構成することができる.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
385 また, EditableChildren同様にリストを編集すると新しくコピーされたオブジェクトを作成し, それを編集して返却する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
386
6
Shoshi TAMAKI
parents: 4
diff changeset
387 \newpage
Shoshi TAMAKI
parents: 4
diff changeset
388
4
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
389 \begin{lstlisting}[frame=lrbt,label=src:definition_of_treenodechildren,caption=TreeNodeChildrenの定義,numbers=left]
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
390 public interface TreeNodeChildren<T extends TreeNode<T>>
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
391 implements Children<T> {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
392 public Either<Error,T> addNewChildAt(int pos);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
393 public Either<Error,T> deleteChildAt(int pos);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
394 public Either<Error,T> addNewChildAt(int pos,T newChild);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
395 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
396 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
397
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
398 \subsubsection{TreeEditor}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
399 TreeEditorは, TreeNodeで構成される木を編集するための操作が定義されているインターフェイスである.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
400 NodePathと呼ばれるルートNodeから編集対象のNodeまでのパスとNodeEditorを引数として受け取り, 非破壊的に編集する.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
401 TreeEditorの定義を以下に示す.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
402
8
b75c564064a8 fix undefined reference , multiply defined references
Shoshi TAMAKI
parents: 7
diff changeset
403 \begin{lstlisting}[frame=lrbt,label=src:definition_of_treeeditor,caption=TreeEditorの定義,numbers=left]
4
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
404 public interface TreeEditor {
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
405 public <T extends TreeNode<T>> Either<Error,T> edit(T root,NodePath,NodeEditor editor);
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
406 }
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
407 \end{lstlisting}
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
408
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
409 TreeEditorは, 木を対象にするわけではなくNodeを引数に取るため, 木を構成する任意のTreeNodeから編集することも可能である.
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
410
6
Shoshi TAMAKI
parents: 4
diff changeset
411 \newpage
4
83ddc73ce79b added chapter3,4,5
Shoshi TAMAKI
parents: 0
diff changeset
412
0
bf82975fa7f5 hg init and added files
Shoshi TAMAKI
parents:
diff changeset
413 \subsection{Traverser}
6
Shoshi TAMAKI
parents: 4
diff changeset
414 Traverserは木構造を走査するためのコンポーネントであり, TreeEditorでも利用されている.
Shoshi TAMAKI
parents: 4
diff changeset
415 TraverserはNodeと走査するためのEvaluatorと呼ばれるものを引数に取り走査を行う. Evaluatorとは, TraverserがあるNodeを走査中にそのNodeの先に進むかどうか判断するために利用される.
Shoshi TAMAKI
parents: 4
diff changeset
416 Evaluatorは, Nodeとその他の情報(Nodeの場所)を受け取り, そのNodeの先に進むか進まないか判断する.
Shoshi TAMAKI
parents: 4
diff changeset
417 そして, 戻り値として次のNodeを評価するための新しいEvaluatorと評価結果をTraverserに返却する. 表\ref{tab:traverser_components}にTraverserを構成する要素を示す.
Shoshi TAMAKI
parents: 4
diff changeset
418
Shoshi TAMAKI
parents: 4
diff changeset
419 \begin{table}[!htbp]
Shoshi TAMAKI
parents: 4
diff changeset
420 \caption{Traverserを構成する要素}
Shoshi TAMAKI
parents: 4
diff changeset
421 \label{tab:traverser_components}
Shoshi TAMAKI
parents: 4
diff changeset
422 \begin{center}
Shoshi TAMAKI
parents: 4
diff changeset
423 \begin{tabular}{|c||p{27zw}|} \hline
Shoshi TAMAKI
parents: 4
diff changeset
424 名前 & 概要 \\ \hline \hline
Shoshi TAMAKI
parents: 4
diff changeset
425 Traverser & 木構造, Nodeを走査する. \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
426 TraversableNode & Traverserで走査することの出来るNode \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
427 TraversableChildren & TraversableNode同様, Traverserで走査することの出来るChildren \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
428 Evaluator & TraversableNodeを評価する \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
429 Traversal & Traverseの結果, ルートNodeから目的Nodeまでの全てのNodeのリスト \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
430 Direction & Traverseの結果に含まれる, 次のNodeの位置情報が含まれている \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
431 \end{tabular}
Shoshi TAMAKI
parents: 4
diff changeset
432 \end{center}
Shoshi TAMAKI
parents: 4
diff changeset
433 \end{table}
Shoshi TAMAKI
parents: 4
diff changeset
434
Shoshi TAMAKI
parents: 4
diff changeset
435 \subsubsection{TraversableNode}
Shoshi TAMAKI
parents: 4
diff changeset
436 TraversableNodeは, Traverserが走査することの出来ることを示すNodeである.
Shoshi TAMAKI
parents: 4
diff changeset
437
Shoshi TAMAKI
parents: 4
diff changeset
438 \subsubsection{TraversableChildren}
Shoshi TAMAKI
parents: 4
diff changeset
439 TraversableChildrenは, Traverserが走査することの出来ることを示すNodeの子供Nodeのリストである.
Shoshi TAMAKI
parents: 4
diff changeset
440
Shoshi TAMAKI
parents: 4
diff changeset
441 \subsubsection{Evaluator}
Shoshi TAMAKI
parents: 4
diff changeset
442 Evaluatorは, Traverserが走査しているNodeを評価する.
Shoshi TAMAKI
parents: 4
diff changeset
443 戻り値としてEvaluationと呼ばれる, 次のEvaluatorとNodeの評価を保持するオブジェクトを返す.
Shoshi TAMAKI
parents: 4
diff changeset
444 Evaluatorにより, 評価されたNodeはTraverserがNodeを走査するべきかしないべきか判断するために利用される.
Shoshi TAMAKI
parents: 4
diff changeset
445 Evaluatorの定義とEvaluationの定義をソース\ref{src:evaluator_definition}とソース\ref{src:evaluation_definition}に示す.
Shoshi TAMAKI
parents: 4
diff changeset
446
Shoshi TAMAKI
parents: 4
diff changeset
447 \begin{lstlisting}[frame=lrbt,label=src:evaluator_definition,caption=Evaluatorの定義,numbers=left]
Shoshi TAMAKI
parents: 4
diff changeset
448 public interface Evaluator
Shoshi TAMAKI
parents: 4
diff changeset
449 {
Shoshi TAMAKI
parents: 4
diff changeset
450 public <T extends TraversableNode<T>> Evaluation evaluate(T _current,int _pos);
Shoshi TAMAKI
parents: 4
diff changeset
451 }
Shoshi TAMAKI
parents: 4
diff changeset
452 \end{lstlisting}
Shoshi TAMAKI
parents: 4
diff changeset
453
Shoshi TAMAKI
parents: 4
diff changeset
454 \begin{lstlisting}[frame=lrbt,label=src:evaluation_definition,caption=Evaluatorの定義,numbers=left]
Shoshi TAMAKI
parents: 4
diff changeset
455 public interface Evaluation
Shoshi TAMAKI
parents: 4
diff changeset
456 {
Shoshi TAMAKI
parents: 4
diff changeset
457 public Result result();
Shoshi TAMAKI
parents: 4
diff changeset
458 public Evaluator evaluator();
Shoshi TAMAKI
parents: 4
diff changeset
459 }
Shoshi TAMAKI
parents: 4
diff changeset
460 \end{lstlisting}
Shoshi TAMAKI
parents: 4
diff changeset
461
8
b75c564064a8 fix undefined reference , multiply defined references
Shoshi TAMAKI
parents: 7
diff changeset
462 Evaluationのresultメソッドは, このNodeの評価結果を表すEnum型のクラスResultを返す. 表\ref{tab:evaluation_result}に評価の種類を示す.
6
Shoshi TAMAKI
parents: 4
diff changeset
463
Shoshi TAMAKI
parents: 4
diff changeset
464 \begin{table}[!htbp]
Shoshi TAMAKI
parents: 4
diff changeset
465 \caption{Evalautionの結果一覧}
Shoshi TAMAKI
parents: 4
diff changeset
466 \label{tab:evaluation_result}
Shoshi TAMAKI
parents: 4
diff changeset
467 \begin{center}
Shoshi TAMAKI
parents: 4
diff changeset
468 \begin{tabular}{|c||c|} \hline
Shoshi TAMAKI
parents: 4
diff changeset
469 名前 & 概要 \\ \hline \hline
Shoshi TAMAKI
parents: 4
diff changeset
470 ACCEPT & このNodeを受け入れて先に進む \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
471 CONTINUE & このNodeを受け入れずに, 次の候補を評価する \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
472 BREAK & このNodeを受け入れず, でこれ以上の走査をやめる \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
473 GOAL & このNodeを受け入れて, 走査をやめる \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
474 \end{tabular}
Shoshi TAMAKI
parents: 4
diff changeset
475 \end{center}
Shoshi TAMAKI
parents: 4
diff changeset
476 \end{table}
Shoshi TAMAKI
parents: 4
diff changeset
477
Shoshi TAMAKI
parents: 4
diff changeset
478 \subsubsection{Traversal}
Shoshi TAMAKI
parents: 4
diff changeset
479 Traversalは, Traverserによる走査の結果である. ルートノードから目的ノードまでのノードのリストを保持する.
Shoshi TAMAKI
parents: 4
diff changeset
480 図\ref{fig:traversal_image}にTraversalのイメージを示す.
Shoshi TAMAKI
parents: 4
diff changeset
481 この図はTraverserで, NodePath"-1,1,2,3"を走査した時のTraversalが保持する結果を表している.
Shoshi TAMAKI
parents: 4
diff changeset
482
Shoshi TAMAKI
parents: 4
diff changeset
483 \begin{figure}[!htbp]
Shoshi TAMAKI
parents: 4
diff changeset
484 \begin{center}
Shoshi TAMAKI
parents: 4
diff changeset
485 \includegraphics[width=100mm]{./images/traversal_image.pdf}
Shoshi TAMAKI
parents: 4
diff changeset
486 \end{center}
Shoshi TAMAKI
parents: 4
diff changeset
487 \caption{Traversalのイメージ}
Shoshi TAMAKI
parents: 4
diff changeset
488 \label{fig:traversal_image}
Shoshi TAMAKI
parents: 4
diff changeset
489 \end{figure}
Shoshi TAMAKI
parents: 4
diff changeset
490
Shoshi TAMAKI
parents: 4
diff changeset
491 \subsubsection{Direction}
Shoshi TAMAKI
parents: 4
diff changeset
492 Directionは, あるノードがその親ノードの何番目の子供ノードに値するかを示す. Traversalにて, ルートノードから目的ノードまでのリストを表す時, あるノードから次のノードへの
Shoshi TAMAKI
parents: 4
diff changeset
493 方向を示す際に利用される.
Shoshi TAMAKI
parents: 4
diff changeset
494
Shoshi TAMAKI
parents: 4
diff changeset
495 \subsubsection{Traverserを用いた走査の流れ}
Shoshi TAMAKI
parents: 4
diff changeset
496 Traverserを用いた走査の流れを図\ref{fig:traverse_sample_1}から図\ref{fig:traverse_sample_5}に示す.
Shoshi TAMAKI
parents: 4
diff changeset
497 例では, NodePath"-1,1,2,3"をTraverseする流れを示す.\\
Shoshi TAMAKI
parents: 4
diff changeset
498 \\
Shoshi TAMAKI
parents: 4
diff changeset
499 初めに, TraverserはEvaluatorを用いて走査を行うので, NodePathをEvaluatorに変換してルートノードから走査を開始する.
Shoshi TAMAKI
parents: 4
diff changeset
500
Shoshi TAMAKI
parents: 4
diff changeset
501 \begin{figure}[!htbp]
Shoshi TAMAKI
parents: 4
diff changeset
502 \begin{center}
Shoshi TAMAKI
parents: 4
diff changeset
503 \includegraphics[width=60mm]{./images/traverse_sample_1.pdf}
Shoshi TAMAKI
parents: 4
diff changeset
504 \end{center}
Shoshi TAMAKI
parents: 4
diff changeset
505 \caption{ステップ1:ルートノードから走査を開始}
Shoshi TAMAKI
parents: 4
diff changeset
506 \label{fig:traverse_sample_1}
Shoshi TAMAKI
parents: 4
diff changeset
507 \end{figure}
Shoshi TAMAKI
parents: 4
diff changeset
508
Shoshi TAMAKI
parents: 4
diff changeset
509 Traverserは, ルートノードの評価をEvaluatorに依頼する. Evaluatorはルートノード(-1)がNodePathに含まれているのでACCEPTして, 次のEvalautorをTraverserに渡す.
Shoshi TAMAKI
parents: 4
diff changeset
510 この時, EvaluatorはNodePathから"-1"を除外し, 残りのNodePathを新しいEvaluatorにして渡す. 結果を受け取ったTraverserは, ルートノードの子供ノードを順番に評価を開始する.
Shoshi TAMAKI
parents: 4
diff changeset
511
Shoshi TAMAKI
parents: 4
diff changeset
512 \begin{figure}[!htbp]
Shoshi TAMAKI
parents: 4
diff changeset
513 \begin{center}
Shoshi TAMAKI
parents: 4
diff changeset
514 \includegraphics[width=120mm]{./images/traverse_sample_2.pdf}
Shoshi TAMAKI
parents: 4
diff changeset
515 \end{center}
Shoshi TAMAKI
parents: 4
diff changeset
516 \caption{ステップ2:ルートノードを評価して次のノードの評価に進む}
7
44a95cddab8a added benchmark results and graphs and gnuplot script
Shoshi TAMAKI
parents: 6
diff changeset
517 \label{fig:traverse_sample_2}
6
Shoshi TAMAKI
parents: 4
diff changeset
518 \end{figure}
Shoshi TAMAKI
parents: 4
diff changeset
519
Shoshi TAMAKI
parents: 4
diff changeset
520 次に, ルートノードの子供ノードの評価を開始する, TraverserはEvalautorに子供ノードを順番に評価してもらう.
Shoshi TAMAKI
parents: 4
diff changeset
521 Evaluatorは受け取ったノードを評価し, Traverserに返却する. この時, EvalautorのNodePathは"1,2,3"なので, 最初のノード"0"は無視されCONTINUEと次のノードを評価するためのEvalautorが渡される.
Shoshi TAMAKI
parents: 4
diff changeset
522
Shoshi TAMAKI
parents: 4
diff changeset
523 \begin{figure}[!htbp]
Shoshi TAMAKI
parents: 4
diff changeset
524 \begin{center}
Shoshi TAMAKI
parents: 4
diff changeset
525 \includegraphics[width=140mm]{./images/traverse_sample_3.pdf}
Shoshi TAMAKI
parents: 4
diff changeset
526 \end{center}
Shoshi TAMAKI
parents: 4
diff changeset
527 \caption{ステップ3:子供ノードの評価を順々に行う}
7
44a95cddab8a added benchmark results and graphs and gnuplot script
Shoshi TAMAKI
parents: 6
diff changeset
528 \label{fig:traverse_sample_3}
6
Shoshi TAMAKI
parents: 4
diff changeset
529 \end{figure}
Shoshi TAMAKI
parents: 4
diff changeset
530
Shoshi TAMAKI
parents: 4
diff changeset
531 Traverserは, 次のノード"1"をEvalautorに渡す, EvalautorはNodePathに"1"が含まれていることを確認しノードをACCEPTする. そして, いままでの手順同様に更に木の走査を続ける.
Shoshi TAMAKI
parents: 4
diff changeset
532
Shoshi TAMAKI
parents: 4
diff changeset
533 \begin{figure}[!htbp]
Shoshi TAMAKI
parents: 4
diff changeset
534 \begin{center}
Shoshi TAMAKI
parents: 4
diff changeset
535 \includegraphics[width=160mm]{./images/traverse_sample_4.pdf}
Shoshi TAMAKI
parents: 4
diff changeset
536 \end{center}
Shoshi TAMAKI
parents: 4
diff changeset
537 \caption{ステップ4:子供ノードの評価した後, 更に走査を続ける}
7
44a95cddab8a added benchmark results and graphs and gnuplot script
Shoshi TAMAKI
parents: 6
diff changeset
538 \label{fig:traverse_sample_4}
6
Shoshi TAMAKI
parents: 4
diff changeset
539 \end{figure}
Shoshi TAMAKI
parents: 4
diff changeset
540
Shoshi TAMAKI
parents: 4
diff changeset
541 以上のステップを繰り返すことで最終的に目的のノードへたどり着くことが出来る. NodePathは最後の"3"を指しているので, Evaluatorはノード"3"をGOALとしてTraverserに伝える.
Shoshi TAMAKI
parents: 4
diff changeset
542 Traverserは, ノード"3"をGOALとし, いままでACCEPTしてきたノードすべてをTraversalとしてリストにまとめて終了する.
Shoshi TAMAKI
parents: 4
diff changeset
543
Shoshi TAMAKI
parents: 4
diff changeset
544 \newpage
Shoshi TAMAKI
parents: 4
diff changeset
545
Shoshi TAMAKI
parents: 4
diff changeset
546 \begin{figure}[!htbp]
Shoshi TAMAKI
parents: 4
diff changeset
547 \begin{center}
Shoshi TAMAKI
parents: 4
diff changeset
548 \includegraphics[width=150mm]{./images/traverse_sample_5.pdf}
Shoshi TAMAKI
parents: 4
diff changeset
549 \end{center}
Shoshi TAMAKI
parents: 4
diff changeset
550 \caption{ステップ5:ノード"3"をGOALとし, ACCEPTしたノードをリスト化して終了}
7
44a95cddab8a added benchmark results and graphs and gnuplot script
Shoshi TAMAKI
parents: 6
diff changeset
551 \label{fig:traverse_sample_5}
6
Shoshi TAMAKI
parents: 4
diff changeset
552 \end{figure}
Shoshi TAMAKI
parents: 4
diff changeset
553
Shoshi TAMAKI
parents: 4
diff changeset
554 \subsection{Jungle}
Shoshi TAMAKI
parents: 4
diff changeset
555 Jungleは, いままで説明してきたコンポーネントを利用して複数の木構造を管理するためのコンポーネントである.
Shoshi TAMAKI
parents: 4
diff changeset
556 木構造と名前の結びつけ, トランザクションの管理などを担当する.
Shoshi TAMAKI
parents: 4
diff changeset
557 Jungleを構成する要素を\ref{tab:jungle_components}に示す.
Shoshi TAMAKI
parents: 4
diff changeset
558
Shoshi TAMAKI
parents: 4
diff changeset
559 \begin{table}[!htbp]
Shoshi TAMAKI
parents: 4
diff changeset
560 \caption{Jungleを構成する要素}
Shoshi TAMAKI
parents: 4
diff changeset
561 \label{tab:jungle_components}
Shoshi TAMAKI
parents: 4
diff changeset
562 \begin{center}
Shoshi TAMAKI
parents: 4
diff changeset
563 \begin{tabular}{|c||c|} \hline
Shoshi TAMAKI
parents: 4
diff changeset
564 Jungle & 木構造の作成, 管理を行う \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
565 JungleTree & Editorの管理, ノードの管理を行う \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
566 JungleTreeEditor & トランザクションと木構造の編集を行う \\ \hline
Shoshi TAMAKI
parents: 4
diff changeset
567 \end{tabular}
Shoshi TAMAKI
parents: 4
diff changeset
568 \end{center}
Shoshi TAMAKI
parents: 4
diff changeset
569 \end{table}
Shoshi TAMAKI
parents: 4
diff changeset
570
Shoshi TAMAKI
parents: 4
diff changeset
571 \subsubsection{Jungle}
Shoshi TAMAKI
parents: 4
diff changeset
572 複数の木構造を管理する, 作成, 削除も行う. 定義をソース\ref{src:jungle_definition}に示す.
Shoshi TAMAKI
parents: 4
diff changeset
573 Jungleでは, 木はバージョン番号を持つ, これはマージ処理の時に情報として利用するためである.
Shoshi TAMAKI
parents: 4
diff changeset
574
Shoshi TAMAKI
parents: 4
diff changeset
575 \begin{lstlisting}[frame=lrbt,label=src:jungle_definition,caption=Jungleの定義,numbers=left]
Shoshi TAMAKI
parents: 4
diff changeset
576 public interface Jungle
Shoshi TAMAKI
parents: 4
diff changeset
577 {
Shoshi TAMAKI
parents: 4
diff changeset
578 public JungleTree getTreeByName(String _name);
Shoshi TAMAKI
parents: 4
diff changeset
579 public JungleTree createNewTree(String _name);
Shoshi TAMAKI
parents: 4
diff changeset
580 public JungleTree deleteTree(String _name);
Shoshi TAMAKI
parents: 4
diff changeset
581 }
Shoshi TAMAKI
parents: 4
diff changeset
582 \end{lstlisting}
Shoshi TAMAKI
parents: 4
diff changeset
583
Shoshi TAMAKI
parents: 4
diff changeset
584 \subsubsection{JungleTree}
Shoshi TAMAKI
parents: 4
diff changeset
585 JungleTreeは, 内部にJungleTreeEditorとルートノードの情報を保持する.
Shoshi TAMAKI
parents: 4
diff changeset
586 JungleTreeから取得されるNodeは常に最新のものである.
Shoshi TAMAKI
parents: 4
diff changeset
587 定義をソース\ref{src:jungletree}に示す.
Shoshi TAMAKI
parents: 4
diff changeset
588
Shoshi TAMAKI
parents: 4
diff changeset
589 \begin{lstlisting}[frame=lrbt,label=src:jungletree,caption=JungleTreeの定義,numbers=left]
Shoshi TAMAKI
parents: 4
diff changeset
590 public interface JungleTree
Shoshi TAMAKI
parents: 4
diff changeset
591 {
Shoshi TAMAKI
parents: 4
diff changeset
592 public JungleTreeEditor getTreeEditor();
Shoshi TAMAKI
parents: 4
diff changeset
593 public Node getRootNode();
Shoshi TAMAKI
parents: 4
diff changeset
594 }
Shoshi TAMAKI
parents: 4
diff changeset
595 \end{lstlisting}
Shoshi TAMAKI
parents: 4
diff changeset
596
Shoshi TAMAKI
parents: 4
diff changeset
597 \subsubsection{JungleTreeEditor}
Shoshi TAMAKI
parents: 4
diff changeset
598 JungleTreeEditorは, 木の編集とトランザクション, バージョン番号を管理する.
Shoshi TAMAKI
parents: 4
diff changeset
599 なんらかの木の編集を行うと, 非破壊的に木を編集し新しい木を保持したJungleTreeEditorを返却する.
Shoshi TAMAKI
parents: 4
diff changeset
600 トランザクションのコミットはsuccessメソッドにより行うことができ, もし他のスレッドなどでJungleTreeEditorを用いてすでに更新されている場合sucessメソッドは失敗する.
Shoshi TAMAKI
parents: 4
diff changeset
601 定義をソース\ref{src:jungletreeeditor}に示す.
Shoshi TAMAKI
parents: 4
diff changeset
602
Shoshi TAMAKI
parents: 4
diff changeset
603 \begin{lstlisting}[frame=lrbt,label=src:jungletreeeditor,caption=JungleTreeEditorの定義,numbers=left]
Shoshi TAMAKI
parents: 4
diff changeset
604 public interface JungleTreeEditor
Shoshi TAMAKI
parents: 4
diff changeset
605 {
Shoshi TAMAKI
parents: 4
diff changeset
606 public Node getRoot();
Shoshi TAMAKI
parents: 4
diff changeset
607
Shoshi TAMAKI
parents: 4
diff changeset
608 public Either<Error,JungleTreeEditor> addNewChildAt(NodePath _path,int _pos);
Shoshi TAMAKI
parents: 4
diff changeset
609 public Either<Error,JungleTreeEditor> deleteChildAt(NodePath _path,int _pos);
Shoshi TAMAKI
parents: 4
diff changeset
610 public Either<Error,JungleTreeEditor> putAttribute(NodePath _path,String _key,ByteBuffer _value);
Shoshi TAMAKI
parents: 4
diff changeset
611 public Either<Error,JungleTreeEditor> deleteAttribute(NodePath _path,String _key);
Shoshi TAMAKI
parents: 4
diff changeset
612 public Either<Error,JungleTreeEditor> edit(NodePath _path,NodeEditor _editor);
Shoshi TAMAKI
parents: 4
diff changeset
613
Shoshi TAMAKI
parents: 4
diff changeset
614 public Either<Error,JungleTreeEditor> success();
Shoshi TAMAKI
parents: 4
diff changeset
615 public String getID();
Shoshi TAMAKI
parents: 4
diff changeset
616 public String getRevision();
Shoshi TAMAKI
parents: 4
diff changeset
617 }
Shoshi TAMAKI
parents: 4
diff changeset
618 \end{lstlisting}