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.fukurou.util.ErrMsg; 019import org.opengion.fukurou.util.ErrorMessage; 020import org.opengion.fukurou.util.StringUtil; // 6.9.2.1 (2018/03/12) 021import org.opengion.hayabusa.html.ViewForm; 022import org.opengion.hayabusa.html.ViewFormFactory; 023import org.opengion.hayabusa.resource.ResourceManager; 024import org.opengion.hayabusa.db.DBTableModel; 025import org.opengion.hayabusa.db.DBTableModelUtil; 026import org.opengion.hayabusa.db.DBColumn; 027 028import java.util.Arrays; 029import java.util.Comparator; 030 031/** 032 * Taglib で共通的に使用される ユーティリティクラスです。 033 * 034 * 全てのメソッドは、 パッケージプライベートなstatic 宣言されています。 035 * 036 * @og.rev 3.1.1.0 (2003/03/28) 新規作成 037 * @og.group その他部品 038 * 039 * @version 4.0 040 * @author Kazuhiko Hasegawa 041 * @since JDK5.0, 042 */ 043final class TaglibUtil { 044 /* default */ /** VIEW */ static final String VIEW_ID = "HYBS_VIEW" ; // 3.5.6.4 (2004/07/16) 045 /* default */ /** LINK */ static final String LINK_ID = "HYBS_LINK" ; // 3.5.6.4 (2004/07/16) 046 /* default */ /** MARK */ static final String MARK_ID = "HYBS_MARK" ; // 3.5.6.4 (2004/07/16) 047 048 private static int tagId ; 049 050 // 4.3.2.0 (2008/09/11) 行番号順ソートのための、Comparator オブジェクト 051 private static final Comparator<? super ErrMsg> ERR_COMP = // 6.4.1.1 (2016/01/16) errComp → ERR_COMP refactoring 052 new Comparator<ErrMsg>() { 053 /** 054 * 順序付けのために2つの引数を比較します。 055 * 056 * Comparator インタフェースの実装です。 057 * 058 * @param s1 比較対象の最初のErrMsg 059 * @param s2 比較対象の2番目のErrMsg 060 * @return 最初の引数が2番目の引数より小さい場合は負の整数、両方が等しい場合は0、最初の引数が2番目の引数より大きい場合は正の整数。 061 */ 062 @Override 063 public int compare( final ErrMsg err1,final ErrMsg err2 ) { 064 return err1.getNo() - err2.getNo() ; 065 } 066 } ; 067 068 /** 069 * デフォルトコンストラクターをprivateにして、 070 * オブジェクトの生成をさせないようにする。 071 * 072 */ 073 private TaglibUtil() {} 074 075 /** 076 * チェックボックスのラベルを関連つけるための id 値を返します。 077 * 078 * InputTag と OrderByTag 全体で、呼び出される都度に連番をつけて返します。 079 * ユニークな番号になる様にする事が目的なので、99999 で、0 にクリアします。 080 * 別スレッドによる同時アクセスで整合性が破綻(同じ番号が返る)しても、 081 * 問題ありません。(単独のスレッド内でユニークになればよい。) 082 * 083 * @return ユニークな id 値 084 */ 085 /* default */ static String getTagId() { 086 final String id = "ID" + ( tagId++ ); 087 088 if( tagId >= 100000 ) { tagId = 0; } 089 return id ; 090 } 091 092 /** 093 * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTMLテーブルを作成します。 094 * これは、従来,各Taglibパッケージで使用していました、ErrorMessage オブジェクトを、 095 * HTMLテーブル形式で表示する為に、DBUtilクラスや、ViewFormクラスなど、複数のクラスを 096 * 複雑に組み合わせて使用していましたが、一つの static メソッドにまとめたものです。 097 * 098 * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。 099 * 100 * @param errMsg ErrorMessageオブジェクト 101 * @param resource リソースマネージャー 102 * 103 * @return HTMLのテーブルタグに変換後の文字列(無ければ、ゼロストリング) 104 * @og.rtnNotNull 105 */ 106 /* default */ static String makeHTMLErrorTable( final ErrorMessage errMsg,final ResourceManager resource ) { 107 return makeHTMLErrorTable( errMsg,resource , false ); // 通常ラベル使用 108 } 109 110 /** 111 * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTMLテーブルを作成します。 112 * これは、従来,各Taglibパッケージで使用していました、ErrorMessage オブジェクトを、 113 * HTMLテーブル形式で表示する為に、DBUtilクラスや、ViewFormクラスなど、複数のクラスを 114 * 複雑に組み合わせて使用していましたが、一つの static メソッドにまとめたものです。 115 * 116 * @og.rev 3.5.5.2 (2004/04/02) 新規追加 117 * @og.rev 3.5.6.1 (2004/06/25) lang 言語コード 属性を削除します。 118 * @og.rev 3.5.6.2 (2004/07/05) setBgColorCycle の引数定義を変更 119 * @og.rev 3.8.0.4 (2005/08/08) setUseScrollBar の追加(ヘッダー固定のスクロールバーを出さない) 120 * @og.rev 3.8.9.5 (2007/09/12) PG名、ステップ名追加(開発ガイドライン対応) 121 * @og.rev 4.0.0.0 (2005/01/31) ResourceManager getMessage 関数を使用 122 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 123 * @og.rev 4.3.2.0 (2008/09/11) 行番号順ソート、メッセージのラベル(短)化、コメント出力 124 * @og.rev 4.3.4.5 (2009/01/08) 対応方法(概要説明)が存在すれば表示する 125 * @og.rev 4.3.7.6 (2009/07/15) 対応方法のパラメータ対応 126 * @og.rev 6.0.2.5 (2014/10/31) エラーメッセージに、preタグを付けます。 127 * @og.rev 6.2.2.0 (2015/03/27) interface に変更タイプ と、書込み許可を追加 128 * @og.rev 6.4.5.2 (2016/05/06) Exception: の後ろに改行を入れます(クラス名が長いと、メッセージが見えにくいため)。 129 * @og.rev 6.8.1.1 (2017/07/22) makeNthChild 処理時に、自身のテーブルと区別するために、viewClass を追加します。 130 * @og.rev 6.9.2.1 (2018/03/12) エラーメッセージのタグ情報を、パースします。 131 * @og.rev 6.9.3.1 (2018/04/02) エラーメッセージのタグ情報のパースは、JasperException 以降から、改行2つまでの間のみとする。 132 * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。 133 * @og.rev 7.0.7.2 (2020/01/09) メッセージを比較して、同じなら出力しない。 134 * @og.rev 7.2.9.0 (2020/10/12) getRawShortLabel → getShortErrorMsg メソッド名変更 135 * 136 * @param errMsg ErrorMessageオブジェクト 137 * @param resource リソースマネージャー 138 * @param useSLabel SLABEL利用 [true:利用する/false:利用しない] 139 * 140 * @return HTMLのテーブルタグに変換後の文字列(無ければ、ゼロストリング) 141 * @og.rtnNotNull 142 */ 143// /* default */ static String makeHTMLErrorTable( final ErrorMessage errMsg,final ResourceManager resource ) { 144 /* default */ static String makeHTMLErrorTable( final ErrorMessage errMsg,final ResourceManager resource, final boolean useSLabel ) { 145 if( errMsg == null ) { return ""; } 146 147 final String[] names ; 148 if( errMsg.isSetPgStep() ) { 149 // names = new String[] { "ROW_NO","KEKKA","MSGID","MESSAGE","PG","STEP" }; // 3.8.9.5 (2007/09/12) 150 names = new String[] { "ROW_NO","KEKKA","MSGID","MESSAGE", "PG","STEP" }; // 3.8.9.5 (2007/09/12) 151 } 152 else { 153 names = new String[] { "ROW_NO","KEKKA","MSGID","MESSAGE" }; 154 } 155 156 final int clmSize = names.length; 157 158 final DBTableModel errTable = DBTableModelUtil.newDBTable(); 159 errTable.init( clmSize ); 160 161 for( int i=0; i<clmSize; i++ ) { 162 final DBColumn dbColumn = resource.makeDBColumn( names[i] ); 163 errTable.setDBColumn( i,dbColumn ); 164 } 165 166 // 4.3.2.0 (2008/09/11) 行番号順ソート 167 final ErrMsg[] errMsgs = errMsg.toArray(); 168 Arrays.sort( errMsgs, ERR_COMP ); 169 170 for( int i=0; i<errMsg.size(); i++ ) { 171 final ErrMsg err = errMsgs[i]; 172 String[] clmVals = new String[clmSize]; 173 clmVals[0] = String.valueOf( err.getNo() ); 174 clmVals[1] = String.valueOf( err.getKekka() ); 175 clmVals[2] = err.getId(); 176 177 // 6.9.3.1 (2018/04/02) エラーメッセージのタグ情報のパースは、JasperException 以降から、改行2つまでの間のみとする。 178// String tmpVals3 = resource.getLabel( err ); 179// String tmpVals3 = useSLabel ? resource.getRawShortLabel( err ) : resource.getLabel( err ); // 7.0.7.0 (2019/12/13) useSLabel 属性を追加。 180 String tmpVals3 = useSLabel ? resource.getShortErrorMsg( err ) : resource.getLabel( err ); // 7.2.9.0 (2020/10/12) メソッド名変更 181 182 if( tmpVals3 != null ) { 183 tmpVals3 = tmpVals3.trim(); 184 // // 7.0.7.2 (2020/01/09) Exception: で改行処理を中断する。 185 // if( tmpVals3.contains( "Exception:" ) ) { 186 // tmpVals3 = tmpVals3.replaceAll( "Exception: " , "Exception:\n" ); 187 // } 188 final int idx0 = tmpVals3.indexOf( "JasperException" ); // JSP画面のエラー 189 if( idx0 >= 0 ) { 190 final int idx1 = tmpVals3.indexOf( "\n\n",idx0 ); // 改行2つ 191 if( idx1 >= 0 ) { 192 tmpVals3 = tmpVals3.substring( 0,idx0 ) + 193 StringUtil.htmlFilter( tmpVals3.substring( idx0,idx1 ) ) + 194 tmpVals3.substring( idx1 ); 195 } 196 else { 197 tmpVals3 = tmpVals3.substring( 0,idx0 ) + 198 StringUtil.htmlFilter( tmpVals3.substring( idx0 ) ); 199 } 200 } 201 clmVals[3] = "<pre>" + tmpVals3 + "</pre>"; 202 } 203 204// // 6.0.2.5 (2014/10/31) エラーメッセージに、preタグを付けます。 205// clmVals[3] = "<pre>" + resource.getLabel( err ) + "</pre>"; 206// // clmVals[3] = "<pre>" + StringUtil.htmlFilter( resource.getLabel( err ) ) + "</pre>"; // 6.9.2.1 (2018/03/12) 207// 208// // 6.4.5.2 (2016/05/06) Exception: の後ろに改行を入れます(クラス名が長いと、メッセージが見えにくいため)。 209// if( clmVals[3].contains( "Exception:" ) ) { 210// clmVals[3] = clmVals[3].replaceAll( "Exception: " , "Exception:\n" ); 211// } 212 213 if( errMsg.isSetPgStep() ) { 214 clmVals[4] = err.getPg(); 215 clmVals[5] = err.getStep(); 216 } 217 errTable.addColumnValues( clmVals , null , false ); // 6.2.2.0 (2015/03/27) 218 219 // 7.0.7.0 (2019/12/13) useSLabel 属性を追加。対応方法(概要説明)は、useSLabel=true時には、出しません。 220 if( !useSLabel ) { 221 // 対応方法(概要説明)が存在すれば直下に一行追加する 4.3.4.5 (2009/01/08) 222 // String desc = resource.getDescription( clmVals[2] ); 223 final String desc = resource.getDescription( err ); // 4.3.7.6 (2009/07/15) 224// if( desc != null && desc.length() > 0 ){ 225 // 7.0.7.2 (2020/01/09) メッセージを比較して、同じなら出力しない。 226// if( desc != null && desc.length() > 0 ){ 227 if( desc != null && desc.length() > 0 && !desc.trim().equals( tmpVals3 ) ){ 228 String[] descVals = new String[clmSize]; 229// descVals[3] = desc; 230// descVals[3] = "<pre>" + desc + "</pre>"; // 7.0.7.0 (2019/12/13) pre を付けます。 231 descVals[3] = "<pre>" + desc.trim() + "</pre>"; // 7.0.7.2 (2020/01/09) trim()追加 232 errTable.addColumnValues( descVals , null , false ); // 6.2.2.0 (2015/03/27) 233 } 234 } 235 } 236 237 // ここまでが、DBTableModel の作成。以下は、View での表示 238 239 final ViewForm form = ViewFormFactory.newInstance( "HTMLTable" ); 240 241 form.init( errTable ); 242 if( ! errMsg.isOK() ) { // 正常以外 243 form.setViewClass( "errorView" ); // 6.4.6.1 (2016/06/03) 244 form.setBgColorCycle( -1 * errMsg.getKekka() ); // エラー処理時のゼブラ模様 245 form.setNumberType( "delete" ); // 番号欄を出さない。 246 form.setUseTableSorter( false ); // ソート用リンクは出さない。 247 form.setUseScrollBar( false ); // 4.0.0 (2005/01/31) スクロールバー用のDIV要素を出力しない。 248 } 249 250 return form.create(); 251 } 252 253 /** 254 * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTMLテーブルを作成します。 255 * このメソッドでは、エラーメッセージ及びエラーコードを一覧形式で表示します。 256 * 257 * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。 258 * 259 * @param errMsg ErrorMessageオブジェクト 260 * @param resource リソースマネージャー 261 * 262 * @return HTMLのテーブルタグに変換後の文字列(無ければ、ゼロストリング) 263 * @og.rtnNotNull 264 */ 265 /* default */ static String makeHTMLSimpleErrorList( final ErrorMessage errMsg,final ResourceManager resource ) { 266 return makeHTMLSimpleErrorList( errMsg,resource,false ); // 通常ラベル使用 267 } 268 269 /** 270 * ErrorMessage オブジェクトと、ResourceManager より、表示用 HTMLテーブルを作成します。 271 * このメソッドでは、エラーメッセージ及びエラーコードを一覧形式で表示します。 272 * 273 * @og.rev 6.2.2.0 (2015/03/27) interface に変更タイプ と、書込み許可を追加 274 * @og.rev 7.0.7.0 (2019/12/13) useSLabel 属性を追加。 275 * @og.rev 7.1.0.1 (2020/02/07) ShortLabelの引数対応で、RawShortLabel を使います。 276 * @og.rev 7.2.9.0 (2020/10/12) getRawShortLabel → getShortErrorMsg メソッド名変更 277 * 278 * @param errMsg ErrorMessageオブジェクト 279 * @param resource リソースマネージャー 280 * @param useSLabel SLABEL利用 [true:利用する/false:利用しない] 281 * 282 * @return HTMLのテーブルタグに変換後の文字列(無ければ、ゼロストリング) 283 * @og.rtnNotNull 284 */ 285// /* default */ static String makeHTMLSimpleErrorList( final ErrorMessage errMsg,final ResourceManager resource ) { 286 /* default */ static String makeHTMLSimpleErrorList( final ErrorMessage errMsg,final ResourceManager resource, final boolean useSLabel ) { 287 if( errMsg == null ) { return ""; } 288 289 final String[] names = new String[] { "MESSAGE" }; 290 291 final int clmSize = names.length; 292 293 final DBTableModel errTable = DBTableModelUtil.newDBTable(); 294 errTable.init( clmSize ); 295 296 for( int i=0; i<clmSize; i++ ) { 297 final DBColumn dbColumn = resource.makeDBColumn( names[i] ); 298 errTable.setDBColumn( i,dbColumn ); 299 } 300 301 final ErrMsg[] errMsgs = errMsg.toArray(); 302 Arrays.sort( errMsgs, ERR_COMP ); 303 304 for( int i=0; i<errMsg.size(); i++ ) { 305 final ErrMsg err = errMsgs[i]; 306 String[] clmVals = new String[clmSize]; 307 // 7.0.7.0 (2019/12/13) useSLabel 属性を追加。 308// clmVals[0] = resource.getShortLabel( err.getId() ) + "(" + err.getId() + ")"; 309// clmVals[0] = useSLabel ? resource.getRawShortLabel( err ) : resource.getShortLabel( err.getId() ) + "(" + err.getId() + ")"; 310 311 // 7.1.0.1 (2020/02/07) ShortLabelの引数対応で、RawShortLabel を使います。 312// clmVals[0] = resource.getRawShortLabel( err ); 313 clmVals[0] = resource.getShortErrorMsg( err ); // 7.2.9.0 (2020/10/12) メソッド名変更 314 if( !useSLabel ) { clmVals[0] = clmVals[0] + "(" + err.getId() + ")"; } 315 316 errTable.addColumnValues( clmVals , null , false ); // 6.2.2.0 (2015/03/27) 317 } 318 319 // ここまでが、DBTableModel の作成。以下は、View での表示 320 final ViewForm form = ViewFormFactory.newInstance( "HTMLSimpleList" ); 321 form.init( errTable ); 322 323 if( ! errMsg.isOK() ) { // 正常以外 324 form.setBgColorCycle( -1 * errMsg.getKekka() ); // エラー処理時のゼブラ模様 325 } 326 327 return form.create(); 328 } 329}