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

シーケンスへのデータはめ込み

本節では、 PageMixer における HTML ページへのデータのはめ込み方に関して説明します。 説明には、 HTML ページの "<span>" および対応する "</span>" に挟まれた部分にユーザ名文字列をはめ込むフィルタを用います。


<span class="Auth-UserName"></span>

処理前

<span class="Auth-UserName">foozy</span>

処理後

概要

クラス図

本節におけるクラス図を以下に示します。

クラス図
クラス図 (クリックで拡大表示)

色づけされているのが本節で定義するクラスで、 それ以外は PageMixer において定義済みです。

オブジェクト図

本節におけるオブジェクト図を以下に示します。

オブジェクト図
オブジェクト図 (クリックで拡大表示)

シーケンス図

本節におけるシーケンス図を以下に示します。

シーケンス図
シーケンス図 (クリックで拡大表示)

クラス名

本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。

PageMixer フレームワークのクラス

表記完全名
ConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext
HTMLSymbolSet jp.ne.dti.lares.foozy.pagemixer.HTMLSymbolSet
SequenceDataInsetFilter jp.ne.dti.lares.foozy.pagemixer.mixer.SequenceDataInsetFilter
SequenceWatcher jp.ne.dti.lares.foozy.pagemixer.mixer.SequenceWatcher
TokenDataInsetFilter jp.ne.dti.lares.foozy.pagemixer.mixer.TokenDataInsetFilter
TokenWatcher jp.ne.dti.lares.foozy.pagemixer.mixer.TokenWatcher

チュートリアルの固有クラス

表記完全名
Bootstrap pagemixer.filter.Bootstrap
UsernameTextInsetFilter pagemixer.filter.UsernameTextInsetFilter

SequenceWatcher の生成

前述のように、 本節では、 HTML ページの "<span>" および対応する "</span>" に挟まれた部分に、 ユーザ名文字列をはめ込むフィルタを作成します。 しかし、 与えられた HTML ページの該当する部分全ての位置にはめ込むのは、 得策ではありません。

そこで、対象となる部分シーケンスに以下の条件を定めます。

このような場合、 "SequenceWatcher" としては "SequenceWatcher.NameAttr" が利用されます。 これは "最初の Token の名前と属性で監視するシーケンス監視クラス" のことです。


new SequenceWatcher.NameAttr(HTMLSymbolSet.SET.SPAN,
                             HTMLSymbolSet.SET.CLASS,
                             "Auth-UserName")

"span" の間にテキストをはめ込むための SequenceWatcher

SequenceDataInsetFilter の具象化

PageMixer フレームワークは、 コンストラクタに与えられた SequenceWatcher によって認識された部分シーケンスの替わりにデータをはめ込むための、 テンプレートとなるユーティリティクラスとして、 SequenceDataInsetFilter およびその派生クラスを提供しています。

本節における状況の場合、 以下の理由から、 "HTML-Safe" な TextToken としてデータをはめ込む必要があります。

この場合、 "SequenceDataInsetFilter.HTMLSafeTextInside" を利用するのが良いでしょう。


public class UsernameTextInsetFilter
    extends SequenceDataInsetFilter.HTMLSafeTextInside
{
    final static
    private HTMLSymbolSet SET = HTMLSymbolSet.SET;

    final static
    private String ATTR_VALUE = "Auth-UserName";

    ////////////////////////////////////////

    public UsernameTextInsetFilter(Object key){
        super(new SequenceWatcher.NameAttr(SET.SPAN,
                                           SET.CLASS,
                                           ATTR_VALUE),
              key);
    }

    /////////////////////////////////////////////
    // class HTMLSafeTextInside の具象化

    protected String getText(Object data){
        return (null != data ? data.toString() : "");
    }
}

SequenceDataInsetFilter.HTMLSafeTextInside の具象化

"Token へのデータはめ込み" の例との違いは、以下の通りです。

繋いで混ぜる

以上で必要なものが全て揃いました。 実行コードは以下のようになります (詳細は UsernameTextInsetFilter を参照してください)。

try{
    // ユーザ名設定/取得用のキー
    final Object key = "Auth.Login";
    // ユーザ名
    final String name = "foozy";

    Bootstrap bootstrap =
    new Bootstrap.Default(filename)
    {
        protected void prepare(ConsumerContext context)
        {
            // ユーザ名をコンテキストに設定
            context.setValue(key, name);
        }
    };

    // フィルタの適用
    bootstrap.execute(new UsernameTextInsetFilter(key));
}
catch(Exception e){
    e.printStackTrace(System.err);
}
繋いで混ぜる

入力用のサンプル HTML ファイルは、 配布物中の "src/demo/servlet/war/WEB-INF/page/demosite" 配下にある "auth.ja.html" (あるいは "index.ja.html" でも可)です。


次節「部分シーケンスの反復」へ