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    }