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 static org.opengion.fukurou.util.StringUtil.nval; 019 020import java.io.IOException; 021import java.io.InputStream; 022import java.io.ObjectInputStream; 023import java.io.ObjectOutputStream; 024import java.net.InetAddress; 025import java.net.UnknownHostException; 026// import java.text.DateFormat; 027// import java.text.SimpleDateFormat; 028import java.util.Arrays; 029// import java.util.Calendar; 030import java.util.Collections; 031import java.util.Enumeration; 032import java.util.HashMap; 033import java.util.Locale; 034import java.util.Map; 035import java.util.Scanner; 036 037import javax.servlet.ServletContext; 038import javax.servlet.ServletRequest; 039import javax.servlet.http.Cookie; 040import javax.servlet.http.HttpServletRequest; 041import javax.servlet.http.HttpServletResponse; 042import javax.servlet.http.HttpSession; 043import javax.servlet.jsp.JspWriter; 044import javax.servlet.jsp.tagext.BodyContent; 045import javax.servlet.jsp.tagext.BodyTagSupport; 046import javax.servlet.jsp.tagext.TryCatchFinally; 047 048import org.opengion.fukurou.db.DBFunctionName; 049import org.opengion.fukurou.util.ApplicationInfo; 050import org.opengion.fukurou.util.Attributes; 051import org.opengion.fukurou.util.Closer; 052import org.opengion.fukurou.util.ErrorMessage; 053import org.opengion.fukurou.util.StringUtil; 054import org.opengion.fukurou.util.SystemParameter; 055import org.opengion.fukurou.util.HybsDateUtil; 056import org.opengion.hayabusa.common.HybsSystem; 057import org.opengion.hayabusa.common.HybsSystemException; 058import org.opengion.hayabusa.db.DBColumn; 059import org.opengion.hayabusa.db.DBEventColumn; 060import org.opengion.hayabusa.db.DBLastSql; 061import org.opengion.hayabusa.db.DBTableModel; 062import org.opengion.hayabusa.resource.GUIInfo; 063import org.opengion.hayabusa.resource.LabelInterface; 064import org.opengion.hayabusa.resource.ResourceFactory; 065import org.opengion.hayabusa.resource.ResourceManager; 066import org.opengion.hayabusa.resource.UserInfo; 067 068/** 069 * TagSupport から継承されたサブクラスです。 070 * 071 * 汎用属性 のsetterメソッドと、Attributes オブジェクトを持っています。 072 * それ以外に、{@XXXX} 変数の対応と、lang属性のメソッドも用意しています。 073 * 074 * ロケールは、ユーザー情報の lang 属性をデフォルトで使用し、 075 * セットされていない場合は、リクエスト情報のロケールから取得します。 076 * 077 * 各属性は、{@XXXX} 変数が使用できます。 078 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に 079 * 割り当てます。つまり、このXXXXをキーにリクエストすれば、 080 * この変数に値をセットすることができます。 081 * 082 * http://localhost/query.jsp?KEY1=VLA1&KEY2=VAL2 083 * 084 * のようなリクエストで、{@KEY1} とすれば、 VAL1 がセットされます。 085 * 086 * このタグは、ラベル部分と入力フィールド部分がテーブルタグの<td> 087 * により左右に分割されます。HTML 表示時は、前後に<tr>タグで囲って, 088 * 整形できます。 089 * 090 * @og.group 画面制御 091 * 092 * @version 4.0 093 * @author Kazuhiko Hasegawa 094 * @since JDK5.0, 095 */ 096class CommonTagSupport extends BodyTagSupport implements TryCatchFinally { 097 private static final long serialVersionUID = 574220140320L ; // 5.7.4.2 (2014/03/20) 098 099 private transient Attributes attri = new Attributes(); 100 private transient ResourceManager resource = null; 101 private transient UserInfo userInfo = null; 102 private transient GUIInfo guiInfo = null; 103 private transient HttpSession session = null; 104 private transient ServletRequest request = null; 105 private transient Map<String,String[]> requestCache = null; // 3.5.6.2 (2004/07/05) 106 private transient LabelInterface msglbl = null; // 4.0.0 (2005/01/31) 107 private String language = null; 108 private boolean debugFlag = false; // 3.5.5.3 (2004/04/09) 109 private boolean isReqNull = false; 110 private boolean quotCheck = false; // 4.0.0 (2005/08/31) 111 private String scope = "session"; // "request","page","session","applicaton" 112 // 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。 113// private boolean useValue = true; // 5.1.8.0 (2010/07/01) useValue 属性廃止 114 private Long startTransaction = null; // 3.6.0.8 (2004/11/19) 115 private int[] rowNo = null; // 4.0.0 (2005/01/31) 116// private Calendar rightNow = null; // 3.8.0.2 (2005/07/11) 117// private String rightNow = null; // 5.5.7.2 (2012/10/09) 初期値をCalendarでなくStringで持つ。5.7.4.1 (2014/03/14) 廃止 118 private boolean xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15) 119// private boolean useMainTrans = false; // 5.1.6.0 (2010/05/01) 120 private boolean useTrans = false; // 5.1.6.0 (2010/05/01) 121 122 private String caseKey = null; // 5.2.2.0 (2010/11/01) 新規追加 123 private String caseVal = null; // 5.2.2.0 (2010/11/01) 新規追加 124 private boolean caseNN = true; // 5.6.7.0 (2013/07/27) 新規追加 125 private boolean caseNull = true; // 5.6.8.0 (2013/09/06) 新規追加 126 127 private boolean isSanitized = false; // 5.7.4.2 (2014/03/20) 新規追加 128 129 // 5.5.7.2 (2012/10/09) HybsDateUtil を利用するため、廃止します。 130// private static final Map<String,String> DATE_FORMAT = new HashMap<String,String>(); // 3.8.0.2 (2005/07/11) 131// static { 132// DATE_FORMAT.put( "YMD" ,"yyyyMMdd" ); 133// DATE_FORMAT.put( "Y2MD" ,"yyMMdd" ); 134// DATE_FORMAT.put( "YM" ,"yyyyMM" ); 135// DATE_FORMAT.put( "MD" ,"MMdd" ); // 5.5.5.2 (2012/08/18) 136// DATE_FORMAT.put( "HMS" ,"HHmmss" ); 137// DATE_FORMAT.put( "YMDHMS" ,"yyyyMMddHHmmss" ); 138// DATE_FORMAT.put( "EEE" ,"EEE" ); 139// DATE_FORMAT.put( "YMDF" ,"yyyy/MM/dd" ); 140// DATE_FORMAT.put( "Y2MDF" ,"yy/MM/dd" ); 141// DATE_FORMAT.put( "YMF" ,"yyyy/MM" ); 142// DATE_FORMAT.put( "HMSF" ,"HH:mm:ss" ); 143// DATE_FORMAT.put( "YMDHMSF" ,"yyyy/MM/dd HH:mm:ss" ); 144// DATE_FORMAT.put( "MDF" ,"MM/dd" ); // 5.5.0.2 (2012/03/09) 和暦 145// DATE_FORMAT.put( "MDEF" ,"MM/dd(EEE)" ); // 5.5.0.2 (2012/03/09) 和暦 146// DATE_FORMAT.put( "MD2F" ,"MM月dd日" ); // 5.5.5.2 (2012/08/18) 和暦 147// DATE_FORMAT.put( "GYMDF" ,"GGGGyyyy年MM月dd日" ); // 5.5.0.2 (2012/03/09) 和暦 148// DATE_FORMAT.put( "G2YMDF" ,"Gyyyy/MM/dd" ); // 5.5.0.2 (2012/03/09) 和暦 149// DATE_FORMAT.put( "GYMF" ,"GGGGyyyy年MM月" ); // 5.5.0.2 (2012/03/09) 和暦 150// DATE_FORMAT.put( "GYF" ,"GGGGyyyy" ); // 5.5.0.2 (2012/03/09) 和暦 151// } 152 153 /** 154 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 155 * 156 * @return 後続処理の指示(SKIP_BODY) 157 */ 158 @Override 159 public int doStartTag() { 160 return(SKIP_BODY); // Body を評価しない 161 // return( EVAL_BODY_INCLUDE ); // Body インクルード( extends TagSupport 時) 162 // return( EVAL_BODY_BUFFERED ); // Body を評価する。( extends BodyTagSupport 時) 163 } 164 165 /** 166 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 167 * 168 * @return 後続処理の指示(SKIP_BODY) 169 */ 170 @Override 171 public int doAfterBody() { 172 return(SKIP_BODY); // Body を評価しない 173 // return( EVAL_BODY_AGAIN ); // ボディーを再評価( extends TagSupport 時) 174 // return( EVAL_BODY_BUFFERED ); // ボディーを再評価( extends BodyTagSupport 時) 175 } 176 177 /** 178 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 179 * 180 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 181 * 182 * @return 後続処理の指示 183 */ 184 @Override 185 public int doEndTag() { 186 debugPrint(); // 4.0.0 (2005/02/28) 187 188 return(EVAL_PAGE); // ページの残りを評価する。( extends TagSupport 時) 189 // return(SKIP_PAGE); // ページの残りの処理を行わない。 190 } 191 192 /** 193 * タグの処理中(セッターメソッドを除く)の例外を全て受け取ります。 194 * 195 * タグの中のボディ部の評価中、または Tag.doStartTag(), Tag.doEndTag(), 196 * IterationTag.doAfterBody(), BodyTag.doInitBody() のいずれもの 197 * メソッドの中で、Throwableが投げられたときに呼び出されます。 198 * 199 * このメソッドはセッターメソッドの中でThrowableが起きた場合は呼び出されません。 200 * 201 * @og.rev 3.5.0.0 (2003/09/17) TryCatchFinally インターフェースを適用。 202 * 203 * @param th このタグを通過してきたThrowableな例外 204 */ 205 @Override 206 public void doCatch(final Throwable th) throws Throwable { 207 throw th; 208 } 209 210 /** 211 * タグの処理毎の、doEndTag()の後で呼び出されます。 212 * 213 * Tag,IterationTag,BodyTagを実装した全てのクラスの doEndTag()の 214 * 後で呼び出されます。 このメソッドはタグのボディ部や Tag.doStartTag(), 215 * Tag.doEndTag(), IterationTag.doAfterBody() ,BodyTag.doInitBody()の 216 * すべてのメソッドで例外が発生した後でも呼び出されます。 217 * 218 * このメソッドはセッターメソッドの中でThrowableが起きた場合は呼び出されません。 219 * 220 * このメソッドからは例外を投げるべきではありません。 221 * このメソッドは呼び出し毎のデータの整合性をとることとリソース管理の 222 * 動作をさせることを意図しています。 223 * 224 * @og.rev 3.5.0.0 (2003/09/17) TryCatchFinally インターフェースを適用。 225 * 226 */ 227 @Override 228 public void doFinally() { 229 release2(); 230 } 231 232 /** 233 * タグリブオブジェクトをリリースします。 234 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 235 * 236 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 237 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 238 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。HybsRequestWrapper 廃止。直接 Mapでキャッシュする。 239 * @og.rev 3.1.3.0 (2003/04/10) エンコード情報の取得を廃止する。 240 * @og.rev 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。 241 * @og.rev 3.5.5.3 (2004/04/09) debugFlag を、String ではなく、boolean 型に変更 242 * @og.rev 3.6.0.8 (2004/11/19) startTransaction 属性を追加 243 * @og.rev 3.8.0.2 (2005/07/11) rightNow 属性を追加 244 * @og.rev 5.0.0.2 (2009/09/15) XSS対応 245 * @og.rev 5.1.6.0 (2010/05/01) DBLastSQL周りの実装見直し 246 * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、useValue 属性廃止 247 * @og.rev 5.2.2.0 (2010/11/01) caseKey、caseVal 属性の追加 248 * @og.rev 5.3.2.0 (2011/02/01) paramNames 属性の追加 249 * @og.rev 5.6.7.0 (2013/07/27) caseNN 属性の追加 250 * @og.rev 5.6.8.0 (2013/09/06) caseNull 属性の追加 251 * @og.rev 5.7.4.1 (2014/03/14) rightNow 属性 廃止 252 * @og.rev 5.7.4.1 (2014/03/14) isSanitized 属性の追加 253 */ 254 protected void release2() { 255 language = null; 256 attri = new Attributes(); 257 resource = null; 258 debugFlag = false; // 3.5.5.3 (2004/04/09) 259 userInfo = null; 260 guiInfo = null; 261 session = null; 262 request = null; 263 isReqNull = false; 264 scope = "session"; // "request","page","session","applicaton" 265 requestCache = null; 266// useValue = true; 267 startTransaction = null; // 3.6.0.8 (2004/11/19) 268 rowNo = null; // 4.0.0 (2005/01/31) 269 msglbl = null; // 4.0.0 (2005/01/31) 270// rightNow = null; // 3.8.0.2 (2005/07/11) 追加 , 5.7.4.1 (2014/03/14) 廃止 271 quotCheck = false; // 4.0.0 (2005/08/31) 272 xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15) 273 useTrans = false; // 5.1.6.0 (2010/05/01) 274 caseKey = null; // 5.2.2.0 (2010/11/01) 275 caseVal = null; // 5.2.2.0 (2010/11/01) 276 caseNN = true; // 5.6.7.0 (2013/07/27) 新規追加 277 caseNull = true; // 5.6.8.0 (2013/09/06) 新規追加 278 isSanitized = false; // 5.7.4.2 (2014/03/20) 新規追加。一応入れておくが都度、初期化しています。 279 } 280 281 /** 282 * 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します。 283 * 284 * @og.tag 285 * この言語コードに基づいて、表示のラベルをリソースから作成します。 286 * 287 * @param lang 言語コード[ja/en/zh/…] 288 * @see #getLanguage() 289 */ 290 public void setLanguage( final String lang ) { 291 language = getRequestParameter( lang ); 292 } 293 294 /** 295 * 言語コード[ja/en/zh/…]を取得します。 296 * 297 * 言語コードが、セットされている場合は,設定値を優先します。 298 * 設定されていない場合は、ログインユーザーの持つLANG属性を、それが null の場合は、 299 * 実行環境のリクエストの言語を返します。 300 * 301 * @og.rev 2.1.1.0 (2002/11/08) セッション情報から取得できない場合に、クライアントの 302 * リクエスト情報のロケールから取得する処理を追加 303 * @og.rev 2.2.0.0 (2002/12/17) セッション情報から取得するのではなく、ユーザー情報より 304 * 取得するように変更。そこにない場合は、リクエスト情報の 305 * ロケールから取得する 306 * 307 * @return 言語コード[ja/en/zh/…] 308 * @see #setLanguage( String ) 309 */ 310 protected String getLanguage() { 311 if( language == null ) { 312 language = getUser().getLang(); 313 if( language == null ) { 314 language = getRequest().getLocale().getLanguage(); 315 } 316 } 317 318 if( language != null ) { 319 return language ; 320 } 321 322 String errMsg = "言語コードがセットされていません。" ; 323 throw new HybsSystemException( errMsg ); 324 } 325 326 /** 327 * 【TAG】ラベルリソースのラベルIDを指定します。 328 * 329 * @og.tag 330 * ラベルを変更するときに、lbl属性を使います。 331 * 332 * ラベルID は、所定の language に基づく ResourceManager の 333 * getLabelData( id ) を呼び出し、その結果のLabelInterfaceを使用します。 334 * getMsglbl() で取り出せます。 335 * ラベルとメッセージは統一されました。 336 * 337 * @og.rev 4.0.0.0 (2005/01/31) label 変数は、生データを保管するように変更。 338 * 339 * @param lbl ラベルID 340 * @see #getMsglbl() 341 */ 342 public void setLbl( final String lbl ) { 343// if( msglbl != null ) { 344// String errMsg = "メッセージIDとラベルIDは同時には登録できません。: " + HybsSystem.CR 345// + "msg=[" + msglbl + "] lbl=[" + lbl + "]"; 346// throw new HybsSystemException( errMsg ); 347// } 348 msglbl = (LabelInterface)getResource().getLabelData( getRequestParameter( lbl ) ) ; // 4.0.0 (2005/01/31) 349 } 350 351 /** 352 * 【TAG】メッセージリソースのメッセージIDを指定します。 353 * 354 * @og.tag 355 * メッセージID は、所定の language に基づく ResourceManager の 356 * getMessage( id ) を呼び出し、その結果を msglbl に登録します。 357 * getMsglbl() で取り出せます。 358 * ラベルIDとメッセージIDは同時には登録できません。 359 * 360 * @og.rev 4.0.0.0 (2007/10/17) メッセージリソース統合に伴い、廃止 361 * 362 * @param msg メッセージID 363 */ 364// public void setMsg( final String msg ) { 365// setLbl( msg ); 366// if( msglbl != null ) { 367// String errMsg = "メッセージIDとラベルIDは同時には登録できません。: " + HybsSystem.CR 368// + "msg=[" + msg + "] lbl=[" + msglbl + "]"; 369// throw new HybsSystemException( errMsg ); 370// } 371// msglbl = (LabelInterface)getResource().getMessageData( getRequestParameter( msg ) ) ; // 4.0.0 (2005/01/31) 372// } 373 374 /** 375 * 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)。 376 * 377 * @og.tag 378 * デバッグ情報を [true:出力する/false:しない]を指定します。 379 * 出力形式自体は、個々のタグによって異なります。 380 * 381 * @og.rev 3.5.5.3 (2004/04/09) debugFlag を、String ではなく、boolean 型に変更 382 * 383 * @param flag [true:出力する/それ以外:しない] 384 */ 385 public void setDebug( final String flag ) { 386 debugFlag = nval( getRequestParameter( flag ),debugFlag ); 387 } 388 389 /** 390 * 【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)。 391 * 392 * @og.tag 393 * "request","page","session","applicaton" が指定できます。 394 * JSPのスコープは、「変数の有効範囲」を表すもので、フレームワーク上では、 395 * 主にテーブルモデルを管理するスコープを指します。 396 * 397 * <table border="1" frame="box" rules="all" > 398 * <caption>テーブルモデルを管理するスコープ変数の有効範囲</caption> 399 * <tr><th>スコープ </th><th>変数の有効範囲</th><th>説明</th></tr> 400 * <tr><td>page </td><td>JSPページ内</td> 401 * <td>そのJSPページ内のみで有効です。フレームワーク的には、JSPページにまたがる処理が多いため、ほとんど使う機会はありません。</td></tr> 402 * <tr><td>request </td><td>HTTPリクエスト</td> 403 * <td>リクエストの一連の処理期間中に有効な変数で、メモリに多くの情報を残したくない場合に利用します。検索系やポップアップのJSP画面等に利用します。</td></tr> 404 * <tr><td>session </td><td>HTTPセッション</td> 405 * <td>初期設定されているスコープで、ログインユーザー単位にログアウトまで保持されます。 406 * 内部的には、同じキーワード(tableId)で管理しているため、検索都度、破棄されます。 407 * (ガーベジコレクションにて破棄されるのを待ちます。)</td></tr> 408 * <tr><td>application</td><td>Webアプリケーション</td> 409 * <td>ユーザー間で共有する場合のスコープになります。JSP画面の開発では、まず使うことはありません。</td></tr> 410 * </table> 411 * 412 * @param scp スコープ[request/page/session/applicaton] 413 * @see #getScope() 414 */ 415 public void setScope( final String scp ) { 416 scope = nval( getRequestParameter( scp ),scope ); 417 } 418 419 /** 420 * キャッシュする場合のスコープ[request/page/session/applicaton]を返します。 421 * 422 * "request","page","session","applicaton" があります。 423 * 424 * @og.rev 3.5.5.8 (2004/05/20) 新規追加 425 * 426 * @return スコープ[request/page/session/applicaton] 427 * @see #setScope( String ) 428 */ 429 public String getScope() { 430 return scope ; 431 } 432 433 /** 434 * 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)。 435 * 436 * @og.tag 437 * caseKey.matches( caseVal ) の値が、true の場合は、このタグは使用されます。 438 * false の場合は、このタグは使用されません。 439 * 440 * caseKey , caseVal ともに null の場合は、true です。どちらかが、非null の場合は、 441 * もう片方も 非null で、かつ、caseKey.matches( caseVal ) が成立する必要があります。 442 * この属性は、caseKey , caseVal , caseNN , caseNull とともに useTag() の判定で使用されます。 443 * 444 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 445 * @og.rev 5.6.3.3 (2013/04/19) 条件変更のためのコメント修正 446 * 447 * @param ckey 条件キー(何も指定されない場合は、使用すると判断) 448 * @see #setCaseVal( String ) 449 * @see #useTag() 450 */ 451 public void setCaseKey( final String ckey ) { 452 caseKey = nval( getRequestParameter( ckey ),caseKey ); 453 } 454 455 /** 456 * 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)。 457 * 458 * @og.tag 459 * caseKey.matches( caseVal ) の値が、true の場合は、このタグは使用されます。 460 * false の場合は、このタグは使用されません。 461 * 462 * caseKey , caseVal ともに null の場合は、true です。どちらかが、非null の場合は、 463 * もう片方も 非null で、かつ、caseKey.matches( caseVal ) が成立する必要があります。 464 * この属性は、caseKey , caseVal , caseNN , caseNull とともに useTag() の判定で使用されます。 465 * 466 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 467 * @og.rev 5.6.3.3 (2013/04/19) 条件変更のためのコメント修正 468 * 469 * @param cval 条件値(何も指定されない場合は、使用すると判断) 470 * @see #setCaseKey( String ) 471 * @see #useTag() 472 */ 473 public void setCaseVal( final String cval ) { 474 caseVal = nval( getRequestParameter( cval ),caseVal ); 475 } 476 477 /** 478 * 【TAG】このタグ自体を利用するかどうかの条件として、NotNullかどうか判定します(初期値:true)。 479 * 480 * @og.tag 481 * この値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます。 482 * null/ゼロ文字列 の場合は、このタグは使用されません。 483 * 何も指定しない場合は、使用されます。 484 * caseNull と逆の動きをします。 485 * {@XXXX} で、指定した場合は、値が設定されなければ、使用されません。 486 * 487 * この属性は、caseKey , caseVal , caseNN , caseNull とともに useTag() の判定で使用されます。 488 * 489 * @og.rev 5.6.7.0 (2013/07/27) 新規追加 490 * 491 * @param cnn NotNullかどうか判定する属性(何も指定されない場合は、使用すると判断) 492 * @see #setCaseVal( String ) 493 * @see #useTag() 494 */ 495 public void setCaseNN( final String cnn ) { 496 String tempNN = nval( getRequestParameter( cnn ),null ); 497 498 caseNN = ( tempNN != null && !tempNN.isEmpty() ); 499 } 500 501 /** 502 * 【TAG】このタグ自体を利用するかどうかの条件として、Nullかどうか判定します(初期値:true)。 503 * 504 * @og.tag 505 * この値が、null/ゼロ文字列 の場合は、このタグは使用されます。 506 * null/ゼロ文字列 でない場合は、このタグは使用されません。 507 * 何も指定しない場合は、使用されます。 508 * caseNN と逆の動きをします。 509 * {@XXXX} で、指定した場合は、値が設定されていなければ、使用されます。 510 * 511 * この属性は、caseKey , caseVal , caseNN , caseNull とともに useTag() の判定で使用されます。 512 * 513 * @og.rev 5.6.8.0 (2013/09/06) 新規追加 514 * 515 * @param cnul NotNullかどうか判定する属性(何も指定されない場合は、使用すると判断) 516 * @see #setCaseVal( String ) 517 * @see #useTag() 518 */ 519 public void setCaseNull( final String cnul ) { 520 String tempNull = nval( getRequestParameter( cnul ),null ); 521 522 caseNull = ( tempNull == null || tempNull.isEmpty() ); 523 } 524 525 /** 526 * このタグ自体を利用するかどうかの条件判定を行います。 527 * 528 * caseNN && caseNull && 529 * ( (caseKey == null && caseVal == null) || 530 * (caseKey != null && caseVal != null && caseKey.matches( caseVal ))) 531 * の結果を返します。 532 * 533 * これは、タグ本体に、条件式を登録できる機能です。必要なタグには、tld ファイルで、 534 * caseKey 、caseVal 、caseNN 、caseNull属性が使用できるように、設定します。 535 * 各タグを、equals タグで括る方法では、ソースの見通しが悪くなるため、 536 * ある程度タグ自身に判定機能を設けることで対応できるようにしました。 537 * ただ、本来、JSP 側にロジックを持ち込むのはよくないので、利用に関しては、 538 * 慎重にお願いします。 539 * 540 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 541 * @og.rev 5.6.3.3 (2013/04/19) 条件変更(caseKey と caseVal が 両方とも null の場合のみ true) 542 * @og.rev 5.6.7.0 (2013/07/27) caseNN 属性追加。先のcaseKey、caseVal 条件と、AND 結合になります。 543 * @og.rev 5.6.8.0 (2013/09/06) caseNull 属性追加。先の条件と、AND 結合になります。 544 * 545 * @return このタグ自体を利用するかどうか(true:利用する/false:利用しない) 546 * @see #setCaseVal( String ) 547 * @see #setCaseKey( String ) 548 * @see #setCaseNN( String ) 549 */ 550 protected boolean useTag() { 551// return (caseKey == null) || (caseVal == null) || caseKey.matches( caseVal ) ; 552// return (caseKey == null && caseVal == null) || (caseKey != null && caseVal != null && caseKey.matches( caseVal )) ; 553// return caseNN && 554 return caseNN && caseNull && 555 ( (caseKey == null && caseVal == null) || 556 (caseKey != null && caseVal != null && caseKey.matches( caseVal ))) ; 557 } 558 559 /** 560 * (通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)。 561 * 562 * この値は、ファイルダウンロード処理に影響します。この値がtrueに指定された時にcommitされたDBTableModelが 563 * ファイルダウンロードの対象の表になります。 564 * 565 * このパラメーターは、通常、各タグにより実装され、ユーザーが指定する必要はありません。 566 * 但し、1つのJSP内でDBTableModelが複数生成される場合に、前に処理したDBTableModelについてファイルダウンロードをさせたい 567 * 場合は、後ろでDBTableModelを生成するタグで、明示的にこの値をfalseに指定することで、ファイルダウンロード処理の対象から 568 * 除外することができます。 569 * 570 * @og.rev 5.1.6.0 (2010/05/01) 新規作成 571 * 572 * @param flag メイントランザクションかどうか 573 */ 574 protected void useMainTrans( final boolean flag ) { 575 useTrans = flag; 576 } 577 578 /** 579 * メッセージラベル(msglbl)を取得します。 580 * 581 * メッセージラベルは、lbl属性で登録された値を、 582 * それぞれのリソースに応じて各言語に変換した結果を格納しています。 583 * 584 * @og.rev 4.0.0.0 (2005/01/31) msglbl は、LabelInterface オブジェクトを利用 585 * 586 * @return メッセージラベル 587 * @see #setLbl( String ) 588 */ 589 protected String getMsglbl() { 590 String rtn = null; 591 592 if( msglbl != null ) { rtn = msglbl.getLabel(); } 593 594 return rtn ; 595 } 596 597 /** 598 * メッセージラベル(msglbl)のチップス表記を取得します。 599 * 600 * メッセージラベルは、lbl属性で登録された値を、 601 * それぞれのリソースに応じて各言語に変換した結果を格納しています。 602 * 別途、title属性を指定している場合は、置き換えます。 603 * 604 * @og.rev 4.0.0.0 (2005/01/31) msglbl は、LabelInterface オブジェクトを利用 605 * 606 * @return メッセージラベル 607 */ 608 protected String getLongLabel() { 609 String rtn = null; 610 611 if( msglbl != null ) { 612 rtn = msglbl.getLongLabel( get( "title" ) ); 613 } 614 615 return rtn ; 616 } 617 618 /** 619 * メッセージラベル(LabelInterface)を取得します。 620 * 621 * メッセージラベルは、lbl属性で登録された値を、 622 * それぞれのリソースに応じて各言語に変換した結果を格納しています。 623 * 624 * @return メッセージラベル 625 */ 626 protected LabelInterface getLabelInterface() { 627 return msglbl ; 628 } 629 630 /** 631 * メッセージリソース情報を処理します。 632 * 633 * これは、{@MSG.XXXX AA @BB #CC} 引数処理をおこなうための、サポートメソッドです。 634 * 引数は、"XXXX AA @BB #CC" という状態で受け取ります。(MSG. ははずした形) 635 * "AA @BB #CC" は、スペースで区切られたメッセージリソースの引数文字です。 636 * この、引数文字には、通常文字(AA)、リクエスト文字(@BB)、ラベル文字(#CC)が指定できます。 637 * ・通常文字(AA):そのまま、メッセージリソースの引数にセットされます。 638 * ・リクエスト文字(@BB):リクエスト引数に置き換えます。通常、{@BB} 指定しますが、 639 * メッセージパラメータの引数、{@XXXX ・・・ {@BB} ・・・} と、入れ子で指定できないため、 640 * {@XXXX ・・・ @BB ・・・} と、省略形で指定します。よって、引数として、通常文字の 641 * 先頭に、"@" を使用することは出来ません。 642 * ・ラベル文字(#CC):ラベルキーを指定されたと解釈して、処理します。これは、"CC"を 643 * キーに、ラベルリソースを検索し、その言語に応じた文字に変換後、メッセージリソースの 644 * 引数に指定します。PL/SQL等で、SET_ERRMSGS プロシージャの引数に、{#CC} 文字を 645 * 指定して、ラベルリソースを利用できますが、{@XXXX ・・・ {#CC} ・・・} と、入れ子で 646 * 指定できないため、{@XXXX ・・・ #CC ・・・} と、省略形で指定します。 647 * よって、引数として、通常文字の先頭に、"#" を使用することは出来ません。(エスケープ未採用) 648 * メッセージキーそのものをパラメータ化することが出来ます。 649 * これは、{@MSG.@XXXX}という形式になります。引数は、先の説明と同じです。 650 * この場合は、XXXX をキーにリクエスト引数の値が、メッセージリソースのキーになります。 651 * 652 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 653 * @og.rev 4.0.0.0 (2007/10/17) メッセージリソース統合に伴い、廃止 654 * 655 * @param msg パラメータ 656 * 657 * @return メッセージ情報 658 */ 659// protected String getMessage( final String msg ) { 660// String key = msg; 661// String[] msgVals = null; 662// int spc = msg.indexOf( ' ' ); // スペースがあるかどうか 663// if( spc > 0 ) { 664// key = msg.substring( 0,spc ); 665// msgVals = StringUtil.csv2Array( msg.substring( spc+1 ),' ' ); 666// for( int i=0; i<msgVals.length; i++ ) { 667// // リクエスト文字パラメータ時の処理。その他は、ラベル文字は処理不要。 668// if( msgVals[i].startsWith( "@" ) ) { 669// msgVals[i] = getRequestValue( msgVals[i].substring( 1 ) ); 670// } 671// } 672// } 673// if( key.charAt(0) == '@' ) { key = getRequestValue( key.substring( 1 ) ); } 674// 675// return getResource().getMessage( key,msgVals ); 676// } 677 678 /** 679 * メッセージラベル(msglbl)を設定します。 680 * 681 * メッセージラベルは、meg属性か、lbl属性で登録された値を、 682 * それぞれのリソースに応じて各言語に変換した結果を格納しています。 683 * meg属性 と lbl属性は、同時登録できません。 684 * ここで登録された値が、最優先されます。 685 * もちろん、protected メソッドなので、TagLib属性での登録はできません。 686 * 687 * @og.rev 5.2.2.0 (2010/11/01) メッセージリソース統合に伴い、廃止 688 * 689 * @param lbl メッセージラベル 690 */ 691// protected void setMsglbl( final String lbl ) { 692// if( msglbl != null ) { 693// String errMsg = "メッセージIDとラベルIDは同時には登録できません。: " + HybsSystem.CR 694// + "label=[" + lbl + "] msglbl=[" + msglbl + "]"; 695// throw new HybsSystemException( errMsg ); 696// } 697// msglbl = (LabelInterface)getResource().getLabelData( getRequestParameter( lbl ) ) ; // 4.0.0 (2005/01/31) 698// } 699 700 /** 701 * ResourceManager を取得します。 702 * 703 * ページスコープ にセットされた ResourceManager があれば、それを、 704 * なければ、language 属性よりデフォルト ResourceManager を構築します。 705 * LOCAL_RES_KEY で管理される ResourceManager は、LocalResourceTag で 706 * 登録されたリソースです。これは、ローカルリソース情報として、使用されます。 707 * 708 * @return ResourceManagerオブジェクト 709 */ 710 protected ResourceManager getResource() { 711 if( resource == null ) { 712 resource = (ResourceManager)pageContext.getAttribute( HybsSystem.LOCAL_RES_KEY ); 713 if( resource == null ) { 714 resource = ResourceFactory.newInstance( getLanguage() ); 715 } 716 } 717 return resource; 718 } 719 720 /** 721 * デバッグ状態 を取得します。 722 * 723 * setDebug( String )で登録します。 724 * 初期値は、false です。 725 * 726 * @og.rev 3.5.5.3 (2004/04/09) getDebug() から、メソッド名変更 727 * 728 * @return true(デバッグ状態)/ false(通常) 729 */ 730 protected boolean isDebug() { 731 return debugFlag ; 732 } 733 734 /** 735 * ラベル文字列を返します。 736 * 737 * これは、{@LBL.XXXX %Y} 引数処理をおこなうための、サポートメソッドです。 738 * 引数は、"XXXX %Y" という状態で受け取ります。(LBL. ははずした形) 739 * ラベルには、通常のラベル(Label)以外に、Short,Tips,Description,RawShortLabel の情報を持っています。 740 * {@LBL.XXXX %Y} の Y に、先のLabel,Short,Tips,Description,RawShortLabel,CodeData の頭文字('L','S','T','D','R','C')を 741 * 指定することで、それぞれの状態を取得することが可能になります。 742 * Y を指定しない場合({@LBL.XXXX}) は、'L' が指定された場合と同じ効果があります。 743 * Y は、先頭文字1文字で判断していますので、{@LBL.XXXX %Short}と記述できます。 744 * Y 引数には、@で始まるリクエスト引数が指定できます。例えば、{@LBL.XXXX @ZZ} 745 * とすると、ZZ のリクエスト引数の値が Y に適用されます。 746 * ラベルキーそのものをパラメータ化することが出来ます。 747 * これは、{@LBL.@XXXX}という形式になります。引数は、先の説明と同じです。 748 * この場合は、XXXX をキーにリクエスト引数の値が、ラベルリソースのキーになります。 749 * 750 * @og.rev 4.0.0.0 (2007/10/17) メッセージリソース統合に伴い、{@LBL.XXXX Y}⇒{@LBL.XXXX %Y} 751 * @og.rev 5.4.0.1 (2011/11/01) ラベル形式('L','S','T','D') に、R(RawShortLabel) を追加 752 * @og.rev 5.5.7.2 (2012/10/09) ラベル形式('L','S','T','D','R') に、C(CodeData) を追加 753 * 754 * @param lbl ラベルのキー 755 * 756 * @return ラベル文字列 757 */ 758 protected String getLabel( final String lbl ) { 759 760 String key = lbl ; 761 String val = null; 762 763 int spc = lbl.indexOf( ' ' ); // " " があるかどうか 764 if( spc > 0 ) { 765 key = lbl.substring( 0,spc ); 766 if( key.charAt(0) == '@' ) { key = getRequestValue( key.substring( 1 ) ); } 767 768 // リクエスト引数が指定された場合 769 char ch = lbl.length() > spc+1 ? lbl.toUpperCase( Locale.JAPAN ).charAt( spc+1 ) : ' '; // Label,Short,Tips,Description 770 char ch2 = lbl.length() > spc+2 ? lbl.toUpperCase( Locale.JAPAN ).charAt( spc+2 ) : ' '; // Label,Short,Tips,Description 771 if( ch == '@' ) { 772 String tmp = getRequestValue( lbl.substring( spc+2 ) ); 773 if( tmp != null && tmp.length() > 0 ) { 774 ch = tmp.toUpperCase( Locale.JAPAN ).charAt( 0 ); 775 ch2 = tmp.length() > 1 ? tmp.toUpperCase( Locale.JAPAN ).charAt( 1 ) : ' '; 776 } 777 } 778 // 4.0.0.0 (2007/10/19) 779 if( ch == '%' ) { 780 switch( ch2 ) { 781 case 'L': val = getResource().getLabel( key ); break; 782 case 'S': val = getResource().getLabelData( key ).getShortLabel(); break; 783 case 'T': val = getResource().getLabelData( key ).getLongLabel(); break; 784 case 'D': val = getResource().getLabelData( key ).getDescription(); break; 785 case 'R': val = getResource().getLabelData( key ).getRawShortLabel(); break; // 5.4.0.1 (2011/11/01) 786 case 'C': val = getResource().getLabelData( key + "." + getRequestValue( key ) ).getShortLabel(); break; // 5.5.7.2 (2012/10/09) 787 default : break; 788 } 789 } 790 else if( ch != ' ' ) { 791 String[] msgVals = StringUtil.csv2Array( lbl.substring( spc+1 ),' ' ); 792 for( int i=0; i<msgVals.length; i++ ) { 793 // リクエスト文字パラメータ時の処理。その他は、ラベル文字は処理不要。 794 if( msgVals[i].startsWith( "@" ) ) { 795 msgVals[i] = getRequestValue( msgVals[i].substring( 1 ) ); 796 } 797 } 798 val = getResource().getLabel( key,msgVals ); 799 } 800 } 801 else { 802 if( key.charAt(0) == '@' ) { key = getRequestValue( key.substring( 1 ) ); } 803 } 804 805 if( val == null ) { val = getResource().getLabel( key ); } 806 return val; 807 } 808 809 /** 810 * DBColumn オブジェクトを返します。 811 * 812 * これは、キーを元に DBColumnオブジェクトをカラムリソースの 813 * 定義ファイルより取得して、リソースマネージャで管理します。 814 * 815 * @param key オブジェクトのキー 816 * 817 * @return DBColumnオブジェクト 818 */ 819 protected DBColumn getDBColumn( final String key ) { 820 return getResource().makeDBColumn( key ) ; 821 } 822 823 /** 824 * 内部の Attributes オブジェクトに、属性値をセットします。 825 * 826 * 同じキーの値が登録されていた場合は、置き換えられます。 827 * 828 * @param key キー 829 * @param value 属性値 830 * @see #add( String , String ) 831 */ 832 protected void set( final String key, final String value ) { 833 attri.set( key,value ); 834 } 835 836 /** 837 * 内部の Attributes オブジェクトに、属性値を追加します。 838 * 839 * ここでは、すでに同じキーが登録されている場合は、その値に、 840 * 標準セパレータ(スペース)を追加して、文字列結合します。 841 * たとえば、class 属性などは、値をスペースで追加する事で、 842 * CSS で処理することができます。 843 * 844 * @og.rev 4.0.0.0 (2007/05/18) 新規追加 845 * 846 * @param key キー 847 * @param value 属性値 848 * @see #add( String , String , String ) 849 * @see #set( String , String ) 850 */ 851 protected void add( final String key, final String value ) { 852 attri.add( key,value ); 853 } 854 855 /** 856 * 内部の Attributes オブジェクトに、属性値を追加します。 857 * 858 * ここでは、すでに同じキーが登録されている場合は、その値に、 859 * 引数のセパレータを追加して、文字列結合します。 860 * 861 * @og.rev 3.5.0.0 (2003/09/17) 新規追加 862 * @og.rev 3.5.5.9 (2004/06/07) セパレータ引数付きのメソッドに変更 863 * 864 * @param key キー 865 * @param value 属性値 866 * @param sepa セパレータ 867 * @see #add( String , String ) 868 */ 869 protected void add( final String key, final String value, final String sepa ) { 870 attri.add( key,value,sepa ); 871 } 872 873 /** 874 * 内部の Attributes オブジェクトから、属性値を取得します。 875 * 876 * @param key キー 877 * 878 * @return 属性値 879 * @see #set( String , String ) 880 */ 881 protected String get( final String key ) { 882 return attri.get( key ); 883 } 884 885 /** 886 * 属性オブジェクトの取得。 887 * 888 * Attributes オブジェクトを取得します。 889 * 890 * @return Attributesオブジェクト 891 */ 892 protected Attributes getAttributes() { 893 return attri; 894 } 895 896 /** 897 * {@XXXX} 形式の文字列から XXXX をキーとして ServletRequest から getParameter で値を取り出します。 898 * 899 * 他の文字列に混在した {@XXXX} 文字を変換可能です。 900 * ただし、処理の簡素化のため、上記形式以外は変換いたしません。 901 * エラー例)× { @XXXX }、{@ XXXX }、{@XXXX@yyyy}、{@XXXX{@yyyy}} 902 * また、"{@" を通常の記述で使うことは無いと考え、エスケープも用意して 903 * いません。よって、"{@" のパターンが見つかって,"}" で閉じられていない 904 * 場合は,エラーとして、HybsSystemException を throw します。 905 * 906 * @og.rev 3.8.0.4 (2005/08/08) {} の処理方法見直し。連続処理、単体処理を可能にします。 907 * 908 * @param key リクエストのキー 909 * 910 * @return リクエストの値 911 */ 912 protected String getRequestParameter( final String key ) { 913 isReqNull = false; 914 915 if( key == null ) { isReqNull = true; return ""; } 916 int index = key.indexOf( "{@" ); 917 if( index < 0 ) { return key; } 918 919 // 変数が "{@XXXX}" の場合を優先的に検索。 920 // これにより多くのパターンで、StringTokenizer による 921 // 文字列操作を行う必要がなくなります。 922 if( index == 0 && 923 ( key.indexOf( '}' ) == key.lastIndexOf( '}' ) ) && 924 ( key.charAt(key.length()-1) == '}' ) ) { 925 return getRequestValue( key.substring( 2,key.length()-1 ) ); 926 } 927 928 // 3.8.0.4 (2005/08/08) {} の処理方法見直し。連続処理、単体処理を可能にします。 929 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_SMALL ); 930 int start = 0; 931 while( index >= 0 ) { 932 int end = key.indexOf( '}',index ); 933 if( end < 0 ) { 934 String errMsg = "{@ と } との対応関係がずれています。" + HybsSystem.CR 935 + "key=[" + key + "] : index=" + index ; 936 throw new HybsSystemException( errMsg ); 937 } 938 939 // {@ より前方の文字列を追加 940 if( index > 0 ) { rtn.append( key.substring( start,index ) ); } 941 942 // {@XXXX} の XXXX部分を処理 943 String val = getRequestValue( key.substring( index+2,end ) ); 944 if( val != null ) { rtn.append( val ); } 945 946 start = end+1 ; 947 index = key.indexOf( "{@",start ); 948 } 949 rtn.append( key.substring( start ) ); 950 951 return rtn.toString(); 952 } 953 954 /** 955 * {@XXX.YYYY} 形式の文字列から値を取得します。 956 * 予約語のみ処理をし、それ以外は{@xxx}のままとします。 957 * 958 * 他の文字列に混在した {@XXXX} 文字を変換可能です。 959 * ただし、処理の簡素化のため、上記形式以外は変換いたしません。 960 * エラー例)× { @XXXX }、{@ XXXX }、{@XXXX@yyyy}、{@XXXX{@yyyy}} 961 * また、"{@" を通常の記述で使うことは無いと考え、エスケープも用意して 962 * いません。よって、"{@" のパターンが見つかって,"}" で閉じられていない 963 * 場合は,エラーとして、HybsSystemException を throw します。 964 * 965 * @og.rev 5.5.4.0 (2012/07/02) 新規作成 966 * 967 * @param key リクエストのキー 968 * 969 * @return リクエストの値 970 */ 971 protected String getReservedParameter( final String key ) { 972 isReqNull = false; 973 974 if( key == null ) { isReqNull = true; return ""; } 975 int index = key.indexOf( "{@" ); 976 if( index < 0 ) { return key; } 977 978 // 変数が "{@XXXX}" の場合を優先的に検索。 979 // これにより多くのパターンで、StringTokenizer による 980 // 文字列操作を行う必要がなくなります。 981 if( index == 0 && 982 ( key.indexOf( '}' ) == key.lastIndexOf( '}' ) ) && 983 ( key.charAt(key.length()-1) == '}' ) ) { 984 return getReservedValue( key.substring( 2,key.length()-1 ) ); 985 } 986 987 // 3.8.0.4 (2005/08/08) {} の処理方法見直し。連続処理、単体処理を可能にします。 988 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_SMALL ); 989 int start = 0; 990 while( index >= 0 ) { 991 int end = key.indexOf( '}',index ); 992 if( end < 0 ) { 993 String errMsg = "{@ と } との対応関係がずれています。" + HybsSystem.CR 994 + "key=[" + key + "] : index=" + index ; 995 throw new HybsSystemException( errMsg ); 996 } 997 998 // {@ より前方の文字列を追加 999 if( index > 0 ) { rtn.append( key.substring( start,index ) ); } 1000 1001 // {@XXXX} の XXXX部分を処理 1002 String val = getReservedValue( key.substring( index+2,end ) ); 1003 if( val != null ) { rtn.append( val ); } 1004 1005 start = end+1 ; 1006 index = key.indexOf( "{@",start ); 1007 } 1008 rtn.append( key.substring( start ) ); 1009 1010 return rtn.toString(); 1011 } 1012 1013 /** 1014 * {@XXXX} 形式の文字列から XXXX をキーとして ServletRequest から getParameterValues で値を取り出します。 1015 * 1016 * これは、複数(配列)でリクエストを取り出すことが可能です。 1017 * そのため、他の文字列に混在させて変換することができません。 1018 * "{@XXXX}" 形式 からのみの変換となります。 1019 * 1020 * @og.rev 3.6.0.0 (2004/09/22) キーがnull のときにnullではなく長さ0の配列を返します。 1021 * 1022 * @param key リクエストのキー 1023 * 1024 * @return リクエストの値 1025 */ 1026 protected String[] getRequestParameterValues( final String key ) { 1027 if( key == null ) { return new String[0]; } // 3.6.0.0 (2004/09/22) 1028 int index = key.indexOf( "{@" ); 1029 if( index < 0 ) { return StringUtil.csv2Array( key ); } 1030 1031 if( index == 0 && ( key.charAt( key.length()-1 ) == '}' )) { 1032 return getRequestValues( key.substring( 2,key.length()-1 ) ); 1033 } 1034 1035 String errMsg = "引数の形式が異なります。 [" + key + "]" ; 1036 throw new HybsSystemException( errMsg ); 1037 } 1038 1039 /** 1040 * 引数 in が、引数 check の文字列の中に存在すれば、 true を、存在しなければ、false を返します。 1041 * 1042 * check は、 非null のString を、in は、null でも構いません。 1043 * 1044 * @param in チェックする文字列 1045 * @param check チェック用の基本文字列 1046 * 1047 * @return 存在する true / 存在しない false 1048 */ 1049 protected boolean check( final String in, final String check ) { 1050 if( in == null ) { return false; } 1051 return check.indexOf( in ) >= 0 ; 1052 } 1053 1054 /** 1055 * 引数 in が、引数 check の文字列配列の中に存在すれば、 true を、存在しなければ、false を返します。 1056 * 1057 * check は、 String配列 を、in は、null でも構いません。 1058 * 1059 * @og.rev 2.1.0.3 (2002/11/08) 文字列配列を引数に取るメソッドを追加 1060 * 1061 * @param in チェックする文字列 1062 * @param check チェック用の基本文字列配列 1063 * 1064 * @return 存在する true / 存在しない false 1065 */ 1066 protected boolean check( final String in, final String[] check ) { 1067 if( in == null || check == null ) { return false; } 1068 for( int i=0; i<check.length; i++ ) { 1069 if( in.equals( check[i] ) ) { return true; } 1070 } 1071 return false ; 1072 } 1073 1074 /** 1075 * ユーザーオブジェクトが持っている内部情報を取得します。 1076 * 1077 * これは、UserInfo#getAttribute( String ) で取得される情報です。 1078 * ユーザーパラメータとは異なります。 1079 * 1080 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 getUser() を使用するように変更 1081 * 1082 * @param user ユーザー情報を取り出すキー 1083 * 1084 * @return ユーザー情報文字列 1085 */ 1086 protected String getUserInfo( final String user ) { 1087 if( user == null ) { return null; } 1088 1089 String key = user ; 1090 if( key.charAt(0) == '@' ) { 1091 key = getRequestValue( key.substring( 1 ) ); 1092 } 1093 1094 return getUser().getAttribute( key ); 1095 } 1096 1097 /** 1098 * ユーザーオブジェクトが持っているEditの内部情報を取得します。 1099 * 1100 * これは、UserInfo#getSelectedEdit( String ) で取得される情報です。 1101 * ユーザーパラメータとは異なります。 1102 * 1103 * @og.rev 5.8.2.3 (2014/12/27) 新規作成 1104 * 1105 * @param guikey 取り出す画面ID 1106 * 1107 * @return ユーザー情報文字列 1108 */ 1109 protected String getUserEditInfo( final String guikey ) { 1110 if( guikey == null ) { return null; } 1111 1112 String key = guikey ; 1113 if( key.charAt(0) == '@' ) { 1114 key = getRequestValue( key.substring( 1 ) ); 1115 } 1116 1117 return getUser().getSelectedEdit( key ); 1118 } 1119 1120 /** 1121 * ユーザー情報を設定します。 1122 * 1123 * 初めての場合は、session 登録項目 の HybsSystem#USERINFO_KEY キー の値で 1124 * 取得します。 1125 * 1126 * @og.rev 2.1.1.4 (2002/11/25) ユーザー情報をセットするメソッドを追加 1127 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 getUser() を使用するように変更 1128 * @og.rev 4.3.4.0 (2008/12/01) GE20(ユーザー定数)へ登録するかのフラグを追加 1129 * 1130 * @param key ユーザー情報をセットするキー 1131 * @param value ユーザー情報文字列 1132 * @param save GE20(ユーザー定数)に情報を保存するか 1133 */ 1134// protected void setUserInfo( final String key,final String value ) { 1135 protected void setUserInfo( final String key,final String value, final boolean save ) { 1136 if( key != null ) { 1137// getUser().setAttribute( key, value ); 1138 getUser().setAttribute( key, value, save ); 1139 } 1140 } 1141 1142 /** 1143 * ユーザー情報オブジェクトを取得します。 1144 * 1145 * 初めての場合は、session 登録項目 の HybsSystem#USERINFO_KEY キー の値で 1146 * 取得します。 1147 * 1148 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 新規追加 1149 * @og.rev 3.6.0.0 (2004/09/17) private ⇒ protected 化します。 1150 * 1151 * @return ユーザー情報オブジェクト 1152 */ 1153 protected UserInfo getUser() { 1154 if( userInfo == null ) { 1155 userInfo = (UserInfo)getSessionAttribute( HybsSystem.USERINFO_KEY ); 1156 } 1157 if( userInfo == null ) { 1158 String errMsg = "ユーザーオブジェクトが存在しません。"; 1159 throw new HybsSystemException( errMsg ); 1160 } 1161 return userInfo ; 1162 } 1163 1164 /** 1165 * 画面情報(GUIInfo)を取得します。 1166 * 1167 * これは、session 登録項目 の HybsSystem#GUIMAP_KEY キー の値で 1168 * 登録された MAP を取り出し、そこから取得します。 1169 * 画面情報は、ログインユーザー毎に個別に持っています。 1170 * 1171 * @og.rev 4.0.0.0 (2005/01/31) GUIInfo が存在しない場合も処理を続けます。 1172 * 1173 * @param gamenId 画面ID 1174 * 1175 * @return 画面情報(GUIInfo) 1176 */ 1177 protected GUIInfo getGUIInfo( final String gamenId ) { 1178 return getUser().getGUIInfo( gamenId ); 1179 } 1180 1181 /** 1182 * 画面情報(GUIInfo)の属性値を取得します。 1183 * 1184 * これは、{@GUI.XXXX ID} 引数処理をおこなうための、サポートメソッドです。 1185 * 引数は、"XXXX ID" という状態で受け取ります。(GUI. ははずした形) 1186 * XXXXには、画面情報(GUIInfo)の属性キーを指定します。IDが指定されない場合は、 1187 * 実行中の自分自身の画面が指定されたことになります。 1188 * これは、session 登録項目 の HybsSystem#GUIINFO_KEY キー の値で取得します。 1189 * この値は,画面が呼び出される毎に毎回設定されており、リクエスト毎に 1190 * 所得し直す必要があります。 1191 * 1192 * ID に、画面IDを指定した場合は、@ 指定によるリクエスト引数の値を適用できます。 1193 * {@GUI.@XXXX ID} や、{@GUI.XXXX @ID} です。(同時指定も可能) 1194 * 1195 * @og.rev 3.6.0.6 (2004/10/22) GUIInfo が存在しない場合も処理を続けます。 1196 * @og.rev 4.0.0.0 (2004/11/30) 画面ID引数や、リクエスト引数の使用を可能にします。 1197 * @og.rev 5.9.32.2 (2018/05/18) エラー表示変更 1198 * @og.rev 5.10.12.3 (2019/06/21) エラー表示変更 1199 * 1200 * @param attkey 画面情報を取り出すキー 1201 * 1202 * @return 画面情報文字列 1203 */ 1204 protected String getGUIInfoAttri( final String attkey ) { 1205 if( attkey == null ) { return null; } 1206 1207 String key = attkey ; 1208 final GUIInfo gui ; 1209 1210 int spc = key.indexOf( ' ' ); // " " があるかどうか 1211 if( spc > 0 ) { 1212 key = attkey.substring( 0,spc ); 1213 String id = attkey.substring( spc+1 ); 1214 if( id.charAt(0) == '@' ) { id = getRequestValue( id.substring( 1 ) ); } 1215 1216 gui = getUser().getGUIInfo( id ); 1217 } 1218 else { 1219 if( guiInfo == null ) { 1220 guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY ); 1221 } 1222 gui = guiInfo; 1223 } 1224// if( gui == null ) { return "Not Found[" + attkey + "]"; } 1225// if( gui == null ) { return "Not Found(" + attkey + ")"; } // 5.9.32.2 (2018/05/18) []で囲むとテーブルモデルで予期せぬエラーになるため変更 1226 if( gui == null ) { return "NotFound_" + attkey ; } // 5.10.12.3 (2019/06/21) URLで確実に使える文字のみで構成しておく 1227 if( key.charAt(0) == '@' ) { key = getRequestValue( key.substring( 1 ) ); } 1228 1229 return gui.getAttribute( key ); 1230 } 1231 1232 /** 1233 * {@NVL.XXX 値} で、XXXが NULLの場合、値を返します。 1234 * 1235 * ORACLE等の COALESCE ( expr_list ) 処理に近い結果を返します。 1236 * NVL ( expr1 , expr2 ) は、expr1 が NULL の場合、expr2 を返しますが、 1237 * COALESCE は、第一引数が NULLなら、次の引数、それも NULL なら、さらに次と 1238 * 引数リストを順次処理していきます。 1239 * それと同じく、XXX が NULL なら、その次・・と順次評価していき、NULL でない 1240 * 値が返ってきたところで、その値を返します。 1241 * これは、{@NVL.XXX @YYY ZZZ ・・・} 形式を処理します。 1242 * これは、パラメータ XXX が NULLの場合、次の値を使います。(@YYY) 1243 * @YYY は、YYY パラメータの事で、これも NULL の場合は、ZZZ を使います。 1244 * 最後まで NULL の場合は、 ゼロ文字列が返されます。 1245 * 1246 * @og.rev 5.6.4.0 (2013/05/02) 新規追加 1247 * 1248 * @param attkey NVL情報を取り出すパラメータ 1249 * 1250 * @return NULL以外の値が出てくるまで、順次評価した結果 1251 */ 1252 protected String getNVLAttri( final String attkey ) { 1253 if( attkey == null ) { return null; } 1254 1255 String[] keys = attkey.split( " " ); // スペースで、パラメータを分解する。 1256 String val = getRequestValue( keys[0] ); // 第一パラメータは、そのままのキーで検索 1257 1258 // val が null の間は、チェックする。 1259 if( val == null || val.isEmpty() ) { 1260 for( int i=1; i<keys.length; i++ ) { 1261 val = keys[i]; 1262 // 先頭が @ の場合は、リクエスト変数のキーとして、値を判定 1263 if( val.charAt(0) == '@' ) { val = getRequestValue( val.substring( 1 ) ); } 1264 if( val != null && val.length() > 0 ) { break; } 1265 } 1266 } 1267 1268 if( val == null ) { val = ""; } // NULL の場合は、 ゼロ文字列を返す。 1269 1270 return val; 1271 } 1272 1273 /** 1274 * {@LAST.XXX} で、XXXが 最後に使われた値を返します。 1275 * 1276 * XXX は、command="NEW" でセットされたリクエスト値です。通常、{@MEM.XXX} は 1277 * 画面単位に、既存のキャッシュから値を取り出しますが、{@LAST.XXX} は、 1278 * 画面に関係なく、ユーザー単位に管理しています。 1279 * また、値は、データベース(GE20)に保管されますので、次回ログイン時にも有効です。 1280 * この処理が呼び出されたときに、リクエスト変数に、XXXX が存在した場合は、そちらを優先に 1281 * 使います。その場合は、command に関係なく、値を設定しておきます。 1282 * 1283 * command="NEW"の場合のリクエスト変数の値の設定は、RequestCacheTag で行います。 1284 * 1285 * ※ データベースには、画面アクセス情報のセーブ時に行われます。 1286 * valueタグのsave属性の様に、リアルタイムではありませんので、Tomcatが 1287 * 異常終了した場合は、セーブされません。 1288 * 1289 * @og.rev 5.6.8.1 (2013/09/13) 新規追加 1290 * 1291 * @param attkey 最後に使われた値をを取り出すパラメータ 1292 * 1293 * @return XXXが 最後に使われた値 1294 * @see org.opengion.hayabusa.taglib.RequestCacheTag#commandExec( String ,ServletRequest ) 1295 * @see org.opengion.hayabusa.resource.UserInfo#getLastRequestValue( String ) 1296 */ 1297 protected String getLASTAttri( final String attkey ) { 1298 if( attkey == null ) { return null; } 1299 1300 // 最新のリクエスト変数をチェック 1301 String[] vals = getRequest().getParameterValues( attkey ); 1302 1303 String val = null; 1304 if( vals == null ) { 1305 val = getUser().getLastRequestValue( attkey ); // なければ、取得 1306 } 1307 else { 1308 for( int i=0; i<vals.length; i++ ) { 1309 val = vals[i]; 1310 if( ! "0".equals( val ) ) { break; } // チェックボックス対応 1311 } 1312 getUser().setLastRequestValue( attkey,val ); // あれば、最新の値をセット 1313 } 1314 1315 return val ; 1316 } 1317 1318 /** 1319 * {@REQ.XXX} で、XXXの リクエストオブジェクトのメソッドの値を取得します。 1320 * 1321 * HttpServletRequest のメソッドを実行します。 1322 * それ以外に、ROWCOUNT というキーワードで、選択された行数を返します。 1323 * 1324 * 通常のリクエストの値以外にRestAPIで利用される場合のあるX-HTTP-Method-Overrideと、 1325 * POSTデータのBodyの値(JSONを変数名を指定せずに送信する場合がある)についても 1326 * 取得できるようにしておきます。 1327 * 1328 * <table border="2" frame="box" rules="all" > 1329 * <caption>{@REQ.XXX}の説明</caption> 1330 * <tr><th>KEY</th><th>VALUE</th></tr> 1331 * <tr><td>ROWCOUNT </td><td style="white-space: normal">チェックされた件数</td></tr> 1332 * <tr><td>RequestURL </td><td style="white-space: normal">request.getRequestURL()</td></tr> 1333 * <tr><td>AuthType </td><td style="white-space: normal">request.getAuthType()</td></tr> 1334 * <tr><td>ContextPath </td><td style="white-space: normal">request.getContextPath()</td></tr> 1335 * <tr><td>Method </td><td style="white-space: normal">request.getMethod()</td></tr> 1336 * <tr><td>PathInfo </td><td style="white-space: normal">request.getPathInfo()</td></tr> 1337 * <tr><td>PathTranslated </td><td style="white-space: normal">request.getPathTranslated()</td></tr> 1338 * <tr><td>QueryString </td><td style="white-space: normal">request.getQueryString()</td></tr> 1339 * <tr><td>RemoteUser </td><td style="white-space: normal">request.getRemoteUser()</td></tr> 1340 * <tr><td>RequestURI </td><td style="white-space: normal">request.getRequestURI()</td></tr> 1341 * <tr><td>ServletPath </td><td style="white-space: normal">request.getServletPath()</td></tr> 1342 * <tr><td>RemoteAddr </td><td style="white-space: normal">request.getRemoteAddr()</td></tr> 1343 * <tr><td>RemoteHost </td><td style="white-space: normal">request.getRemoteHost()</td></tr> 1344 * <tr><td>Scheme </td><td style="white-space: normal">request.getScheme()</td></tr> 1345 * <tr><td>ServerName </td><td style="white-space: normal">request.getServerName()</td></tr> 1346 * <tr><td>ServerPort </td><td style="white-space: normal">request.getServerPort()</td></tr> 1347 * <tr><td>MethodOverride </td><td style="white-space: normal">X-HTTP-Method-Override</td></tr> 1348 * <tr><td>PostData </td><td style="white-space: normal">request.getInputStream()</td></tr> 1349 * <tr><td>JSPID </td><td style="white-space: normal">JSPファイル名</td></tr> 1350 * </table> 1351 * 1352 * @og.rev 5.9.9.1 (2016/06/10) REQ追加 1353 * @og.rev 5.10.10.0 (2019/03/29) MethodOverride追加 1354 * @og.rev 5.10.10.1 (2019/04/05) BodyData追加 1355 * @og.rev 5.10.12.1 (2019/06//14) JSPID追加 1356 * 1357 * @param attkey 最後に使われた値を取り出すパラメータ 1358 * 1359 * @return XXXに対応したリクエストメソッドの実行結果 1360 */ 1361 protected String getRequestMethod(final String attkey){ 1362 if( attkey == null ) { return null; } 1363 1364 final HttpServletRequest req = (HttpServletRequest)pageContext.getRequest(); 1365 1366 String rtn = ""; 1367 if( "ROWCOUNT" .equalsIgnoreCase( attkey )){ 1368 final String[] vals = req.getParameterValues( HybsSystem.ROW_SEL_KEY ); 1369 rtn = vals == null ? "0" : String.valueOf( vals.length ); 1370 }else if("RequestURL" .equalsIgnoreCase( attkey )){ 1371 rtn = req.getRequestURL().toString(); 1372 }else if("AuthType" .equalsIgnoreCase( attkey )){ 1373 rtn = req.getAuthType(); 1374 }else if("ContextPath" .equalsIgnoreCase( attkey )){ 1375 rtn = req.getContextPath(); 1376 }else if("Method" .equalsIgnoreCase( attkey )){ 1377 rtn = req.getMethod(); 1378 }else if("PathInfo" .equalsIgnoreCase( attkey )){ 1379 rtn = req.getPathInfo(); 1380 }else if("PathTranslated" .equalsIgnoreCase( attkey )){ 1381 rtn = req.getPathTranslated(); 1382 }else if("QueryString" .equalsIgnoreCase( attkey )){ 1383 rtn = req.getQueryString(); 1384 }else if("RemoteUser" .equalsIgnoreCase( attkey )){ 1385 rtn = req.getRemoteUser(); 1386 }else if("RequestURI" .equalsIgnoreCase( attkey )){ 1387 rtn = req.getRequestURI(); 1388 }else if("ServletPath" .equalsIgnoreCase( attkey )){ 1389 rtn = req.getServletPath(); 1390 }else if("RemoteAddr" .equalsIgnoreCase( attkey )){ 1391 rtn = req.getRemoteAddr(); 1392 }else if("RemoteHost" .equalsIgnoreCase( attkey )){ 1393 rtn = req.getRemoteHost(); 1394 }else if("Scheme" .equalsIgnoreCase( attkey )){ 1395 rtn = req.getScheme(); 1396 }else if("ServerName" .equalsIgnoreCase( attkey )){ 1397 rtn = req.getServerName(); 1398 }else if("ServerPort" .equalsIgnoreCase( attkey )){ 1399 rtn = String.valueOf( req.getServerPort() ); 1400 } 1401 else if("MethodOverride" .equalsIgnoreCase( attkey )){ //5.10.10.0 (2019/03/29) 1402 rtn = String.valueOf( req.getHeader("X-HTTP-Method-Override") ); 1403 } 1404 else if("ContentType" .equalsIgnoreCase( attkey )){ //5.10.10.1 (2019/04/05) 1405 rtn = String.valueOf( req.getHeader("Content-Type") ); 1406 } 1407 else if("PostData" .equalsIgnoreCase( attkey )){ //5.10.10.1 (2019/04/05) 1408 try(Scanner sc = new Scanner(req.getInputStream(), "UTF-8").useDelimiter("\\A"); ){ 1409 rtn = sc.hasNext() ? sc.next() : ""; 1410 }catch(IOException ie) { 1411 System.out.println(ie); 1412 rtn=""; 1413 } 1414 } 1415 else if( "JSPID" .equalsIgnoreCase( attkey ) ) { // 5.10.12.1 (2019/06/14) 7.0.4.1追加分対応 1416 rtn = req.getRequestURI(); 1417 final int ad = rtn.lastIndexOf( '/' ); 1418 if( ad >= 0 ) { 1419 rtn = rtn.substring( ad+1 ); 1420 } 1421 } 1422 1423 if( rtn == null ){ rtn = ""; } 1424 1425 return rtn; 1426 } 1427 1428 /** 1429 * 予約語に関する情報の文字列を取得します。 1430 * 1431 * @og.rev 5.5.4.0 (2012/07/02) 予約語部分のみ分離 1432 * @og.rev 5.6.4.0 (2013/05/02) NVL 追加 1433 * @og.rev 5.6.8.1 (2013/09/13) LAST 追加 1434 * @og.rev 5.8.2.3 (2014/12/27) USEREDIT追加 1435 * @og.rev 5.9.9.1 (2016/06/10) REQ追加 1436 * @og.rev 5.9.13.0 (2016/10/07) VAL追加。value値とリクエスト変数では、リクエスト変数が上位なので、value値を取り出したい場合に使用します。 1437 * @og.rev 5.9.26.1 (2017/11/10) JSON追加。JSON化するのではなく、JSONタイプのエスケープ処理をする。 1438 * 1439 * @param key キー 1440 * 1441 * @return リクエスト情報の文字列 1442 */ 1443 protected String getReservedValue( final String key ) { 1444 if( key == null ) { isReqNull = true; return ""; } // 3.4.0.3 (2003/09/10) 1445 1446 String rtn ; 1447 int adrs = key.indexOf( '.' ); 1448 if( adrs > 0 ) { 1449 String subKey = key.substring( adrs+1 ); 1450 if( key.startsWith( "USER." ) ) { 1451 rtn = getUserInfo( subKey ); 1452 } 1453 else if( key.startsWith( "USEREDIT." ) ) { 1454 rtn = getUserEditInfo( subKey ); // 5.8.2.3 (2014/12/27) 1455 } 1456 else if( key.startsWith( "GUI." ) ) { 1457 rtn = getGUIInfoAttri( subKey ); // 4.0.0 (2005/01/31) 1458 } 1459 else if( key.startsWith( "SYS." ) ) { 1460 rtn = sys( subKey ); // 3.5.6.6 (2004/08/23) 1461 } 1462 else if( key.startsWith( "SESSION." ) ) { // 3.5.5.3 (2004/04/09) 1463 rtn = String.valueOf( getSessionAttribute( subKey ) ); 1464 } 1465 // 3.4.0.3 (2003/09/10) MEM.XXXX で、REQUEST_CACHE の値を取得できるように修正。 1466 else if( key.startsWith( "MEM." ) ) { 1467 // 3.5.4.7 (2004/02/06) getRequestCacheData を使用するように修正 1468 rtn = getRequestCacheData( subKey ); 1469 } 1470 // 3.8.0.2 (2005/07/11) MSG.XXXX で、メッセージリソースの値を取得できるように追加。 1471 // 3.8.0.2 (2005/07/11) LBL.XXXX で、ラベルリソースの値を取得できるように追加。 1472 else if( key.startsWith( "LBL." ) ) { 1473 rtn = getLabel( subKey ); 1474 } 1475 // 3.8.0.2 (2005/07/11) DATE.XXXX で、日付関係の値を取得できるように追加。 1476 else if( key.startsWith( "DATE." ) ) { 1477 rtn = getDateFormat( subKey ); 1478 } 1479 // 3.8.0.1 (2005/06/17) NVAR.XXXX で、getUnicodeEscape 変換() を行います。 1480 // NVAR. を取り除いた XXXX で再度、リクエスト値を取得し、それを Escape変換します。 1481 else if( key.startsWith( "NVAR." ) ) { 1482 rtn = StringUtil.getUnicodeEscape( getRequestValue( subKey ) ); 1483 } 1484 // 4.3.6.0 (2009/04/01) メールモジュール用の予約語 1485 else if( key.startsWith( "MAIL." ) ) { 1486 rtn = ( String )getSessionAttribute( key ); 1487 } 1488 // 4.3.7.0 (2009/06/01) DB関数名の取得 1489 else if( key.startsWith( "DBF." ) ) { 1490 rtn = getDBFunctionName( subKey ); 1491 } 1492 // 4.4.0.0 (2009/08/02) データロールに基づく条件式の取得 1493 else if( key.startsWith( "SEC." ) ) { 1494 rtn = getDataCondition( subKey ); 1495 } 1496 // 5.3.9.0 (2011/09/01) URLエンコード変換 1497 else if( key.startsWith( "URL." ) ) { 1498 rtn = StringUtil.urlEncode( getRequestValue( subKey ) ); 1499 } 1500 // 5.5.1.3 (2012/04/09) エスケープ変換 1501 else if( key.startsWith( "ESC." ) ) { 1502 rtn = StringUtil.htmlFilter( getRequestValue(subKey,false) ); 1503 } 1504 // 5.6.4.0 (2013/05/02) NVL 追加 1505 else if( key.startsWith( "NVL." ) ) { 1506 rtn = getNVLAttri( subKey ); 1507 } 1508 // 5.6.8.1 (2013/09/13) LAST 追加 1509 else if( key.startsWith( "LAST." ) ) { 1510 rtn = getLASTAttri( subKey ); 1511 } 1512 // 5.9.9.1 (2016/06/10) REQ 追加 1513 else if( key.startsWith( "REQ." ) ) { 1514 rtn = getRequestMethod( subKey ); 1515 } 1516 //5.9.13.0 (2016/10/07) 追加 1517 else if( key.startsWith( "VAL." ) ) { 1518 rtn = (String)getRequestAttribute( subKey ); // ※ 取り出しは、subKey で 1519 } 1520 // 5.9.26.1 (2017/11/10) 追加 JSONタイプのエスケープを行う(JSONにするわけではない) 1521 else if( key.startsWith( "JSON." ) ) { 1522 rtn = StringUtil.jsonFilter( getRequestValue(subKey) ); 1523 } 1524 // 4.0.0 (2007/06/12) DB.XXXX は、直接取り出すように変更します。 1525 else { // 4.0.0.0 (2007/11/16) 1526 rtn = (String)getRequestAttribute( key ); // ※ 取り出しは、key で 1527 } 1528 } 1529 else{ 1530 rtn = "{@" + key + "}"; // 予約語以外は括弧を付けて書き戻します。 1531 } 1532 return rtn; 1533 } 1534 1535 /** 1536 * リクエスト情報の文字列を取得します。 1537 * 1538 * @og.rev 5.0.0.2 (2009/09/15) XSS対策 1539 * 1540 * @param key キー 1541 * 1542 * @return リクエスト情報の文字列 1543 */ 1544 protected String getRequestValue( final String key ) { 1545 return getRequestValue( key, xssCheck); 1546 } 1547 1548 /** 1549 * リクエスト情報の文字列を取得します。 1550 * 1551 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更 1552 * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString 廃止 1553 * @og.rev 3.0.0.0 (2002/12/25) ValueTag追加の為、指定の scope の Attributeより取得 1554 * @og.rev 3.1.0.1 (2003/03/26) Valueタグの値と、request情報の値の所得優先順位を、request が優先されるように変更。 1555 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。HybsRequestWrapper 廃止。直接 Mapでキャッシュする。 1556 * @og.rev 3.1.5.0 (2003/04/22) SYS.XXXX で、システムパラメータ の値を取得できるように修正。 1557 * @og.rev 3.1.7.0 (2003/05/02) リクエスト情報の取得順序を、Request、キャッシュ、Value の順に変更。 1558 * @og.rev 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。 1559 * @og.rev 3.4.0.3 (2003/09/10) MEM.XXXX で、REQUEST_CACHE の値を取得できるように修正。 1560 * @og.rev 3.5.4.7 (2004/02/06) getRequestCacheData を使用するように修正 1561 * @og.rev 3.5.5.3 (2004/04/09) {@SESSION.XXXX} で、session.getAttribute( "XXXX" ) の値を取得するように修正 1562 * @og.rev 3.5.6.6 (2004/08/23) SYS.XXXX の処理を getSystemParameter( String key ) メソッドへ移動 1563 * @og.rev 3.8.0.1 (2005/06/17) NVAR.XXXX で、getUnicodeEscape 変換() を行います。 1564 * @og.rev 3.8.0.2 (2005/07/11) MSG.XXXX , LBL.XXXX の処理を追加 1565 * @og.rev 3.8.0.2 (2005/07/11) チェックボックス対応で、重複リクエストに対応させます。 1566 * @og.rev 3.8.8.8 (2007/05/11) 重複リクエスト処理の場所を移動。リクエストのみ対象とする。 1567 * @og.rev 4.0.0.0 (2005/08/31) quotCheck によるSQLインジェクション対策 1568 * @og.rev 4.0.0.0 (2005/08/31) getSystemParameter を sys に名称変更 1569 * @og.rev 4.0.0.0 (2007/04/02) Valueタグの値と、キャッシュでは、Valueタグの値を優先するように変更 1570 * @og.rev 4.0.0.0 (2007/11/16) "."付きのパラメータのエラー処理をなくし、getRequestAttributeで取得する。 1571 * @og.rev 4.3.0.0 (2008/07/04) DB.XXXX は、必ずStringオブジェクトとし、String.valueOf しない。 1572 * @og.rev 4.3.6.0 (2009/04/01) メールモジュール用の予約語MAIL.XXXXの取得対応 1573 * @og.rev 4.4.0.0 (2009/08/02) データロール対応(SEC.xxxの取得対応) 1574 * @og.rev 5.0.0.2 (2009/09/15) XSS対策用にメソッドにフラグを追加 1575 * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、useValue 属性廃止 1576 * @og.rev 5.3.9.0 (2011/09/01) URL.XXXX処理を追加 1577 * @og.rev 5.5.1.3 (2012/04/09) ESC.XXXX処理を追加 1578 * @og.rev 5.5.4.0 (2012/07/01) 予約語の処理を分離 1579 * @og.rev 5.7.4.2 (2014/03/20) サニタイズ処理は、getSanitizedBodyString() ではなく、ここで行います。 1580 * @og.rev 5.9.25.2 (2017/10/27) xssCheck及びquotCheckのエラーメッセージをラベルリソース化 1581 * 1582 * @param key キー 1583 * @param xssCheckFlg XSS対策用 1584 * 1585 * @return リクエスト情報の文字列 1586 */ 1587 protected String getRequestValue( final String key, final boolean xssCheckFlg ) { 1588 if( key == null ) { isReqNull = true; return ""; } // 3.4.0.3 (2003/09/10) 1589 1590 String rtn ; 1591 int adrs = key.indexOf( '.' ); 1592 1593 if( adrs > 0 ) { 1594 rtn = getReservedValue( key ); // 5.5.4.0 (2012/07/02) 1595 } 1596 else { 1597 rtn = getRequest().getParameter( key ); 1598 1599 // 5.7.4.2 (2014/03/20) サニタイズ処理は、getSanitizedBodyString() ではなく、ここで行います。 1600 if( isSanitized ) { 1601 if( rtn != null && rtn.indexOf( '[' ) >= 0 ) { 1602 rtn = rtn.replace( "[", "\\]\\" ); 1603 } 1604 } 1605 1606 // 5.0.0.2 (2009/09/15) tagCheck によるthan signチェック Parameterのみにかけるためこの位置 1607 if( rtn != null && rtn.length() > 0 && xssCheckFlg && ( rtn.indexOf( '<' ) >= 0 || rtn.indexOf( '>' ) >= 0 ) ) { 1608// String errMsg = "リクエスト引数に Less/Greater than sign(<,>)を含むことは出来ません。" + HybsSystem.CR 1609// + " 処理が正しい場合は、xssCheck 属性を false にセットしてください。" + HybsSystem.CR 1610// + " key=[" + key + "]" 1611// + " val=[" + rtn + "]" 1612// + " tag=[" + getTagName() + "]" ; 1613// throw new HybsSystemException( errMsg ); 1614 1615 // 5.9.25.2 (2017/10/27) 1616 getResource(); 1617 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 1618 buf.append( resource.getLabel( "ERR0048.1" ) ).append( HybsSystem.CR ); 1619 buf.append( resource.getLabel( "ERR0048.2",new String[] { key,rtn,getTagName() } ) ).append( HybsSystem.CR ); 1620 1621 throw new HybsSystemException( buf.toString() ); 1622 } 1623 1624 // 3.8.8.8 (2007/05/11) 重複リクエスト処理の場所を移動。リクエストのみ対象とする。 1625 // 3.8.0.2 (2005/07/11) チェックボックス対応で、重複リクエストに対応させます。 1626 // {@XXXX} で、値が"0"の場合、複数リクエストを確認して、"1"が含まれていれば、"1"とします。 1627 if( "0".equals(rtn) ) { 1628 boolean backFlag = isReqNull ; 1629 String[] vals = getRequestValues( key ); 1630 if( vals != null && vals.length > 1 ) { 1631 for( int i=0; i<vals.length; i++ ) { 1632 if( "1".equals( vals[i] ) ) { rtn = "1"; break; } 1633 } 1634 } 1635 isReqNull = backFlag; // 3.8.8.8 (2007/05/11) getRequestValues での NULLセット解除 1636 } 1637 1638 // 3.1.0.1 (2003/03/26) Valueタグの値と、request情報の値の取得優先順位を、 1639 // request が優先されるように変更。 1640 if( ( rtn == null || rtn.length() == 0 ) && requestCache != null ) { 1641 String[] str = requestCache.get( key ); 1642 if( str != null && str.length > 0 ) { 1643 rtn = str[0]; 1644 } 1645 } 1646 // 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、useValue 属性廃止 1647// if( ( rtn == null || rtn.length() == 0 ) && useValue ) { 1648 if( ( rtn == null || rtn.length() == 0 ) ) { 1649 Object obj = pageContext.findAttribute( key ); 1650 if( obj != null ) { 1651 rtn = obj.toString(); 1652 } 1653 } 1654 } 1655 if( rtn == null || rtn.length() == 0 ) { 1656 isReqNull = true; 1657 rtn = ""; 1658 } 1659 // 4.0.0 (2005/08/31) quotCheck によるSQLインジェクション対策 1660 else if( quotCheck && rtn.indexOf( "'" ) >= 0 && !key.startsWith( "SEC." ) ) { 1661// String errMsg = "リクエスト引数に、クォーティション(')を含むことは出来ません。" + HybsSystem.CR 1662// + " 処理が正しい場合は、quotCheck 属性を false にセットしてください。" + HybsSystem.CR 1663// + " key=[" + key + "]" 1664// + " val=[" + rtn + "]" 1665// + " tag=[" + getTagName() + "]" ; 1666// throw new HybsSystemException( errMsg ); 1667 // 5.9.25.2 (2017/10/27) 1668 getResource(); 1669 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 1670 buf.append( resource.getLabel( "ERR0049.1" ) ).append( HybsSystem.CR ); 1671 buf.append( resource.getLabel( "ERR0049.2",new String[] { key,rtn,getTagName() } ) ).append( HybsSystem.CR ); 1672 1673 throw new HybsSystemException( buf.toString() ); 1674 } 1675 1676 // 3.8.0.2 (2005/07/11) チェックボックス対応で、重複リクエストに対応させます。 1677 // {@XXXX} で、値が"0"の場合、複数リクエストを確認して、"1"が含まれていれば、"1"とします。 1678// if( "0".equals(rtn) ) { 1679// String[] vals = getRequestValues( key ); 1680// if( vals != null ) { 1681// for( int i=0; i<vals.length; i++ ) { 1682// if( "1".equals( vals[i] ) ) { rtn = "1"; break; } 1683// } 1684// } 1685// } 1686 1687 return rtn ; 1688 } 1689 1690 /** 1691 * リクエスト情報の文字列を取得します。 1692 * 1693 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更 1694 * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString 廃止 1695 * @og.rev 3.1.8.0 (2003/05/16) RequestCache データをリクエスト配列情報にも適用する。 1696 * @og.rev 5.3.8.0 (2011/08/01) Attribute等からも値が取得できるようにする。 1697 * 1698 * @param key キー 1699 * 1700 * @return リクエスト情報の文字列 1701 */ 1702 protected String[] getRequestValues( final String key ) { 1703 String[] rtn = getRequest().getParameterValues( key ); 1704 1705 // 3.1.8.0 (2003/05/16) RequestCache データをリクエスト配列情報にも適用する。 1706 if( ( rtn == null || rtn.length == 0 ) && requestCache != null ) { 1707 rtn =requestCache.get( key ); 1708 } 1709 1710 // 5.3.8.0 (2011/08/01) Attribute等からも値が取得できるようにする。 1711 if( rtn == null || rtn.length == 0 ) { 1712 String tmp = getRequestValue( key ); 1713 if( tmp != null && tmp.length() > 0 ) { 1714 rtn = new String[]{ tmp }; 1715 } 1716 } 1717 1718 if( rtn == null || rtn.length == 0 ) { isReqNull = true; } 1719 return rtn ; 1720 } 1721 1722 /** 1723 * リクエスト情報の文字列のキー集合を取得します。 1724 * 1725 * @og.rev 5.3.2.0 (2011/02/01) パラメーターの外部指定対応 1726 * 1727 * @return リクエスト情報の文字列のキー集合 1728 */ 1729 protected Enumeration<?> getParameterNames() { // 4.3.3.6 (2008/11/15) Generics警告対応 1730 String[] names = (String[])getRequestAttribute( HybsSystem.PARAM_NAMES_KEY ); 1731 return ( names == null ? getRequest().getParameterNames() : Collections.enumeration( Arrays.asList( names ) ) ); 1732 } 1733 1734 /** 1735 * リクエスト情報の文字列のキー集合をセットします。 1736 * 1737 * @og.rev 5.3.2.0 (2011/02/01) パラメーターの外部指定対応 1738 * 1739 * @param names リクエスト情報の文字列のキー配列 1740 */ 1741 protected void setParameterNames( final String[] names ) { 1742 setRequestAttribute( HybsSystem.PARAM_NAMES_KEY, names ); 1743 } 1744 1745 /** 1746 * リクエスト情報の文字列に NULL が存在していたかどうかを取得します。 1747 * 1748 * これは、getRequestParameter( String ) の呼出し毎に設定されます。 1749 * つまり、上記メソッドの実行直後の値を取り出す必要があります。 1750 * NULL が含まれていた(true)/含まれていなかった。(false) 1751 * 1752 * @return NULLが含まれていた(true)/含まれていなかった。(false) 1753 */ 1754 protected boolean isNull() { 1755 return isReqNull; 1756 } 1757 1758 /** 1759 * リクエスト情報の文字列値取得時に、value値の使用可否を指定します。 1760 * 1761 * value 値は、通常、ValueTag等によりセットされますが、ValueTag自身がリクエスト 1762 * 情報から値を取得する場合に、リクエスト情報が無い場合に、自分自身の値を 1763 * 取得してしまい、予想しない動きをすることを避けるため、使用します。 1764 * 初期値は、true(使用する)です。 1765 * 1766 * @og.rev 3.1.7.0 (2003/05/02) value値の使用可否を指定する、useValue 属性を追加。 1767 * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止にともなう、メソッド廃止 1768 * 1769 * @param flag value値の使用可否(true:使用化/false:使用不可) 1770 */ 1771// protected void setUseValue( final boolean flag ) { 1772// useValue = flag; 1773// } 1774 1775 /** 1776 * セッションに登録されているオブジェクトを取得します。 1777 * 1778 * @param key キー 1779 * 1780 * @return セッションに登録されているオブジェクト 1781 */ 1782 protected Object getSessionAttribute( final String key ) { 1783 if( session == null ) { session = pageContext.getSession(); } 1784 return session.getAttribute( key ); 1785 } 1786 1787 /** 1788 * セッションに 指定のキーでオブジェクトをセットします。 1789 * 1790 * @param key キー 1791 * @param object セッションに登録するオブジェクト 1792 */ 1793 protected void setSessionAttribute( final String key ,final Object object ) { 1794 if( session == null ) { session = pageContext.getSession(); } 1795 session.setAttribute( key,object ); 1796 } 1797 1798 /** 1799 * セッションに指定のキーで登録されているオブジェクトを 削除します。 1800 * 1801 * @param key キー 1802 */ 1803 protected void removeSessionAttribute( final String key ) { 1804 if( session == null ) { session = pageContext.getSession(); } 1805 session.removeAttribute( key ); 1806 } 1807 1808 /** 1809 * リクエストに登録されているオブジェクトを取得します。 1810 * 1811 * @param key キー 1812 * 1813 * @return リクエストンに登録されているオブジェクト 1814 */ 1815 protected Object getRequestAttribute( final String key ) { 1816 return getRequest().getAttribute( key ); 1817 } 1818 1819 /** 1820 * リクエストに 指定のキーでオブジェクトをセットします。 1821 * 1822 * @param key キー 1823 * @param object リクエストに登録するオブジェクト 1824 */ 1825 protected void setRequestAttribute( final String key ,final Object object ) { 1826 getRequest().setAttribute( key,object ); 1827 } 1828 1829 /** 1830 * リクエストに指定のキーで登録されているオブジェクトを 削除します。 1831 * 1832 * @param key キー 1833 */ 1834 protected void removeRequestAttribute( final String key ) { 1835 getRequest().removeAttribute( key ); 1836 } 1837 1838 /** 1839 * コンテキスト(applicaton)に登録されているオブジェクトを取得します。 1840 * 1841 * scope属性に、"applicaton" が指定された場合に、実行されます。 1842 * 1843 * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加 1844 * 1845 * @param key キー 1846 * 1847 * @return コンテキスト(applicaton)に登録されているオブジェクト 1848 */ 1849 protected Object getContextAttribute( final String key ) { 1850 ServletContext applicaton = pageContext.getServletContext(); 1851 return applicaton.getAttribute( key ); 1852 } 1853 1854 /** 1855 * コンテキスト(applicaton)指定のキーでオブジェクトをセットします。 1856 * 1857 * scope属性に、"applicaton" が指定された場合に、実行されます。 1858 * 1859 * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加 1860 * 1861 * @param key キー 1862 * @param object コンテキスト(applicaton)に登録するオブジェクト 1863 */ 1864 protected void setContextAttribute( final String key ,final Object object ) { 1865 ServletContext applicaton = pageContext.getServletContext(); 1866 applicaton.setAttribute( key,object ); 1867 } 1868 1869 /** 1870 * コンテキスト(applicaton)指定のキーで登録されているオブジェクトを 削除します。 1871 * 1872 * scope属性に、"applicaton" が指定された場合に、実行されます。 1873 * 1874 * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加 1875 * 1876 * @param key キー 1877 */ 1878 protected void removeContextAttribute( final String key ) { 1879 ServletContext applicaton = pageContext.getServletContext(); 1880 applicaton.removeAttribute( key ); 1881 } 1882 1883 /** 1884 * アプリケーションサーバーのコンテキストパスのURLを返します。 1885 * 1886 * @return コンテキストパス 1887 */ 1888 protected String getContextPath() { 1889 return ((HttpServletRequest)getRequest()).getContextPath(); 1890 } 1891 1892 /** 1893 * スコープに応じて登録されているオブジェクトを取得します。 1894 * 1895 * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加 1896 * 1897 * @param key キー 1898 * 1899 * @return スコープに応じて登録されているオブジェクト 1900 */ 1901 protected Object getObject( final String key ) { 1902 if( "session".equals( scope ) ) { return getSessionAttribute( key ); } 1903 else if( "request".equals( scope ) ) { return getRequestAttribute( key ); } 1904 else if( "applicaton".equals( scope ) ) { return getContextAttribute( key ); } 1905 else { 1906 String errMsg = "このスコープはサポートされていません。[" + scope + "]"; 1907 throw new IllegalArgumentException( errMsg ); 1908 } 1909 } 1910 1911 /** 1912 * スコープに応じて登録されているオブジェクトを指定のキーでセットします。 1913 * 1914 * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加 1915 * 1916 * @param key キー 1917 * @param object リクエストに登録するオブジェクト 1918 * @see #setObject( String ,Object ,String ) 1919 */ 1920 protected void setObject( final String key ,final Object object ) { 1921 setObject( key,object,scope ); 1922// if( "session".equals( scope ) ) { setSessionAttribute( key,object ); } 1923// else if( "request".equals( scope ) ) { setRequestAttribute( key,object ); } 1924// else if( "applicaton".equals( scope ) ) { setContextAttribute( key,object ); } 1925// else { 1926// String errMsg = "このスコープはサポートされていません。[" + scope + "]"; 1927// throw new IllegalArgumentException( errMsg ); 1928// } 1929 } 1930 1931 /** 1932 * スコープに応じて登録されているオブジェクトを指定のキーでセットします。 1933 * 1934 * 引数にスコープを指定します。スコープが null の場合は、オリジナルの 1935 * スコープを使用します。 1936 * 1937 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 1938 * 1939 * @param key キー 1940 * @param object リクエストに登録するオブジェクト 1941 * @param scp スコープ 1942 * @see #setObject( String ,Object ) 1943 */ 1944 protected void setObject( final String key ,final Object object ,final String scp ) { 1945 String inScp = (scp == null) ? scope : scp ; 1946 1947 if( "session".equals( inScp ) ) { setSessionAttribute( key,object ); } 1948 else if( "request".equals( inScp ) ) { setRequestAttribute( key,object ); } 1949 else if( "applicaton".equals( inScp ) ) { setContextAttribute( key,object ); } 1950 else { 1951 String errMsg = "このスコープはサポートされていません。[" + inScp + "]"; 1952 throw new IllegalArgumentException( errMsg ); 1953 } 1954 } 1955 1956 /** 1957 * スコープに応じて登録されているオブジェクトを指定のキーで削除します。 1958 * 1959 * @og.rev 3.0.0.0 (2002/12/25) scope="applicaton" 指定の追加 1960 * 1961 * @param key キー 1962 */ 1963 protected void removeObject( final String key ) { 1964 if( "session".equals( scope ) ) { removeSessionAttribute( key ); } 1965 else if( "request".equals( scope ) ) { removeRequestAttribute( key ); } 1966 else if( "applicaton".equals( scope ) ) { removeContextAttribute( key ); } 1967 else { 1968 String errMsg = "このスコープはサポートされていません。[" + scope + "]"; 1969 throw new IllegalArgumentException( errMsg ); 1970 } 1971 } 1972 1973 /** 1974 * リクエストオブジェクトを取得します。 1975 * 1976 * @og.rev 2.2.0.0 (2002/12/17) 中国語(国際化)対応 エンコードの取得方法変更 1977 * @og.rev 2.2.0.0 (2002/12/17) 文字化け対策 setCharacterEncoding が効いていないので削除 1978 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。HybsRequestWrapper 廃止。直接 Mapでキャッシュする。 1979 * @og.rev 3.4.0.3 (2003/09/10) 冗長な個所や、無意味な個所を、等価な内容のロジックに置き換える。 1980 * @og.rev 3.5.5.0 (2004/03/12) command=RESET 時にも、キャッシュを取り出すように変更します。 1981 * 1982 * @return リクエストオブジェクト 1983 */ 1984 @SuppressWarnings(value={"unchecked"}) 1985 protected ServletRequest getRequest() { 1986 if( request == null ) { 1987 request = pageContext.getRequest(); 1988 // リクエストキャッシュ機能 1989 String cmd =request.getParameter( "command" ); 1990 if( "RENEW".equals( cmd ) || "RESET".equals( cmd ) ) { // 3.5.5.0 1991 requestCache = (Map<String,String[]>)getSessionAttribute( HybsSystem.REQ_CACHE_KEY ); 1992 } 1993 } 1994 return request; 1995 } 1996 1997 /** 1998 * BodyContent オブジェクトを取得して、ボディの内容を取得します。 1999 * 2000 * 処理としては、getRequestParameter() によるパラメータ処理も含みます。 2001 * このメソッドは、必ず doAfterBody() から呼び出してください。それ以外(例えば、 2002 * doEndTag()等)では、すでに Body情報が破棄/再利用されている可能性があり、 2003 * 正常に動作しなくなる可能性があります。 2004 * 2005 * @og.rev 3.1.1.0 (2003/03/28) BodyContent オブジェクトを取得して、ボディの内容を取得する処理を追加 2006 * 2007 * @return ボディ文字列 2008 */ 2009 protected String getBodyString() { 2010 BodyContent body = getBodyContent(); 2011 return getRequestParameter( body.getString() ); 2012 } 2013 2014 /** 2015 * BodyContent オブジェクトを取得して、ボディの内容を取得します。 2016 * 2017 * {@XXXX}を変換しない生のBODY文を返します 2018 * 2019 * @og.rev 4.3.6.0 (2009/04/01) 新規作成 2020 * 2021 * @return ボディ文字列 2022 */ 2023 protected String getBodyRawString() { 2024 BodyContent body = getBodyContent(); 2025 return body.getString(); 2026 } 2027 2028 /** 2029 * BodyContent オブジェクトを取得して、ボディの内容を取得します。 2030 * 2031 * {@XXXX}の変換を行いますが、その変換結果に、"["が含まれる場合は、 2032 * "\\]\\"に変換して、フォーマット処理されないようにサニタイズします。 2033 * 2034 * @og.rev 5.1.7.0 (2010/06/01) 新規作成 2035 * @og.rev 5.7.4.2 (2014/03/20) サニタイズ処理を、標準の処理で行う。 2036 * 2037 * @return ボディ文字列 2038 */ 2039 protected String getSanitizedBodyString() { 2040 isSanitized = true; 2041 String rtn = getBodyString(); 2042 isSanitized = false; // 一連の処理の中だけ、有効とします。 2043 2044 return rtn; 2045 2046 // 5.7.4.2 (2014/03/20) サニタイズ処理を、標準の処理で行う。 2047// BodyContent body = getBodyContent(); 2048// String rawBodyString = body.getString(); 2049// if( rawBodyString.indexOf( "{@" ) >= 0 ) { 2050// SystemParameter sysParam = new SystemParameter( rawBodyString ); 2051// String[] clms = sysParam.getColumns(); 2052// if( clms != null ) { 2053// for( int i=0; i<clms.length; i++ ) { 2054// String key = "{@" + clms[i] + "}"; 2055// String parsedVal = getRequestParameter( key ); 2056// if( parsedVal != null && parsedVal.indexOf( '[' ) >= 0 ) { 2057// rawBodyString = rawBodyString.replace( key, parsedVal.replace( "[", "\\]\\" ) ); 2058// } 2059// } 2060// } 2061// } 2062// 2063// return getRequestParameter( rawBodyString ); 2064 } 2065 2066 /** 2067 * JspWriter を使用した画面出力です。 2068 * 2069 * @param msg 画面に出力する文字列 2070 */ 2071 protected void jspPrint( final String msg ) { 2072 if( msg == null ) { return ; } 2073 try { 2074 JspWriter out = pageContext.getOut(); 2075 out.print( msg ); 2076 } catch(IOException ex) { 2077 String errMsg = "画面出力時の PageContext の取得時にエラーが発生しました。" 2078 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 2079 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び順変更 2080 } 2081 } 2082 2083 /** 2084 * デバッグ用の文字列を JspWriter を使用して画面に出力します。 2085 * このメソッドは、debugFlag=true の場合のみ動作します。 2086 * 2087 * 出力内容は,各オブジェクトの toString() 文字列です。 2088 * 2089 * @og.rev 4.0.0.0 (2005/02/28) debugFlag の条件式を追加。 2090 * @og.rev 4.0.0.0 (2005/02/28) 簡易リファレンスへのリンクを追加。 2091 */ 2092 protected void debugPrint() { 2093 if( debugFlag ) { 2094 try { 2095 JspWriter out = pageContext.getOut(); 2096 out.println( getDocumentLink() ); // 4.0.0 (2005/02/28) 2097 out.println( "<pre>" ); 2098 out.println( toString() ); 2099 out.println( "</pre>" ); 2100 } catch(IOException ex) { 2101 String errMsg = "デバッグ画面出力時の PageContext の取得時にエラーが発生しました。" 2102 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 2103 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び順変更 2104 } 2105 } 2106 } 2107 2108 /** 2109 * GAMENID付のリクエストキャッシュ情報を取り出します。 2110 * 2111 * @og.rev 3.5.4.7 (2004/02/06) 新規作成 2112 * 2113 * @param key リクエストキャッシュのキー情報 2114 * 2115 * @return リクエスト情報(存在しない場合は、null) 2116 */ 2117 protected String getRequestCacheData( final String key ) { 2118 String rtn = null; 2119 2120 String memKey = HybsSystem.REQ_CACHE_KEY + getGUIInfoAttri( "KEY" ); // 4.0.0 (2005/01/31) 2121// Map mem = (Map)getSessionAttribute( memKey ); 2122 Map<?,?> mem = (Map<?,?>)getSessionAttribute( memKey ); // 4.3.3.6 (2008/11/15) Generics警告対応 2123 2124 if( mem != null ) { 2125 String[] vals = (String[])mem.get( key ); 2126 if( vals != null && vals.length > 0 ) { 2127 rtn = vals[0]; 2128 } 2129 } 2130 return rtn ; 2131 } 2132 2133 /** 2134 * GAMENID付のリクエストキャッシュ情報を取り出します。 2135 * 2136 * @og.rev 3.5.4.7 (2004/02/06) 新規作成 2137 * 2138 * @param key リクエストキャッシュのキー情報 2139 * @param value リクエストキャッシュに登録する値 2140 */ 2141 @SuppressWarnings(value={"unchecked"}) 2142 protected void setRequestCacheData( final String key,final String value ) { 2143 String[] vals = new String[] { value } ; 2144 2145 String memKey = HybsSystem.REQ_CACHE_KEY + getGUIInfoAttri( "KEY" ); // 4.0.0 (2005/01/31) 2146 Map<String,String[]> mem = (Map<String,String[]>)getSessionAttribute( memKey ); 2147 if( mem != null ) { 2148 mem.put( key,vals ); 2149 } 2150 } 2151 2152 /** 2153 * カンマ区切り引数(CSV引数)を配列に分解して返します。 2154 * 2155 * カンマ区切り引数(CSV引数)で複数指定されたリクエストパラメータを 2156 * 文字列配列に分解して、返します。 2157 * 引数は、{@XXXX} 変数も使用できます。 2158 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 2159 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 2160 * 2161 * @og.rev 3.5.6.2 (2004/07/05) 新規作成 2162 * 2163 * @param csvKey カンマ区切り引数(CSV引数) 2164 * 2165 * @return 配列に分解されたリクエストパラメータ値 2166 */ 2167 protected String[] getCSVParameter( final String csvKey ) { 2168 String[] keys = StringUtil.csv2Array( csvKey ); 2169 String[] vals = new String[keys.length]; 2170 for( int i=0; i<keys.length; i++ ) { 2171 vals[i] = getRequestParameter( keys[i] ) ; 2172 } 2173 return vals ; 2174 } 2175 2176 /** 2177 * リクエスト変数 {@SYS.XXXX} に対する値の取得を行います。 2178 * 2179 * 本来は、システムパラメータ の値を取得できますが、 2180 * システム的な共有値も取得できるように機能追加しています。 2181 * また、ユーザー個別にシステムパラメータを変更できます。この取得は、 2182 * システムパラメータとして取得します。(値はユーザー個別値を返します。) 2183 * ここで、引数に、@変数が使用できます。具体的には、{@SYS.@XXXX} 2184 * で、@XXXX をリクエスト変数から取得した値を利用します。 2185 * この中で、@GUIID だけが、さらに特殊で、実行中の画面IDを割り当てます。 2186 * この @GUIID は、ここまでの文字列を画面IDに置き換えるとともに、それ以降の 2187 * 文字列を、画面IDに連結させます。 2188 * {@SYS.@GUIID_XXXX} ⇒ 画面ID_XXXX 文字列で、システムパラメータ の値を取得します。 2189 * 2190 * SERVER_NAME このTomcatが実行しているサーバー名 localhost 等 2191 * SERVER_URL Portも含むURLアドレス http://localhost:8823/ 2192 * CONTEXT_URL 実行しているコンテキストのURLアドレス http://localhost:8823/dbdef2/ 2193 * REAL_PATH / ルートに対応する物理ディレクトリ d:/webapps/dbdef2/ 等 2194 * CONTEXT_NAME コンテキスト名(webapps 直下の仮想フォルダ名) dbdef 等 2195 * DATE YMDH とほぼ同じですが、'yyyy/MM/dd HH:mm:ss' の形式で取得できます。 2196 * HOSTNAME スペース区切りで指定したIPアドレスからホスト名を逆引きします 2197 * 任意 ユーザーパラメータ(GE16) の値/システムパラメータ(GE12)の値を取得 2198 * @GUIID_XXXX 既存の画面IDに、_XXXX を追加した文字列 2199 * @XXXX XXXX でリクエスト変数から取得した文字列 2200 * XXXX XXXX の文字列 2201 * 2202 * @og.rev 3.5.6.6 (2004/08/23) 新規作成 2203 * @og.rev 3.7.0.3 (2005/03/01) クッキー取得機能を追加 2204 * @og.rev 4.0.0.0 (2005/11/30) ユーザーパラメータは、システムパラメータとして取得します。 2205 * @og.rev 5.1.6.0 (2010/05/01) システムパラメータに、@GUIID という特殊パラメータが使用できるように対応します。 2206 * @og.rev 5.6.6.2 (2013/07/19) SYS.HOSTNAMEに対応します。 2207 * 2208 * @param key {@SYS.XXXX} の XXXX 部分の文字列(キー) 2209 * 2210 * @return キーに対する値。なければ、null 2211 */ 2212 protected String sys( final String key ) { 2213 final String rtn; 2214 2215 if( key.startsWith( "COOKIE." ) ) { // 3.7.0.3 (2005/03/01) 2216 rtn = getCookie( key.substring( "COOKIE.".length() ) ); 2217 } 2218 else if( key.startsWith( "DATE" ) ) { 2219 int idx = key.indexOf( ' ' ); 2220 if( idx >= 0 ) { 2221 rtn = HybsSystem.getDate( key.substring( idx+1 ) ); 2222 } 2223 else { 2224 rtn = HybsSystem.getDate(); 2225 } 2226 } 2227 else if( key.startsWith( "HOSTNAME" ) ) { // 5.6.6.2 (2013/07/19) 2228 int idx = key.indexOf( ' ' ); 2229 if( idx >= 0 ) { 2230 String key2 = key.substring( idx+1 ) ; 2231 if( key2.startsWith( "@" ) ) { 2232 rtn = getHostName( getRequestValue( key2.substring( 1 ) ) ); 2233 } 2234 else{ 2235 rtn = getHostName( key2 ); 2236 } 2237 } 2238 else{ 2239 rtn = getUser().getParameter( key ); 2240 } 2241 } 2242 // 5.1.6.0 (2010/05/01) {@SYS.@GUIID_XXXX} パラメータ対応 2243 else if( key.startsWith( "@GUIID" ) ) { 2244 String key2 = getGUIInfoAttri( "ID" ) + key.substring( "@GUIID".length() ); 2245 rtn = getUser().getParameter( key2 ); 2246 } 2247 // 5.1.6.0 (2010/05/01) {@SYS.@XXXX} パラメータ対応 2248 else if( key.startsWith( "@" ) ) { 2249 String key2 = getRequestValue( key.substring( 1 ) ); 2250 rtn = getUser().getParameter( key2 ); 2251 } 2252 else { 2253 rtn = getUser().getParameter( key ); 2254 } 2255 2256 return rtn ; 2257 } 2258 2259 /** 2260 * システムパラメータの値を、boolean 型に変換して返します。 2261 * 2262 * 本来は、システムパラメータ の値を取得できますが、 2263 * システム的な共有値も取得できるように機能追加しています。 2264 * また、ユーザー個別にシステムパラメータを変更できます。この取得は、 2265 * システムパラメータとして取得します。(値はユーザー個別値を返します。) 2266 * 2267 * @og.rev 4.0.0.0 (2005/11/30) 新規追加 2268 * 2269 * @param key システム設定 キー 2270 * 2271 * @return システム設定値(boolean型) 2272 */ 2273 protected boolean sysBool( final String key ) { 2274 return Boolean.valueOf( sys( key ) ).booleanValue(); 2275 } 2276 2277 /** 2278 * システムパラメータの値を、int 型に変換して返します。 2279 * 2280 * 本来は、システムパラメータ の値を取得できますが、 2281 * システム的な共有値も取得できるように機能追加しています。 2282 * また、ユーザー個別にシステムパラメータを変更できます。この取得は、 2283 * システムパラメータとして取得します。(値はユーザー個別値を返します。) 2284 * 2285 * ※ システムパラメータの値が数字でない場合、HybsSystemException が throw されます。 2286 * ※ キーの値が nullの場合、HybsSystemException が throw されます。 2287 * 2288 * @og.rev 4.0.0.0 (2005/11/30) 新規追加 2289 * 2290 * @param key システム設定 キー 2291 * 2292 * @return システム設定値(int型) 2293 */ 2294 protected int sysInt( final String key ) { 2295 String tmp = null; 2296 int rtn ; 2297 try { 2298 tmp = sys( key ); 2299 rtn = Integer.parseInt( tmp ); 2300 } 2301 catch( NumberFormatException ex ) { 2302 String errMsg = "システムパラメータの値が数字ではありません。" + HybsSystem.CR 2303 + " Resource key=[" + key + "] val=[" + tmp + "]" ; 2304 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び順変更 2305 } 2306 catch( IllegalArgumentException ex ) { 2307 String errMsg = "キーの値が null です。key=[" + key + "] val=[" + tmp + "]"; 2308 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び順変更 2309 } 2310 2311 return rtn; 2312 } 2313 2314 /** 2315 * session に、処理開始時刻を設定します。 2316 * これは、DBTableModel を登録する場合に、一連の処理が連続であるかどうかを 2317 * 判断する時に使用します。 2318 * 処理が一連でない(start 時のタイムスタンプが書き換えられている)場合は、 2319 * DBTableModel の登録処理を行いません。 2320 * なお、判断処理を行うのは、scope が session の場合のみです。 2321 * 判定は、commitTableObject( String ,DBTableModel ) で行います。 2322 * 2323 * @og.rev 3.6.0.8 (2004/11/19) 新規追加 2324 * @og.rev 4.3.0.0 (2008/07/04) fileUD 対応。 2325 * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。 2326 * 2327 * @param tableId キー 2328 * @see #commitTableObject( String ,DBTableModel ) 2329 */ 2330 protected void startQueryTransaction( final String tableId ) { 2331 if( "session".equals( scope ) ) { 2332 startTransaction = Long.valueOf( System.currentTimeMillis() ); 2333 setSessionAttribute( tableId+"_TRANSACTION", startTransaction ); 2334 } 2335 2336 // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し 2337 if( useTrans ) { 2338 // 4.3.0.0 (2008/07/04) fileUD 対応 2339 removeSessionAttribute( HybsSystem.DB_LAST_SQL_KEY ); // 無条件削除 2340 } 2341 } 2342 2343 /** 2344 * スコープに応じて登録されている DBTableModel を指定のキーでセットします。 2345 * これは、startQueryTransaction( String ) でセッションに登録した処理開始時刻と、 2346 * このオブジェクト自身が持っている(セッションに登録した開始時刻そのもの)を 2347 * 比較し、異なる場合は、DBTableModel の登録を行いません。 2348 * これにより、検索処理の開始順にしか登録しないようなロジックを入れています。 2349 * 検索処理時間が掛かるSQLを実行した場合、先に検索した結果があとから登録される 2350 * ケースがあるためです。 2351 * また、判断処理を行うのは、scope が session の場合のみです。 2352 * 2353 * @og.rev 3.6.0.8 (2004/11/19) 新規追加 2354 * @og.rev 3.8.1.1 (2005/11/21) ExcelOut の整合性を取る為の仕掛け 2355 * @og.rev 4.3.0.0 (2008/07/04) fileUD 対応。 2356 * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。 2357 * 2358 * @param tableId キー 2359 * @param table 登録するDBTableModelオブジェクト 2360 * 2361 * @return 正常に登録(true) / 一連でないため登録していない(false) 2362 * @see #startQueryTransaction( String ) 2363 */ 2364 protected boolean commitTableObject( final String tableId ,final DBTableModel table ) { 2365 // 登録しないケースをピックアップします。 2366 if( "session".equals( scope ) ) { 2367 String key = tableId+"_TRANSACTION"; 2368 Long endTime = (Long)getSessionAttribute( key ); 2369 removeSessionAttribute( key ); 2370 if( endTime == null || 2371 startTransaction == null || 2372 endTime.compareTo( startTransaction ) != 0 ) { 2373 String msg = "CommonTagSupport Query処理が割り込まれました。DBTableModel は登録しません。" 2374 + "[" + getUser().getUserID() + "]," 2375 + "[" + getGUIInfoAttri( "KEY" ) + "]" // 4.0.0 (2005/01/31) 2376 + "[" + startTransaction + "]" // 4.0.0 (2005/01/31) 2377 + "[" + endTime + "]"; // 4.0.0 (2005/01/31) 2378 System.out.println( msg ); 2379 return false; 2380 } 2381 // 3.8.1.1 (2005/11/21) ExcelOut の整合性を取る為の仕掛け 2382 if( table != null && HybsSystem.TBL_MDL_KEY.equals( tableId ) ) { 2383 String consisKey = table.getConsistencyKey(); 2384 setSessionAttribute( HybsSystem.TBL_MDL_CONKEY,consisKey ); 2385 } 2386 } 2387 2388 // 4.3.0.0 (2008/07/04) fileUD 対応 2389 // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し 2390 if( useTrans && table != null ) { 2391 String guikey = getGUIInfoAttri( "KEY" ); 2392 DBLastSql lastSql = new DBLastSql( scope,guikey,table.isOverflow(),tableId ); 2393 setSessionAttribute( HybsSystem.DB_LAST_SQL_KEY,lastSql ); 2394 } 2395 2396 setObject( tableId,table ); 2397 return true; 2398 } 2399 2400 /** 2401 * 表示データの HybsSystem.ROW_SEL_KEY を元に、選ばれた 行番号の 2402 * 配列を返します。 2403 * 配列情報は、行番号でソートされて返されます。 2404 * なにも選ばれていない場合は、サイズ0の配列を返します。 2405 * 2406 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 2407 * 2408 * @return (選ばれていない場合は、サイズ0の配列を返す) 2409 */ 2410 protected int[] getParameterRows() { 2411 if( rowNo != null ) { return rowNo; } 2412 2413 rowNo = (int[])getRequestAttribute( HybsSystem.ROW_SEL_KEY ); 2414 if( rowNo != null ) { return rowNo; } 2415 2416 String[] selected = getRequestValues( HybsSystem.ROW_SEL_KEY ) ; 2417 if( selected != null && selected.length != 0 ) { 2418 rowNo = new int[ selected.length ]; 2419 for( int i=0; i<selected.length; i++ ) { 2420 if( selected[i] != null && selected[i].length() > 0 ) { 2421 rowNo[i] = Integer.parseInt( selected[i] ); 2422 } 2423 } 2424 Arrays.sort( rowNo ); 2425 } 2426 else { 2427 rowNo = new int[0]; 2428 } 2429 2430 return rowNo; 2431 } 2432 2433 /** 2434 * 表示データの HybsSystem.ROW_SEL_KEY に対して、選ばれた 行番号の 2435 * 配列を設定します。 2436 * ここで設定した選択配列は、getParameterRows() メソッドで取得する場合、優先されます。 2437 * 2438 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 2439 * 2440 * @param rowNo 行番号配列 2441 */ 2442 protected void setParameterRows( final int[] rowNo ) { 2443 setRequestAttribute( HybsSystem.ROW_SEL_KEY , rowNo ); 2444 } 2445 2446 /** 2447 * 指定のクッキーをセットします。 2448 * これは、従来,各Taglibパッケージで使用していました、ErrorMessage オブジェクトを、 2449 * HTMLテーブル形式で表示する為に、DBUtilクラスや、ViewFormクラスなど、複数のクラスを 2450 * 複雑に組み合わせて使用していましたが、一つの static メソッドにまとめたものです。 2451 * 2452 * @og.rev 3.7.0.3 (2005/03/01) 新規登録 2453 * 2454 * @param key クッキーのキー 2455 * @param value クッキーの設定値 2456 * @param maxage 最長存続期間を秒単位で設定(負の値は Cookie を保存しない、 0 なら Cookie を削除する) 2457 */ 2458 protected void setCookie( final String key,final String value,final int maxage ) { 2459 HttpServletResponse res = (HttpServletResponse)pageContext.getResponse(); 2460 Cookie ck = new Cookie( key, value ); 2461 ck.setMaxAge( maxage ); // 有効秒 2462 res.addCookie( ck ); 2463 } 2464 2465 /** 2466 * 指定のクッキーを取得します。 2467 * 見つからない場合は、null を返します。 2468 * 2469 * @og.rev 3.7.0.3 (2005/03/01) 新規登録 2470 * 2471 * @param key クッキーのキー 2472 * 2473 * @return クッキーの設定値 2474 */ 2475 protected String getCookie( final String key ) { 2476 HttpServletRequest req = (HttpServletRequest)pageContext.getRequest(); 2477 Cookie[] cks = req.getCookies(); 2478 2479 String val = null; 2480 for( int i=0; i<cks.length; i++ ) { 2481 Cookie ck = cks[i]; 2482 if( ck.getName().equals( key ) ) { 2483 val = ck.getValue(); 2484 break; 2485 } 2486 } 2487 return val ; 2488 } 2489 2490 /** 2491 * リクエスト情報の クォーティション(') 存在チェックを実施するかどうか[true/false]を設定します 2492 * (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。 2493 * 2494 * SQLインジェクション対策の一つとして、暫定的ではありますが、SQLのパラメータに 2495 * 渡す文字列にクォーティション(') を許さない設定にすれば、ある程度は防止できます。 2496 * 数字タイプの引数には、 or 5=5 などのクォーティションを使用しないコードを埋めても、 2497 * 数字チェックで検出可能です。文字タイプの場合は、必ず (')をはずして、 2498 * ' or 'A' like 'A のような形式になる為、(')チェックだけでも有効です。 2499 * (') が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。 2500 * (初期値:システム定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])。 2501 * 2502 * @og.rev 4.0.0.0 (2005/08/31) 新規追加 2503 * 2504 * @param flag クォーティションチェック [true:する/:falseしない] 2505 * @see org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK 2506 */ 2507 protected void useQuotCheck( final boolean flag ) { 2508 quotCheck = flag; 2509 } 2510 2511 /** 2512 * リクエスト情報の HTMLTag開始/終了文字(><) 存在チェックを実施するかどうか[true/false]を設定します 2513 * (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。 2514 * 2515 * クロスサイトスクリプティング(XSS)対策の一環としてless/greater than signについてのチェックを行います。 2516 * (><) が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。 2517 * 現在の実装としてはリクエストパラメータのみチェックして、attributesに対しては行いません。 2518 * (初期値:システム定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])。 2519 * 2520 * @og.rev 5.0.0.2 (2009/09/15) 新規追加 2521 * 2522 * @param flag XSSチェック [true:する/false:しない] 2523 * @see org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK 2524 */ 2525 protected void useXssCheck( final boolean flag ) { 2526 xssCheck = flag; 2527 } 2528 2529 /** 2530 * 日付関係の情報を簡易的に取り出す処理を行います。 2531 * 2532 * これは、{@DATE.XXXX AA BB CC} 引数処理をおこなうための、サポートメソッドです。 2533 * XXXX は結果のフォーマット、AA が基準時刻で省略した場合は、現在時刻が利用されます。 2534 * BB 引数は、日付についての加減算処理を行うためのコマンドです。 2535 * CC 引数は、BB引数のコマンドに付属するパラメータです。加減算処理の数値を指定できます。 2536 * AA,BB,CC 引数については、先頭に、@ を付ける事で、リクエスト変数が使用できます。 2537 * 2538 * 引数は、"XXXX AA BB" という状態で受け取ります。(DATE. ははずした形) 2539 * "XXXX" は、日付処理を行うキー文字列で予約語になっています。 2540 * ・YMD :8文字の4-2-2年月日データ(yyyyMMdd)を扱います。 2541 * ・Y2MD :6文字の2-2-2年月日データ(yyMMdd)を扱います。 2542 * ・YM :6文字の4-2年月データ(yyyyMM)を扱います。 2543 * ・HMS :6文字の2-2-2時分秒データ(HHmmss)を扱います。 2544 * ・YMDHMS :14文字の4-2-2-2-2-2年月日時分秒データ(yyyyMMddHHmmss)を扱います。 2545 * ・EEE :曜日をデフォルトロケール(EEE)で表示します。 2546 * 2547 * F付きは、フォーマットされた日付を返します。 2548 * ・YMDF :10文字の日付表現(yyyy/MM/dd)を扱います。 2549 * ・Y2MDF :8文字の日付表現(yy/MM/dd)を扱います。 2550 * ・YMF :7文字の日付表現(yyyy/MM)を扱います。 2551 * ・HMSF :8文字の時刻表現(HH:mm:ss)を扱います。 2552 * ・YMDHMSF:19文字の日付表現(yyyy/MM/dd HH:mm:ss)を扱います。 2553 * ・MDF :5文字の月日表現(MM/dd)を扱います。 2554 * ・MDEF :5文字+曜日の月日表現(MM/dd(EEE))を扱います。 2555 * ・MD2F :和暦の月日表現(MM月dd日)を扱います。(5.5.5.2 追加) 2556 * ・GYMDF :和暦の年月日表現(GGGGyyyy年MM月dd日)を扱います。 2557 * ・G2YMDF :和暦の日付表現(Gyyyy/MM/dd)を扱います。 2558 * ・GYMF :和暦の年月表現(GGGGyyyy年MM月)を扱います。 2559 * ・GYF :和暦の年表現(GGGGyyyy)を扱います。 2560 * 2561 * なお、上記以外のフォーマットを指定する場合は、XXXX部分に直接記述できます。(5.5.5.2 追加) 2562 * ただし、スペースで分解するため、フォーマットにスペースを含む場合は、ダブルコーテーション等で 2563 * くくる等の処理が必要です。基本的には、自由フォーマットは、エラーチェックがない為、使わないでください。 2564 * 2565 * 第二引数 AA は、基準となる日付を、yyyyMMdd形式で指定します。nullの場合は、現在時刻を使用します。 2566 * 指定できる日付は、yyyyMMdd形式を推奨しますが、'/' , '-' , ' ' , ':' を削除して使います。 2567 * 6桁の場合は、yyyyMM + 01 とし、8ケタの場合は、yyyyMMdd とし、14ケタ以上の場合は、前半14文字を 2568 * yyyyMMddHHmmss として処理します。それ以外の桁数の場合は、エラーになります。 2569 * たとえば、"2012/09/05 16:52:36" のようなフォーマットデータの場合、'/' , '-' , ' ' , ':' を削除して 2570 * "20120905165236" に変換後、日付オブジェクトに変換されます。 2571 * 2572 * AA には、数字で始まる(20050701など)実日付と@で始まるパラメータが使用できます。 2573 * @AA と記述することで、{@AA}で指定する場合と同様のリクエストパラメータが使用できます。 2574 * このパラメータの値の解析結果が、null の場合は、現在時刻が使用されます。 2575 * 数字以外の場合は、省略されたと判断して、コマンド(BB引数)として使用されます。 2576 * 2577 * BB 引数は、日付についての加減算処理を行います。 2578 * 省略すると、なにも加減算処理を行いません。 2579 * この引数もパラメータ(@BB)指定で、リクエストパラメータが使用できます。 2580 * 加減算処理のパラメータが使用できるのは、"H" , "D" , "M" の1文字パラメータの場合のみです。 2581 * それ以外のコマンドで、加減算処理する場合は、独立した CC 引数 を使用してください。 2582 * ・SD :当月の最初の日付にセットします。(当月1日)。CC引数は、-N:N月前、0:当月(=SD)、N:N月後、-1:BSD と同じ、1:ASD と同じ 2583 * ・ED :当月の最後の日付にセットします。(当月月末)。CC引数は、-N:N月前、0:当月(=ED)、N:N月後、-1:BED と同じ、1:AED と同じ 2584 * ・SW :日付処理の週初め(月曜日)にセットします。日付は当日より前に移動します。CC引数は、-N:N週前、0:今週(=SW)、N:N週後 2585 * ・EW :日付処理の週末(日曜日)にセットします。日付は当日より後ろに移動します。CC引数は、-N:N週前、0:今週(=EW)、N:N週後 2586 * ・H1 〜 HXXX :時を指定の分だけ進めます。H1なら1時間後、H24 なら24時間後(5.5.5.6 (2012/08/31) 追加) 2587 * ・D1 〜 DXXX :日を指定の分だけ進めます。D1なら翌日、D200 なら200日後 2588 * ・M1 〜 MXXX :月を指定の分だけ進めます。M1なら翌月、M6 なら半年後 2589 * ・BSD :(有閑)先月の最初の日付にセットします。(先月1日)(5.5.5.2 追加)。SD -1 と同等 2590 * ・BED :(有閑)先月の最後の日付にセットします。(先月月末)(5.5.5.2 追加)。ED -1 と同等 2591 * ・ASD :(有閑)翌月の最初の日付にセットします。(翌月1日)(5.5.5.2 追加)。SD 1 と同等 2592 * ・AED :(有閑)翌月の最後の日付にセットします。(翌月月末)(5.5.5.2 追加)。ED 1 と同等 2593 * 2594 * CC 引数は、特別な処理で、BB 引数に対して、加算、減算のための数字を指定できます。(5.7.4.1 (2014/03/14) 追加) 2595 * 従来は、BB 引数が、"H" , "D" , "M" の 1文字パラメータの場合のみ利用可能でした。 2596 * これは、"H15" と指定するのと、"H" "15" と指定するのと同じ意味になります。 2597 * 異なるのは、CC 引数も、(@CC)指定で、リクエストパラメータが使用できます。 2598 * 従来は、文字列として結合された状態でしか、BB 引数を渡せませんでしたが、この、CC 引数の 2599 * 追加で、日付の加減算を、パラメータ指定できるようになります。 2600 * 数字以外の文字が指定されたり、パラメータの解析結果が NULL の場合には、BB引数自体も無視されます。 2601 * 注意点は、各 BB 引数に応じて、数字の意味が異なるという事です。 2602 * 2603 * HXXX,DXXX,MXXX 形式に、CC 引数を付けた場合は、XXX にさらに加算されます。 2604 * prmB に、数字を使用した場合、(コマンドでない場合)にも、CC 引数は、加算されます。 2605 * 2606 * @og.rev 3.8.0.2 (2005/07/11) 新規追加 2607 * @og.rev 5.4.0.1 (2011/11/01) 日付処理の機能追加(BB 引数に、リクエストパラメータ対応) 2608 * @og.rev 5.5.0.2 (2012/03/09) 和暦対応 2609 * @og.rev 5.5.5.2 (2012/08/18) XXXXフォーマット追加、自由フォーマット対応、BB引数追加、/,-削除機能追加、SM,EM廃止 2610 * @og.rev 5.5.5.6 (2012/08/31) H1 〜 HXXX 追加。時間の加算を指定できる。 2611 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。 2612 * @og.rev 5.5.8.2 (2012/11/09) prmA の判定に、null と ゼロ文字列を判定する。 2613 * @og.rev 5.6.0.1 (2013/01/11) 5.5.7.2でyyyyMMddしか取っていないため、HHmmssを追加します 2614 * @og.rev 5.7.4.1 (2014/03/14) AA 引数の@解析後のコマンド判定方法を、8ケタ以下から先頭が数字以外に変更します。 2615 * @og.rev 5.7.4.1 (2014/03/14) CC 引数を、"H" , "D" , "M" 以外でも使用できるように拡張します。 2616 * 2617 * @param value パラメータ 2618 * 2619 * @return メッセージ情報 2620 * @see org.opengion.fukurou.util.HybsDateUtil#getDateFormat( String,String,String,int ) 2621 */ 2622 protected String getDateFormat( final String value ) { 2623 // {@DATE.XXXX AA BB CC} を分割 2624 String[] vals = StringUtil.csv2Array( value,' ' ); // ダブルクオート内は保持される。 2625 2626 String key = vals[0] ; 2627 2628 // 5.7.4.1 (2014/03/14) 初期化時に、vals を設定しておきます。 2629 String prmA = (vals.length >= 2) ? vals[1] : null ; 2630 String prmB = (vals.length >= 3) ? vals[2] : null ; 2631 String prmC = (vals.length >= 4) ? vals[vals.length-1] : null ; // 互換性。最後の値が、CC引数 2632 2633 if( prmA != null && prmA.startsWith( "@" ) ) { 2634 prmA = getRequestValue( prmA.substring(1) ); 2635 } 2636 2637 if( prmB != null && prmB.startsWith( "@" ) ) { 2638 prmB = getRequestValue( prmB.substring(1) ); 2639 } 2640 2641 if( prmC != null && prmC.startsWith( "@" ) ) { 2642 prmC = getRequestValue( prmC.substring(1) ); 2643 } 2644 2645 // 5.7.4.1 (2014/03/14) AA 引数の@解析後のコマンド判定方法を、8ケタ以下から先頭が数字以外に変更します。 2646 if( prmA != null && prmA.length() > 0 ) { 2647 char chA = prmA.charAt(0); 2648 if( chA < '0' || chA > '9' ) { // 先頭が、数字以外の場合は、コマンドなので、一つずつずらす。 2649 prmC = prmB; 2650 prmB = prmA; 2651 prmA = null; 2652 } 2653 } 2654 2655 // 5.7.4.1 (2014/03/14) CC 引数を、"H" , "D" , "M" 以外でも使用できるように拡張します。 2656 int intC = 0; 2657 if( prmC != null && prmC.length() > 0 ) { 2658 try { 2659 intC = Integer.parseInt( prmC ); 2660 } 2661 catch( NumberFormatException ex ) { 2662 String errMsg = "CC引数が数字ではありません。value=[" + value + "]" 2663 + ex.getMessage() ; 2664 System.err.println( errMsg ); 2665 } 2666 } 2667 2668 // prmA が null か、isEmpty() の場合は、現在時刻が使用される。 2669 return HybsDateUtil.getDateFormat( key,prmA,prmB,intC ); // 5.7.4.1 (2014/03/14) CC 引数を拡張します。 2670 2671// // {@DATE.XXXX AA BB} を分割 2672// String[] vals = StringUtil.csv2Array( value,' ' ); 2673// 2674// String key = vals[0] ; 2675// 2676// String prmA = null; // 5.5.7.2 (2012/10/09) 引数として渡すので上位で初期化しておく。 2677// String prmB = null; 2678//// if( vals.length == 3 ) { 2679// if( vals.length >= 3 ) { 2680// prmB = vals[2]; 2681// // 5.4.0.1 (2011/11/01) BB引数も、リクエストパラメータ処理できるように修正 2682// if( prmB.startsWith( "@" ) ) { 2683// prmB = getRequestValue( prmB.substring(1) ); 2684// } 2685// } 2686// 2687// if( vals.length > 1 ) { 2688//// String prmA = vals[1]; 2689// prmA = vals[1]; 2690// if( prmA.startsWith( "@" ) ) { 2691// prmA = getRequestValue( prmA.substring(1) ); 2692// } 2693// 2694// // prmA の@解析後、8ケタ以下の場合は、コマンドとみなし、prmB にセットし、自身は、null をセットする。 2695// if( prmA != null && prmA.length() < 8 ) { 2696// prmB = prmA; 2697// prmA = null; 2698// } 2699// } 2700// 2701//// if( prmA == null ) { 2702// if( prmA == null || prmA.isEmpty() ) { // 5.5.8.2 (2012/11/09) null と ゼロ文字列を判定する。 2703//// if( rightNow == null ) { rightNow = HybsDateUtil.getDate( "yyyyMMdd" ); } // 現在時刻を文字列化しておく。 2704// if( rightNow == null ) { rightNow = HybsDateUtil.getDate( "yyyyMMddHHmmss" ); } // 5.6.0.1 (2013/01/11) HHmmss 2705// 2706// prmA = rightNow; // 5.5.7.2 (2012/10/09) 初期値として、設定する。 2707// } 2708// 2709// // 5.5.7.2 (2012/10/09) CC 引数の処理。 2710// // BB 引数が、"H" , "D" , "M" 一文字の単独の場合のみ、最終引数の数字が利用できます。 2711// if( "H".equals( prmB ) || "D".equals( prmB ) || "M".equals( prmB ) ) { 2712// String prmC = vals[vals.length-1]; // 一番最後の文字 2713// if( prmC.startsWith( "@" ) ) { 2714// prmC = getRequestValue( prmC.substring(1) ); 2715// } 2716// if( prmC != null && !prmC.isEmpty() ) { 2717// try { 2718// prmB = prmB + Integer.parseInt( prmC ); // 文字列の連結。 2719// } 2720// catch( NumberFormatException ex ) { 2721// prmB = null; // CC引数が不正な場合は、BB引数も無効化する。 2722// String errMsg = "CC引数が数字ではありません。value=[" + value + "]" 2723// + ex.getMessage() ; 2724// System.err.println( errMsg ); 2725// } 2726// } 2727// else { 2728// prmB = null; // CC引数が不正な場合は、BB引数も無効化する。 2729// } 2730// } 2731// 2732// return HybsDateUtil.getDateFormat( key,prmA,prmB ); // 5.5.7.2 (2012/10/09) HybsDateUtil を利用する 2733 } 2734 2735 /** 2736 * debug や エラー時に参考にする、簡易リファレンスへのリンクを作成します。 2737 * リンクを行うタグの名称は、getTagName() メソッドより取得します。 2738 * 2739 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 2740 * @og.rev 4.2.1.0 (2008/04/11) URLを相対パスに変更 2741 * 2742 * @return 簡易リファレンスへのリンク 2743 * @see #getTagName() 2744 */ 2745 protected String getDocumentLink() { 2746 String name = getTagName(); 2747 2748 // try { 2749 // Field fld = getClass().getDeclaredField( "VERSION" ) ; 2750 // version = (String)fld.get( null ); 2751 // } 2752 // catch( Exception ex ) { 2753 // version = ex.toString(); 2754 // } 2755 2756 // org.opengion.hayabusa.taglib.AbcdTag というクラス名より、abcd を取り出す。 2757 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL ); 2758 buf.append( "<br /><a href=\"../common/documents.html#VAL_" ); 2759 buf.append( name ); 2760 buf.append( "\" target=\"_brank\" >簡易リファレンス[" ); 2761 buf.append( name ); 2762 buf.append( "] " ); 2763 // buf.append( version ); 2764 buf.append( "</a>" ).append( HybsSystem.BR ); 2765 2766 return buf.toString(); 2767 } 2768 2769 /** 2770 * タグの名称を、返します。 2771 * これは、debug や エラー時に参考にする、簡易リファレンスへのリンクを作成する場合に 2772 * 使用します。 2773 * 通常は、org.opengion.hayabusa.taglib.AbcdTag という自分自身のクラス名より、 2774 * abcd の部分を取り出し、返します。 2775 * クラス名とタグ名が、上記変換ルールと異なる場合は、このメソッドを 2776 * 使用して、直接 abcd の部分に相当する文字列を返すようにしてください。 2777 * 2778 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 2779 * 2780 * @return タグの名称 2781 * @see #getDocumentLink() 2782 */ 2783 protected String getTagName() { 2784 String name = getClass().getName(); 2785 int adrs = name.lastIndexOf('.'); 2786 2787 // org.opengion.hayabusa.taglib.AbcdTag というクラス名より、abcd を取り出す。 2788 return name.substring( adrs+1,adrs+2 ).toLowerCase(Locale.JAPAN) 2789 + name.substring( adrs+2,name.length()-3 ) ; 2790 } 2791 2792 /** 2793 * リクエストに対して、画面遷移なしモードを有効にします[true/false]。 2794 * この情報は画面IDをキーにセッションに保存されるため、 2795 * 各タグで共有することができます。 2796 * 2797 * @og.rev 4.3.3.0 (2008/10/01) 新規作成 2798 * @og.rev 4.3.8.0 (2009/08/01) リクエストからセッションに変更(名称も変更) 2799 * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。 2800 * 2801 * @param flg 画面遷移なしモードを使用するか [true:有効/false:無効] 2802 */ 2803 protected void setNoTransitionRequest( final boolean flg ) { 2804// protected void setNoTransitionSession( final boolean flg ) { 2805 setRequestAttribute( HybsSystem.NO_TRANSITION_MODE_KEY, String.valueOf( flg )); 2806// setSessionAttribute( HybsSystem.NO_TRANSITION_MODE_KEY +"_"+ getGUIInfoAttri( "KEY" ), String.valueOf( flg ) ); 2807 } 2808 2809 /** 2810 * リクエストで画面遷移なしモードが有効になっているかを返します。 2811 * この情報はセッションから画面IDをキーに取得します。 2812 * セッションに情報が設定されていない(#setNoTransition()が呼ばれていない)場合は、 2813 * falseを返します。 2814 * 2815 * @og.rev 4.3.3.0 (2008/10/01) 新規作成 2816 * @og.rev 4.3.8.0 (2009/08/01) リクエストからセッションに変更 2817 * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。 2818 * 2819 * @return 画面遷移なしモードが有効 2820 */ 2821 protected boolean isNoTransitionRequest() { 2822// protected boolean isNoTransitionSession() { 2823 return StringUtil.nval( (String)getRequestAttribute( HybsSystem.NO_TRANSITION_MODE_KEY ), false ); 2824// return StringUtil.nval( (String)getSessionAttribute( HybsSystem.NO_TRANSITION_MODE_KEY +"_"+ getGUIInfoAttri( "KEY" ) ), false ); 2825 } 2826 2827 /** 2828 * リクエストに対して、AjaxSubmitモードを使用するかどうか指定します[true/false]。 2829 * この情報は画面IDをキーにセッションに保存されるため、 2830 * 各タグで共有することができます。 2831 * 2832 * @og.rev 4.3.8.0 (2009/08/01) 新規作成 2833 * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。 2834 * 2835 * @param flg AjaxSubmitモードを使用するか [true:使用する/false:使用しない] 2836 */ 2837 protected void setAjaxSubmitRequest( final boolean flg ) { 2838// protected void setAjaxSubmitSession( final boolean flg ) { 2839 setRequestAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY, String.valueOf( flg )); 2840// setSessionAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY +"_"+ getGUIInfoAttri( "KEY" ), String.valueOf( flg ) ); 2841 } 2842 2843 /** 2844 * リクエストでAjaxSubmitモードが有効になっているかを返します。 2845 * この情報はセッションから画面IDをキーに取得します。 2846 * セッションに情報が設定されていない(#setNoTransition()が呼ばれていない)場合は、 2847 * falseを返します。 2848 * 2849 * @og.rev 4.3.8.0 (2009/08/01) 新規作成 2850 * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。 2851 * 2852 * @return AjaxSubmitモードが有効 2853 */ 2854 protected boolean isAjaxSubmitRequest() { 2855// protected boolean isAjaxSubmitSession() { 2856 return StringUtil.nval( (String)getRequestAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY ), false ); 2857// return StringUtil.nval( (String)getSessionAttribute( HybsSystem.USE_AJAX_SUBMIT_KEY +"_"+ getGUIInfoAttri( "KEY" ) ), false ); 2858 } 2859 2860 /** 2861 * シリアライズ用のカスタムシリアライズ書き込みメソッド 2862 * 2863 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 2864 * @serialData 一部のオブジェクトは、シリアライズされません。 2865 * 2866 * @param strm ObjectOutputStreamオブジェクト 2867 */ 2868 private void writeObject( final ObjectOutputStream strm ) throws IOException { 2869 strm.defaultWriteObject(); 2870 } 2871 2872 /** 2873 * シリアライズ用のカスタムシリアライズ読み込みメソッド 2874 * 2875 * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。 2876 * 2877 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 2878 * @serialData 一部のオブジェクトは、シリアライズされません。 2879 * 2880 * @param strm ObjectInputStreamオブジェクト 2881 * @see #release2() 2882 */ 2883 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 2884 strm.defaultReadObject(); 2885 attri = new Attributes(); 2886 } 2887 2888 /** 2889 * アクセスログ取得の為,ApplicationInfoオブジェクトを返します。 2890 * 見つからない場合は、null が返ります。(暫定対応) 2891 * 2892 * @og.rev 3.8.7.0 (2006/12/15) 新規追加 2893 * 2894 * @return アクセスログ取得の為の管理オブジェクト 2895 */ 2896 protected ApplicationInfo getApplicationInfo() { 2897 String gamenId = getGUIInfoAttri( "KEY" ); 2898 String jspId = (String)getSessionAttribute( "JSPID" ); 2899 2900 return getUser().getApplicationInfo( gamenId,jspId ); 2901 } 2902 2903 /** 2904 * イベントカラムの実行に必要なカラム情報をマップに登録します。 2905 * 2906 * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 2907 * 2908 * @param col DBカラム 2909 */ 2910 protected void addEventColumn( final DBColumn col ) { 2911 addEventColumn( col.getName(), col.getEventColumn(), col.getEventURL() 2912 , col.getRenderer(), col.getEditor(), col.getRawRendParam(), col.getRawEditParam() ); 2913 } 2914 2915 /** 2916 * イベントカラムの実行に必要なカラム情報をマップに登録します。 2917 * 2918 * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 2919 * 2920 * @param name カラム名 2921 * @param evCol イベントカラム名 2922 * @param url イベントURL 2923 * @param renderer カラムのレンデラー 2924 * @param editor カラムのエディター 2925 * @param rendParam カラムの表示パラメーター 2926 * @param editParam カラムの編集パラメーター 2927 */ 2928 @SuppressWarnings(value={"unchecked"}) 2929 protected void addEventColumn( final String name, final String evCol, final String url, final String renderer, final String editor, final String rendParam, final String editParam ) { 2930 if( evCol == null || evCol.length() == 0 ){ return; } 2931 2932 String key = (String)getRequestAttribute( HybsSystem.USE_EVENT_COLUMN_KEY ); 2933 if( key == null || key.length() == 0 ) { 2934// key = HybsSystem.USE_EVENT_COLUMN_KEY + String.valueOf( System.currentTimeMillis() ); 2935 key = HybsSystem.USE_EVENT_COLUMN_KEY + System.currentTimeMillis(); 2936 setRequestAttribute( HybsSystem.USE_EVENT_COLUMN_KEY, key ); 2937 } 2938 2939 Map<String, DBEventColumn> evColMap = (Map<String, DBEventColumn>)( getSessionAttribute( key ) ); 2940 if( evColMap == null ){ 2941 evColMap = new HashMap<String,DBEventColumn>(); 2942 } 2943 if( evColMap.get( name ) == null ) { 2944 evColMap.put( name, new DBEventColumn( name, evCol, url, renderer, editor, rendParam, editParam ) ); 2945 } 2946 setSessionAttribute( key, evColMap ); 2947 } 2948 2949// /** 2950// * キーを画面ID_xxx.jspでnameとparamのマップを追加します。 2951// * 又、リクエスト変数のUSE_EVENT_COLUMN_KEYをtrueにします。 2952// * 一応複数セッションの対応としてsynchronizedする。 2953// * 2954// * @og.rev 4.3.6.0 (2009/04/01) 新規追加 2955// * 2956// */ 2957// @SuppressWarnings(value={"unchecked"}) 2958// protected void addEventColumnSQL( final String name, final String param ) { 2959// if( session == null ) { session = pageContext.getSession(); } 2960// synchronized( session.toString().intern() ){ 2961// Map<String, String> ecSql = (Map<String, String>)( getSessionAttribute( getGUIInfoAttri( "KEY" ) + "_" + (String) getSessionAttribute( "JSPID" ) ) ); 2962// if( ecSql == null ){ ecSql = new HashMap<String,String>(); } 2963// ecSql.put( name, param ); 2964// setSessionAttribute( getGUIInfoAttri( "KEY" ) + "_" + (String) getSessionAttribute( "JSPID" ), ecSql ); 2965// } 2966// setRequestAttribute( HybsSystem.USE_EVENT_COLUMN_KEY, "true" ); // 利用フラグを立てる 2967// } 2968 2969 /** 2970 * 各データベースに対応するファンクション名を返します。 2971 * 2972 * @og.rev 4.3.7.0 (2009/06/01) 新規作成 2973 * @og.rev 5.1.4.0 (2010/03/01) データベース名 でなく、DBID 名で検索するようにします。 2974 * 2975 * @param key ファンクション名(定義文字) 2976 * 2977 * @return 実ファンクション名 2978 */ 2979 protected String getDBFunctionName( final String key ) { 2980 int idx = key.indexOf( ' ' ); 2981 String func = null; 2982 String dbid = null; 2983 if( idx >= 0 ) { 2984 func = key.substring( 0, idx ); 2985 dbid = key.substring( idx+1, key.length() ); 2986 if( dbid.charAt(0) == '@' ) { dbid = getRequestValue( dbid.substring( 1 ) ); } 2987 } 2988 else { 2989 func = key; 2990 } 2991// return DBFunctionName.getFunctionName( func, ConnectionFactory.getDBFullName( dbid ) ); 2992 // 5.1.4.0 (2010/03/01) データベース名 でなく、DBID 名で検索する。 2993 return DBFunctionName.getFunctionName( func, dbid ); 2994 } 2995 2996 /** 2997 * データロールの設定に基づき、キー(カラム名)に対応する条件式を返します。 2998 * 2999 * @og.rev 4.4.0.0 (2009/08/02) 新規作成 3000 * 3001 * @param key カラム名 3002 * 3003 * @return 条件式 3004 */ 3005 protected String getDataCondition( final String key ) { 3006 return getUser().getDataCondition( key ); 3007 } 3008 3009 /** 3010 * 与えたIPアドレスからホスト名を取得して返します。 3011 * 取得できなかった場合は空文字を返します。 3012 * IPアドレスが解決できない場合や、セキュリティマネージャーで 3013 * 許可されていない場合はエラーを返します。 3014 * 3015 * @og.rev 5.6.6.2 (2013/07/19) 新規作成 3016 * 3017 * @param ip IPアドレス 3018 * 3019 * @return ホスト名(取得できない場合は空文字) 3020 */ 3021 protected String getHostName( final String ip ) { 3022 String hostname = ""; 3023 try{ 3024 hostname = InetAddress.getByName(ip).getHostName(); 3025 } 3026 catch(UnknownHostException ex){ 3027 String errMsg = "IPアドレスが解決できません。" 3028 + ex.getMessage(); 3029 throw new HybsSystemException( errMsg,ex ); 3030 } 3031 catch(SecurityException ex){ 3032 String errMsg = "この操作はセキュリティ上許可されていません。" 3033 + ex.getMessage(); 3034 throw new HybsSystemException( errMsg,ex ); 3035 } 3036 return hostname; 3037 } 3038 3039 /** 3040 * このオブジェクトの文字列表現を返します。 3041 * 基本的にデバッグ目的に使用します。 3042 * 3043 * @return このクラスの文字列表現 3044 */ 3045 @Override 3046 public String toString() { 3047 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 3048 .println( "Other..." ,getAttributes().getAttribute() ) 3049 .fixForm().toString() ; 3050 } 3051}