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>このタグは、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}