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     */
016    package org.opengion.hayabusa.taglib;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    import org.opengion.fukurou.util.XHTMLTag;
021    import org.opengion.fukurou.util.StringUtil;
022    
023    import static org.opengion.fukurou.util.StringUtil.nval ;
024    
025    /**
026     * ?フィールドを作?するタグで?bodyHidden は?しました)?
027     * name属?をキーにvalue属?をセ?します?
028     * 通常のhiddenタグの他に、BODY部に記述した値を?信することができます?
029     * BODY部に記述した値は、リターンコードが取り除かれます?
030     * また?keys属?、vals属?を指定することで、?のキー??を同時に設定できます?
031     *
032     * @og.formSample
033     * ●形式?
034     *     ・<og:hidden name="…" value="…" />
035     *     ・<og:hidden keys="…" vals="…" />
036     *     ・<og:hidden name="…" />
037     *             ???
038     *         </og:hidden>
039     * ●body?あ?
040     *
041     * ●Tag定義??
042     *   <og:hidden
043     *       name               【TAG】名前を?しま?name属?とkeys属?は同時には登録できません)
044     *       value              【TAG】?を指定しま?こ?属?を使?BODY部は無視されま?
045     *       keys               【TAG】名前をCSV形式で??しま?name属?とkeys属?は同時には登録できません)
046     *       vals               【TAG】keys属?に対応する?をCSV形式で??しま?
047     *       defaultVal         【TAG】value属?に値がセ?されて??きに、?期?をセ?しま?
048     *       caseKey            【TAG】このタグ自体を利用するかど?の条件キーを指定しま?初期値:null)
049     *       caseVal            【TAG】このタグ自体を利用するかど?の条件値を指定しま?初期値:null)
050     *       debug              【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
051     *   >   ... Body ...
052     *   </og:hidden>
053     *
054     * ●使用?
055     *    ・次画面にPNと?名前で{@PN}に入って?値を渡します?
056     *        <input:hidden name="PN" value="{@PN}" />
057     *
058     *    ・次画面で使用するPLSQLと引数を渡します?
059     *      <input:hidden name="name" value="UNIQ,LKIS,KBLOYA,KBLKO,KBNGK,HJO,KBLKNM" />
060     *      <input:hidden name="SQL" value="{ call RKP0011B.RK0011B( ?,?,?,?,? ) }" />
061     *            ?
062     *      <og:plsqlUpdate
063     *             command    = "{@command}"
064     *             names      = "{@names}"
065     *             dbType     = "RK0011ARG"
066     *             queryType  = "JDBCPLSQL" >
067     *         {@SQL}
068     *      </og:plsqlUpdate>
069     *
070     *    ・次画面にSQLと?名前でBodyに記述した値を渡します?
071     *      <og:hidden name="SQL"
072     *              SELECT AAA
073     *              FROM RK01
074     *              WHERE UNIQ = ?
075     *      </og:hidden>
076     *
077     * @og.group 画面部?
078     *
079     * @version  4.0
080     * @author   Kazuhiko Hasegawa
081     * @since    JDK5.0,
082     */
083    public class HiddenTag extends CommonTagSupport {
084            //* こ?プログラ??VERSION??を設定します?       {@value} */
085            private static final String VERSION = "5.2.2.0 (2010/11/01)" ;
086    
087            private static final long serialVersionUID = 522020101101L ;
088    
089            private boolean         isValue         = false;
090            private String          name            = null;
091            private String          value           = null;         // 3.5.5.5 (2004/04/23) value属?を追?
092            private String          keys            = null;
093            private String[]        vals            = null;
094            private String          defaultVal      = null;         // 3.8.5.1 (2006/05/08) defaultVal 属?を追?
095    
096            /**
097             * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします?
098             *
099             * @og.rev 3.0.0.0 (2002/12/25) BodyHiddenTag ?に伴??機?拡張?
100             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
101             *
102             * @return      後続????
103             */
104            @Override
105            public int doStartTag() {
106                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
107    //              if( isValue ) { return(SKIP_BODY);                              }       // Body を評価しな?
108    //              else {                  return( EVAL_BODY_BUFFERED );   }       // Body を評価する? extends BodyTagSupport ?
109    
110                    if( useTag() && !isValue ) {
111                            return( EVAL_BODY_BUFFERED );                   // Body を評価する? extends BodyTagSupport ?
112                    }
113                    return(SKIP_BODY);                                                      // Body を評価しな?
114            }
115    
116            /**
117             * Taglibのタグ本体を処??doAfterBody() ?オーバ?ライドします?
118             *
119             * @og.rev 3.0.0.0 (2002/12/25) BodyHiddenTag ?に伴??機?拡張?
120             * @og.rev 3.1.1.0 (2003/03/28) ボディの?を取得する??、CommonTagSupport で行う?
121             * @og.rev 3.5.5.5 (2004/04/23) value属?を追?
122             *
123             * @return      後続????(SKIP_BODY)
124             */
125            @Override
126            public int doAfterBody() {
127                    String val = getBodyString();
128    
129                    if( val != null && val.length() > 0 ) {
130                            value = StringUtil.replace( val,HybsSystem.CR," " );
131                    }
132    
133                    return(SKIP_BODY);
134            }
135    
136            /**
137             * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
138             *
139             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
140             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
141             *
142             * @return      後続????
143             */
144            @Override
145            public int doEndTag() {
146                    debugPrint();           // 4.0.0 (2005/02/28)
147                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
148                    if( useTag() ) {
149                            jspPrint( makeTag() );
150                    }
151                    return(EVAL_PAGE);
152            }
153    
154            /**
155             * タグリブオブジェクトをリリースします?
156             * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
157             *
158             * @og.rev 3.0.0.0 (2002/12/25) BodyHiddenTag ?に伴??機?拡張?
159             * @og.rev 3.0.1.0 (2003/03/03) names属?とvals属?を追?
160             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
161             * @og.rev 3.5.5.5 (2004/04/23) value属?を追?
162             * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属?を追?
163             *
164             */
165            @Override
166            protected void release2() {
167                    super.release2();
168                    isValue         = false;
169                    name            = null;
170                    value           = null;
171                    keys            = null;
172                    vals            = null;
173                    defaultVal      = null;         // 3.8.5.1 (2006/05/08) defaultVal 属?を追?
174            }
175    
176            /**
177             * ?フィールドを作?します?
178             *
179             * hidden( name ,value )
180             *
181             * <input type="hidden" name="名前" value="???>
182             * <input type="hidden" keys="名前1,名前2???" vals="値1,値2???">
183             *
184             * @og.rev 3.0.1.0 (2003/03/03) names属?とvals属?を追?
185             * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します?
186             * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属?を追?
187             *
188             * @return  ?フィールドタグ??
189             */
190            protected String makeTag() {
191    
192                    checkName() ;
193    
194                    final String rtn ;
195                    if( keys == null ) {
196                            // 注意:互換性維持?為、defaultVal を使用した場合?設定では null がセ?
197                            // されな??して?す?使用しな??合?、null のままです?
198                            // 3.8.5.1 (2006/05/08) defaultVal 属?を追?
199                            if( defaultVal != null ) {
200                                    value = nval( value,defaultVal );
201                            }
202                            rtn = XHTMLTag.hidden( name,value );
203                    } else {
204                            StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
205                            String[] nm = StringUtil.csv2Array( keys );
206                            for( int i=0; i<nm.length; i++ ) {
207                                    String nn = getRequestParameter( nm[i] );
208                                    String vv = getRequestParameter( vals[i] );
209                                    buf.append( XHTMLTag.hidden( nn,vv ) ).append( HybsSystem.CR );
210    
211                            }
212                            rtn = buf.toString();
213                    }
214                    return rtn ;
215            }
216    
217            /**
218             * name,value,keys,vals の相関関係をチェ?します?
219             *
220             * name,value が?ペアで、keys,valsが?ペアです?
221             * name属?とkeys属?は同時には登録できません?
222             *
223             * @og.rev 4.0.0.0 (2007/06/06) 新規追?
224             */
225            private void checkName() {
226                    if( name != null && keys != null ) {
227                            String errMsg = "name属?とkeys属?は同時には登録できません? " + HybsSystem.CR
228                                                    + "name=[" + name + "] keys=[" + keys + "]";
229                            throw new HybsSystemException( errMsg );
230                    }
231    
232                    if( name != null && vals != null ) {
233                            String errMsg = "name属?とvals属?が設定されて?す?: " + HybsSystem.CR
234                                                    + "name属?を指定する?合?、value属?を使用してください? + HybsSystem.CR
235                                                    + "name=[" + name + "] vals=[" + StringUtil.array2line( vals,"," ) + "]";
236                            throw new HybsSystemException( errMsg );
237                    }
238    
239                    if( keys != null && value != null ) {
240                            String errMsg = "keys属?とvalue属?が設定されて?す?: " + HybsSystem.CR
241                                                    + "keys属?を指定する?合?、vals属?を使用してください? + HybsSystem.CR
242                                                    + "keys=[" + keys + "] value=[" + value + "]";
243                            throw new HybsSystemException( errMsg );
244                    }
245            }
246    
247            /**
248             * 【TAG】名前を?しま?name属?とkeys属?は同時には登録できません)?
249             *
250             * @og.tag
251             * 名前を指定します?
252             * name属?とkeys属?は同時には登録できません?
253             *
254             * @og.rev 3.0.1.0 (2003/03/03) names属?とvals属?を追?
255             * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します?
256             *
257             * @param   nm 名前
258             */
259            public void setName( final String nm ) {
260    //              if( keys != null ) {
261    //                      String errMsg = "name属?とkeys属?は同時には登録できません? " + HybsSystem.CR
262    //                                              + "name=[" + nm + "] keys=[" + keys + "]";
263    //                      throw new HybsSystemException( errMsg );
264    //              }
265                    name = nval( getRequestParameter( nm ),name );
266            }
267    
268            /**
269             * 【TAG】?を指定しま?こ?属?を使?BODY部は無視されま??
270             *
271             * @og.tag
272             * ここで値を設定した?合?、BODY 部の値は使用しません?
273             * value="{&#064;value}" などとリクエスト変数を使用した場合に、その値?
274             * 設定されて??ースでも?こ?属?を使用したとみなされます?
275             *
276             * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します?
277             *
278             * @param   val 値
279             */
280            public void setValue( final String val ) {
281                    value = nval( getRequestParameter( val ),"" );
282                    isValue = true;
283            }
284    
285            /**
286             * 【TAG】名前をCSV形式で??しま?name属?とkeys属?は同時には登録できません)?
287             *
288             * @og.tag
289             * 名前をCSV形式で??します?
290             * name属?とkeys属?は同時には登録できません?
291             *
292             * @og.rev 3.0.1.0 (2003/03/03) names属?とvals属?を追?
293             * @og.rev 4.0.0.0 (2007/06/06) names属?をkeys属?に変更
294             *
295             * @param       ns 名前(CSV形?
296             */
297            public void setKeys( final String ns ) {
298    //              if( name != null ) {
299    //                      String errMsg = "name属?とkeys属?は同時には登録できません? " + HybsSystem.CR
300    //                                              + "name=[" + name + "] keys=[" + ns + "]";
301    //                      throw new HybsSystemException( errMsg );
302    //              }
303                    keys = nval( getRequestParameter( ns ),keys ) ;
304            }
305    
306            /**
307             * 【TAG】keys属?に対応する?をCSV形式で??します?
308             *
309             * @og.tag
310             * keys属?に対応する?をCSV形式で??します?
311             * keys属?が設定されて?場合?み、使用されます?
312             * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
313             * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
314             *
315             * @og.rev 3.0.1.0 (2003/03/03) names属?とvals属?を追?
316             * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
317             *
318             * @param       val 値(CSV形?
319             */
320            public void setVals( final String val ) {
321                    vals = getCSVParameter( val );
322            }
323    
324            /**
325             * 【TAG】value属?に値がセ?されて??きに、?期?をセ?します?
326             *
327             * @og.tag
328             * 注意:互換性維持?為、defaultVal を使用した場合?設定では null がセ?
329             * されな??して?す?使用しな??合?、null のままです?
330             *
331             * @og.rev 3.8.5.1 (2006/05/08) defaultVal 属?を追?
332             *
333             * @param       dv 初期値
334             */
335            public void setDefaultVal( final String dv ) {
336                    defaultVal = nval( getRequestParameter( dv ),"" );              // 特?
337            }
338    
339            /**
340             * こ?オブジェクト???表現を返します?
341             * 基本???目?使用します?
342             *
343             * @return こ?クラスの??表現
344             */
345            @Override
346            public String toString() {
347                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
348                                    .println( "VERSION"             ,VERSION        )
349                                    .println( "isValue"     ,isValue        )
350                                    .println( "name"                ,name           )
351                                    .println( "value"               ,value          )
352                                    .println( "keys"                ,keys           )
353                                    .println( "vals"                ,vals           )
354                                    .println( "Other..."    ,getAttributes().getAttribute() )
355                                    .fixForm().toString() ;
356            }
357    }