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.report; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.fukurou.util.LogWriter; 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.fukurou.util.ApplicationInfo; 022import org.opengion.fukurou.db.DBUtil; 023import org.opengion.fukurou.mail.MailTX ; 024 025import java.util.Arrays; 026 027/** 028 * 帳票要求テーブル(GE50)と、エラーテーブル(GE56)に対して、データ書込みを行います。 029 * 030 * このクラスでは、4つの機能を実装しています。 031 * 032 * ●要求番号採番機能: makeYkno() 033 * 新たな要求番号を採番します(シーケンスより取得) 034 * 採番後、内部の要求番号(ykno)もこの値に再セットされます。 035 * ●帳票要求テーブルデータセット機能: insertGE50( final String fgkan ) 036 * 内部変数にセットされている値を利用して、データ登録を行います。 037 * 繰返し登録したい場合は、変更する値のみを、内部変数にセットしてから、 038 * このメソッドを呼び出してください。 039 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 040 * ●完成フラグ設定機能: updateGE50( final String fgkan ) 041 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 042 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 043 * ●エラーメッセージ登録機能: insertErrorGE56( final String inErrMsg ) 044 * エラー発生時に、エラーメッセージを登録します。 045 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 046 * なお、このメソッドは、要求テーブルの完成フラグは、なにもしませんので、 047 * 完成フラグ設定機能と併用してください。 048 * また、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と 049 * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者) 050 * がすべて設定されている場合に、エラー情報のメール送信を行います。 051 * 052 * @og.rev 3.8.0.0 (2005/06/07) 新規追加 053 * @og.group 帳票システム 054 * 055 * @version 4.0 056 * @author Kazuhiko Hasegawa 057 * @since JDK5.0, 058 */ 059public class GE50Access { 060 /** 完成フラグのフラグ定義(登録) {@value} */ 061 public static final String FG_SET = "1"; // 登録 062 /** 完成フラグのフラグ定義(済み) {@value} */ 063 public static final String FG_OK = "2"; // 済み 064 /** 完成フラグのフラグ定義(実行中) {@value} */ 065 public static final String FG_RUN = "3"; // 実行中 066 /** 完成フラグのフラグ定義(手動) {@value} */ 067 public static final String FG_HAND = "4"; // 手動 068 /** 完成フラグのフラグ定義(印刷待ち) {@value} */ 069 public static final String FG_WAIT = "5"; // 印刷待ち 070 /** 完成フラグのフラグ定義(取込済) {@value} */ 071 public static final String FG_DBIN = "6"; // 取込済 Ver 3.8.0.0 072 /** 完成フラグのフラグ定義(デーモンエラー) {@value} */ 073 public static final String FG_ERR1 = "7"; // デーモンエラー 074 /** 完成フラグのフラグ定義(アプリエラー) {@value} */ 075 public static final String FG_ERR2 = "8"; // アプリエラー 076 077 // GE50 の要求番号のシーケンスを取得します。 078 private static final String GE50_SEQ = "SELECT GE50_SEQUENCE.NEXTVAL FROM DUAL" ; 079 080 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 081 private static final String OUT_FILE = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTFILE" : "OUT_FILE"; 082 private static final String OUT_DIR = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTDIR" : "OUT_DIR"; 083 084 // GE50 に要求データを設定します。 085 // 5.0.3.0 (2009/11/04) OUTFILE ⇒ OUT_FILE , OUTDIR ⇒ OUT_DIR 086 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 087 private static final String GE50_INSERT = 088 "INSERT INTO GE50" + 089// " (SYSTEM_ID,YKNO,LISTID,JOKEN,FGKAN,OUT_DIR,OUT_FILE,COMMENTS," + 090 " (SYSTEM_ID,YKNO,LISTID,JOKEN,FGKAN,"+OUT_DIR+","+OUT_FILE+",COMMENTS," + 091 " FGJ,DYSET,DYUPD,USRSET,USRUPD,PGUPD,DMN_NAME,DMN_HOST )" + 092 " VALUES" + 093 " (?,?,?,?,?,?,?,SUBSTRB(?,1,100)," + 094 " '1',?,?,?,?,?,?,? )" ; 095 096 // GE50 の完成フラグを設定するSQL文です。 097 // 3.8.0.4 (2005/08/08) PGUPD も更新するように変更 098 private static final String GE50_UPDATE = 099 "UPDATE GE50 SET FGKAN = ? , DYUPD = ? , DMN_NAME = ? , DMN_HOST = ? " + 100 " WHERE FGJ = '1'" + 101 " AND SYSTEM_ID = ?" + 102 " AND YKNO = ?" ; 103 104 // GE56 のエラー情報を書き込むためのSQL文です。 105 private static final String GE56_ERRMSG = 106 "INSERT INTO GE56" + 107 " ( FGJ,SYSTEM_ID,YKNO,ERRMSG,DYSET,DYUPD,USRSET,USRUPD,PGUPD )" + 108 " VALUES ( '1',? ,? ,? ,? ,? ,? ,? ,? )" ; 109 110 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 111 public static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 112 113 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 114 private final ApplicationInfo appInfo; 115 private final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 116 117 private final String USRSET ; 118 private final String PGUPD ; 119 private final String DMN_NAME ; // 3.8.5.0 (2006/03/02) 120 121 private String systemId = null; 122 private String ykno = null; 123 private String listid = null; 124 private String joken = null; 125 private String outdir = null; 126 private String outfile = null; 127 private String comments = null; 128 129 /** 130 * ユーザーとプログラムIDを指定して、オブジェクトを構築します。 131 * このオブジェクトを構築した時刻を、DYSET、DYUPD にセットします。 132 * つまり、このオブジェクトで登録する一連のデータは、すべて同一時刻での登録になります。 133 * 134 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 135 * 136 * @param usrset ユーザー 137 * @param prgupd プログラムID 138 * @param dmnName 更新デーモン名 139 */ 140 public GE50Access( final String usrset, final String prgupd ,final String dmnName) { 141 USRSET = substr( usrset, 10, "UNNONE" ) ; 142 PGUPD = substr( prgupd, 10, "UNNONE" ) ; 143 DMN_NAME = substr( dmnName,50, "UNNONE" ) ; 144 145 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 146 if( USE_DB_APPLICATION_INFO ) { 147 appInfo = new ApplicationInfo(); 148 // ユーザーID,IPアドレス,ホスト名 149 appInfo.setClientInfo( USRSET,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 150 // 画面ID,操作,プログラムID 151 appInfo.setModuleInfo( "GE50Access",null,DMN_NAME ); 152 } 153 else { 154 appInfo = null; 155 } 156 } 157 158 /** 159 * systemId をセットします。 160 * 161 * @param systemId システムID 162 */ 163 public void setSystemId ( final String systemId ) { this.systemId = systemId; } 164 165 /** 166 * systemId を取得します。 167 * 168 * @return システムID 169 */ 170 public String getSystemId() { return systemId; } 171 172 /** 173 * listid をセットします。 174 * 175 * @param listid 帳票ID 176 */ 177 public void setListId( final String listid ) { this.listid = listid; } 178 179 /** 180 * joken をセットします。 181 * 182 * @param joken 振分条件 183 */ 184 public void setJoken( final String joken ) { this.joken = joken; } 185 186 /** 187 * outdir をセットします。 188 * 189 * @param outdir 出力DIR 190 */ 191 public void setOutDir( final String outdir ) { this.outdir = outdir; } 192 193 /** 194 * outfile をセットします。 195 * 196 * @param outfile 出力ファイル 197 */ 198 public void setOutFile( final String outfile ) { this.outfile = outfile; } 199 200 /** 201 * comments をセットします。 202 * 203 * @param comments コメント 204 */ 205 public void setComments( final String comments ) { this.comments = comments; } 206 207 /** 208 * ykno をセットします。 209 * 210 * @param ykno 要求番号 211 */ 212 public void setYkno( final String ykno ) { this.ykno = ykno; } 213 214 /** 215 * ykno を取得します。 216 * 217 * @return 要求番号 218 */ 219 public String getYkno() { return ykno; } 220 221 /** 222 * 新たな要求番号を採番します(シーケンスより取得) 223 * 採番後、内部の要求番号(ykno)もこの値に再セットされます。 224 * 225 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 226 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 227 * 228 * @return 要求番号 229 */ 230 public String makeYkno() { 231 try { 232// String[][] vals = DBUtil.dbExecute( GE50_SEQ,null,appInfo ); // 3.8.7.0 (2006/12/15) 233 String[][] vals = DBUtil.dbExecute( GE50_SEQ,null,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 234 ykno = vals[0][0].trim(); 235 } 236 catch( RuntimeException ex ) { 237 String errMsg = "要求番号の採番に失敗しました。" + HybsSystem.CR 238 + " SQL=" + GE50_SEQ + HybsSystem.CR 239 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 240 LogWriter.log( errMsg ); 241 LogWriter.log( ex ); 242 } 243 return ykno ; 244 } 245 246 /** 247 * 帳票要求テーブルにデータをセットします。 248 * 内部変数にセットされている値を利用して、データ登録を行います。 249 * 繰返し登録したい場合は、変更する値のみを、内部変数にセットしてから、 250 * このメソッドを呼び出してください。 251 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 252 * 253 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 254 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 255 * 256 * @param fgkan 完成フラグ 257 */ 258 public void insertGE50( final String fgkan ) { 259 String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02) 260 261 // GE50_INSERT の引数 262 String[] args = new String[] { 263 systemId, // SYSTEM_ID 264 ykno , // YKNO 265 StringUtil.nval( listid,"NO_LIST" ), // LISTID 266 StringUtil.nval( joken,"NO_JOKEN" ), // JOKEN 267 fgkan, // FGKAN 268 StringUtil.nval( outdir,"" ), // OUT_DIR 269 StringUtil.nval( outfile,"" ), // OUT_FILE 270 StringUtil.nval( comments,"" ), // COMMENTS 271 DYSET, // DYSET 272 DYSET, // DYUPD 273 USRSET, // USRSET 274 USRSET, // USRUPD 275 PGUPD, // PGUPD 276 DMN_NAME, // DMN_NAME 277 HybsSystem.HOST_NAME // DMN_HOST 278 } ; 279 280 try { 281// DBUtil.dbExecute( GE50_INSERT,args,appInfo ); // 3.8.7.0 (2006/12/15) 282 DBUtil.dbExecute( GE50_INSERT,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 283 } 284 catch( RuntimeException ex ) { 285 String errMsg = "帳票要求テーブルデータセットに失敗しました。" + HybsSystem.CR 286 + " SQL=" + GE50_INSERT + HybsSystem.CR 287 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 288 LogWriter.log( errMsg ); 289 LogWriter.log( ex ); 290 } 291 } 292 293 /** 294 * 処理終了後に完成フラグを設定します。 295 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 296 * なお、完成フラグ(fgkan)は、内部変数に持っていないため、外部から指定してください。 297 * 298 * @og.rev 3.8.0.4 (2005/08/08) PGUPDを追加 299 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 300 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 301 * 302 * @param fgkan 完成フラグ 303 */ 304 public void updateGE50( final String fgkan ) { 305 String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02) 306 307 String[] args = new String[] { 308 fgkan, // FGKAN 309 DYSET, // DYUPD 310 DMN_NAME, // DMN_NAME 311 HybsSystem.HOST_NAME, // DMN_HOST 312 systemId, // SYSTEM_ID 313 ykno // YKNO 314 } ; 315 316 try { 317// DBUtil.dbExecute( GE50_UPDATE,args,appInfo ); // 3.8.7.0 (2006/12/15) 318 DBUtil.dbExecute( GE50_UPDATE,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 319 } 320 catch( RuntimeException ex ) { 321 String errMsg = "完成フラグ設定に失敗しました。" + HybsSystem.CR 322 + " SQL=" + GE50_UPDATE + HybsSystem.CR 323 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 324 LogWriter.log( errMsg ); 325 LogWriter.log( ex ); 326 } 327 } 328 329 /** 330 * エラー発生時に、エラーメッセージを登録します。 331 * 内部変数にセットされている、systemId と ykno を利用して、データ登録を行います。 332 * 333 * @og.rev 3.8.5.3 (2006/06/30) エラーメッセージを 4000Byte以下にする。 334 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 335 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 336 * 337 * @param inErrMsg エラーメッセージ 338 */ 339 public void insertErrorGE56( final String inErrMsg ) { 340 341 String outErrMsg = (inErrMsg == null) ? "" : inErrMsg.trim(); 342 if( outErrMsg.length() > 2000 ) { 343 String code = HybsSystem.sys( "DB_ENCODE" ); 344 byte[] byteValue = StringUtil.makeByte( outErrMsg,code ); 345 if( byteValue.length > 4000 ) { 346 outErrMsg = StringUtil.makeString( byteValue,0,4000,code ); 347 } 348 } 349 String DYSET = HybsSystem.getDate( "yyyyMMddHHmmss" ) ; // 3.8.5.0 (2006/03/02) 350 351 String[] args = new String[] { 352 systemId, 353 ykno, 354 outErrMsg , // ERRMSG 355 DYSET, // DYSET 356 DYSET, // DYUPD 357 USRSET, // USRSET 358 USRSET, // USRUPD 359 PGUPD }; // PGUPD 360 361 try { 362// DBUtil.dbExecute( GE56_ERRMSG,args,appInfo ); // 3.8.7.0 (2006/12/15) 363 DBUtil.dbExecute( GE56_ERRMSG,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 364 } 365 catch( RuntimeException ex ) { 366 String errMsg = "エラーメッセージテーブルセットに失敗しました。" + HybsSystem.CR 367 + " SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "]" + HybsSystem.CR 368 + " SQL=" + GE56_ERRMSG + HybsSystem.CR 369 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 370 LogWriter.log( errMsg ); 371 LogWriter.log( ex ); 372 } 373 sendMail( outErrMsg ); // 3.8.0.4 (2005/08/08) 374 } 375 376 /** 377 * substring を補完する簡易メソッド 378 * 379 * substring で、文字をカットする場合、文字列長が、カットする文字数より 380 * 長い必要があります。ここでは、最大長に制限をかけることが目的なので 381 * 入力文字長が指定文字数より小さいケースがあります。そのチェックを 382 * 簡易的に実行できるように、このメソッドで処理します。 383 * 384 * @param in 入力文字 385 * @param len 最大文字数 386 * @param defVal NULL 時の初期値 387 * 388 * @return 指定の文字数でカットされた新しい文字列 389 */ 390 private String substr( final String in, final int len, final String defVal ) { 391 String rtn = in; 392 if( in == null ) { 393 rtn = defVal; 394 } 395 else if( in.length() > len ) { 396 rtn = in.substring( 1,len ); 397 } 398 399 return rtn ; 400 } 401 402 /** 403 * エラー情報のメール送信を行います。 404 * エラーメールは、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と 405 * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者) 406 * がすべて設定されている場合に、送信されます。 407 * 408 * @og.rev 3.8.0.4 (2005/08/08) 新規追加 409 * @og.rev 5.7.0.4 (2013/11/29) listIdの絞込み 410 * 411 * @param inErrMsg エラーメッセージ 412 */ 413 private void sendMail( final String inErrMsg ) { 414 415 String host = HybsSystem.sys( "COMMON_MAIL_SERVER" ); 416 String from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" ); 417 String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) ); 418 String match_txt = HybsSystem.sys( "REPORT_ERRMAIL_REGEX" ); // 5.7.0.4 (2013/11/29) 419 420 if( host != null && from != null && to.length > 0 ) { 421 if( match_txt == null || match_txt.length() == 0 422 || listid == null || listid.length() == 0 423 || listid.matches( match_txt ) ){ // 5.7.0.4 (2013/11/29) 424 // 3.8.5.0 (2006/03/02) DMN_NAME、DMN_HOST 追加 425 // 5.7.0.4 (2013/11/29) listid追加 426 String subject = "SYSTEM_ID=[" + systemId + "] , YKNO=[" + ykno + "] , " 427 + "DMN_NAME=[" + DMN_NAME + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]" 428 + "LISTID=[" + listid +"]"; 429 try { 430 MailTX tx = new MailTX( host ); 431 // tx.setHost( host ); 432 tx.setFrom( from ); 433 tx.setTo( to ); 434 tx.setSubject( "帳票エラー:" + subject ); 435 tx.setMessage( inErrMsg ); 436 tx.sendmail(); 437 } 438 catch( Throwable ex ) { 439 String errMsg = "エラー時メール送信に失敗しました。" + HybsSystem.CR 440 + " SUBJECT:" + subject + HybsSystem.CR 441 + " HOST:" + host + HybsSystem.CR 442 + " FROM:" + from + HybsSystem.CR 443 + " TO:" + Arrays.toString( to ) + HybsSystem.CR 444 + ex.getMessage(); // 5.1.8.0 (2010/07/01) errMsg 修正 445 LogWriter.log( errMsg ); 446 LogWriter.log( ex ); 447 } 448 } 449 } 450 } 451}