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