...

XooNIps

by user

on
Category: Documents
36

views

Report

Comments

Description

Transcript

XooNIps
XooNIpsプラットフォーム
基盤システムの実装と拡張
理化学研究所
脳科学総合研究センター
神経情報基盤センター
奥村 嘉宏
2015年7月16日 Brain Atlas Hackathon 2015 –ブレインアトラスアイデアソン
XooNIps とは
• インターネット上で多様な電子データ(ファイル,URL,書籍・論文
等)をメタデータと供に共有を図るためのWebデータベース基盤シ
ステム
運用ポリシー設定
XooNIps 概観
詳細表示
一覧表示
ファイルダウンロード
2
システム概要
検索・閲覧
検索・閲覧
インデックスツリー
編集
アカウントを持つユーザ
データの登録・公開を行う
登録ユーザ
アイテム
登録・編集
外部DB
メタデータ交換
個人利用
データ公開
共有承認
公開承認
• インデックスツリー
• アイテム情報
• 電子ファイル
自動生成
メタデータ情報
自動生成
ランキング情報
検索・閲覧
研究者情報
インデックスツリー編集
検索・閲覧
グループ共有
システム設定
グループ共有領域
グループ共有領域
• インデックスツリー
グループ共有領域
• インデックスツリー
• アイテム情報
• インデックスツリー
• アイテム情報
• データファイル
• アイテム情報
• データファイル
• 電子ファイル
ユーザ情報
アカウント情報編集
アカウント申請
アカウント承認
• アカウント情報
• グループ情報
グループメンバー管理
グループ管理
ゲスト
システム情報
インポート
エクスポート
• サイトポリシー
• アクセスログ
ユーザ管理
インデックスツリー編集
アクセスログ解析
グループ
管理者
グループ共有情報
を管理する
通常のユーザ
データを閲覧する
生成
アイテム共有
公開領域
アイテム公開
自動
個人領域
個人領域
• インデックスツリー
個人領域
• インデックスツリー
• アイテム情報
• インデックスツリー
• アイテム情報
• データファイル
• アイテム情報
• データファイル
• 電子ファイル
モデレータ
サイト全体の
システムの設定を行う
サイトポリシー
設定
システム
管理者
公開する情報やサイトの
ユーザ情報を管理する
3
XOOPS Cube Legacy ベース
• システム構築・運用コストの削
減
– 無償利用可能なオープン
ソースソフトウェア
• 容易な機能拡張
– XOOPS の既存モジュールと
組み合わせて多種多彩なサ
イトを構築可能
• デザインの変更
– XOOPS のテーマを変更する
ことでレイアウトなどの概観
を自由に変更可能
Web browser
XOOPS
General
Modules
User Interface
Item type
XooNIps
Module
Web
Application
Legacy (XOOPS互換レイヤー)
XOOPS Cube
PHP
Apache
RDBMS (MySQL)
Database
Data
4
XooNIps と XOOPS Cube Legacy
• XooNIpsはXOOPS Cube Legacy(XCL)というCMSの上に実装されたモ
ジュール
• XooNIpsを導入することにより追加される機能
–
–
–
–
–
ユーザ管理機能を拡張
メタデータとファイル管理
インデックスによる整理とアクセス権の制御
承認のためのワークフロー
外部システム連携のためのAPIなどなど
• 最新版では、上記を基盤となるXCLの仕組みを活用して機能ごとに複
数のモジュールに分割して実装
• 一つの見方として、XooNIpsとは上記の機能を持つCMSであると捉えて
もらったほうがわかりやすいかも。
プラットフォーム基盤システム XooNIps
≒ XCL + XooNIps機能追加モジュール群
5
ここでは XOOPS Cube Legacy
の仕組みを中心に紹介
• XooNIps の機能を実装する上で XCL の仕組
みは重要
• Webブラウザで操作できる機能にはあまり触
れずにその裏側を覗き見る
6
XOOPS Cube Legacy
7
主なディレクトリ構成
•
html/: Webからアクセスできる領域
–
–
–
–
–
–
–
index.php: サイトトップ
mainfile.php:サイト設定ファイル
theme/:サイトテーマ
images/, uploads/ common/, js/ : 静的データ用フォルダ
kernel/, include/, language/: XOOPSシステム関連フォルダ(XOOPS互換性のために残存)
core/, preload/: XOOPS Cube システム関連フォルダ
modules/: モジュール群
•
•
•
•
•
legacy/, legacyRender/, stdCache/, user/:Legacy XOOPS互換レイヤー実体
profile/, message/ : Legacy で追加されたモジュール
html側にはブラウザで直接
xoonips/ : XooNIps モジュール
xworkflow/ : 承認ワークフロー
アクセスするファイルのみ配置
rest/ : XooNIps REST API
– (その他割愛)
•
xoops_trust_path/: Webから直接アクセスできないところ
– cache/, libs/, settings/, templates_c/ :システム関連ファイル (XCL 2.2~)
– modules/: モジュール群(XOOPS_TRUST_PATH対応モジュールの本体を配置)
•
•
•
xoonips/ : XooNIps モジュール本体
xworkflow/ : 承認ワークフロー本体
rest/ : XooNIps REST API 本体
– (その他割愛)
アクセスされたら xoops_trust_path
側の本体を呼び出す
8
サイトテーマ
• サイト全体の配置やCSSなどのデザインを決める
–
–
–
–
–
左カラム
中央カラム(中央)
中央カラム(左)
中央カラム(右)
右カラム
各モジュールの機能単位
の全ての出力は並び順
と共にいずれかに属す
左カラム
中央カラム
右カラム
中央
左
右
• html/themes/ 以下に配置し、設定画面から利用する
テーマを選ぶ。
9
モジュールテンプレート
• モジュールの画面出力の際の見た目を定義
– テンプレートの仕組みを利用するか否かはモジュールの実装
による。
• 機能の出力やさらにその構成要素単位で存在
– html/modules/{MODNAME}/templates/*.html
• モジュールインストール時にDBの中にdefaultテンプレート
セットとして複製される
– 独自のテンプレートセットを作成可能で、設定画面から利用す
るテンプレートセットを選択できる
– 管理画面からDBに複製された各テンプレートを編集できる
• テンプレートファイル本体を書き換えなくてもよい。
• XoopsTpl : Smarty エンジンの派生クラスで実装
– テンプレートの中に PHP のコードを埋め込めるので、レンダリン
グの際に独自の処理を実行可能…
10
データの永続化 XOOPS
•
DataMapperパターン
– モデル(データ)とデータベースの間をとりなす仕組み
•
XoopsObject:モデル基底クラス
– 一連のデータの名前、型、属性(必須、データ長など)、値などを保持
– get(), set() で値を出し入れ
Name
Type
– 継承して各モデルを扱うクラスを定義
uid
INT
•
XoopsUser, XoopsGroup, XoopsMembership など
uname
STRING
Required
Length
Value
true
10桁
1
true
32文字
admin
・・・
•
XoopsObjectHandler:マッパー基底クラス(実質インターフェースのみ)
– データベースと XoopsObject を結びつける
– create(), get(), insert(), delete() で出し入れ
– 継承して上記モデルを操作するマッパークラスを定義
•
XoopsUserHandler, XoopsGroupHandler など
11
データの永続化 XOOPS Cube Legacy
互換性のために古いORMは残す
モデルとDB内テーブルを1:1で結びつける際の
典型的なSQL処理を基底クラスとして実装する
ことで派生クラスの実装を容易かつ安全に。
12
データの永続化 サンプルコード
• 例えば…ユーザ管理
– 管理番号1番のアカウントID(uname)と表示名
(name)を取得
$userHandler = xoops_gethandler(‘user’);
$userId = 1;
$userObj = $userHandler->get ($userId);
$uname = $userObj->get(‘uname’);
$name = $userObj->get(‘name’);
user を操作するマッパーハンドラを取得
– ユーザの名前を変更
$userObj->set(‘name’, ‘神経基盤 太郎’);
$userHandler->insert ($userObj, true);
通常POSTの時しかDBに書き込めないが
true だとGETの時にも強制的に書き込む
userObj にDB内のユーザテーブルの主キーとなる
管理番号が指定されているため insert () は
13
新規追加ではなくて更新処理となる。
Action Frame
• Action Formを統一的にコントロールするMVCな仕組み
– 例: html/modules/user/index.php
1.
2.
3.
4.
5.
①
②
③
④
⑤
システムの初期化
ActionFrame を生成
ActionFrame に実行したい処理名(アクション)を設定
XOOPS Cube の MVC コントローラに登録
XOOPS Cube の MVC コントローラ実行
require_once "../../mainfile.php";
require_once XOOPS_ROOT_PATH . "/header.php";
require_once XOOPS_MODULE_PATH . "/user/class/ActionFrame.class.php";
$root =& XCube_Root::getSingleton();
$actionName = isset($_GET['action']) ? trim($_GET['action']) : "UserList";
$moduleRunner = new User_ActionFrame(false);
$moduleRunner->setActionName($actionName);
$root->mController->mExecute->add(array(&$moduleRunner, 'execute'));
$root->mController->execute();
require_once XOOPS_ROOT_PATH . "/footer.php";
14
Action Frame
①
execute 動作概念 ②
1.
2.
3.
4.
5.
6.
7.
8.
9.
操作対象となるオブジェクトを用意
設定された処理名(アクション)に対
応するAction Formの準備
DB内の既存のデータをオブジェクト
へ読み込み
GETだったら入力フォームを表示
POSTだったら前のページから送信さ
れたデータを取得
取得したデータをチェック
エラーだったら入力フォームをエラー
内容と一緒に表示
エラーでなければ、取得した値をオ
ブジェクトに反映
オブジェクトをDBに保存
③
⑤
⑥
④
⑦
⑧
⑨
15
Action Frame って XooNIps では…
• 旧版: 3.4系
– Action Frameを使ってない…
– html/modules/xoonips/ 以下の各ファイルでDB読み
込み、フォームリクエスト値取得、条件分岐、表示等
のプロシージャをそれぞれ実装
• 新版: 4.0系
– 一部の処理は Action Frame 化
• xoops_trust_path/modules/xoonips/actions,
xoops_trust_path/modules/xoonips/admin/actions以下に
ActonFormをそれぞれ実装
– その他、処理実体をクラス化してあるものの、やって
いることは3.4系と似たような動作…
16
プリロード
• mainfile.php 内のシステム初期化プロ
セス途中(common 処理実行時)に呼
び出される(右リスト)。
• 自動的にプリロードファイルが読み込
まれ、特定のタイミングで実行される。
– 読み込み直後: preFilter
– データベース起動後: preBlockFilter
– 初期化の最終段階:postFilter
• 大別して2種類
– サイトプリロード:システム全体で利用
可能
html/preload/
– モジュールプリロード:モジュールが有
効な時のみ
html/modules/{MODULE}/preload/
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
サイトプリロードの読み込み
preFilter の実行
エラーハンドラの初期化
全体の環境の初期化
ロガーの初期化
データベースへの接続
言語の初期化
テキストフィルタの初期化
一般設定の初期化
htmlヘッダ等のスクリプト初期化
デバッガの初期化
インターフェイスクラスの読み込み
モジュールプリロードの読み込み
preBlockFilter の実行
セッションの初期化
ユーザの初期化
モジュールの初期化
postFilterの実行
17
プリロード 例:
特定の接続元のログインを遮断
• html/preload/DenyLoginFromNIJC.class.php
<?php
class DenyLoginFromNIJC extends XCube_ActionFilter {
public function postFilter() {
$userId = Legacy_Utils::getUid();
if ($userId != UID_GUEST &&
$_SERVER["REMOTE_ADDR"] == "134.160.172.20")
die("Go away!");
}
}
18
デリゲート
• 特定の処理実行の一部を他のプログラムに
委譲するための仕組み
– 特定のイベントのフックと実行
$delegate = new XCube_Delegate();
$event = ‘MyDelegate.Hook.Event’;
$delegate->register($event);
$callbackFunction = function() {
// something to do..
};
$root = XCube_Root::getSingleton();
$root->mDelegateManager->add($event,
$callbackFunction,
XCUBE_DELEGATE_PRIORITY_FIRST);
$delegate->call();
① イベントの登録
② イベントへのコールバック
関数の登録
(実行優先度最高)
③ イベントの実行
19
プリロードとデリゲート
• XCLで利用されている登録済みイベントは100以上!
– 右表:ほんの一例
• プリロード実行時
– preBlockFilter等
– コールバック関数登録
• メイン処理実行時
– イベント登録(遅延登録)
– イベント呼び出し
• モジュール間を渡る処理の連携
– 疎な結合
Legacypage.Register.Access
Legacypage.Search.Access
Legacypage.Top.Access
Legacypage.User.Access
Legacypage.Userinfo.Access
Legacypage.Viewpmsg.Access
Site.CheckLogin
Site.CheckLogin.Fail
Site.CheckLogin.Success
Site.JQuery.AddFunction
Site.Logout
Site.Logout.Fail
Site.Logout.Success
…
20
デリゲート利用例:承認機能
XooNIps
登録
Private 領域
公開申請
ユーザ
Public / Group 領域
承認
モデレータ
グループ管理者
• XCL 2.2 で進捗管理のためのデリゲートインター
フェースが定義
–
–
–
–
–
Legacy_Workflow.AddItem : 新規に承認タスクを追加
Legacy_Workflow.DeleteItem : 登録されている承認タスクを削除
Legacy_Workflow.GetHistory : 承認履歴を取得
Legacy_WorkflowClient.GetClientList : 待ち受けたいワークフロー種類一覧を返す
Legacy_WorkflowClient.UpdateStatus : 対象のワークフローの状態を更新
21
承認機能:Xworkflowモジュール
• 承認機能を実現するモジュール
– 対象ワークフロー別に承認者を多段で設定可能
• XooNIpsにおける対象ワークフロー
– ユーザ承認,アイテム公開,アイテム公開取り下げ
– グループ作成,グループ削除,グループ公開
– グループ参加,グループ脱退,など
• 承認者
– 特定のユーザ
– グループ
– グループ管理者
• 多段承認ステップ
• 標準インターフェースの実装なためXooNIps以外
のワークフローでも管理可能
22
承認機能:申請から承認まで
② 公開インデックスに登録
(Pending状態)
⑧ 状態ステータスを「公開」に
④ ③の内容をタスク一覧へ登録。
進捗管理開始
⑥ 審査結果を履歴に追加。
全員の審査が完了したら⑦へ
③ デリゲート実行/タスク登録
Legacy_Workflow.AddItem
Xworkflow
XooNIps
⑦ デリゲート実行/状態更新
① アイテムを
公開インデックス
へ登録
公開申請
ユーザ
Legacy_WorkflowClient.UpdateStatus
⑤ 査読・審査
承認
モデレータ
グループ管理者
23
まとめ
XooNIpsサイトを拡張するためには
• XOOPS Cube Legacyの仕組みを知れば意外と拡張方法が
豊富なことに気付く…
– テンプレートで機能要素単位の見た目を変更
– デリゲート使えば簡単に特定の処理だけをフックできる
– プリロードはどこからでも呼ばれるので何でもできる
• 実際にXooNIpsではユーザ管理機能を拡張するために、標準のuser
モジュールの管理画面の一部をこれで乗っ取っている
オリジナルのソースコードを改変しなくても済む
• XooNIpsは発展途上
– 全てが ActionFrame で綺麗に実装されているわけではないが、
アクションを新規追加するのは簡単(かも)。
• 新しくアクション用ファイルを追加して配置すればいい。
– 新バージョンは動作実績が少ないので人柱が欲しい。
24
引用元・参考文献など
1.
XOOPS Cube Legacy デベロッパーズバイブル
– Marijuana(宇津木おさむ)、chatnoir(内水はるか),2007,ソフトバンククリエイ
ティブ
2.
XOOPS Cube Legacy でつくる最強のCMSサイト
– 鈴木宗人, 2008, ソーテック
3.
XOOPS Cube 日本公式サイト
– http://xoopscube.jp/
4.
XOOPS Cube @ WikiPedia
– https://ja.wikipedia.org/wiki/XOOPS_Cube
5.
XOOPSのデータ永続化アーキテクチャの概要
– http://qiita.com/suin/items/766c91cf21d903e73aa6
6.
XOOPSの起動処理順序
– http://qiita.com/suin/items/1c288d396b48699dae2b
7.
XOOPS Cubeのプリロードとデリゲートの解説
– http://qiita.com/suin/items/6859401972c568056694
25
ありがとうございました
26
Fly UP