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.report2; 017 018// import java.io.File; 019// import java.util.Arrays; // 8.0.0.0 (2021/07/31) Delete 020 021import org.opengion.fukurou.system.ThrowUtil ; // 7.1.0.0 (2020/01/27) 022import org.opengion.fukurou.system.DateSet; // 6.4.2.0 (2016/01/29) 023import org.opengion.fukurou.system.LogWriter; 024import org.opengion.fukurou.system.OgRuntimeException ; // 6.4.2.0 (2016/01/29) 025import org.opengion.fukurou.util.StringUtil; 026import org.opengion.fukurou.util.UnicodeCorrecter; // 5.9.3.3 (2015/12/26) package を、mail → util に移動のため 027import org.opengion.fukurou.db.DBFunctionName; 028import org.opengion.fukurou.db.DBUtil; 029import org.opengion.fukurou.db.ApplicationInfo; 030//import org.opengion.fukurou.mail.MailTX; // 7.4.4.0 (2021/06/30) Delete 031import org.opengion.hayabusa.common.HybsSystem; 032import org.opengion.hayabusa.db.DBTableModel; 033import org.opengion.hayabusa.db.DBTableModelUtil; 034import org.opengion.hayabusa.resource.ResourceFactory; 035import org.opengion.hayabusa.resource.ResourceManager; 036// import static org.opengion.fukurou.system.HybsConst.CR ; // 6.1.0.0 (2014/12/26) 037import static org.opengion.fukurou.system.HybsConst.FS ; // 8.0.3.0 (2021/12/17) 038 039/** 040 * DBからキューを作成するためのクラスです。 041 * キューはGE5xテーブルから作成されます。 042 * 043 * キュー生成時点(処理スレッドにスタックした時点)では、帳票データのテーブルモデルは作成されません。 044 * 帳票データは、各スレッドからset()メソッドを呼び出したタイミングで生成されます。 045 * 046 * 処理開始及び、完了のステータスは、GE50の完成フラグに更新されます。 047 * また、エラー発生時のメッセージは、GE56に更新されます。 048 * 049 * @og.group 帳票システム 050 * 051 * @version 4.0 052 * @author Hiroki.Nakamura 053 * @since JDK1.6 054 */ 055public final class QueueManager_DB implements QueueManager { 056 057 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 058 private static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 059 060 private static final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 061 062 /** 4.3.7.0 (2009/06/01) HSQLDB対応 */ 063 // 5.1.4.0 (2010/03/01) データベース名 でなく、DBID名で検索するように変更します。 064 private static final String CON = DBFunctionName.getFunctionName( "CON", null ); 065 066// // 5.2.0.0 (2010/09/01) Ver4互換モード対応 067// // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止 068// private static final String OUT_FILE = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTFILE" : "OUT_FILE"; 069// private static final String OUT_DIR = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTDIR" : "OUT_DIR"; 070 071 /** 4.3.3.6 (2008/11/15) マルチサーバ対応追加(GE12から処理対象デーモングループ取得) */ 072 // 4.3.7.0 (2009/06/01) HSQLDB対応 073 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 074 // 5.4.2.0 (2011/12/26) PRTID,PRGDIR,PRGFILE取得 075 // 5.9.2.2 (2015/11/20) GROUPID追加 076 // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止 077 // 5.10.0.0 (2018/06/08) FGNOML(メール不要フラグ)を追加 078 // 7.4.4.0 (2021/06/30) openGionV8事前準備(GE54.FGNOML廃止) 079 // 8.0.1.0 (2021/10/29) 未使用のGE54_TRIGを廃止(HSQL,FSQL,BSQL廃止) 080 private static final String SQL_SELECT_GE50 = 081// "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A."+OUT_DIR+", A."+OUT_FILE+", A.PDF_PASSWD" 082 "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A.OUT_DIR, A.OUT_FILE, A.PDF_PASSWD" 083 + ", B.LANG, B.FGRUN, B.DMN_GRP " 084// + ", C.MODELDIR, C.MODELFILE, D.PRTNM, C.FGLOCAL, C.FGCUT, C.BSQL, C.HSQL, C.FSQL " // 8.0.1.0 (2021/10/29) Modify 085 + ", C.MODELDIR, C.MODELFILE, D.PRTNM, C.FGLOCAL, C.FGCUT " 086 // + " ,B.PRTID, B.PRGDIR, B.PRGFILE " // 8.0.3.0 (2021/12/17) 087 // + " ,A.GROUPID " // 5.9.2.2 (2015/11/20) 088// + " ,C.FGNOML " // 5.10.0.0 (2018/06/08) 089 // + " , '0' as FGNOML " // 5.10.0.0 (2018/06/08) , 6.9.8.1 (2018/06/11) 互換性の関係で、とりあえず、'0' を設定 7.4.4.0 (2021/06/30) Delete 090 + "FROM GE50 A " 091 + "INNER JOIN GE53 B " 092 + "ON A.SYSTEM_ID = B.SYSTEM_ID AND A.JOKEN = B.JOKEN " 093 + "INNER JOIN GE54 C " 094 + "ON A.SYSTEM_ID = C.SYSTEM_ID AND A.LISTID = C.LISTID " 095 + "LEFT OUTER JOIN GE55 D " 096 + "ON B.SYSTEM_ID = D.SYSTEM_ID AND B.PRTID = D.PRTID " 097 + "WHERE A.FGKAN='1' " 098 + "AND EXISTS ( SELECT 'X' FROM GE12 E " 099 + "WHERE E.FGJ ='1' " 100 + "AND E.SYSTEM_ID = '" + HybsSystem.sys( "SYSTEM_ID" ) + "' " 101 + "AND E.CONTXT_PATH = '" + HybsSystem.sys( "HOST_URL" ) + "' " 102 + "AND E.PARAM_ID LIKE 'REPORT2_HANDLE_DAEMON_%' " 103 + "AND E.PARAM = 'RUN_'" + CON + "A.SYSTEM_ID" + CON + "'_'" + CON + "B.DMN_GRP" 104 + ") " 105 + "ORDER BY " + HybsSystem.sys( "REPORT_DAEMON_ORDER_BY" ); 106 107 /** 5.1.2.0 (2010/01/01) ページ数、データ数をGE50に更新する。 */ 108 private static final String SQL_UPDATE_GE50 = 109 "UPDATE GE50 SET FGKAN=?,DMN_NAME=?,DMN_HOST=?,SUDATA=?,SUPAGE=?,DYUPD=? WHERE SYSTEM_ID=? AND YKNO=?"; 110 111 /** 7.1.0.0 (2020/01/27) GE50のUPDATEでエラー時に、最小限の情報のみ更新する。 */ 112 private static final String SQL_UPDATE_GE50_ERR = 113 "UPDATE GE50 SET FGKAN=?,DYUPD=? WHERE SYSTEM_ID=? AND YKNO=?"; 114 115 private static final String SQL_INSERT_GE56 = 116 "INSERT INTO GE56 ( FGJ,SYSTEM_ID,YKNO,ERRMSG,DYSET,DYUPD,USRSET,USRUPD,PGUPD ) " 117 + " VALUES ( '1',?,?,?,?,?,?,?,? )"; 118 119 private static final int STATUS_COMPLETE = 2; // 済 120 private static final int STATUS_EXECUTE = 3; // 実行中 121 private static final int STATUS_ERROR = 8; // アプリエラー 122 123// private static QueueManager manager = new QueueManager_DB(); 124 private static final QueueManager MANAGER = new QueueManager_DB(); 125 126 /** アプリケーション情報 */ 127 private static final ApplicationInfo APP_INFO; // 6.4.1.1 (2016/01/16) appInfo → APP_INFO refactoring 128 static { 129 if( USE_DB_APPLICATION_INFO ) { 130 APP_INFO = new ApplicationInfo(); 131 // ユーザーID,IPアドレス,ホスト名 132 APP_INFO.setClientInfo( "ReportDaemon", HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME ); 133 // 画面ID,操作,プログラムID 134 APP_INFO.setModuleInfo( "ReportDaemon", "QueueManager", "QueueManager" ); 135 } 136 else { 137 APP_INFO = null; 138 } 139 } 140 141 /** 142 * インスタンスの生成を禁止します。 143 */ 144 private QueueManager_DB() {} 145 146 /** 147 * インスタンスを返します。 148 * 149 * @return 帳票処理キューの管理マネージャ 150 */ 151 public static QueueManager getInstance() { 152// return manager; 153 return MANAGER; 154 } 155 156 /** 157 * 帳票処理キューを作成します。 158 * 159 * @og.rev 4.3.0.0 (2008/07/15) スレッドIDにシステムIDを付加します。 160 * @og.rev 5.1.2.0 (2010/01/01) HSQL,FSQL,BSQLのセットを廃止します。(このクラス内でデータを直接分割) 161 * @og.rev 5.4.3.0 (2011/12/26) PRTIDの取得 162 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 163 * @og.rev 6.3.9.0 (2015/11/06) Use block level rather than method level synchronization.(PMD) 164 * @og.rev 5.9.2.2 (2015/11/20) GrpId,DmnGrp 追加 165 * @og.rev 5.10.0.0 (2018/06/08) FGNOML対応 166 * @og.rev 5.10.9.2 (2019/03/15) 5.10.9.0の対応修正 167 * @og.rev 7.4.4.0 (2021/06/30) openGionV8事前準備(GE54.FGNOML廃止) 168 * @og.rev 8.0.1.0 (2021/10/29) 未使用のGE54_TRIGを廃止(HSQL,FSQL,BSQL廃止) 169 */ 170 @Override // QueueManager 171 public void create() { 172 // キューをスタックするまでの例外は、ScheduleTagでcatchされデーモンがスリープする。 173// final String[][] ge50vals = DBUtil.dbExecute( SQL_SELECT_GE50, new String[0], APP_INFO, DBID ); // 5.5.5.1 (2012/08/07) 174 final String[][] ge50vals = DBUtil.dbExecute( SQL_SELECT_GE50, null, APP_INFO, DBID ); // 8.0.3.0 (2021/12/17) 175 176 // 6.3.9.0 (2015/11/06) 元々のsynchronizedの必要性が分からないが、帳票なのでとりあえず入れておきます。 177 synchronized( ge50vals ) { 178// for( int i=0; i<ge50vals.length; i++ ) { 179 for( final String[] ge50row : ge50vals ) { 180 final ExecQueue queue = new ExecQueue(); 181 queue.setSystemId( ge50row[0] ); // [0]:SYSTEM_ID 182 queue.setYkno( ge50row[1] ); // [1]:YKNO 183 queue.setListId( ge50row[2] ); // [2]:LISTID 184 // [3]:OUT_DIR [4]:OUT_FILE [7]:FGRUN [1]:YKNO 185 queue.setOutputName( HybsSystem.url2absPath(ge50row[3]),ge50row[4],ge50row[7],ge50row[1]); // 5.10.9.2 (2019/03/15) 186 queue.setPdfPasswd( ge50row[5] ); // [5]:PDF_PASSWD 187 queue.setLang( ge50row[6] ); // [6]:LANG 188 queue.setOutputType(ge50row[7] ); // [7]:FGRUN 189 // [0]:SYSTEM_ID [8]:DMN_GRP 190 queue.setThreadId( ge50row[0] + "_" + StringUtil.nval( ge50row[8] , "_DEFALUT_" ) ); // 4.3.0.0 (2008/07/15) 191 // [9]:MODELDIR [10]:MODELFILE 192 queue.setTemplateName( HybsSystem.url2absPath( ge50row[9] ) + FS + ge50row[10]); // 8.0.3.0 (2021/12/17) 193 queue.setPrinterName( ge50row[11] ); // [11]:PRTNM 194 queue.setFglocal( "1".equals( ge50row[12] ) ); // [12]:FGLOCAL 195 queue.setFgcut( "1".equals( ge50row[13] ) ); // [13]:FGCUT 196 197// queue.setSystemId( ge50vals[i][0] ); // [0]:SYSTEM_ID 198// queue.setYkno( ge50vals[i][1] ); // [1]:YKNO 199// queue.setListId( ge50vals[i][2] ); // [2]:LISTID 200// // [3]:OUT_DIR [4]:OUT_FILE [7]:FGRUN [1]:YKNO 201// queue.setOutputName( HybsSystem.url2absPath(ge50vals[i][3]),ge50vals[i][4],ge50vals[i][7],ge50vals[i][1]); // 5.10.9.2 (2019/03/15) 202// queue.setPdfPasswd( ge50vals[i][5] ); // [5]:PDF_PASSWD 203// queue.setLang( ge50vals[i][6] ); // [6]:LANG 204// queue.setOutputType(ge50vals[i][7] ); // [7]:FGRUN 205// // [0]:SYSTEM_ID [8]:DMN_GRP 206// queue.setThreadId( ge50vals[i][0] + "_" + StringUtil.nval( ge50vals[i][8] , "_DEFALUT_" ) ); // 4.3.0.0 (2008/07/15) 207// // [9]:MODELDIR [10]:MODELFILE 208// queue.setTemplateName( HybsSystem.url2absPath( ge50vals[i][9] ) + FS + ge50vals[i][10]); // 8.0.3.0 (2021/12/17) 209// queue.setPrinterName( ge50vals[i][11] ); // [11]:PRTNM 210// queue.setFglocal( "1".equals( ge50vals[i][12] ) ); // [12]:FGLOCAL 211// queue.setFgcut( "1".equals( ge50vals[i][13] ) ); // [13]:FGCUT 212 213// queue.setPrtId( ge50vals[i][17] ); // 5.4.3.0 8.0.1.0 (2021/10/29) Modify 214 // queue.setPrtId( ge50vals[i][14] ); // 8.0.3.0 (2021/12/17) Delete 215// queue.setPrgDir( ge50vals[i][18] ); // 5.4.3.0 8.0.1.0 (2021/10/29) Modify 216 // queue.setPrgDir( ge50vals[i][15] ); // 8.0.3.0 (2021/12/17) Delete 217// queue.setPrgFile( ge50vals[i][19] ); // 5.4.3.0 8.0.1.0 (2021/10/29) Modify 218 // queue.setPrgFile( ge50vals[i][16] ); // 8.0.3.0 (2021/12/17) Delete 219 220// queue.setGrpId( ge50vals[i][20] ); // 5.9.2.2 (2015/11/20) 8.0.1.0 (2021/10/29) Modify 221 // queue.setGrpId( ge50vals[i][17] ); // 8.0.3.0 (2021/12/17) Delete 222 // queue.setDmnGrp( ge50vals[i][8] ); // 5.9.2.2 (2015/11/20) 8.0.3.0 (2021/12/17) Delete 223 // queue.setFgnoml( ge50vals[i][21] ); // 5.10.0.0 (2018/06/08) 7.4.4.0 (2021/06/30) Delete 224 225 queue.setManager( this ); 226 227 ExecThreadManager.insertQueue( queue ); 228 } 229 } 230 } 231 232 /** 233 * 帳票処理データをキューにセットします。 234 * 235 * @og.rev 5.1.2.0 (2010/01/01) HSQL,FSQL,BSQLのセットを廃止します。(このクラス内でデータを直接分割) 236 * 237 * @param queue ExecQueueオブジェクト 238 */ 239 @Override // QueueManager 240 public void set( final ExecQueue queue ) { 241 final String systemId = queue.getSystemId(); 242 final String lang = queue.getLang(); 243 final String listId = queue.getListId(); 244 final String ykno = queue.getYkno(); 245 246 ResourceManager resource = null; 247 if( queue.isFglocal() ) { 248 resource = ResourceFactory.newInstance( systemId, lang, false ); 249 } 250 else { 251 resource = ResourceFactory.newInstance( lang ); 252 } 253 254 // ヘッダー情報の取得 255 final DBTableModel header = new DBTableModelCreator( systemId, listId, ykno, "H", resource ).getTable(); 256 if( header != null && header.getRowCount() > 0 ) { 257 queue.setHeader( header ); 258 } 259 260 // フッター情報の取得 261 final DBTableModel footer = new DBTableModelCreator( systemId, listId, ykno, "F", resource ).getTable(); 262 if( footer != null && footer.getRowCount() > 0 ) { 263 queue.setFooter( footer ); 264 } 265 266 // ボディー情報の取得 (8.0.3.0 (2021/12/17)) 267// final DBTableModel body = new DBTableModelCreator( systemId, listId, ykno, "B", resource ).getTable(); 268 final DBTableModelCreator creator = new DBTableModelCreator( systemId, listId, ykno, "B", resource ); 269 final DBTableModel body = creator.getTable(); 270 // レイアウトテーブルがないと固定長を分割するSQL文が設定されず、DBTableModelがnullになる 271 if( body == null ) { 272// queue.addMsg( "[ERROR] DBTableModel doesn't exists! maybe Layout-Table(GE52) is not configured..." + CR ); 273 queue.addMsg( "[ERROR]QM;DBTableModel doesn't exists! maybe Layout-Table(GE52) or Report-Data(GE51) is not configured..." ); // 5.10.19.0 (2019/12/27) 274 queue.setError(); 275 throw new OgRuntimeException(); 276 } 277 if( body.getRowCount() <= 0 ) { 278 queue.addMsg( "[ERROR]QM;Database Body row count is Zero." + ykno ); 279 queue.setError(); 280 throw new OgRuntimeException(); 281 } 282 if( body.isOverflow() ) { 283 queue.addMsg( "[ERROR]QM;Database is Overflow. [" + body.getRowCount() + "]" ); 284 queue.addMsg( "[ERROR]QM;Check SystemParameter Data in DB_MAX_ROW_COUNT Overflow" ); 285 queue.setError(); 286 throw new OgRuntimeException(); 287 } 288 queue.setBody( body ); 289 queue.setBodyTypes( creator.getBodyTypes() ); // 8.0.3.0 (2021/12/17) 290 } 291 292 /** 293 * キューを実行中の状態に更新します。 294 * 295 * @param queue ExecQueueオブジェクト 296 */ 297 @Override // QueueManager 298 public void execute( final ExecQueue queue ) { 299 status( queue, STATUS_EXECUTE ); 300 } 301 302 /** 303 * キューを完了済の状態に更新します。 304 * 305 * @param queue ExecQueueオブジェクト 306 */ 307 @Override // QueueManager 308 public void complete( final ExecQueue queue ) { 309 status( queue, STATUS_COMPLETE ); 310 } 311 312 /** 313 * キューをエラーの状態に更新します。 314 * 315 * @param queue ExecQueueオブジェクト 316 */ 317 @Override // QueueManager 318 public void error( final ExecQueue queue ) { 319 status( queue, STATUS_ERROR ); 320 insertErrorMsg( queue ); 321 } 322 323 /** 324 * GE50の状況Cを更新します。 325 * 326 * @og.rev 4.2.4.1 (2008/07/09) 更新日時をセット 327 * @og.rev 5.1.2.0 (2010/01/01) 行数、ページ数も更新する 328 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 329 * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。 330 * @og.rev 7.1.0.0 (2020/01/27) ここでDB登録エラーが発生すると実行中のまま止まるので、エラー処理を入れます。 331 * 332 * @param queue ExecQueueオブジェクト 333 * @param status 状況C 334 */ 335 private void status( final ExecQueue queue, final int status ) { 336 337 final String dyupd = DateSet.getDate( "yyyyMMddHHmmss" ) ; // 6.4.2.0 (2016/01/29) 338 339 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseShortArrayInitializer 340// final String[] args = new String[] { 341 final String[] args = { 342 String.valueOf( status ) // FGKAN 343 , queue.getThreadId() // DMN_NAME 344 , HybsSystem.sys( "HOST_NAME" ) // DMN_HOST 345 , String.valueOf( queue.getExecRowCnt() ) // SUDATA 346 , String.valueOf( queue.getExecPagesCnt() ) // SUPAGE 347 , dyupd // DYUPD 348 , queue.getSystemId() // SYSTEM_ID 349 , queue.getYkno() // YKNO 350 }; 351 352 // 7.1.0.0 (2020/01/27) ここでDB登録エラーが発生すると実行中のまま止まるので、エラー処理を入れます。 353 try { 354 DBUtil.dbExecute( SQL_UPDATE_GE50, args, APP_INFO, DBID ); // 5.5.5.1 (2012/08/07) 355 } 356 catch( final Throwable th ) { 357 final String errMsg = "状況Cを更新時にエラーが発生しました。"; 358 queue.addMsg( errMsg ); 359 queue.addMsg( ThrowUtil.ogStackTrace( th ) ); 360 LogWriter.log( errMsg ); 361 LogWriter.log( th ); 362 363 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseShortArrayInitializer 364// final String[] args2 = new String[] { 365 final String[] args2 = { 366 String.valueOf( STATUS_ERROR ) // FGKAN 367 , dyupd // DYUPD 368 , queue.getSystemId() // SYSTEM_ID 369 , queue.getYkno() // YKNO 370 }; 371 372 DBUtil.dbExecute( SQL_UPDATE_GE50_ERR, args2, APP_INFO, DBID ); 373 374 if( status != STATUS_ERROR ) { 375 insertErrorMsg( queue ); // エラー時以外は、エラーテーブルに書き込む。 376 } 377 } 378 } 379 380 /** 381 * GE56にエラーメッセージを出力します。 382 * 383 * @og.rev 4.4.0.1 (2009/08/08) エラーメッセージ機能追加 384 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 385 * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。 386 * @og.rev 5.10.0.0 (2018/06/08) メール送信条件を追加 387 * @og.rev 6.9.8.1 (2018/06/11) 帳票エラーメールの改修(メール不要フラグ=trueで不要、falseが必要) 388 * @og.rev 7.4.4.0 (2021/06/30) openGionV8事前準備(GE54.FGNOML廃止) 389 * 390 * @param queue ExecQueueオブジェクト 391 */ 392 private void insertErrorMsg( final ExecQueue queue ) { 393 String errmsg = queue.getMsg(); 394 if( errmsg.length() > 1300 ) { 395 errmsg = errmsg.substring( errmsg.length() - 1300, errmsg.length() ); 396 } 397 398 final String dyset = DateSet.getDate( "yyyyMMddHHmmss" ) ; // 6.4.2.0 (2016/01/29) 399 400 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseShortArrayInitializer 401// final String[] args = new String[]{ queue.getSystemId(), queue.getYkno(), errmsg 402 final String[] args = { 403 queue.getSystemId(), queue.getYkno(), errmsg 404 , dyset, dyset, "UNKNOWN", "UNKNOWN", "UNKNOWN" 405 }; 406 407 DBUtil.dbExecute( SQL_INSERT_GE56, args, APP_INFO, DBID ); // 5.5.5.1 (2012/08/07) 408 409// sendMail( queue, errmsg ); // 4.4.0.1 (2009/08/08) 410 // 5.10.0.0 (2018/06/08) メール送信条件を追加 411// if(!"1".equals(queue.getFgnoml())){ 412 // 7.4.4.0 (2021/06/30) Delete 413 // if( ! queue.isFgnoml() ) { // 6.9.8.1 (2018/06/11) 414 // sendMail( queue, errmsg ); // 4.4.0.1 (2009/08/08) 415 // } 416 } 417 418 // /** 419 // * エラー情報のメール送信を行います。 420 // * エラーメールは、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と 421 // * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者) 422 // * がすべて設定されている場合に、送信されます。 423 // * 424 // * @og.rev 4.4.0.1 (2009/08/08) 追加 425 // * @og.rev 5.7.0.4 (2013/11/29) listIdの絞込み 426 // * @og.rev 7.4.4.0 (2021/06/30) openGionV8事前準備(GE54.FGNOML廃止) 427 // * 428 // * @param queue ExecQueueオブジェクト 429 // * @param inErrMsg エラーメッセージ 430 // */ 431 // private void sendMail( final ExecQueue queue, final String inErrMsg ) { 432 433 // final String host = HybsSystem.sys( "COMMON_MAIL_SERVER" ); 434 // final String from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" ); 435 // final String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) ); 436 // final String match_txt = HybsSystem.sys( "REPORT_ERRMAIL_REGEX" ); // 5.7.0.4 (2013/11/29) 437 // if( host != null && from != null && to.length > 0 ) { 438 // if( match_txt == null || match_txt.isEmpty() 439 // || queue.getListId() == null || queue.getListId().isEmpty() 440 // || queue.getListId().matches( match_txt )){ // 5.7.0.4 (2013/11/29) 441 // // 5.7.0.4 (2013/11/29) listid追加 442 // final String subject = "SYSTEM_ID=[" + queue.getSystemId() + "] , YKNO=[" + queue.getYkno() + "] , " 443 // + "THREAD_ID=[" + queue.getThreadId() + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]" 444 // + "LISTID=["+ queue.getListId() + "]"; 445 // try { 446 // final MailTX tx = new MailTX( host ); 447 // tx.setFrom( from ); 448 // tx.setTo( to ); 449 // tx.setSubject( "帳票エラー:" + subject ); 450 // tx.setMessage( inErrMsg ); 451 // tx.sendmail(); 452 // } 453 // catch( final Throwable ex ) { 454 // final String errMsg = "エラー時メール送信に失敗しました。" + CR 455 // + " SUBJECT:" + subject + CR 456 // + " HOST:" + host + CR 457 // + " FROM:" + from + CR 458 // + " TO:" + Arrays.toString( to ) + CR 459 // + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 460 // LogWriter.log( errMsg ); 461 // LogWriter.log( ex ); 462 // } 463 // } 464 // } 465 // } 466 467 /** 468 * 帳票明細データを帳票レイアウトテーブルに従って分割し、その結果をDBTableModelとして 469 * 生成します。 470 * データの分割は、バイト数ベースで行われるため、エンコードを正しく指定する必要があります。 471 * エンコード指定は、システムリソースのDB_ENCODEで指定します。 472 * 473 * レイアウトテーブルが存在しない場合、又は、帳票データが存在しない場合、DBTableModelは 474 * nullで返されます。 475 * 476 * @og.rev 6.9.0.2 (2018/02/13) GE51の検索順(order by)を追加します。 477 * @og.rev 8.0.3.0 (2021/12/17) create()とgetTable()を一体化する。 478 */ 479 public static final class DBTableModelCreator { 480// // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止 481// // 5.2.0.0 (2010/09/01) Ver4互換モード対応 482// private static final String CLM = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "COLUMN_NAME" : "CLM"; 483// private static final String TEXT_DATA = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "TEXT" : "TEXT_DATA"; 484 485 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 486 // 5.4.4.3 (2012/02/09) FGUSE条件追加対応 487 // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止 488 private static final String SQL_SELECT_GE52 = 489// " select " + CLM + ", START_POS, USE_LENGTH" 490 " select CLM, START_POS, USE_LENGTH" 491 + " from GE52" 492 + " where SYSTEM_ID = ?" 493 + " and LISTID = ?" 494 + " and KBTEXT = ?" // ※ GE52の KBTEXT は、like検索しない。 495 + " and FGJ = '1'" 496 + " and FGUSE = '1'" // 5.4.4.3 497 + " order by SEQ"; 498 499 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 500 // 6.9.0.2 (2018/02/13) GE51の検索順(order by)を追加します。 501 // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止 502 private static final String SQL_SELECT_GE51 = 503// " select " + TEXT_DATA 504 " select KBTEXT,TEXT_DATA" 505 + " from GE51" 506 + " where SYSTEM_ID = ?" 507 + " and YKNO = ?" 508// + " and KBTEXT = ?" 509 + " and KBTEXT like ? || '%'" // 8.0.3.0 (2021/12/17) B+数値を検索する 510 + " and FGJ = '1'" 511 + " order by SYSTEM_ID,YKNO,EDNO" ; // 6.9.0.2 (2018/02/13) 512 513 private static final String ENCODE = HybsSystem.sys( "DB_ENCODE" ); 514 515 private String[] kbtxt ; // 8.0.3.0 (2021/12/17) 516 517 private final String systemId; 518 private final String listId; 519 private final String ykno; 520 private final String kbtext; 521 private final ResourceManager resource; 522 523// private DBTableModel table ; 524 525 /** 526 * コンストラクタです。 527 * 528 * @param sid システムID 529 * @param lid 帳票ID 530 * @param yk 要求NO 531 * @param kt テキスト区分(H:ヘッダー F:フッター B:ボディー) 532 * @param res リソースマネージャー 533 */ 534 public DBTableModelCreator( final String sid, final String lid, final String yk, final String kt, final ResourceManager res ) { 535 systemId = sid; 536 listId = lid; 537 ykno = yk; 538 kbtext = kt; 539 resource = res; 540// create(); 541 } 542 543 /** 544 * 帳票データをレイアウト定義に従い分割しDBTableModelを返します。 545 * 546 * @og.rev 8.0.3.0 (2021/12/17) create()とgetTable()を一体化する。 547 * 548 * @return 分割後のDBTableModel 549 */ 550// private void create() { 551 public DBTableModel getTable() { 552 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseShortArrayInitializer 553// final String[] ge52Where = new String[] { systemId, listId, kbtext } ; 554 final String[] ge52Where = { systemId, listId, kbtext } ; 555 final String[][] ge52Vals = DBUtil.dbExecute( SQL_SELECT_GE52, ge52Where, APP_INFO, DBID ); // 5.5.5.1 (2012/08/07) 556 if( ge52Vals == null || ge52Vals.length == 0 ) { 557 return null; 558 } 559 560 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseShortArrayInitializer 561// final String[] ge51Where = new String[] { systemId, ykno, kbtext } ; 562 final String[] ge51Where = { systemId, ykno, kbtext } ; 563 final String[][] ge51Vals = DBUtil.dbExecute( SQL_SELECT_GE51, ge51Where, APP_INFO, DBID ); // 5.5.5.1 (2012/08/07) 564 if( ge51Vals == null || ge51Vals.length == 0 ) { 565 return null; 566 } 567 568 final String[] clms = new String[ge52Vals.length]; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LocalVariableCouldBeFinal 569 for( int j=0; j<ge52Vals.length; j++ ) { 570 clms[j] = ge52Vals[j][0]; // [0]:CLM 571 } 572 573 final String[][] vals = new String[ge51Vals.length][ge52Vals.length]; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LocalVariableCouldBeFinal 574 kbtxt = new String[ge51Vals.length]; 575 for( int i=0; i<ge51Vals.length; i++ ) { 576 kbtxt[i] = ge51Vals[i][0]; // [0]:KBTEXT 8.0.3.0 (2021/12/17) 577 // [1]:TEXT_DATA 578 final byte[] bytes = StringUtil.makeByte( UnicodeCorrecter.correctToCP932( ge51Vals[i][1], ENCODE ), ENCODE ); // 5.9.3.1 (2015/12/18) 579 // [0]:CLM, [1]:START_POS, [2]:USE_LENGTH 580 for( int j=0; j<ge52Vals.length; j++ ) { 581 final int strpos = Integer.parseInt( ge52Vals[j][1] ) - 1; // [1]:START_POS 582 int len = Integer.parseInt( ge52Vals[j][2] ); // [2]:USE_LENGTH 583 if( strpos >= bytes.length ) { 584 vals[i][j] = ""; 585 } 586 else { 587 if( strpos + len > bytes.length ) { 588 len = bytes.length - strpos; 589 } 590 vals[i][j] = StringUtil.rTrim( StringUtil.makeString( bytes, strpos, len, ENCODE ) ); 591 } 592 } 593 } 594// table = DBTableModelUtil.makeDBTable( clms, vals, resource ); 595 return DBTableModelUtil.makeDBTable( clms, vals, resource ); 596 } 597 598 /** 599 * GE51のKBTEXT配列を返します。 600 * 601 * @og.rev 8.0.3.0 (2021/12/17) KBTEXT配列を返します。 602 * 603 * @return GE51のKBTEXT配列 604 */ 605 public String[] getBodyTypes() { 606 return kbtxt; 607 } 608 609// /** 610// * 分割後のDBTableModelを返します。 611// * 612// * @og.rev 8.0.3.0 (2021/12/17) create()とgetTable()を一体化する。 613// * 614// * @return 分割後のDBTableModel 615// */ 616// public DBTableModel getTable() { 617// return table; 618// } 619 } 620}