view maTrix.tex @ 18:e81a5eb2a60f

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 10 Nov 2016 20:20:05 +0900
parents 36f400a632c1
children 27f92e7af1fc
line wrap: on
line source

\section{許認可管理アプリケーション\\maTrix}
Jungle Treeブラウザを実装した後、Jungle上に実際に企業で運用されている許認可管理アプリケーションmaTrixを実装し、データベースとしての表現力、機能の十分性、実用的な性能があるか、実証実験を行なった。

maTrixは、人、役職、役割、権限、組織等の木構造のデータとポリシーファイルを持つ。maTrixの組織構造はデータ同士がidを用いた参照を行うことで表現される。また組織構造は版管理されている。
ポリシーファイルは、データに対するアクセス要求が許可されるか否認されるかを判断するためのルールを誰が(Target)、何を(Resource)、どうできるか(Action)の3つの要素で記述されている。maTrixはアクセス要求に応じたポリシーファイルを参照することで許認可の判断を行う。
ポリシーファイルは組織構造中の人や役職をidを用いて参照している。つまり、ポリシーファイルを用いて許認可を下すためには、その人がどこの組織に所属して。その役割がどの権限を持っているかを返す検索が必要になる。
本章ではmaTrixをJungle上に実装する際の問題点、解法について記述する。

\subsection{Jungle上でのmaTrixデータ構造の表現}
maTrixの人、組織、役割、権限等のデータ構造は木構造なので、Jungleの木構造にそのままマッピングできる。
実際のmaTrixのデータ構造の一部を格納したJungleTree(図\ref{fig:PersonTree})を以下に記す。

\begin{figure}[h]
\begin{center}
\includegraphics[height = 7cm , bb=0 0 398 367]{images/TreePersonJungle.pdf}
\caption{Jungle上での人物Treeの表現例(1)}
\label{fig:PersonTree}
\end{center}
\end{figure}

また、maTrixは自身のデータをXML形式で書き出すことが可能である。書き出したデータをJungleに格納するためにXMLReaderの実装も行った。

\newpage
\subsection{Indexの実装}
% Jungleに含まれる複数の木のノードを相互参照したい
% 木のノードにIDを割ふってIndexを用いて参照する
Jungle上でのmaTrixの組織構造の表現は、木のNodeにIdを割り振ってIndexを用いた参照で表現する。
しかし、JungleにはIndexが無かったため実装を行った。
Jungleは過去の版の木構造を全て保持しているため、全ての版に独立したIndexが必要となる。
そのため、Indexを破壊すること無く更新する必要があった。
よって、非破壊TreeMapを自作し、それを用いてIndexの実装を行った。
このTreeMapは、データの更新を行った際、前の版と最大限データを共有した新しいTreeMapを作成する。
これにより複数の版全てに対応したIndexをサポートすることが可能になった。
以下にJungleにおけるIndexの型を記述する

\begin{lstlisting}[frame=lrbt,label=index,numbers=left]
TreeMap<String key,TreeMap<String attribute,
  List<TreeNode> node> index> indexMap
\end{lstlisting}

JungleのIndexはIndexMap内に保持されている。
属性名でIndexMapにgetを行うと、対応したIndexが取得できる。
その取得したIndexに属性値で検索を行うと対応したノードのリストが返ってくる。


\subsection{検索APIの実装}
Indexを実装したことにより、Idを用いた組織構造の表現は可能になった。
しかし、組織構造に対する問い合わせを行うための検索APIが実装されていなかったため、属性名:属性値で検索を行うAPIの実装をlambda式を用いて行った。
以下に検索を行う関数findの定義を記述する。
\begin{lstlisting}[frame=lrbt,label=query,numbers=left]
public Iterator<TreeNode> find(Query query, 
               String key, String searchValue);
\end{lstlisting}

find関数は引数にQuery、String key、String valueの3つの引数を取り、条件に一致したNodeのIteratorを返す。
第1引数には、探索の条件を記述する関数boolean comdition(TreeNode)を定義したInterface Queryを。
第2、第3引数の、String key、String valueはIndexを用いた絞込みに使用する。find関数の使用例を以下に記す

\begin{lstlisting}[frame=lrbt,label=find,numbers=left]
InterfaceTraverser traverser 
= tree.getTraverser(true);
Iterator<TreeNode> resultNodeIterator 
= traverser.find((TreeNode node) -> {
    String personId = 
    node.getAttributes().getString("Personid");
    if (personId == null)
      return false;
    if (personId.equals("p:4"))
      return true;
    return false;
    }, "element", "person");
\end{lstlisting}

上記コードについて解説する。
\begin{enumerate}
\item Treeの走破を行うTraverserを取得する。

\item Indexからfindの第2、第3引数である、element、personの組のデータを持つNodeを取得する。

\item 2で取得したNodeを第1引数のQueryに渡す(以下Query内の解説

\item 引数のノードからgetAttributes().getString("Personid")で属性名がPersonidの属性値を取得する。

\item 属性値がnullだった場合、このNodeには属性名がPersonidの組のデータは存在しないのでfalseを返し次のNodeの評価を行う。

\item 属性値がnullでなかった場合、p:4と一致するかどうかを調べ結果を返す。

\end{enumerate}

findはQueryと条件が一致したNodeのIteratorを返す。

\subsection{Nodeの親をたどるIndex}
maTrixがJungleに検索を行う際に親をたどる処理が必要になったが、Jungleは親から子への単一リンクしか持っていなかった。
しかし、Jungleは非破壊という性質上、子に親への参照をもたせることが難しいため、Nodeを渡すと親Nodeを返すParentIndexを実装した。


% \subsection{性能測定}
% maTrixの実装後、Jungleに実用的な性能があるか確かめるために測定を行った。
% 比較対象にはMongoDBを選択した。
% 図\ref{fig:compare}はmongoDBとJungleの速度比較のグラフである。
% 比較は10000人分のデータに対するアクセスの処理時間で行い、mongoDBへのアクセスはjsを用いて行った。
% \begin{figure}[h]
% \begin{center}
% \includegraphics[height = 5cm , bb=0 0 360 252]{images/mongoJungleperfomance.pdf}
% \caption{mongoDBとの比較}
% \label{fig:compare}
% \end{center}
% \end{figure}

% Jungleは、mongodbの約500倍の性能が出ている。
% その理由として、mongoDBがmmapを用いてディスクのデータにアクセスしているのに対し、Jungleは全てのデータがメモリ上にあること。
% また、mongoDBは通信を介してアクセスされるが、Jungleは通信を介さないためだと考えられる。