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