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 * ●形式:<og:param key="ZZZ" value="AAA,BBB" />
030 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
031 *
032 * ●Tag定義:
033 *   <og:param
034 *       key              ○【TAG】リクエスト情報 に登録するキーをセットします(必須)。
035 *       value              【TAG】リクエスト情報 に登録する値をセットします
036 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
037 *   >   ... Body ...
038 *   </og:param>
039 *
040 * ●使用例
041 *     一般的な変数の渡し方
042 *     <og:process ・・・・・ >
043 *        <og:param key="AAA" value="111" />
044 *        <og:param key="BBB" value="222" />
045 *        <og:param key="CCC" value="333" />
046 *        <og:param key="DDD" value="444" />
047 *     </og:process >
048 *
049 *     BODY 部に記述した変数の渡し方
050 *     <og:process ・・・・・ >
051 *        <og:param key="SQL" >
052 *          SELECT * FROM DUAL
053 *        </og:param>
054 *     </og:process >
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}