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