Ads

ZunWiki とは

新しい Wiki クローンを作ろうかと。

動機

  • 今まで PukiWiki 使ってたんだが不満が多い
    • 作者がもう PukiWiki やる気ないらしい
    • 欲しい機能(プラグイン)が足りない
      • でもプラグインの作成が面倒(php 好きじゃないので)
    • プラグイン(PukiWiki 本体に手を入れない範囲)で出来ることが限られている
    • php5 で動かない
    • php があんまり好きじゃない
      • php のバージョンに振り回されたりするのが嫌とか
  • 自分で作るのも面白そう

./こんなのにしたい

TODO ぽくなってきた

設計中

./ディレクトリ構成

こんな感じのを考え中

./URLマッピング

  • デフォルトサーブレットを使ってページ名そのままでアクセスできるように

プラグインの取得と実行

プラグインの取得と実行には大きく分けて2パターンある。

  1. ページ内に &color(red){赤い文字}; のように記述して実行されるパターン
  2. http://example.jp/hoge?plugin=edit のような形で呼ばれて doGET や doPOST 等を実行するパターン

前者は恐らく Page.getContents() メソッド内部で呼ばれて、後者は ControlPlugin がプラグインの取得と実行を行う。

プラグインの取得は次のような形で行われる。

Plugin plugin = PluginManager.getPlugin(pluginId);
  • pluginId は "color" や "edit" 等のプラグイン名を示す文字列。
  • ここで返されるのは実際は Plugin の実装クラスそのものでは無く、キャッシュなどの目的で実装クラスの寿命などを管理する PluginWrapper クラスになる予定。
    • (まぁ、内部実装の問題なのでプラグインを利用や実装する人は気にしなくて良い)

埋め込みプラグインの実行は次のようにして行われる。

plugin.render(〜);
  • レンダリングメソッドの名前や引数の仕様はまだ未決定(^^;
  • プラグインに中身を書かせるか、戻り値でプラグイン部分を返させるか、仕様がまだ未決定(^^;

HTTPリクエストの応答プラグインは ControlServlet により次のような形で呼ばれる。

//GETの場合
plugin.doGET(wikiRequest);
  • wikiRequest には getPage、getHttpResponse、getHttpRequest 等のメソッドが用意されている。
  • プラグインは doGET 等の内部で wikiRequest.setResponded(true); とすることで、既にブラウザへのレスポンスは返したよと ControlServlet に伝えることが出来る。
    • ControlServlet は plugin.doGET(wikiRequet) を実行した後、wikiRequest.isResponded() を見てレスポンスを返してなければスキンにレスポンス処理をさせるなどをする。

スキンの選択と実行

ControlServlet は次のような感じにスキンを取得して実行する。

Skin skin = SkinSelector.getSkin(wikiRequest);
skin.doSkin(wikiRequest);
  • SkinSelector.getSkin(wikiRequest) は User-Agent 等からどのスキンを使うか判断する。
    • wikiRequest には getHttpRequest や getPage などのメソッドが用意されている。
    • Page毎にスキン指定の設定が出来たりクッキーやパラメータでスキン指定が出来る SkinSelector の実装もアリだと思う。
    • SkinSelector 内部では SkinManager.getSkin(skinId) でスキンの実装を取得する。
      • SkinManager.getSkin(skinId) の仕様は PluginManager#getPlugin とほぼ同じで、skinId はスキン名を表し、取得できる Skin オブジェクトも実際は SkinWrapper のインスタンスだったりする。
  • skin.doSkin(wikiRequest) は各スキンの実装に任されるが基本的に中でやることは wikiRequest.getPage().getContents() でページコンテンツを取得して、wikiRequest.getHttpResponse() でブラウザへのレスポンスを返すこと。

技術メモリンク

  • Java関連
    • Embedding Groovy - Java アプリケーションへの groovy の埋め込み方
      • プラグインは GroovyClassLoader を使う方法を採用することになると思われ。この方法でインターフェース経由のアクセスにすれば普通のクラスローダを使った方法も同様に実装できるとおもうので。
    • classworlds:classloader framework - プラグイン毎にjar分けるのに使えそう

コメント

  • 色々アイデア考えても忘れると勿体無いのでメモメモ -- ずん 2004-10-21 (木) 18:27:02


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-08-16 (火) 17:06:33 (4867d)