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 018import java.io.File; 019 020import org.opengion.fukurou.util.FileUtil; 021import org.opengion.fukurou.util.StringUtil; 022import org.opengion.fukurou.util.ZipArchive; // 6.0.0.0 (2014/04/11) ZIP API変更 023import static org.opengion.fukurou.system.HybsConst.CR ; // 6.1.0.0 (2014/12/26) 024import org.opengion.hayabusa.common.HybsSystem; 025import org.opengion.hayabusa.common.HybsSystemException; 026import org.opengion.hayabusa.report.CSVPrintRequest; // 5.9.0.0 (2015/09/04) 027import org.opengion.hayabusa.report.ExcelInsert; 028import org.opengion.hayabusa.report.ProgramRun; 029import org.opengion.hayabusa.report.RFIDPrintRequest; 030import static org.opengion.fukurou.system.HybsConst.FS; // 6.1.0.0 (2014/12/26) refactoring 031 032/** 033 * 帳票要求に設定された実行方法により、各種出力、Excel取り込み、RFID出力処理を行います。 034 * 1.出力 035 * 雛形ファイルを一時ディレクトリに展開した後、帳票データを埋め込み、最後にOpenOffice.orgの 036 * プロセスを利用して出力を行います。 037 * 対応している出力方法は、印刷、PDF出力、Excel出力です。 038 * 一時ディレクトリは、システムリソースのREPORT_FILE_URLで定義されたディレクトリです。 039 * これが定義されていない場合は、システムリソースのFILE_URLで定義されたディレクト以下の/REPORTに 040 * 展開されます。 041 * 一時ファイルは、処理が正常に終了した場合、削除されます。(ODS出力のみにした場合は、出力直前の 042 * ODSファイルは残ります) 043 * 処理でエラーが発生した場合は、一時ファイルはデバッグのため、削除されません。 044 * 2.取り込み 045 * 旧帳票システムの取り込み処理及びその後のPG起動を行います。 046 * 3.RFID出力 047 * 旧帳票システムのRFID出力処理を行います。 048 * 049 * 実行方法により、出力、入力、RFID出力を行います。 050 * 051 * @og.group 帳票システム 052 * 053 * @version 4.0 054 * @author Hiroki.Nakamura 055 * @since JDK1.6 056 */ 057public class ExecProcess { 058 059 /** 帳票処理キュー */ 060 private final ExecQueue queue; 061 062 /** 出力タイプ */ 063 private final String type; 064 065 private final long start = System.currentTimeMillis(); // 6.3.9.1 (2015/11/27) 修飾子を、なし → private に変更。 066 private final boolean debug; // 4.3.0.0 (2008/07/15) デバッグの追加 067 068 /** 069 * コンストラクタ 070 * 071 * @og.rev 4.3.0.0 (2008/07/15)引数にdebugを追加 072 * 073 * @param qu ExecQueueオブジェクト 074 * @param debugFlag デバッグフラグ[true/false] 075 */ 076 public ExecProcess( final ExecQueue qu , final boolean debugFlag ) { 077 queue = qu; 078 type = qu.getOutputType(); 079 debug = debugFlag; 080 } 081 082 /** 083 * 帳票処理プロセスを実行します。 084 * 085 * @og.rev 4.3.0.0 (2008/07/15) debugの追加 086 * @og.rev 4.3.3.4 (2008/11/01) ODS出力追加 087 * @og.rev 5.1.2.0 (2010/01/01) 256シートを超えた場合の対応 088 */ 089 public void process() { 090 // 処理開始 091 addDebugMsg( "[INFO]EXEC-TIME:START=" + start ); 092 093 // 5.1.2.0 (2010/01/01) 基本的には1回で終了。256シートを超える場合のみ内部でfalseを立てる(2回目を処理させる) 094 queue.setEnd( true ); 095 096 /* 097 * ====================================================================== 098 * = 出力処理 099 * ====================================================================== 100 */ 101 // パース 102 if( ExecQueue.OUT_ODS_ONLY.equals( type ) 103 || ExecQueue.OUT_ODS_PRINT.equals( type ) || ExecQueue.OUT_ODS_PDF.equals( type ) || ExecQueue.OUT_ODS_EXCEL.equals( type ) 104 || ExecQueue.OUT_ODS_PRINT_PDF.equals( type ) || ExecQueue.OUT_ODS_ODS.equals( type ) ) { 105 parse(); 106 } 107 108 // 印刷 109 if( ExecQueue.OUT_PRINT_ONLY.equals( type ) || ExecQueue.OUT_ODS_PRINT.equals( type ) ) { 110 output( "PRINT" ); 111 } 112 // PDF出力 113 else if( ExecQueue.OUT_ODS_PDF.equals( type ) ) { 114 output( "PDF" ); 115 } 116 // EXCEL出力 117 else if( ExecQueue.OUT_ODS_EXCEL.equals( type ) ) { 118 output( "EXCEL" ); 119 } 120 // 印刷 + PDF出力 121 else if( ExecQueue.OUT_ODS_PRINT_PDF.equals( type ) ) { 122 output( "PRINT", "PDF" ); 123 } 124 // 4.3.3.4 (2008/11/01) 追加 ODS出力 125 else if( ExecQueue.OUT_ODS_ODS.equals( type ) ) { 126 output( "ODS" ); 127 } 128 129 /* 130 * ====================================================================== 131 * = 取込処理 132 * ====================================================================== 133 */ 134 // 取込 135 if( ExecQueue.IN_INPUT_ONLY.equals( type ) || ExecQueue.IN_INPUT_EXEC.equals( type ) ) { 136 input(); 137 } 138 139 // PG起動 140 if( ExecQueue.IN_EXEC_ONLY.equals( type ) || ExecQueue.IN_INPUT_EXEC.equals( type ) ) { 141 pgexec(); 142 } 143 144 /* 145 * ====================================================================== 146 * = RFID出力処理 147 * ====================================================================== 148 */ 149 // RFID出力 150 if( ExecQueue.RFID_PRINT.equals( type ) || ExecQueue.RFID_ALLPRINT.equals( type ) 151 || ExecQueue.RFID_ALLERASE.equals( type ) || ExecQueue.RFID_SEQERASE.equals( type ) ) { 152 rfid(); 153 } 154 155 /* 156 * ====================================================================== 157 * = CSV出力処理 158 * 5.9.4.2 (2016/01/13) Excel2追加 159 * ====================================================================== 160 */ 161 if( ExecQueue.CSV_PRINT.equals( type ) || ExecQueue.CSV_PRINT_EXCEL.equals( type ) 162 || ExecQueue.CSV_PRINT_PDF.equals( type ) || ExecQueue.CSV_PRINT_EXCEL2.equals( type ) ) { 163 csv(); 164 } 165 166 addDebugMsg( "[INFO]EXEC-TIME:END=" + System.currentTimeMillis() ); 167 } 168 169 /** 170 * 雛形ファイルを解析し、帳票データを挿入します。 171 * 172 * @og.rev 6.0.0.0 (2014/04/11) ZIP API変更 173 */ 174 private void parse() { 175 final File templateFile = new File( queue.getTemplateName() + ".ods" ); // 6.0.0.0 (2014/04/11) ZIP API変更 176 177 final String tmp = 178 HybsSystem.url2dir( StringUtil.nval( HybsSystem.sys( "REPORT_FILE_URL" ) ,HybsSystem.sys( "FILE_URL" ) + "REPORT/" ) ) 179 + queue.getSystemId() + File.separator + queue.getListId() + File.separator + queue.getYkno(); 180 final String tmpdir = tmp + File.separator; 181 final File tmpdirFile = new File( tmp + File.separator ); // 6.0.0.0 (2014/04/11) ZIP API変更 182 final File tmpodsFile = new File( tmp + ".ods" ); // 6.0.0.0 (2014/04/11) ZIP API変更 183 184 // 一時ファイルを削除(エラー発生時の前のファイルを削除) 185 FileUtil.deleteFiles( tmpdirFile ); // 6.0.0.0 (2014/04/11) ZIP API変更 186 187 // 雛形ODSをテンポラリフォルダに解凍 188 ZipArchive.unCompress( tmpdirFile, templateFile ); // 6.0.0.0 (2014/04/11) ZIP API変更 189 addDebugMsg( "[INFO]EXEC-TIME:UNCOMP=" + ( System.currentTimeMillis() - start ) ); 190 191 // DBTableModelのセット 192 queue.setData(); 193 addDebugMsg( "[INFO]EXEC-TIME:DATA=" + ( System.currentTimeMillis() - start ) ); 194 195 // content.xml,meta.xmlのパース 196 final OdsContentParser contentParser = new OdsContentParser( queue, tmpdir ); 197 contentParser.exec(); 198 addDebugMsg( "[INFO]EXEC-TIME:PARSE=" + ( System.currentTimeMillis() - start ) ); 199 200 // 雛形ODSを再圧縮 201 ZipArchive.compress( tmpdirFile, tmpodsFile ); // 6.0.0.0 (2014/04/11) ZIP API変更 202 addDebugMsg( "[INFO]EXEC-TIME:COMP=" + ( System.currentTimeMillis() - start ) ); 203 204 // 一時ファイルを削除 205 FileUtil.deleteFiles( tmpdirFile ); // 6.0.0.0 (2014/04/11) ZIP API変更 206 addDebugMsg( "[INFO]EXEC-TIME:DELETE=" + ( System.currentTimeMillis() - start ) ); 207 } 208 209 /** 210 * 出力処理を行います。 211 * 212 * @og.rev 4.2.3.1 (2008/06/04) 中間ファイルの存在チェックを追加 213 * @og.rev 4.3.0.0 (2008/07/18) プリント時のプリンタ名チェック追加 214 * @og.rev 4.3.0.0 (2008/07/18) 出力ファイル名を指定していない場合に要求番号にする 215 * @og.rev 4.3.3.4 (2008/11/01) ODS出力追加 216 * @og.rev 5.1.2.0 (2010/01/01) 例外発生時にCalcオブジェクトをCloseしていないバグを修正 217 * @og.rev 5.1.6.0 (2010/05/01) 変換クラスの大幅見直しによる修正(元のコードも削除します) 218 * 219 * @param String... types 220 */ 221 private void output( final String... types ) { 222 final String tmpods = 223 HybsSystem.url2dir( StringUtil.nval( HybsSystem.sys( "REPORT_FILE_URL" ) ,HybsSystem.sys( "FILE_URL" ) + "REPORT/" ) ) 224 + queue.getSystemId() + File.separator + queue.getListId() + File.separator + queue.getYkno() + ".ods"; 225 226 // 4.2.3.1 (2008/06/04) 中間ファイルの存在チェック 227 if( ! new File( tmpods ).exists() ){ 228 queue.addMsg( "中間ファイルが存在しません。" + tmpods + CR ); 229 throw new HybsSystemException(); 230 } 231 232 // 変換クラスの生成 233 final DocConverter_OOO dc = new DocConverter_OOO( tmpods ); 234 try { 235 // 起動 236 dc.open(); 237 addDebugMsg( "[INFO]EXEC-TIME:OPEN=" + ( System.currentTimeMillis() - start ) ); 238 239 for( int i=0; i<types.length; i++ ) { 240 if( "PRINT".equals( types[i] ) ) { 241 // 4.3.0.0 (2008/07/18) プリント時のプリンタ名チェック 242 if( queue.getPrinterName() == null || queue.getPrinterName().isEmpty() ){ 243 queue.addMsg( "出力先マスタが正しく設定されていません。" + CR ); 244 throw new Exception(); 245 } 246 dc.print( queue.getPrinterName() ); 247 } 248 else if( "PDF".equals( types[i] ) ) { 249 dc.pdf( queue.getOutputName(), queue.getPdfPasswd() ); 250 } 251 else if( "EXCEL".equals( types[i] ) ) { 252 dc.xls( queue.getOutputName() ); 253 } 254 // 4.3.3.4 (2008/11/01) 追加 255 else if( "ODS".equals( types[i] ) ) { 256 dc.ods( queue.getOutputName() ); 257 } 258 addDebugMsg( "[INFO]EXEC-TIME:EXEC["+types[i]+"]=" + ( System.currentTimeMillis() - start ) ); 259 } 260 261 // Calcを閉じる 262 dc.close(); 263 addDebugMsg( "[INFO]EXEC-TIME:RELEASE=" + ( System.currentTimeMillis() - start ) ); 264 } 265 catch( final Throwable th ) { 266 // Calcを閉じる(エラー発生時) 267 dc.close( true ); 268 queue.addMsg( "[INFO]EXEC-TIME:ERROR=" + ( System.currentTimeMillis() - start ) + CR ); 269 throw new HybsSystemException( th ); 270 } 271 // 一時ファイルの削除 272 FileUtil.deleteFiles( new File( tmpods ) ); 273 addDebugMsg( "[INFO]EXEC-TIME:DELETE=" + ( System.currentTimeMillis() - start ) ); 274 } 275 276 /** 277 * 取込処理を行います。 278 * 279 * @og.rev 4.3.0.0 (2008/07/15) debugの追加 280 */ 281 private void input() { 282 boolean flag = false; 283 284 // エクセル入力の基底となるパス 285 final String excelinUrl = HybsSystem.url2dir( StringUtil.nval( HybsSystem.sys( "EXCEL_IN_FILE_URL" ), HybsSystem.sys( "FILE_URL" ) + "EXCELIN/" ) ); 286 final String excelinDir = excelinUrl + queue.getSystemId() + FS + queue.getListId(); 287 288 final ExcelInsert ei = new ExcelInsert( queue.getSystemId(), queue.getYkno(), queue.getListId(), excelinDir, false ); 289 flag = ei.execute(); 290 if( !flag ) { 291 queue.addMsg( ei.getErrMsg() ); 292 queue.addMsg( "取り込み処理に失敗しました" ); 293 throw new HybsSystemException(); 294 } 295 addDebugMsg( "[INFO]EXEC-TIME:INPUT=" + ( System.currentTimeMillis() - start ) ); 296 } 297 298 /** 299 * Excel取込後のPG起動処理を行います。 300 * 301 * @og.rev 4.3.0.0 (2008/07/15) debugの追加 302 */ 303 private void pgexec() { 304 boolean flag = false; 305 306 final ProgramRun pr = new ProgramRun( queue.getSystemId(), queue.getYkno(), queue.getListId(), false ); 307 flag = pr.execute(); 308 if( !flag ) { 309 queue.addMsg( "取り込み後のPG起動に失敗しました" ); 310 queue.addMsg( pr.getErrMsg() ); 311 throw new HybsSystemException(); 312 } 313 addDebugMsg( "[INFO]EXEC-TIME:PGEXEC=" + ( System.currentTimeMillis() - start ) ); 314 } 315 316 /** 317 * RFID出力処理を行います。 318 * 319 * @og.rev 4.3.0.0 (2008/07/15) debugの追加 320 * @og.rev 4.3.3.0 (2008/10/01) 板金RFID対応 321 * @og.rev 5.4.3.9 (2012/01/25) 雛形ファイル名 322 */ 323 private void rfid() { 324 boolean flag = false; 325 326 // RFIDPrintRequest rpr = new RFIDPrintRequest( queue.getSystemId(), queue.getYkno(), queue.getListId(), queue.getLang(), type, queue.getPrinterName(), false ); 327 // 4.3.3.0 (2008/10/01) 板金RFID対応。 328 // 5.4.3.9 (2012/01/25) 雛形ファイル名を渡す 329 final RFIDPrintRequest rpr = new RFIDPrintRequest( queue.getSystemId(), queue.getYkno(), queue.getListId(), queue.getLang(), type, queue.getPrtId() 330 ,queue.getPrgDir(), queue.getPrgFile(), queue.getOutputName(),queue.getTemplateName(), false ); 331 flag = rpr.initialDataSet(); 332 if( flag ) { 333 flag = rpr.execute(); 334 } 335 if( !flag ) { 336 queue.addMsg( "RFID出力処理に失敗しました" ); 337 queue.addMsg( rpr.getErrMsg() ); 338 throw new HybsSystemException(); 339 } 340 addDebugMsg( "[INFO]EXEC-TIME:RFID=" + ( System.currentTimeMillis() - start ) ); 341 } 342 343 /** 344 * CSV出力処理を行います。 345 * 346 * @og.rev 5.9.0.0 (2015/09/04) 347 * @og.rev 5.9.2.2 (2015/11/22) grpid,demgrp 348 * @og.rev 5.9.2.3 (2015/11/27) 件数対応 349 */ 350 private void csv() { 351 boolean flag = false; 352 353 final CSVPrintRequest rpr = new CSVPrintRequest( queue.getSystemId(), queue.getYkno(), queue.getListId(), queue.getLang(), type, queue.getPrtId() 354 ,queue.getPrgDir(), queue.getPrgFile(), queue.getOutputName(), queue.getTemplateName(), queue.getGrpId(), queue.getDmnGrp(), debug ); 355 flag = rpr.initialDataSet(); 356 if( flag ) { 357 flag = rpr.execute(); 358 } 359 if( !flag ) { 360 queue.addMsg( "CSV出力処理に失敗しました" ); 361 queue.addMsg( rpr.getErrMsg() ); 362 throw new HybsSystemException(); 363 } 364 queue.setExecRowCnt( rpr.getBodyCount() ); // 5.9.2.3 (2015/11/27) 365 366 addDebugMsg( "[INFO]EXEC-TIME:CSV=" + ( System.currentTimeMillis() - start ) ); 367 } 368 369 /** 370 * デバッグ用のメッセージを出力します。 371 * 372 * @param msg メッセージ 373 */ 374 private void addDebugMsg( final String msg ) { 375 if( debug ){ 376 queue.addMsg( msg + CR ); 377 } 378 } 379}