Mercurial > hg > Papers > 2015 > tatsuki-thresis
changeset 23:018025ca0964
commit
author | tatsuki |
---|---|
date | Thu, 19 Feb 2015 03:50:48 +0900 |
parents | 7a279b87d112 |
children | 0e549369b63e |
files | chapter8.tex fig/configTree.graffle fig/sosikiTree.graffle main.pdf slide/images/configTree.png slide/slide.html |
diffstat | 6 files changed, 102 insertions(+), 547 deletions(-) [+] |
line wrap: on
line diff
--- a/chapter8.tex Wed Feb 18 19:24:22 2015 +0900 +++ b/chapter8.tex Thu Feb 19 03:50:48 2015 +0900 @@ -15,7 +15,7 @@ \subsection{indexのIncrementalUpdate} 今JungleのIndexは木の更新が行われる度に新しく作りなおされているため、メモリの消費が大きい -しかし新しく作り直さず、木の更新時に差分更新を行うことでメモリの消費を抑えて各versionのTreeにIndexを保持することが可能になる。 +しかし、新しく作り直さず、木の更新時に差分更新を行うことでメモリの消費を抑えて各versionのTreeにIndexを保持することが可能になる。 \subsection{differencialList} Treeの葉部分に、更新可能な未定義ノードを付加しておくことで、ルートまでのコピーを行わずにノードの追加を行えるようになるので、更新処理が短くなる。
--- a/fig/configTree.graffle Wed Feb 18 19:24:22 2015 +0900 +++ b/fig/configTree.graffle Thu Feb 19 03:50:48 2015 +0900 @@ -147,7 +147,13 @@ <key>Shape</key> <string>Rectangle</string> <key>Style</key> - <dict/> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> <key>Text</key> <dict> <key>Text</key> @@ -190,7 +196,13 @@ <key>Shape</key> <string>Rectangle</string> <key>Style</key> - <dict/> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> <key>Text</key> <dict> <key>Text</key> @@ -228,7 +240,13 @@ <key>Shape</key> <string>Rectangle</string> <key>Style</key> - <dict/> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> <key>Text</key> <dict> <key>Text</key> @@ -271,7 +289,13 @@ <key>Shape</key> <string>Rectangle</string> <key>Style</key> - <dict/> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> <key>Text</key> <dict> <key>Text</key> @@ -309,7 +333,13 @@ <key>Shape</key> <string>Rectangle</string> <key>Style</key> - <dict/> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> <key>Text</key> <dict> <key>Text</key> @@ -352,7 +382,13 @@ <key>Shape</key> <string>Rectangle</string> <key>Style</key> - <dict/> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> <key>Text</key> <dict> <key>Text</key> @@ -414,7 +450,7 @@ <key>MasterSheets</key> <array/> <key>ModificationDate</key> - <string>2015-02-16 04:18:10 +0000</string> + <string>2015-02-18 10:25:36 +0000</string> <key>Modifier</key> <string>sister_clown</string> <key>NotesVisible</key>
--- a/fig/sosikiTree.graffle Wed Feb 18 19:24:22 2015 +0900 +++ b/fig/sosikiTree.graffle Thu Feb 19 03:50:48 2015 +0900 @@ -14,7 +14,7 @@ <key>BackgroundGraphic</key> <dict> <key>Bounds</key> - <string>{{0, 0}, {1118, 783}}</string> + <string>{{0, 0}, {559, 783}}</string> <key>Class</key> <string>SolidGraphic</string> <key>ID</key> @@ -65,8 +65,8 @@ <integer>92</integer> <key>Points</key> <array> - <string>{141.1818215531753, 238.36362633577045}</string> - <string>{65.6363525390625, 284.40897802010983}</string> + <string>{192.5454690141128, 131}</string> + <string>{117, 177.04535168433938}</string> </array> <key>Style</key> <dict> @@ -104,8 +104,8 @@ <integer>91</integer> <key>Points</key> <array> - <string>{141.1818215531753, 238.36362633577045}</string> - <string>{204.09091731043881, 284.40901238268049}</string> + <string>{192.5454690141128, 131}</string> + <string>{255.45456477137631, 177.04538604691004}</string> </array> <key>Style</key> <dict> @@ -130,203 +130,8 @@ </dict> </dict> <dict> - <key>AllowLabelDrop</key> - <false/> - <key>Class</key> - <string>LineGraphic</string> - <key>Head</key> - <dict> - <key>ID</key> - <integer>19</integer> - </dict> - <key>ID</key> - <integer>90</integer> - <key>Points</key> - <array> - <string>{342.54549536552275, 238.36369209163928}</string> - <string>{342.54548775435433, 286.90899576135911}</string> - </array> - <key>Style</key> - <dict> - <key>stroke</key> - <dict> - <key>HeadArrow</key> - <string>0</string> - <key>Join</key> - <integer>0</integer> - <key>Legacy</key> - <true/> - <key>TailArrow</key> - <string>0</string> - </dict> - </dict> - <key>Tail</key> - <dict> - <key>ID</key> - <integer>16</integer> - <key>Info</key> - <integer>1</integer> - </dict> - </dict> - <dict> - <key>AllowLabelDrop</key> - <false/> - <key>Class</key> - <string>LineGraphic</string> - <key>Head</key> - <dict> - <key>ID</key> - <integer>20</integer> - </dict> - <key>ID</key> - <integer>89</integer> - <key>Points</key> - <array> - <string>{495.00000979585093, 238.36369643649766}</string> - <string>{494.99998257573901, 284.40902348613901}</string> - </array> - <key>Style</key> - <dict> - <key>stroke</key> - <dict> - <key>HeadArrow</key> - <string>0</string> - <key>Join</key> - <integer>0</integer> - <key>Legacy</key> - <true/> - <key>TailArrow</key> - <string>0</string> - </dict> - </dict> - <key>Tail</key> - <dict> - <key>ID</key> - <integer>15</integer> - </dict> - </dict> - <dict> - <key>AllowLabelDrop</key> - <false/> - <key>Class</key> - <string>LineGraphic</string> - <key>Head</key> - <dict> - <key>ID</key> - <integer>15</integer> - <key>Info</key> - <integer>2</integer> - </dict> - <key>ID</key> - <integer>88</integer> - <key>Points</key> - <array> - <string>{342.54549274759768, 99}</string> - <string>{495.00000979585093, 188.36369643649766}</string> - </array> - <key>Style</key> - <dict> - <key>stroke</key> - <dict> - <key>HeadArrow</key> - <string>0</string> - <key>Join</key> - <integer>0</integer> - <key>Legacy</key> - <true/> - <key>TailArrow</key> - <string>0</string> - </dict> - </dict> - <key>Tail</key> - <dict> - <key>ID</key> - <integer>12</integer> - <key>Info</key> - <integer>1</integer> - </dict> - </dict> - <dict> - <key>AllowLabelDrop</key> - <false/> - <key>Class</key> - <string>LineGraphic</string> - <key>Head</key> - <dict> - <key>ID</key> - <integer>16</integer> - </dict> - <key>ID</key> - <integer>87</integer> - <key>Points</key> - <array> - <string>{342.54549274759768, 99}</string> - <string>{342.54549536552275, 188.36369209163928}</string> - </array> - <key>Style</key> - <dict> - <key>stroke</key> - <dict> - <key>HeadArrow</key> - <string>0</string> - <key>Join</key> - <integer>0</integer> - <key>Legacy</key> - <true/> - <key>TailArrow</key> - <string>0</string> - </dict> - </dict> - <key>Tail</key> - <dict> - <key>ID</key> - <integer>12</integer> - </dict> - </dict> - <dict> - <key>AllowLabelDrop</key> - <false/> - <key>Class</key> - <string>LineGraphic</string> - <key>Head</key> - <dict> - <key>ID</key> - <integer>17</integer> - <key>Info</key> - <integer>2</integer> - </dict> - <key>ID</key> - <integer>86</integer> - <key>Points</key> - <array> - <string>{342.54549274759768, 99}</string> - <string>{141.1818215531753, 188.36362633577045}</string> - </array> - <key>Style</key> - <dict> - <key>stroke</key> - <dict> - <key>HeadArrow</key> - <string>0</string> - <key>Join</key> - <integer>0</integer> - <key>Legacy</key> - <true/> - <key>TailArrow</key> - <string>0</string> - </dict> - </dict> - <key>Tail</key> - <dict> - <key>ID</key> - <integer>12</integer> - <key>Info</key> - <integer>1</integer> - </dict> - </dict> - <dict> <key>Bounds</key> - <string>{{140.09091731043881, 284.40901238268049}, {128, 80}}</string> + <string>{{191.45456477137631, 177.04538604691004}, {128, 80}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>FontInfo</key> @@ -370,95 +175,7 @@ </dict> <dict> <key>Bounds</key> - <string>{{430.99998257573901, 284.40902348613901}, {128, 84.653045654296875}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>FontInfo</key> - <dict> - <key>Font</key> - <string>HiraKakuProN-W3</string> - <key>Size</key> - <real>12</real> - </dict> - <key>ID</key> - <integer>20</integer> - <key>Magnets</key> - <array> - <string>{0, 1}</string> - <string>{0, -1}</string> - <string>{1, 0}</string> - <string>{-1, 0}</string> - </array> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> - <dict> - <key>shadow</key> - <dict> - <key>Draws</key> - <string>NO</string> - </dict> - </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs24 \cf0 \'96\'f0\'8a\'84\'8b\'4c\'8f\'71\'97\'76\'91\'66}</string> - <key>VerticalPad</key> - <integer>0</integer> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{278.54548775435433, 286.90899576135911}, {128, 75}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>FontInfo</key> - <dict> - <key>Font</key> - <string>HiraKakuProN-W3</string> - <key>Size</key> - <real>12</real> - </dict> - <key>ID</key> - <integer>19</integer> - <key>Magnets</key> - <array> - <string>{0, 1}</string> - <string>{0, -1}</string> - <string>{1, 0}</string> - <string>{-1, 0}</string> - </array> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> - <dict> - <key>shadow</key> - <dict> - <key>Draws</key> - <string>NO</string> - </dict> - </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs24 \cf0 \'96\'f0\'8a\'84}</string> - <key>VerticalPad</key> - <integer>0</integer> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{1.6363525390625, 284.40897802010983}, {128, 80}}</string> + <string>{{53, 177.04535168433938}, {128, 80}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>FontInfo</key> @@ -502,7 +219,7 @@ </dict> <dict> <key>Bounds</key> - <string>{{77.181821553175297, 188.36362633577045}, {128, 50}}</string> + <string>{{128.5454690141128, 81}, {128, 50}}</string> <key>Class</key> <string>ShapedGraphic</string> <key>FontInfo</key> @@ -544,138 +261,6 @@ <integer>0</integer> </dict> </dict> - <dict> - <key>Bounds</key> - <string>{{278.54549536552275, 188.36369209163928}, {128, 50}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>FontInfo</key> - <dict> - <key>Font</key> - <string>HiraKakuProN-W3</string> - <key>Size</key> - <real>12</real> - </dict> - <key>ID</key> - <integer>16</integer> - <key>Magnets</key> - <array> - <string>{0, 1}</string> - <string>{0, -1}</string> - <string>{1, 0}</string> - <string>{-1, 0}</string> - </array> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> - <dict> - <key>shadow</key> - <dict> - <key>Draws</key> - <string>NO</string> - </dict> - </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs24 \cf0 \'96\'f0\'8a\'84\'83\'82\'83\'66\'83\'8b}</string> - <key>VerticalPad</key> - <integer>0</integer> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{431.00000979585093, 188.36369643649766}, {128, 50}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>FontInfo</key> - <dict> - <key>Font</key> - <string>HiraKakuProN-W3</string> - <key>Size</key> - <real>12</real> - </dict> - <key>ID</key> - <integer>15</integer> - <key>Magnets</key> - <array> - <string>{0, 1}</string> - <string>{0, -1}</string> - <string>{1, 0}</string> - <string>{-1, 0}</string> - </array> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> - <dict> - <key>shadow</key> - <dict> - <key>Draws</key> - <string>NO</string> - </dict> - </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs24 \cf0 \'96\'f0\'8a\'84\'8b\'4c\'8f\'71\'97\'76\'91\'66\'88\'ea\'97\'97}</string> - <key>VerticalPad</key> - <integer>0</integer> - </dict> - </dict> - <dict> - <key>Bounds</key> - <string>{{278.54549274759768, 49}, {128, 50}}</string> - <key>Class</key> - <string>ShapedGraphic</string> - <key>FontInfo</key> - <dict> - <key>Font</key> - <string>HiraKakuProN-W3</string> - <key>Size</key> - <real>13</real> - </dict> - <key>ID</key> - <integer>12</integer> - <key>Magnets</key> - <array> - <string>{0, 1}</string> - <string>{0, -1}</string> - <string>{1, 0}</string> - <string>{-1, 0}</string> - </array> - <key>Shape</key> - <string>Rectangle</string> - <key>Style</key> - <dict> - <key>shadow</key> - <dict> - <key>Draws</key> - <string>NO</string> - </dict> - </dict> - <key>Text</key> - <dict> - <key>Text</key> - <string>{\rtf1\ansi\ansicpg932\cocoartf1343\cocoasubrtf140 -\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} -{\colortbl;\red255\green255\blue255;} -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc - -\f0\fs26 \cf0 \'91\'67\'90\'44\'8f\'ee\'95\'f1\'83\'82\'83\'66\'83\'8b}</string> - <key>VerticalPad</key> - <integer>0</integer> - </dict> - </dict> </array> <key>GridInfo</key> <dict/> @@ -684,7 +269,7 @@ <key>GuidesVisible</key> <string>YES</string> <key>HPages</key> - <integer>2</integer> + <integer>1</integer> <key>ImageCounter</key> <integer>1</integer> <key>KeepToScale</key> @@ -724,7 +309,7 @@ <key>MasterSheets</key> <array/> <key>ModificationDate</key> - <string>2015-02-16 23:02:44 +0000</string> + <string>2015-02-18 18:42:31 +0000</string> <key>Modifier</key> <string>sister_clown</string> <key>NotesVisible</key> @@ -814,7 +399,7 @@ <key>SidebarWidth</key> <integer>120</integer> <key>VisibleRegion</key> - <string>{{10, 0}, {544, 768}}</string> + <string>{{0, 0}, {558, 783}}</string> <key>Zoom</key> <real>1</real> <key>ZoomValues</key>
--- a/slide/slide.html Wed Feb 18 19:24:22 2015 +0900 +++ b/slide/slide.html Thu Feb 19 03:50:48 2015 +0900 @@ -98,40 +98,25 @@ </div> <div> -<h1>研究目的</h1> +<h1>知的構造を格納するためのデータベース</h1> <p>我々が扱っている知識は木構造であることが多い</p> <p>RDBに木構造のデータを格納する際は表変換を行う必要があり、データ構造が煩雑になりやすい</p> -<p>当研究室では木構造をそのまま格納できる分散木構造データベースJungleの開発を行っている</p> -<p>当研究ではJungle上に組織の許認可管理アプリケーションmaTrixを実装しデータベースの表現力、機能の十分性、実用的な性能実証実験を行う</p> -<p></p> +<p>分散木構造データベースJungleの開発を行っている</p> +<p>Jungle上に組織の許認可管理アプリケーションmaTrixを実装する。</p> +<p>データベースの表現力、機能の十分性、実用的な性能実証実験を行う</p> </div> <div> <h1>分散木構造データベースJungle</h1> -<p>Jungleとは、並列信頼研で開発されているデータベース</p> <p>非破壊であるため、新しい木構造を作成することでデータの編集を行う</p> - <p style="text-align:center;"> - <img src="./images/non_destructive_tree_edit2.png"> +<p style="text-align:center;"> +<img src="./images/non_destructive_tree_edit2.png"> </div> -<div> -<h1>非破壊的木構造の利点</h1> -<p>非破壊的木構造は通常の木構造である破壊的木構造に比べ、以下のような利点を持つ</p> -<ul> -<li>一度作成したデータは変更されない</li> -<li>データが変更されないため自由にコピーを作ることができる(いつでも読み込みが可能)</li> -<li>ロックがすくない。ロックが必要なのは最新のルートノードを登録するときだけ</li> -</ul> -<p>ロックが少なく、いつでもコピーが可能なことから、非破壊的木構造はスケーラブルなシステムに有用となる</p> -</div> - - <div> <h1>組織の中の許認可管理アプリケーションmaTrix</h1> -<p>maTrixとはSymphony社が開発しているアカウント管理、許諾判定システム</p> <p>人、組織、役割等の情報を木構造として保持しており、Idでお互いに参照し組織構造を表現している</p> -<p>またそれらの組織構造は構成情報という名前で版管理されている。</p> <p>許認可の判断は、ポリシーファイルに記述されたルールにそって行われる</p> <p>ポリシーファイルは組織構造を参照するため木に対する参照機能が必要になる</p> </div> @@ -179,38 +164,8 @@ <div> <h1>Jungle上でのmaTrixのデータ構造の表現</h1> <p>以下のXMLは、maTrixの人物Treeの一部である。</p> -<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> -<Persons> -<br>  <Person id="p:1" type="Person"> -<br>    <PersonData></PersonData> -<br>  </Person> -<br>  <Person id="p:2" type="Person"> -<br>    <PersonData></PersonData> -<br>  </Person> -<br></Persons> -</div> <p style="text-align:center;"><img src="./images/TreePersonJungle.png"> -<p>この様にJungleでは木構造のデータを読み込み、木同士の参照はIdの検索を用いて表現する。</p> -</div> - -<div> -<h1>組織構造の版管理</h1> -<p>maTrixは、組織構造を構成情報モデルとして表現し版管理している。</p> -<p>構成情報モデルはversion毎に存在し、各versionに対応した組織構造を構成する木構造の集合を保持している。</p> - <p style="text-align:center;"> - <img src="./images/maTrixVersion1.png"> -<p style="text-align:center;"> - <img src="./images/maTrixVersion2.png"> -<p>maTrixは全ての変更を構成情報として保持し、いつでもアクセス可能である。</p> -</div> - -<div> -<h1>Jungle上での組織構造の版管理</h1> -<p>JungleのTreeは、全てのversionのTreeで単一なrevisionIdを保持しているため、過去のTreeにアクセスするためには、revisionIdを保持していればアクセスできる。</p> -<p>それを利用し、Jungle上での過去の変更履歴を保持する構成情報モデルの表現は、構成情報モデルのversionと、各Treeのversionを保持し、関連付ける構成情報モデルTreeを作成し表現した</p> -<p style="text-align:center;"> -<img src="./images/configTree.png"> -<p>アクセスしたいversionのノードから対応するTreeのrevisionIdを取得し、そのIdに対応するTreeにアクセスすれば良い。</p> +<p>この様にJungleでは木構造のデータを読み込む。</p> </div> <div> @@ -227,14 +182,31 @@ <li>ポリシーファイルを元に、データにアクセスを行い許可を与えるかどうかを判断する。</li> </ul> -<p>Jungleはデータベースであるため、許認可判断を行うためにはデータを参照する関数を実装すれば良い</p> +</div> + +<div> +<h1>maTrixの組織構造表現例</h1> +<p>木同士の参照はIdの検索を用いて表現する</p> +<p style="text-align:center;"> +<img src="./images/sosikiTree.png"> +<p>例えば人物Treeと組織Treeがお互い参照を行い組織運用モデルを表現している。</p> + </div> +<div> +<h1>Idを使った木の相互参照</h1> +<p>Treeの検索は、Traverserを使用する</p> +<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> +InterfaceTraverser traverser = tree.getTraverser(boolean useIndex); +</div> +<p>TreeからgetTraverserで取得可能。</p> +<p>第一引数で 探索を行う際にIndexを使用するかどうかを選択できる。</p> + +</div> <div> -<h1>検索機能の実装</h1> -<p>maTrixの組織構造を表現する為には、Idでの検索機能が必要であるため実装を行った。</p> -<p>JungleのTreeに対する検索は、java8の新機能であるlambda式を用いてfind関数を実装した。lambda式を使用することで、匿名クラスを使う時より簡潔にコードを記述できるようになった。</p> +<h1>Idを使った木の相互参照2 </h1> +<p>Traverser.findでTreeに対して検索を行う。</p> <div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> public Iterator<TreeNode> find(Query query,String key, String searchValue); </div> @@ -250,74 +222,36 @@ </div> </div> + <div> -<h1>find関数の使い方と流れ</h1> - -<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> -Iterator<TreeNode> pairPersonIterator = traverser.find((TreeNode node) -> { -<br> String element = node.getAttributes().getString("element"); -<br> if (element == null) -<br> return false; -<br> if (element.equals("Person")) -<br> return true; -<br> return false; -<br>}, "element", "Person"); -</div> - -<li>find関数の処理の流れは、まず、第2、第3引数のString key,String valueを用いて、これらの値に対応したIndexが登 -録されているかを調べる。Indexがある場合はIndexを使用し値を返す。Indexがない場合は、Treeから深さ優先でTreeNodeを取得していく。</li> -<li>TreeNodeを取得したら、boolean Query.condition(TreeNode)を実行する。このconditionは実際にfindを使用する際にlambda式で記述する。</li> -<li>conditionの中では、TreeNodeのAttributeに対してgetを行い探索対象のデータをTreeNodeが保持しているかを調べる。データを持っていた場合はTrueを、持っていなかった場合はFalseを返す</li> -<li>conditionの返り値が、Trueだった場合取得したTreeNodeを返す。Falseだった場合は次のTreeNodeを探索します。</li> - <p style="text-align:center;"> - <img src="./images/DepthFirstSearch.png"> +<h1>Indexの実装</h1> +<p>Jungleは過去のTreeを全て保持しているため、Treeのversion毎にIndexを持っている必要がある。</p> +<p>FunctionalJavaのTreeMapを使用してIndexの実装を行った</p> +<p>データの更新が行われた際に、一度作られたIndexに対して更新を行わず、新しいIndexを構築する。</p> +<p>その際、過去のIndexを最大限共有している。</p> +<p>メモリの使用量を抑えつつ複数のversionでIndexを保持できる。</p> </div> <div> -<h1>Indexの実装</h1> -<p>Jungleの探索はTreeを全探索するので、探索の計算量はO(n)である。</p> -<p>Indexを使用することで効率よく探索を行えるようにする。</p> -<p>Jungleは過去のTreeを全て保持しているため、Treeのversion毎にIndexを持っていることが望ましい。 -そこで、メモリの消費量を抑え、各versionのTreeにIndexをもたせる方法として、FunctionalJavaのTreeMapを使用したIndexの実装を提案する</p> -<p>FunctionalJavaのTreeMapは、データの更新が行われた際に、一度作られたTreeに対して更新を行わず過去のTreeを再利用し、更新後のTreeMap新しく返すため、メモリの使用量を抑えつつ複数のversionでIndexを保持できる。</p> -</div> - - -<div> -<h1>Indexの実装2</h1> -<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> -TreeMap<String key,TreeMap<String value,List<TreeNode>>> -</div> -<p>最初のTreeMap<String key,TreeMap>はIndexを格納するTreeMapである。</p> -<p>このTreeMapに対しkeyでgetを行うと、keyに対応するIndexが登録されている場合、Indexを取得できる。</p> -<p>取得したIndexに対しvalueでgetを行うと、valueの値を持つNodeのListが返ってくる。</p> -</div> - -<div> <h1>ParentIndexの実装</h1> -TreeNodeでgetを行うと、親Nodeを返すParentIndexを実装した。 -<div style="padding: 10px; margin-bottom: 10px; border: 1px solid #333333;"> -TreeMap<TreeNode,TreeNode> -</div> -<p>TreeのNodeの編集には、編集を行いたいNodeへのPathが必要である。</p> -<p>ParentIndex実装前は、Indexを使って検索したNodeを編集するために返り値はList<Pair<TreeNode,NodePath>>になっていた。</p> -<p>JungleのNodeへのPathは不変ではない</p> -<p>よってTreeに変更が加わる度にIndexの中のPathを更新する必要があり、そこがネックだった</p> -<p>ParentIndexを実装することでTreeNodeさえあれば、Pathが取得できるようになった。</p> -</div> - -<div> -<h1>過去のTreeに対するアクセス</h1> -<p>Treeは、version毎に固有のrevisionIdを持っている</p> -<p>アクセスしたいTreeのrevisionIdを引数に取り、対応する過去のTreeを返すgetOldTree(long)を実装した。</p> +<p>maTrixで許認可を判断する際に、木構造の親を辿って検索を行う必要がある。</p> +<p>TreeNodeでgetを行うと、親Nodeを返すParentIndexを実装した。</p> +<p>以下に親を辿る検索を行う例を記す。</p> +<ul> +<li>Aさんが、maTrixに工学部の学生にのみ貸出を行っている書籍の貸出許可を求める。</li> +<li>Aさんの所属している組織の情報を取得する(情報工学科)。</li> +<li>情報工学科の親の情報を取得する(工学部)。</li> +<li>Aさんは工学部に所属しているため本の貸出を許可する。</li> +</ul> +<p>3番目の処理でParentIndexを使用する。</p> </div> <div> <h1>XACMLInterpreter</h1> -<p>データの参照関数と、組織構造の表現が出来たため実際にポリシーファイルを読み込んで許認可判断を行いたい</p> -<p>ポリシーファイルを読み込んでJungleのデータを参照し、許認可を判断するInterpreterを実装した</p> +<p>Jungle上での許認可判断は、組織構造の参照とポリシーファイルを使用して許認可判断を行う。</p> +<p>ポリシーファイルを読み込んで</p> <p>これで実際にJungleの上で許認可判断が行えるようになった</p> </div>