## Woolpack

本ドキュメントを閲覧するには。
  Firefox1.5で表示確認している。以下の特殊機能を使用している。
  1. XHTMLを使用している。
  2. JavaScriptを使用してアンカーを加工している。
  3. JavaScriptを使用してソースコードを加工している。
Woolpackとは。
  Woolpack は インタープリタ デザインパターン を利用した Java による ウェブアプリケーション の API または 部品群 または フレームワーク である。
  Woolpack is A Java Web Application API or Parts or Framework using interpreter design pattern.
用語の定義。

  用語 | 意味
  ユーザ | Woolpack の API を利用してウェブアプリケーションを開発する役割の者。
  開発者 | Woolpack の API を拡張する役割の者。
  Context 役 | Interpreter デザインパターンにおける Context の役割。
  Expession 役 | Interpreter デザインパターンにおける Expression の役割。
  コンストラクタツリー | コンストラクタの引数としてコンストラクタが定義されコンストラクタが入れ子になったツリー状の宣言。

対象ユーザは。
  以下のいずれかを目的とするユーザを対象とする。
  1. Interpreter デザインパターンのメタファを得る。
  2. ウェブアプリケーションを作成する。
  3. Javaを使用する。
Interpreter デザインパターンのメタファとは。
  Interpreter デザインパターンのメタファを以下に示す。

  概念 | メタファ | metaphor
  Interpreter デザインパターン | 加工対象を加工するための組立式の生産ライン/流れ作業/コンベア | knockdown conveyor
  Expression 役 | コンベア | conveyor
  Context 役 | コンベアに乗って流れてくる、加工対象を入れるトレーに注文書を付加したもの | tray and purchase order
  Expression 役の interpret メソッド | コンベア同士をつなぐための接続点/ジョイント(受動側) | passive joint for conveyor
  Expression 役の各実装 | 加工対象を加工する機能を付加したコンベア | conveyor implementation
  Expression 役の各実装のコンストラクタに指定された委譲先の Expression 役 | コンベア同士をつなぐための接続点/ジョイント(能動側) | active joint for conveyor
  Expression 役の各実装のコンストラクタに指定された Expression 役を除いたオブジェクト | 機能を付加したコンベアの初期操作レバー | lever of conveyor

Woolpack のメタファとは。
  Woolpack のメタファを以下に示す。

  概念 | メタファ
  Woolpack API | オーダーメードパソコンを製造するラインを組み立てるキット
  Woolpackを使用したアプリケーション | オーダーメードパソコンを製造する工場とその営業所
  Servlet コンテナ | 営業所
  web.xml | 営業所と工場を行き来するトラックの経路情報
  コンストラクタツリー | パソコンの製造するための組み立て完了した工場
  HTTP リクエストの URL | 注文書に記載されたパソコンの製品番号
  HTTP リクエストのパラメータ | 注文書に記載されたオプション品の明細
  Context 役のコンテナ定義に記載されたコンポーネント定義 | パソコンの各製品の基本仕様
  HTML ファイル | パソコンの筐体
  HTTP レスポンス | 組み立て完了したパソコン

特徴は。
  以下を特徴とする。

  特徴 | 理由 | 利点 | 概念上・実装上の欠点 | 該当モジュール
  Interpreter デザインパターンを使用する。 | 利点に同じ。 | Context役に作用する共通のExpression役を共通化・部品化することが創発される。特にリクエスト(HTTP)をまたがった横断的な部品(DOM Node の加工・値検証)を定義することができる。 | Context役で直接管理するプロパティを選定する難易度が高い。 | dom・html・config・validatorの各パッケージ
  なるべく設定にXMLを使用しない。コンストラクタのパラメータで設定する。 | 柔軟性を確保するスキーマ設計・XMLをインスタンスツリーに変換する設計の難易度が高い。シリアル化(サーバ間で設定を通信するなど)を必要としない。 | 設定の構造化が維持される。 設定の分割が容易。 部品化が創発される。 Javaエディタ以外のエディタ(eclipseの設定ファイル編集専用プラグインなど)必要としない。 全ての機能がJavaのAPIとして表現されているため、APIのリファレンスがJavadocのみである。 | Java言語はnew宣言の引数に変数名を付けることができないため可読性が悪い。動作定義の動的変更機能を具備しない。 ユーザのソースコードに文字列が直接指定する記述になるため、文字列をResourceBundle化する一部のコーディング規約を遵守することができない(遵守すると可読性が低下する)。 | API全体
  コンストラクタツリーとしてユーザが設定を定義(構文木をパース)する。 | 利点に同じ。 | 設定が構造化される。 | 複雑になると丸括弧の入れ子が増えるため可読性が悪い。 | dom・html・config・validatorの各パッケージ
  HTMLテンプレートと変換定義を分離する。 | HTMLテンプレートと変換定義を疎結合化。Mayaaにインスパイアされた。 | HTMLテンプレートをまたがった変換定義を共通化・部品化することが創発される。 | 特定のHTMLテンプレートに固有の処理を記述する柔軟性がない。 | dom・htmlの各パッケージ
  HTMLでの入力値・妥当性チェック・モデル層のコンポーネントの間で、プロパティ名により値を自動バインドする。 | 利点に同じ。 | HTMLでの入力値・妥当性チェック・モデル層のコンポーネントでプロパティ名を統一することにより、個別に値をバインドする定義が不要になる。 | 識別子の値を個別に変換してバインドする仕掛けを用意していない。 | validatorパッケージ, AutoUpdate, ActionInvoker
  StrutsのTilesに相当する機能としてHTMLフレームをHTMLテーブルに変換する機能を具備する。 | 利点に同じ。 | HTMLで作成したレイアウトをそのまま利用することができる。 | target属性値の判定機能を具備しない。コンストラクタツリーで作用対象のHTMLを指定する必要がある。 | Frame2Table
  Context役の各プロパティをJ2SEのAPIに限定している。 | 利点に同じ。 | JUnitによるテストの容易性が維持される。設計の抽象化が維持される。Servlet APIに依存する部品が局所化される。 | クライアント情報(LocaleやOS・ブラウザ名など)による処理の分岐をするためにはコレクションフレームワークを媒介するかThreadLocalを使用する必要がある。 | DomContext
  コンテキスト役へのアクセスにOGNLを利用する。 | 利点に同じ。 | 型チェックがゆるい(実行時チェック)ため記述が容易。 | OGNL文をJavaソースのString値として定義するため、エスケープ文字(バックスラッシュ)の定義の可読性が悪い。 | API全体
  Java言語のfinalキーワードを多用する。 | 再入可能の保証とソースコード可読性。 | 動点固定法の効果により設計上のアイデアが創発される。「見える化」が維持される。 | 動的に設定を更新することができない。ソースコード上のfinal宣言がくどい。配列やコレクションインターフェイスの各値を固定化する実装はしていない。 | API全体
  Genericsを多用する。 | 利点に同じ。 | ソースの可読性が維持される。 | 1.4以前のJREでは動作しない。 | API全体
  dom・htmlの各パッケージのクラス名が名詞になっていない。 | Expression役は文法規則を表すため、名詞にする効果が弱いと判断したため。 | コンストラクタツリーが読みやすい。 | 一般的なクラス名の命名規則に従っていない。 | dom・htmlの各パッケージ
  Woolpackが利用するライブラリで発生したRuntimeExceptionのサブクラスでない例外は全てRuntimeExceptionでラップしてthrowする。 | Woolpackがまだ例外設計をする段階に達していない。 | 部品の設計が単純化されている。 | 呼び出し元でgetCause()を解析する必要がある。 | API全体
  Context役にPrototypeデザインパターンを適用することにより、変数スコープを表現している。 | Expression役のコンストラクタツリーで変数スコープを実現する。 | Expression役の作用範囲を制御することができる。 | 言語の変数スコープ程の柔軟性はない。 | DomContext, ConfigContext
  フレームワーク自体はログを出力しない。 | Woolpackがまだログ設計をする段階に達していない。 | 部品の設計が単純化されている。 | デバッグ用のデータが不足する可能性がある。 | API全体

Hello World は。
  (アーカイブ用)
ダウンロードの場所は。
  sourceforge のダウンロードサイトを参照。 ひとつは開発者用の eclipse3.1 プロジェクト、 ひとつは eclipse3.1 の SYSDEO Tomcat プロジェクトになっている。
Javadoc APIを参照するには。
  次を参照する。 (アーカイブ用)
必要なJDKのバージョンは。
  以下の機能を使用するため1.5を必要とする。
  1. Generics
  2. javax.xml.xpath パッケージ
  3. Collection APIの1.5で追加された機能
  4. 標準アノテーション
  5. StringBuilder,Appendableなどの1.5で追加された機能
使用するライブラリは。
  以下に示すライブラリを使用する。
  1. Servlet API 2.3以上(JSPは不要)
  2. CyberNeko HTML Parser ()
  3. OGNL ()
必要とする前提知識は。
  以下の知識を必要とする。(順不同)
  1. Java言語
  2. OGNL(Object Graph Navigation Language)
     式言語の一種。Woolpackでは Context 役に対する作用として定義することがほとんどである。 次の例はリクエストスコープのプロパティ名"key0"に値"value0"を設定する操作を表す。

     次の例はノードの属性"name"の値が"name0"の場合、マップconfigのキー"name0"の値を表す。

     Java言語の文字列としてOGNLを指定する必要があるため、ダブルクォートがエスケープされることに注意する必要がある。
  3. XPath
     XMLの位置を表すパス言語。Woolpack では基点から任意の距離を表す表現"//"を多用する。 次の例はノードの属性"id"の値が"dummy"であるか属性"name"の値が"dummy"である基点以下の全てのエレメントを表す。

  4. Generics(汎用型)
     型をパラメータ化して扱う言語機構。Javaではバージョン5からサポートされている。 型宣言の見える化により可読性が維持される。また型の静的チェックにより品質が維持される。 次の例はキー・値とも文字列型のHashMapの初期化宣言である。

  5. DOM(Document Object Model)
     HTMLまたはXMLをオブジェクトで表現し操作するためのAPI。 Woolpack では DOM による操作を Expression 役の実装でカプセル化するため、 ユーザが直接 DOM を操作することは少ない。
  6. 正規表現(java.util.regexパッケージ)
     文字列の集合を一つの形式で表現する言語(Wikipediaより)。 Woolpackではjava.util.regexパッケージの正規表現を利用する。 Woolpackではurlの変換・id(リクエスト・html)の変換・idによる条件分岐・入力値の変換に正規表現を使用する。 次の正規表現は"user_registerConfirm","user_registerResult","user_updateConfirm","user_updateResult"にマッチする。

     正規表現を利用して値を変換することができる。 次の例は"a0/a1/a2"などを"a2"に変換するフォーマットの初期化宣言である。"$1"は1番目の丸括弧に該当する文字列を示す。

  7. コレクションフレームワーク(java.utilパッケージ)
     コレクションとはオブジェクトのグループを表すオブジェクトのこと(j2seのドキュメントより)。 重複要素を持たない Set、順序付けられた一覧を表す List、キーと値の組の集合を表す Map、一覧を表す Collection、一覧の反復子を表す Iteratorなどの概念を持つ。 コレクションフレームワークには含まれないが、反復可能であることを表す Iterable を Woolpack では多用する。
  8. Servlet API
  9. HTML(Hyper Text Markup Language)
  10. JavaScript
  11. デザインパターン(特に Interpreter)
  12. MVC2(Model-View-Controller2)アーキテクチャ
  13. Dependency Injection(Inversion of Control)リファクタリング
類似テンプレート技術との対応関係とは。
  類似テンプレート技術との対応関係を以下に示す。

  | Woolpack | Mayaa | JSP | XSLT
  治工具 | DomExpression の実装クラス | タグライブラリ | タグライブラリ | XSLTスキーマ
  コンテキスト | DomContext | request,session など | request,session など | 変換前 XML 表現
  テンプレート | 識別子(コンストラクタで定義)の値を調整した HTML 表現 | 識別子("id"のみ)の値を調整した HTML 表現 | HTML と XML 類似のタグ言語とスキーマ付きXMLの混合体 | XSLT スキーマ付 XML
  ユーザの変換ルール記述言語 | Java 言語と OGNL と XPath (ほぼコンストラクタツリー) | Mayaa・JSTL などのスキーマ付 XML と EL | HTML と XML 類似のタグ言語と JSTL などのスキーマ付き XML の混合体と EL | XSLT スキーマ付 XML
  処理の共通化の実装方式 | DomExpression インターフェイスの実装(カプセル化) | インクルード機能の利用(関数による共通化)またはタグライブラリの実装(カプセル化) | インクルード機能の利用(関数による共通化)またはタグライブラリの実装(カプセル化) | の利用(関数による共通化)
  拡張機能開発者の記述言語 | Java 言語と OGNL と XPath | Java 言語と TLD の DTD 付 XML | Java 言語と TLD の DTD 付 XML | XSLT1.0では拡張機能の実装を定義するためのメカニズムを具備していない。(注1)
  文字セット(文字エンコーディング)の定義方法 | InputStreamReaderFactory クラスのコンストラクタ(注2) | HTML の META タグ | 各 JSP ファイルの JSP ヘッダ | 各 XML ファイルの XML ヘッダ

  注1：参照。
  注2：HTMLファイル・ブラウザ・ロケールごとに指定するにはToNodeを継承してユーザが作りこむ必要がある。
類似ウェブアプリケーションフレームワーク技術との対応関係とは。
  類似ウェブアプリケーションフレームワーク技術との対応関係を以下に示す。

  | Woolpack | Struts | JSF
  アーキテクチャ | MVC2 | MVC2 | MVC2+イベント駆動
  DI | 仕様はない(OGNLの委譲先で定義する) | 仕様はない | 仕様化されている
  AOP | 仕様はない(OGNLの委譲先で定義する) | 仕様はない | 仕様はない
  初期化 | 仕様はない | 仕様はない | 自動的に処理する仕様
  型変換 | コレクションと基本型変換は自動処理。フォーマット変換は入力チェックで定義。 | アクションフォームへの基本型変換は自動処理 | コンバータが仕様化されている
  値検証記述言語 | Java言語(コンストラクタツリー) | commons validatorのDTD付XML | Java言語とJSFスキーマ付XML
  クライアント値検証 | 設計中 | あり(Validatorプラグイン) | 仕様はない
  コマンドオブジェクトの種類 | 一般のJavaオブジェクト | Actionを継承したクラス | 一般のJavaオブジェクト
  呼び出すメソッド | OGNLでアクセス可能なメソッド | 特定のクラスをオーバライドしたメソッド | 引数無しで返却値が文字列のメソッド
  メソッド返却値の判定 | インターフェイスを定義。標準実装(null・オブジェクト・クラス・全許容・否定・例外以外)を用意。 | アクションに対しては文字列判定のみ。例外に対しては全アクション共通の指定のみ可能。 | 文字列判定のみ。
  レイアウト | フレームをテーブルに変換 | Tilesプラグイン | 仕様はない
  拡張方式 | Java言語によるコンストラクタツリーの組み立て | XMLによるプラグイン | XMLによるプラグイン
  標準テンプレート技術 | 独自(Interpreter デザインパターンをベースとしたデザイン) | JSP | JSP

  上記の表の項目はを参考にした。
目的別のイディオムは。
  目的別のイディオムを以下に示す。

  目的 | イディオム
  複数のResourceBundleを読み込む |
  セレクトでデフォルト選択値にのみスタイルを定義する |
  ラジオボタン・チェックボックスでデフォルト選択値にのみスタイルを定義する |
  Seasar2のコンポーネントを取得する |
  ラジオボタン・チェックボックスの再生成する(プロパティ名を指定する場合はダミー識別子を使用せずに不要な部品を削除することが可能) |
  ActionDefで比較判定を定義する |
  プリミティブ型でnullとみなした値を削除する |
  一定の単位でコンストラクタツリーを分割する |
  コンストラクタツリーの生成にXMLを使用する |

HTMLのselect/checkbox/radioの値とラベルの組をResourceBundleで管理するには。
  以下の内容の設定ファイルを用意する。

  以下の内容を含むConfigExpressionコンストラクタツリーを定義する。

  以下の内容を含むDomExpressionコンストラクタツリーを定義する。

  コンテキストのノードが以下の内容の場合、

  以下の内容に変換される(改行・スペースは説明用に調節している)。

  コンテキストのノードが以下の内容の場合、

  以下の内容に変換される(改行・スペースは説明用に調節している)。

編集中
  編集中。
実装予定の機能とは。
  以下の実装予定の機能は実装されることを保証するものではない。 また表示順に実行することを意図したものでもない。 (validator)メッセージをキーのみでなくインデックスも付加して管理。 (ee)画面表示値のフォーマット。 (validator)クライアント値検証。 (html)パッケージ全体のリファクタリング(処理時間・メモリ使用量)。 (html)HTML雛型の空白・改行・コメント(js以外)を削除する。 (all)型検証ワーニングの解消。 (text)FieldPositionとParsePositionのテスト。 (other)同時実行数制御。 (other)画面設定MapとDOMの事前読み込み。
更新履歴
  1. 2006/06/05 ver0.01a 新規公開。
著作権
  Copyright (C) 2006 Takahiro Nakamura.
ライセンス
  Woolpackは以下のライセンスでリリースしている。
  Apache License, Version 2.0
  ただし同梱されているライブラリのライセンスはそれぞれに従う。

以上