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.fukurou.db.DBUtil; 019import org.opengion.fukurou.util.ApplicationInfo; 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.hayabusa.common.HybsSystem; 022import org.opengion.hayabusa.db.DBTableModel; 023import org.opengion.hayabusa.report2.QueueManager_DB.DBTableModelCreator; 024import org.opengion.hayabusa.resource.ResourceFactory; 025import org.opengion.hayabusa.resource.ResourceManager; 026 027/** 028 * 帳票システムでCSV出力をする際に、データを加工、プラグインの呼び出しを行うクラスです。 029 * 030 * @og.group 帳票システム 031 * 032 * @version 4.0 033 * @author Takahashi Masakazu 034 * @since JDK5.0, 035 */ 036public class CSVPrintRequest { 037 038 private static final String CR = HybsSystem.CR ; 039 040 private final StringBuilder errMsg = new StringBuilder(); 041 042 // DBTableModel に対して設定する情報 043// private DBTableModel table = null; // 4.3.1.1 (2008/08/23) ローカル変数化 044 private ResourceManager resource = null; 045 046 // 受け渡し変数 047 private final String SYSTEM_ID ; 048 private final String YKNO ; 049 private final String LISTID ; 050 private final String LANG ; 051 private final String FGRUN ; // G:CSV(print) H:CSV(Excel) I:CSV(PDF) 052 private final String PRTID ; 053 private final String PRGDIR ; 054 private final String PRGFILE ; 055 private final String OUTDIR ; 056 private final String FILENAME ; // 雛形ファイル名 057 private final boolean DEBUG ; 058 059 private final String GRPID ; // 5.9.2.2 060 private final String DMNGRP ; // 5.9.2.2 061 062 // オブジェクト変数 063// private String bSQL = null; 064 private boolean fgLOCAL = false; 065 private String prtName = null; 066 private String hostName = null; 067 private String portnm = null; 068 private String fgkan = GE50Access.FG_ERR2; // 初期値エラー 069 private String option = null; // 5.9.3.0 (2015/12/04) 070 071 private int bodyCount = 0; 072 073 // GE54 の帳票定義情報を取得するSQL文です。 074 private static final String GE54_SELECT = 075 "SELECT BSQL,FGLOCAL,SYSTEM_ID,HSQL,FSQL" + 076 " ,OPTIONS,FGCUT" + // 5.9.3.0 (2015/12/04) 077 " FROM GE54" + 078 " WHERE FGJ = '1'" + 079 " AND SYSTEM_ID IN (?,'**')" + 080 " AND LISTID = ?" ; 081// private static final int GE54_BSQL = 0; 082 private static final int GE54_FGLOCAL = 1; 083 private static final int GE54_SYSTEM_ID = 2; 084// private static final int GE54_HSQL = 3; 085// private static final int GE54_FSQL = 4; 086 private static final int GE54_OPTIONS = 5; // 5.9.3.0 087 private static final int GE54_FGCUT = 6; // 5.9.3.0 088 089 // 5.4.4.0 (2012/02/01) 互換モード対応漏れ 090 private static final String HOST = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "HOST" : "HOST_ID"; 091 092 // GE55 の出力先マスタ情報を取得するSQL文です。 093 // 5.1.0.0 (2009/11/04) HOST ⇒ HOST_ID 094 // 5.4.3.1 (2011/12/27) PORTNM 095 // 5.4.4.0 (2012/02/01) 互換モード 096 private static final String GE55_SELECT = 097 "SELECT PRTNM,"+HOST+",SYSTEM_ID,PORTNM" + 098 " FROM GE55" + 099 " WHERE FGJ = '1'" + 100 " AND SYSTEM_ID IN (?,'**')" + 101 " AND PRTID = ?" ; 102 private static final int GE55_PRTNM = 0; 103 private static final int GE55_HOST_ID = 1; 104 private static final int GE55_SYSTEM_ID = 2; 105 private static final int GE55_PORTNM = 3; 106 107 // 5.2.0.0 (2010/09/01) Ver4互換モード対応 108 private static final String CLM = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "COLUMN_NAME" : "CLM"; 109 110 // コネクションにアプリケーション情報を追記するかどうか指定 111 public static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 112 private final ApplicationInfo appInfo; 113 private final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 114 115 /** 116 * コンストラクター 117 * 引数を受けとって、インスタンスを作成します。 118 * 119 * @og.rev 5.9.2.2 (2015/11/20) grpid,dmngrp 120 * 121 * @param systemId システムID 122 * @param ykno 要求番号 123 * @param listId 帳票ID 124 * @param lang 言語 125 * @param fgrun 実行方法 126 * @param prtid プリンタID 127 * @param prgdir プログラムディレクトリ 128 * @param prgfile プログラムファイル 129 * @param outdir 出力ディレクトリ 130 * @param grpid グループID 131 * @param dmngrp デーモングループ 132 * @param isDebug デバッグフラグ 133 * 134 * 135 */ 136 public CSVPrintRequest( final String systemId, final String ykno 137 , final String listId, final String lang, final String fgrun, final String prtid 138 , final String prgdir, final String prgfile, final String outdir , final String filename 139// , final boolean isDebug ) { 140 , final String grpid, final String dmngrp, final boolean isDebug ) { // 5.9.2.2 141 SYSTEM_ID = systemId; 142 YKNO = ykno; 143 LISTID = listId; 144 LANG = lang; 145 FGRUN = fgrun; 146 PRTID = prtid; 147 PRGDIR = prgdir; 148 PRGFILE = prgfile; 149 OUTDIR = outdir; 150 FILENAME = filename; 151 DEBUG = isDebug; 152 153 GRPID = grpid; 154 DMNGRP = dmngrp; 155 156 // アクセスログ取得の為,ApplicationInfoオブジェクトを設定 157 if( USE_DB_APPLICATION_INFO ) { 158 appInfo = new ApplicationInfo(); 159 // ユーザーID,IPアドレス,ホスト名 160 appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 161 // 画面ID,操作,プログラムID 162 appInfo.setModuleInfo( "ReportConverter",YKNO,LISTID ); 163 } 164 else { 165 appInfo = null; 166 } 167 } 168 169 /** 170 * 初期データセットを行います。 171 * ここでは、GE54,GE58,GE55 テーブルより必要な情報を取得します。 172 * 173 * @og.rev 5.9.3.0 (2015/12/04) 174 * 175 * @return 結果 [true:正常/false:異常] 176 */ 177 public boolean initialDataSet() { 178 179 // ===== GE54 から帳票定義情報を取得します ========================================= 180 String[] args = new String[] { SYSTEM_ID,LISTID }; 181// String[][] vals = DBUtil.dbExecute( GE54_SELECT,args,appInfo ); 182 String[][] vals = DBUtil.dbExecute( GE54_SELECT,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 183 if( vals == null || vals.length == 0 ) { 184 errMsg.append( "Data does not exist in GE54 table." ).append( CR ); 185 errMsg.append( "==============================" ).append( CR ); 186 errMsg.append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , " ); 187 errMsg.append( "LISTID=[" ).append( LISTID ).append( "]" ); 188 errMsg.append( CR ); 189 return false; 190 } 191 192 // 検索結果が複数帰ったとき、SYSTEM_ID が 指定されている方のデータ(行)を採用する。 193 int row = 0; 194 for( int i=0; i<vals.length; i++ ) { 195 if( SYSTEM_ID.equalsIgnoreCase( vals[i][GE54_SYSTEM_ID] ) ) { row = i; break; } 196 } 197 198 // GE54のbSQLは廃止となっているので下方で別で取る 199// bSQL = StringUtil.nval( vals[row][GE54_BSQL],bSQL ); 200// if( bSQL == null || bSQL.length() == 0 ) { 201// errMsg.append( "Body SQL Columns does not exist in GE54 table." ).append( CR ); 202// errMsg.append( "==============================" ).append( CR ); 203// errMsg.append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , " ); 204// errMsg.append( "LISTID=[" ).append( LISTID ).append( "] " ); 205// errMsg.append( CR ); 206// return false; 207// } 208 209 // ローカルリソースフラグ 210 // fgLOCAL = ( vals[row][GE54_FGLOCAL] != null && vals[row][GE54_FGLOCAL].trim().equals( "1" ) ) ? true : false ; 211 String localFlag = vals[row][GE54_FGLOCAL]; 212 fgLOCAL = ( localFlag != null && "1".equals( localFlag.trim() )) ? true : false ; 213 214 option = vals[row][GE54_OPTIONS]; // 5.9.3.0 215 216 217 // ===== GE55 から出力先マスタ情報を取得します ========================================= 218 String[] argsGe55 = new String[] { SYSTEM_ID,PRTID }; 219 String[][] valsGe55 = DBUtil.dbExecute( GE55_SELECT,argsGe55,appInfo, DBID ); 220 if( valsGe55 == null || valsGe55.length == 0 ) { 221 errMsg.append( "Data does not exist in GE55 table." ).append( CR ); 222 errMsg.append( "==============================" ).append( CR ); 223 errMsg.append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , " ); 224 errMsg.append( "PRTID=[" ).append( PRTID ).append( "]" ); 225 errMsg.append( CR ); 226 return false; 227 } 228 229 // 検索結果が複数帰ったとき、SYSTEM_ID が 指定されている方のデータ(行)を採用する。 230 int rowGe55 = 0; 231 for( int i=0; i<vals.length; i++ ) { 232 if( SYSTEM_ID.equalsIgnoreCase( vals[i][GE55_SYSTEM_ID] ) ) { rowGe55 = i; break; } 233 } 234 235 prtName = valsGe55[rowGe55][GE55_PRTNM]; 236 hostName = valsGe55[rowGe55][GE55_HOST_ID]; 237 portnm = valsGe55[rowGe55][GE55_PORTNM]; 238 239 return true; 240 } 241 242 /** 243 * 発行用データを作成し、発行リクエストの処理を行います。 244 * 245 * @og.rev 5.9.2.2 (2015/11/20) GRPID,DEMGRP 246 * @og.rev 5.9.2.3 (2015/11/27) rowCount 247 * @og.rev 5.9.3.0 (2015/12/04) option 248 * 249 * @return 結果 [true:正常/false:異常] 250 */ 251 public boolean execute() { 252 System.out.print( "CSV RequestData Creating ... " ); 253 254 // FGLOCAL 指定時は、SYSTEM_ID を指定してリソース作成 255 if( fgLOCAL ) { 256 // ローカルリソース指定時は、SYSTEM_ID,LANG を使用します。先読みは、使用しません。 257 resource = ResourceFactory.newInstance( SYSTEM_ID,LANG,false ); 258 } 259 else { 260 // 従来と互換性のあるモード(ローカルリソースは使用しない。 261 resource = ResourceFactory.newInstance( LANG ); 262 } 263 264 265 // ボディー情報の取得 266 DBTableModelCreator tmc = new DBTableModelCreator( SYSTEM_ID, LISTID, YKNO, "B", resource ); 267 DBTableModel table = tmc.getTable(); 268 if( table.getRowCount() <= 0 ) { 269 errMsg.append( "Database Body row count is Zero." ).append( CR ); 270 errMsg.append( "==============================" ).append( CR ); 271 errMsg.append( "SYSTEM_ID=" ).append( SYSTEM_ID ); 272 errMsg.append( ",LISTID=" ).append( LISTID ); 273 errMsg.append( ",YKNO=" ).append( YKNO ); 274 errMsg.append( CR ); 275 return false; 276 } 277 // 検索時の最大件数での打ち切りをエラーとする。 278 if( table.isOverflow() ) { 279 errMsg.append( "Database is Overflow. [" ); 280 errMsg.append( table.getRowCount() ); 281 errMsg.append( "]" ).append( CR ).append( CR ); 282 errMsg.append( "==============================" ).append( CR ); 283 errMsg.append( "Check SystemParameter Data in DB_MAX_ROW_COUNT Overflow" ); 284 errMsg.append( CR ); 285 return false; 286 } 287 288 bodyCount = table.getRowCount(); // 5.9.2.3 (2015/11/27) 289 290 // ヘッダフッタも渡す 291 tmc = new DBTableModelCreator( SYSTEM_ID, LISTID, YKNO, "H", resource ); 292 DBTableModel tableH = tmc.getTable(); 293 tmc = new DBTableModelCreator( SYSTEM_ID, LISTID, YKNO, "F", resource ); 294 DBTableModel tableF = tmc.getTable(); 295 296 // 発行用クラスを実行する。 297 CSVPrintPointService service = null; 298 try { 299 service = (CSVPrintPointService)StringUtil.newInstance( HybsSystem.sys( "REPORT_CSV_SERVICE_CLASS" ) ); 300 service.setYkno( YKNO ); 301 service.setSystemId( SYSTEM_ID ); 302 service.setFgrun( FGRUN ); 303 service.setHostName( hostName ); 304 service.setPrinterName( prtName ); 305 service.setTable( table ); 306 service.setTableH( tableH ); 307 service.setTableF( tableF ); 308 service.setPrgDir( PRGDIR ); 309 service.setPrgFile( PRGFILE ); 310 service.setOutDir( OUTDIR ); 311 service.setPrtId( PRTID ); 312 service.setPortnm( portnm ); 313 service.setListId( LISTID ); 314 service.setModelname( FILENAME ); 315 service.setGrpId( GRPID ); // 5.9.2.2 316 service.setDmnGrp( DMNGRP ); // 5.9.2.2 317 service.setOption( option ); // 5.9.3.0 318 319 boolean flag = service.execute(); 320 321 fgkan = service.getFgkan(); 322 323 if( DEBUG ) { 324 System.out.println( service ); 325 } 326 327 if( ! flag ){ 328 errMsg.append( service.getErrMsg() ); 329 return false; 330 } 331 } 332 catch ( Throwable ex ) { 333 fgkan = GE50Access.FG_ERR2; // エラー時はアプリエラーにしておく 334 errMsg.append( "CSV Print Request Execution Error. " ).append( CR ); 335 errMsg.append( "==============================" ).append( CR ); 336 errMsg.append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , " ); 337 errMsg.append( "YKNO=[" ).append( YKNO ).append( "]" ).append( CR ); 338 errMsg.append( HybsSystem.sys( "REPORT_CSV_SERVICE_CLASS" ) ).append( CR ); 339 errMsg.append( ex.toString() ); 340 errMsg.append( CR ); 341// errMsg.append( service.getErrMsg() ); 342 if( service != null ) { errMsg.append( service.getErrMsg() ); } // 5.5.2.6 (2012/05/25) findbugs対応 343 return false; 344 } 345 346 System.out.println( "End." ); 347 return true ; 348 } 349 350 /** 351 * エラーが存在した場合に、エラーメッセージを返します。 352 * 353 * @return エラーメッセージ String 354 */ 355 public String getErrMsg() { 356 return errMsg.toString(); 357 } 358 359 /** 360 * 完了フラグを返します。 361 * 362 * 363 * @return 完了フラグ String 364 */ 365 public String getFgkan() { 366 return fgkan; 367 } 368 369 /** 370 * 処理件数(bodyの件数)を返します。 371 * 372 * @og.rev 5.9.2.7 (2015/11/27) 追加 373 * 374 * @return 処理件数 int 375 */ 376 public int getBodyCount() { 377 return bodyCount; 378 } 379}