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