Home of: [工房 "藤車"] > [SourceForge.net における PageMixer]

基本原理

本節では、PageMixer の基本原理に関して説明します。

Token と Token シーケンス

HTML ページは、以下のように、 多くのタグとテキストから構成されています。

                            :
                            :
<h2>Table of contents</h2>

<table class="wide">

<tr><!-- ======================================== -->
<th style="width: 25%;">title</th><th>content</th>
</tr>

<tr><!-- ======================================== -->
<th><a href="./principle.ja.html">Basic principle</a></th>
<td><p>basic principle of PageMixer</p></td>
</tr>

<tr><!-- ======================================== -->
<th><a href="./nopfilter.ja.html">"NOP" filter</a></th>
<td><p>parse and render HTML page in
PageMixer framework</p></td>
</tr>
                            :
                            :
HTML ページソースサンプル

PageMixer の基本原理は、 HTML ページを "Token" シーケンスとして扱うことです。

概要
概要 (クリックで拡大表示)

"Token" は、 プログラミング言語仕様におけるレキシカルアナライズでのそれがそうであるように、 "HTML ページの最小単位" を意味します。

備考: "Token" は "Symbol" や "Attribute" 群から構成されているため、 "Token" は実は "最小単位" ではありません。 しかし、 物理学の初歩では "原子" を "最小単位" とみなすように、 PageMixer では "Token" を "最小単位" とみなします。

PageMixer では、以下のものが Token に成り得ます。

そのため、 前述の HTML ページソースサンプルは、 以下のような Token シーケンスに変換されます (以下の例は変換結果の一部です)。

  1. HTML 開始タグ Token - "h2"
  2. テキスト Token - "Table of contents"
  3. HTML 終了タグ Token - "h2"
  4. テキスト Token - 2つの LF (または2つの CR/LF 対)
  5. HTML 開始タグ Token - 'class="wide"' 属性を持つ "table"
  6. テキスト token - 2つの LF
  7. HTML 開始タグ Token - "tr"
  8. コメント Token - " ======================================== "
  9. HTML 開始タグ Token - 'style="width: 25%;"' 属性を持つ "th"
  10. テキスト Token - "title"
  11. HTML 終了タグ Token - "th"
  12. HTML 開始タグ Token - "th"
  13. テキスト Token - "content"
  14. HTML 終了タグ Token - "th"
  15. 等々

"Token" の概念は、Java クラスとして定義されているので、 "Token" およびそのバリエーションは Java のオブジェクとなります。 これは、 HTML ページを Java オブジェクトのシーケンスとして扱うことができる、 ということを意味します。.

"Token" のクラス階層
"Token" のクラス階層 (クリックで拡大表示)

上記のものに加えて、 PageMixer 3.0 からは、 以下のクラスも利用可能になっています。

Consumer、 Filter および Producer

Consumer, Filter および Producer
Consumer、Filter および Producer (クリックで拡大表示)

Consumer

処理対称としての HTML ページは、 Token シーケンスとして表現されます。 では、処理主体は何処でしょう?

処理主体は、Token シーケンスを消費する "Consumer" として表現されます。 対象となる HTML ページを表現するシーケンス中の Token は、 1つづつ "Consumer" へと渡され、 "Consumer" がそれを消費します。

消費の結果は "Consumer" の実装に依存します。 例えば:

Filter

前述のように、 処理の主体は "Consumer" として表現されます。 しかし、巨大で、複雑で、多用途の "Consumer" は、 開発、テスト、訂正および理解が困難です。

処理を小さく、簡潔で、単機能なものに分割するために、 "Filter" という概念が導入されます。

"Filter" は、 接続された他の "Consumer" に Token シーケンスを供給する "Consumer" です。

与えられた Token シーケンスと同じものを提供するか否かは、 "Filter" の実装に依存します。 例えば、以下のような "Filter" 実装がありえます。

UNIX コマンドのパイプ("|")による組み合わせのように、 出来合いの "Filter" 群を組み合わせることで、 固有の処理を作り上げることも可能です。

Producer

Token シーケンスは "Consumer" あるいは "Filter" によって処理されます。 そして、それらに対して最初に Token シーケンスを供給するものは、 "Producer" と名づけられています。

"Producer" は自身に固有な Token シーケンスを、 指定された "Consumer"(あるいは "Consumer" としての "Filter")に対して、 供給する機能を持たなければなりませんが、 Token シーケンスの生成機構は "Producer" の実装に依存します。

動的に生成した Token シーケンス、 DBMS から取り出した Token シーケンス、 無限の長さを持った Token シーケンス(役に立つとは思えませんが)を生成する "Producer" を作ることも出来ます。

Consumer context

web ベースのシステムの場合、 HTML ページは動的な値を含みます。 それらの値は、 ユーザ入力やユーザ入力の処理結果であるため、 実行時に決定されます。

そのため、Consumer や Filter には、 それらユーザ入力やその結果を取得する手段が必要です。

同時に、Filter 間での相互通信のための手段も必要とします。

勿論、 Filter 同士が Token シーケンスを介して通信することも出来るでしょうが、 Token シーケンスは、FTP における DATA チャネルや HTTP ボディのようなものです。 DATA チャネルや HTTP ボディのような Token シーケンスではなく、 FTP における CONTROL チャネルや HTTP ヘッダのような, お互いの情報を交換する手段が必要です。

そこで、 "Consumer Context" という概念が導入されます。

Consumer および Filter は、 Token 処理の際に "Consumer Context" を渡され、 その "Consumer Context" は、 "java.util.Map" のような値の設定/取り消し/取得の機能を提供します。

Consumer と Filter は、 "Consumer Context" を介することで以下のようなことが出来ます。

値の格納場所やその識別方法は、 "Consumer Context" の実装に依存します。 例えば、Servlet 環境の場合、 "Consumer Context" は HttpRequest の attribute 格納空間や HttpSession の格納空間に値を格納するかもしれませんし、 それらの場所や HttpRequest のパラメータから値を取得するかもしれません。


次節「"NOP" フィルタ」へ