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