001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.taglib; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.common.HybsSystemException; 020import org.opengion.fukurou.util.ErrorMessage; 021import org.opengion.fukurou.util.XHTMLTag; 022import org.opengion.fukurou.util.Attributes; 023import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17) 024 025import static org.opengion.fukurou.util.StringUtil.nval ; 026import static org.opengion.fukurou.system.HybsConst.BR; // 6.1.0.0 (2014/12/26) refactoring 027 028import java.util.Locale ; 029 030/** 031 * エラーメッセージを 表形式で表示するタグです。 032 * 033 * Query 関係の実行時にエラー/ワーニングが発生すると、HybsSystem.ERR_MSG_KEY をキーに 034 * ErrorMessage オブジェクト をセッションに登録します。 035 * この情報を元に、表題(TITLE)か、内容(BODY)を表示します。 036 * 基本的には、表題表示時には、リンクを張り、共通エラー表示画面をオープン 037 * 出来る様になっています。 038 * 039 * @og.formSample 040 * ●形式: 041 * <og:errorMessage command="{@command}" clear="{@clear}" /> 042 * ●body:なし 043 * 044 * ●Tag定義: 045 * <og:errorMessage 046 * command 【TAG】コマンド (NEW,RENEW,RESET,REVIEW)をセットします 047 * clear 【TAG】メッセージを初期化するかどうか[true/false]を指定します(初期値:false) 048 * viewType 【TAG】表示形式『表題(TITLE)か、内容(BODY)』を指定します(初期値:TITLE) 049 * displayMsg 【TAG】plsqlUpdate の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0059『登録しました』) 050 * warningMsg 【TAG】登録処理実行後のワーニング結果を画面上に表示するメッセージIDを指定します(初期値:ERR0020) 051 * useSLabel 【TAG】7.0.7.0 (2019/12/13) エラーメッセージにSLABELを利用するかどうか[true/false]を指定します(初期値:false) 052 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 053 * /> 054 * 055 * ●使用例 056 * result.jsp 等のSQL登録実行後の戻り画面に、上記タグを配置すれば、 057 * エラーメッセージが存在すれば、リンクとなって現れ、無ければ、なにも 058 * 現れません。 059 * リンクのとび先は自動的に設定されます。 060 * なお、clear="true" または、command="NEW" の場合に、エラーメッセージは、 061 * クリアされます。 062 * 063 * [entry.jsp] 064 * <% String forwardPage="result.jsp"; %> 065 * <jsp:forward page="<%= response.encodeRedirectURL( forwardPage ) %>" > 066 * <jsp:param name="command" value="REVIEW" /> 067 * <jsp:param name="clear" value="false" /> 068 * </jsp:forward> 069 * 070 * [result.jsp] 071 * <og:errorMessage command="{@command}" clear="{@clear}" /> 072 * 073 * @og.group エラー処理 074 * 075 * @version 4.0 076 * @author Kazuhiko Hasegawa 077 * @since JDK5.0, 078 */ 079public class ErrorMessageTag extends CommonTagSupport { 080 /** このプログラムのVERSION文字列を設定します。 {@value} */ 081 private static final String VERSION = "7.0.7.0 (2019/12/13)" ; 082 private static final long serialVersionUID = 707020191213L ; 083 084 /** command 引数に渡す事の出来る コマンド 新規 {@value} */ 085 public static final String CMD_NEW = "NEW" ; 086 /** command 引数に渡す事の出来る コマンド 再検索 {@value} */ 087 public static final String CMD_RENEW = "RENEW" ; 088 /** command 引数に渡す事の出来る コマンド 取消 {@value} */ 089 public static final String CMD_RESET = "RESET" ; 090 /** command 引数に渡す事の出来る コマンド 再表示 {@value} */ 091 public static final String CMD_REVIEW = "REVIEW" ; 092 093 private static final String ERR_MSG_ID = HybsSystem.ERR_MSG_KEY; // 6.4.1.1 (2016/01/16) errMsgId → ERR_MSG_ID refactoring 094 095 // 6.4.4.1 (2016/03/18) application オブジェクトに関連付ける 共通メッセージがあれば、表示します。 096 private static final String CMN_MSG_ID = HybsSystem.COMMON_MSG_KEY; 097 098 private final String errMsgFile = HybsSystem.sys( "ERR_MSG_FILENAME" ); 099 private final int maxRowCount = HybsSystem.sysInt( "DB_MAX_ROW_COUNT" ) ; 100 101 private transient ErrorMessage errMessage ; 102 private String command ; 103 private boolean msgClear ; 104 private String viewType = "TITLE"; // TITLE/BODY 105 106 // 2.0.1.0 (2002/10/10) デフォルト表示しないから、MSG0059=登録しました。に変更します。 107 private String displayMsg = "MSG0059"; // 初期値は『登録しました。』 108 private String warningMsg = "ERR0020"; // データ登録時にワーニングが発生しました。 109 110 // 7.0.7.0 (2019/12/13) エラーメッセージにSLABELを利用するかどうか[true/false]を指定します(初期値:false) 111 private boolean useSLabel ; 112 113 /** 114 * デフォルトコンストラクター 115 * 116 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 117 */ 118 public ErrorMessageTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 119 120 /** 121 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 122 * 123 * @og.rev 3.5.4.0 (2003/11/25) エラーオブジェクトのクリアに、RENEW or null も追加します。 124 * 125 * @return 後続処理の指示(SKIP_BODY) 126 */ 127 @Override 128 public int doStartTag() { 129 // クリアが指示されるか、コマンドが NEW or RESET or RENEW or null の場合は、エラーをクリアする。 130 if( msgClear || CMD_NEW.equals( command ) || CMD_RESET.equals( command ) ) { 131 // 3.5.4.9 (2004/02/25) RENEW の時は、エラーをクリアしない。 132 removeSessionAttribute( ERR_MSG_ID ); 133 msgClear = true; 134 } 135 else { 136 errMessage = (ErrorMessage)getSessionAttribute( ERR_MSG_ID ); 137 if( errMessage == null ) { msgClear = true; } 138 } 139 140 return SKIP_BODY ; // Body を評価しない 141 } 142 143 /** 144 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 145 * 146 * @og.rev 2.1.0.3 (2002/11/08) command = NEW のときも、『登録しました。』メッセージが表示されるバグを修正 147 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 148 * @og.rev 3.5.5.2 (2004/04/02) TaglibUtil.makeHTMLErrorTable メソッドを利用 149 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 150 * @og.rev 4.1.3.0 (2008/09/04) メッセージをspanで囲う(画面遷移なしモード対応) 151 * @og.rev 5.2.1.0 (2010/10/01) 戻るリンク時に不要な改行が出力される件に対応 152 * @og.rev 6.4.4.1 (2016/03/18) application オブジェクトに関連付ける 共通メッセージがあれば、表示します。 153 * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。 154 * 155 * @return 後続処理の指示 156 */ 157 @Override 158 public int doEndTag() { 159 debugPrint(); // 4.0.0 (2005/02/28) 160 161 String msg = null; 162 if( errMessage == null ) { 163 if( CMD_REVIEW.equals( command ) || CMD_RENEW.equals( command ) ) { 164 // 5.2.1.0 (2010/10/01) 戻るリンク時に不要な改行が出力される件に対応 165 msg = getResource().getLabel( displayMsg ); 166 if( msg != null && msg.length() > 0 ) { msg += BR; } 167 } 168 } 169 else { 170 if( "TITLE".equalsIgnoreCase( viewType ) ) { 171 msg = makeTitle(); 172 } 173 else if( "BODY".equalsIgnoreCase( viewType ) ) { 174// msg = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() ); // 3.5.5.2 (2004/04/02) 175 msg = TaglibUtil.makeHTMLErrorTable( errMessage,getResource(),useSLabel ); // 7.0.7.0 (2019/12/13) 176 } 177 else { 178 final String errMsg = "viewType属性に TITLE/BODY 以外の項目が指定されています。" 179 + "[" + viewType + "]" ; 180 throw new HybsSystemException( errMsg ); 181 } 182 } 183 184 // 6.4.4.1 (2016/03/18) application オブジェクトに関連付ける 共通メッセージがあれば、表示します。 185 final String cmnMsg = (String)getContextAttribute( CMN_MSG_ID ); 186 187 jspPrint( "<span class=\"errmsg\">" ); // 4.1.3.0 (2008/09/04) 188 if( msg != null && msg.length() > 0 ) { jspPrint( msg ); } 189 if( cmnMsg != null && cmnMsg.length() > 0 ) { jspPrint( cmnMsg ); } // 6.4.4.1 (2016/03/18) 190 jspPrint( "</span>" ); 191 192 return EVAL_PAGE ; 193 } 194 195 /** 196 * タグリブオブジェクトをリリースします。 197 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 198 * 199 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 200 * @og.rev 2.0.1.0 (2002/10/10) デフォルト表示しないから、MSG0059=登録しました。に変更します。 201 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 202 * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。 203 */ 204 @Override 205 protected void release2() { 206 super.release2(); 207 command = null; 208 errMessage = null; 209 msgClear = false; 210 viewType = "TITLE"; // TITLE/BODY 211 displayMsg = "MSG0059"; // 初期値は『登録しました。』 212 warningMsg = "ERR0020"; // データ登録時にワーニングが発生しました。 213 useSLabel = false; // 7.0.7.0 (2019/12/13) エラーメッセージにSLABELを利用するかどうか[true/false]を指定します(初期値:false) 214 } 215 216 /** 217 * エラーメッセージをタグ情報の文字列に変換して返します。 218 * 219 * ここでは、正常なメッセージも異常なメッセージも作成します。 220 * 221 * @og.rev 3.6.0.1 (2004/09/29) ワーニング、エラー時のスタイルシートを適用 222 * @og.rev 3.6.0.7 (2004/11/06) target 属性を _new から _blank に変更 223 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 224 * @og.rev 5.1.7.0 (2010/06/01) エラー・ワーニングメッセージの後に改行を入れる(displayMsgと仕様を合わせる) 225 * 226 * @return エラーメッセージのタグ情報文字列 227 */ 228 private String makeTitle() { 229 final String href = getContextPath() + "/" + errMsgFile ; 230 231 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..; 232 final String title = warningMsg == null 233 ? "<span class=\"msg_error\">" 234 + errMessage.getTitle() 235 // 5.1.7.0 (2010/06/01) エラーメッセージの後に改行を入れる 236 + "</span>" + BR 237 :"<span class=\"msg_warning\">" 238 + getResource().getLabel( warningMsg ) 239 // 5.1.7.0 (2010/06/01) ワーニングメッセージの後に改行を入れる 240 + "</span>" + BR; 241 242 final String key = "pageSize"; 243 final String val = String.valueOf( maxRowCount ); 244 final String urlEnc = XHTMLTag.urlEncode( key,val ); 245 246 // 6.1.1.0 (2015/01/17) Attributesの連結記述 247 return XHTMLTag.link( 248 new Attributes() 249 .set( "href" , href ) 250 .set( "target" , "_blank" ) // 3.6.0.7 (2004/11/06) 251 .set( "body" , title ) 252 , urlEnc 253 ); 254 } 255 256 /** 257 * 【TAG】コマンド (NEW,RENEW,RESET,REVIEW)をセットします。 258 * 259 * @og.tag 260 * コマンドは、HTMLから(get/post)指定されますので、CMD_xxx で設定される 261 * フィールド定数値のいづれかを、指定できます。 262 * 263 * @param cmd コマンド (public static final 宣言されている文字列) 264 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ErrorMessageTag.CMD_NEW">コマンド定数</a> 265 */ 266 public void setCommand( final String cmd ) { 267 final String cmd2 = getRequestParameter( cmd ); 268 if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); } 269 } 270 271 /** 272 * 【TAG】メッセージを初期化するかどうか[true/false]を指定します(初期値:false)。 273 * 274 * @og.tag 275 * メッセージは、一般には、エラーメッセージかワーニングです。 276 * 最終処理でメッセージが無ければ、標準でクリアします。 277 * また、command が NEW の場合も、メッセージは自動でクリアされます。 278 * 初期値は、クリアしない (true 以外)です。 279 * 280 * @param flag 初期化 [true:クリアする/それ以外:しない] 281 */ 282 public void setClear( final String flag ) { 283 msgClear = nval( getRequestParameter( flag ),msgClear ); 284 } 285 286 /** 287 * 【TAG】表示形式『表題(TITLE)か、内容(BODY)』を指定します(初期値:TITLE)。 288 * 289 * @og.tag 290 * 一般には、表題(TITLE) を表示しておきます。 291 * 表題表示時には、リンクを張り、共通エラー表示画面をオープン 292 * 出来る様になっています。 293 * 294 * @param type 表示形式 [TITLE:表題/BODY:内容] 295 */ 296 public void setViewType( final String type ) { 297 viewType = nval( getRequestParameter( type ),viewType ); 298 } 299 300 /** 301 * 【TAG】plsqlUpdate の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0059『登録しました』)。 302 * 303 * @og.tag 304 * 指定したメッセージをリソースから取得して表示します。 305 * 表示させたくない場合は、displayMsg = "MSG0065" をセットしてください。 306 * 初期値は、MSG0059『登録しました。』を表示します。 307 * 308 * @og.rev 2.0.1.0 (2002/10/10) デフォルト表示しないから、MSG0059=登録しました。に変更します。 309 * @og.rev 3.2.0.0 (2003/05/22) 引数に何もセットされないときに、デフォルトの文字を表示するように変更。 310 * 311 * @param id 処理結果表示メッセージID 312 */ 313 public void setDisplayMsg( final String id ) { 314 displayMsg = nval( getRequestParameter( id ),displayMsg ); 315 // String ids = getRequestParameter( id ); 316 // if( ids != null ) { displayMsg = ids; } 317 } 318 319 /** 320 * 【TAG】登録処理実行後のワーニング結果を画面上に表示するメッセージIDを指定します(初期値:ERR0020)。 321 * 322 * @og.tag 323 * 指定したメッセージをリソースから取得して表示します。 324 * 表示させたくない場合は、warningMsg = "" をセットしてください。 325 * 初期値は、ERR0020『データ登録時にワーニングが発生しました。』を表示します。 326 * 327 * @og.rev 2.0.1.0 (2002/10/10) デフォルト表示しないから、ERR0020=データ登録時にワーニングが発生しました。に変更します。 328 * 329 * @param id 警告時メッセージID 330 */ 331 public void setWarningMsg( final String id ) { 332 final String ids = getRequestParameter( id ); 333 if( ids != null ) { warningMsg = ids; } 334 } 335 336 /** 337 * 【TAG】エラーメッセージにSLABELを利用するかどうか[true/false]を指定します(初期値:false)。 338 * 339 * @og.tag 340 * 通常のエラーメッセージは、ラベル(長)が使われますが、これをラベル(短)を使いたい場合に、true にセットします。 341 * ここでのラベル(短)は、タグ修飾なしの、ラベル(短)です。 342 * 標準はfalse:利用しない=ラベル(長)です。 343 * true/false以外を指定した場合はfalse扱いとします。 344 * 345 * ラベルリソースの概要説明があれば表示しますが、useSLabel="true" 時は、概要説明を表示しません。 346 * 347 * @og.rev 7.0.7.0 (2019/12/13) 新規追加 348 * 349 * @param prm SLABEL利用 [true:利用する/false:利用しない] 350 */ 351 public void setUseSLabel( final String prm ) { 352 useSLabel = nval( getRequestParameter( prm ),useSLabel ); 353 } 354 355 /** 356 * デバッグ時の文字列を返します。 357 * 358 * @return このオブジェクトのデバッグ表現文字列 359 * @og.rtnNotNull 360 */ 361 @Override 362 public String toString() { 363 return ToString.title( this.getClass().getName() ) 364 .println( "VERSION" ,VERSION ) 365 // .println( "ERR_MSG_ID" ,ERR_MSG_ID ) 366 .println( "errMsgFile" ,errMsgFile ) 367 .println( "maxRowCount" ,maxRowCount) 368 .println( "command" ,command ) 369 .println( "msgClear" ,msgClear ) 370 .println( "viewType" ,viewType ) 371 .println( "displayMsg" ,displayMsg ) 372 .println( "warningMsg" ,warningMsg ) 373 .println( "Other..." ,getAttributes().getAttribute() ) 374 .fixForm().toString() ; 375 } 376}