    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystemException;
    019import static org.opengion.fukurou.util.StringUtil.nval ;
    020
    021import java.io.ObjectOutputStream;
    022import java.io.ObjectInputStream;
    023import java.io.IOException;
    024
    025/**
    026 * ProcessTag に対して、引数(パラメータ)を渡す、入れ子の子クラスです。
    027 *
    028 * @og.formSample
    029 * ●形式：&lt;og:param key="ZZZ" value="AAA,BBB" /&gt;
    030 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    031 *
    032 * ●Tag定義：
    033 *   &lt;og:param
    034 *       key              ○【TAG】リクエスト情報 に登録するキーをセットします(必須)。
    035 *       value              【TAG】リクエスト情報 に登録する値をセットします
    036 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    037 *   &gt;   ... Body ...
    038 *   &lt;/og:param&gt;
    039 *
    040 * ●使用例
    041 *     一般的な変数の渡し方
    042 *     &lt;og:process ･････ &gt;
    043 *        &lt;og:param key="AAA" value="111" /&gt;
    044 *        &lt;og:param key="BBB" value="222" /&gt;
    045 *        &lt;og:param key="CCC" value="333" /&gt;
    046 *        &lt;og:param key="DDD" value="444" /&gt;
    047 *     &lt;/og:process &gt;
    048 *
    049 *     BODY 部に記述した変数の渡し方
    050 *     &lt;og:process ･････ &gt;
    051 *        &lt;og:param key="SQL" &gt;
    052 *          SELECT * FROM DUAL
    053 *        &lt;/og:param&gt;
    054 *     &lt;/og:process &gt;
    055 *
    056 * @og.group 画面表示
    057 *
    058 * @version  4.0
    059 * @author       Kazuhiko Hasegawa
    060 * @since    JDK5.0,
    061 */
    062public class ParamTag extends CommonTagSupport {
    063        //* このプログラムのVERSION文字列を設定します。   {@value} */
    064        private static final String VERSION = "4.0.0.0 (2006/09/31)" ;
    065
    066        private static final long serialVersionUID = 400020060931L ;
    067
    068        private String  key             = null;
    069        private String  value   = null;
    070
    071        /**
    072         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    073         *
    074         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    075         */
    076        @Override
    077        public int doStartTag() {
    078                return EVAL_BODY_BUFFERED ;             // Body を評価する
    079        }
    080
    081        /**
    082         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    083         *
    084         * @return      後続処理の指示(SKIP_BODY)
    085         */
    086        @Override
    087        public int doAfterBody() {
    088                if( value == null || value.length() <= 0 ) {
    089                        value = getBodyString();
    090                }
    091
    092                return SKIP_BODY ;
    093        }
    094
    095        /**
    096         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    097         *
    098         * @return      後続処理の指示
    099         */
    100        @Override
    101        public int doEndTag() {
    102                debugPrint();           // 4.0.0 (2005/02/28)
    103                ProcessTag process = (ProcessTag)findAncestorWithClass( this,ProcessTag.class );
    104                if( process == null ) {
    105                        String errMsg = "<b>" + getTagName() + "タグは、ProcessTag の内側(要素)に記述してください。</b>";
    106                        throw new HybsSystemException( errMsg );
    107                }
    108
    109                process.addParam( key,value );
    110
    111                return EVAL_PAGE ;
    112        }
    113
    114        /**
    115         * タグリブオブジェクトをリリースします。
    116         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    117         *
    118         */
    119        @Override
    120        protected void release2() {
    121                super.release2();
    122                key             = null;
    123                value   = null;
    124        }
    125
    126        /**
    127         * 【TAG】リクエスト情報 に登録するキーをセットします。
    128         *
    129         * @og.tag リクエスト情報 に登録するキーをセットします。
    130         *
    131         * @param       key1 リクエスト情報に登録するキー
    132         */
    133        public void setKey( final String key1 ) {
    134                key = nval( getRequestParameter( key1 ),key ) ;
    135        }
    136
    137        /**
    138         * 【TAG】リクエスト情報 に登録する値をセットします。
    139         *
    140         * @og.tag リクエスト情報 に登録する値をセットします。
    141         *
    142         * @param       val     リクエスト情報に登録する値
    143         */
    144        public void setValue( final String val ) {
    145                value = nval( getRequestParameter( val ),value );
    146        }
    147
    148        /**
    149         * シリアライズ用のカスタムシリアライズ書き込みメソッド
    150         *
    151         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    152         * @serialData 一部のオブジェクトは、シリアライズされません。
    153         *
    154         * @param       strm    ObjectOutputStreamオブジェクト
    155         * @throws IOException  入出力エラーが発生した場合
    156         */
    157        private void writeObject( final ObjectOutputStream strm ) throws IOException {
    158                strm.defaultWriteObject();
    159        }
    160
    161        /**
    162         * シリアライズ用のカスタムシリアライズ読み込みメソッド
    163         *
    164         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
    165         *
    166         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    167         * @serialData 一部のオブジェクトは、シリアライズされません。
    168         *
    169         * @param       strm    ObjectInputStreamオブジェクト
    170         * @see #release2()
    171         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    172         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
    173         */
    174        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
    175                strm.defaultReadObject();
    176        }
    177
    178        /**
    179         * このオブジェクトの文字列表現を返します。
    180         * 基本的にデバッグ目的に使用します。
    181         *
    182         * @return このクラスの文字列表現
    183         */
    184        @Override
    185        public String toString() {
    186                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    187                                .println( "VERSION"                             ,VERSION                        )
    188                                .println( "key"                                 ,key                            )
    189                                .println( "value"                               ,value                          )
    190                                .fixForm().toString() ;
    191        }
    192}