概要

Grizzly はデータストリームの変換フレームワークです。 たとえば、Wiki 形式のテキストデータを HTML 形式に変換したり、JPEG の画像データを GIF の画像データに変換するなどを共通の手段により実現するためのフレームワークです。

Grizzly により提供しているフレームワークは、Spring や Seasar2 などの DI と組み合わせて利用することにより、変換方法を各 DI の設定ファイルに記述することができ、利用する際に利用しているソースコード上に変換内容を記述する必要なくなります。

利用方法

Grizzly の変換フレームワークは、grizzly-framework-x.y.jar になります。 このフレームワークは、変換内容を保持する GrizzlyPipeline と、変換するためのストリームデータを保持する StreamStorage により構成されています。

実際の変換については、grizzly-*-x.y.jar になります。 たとえば、汎用的な変換は grizzly-generic-x.y.jar にまとめてあります。 grizzly-generic-x.y.jar では、HTML をエスケープするなどの汎用的なものが含まれています。

実際にテキストデータを HTML エスケープする変換を Seasar2 を用いて、実装する例を示します。 まず、Seasar2 の dicon ファイルに以下の記述をします。

<components>
...
    <component class="jp.sf.grizzly.pipeline.GrizzlyPipeline">
        <arg>"EscapeHtmlConverter"</arg>
        <arg>{EscapeHtmlValve}</arg>
    </component>
    <component name="EscapeHtmlValve"
        class="jp.sf.grizzly.pipeline.valve.impl.EscapeHtmlValve" />

...
</components>

GrizzlyPipeline の初めの引数は、パイプラインの名前になります。二番目の引数は、変換バルブのリストになります。 ここでは、EscapeHtmlValve だけしか与えていませんが、複数指定すると、指定された順に変換を実行します。 次に、ご利用のアプリケーションで Grizzly フレームワークの利用方法を示します。 ご利用のコード上では以下のように利用できます。

...
        SingletonS2ContainerFactory.init();
        S2Container container = SingletonS2ContainerFactory.getContainer();

        GrizzlyPipeline pipeline = (GrizzlyPipeline) container
                .getComponent(GrizzlyPipeline.class);

        StringBuffer buffer = new StringBuffer();
        try
        {
            // StreamStorage を作成して、変換したいストリームを与える
            StreamStorage storage = new FileStreamStorageImpl(
                    new FileInputStream("hoge.txt"),
                    "UTF-8");
            // invoke の実行で変換が実行されます
            pipeline.invoke(storage);

            BufferedReader r = null;
            try
            {
                // storage.getResultInputStream() で変換後のストリームが取得できます
                r = new BufferedReader(new InputStreamReader(storage
                        .getResultInputStream(), storage.getEncoding()));
                String l = null;
                while ((l = r.readLine()) != null)
                {
                    buffer.append(l);
                    buffer.append("\n");
                }
            }
            catch (UnsupportedEncodingException e)
            {
                log.warn("Unsupported Encoding. ", e);
            }
            catch (StreamStorageException e)
            {
                log.warn("Stream Storage Exception. ", e);
            }
            catch (IOException e)
            {
                log.error("I/O Exception. ", e);
            }
            finally
            {
                if (r != null)
                {
                    try
                    {
                        r.close();
                    }
                    catch (IOException e)
                    {
                    }
                }
            }
            // StorageStream を破棄します
            storage.destroy();
        }
...

あとは、ビルドして、grizzly-framework-x.y.jar および grizzly-generic-x.y.jar をクラスパスに追加して、実行すれば変換が実行されます。