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

HTML ページの事前解析

本節では、 PageMixer フレームワークにおける HTML ページの事前解析に関して説明します。

概要

クラス名

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

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

表記完全名
ConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext
DataProvider jp.ne.dti.lares.foozy.pagemixer.mixer.DataProvider
PageParser jp.ne.dti.lares.foozy.pagemixer.mixer.PageParser
PersistentProducer jp.ne.dti.lares.foozy.pagemixer.mixer.PersistentProducer
Producer jp.ne.dti.lares.foozy.pagemixer.mixer.Producer

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

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

動機

本チュートリアルにおけるこれまでの節では、 サンプルプログラムの実行時における HTML ページの解析には、 PageParser を利用してきました。

しかし、このような実行時解析は、 以下のような問題の原因となり得ます。

あるいは、 Producer がプログラム的に作成される可能性もあります。

PageMixer フレームワークは、 Producer のインスタンスが必要なのであって、 HTML ページが必要なのではありません。 そこで、 直接的な Producer の入手が必要となります。

PersistentProducer の利用

PageMixer フレームワークは、 外部ファイルとの間で Producer のシリアライズ/デシリアライズをするために、 "PersistentProducer" クラスを提供しています。

Producer のシリアライズを行うコードは、 以下のようになります。


try{
    PersistentProducer persistent =
    new PersistentProducer();

    persistent.write(filename, producer);
}
catch(IOException e){
    // SOMETHING TO DO
}

PersistentProducer によるシリアライズ

実は、 "PageParser" を利用することで、 指定した HTML ページから生成された Producer を直接書き出すことが可能です。 詳細は、PageParser を参照してください。

次に、 Producer のデシリアライズを行うコードは、 以下のようになります。


try{
    PersistentProducer persistent =
    new PersistentProducer();

    Producer producer = persistent.read(filename);
}
catch(IOException e){
    // SOMETHING TO DO
}
catch(ClassNotFoundException e){
    // SOMETHING TO DO
}

PersistentProducer によるデシリアライズ

度々ですが、 実は Bootstrap クラスは、 Producer のデシリアライズを行うユーティリティメソッド "readinProducer(String)" を提供していますので、 チュートリアル環境でのデシリアライズは、 容易に行うことが出来ます。

繋いで混ぜる

以上で必要なものが全て揃いました。

最初に PageParser#main を起動することで、 指定された HTML ページから生成された Producer を、 指定されたファイルにシリアライズします。

次に、以下のコードに示す手順により、 ファイルから Producer をデシリアライズし、 Token シーケンスを生成します (詳細は pagemixer.filter.PreparseSample を参照してください)。


try{
    final Object providerkey =
    "Shop.Basket.BasketEntryProvider";

    final Object dataKey =
    "Shop.Basket.BasketEntry";

    Bootstrap bootstrap = new Bootstrap()
    {
        protected Producer createProducer()
            throws IOException, //
                   ClassNotFoundException //
        {
            return readinProducer(filename);
        }

        protected void prepare(ConsumerContext context)
        {
            List entryList = BasketEntry.getEntryList();

            ListDataProvider provider =
            new ListDataProvider(entryList);

            context.setValue(providerKey, provider);
        }
    };

    BasketFilter filter =
    new BasketFilter(providerKey, dataKey);

    bootstrap.execute(filter);
}
catch(Exception e){
    e.printStackTrace(System.err);
}

繋いで混ぜる

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

"BasketFilter" に関しては、 "フィルタの組み合わせ" 節で説明しました。


次節「locale に応じたページ描画」へ