    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>このタグは、ProcessTag の内側(要素)に記述してください。</b>";
    106                        String errMsg = "<b>" + getTagName() + "タグは、ProcessTag の内側(要素)に記述してください。</b>";
    107                        throw new HybsSystemException( errMsg );
    108                }
    109
    110                process.addParam( key,value );
    111
    112                return(EVAL_PAGE);
    113        }
    114
    115        /**
    116         * タグリブオブジェクトをリリースします。
    117         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    118         *
    119         */
    120        @Override
    121        protected void release2() {
    122                super.release2();
    123                key             = null;
    124                value   = null;
    125        }
    126
    127        /**
    128         * 【TAG】リクエスト情報 に登録するキーをセットします。
    129         *
    130         * @og.tag リクエスト情報 に登録するキーをセットします。
    131         *
    132         * @param       key1 リクエスト情報に登録するキー
    133         */
    134        public void setKey( final String key1 ) {
    135                key = nval( getRequestParameter( key1 ),key ) ;
    136        }
    137
    138        /**
    139         * 【TAG】リクエスト情報 に登録する値をセットします。
    140         *
    141         * @og.tag リクエスト情報 に登録する値をセットします。
    142         *
    143         * @param       val     リクエスト情報に登録する値
    144         */
    145        public void setValue( final String val ) {
    146                value = nval( getRequestParameter( val ),value );
    147        }
    148
    149        /**
    150         * シリアライズ用のカスタムシリアライズ書き込みメソッド
    151         *
    152         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    153         * @serialData 一部のオブジェクトは、シリアライズされません。
    154         *
    155         * @param       strm    ObjectOutputStreamオブジェクト
    156         * @throws IOException  入出力エラーが発生した場合
    157         */
    158        private void writeObject( final ObjectOutputStream strm ) throws IOException {
    159                strm.defaultWriteObject();
    160        }
    161
    162        /**
    163         * シリアライズ用のカスタムシリアライズ読み込みメソッド
    164         *
    165         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
    166         *
    167         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    168         * @serialData 一部のオブジェクトは、シリアライズされません。
    169         *
    170         * @param       strm    ObjectInputStreamオブジェクト
    171         * @see #release2()
    172         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    173         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
    174         */
    175        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
    176                strm.defaultReadObject();
    177        }
    178
    179        /**
    180         * このオブジェクトの文字列表現を返します。
    181         * 基本的にデバッグ目的に使用します。
    182         *
    183         * @return このクラスの文字列表現
    184         */
    185        @Override
    186        public String toString() {
    187                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    188                                .println( "VERSION"                             ,VERSION                        )
    189                                .println( "key"                                 ,key                            )
    190                                .println( "value"                               ,value                          )
    191                                .fixForm().toString() ;
    192        }
    193}