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; 023 024import static org.opengion.fukurou.util.StringUtil.nval ; 025 026import java.util.Locale ; 027import java.io.ObjectOutputStream; 028import java.io.ObjectInputStream; 029import java.io.IOException; 030 031/** 032 * エラーメッセージを 表形式で表示するタグです。 033 * 034 * Query 関係の実行時にエラー/ワーニングが発生すると、HybsSystem.ERR_MSG_KEY をキーに 035 * ErrorMessage オブジェクト をセッションに登録します。 036 * この情報を元に、表題(TITLE)か、内容(BODY)を表示します。 037 * 基本的には,表題表示時には,リンクを張り、共通エラー表示画面をオープン 038 * 出来る様になっています。 039 * 040 * @og.formSample 041 * ●形式: 042 * <og:errorMessage command="{@command}" clear="{@clear}" /> 043 * ●body:なし 044 * 045 * ●Tag定義: 046 * <og:errorMessage 047 * command 【TAG】コマンド(NEW,RENEW,RESET,REVIEW)をセットします 048 * clear 【TAG】メッセージを初期化するかどうか[true/false]を指定します(初期値:false) 049 * viewType 【TAG】表示形式『表題(TITLE)か、内容(BODY)』を指定します(初期値:TITLE) 050 * displayMsg 【TAG】plsqlUpdate の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0059『登録しました』) 051 * warningMsg 【TAG】登録処理実行後のワーニング結果を画面上に表示するメッセージIDを指定します(初期値:ERR0020) 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 = "5.2.1.0 (2010/10/01)" ; 082 083 private static final long serialVersionUID = 521020101001L ; 084 085 /** command 引数に渡す事の出来る コマンド 新規 {@value} */ 086 public static final String CMD_NEW = "NEW" ; 087 /** command 引数に渡す事の出来る コマンド 再検索 {@value} */ 088 public static final String CMD_RENEW = "RENEW" ; 089 /** command 引数に渡す事の出来る コマンド 取消 {@value} */ 090 public static final String CMD_RESET = "RESET" ; 091 /** command 引数に渡す事の出来る コマンド 再表示 {@value} */ 092 public static final String CMD_REVIEW = "REVIEW" ; 093 /** command 引数に渡す事の出来る コマンド リスト */ 094 private static final String errMsgId = HybsSystem.ERR_MSG_KEY; 095 private final String errMsgFile = HybsSystem.sys( "ERR_MSG_FILENAME" ); 096 private final int maxRowCount = HybsSystem.sysInt( "DB_MAX_ROW_COUNT" ) ; 097 098 private transient ErrorMessage errMessage = null; 099 private String command = null; 100 private boolean msgClear = false; 101 private String viewType = "TITLE"; // TITLE/BODY 102 103 // 2.0.1.0 (2002/10/10) デフォルト表示しないから、MSG0059=登録しました。に変更します。 104 private String displayMsg = "MSG0059"; // 初期値は『登録しました。』 105 private String warningMsg = "ERR0020"; // データ登録時にワーニングが発生しました。 106 107 /** 108 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 109 * 110 * @og.rev 3.5.4.0 (2003/11/25) エラーオブジェクトのクリアに、RENEW or null も追加します。 111 * 112 * @return 後続処理の指示(SKIP_BODY) 113 */ 114 @Override 115 public int doStartTag() { 116 // クリアが指示されるか、コマンドが NEW or RESET or RENEW or null の場合は、エラーをクリアする。 117 if( msgClear || CMD_NEW.equals( command ) || CMD_RESET.equals( command ) ) { 118 // 3.5.4.9 (2004/02/25) RENEW の時は、エラーをクリアしない。 119 removeSessionAttribute( errMsgId ); 120 msgClear = true; 121 } 122 else { 123 errMessage = (ErrorMessage)getSessionAttribute( errMsgId ); 124 if( errMessage == null ) { msgClear = true; } 125 } 126 127 return SKIP_BODY ; // Body を評価しない 128 } 129 130 /** 131 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 132 * 133 * @og.rev 2.1.0.3 (2002/11/08) command = NEW のときも、『登録しました。』メッセージが表示されるバグを修正 134 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 135 * @og.rev 3.5.5.2 (2004/04/02) TaglibUtil.makeHTMLErrorTable メソッドを利用 136 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 137 * @og.rev 4.1.3.0 (2008/09/04) メッセージをspanで囲う(画面遷移なしモード対応) 138 * @og.rev 5.2.1.0 (2010/10/01) 戻るリンク時に不要な改行が出力される件に対応 139 * 140 * @return 後続処理の指示 141 */ 142 @Override 143 public int doEndTag() { 144 debugPrint(); // 4.0.0 (2005/02/28) 145 146 String msg = null; 147 if( errMessage == null ) { 148 if( CMD_REVIEW.equals( command ) || CMD_RENEW.equals( command ) ) { 149 // 5.2.1.0 (2010/10/01) 戻るリンク時に不要な改行が出力される件に対応 150 msg = getResource().getLabel( displayMsg ); 151 if( msg != null && msg.length() > 0 ) { msg += HybsSystem.BR; } 152 } 153 } 154 else { 155 if( "TITLE".equalsIgnoreCase( viewType ) ) { 156 msg = makeTitle(); 157 } 158 else if( "BODY".equalsIgnoreCase( viewType ) ) { 159 msg = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() ); // 3.5.5.2 (2004/04/02) 160 } 161 else { 162 String errMsg = "viewType属性に TITLE/BODY 以外の項目が指定されています。" 163 + "[" + viewType + "]" ; 164 throw new HybsSystemException( errMsg ); 165 } 166 } 167 168 jspPrint( "<span class=\"errmsg\">" ); // 4.1.3.0 (2008/09/04) 169 if( msg != null && msg.length() > 0 ) { jspPrint( msg ); } 170 jspPrint( "</span>" ); 171 172 return EVAL_PAGE ; 173 } 174 175 /** 176 * タグリブオブジェクトをリリースします。 177 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 178 * 179 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 180 * @og.rev 2.0.1.0 (2002/10/10) デフォルト表示しないから、MSG0059=登録しました。に変更します。 181 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 182 * 183 */ 184 @Override 185 protected void release2() { 186 super.release2(); 187 command = null; 188 errMessage = null; 189 msgClear = false; 190 viewType = "TITLE"; // TITLE/BODY 191 displayMsg = "MSG0059"; // 初期値は『登録しました。』 192 warningMsg = "ERR0020"; // データ登録時にワーニングが発生しました。 193 } 194 195 /** 196 * エラーメッセージをタグ情報の文字列に変換して返します。 197 * 198 * ここでは、正常なメッセージも異常なメッセージも作成します。 199 * 200 * @og.rev 3.6.0.1 (2004/09/29) ワーニング、エラー時のスタイルシートを適用 201 * @og.rev 3.6.0.7 (2004/11/06) target 属性を _new から _blank に変更 202 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 203 * @og.rev 5.1.7.0 (2010/06/01) エラー・ワーニングメッセージの後に改行を入れる(displayMsgと仕様を合わせる) 204 * 205 * @return エラーメッセージのタグ情報文字列 206 */ 207 private String makeTitle() { 208 String href = getContextPath() + "/" + errMsgFile ; 209 210 Attributes attri = new Attributes(); 211 attri.set( "href" , href ); 212 attri.set( "target" , "_blank" ); // 3.6.0.7 (2004/11/06) 213 214 final String title ; 215 if( warningMsg != null ) { 216 title = "<span class=\"msg_warning\">" 217 + getResource().getLabel( warningMsg ) 218 // 5.1.7.0 (2010/06/01) ワーニングメッセージの後に改行を入れる 219 + "</span>" + HybsSystem.BR; 220 } 221 else { 222 title = "<span class=\"msg_error\">" 223 + errMessage.getTitle() 224 // 5.1.7.0 (2010/06/01) エラーメッセージの後に改行を入れる 225 + "</span>" + HybsSystem.BR; 226 } 227 228 attri.set( "body" , title ); 229 230 String key = "pageSize"; 231 String val = String.valueOf( maxRowCount ); 232 String urlEnc = XHTMLTag.urlEncode( key,val ); 233 234 return XHTMLTag.link( attri,urlEnc ) ; 235 } 236 237 /** 238 * 【TAG】コマンド(NEW,RENEW,RESET,REVIEW)をセットします。 239 * 240 * @og.tag 241 * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される 242 * フィールド定数値のいづれかを、指定できます。 243 * 244 * @param cmd コマンド(public static final 宣言されている文字列) 245 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ErrorMessageTag.CMD_NEW">コマンド定数</a> 246 */ 247 public void setCommand( final String cmd ) { 248 String cmd2 = getRequestParameter( cmd ); 249 if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); } 250 } 251 252 /** 253 * 【TAG】メッセージを初期化するかどうか[true/false]を指定します(初期値:false)。 254 * 255 * @og.tag 256 * メッセージは、一般には,エラーメッセージかワーニングです。 257 * 最終処理でメッセージが無ければ,標準でクリアします。 258 * また、command が NEW の場合も、メッセージは自動でクリアされます。 259 * 初期値は、クリアしない (true 以外)です。 260 * 261 * @param flag [true:クリアする/それ以外:しない] 262 */ 263 public void setClear( final String flag ) { 264 msgClear = nval( getRequestParameter( flag ),msgClear ); 265 } 266 267 /** 268 * 【TAG】表示形式『表題(TITLE)か、内容(BODY)』を指定します(初期値:TITLE)。 269 * 270 * @og.tag 271 * 一般には,表題(TITLE) を表示しておきます。 272 * 表題表示時には,リンクを張り、共通エラー表示画面をオープン 273 * 出来る様になっています。 274 * 275 * @param flag 表示形式 表題(TITLE)か、内容(BODY) 276 */ 277 public void setViewType( final String flag ) { 278 viewType = nval( getRequestParameter( flag ),viewType ); 279 } 280 281 /** 282 * 【TAG】plsqlUpdate の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0059『登録しました』)。 283 * 284 * @og.tag 285 * 指定したメッセージをリソースから取得して表示します。 286 * 表示させたくない場合は, displayMsg = "MSG0065" をセットしてください。 287 * 初期値は、MSG0059『登録しました。』を表示します。 288 * 289 * @og.rev 2.0.1.0 (2002/10/10) デフォルト表示しないから、MSG0059=登録しました。に変更します。 290 * @og.rev 3.2.0.0 (2003/05/22) 引数に何もセットされないときに、デフォルトの文字を表示するように変更。 291 * 292 * @param id ディスプレイに表示させるメッセージ ID 293 */ 294 public void setDisplayMsg( final String id ) { 295 displayMsg = nval( getRequestParameter( id ),displayMsg ); 296 // String ids = getRequestParameter( id ); 297 // if( ids != null ) { displayMsg = ids; } 298 } 299 300 /** 301 * 【TAG】登録処理実行後のワーニング結果を画面上に表示するメッセージIDを指定します(初期値:ERR0020)。 302 * 303 * @og.tag 304 * 指定したメッセージをリソースから取得して表示します。 305 * 表示させたくない場合は, warningMsg = "" をセットしてください。 306 * 初期値は、ERR0020『データ登録時にワーニングが発生しました。』を表示します。 307 * 308 * @og.rev 2.0.1.0 (2002/10/10) デフォルト表示しないから、ERR0020=データ登録時にワーニングが発生しました。に変更します。 309 * 310 * @param id ディスプレイに表示させるメッセージ ID 311 */ 312 public void setWarningMsg( final String id ) { 313 String ids = getRequestParameter( id ); 314 if( ids != null ) { warningMsg = ids; } 315 } 316 317 /** 318 * シリアライズ用のカスタムシリアライズ書き込みメソッド 319 * 320 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 321 * @serialData 一部のオブジェクトは、シリアライズされません。 322 * 323 * @param strm ObjectOutputStreamオブジェクト 324 * @throws IOException 入出力エラーが発生した場合 325 */ 326 private void writeObject( final ObjectOutputStream strm ) throws IOException { 327 strm.defaultWriteObject(); 328 } 329 330 /** 331 * シリアライズ用のカスタムシリアライズ読み込みメソッド 332 * 333 * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。 334 * 335 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 336 * @serialData 一部のオブジェクトは、シリアライズされません。 337 * 338 * @param strm ObjectInputStreamオブジェクト 339 * @see #release2() 340 * @throws IOException シリアライズに関する入出力エラーが発生した場合 341 * @throws ClassNotFoundException クラスを見つけることができなかった場合 342 */ 343 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 344 strm.defaultReadObject(); 345 } 346 347 /** 348 * デバッグ時の文字列を返します。 349 * 350 * @return このオブジェクトのデバッグ表現文字列 351 */ 352 @Override 353 public String toString() { 354 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 355 .println( "VERSION" ,VERSION ) 356 .println( "errMsgId" ,errMsgId ) 357 .println( "errMsgFile" ,errMsgFile ) 358 .println( "maxRowCount" ,maxRowCount) 359 .println( "command" ,command ) 360 .println( "msgClear" ,msgClear ) 361 .println( "viewType" ,viewType ) 362 .println( "displayMsg" ,displayMsg ) 363 .println( "warningMsg" ,warningMsg ) 364 .println( "Other..." ,getAttributes().getAttribute() ) 365 .fixForm().toString() ; 366 } 367}