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