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.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.common.HybsSystemException;
020import org.opengion.fukurou.util.StringUtil;
021import org.opengion.fukurou.util.ApplicationInfo;
022import org.opengion.fukurou.db.DBUtil;
023
024import java.io.File;
025
026/**
027 * DBTableModelオブジェクトをレポート形式に返還するタグリブクラスです。
028 * このオブジェクトに、 データ(DBTableModel)と、コントローラ(DBTableReport クラス)を与えて、
029 * 外部からコントロールすることで、各種形式で データ(DBTableModel)を表示させることが
030 * 可能です。
031 *
032 * @og.group 帳票システム
033 *
034 * @version  4.0
035 * @author   Kazuhiko Hasegawa
036 * @since    JDK5.0,
037 */
038public class ReportProcessing {
039
040        private static final String FGRUN_1     = "1";  // HTMLのみ
041        private static final String FGRUN_2     = "2";  // 印刷のみ
042        private static final String FGRUN_3     = "3";  // 出力+印刷
043
044        // 3.8.0.0 (2005/06/07) 実行方法(FGRUN)に、EXCEL取込関連のフラグ値を追加。
045        private static final String FGRUN_5     = "5";  // 取込のみ
046        private static final String FGRUN_6     = "6";  // PG起動のみ
047        private static final String FGRUN_7     = "7";  // 取込+PG起動
048
049        private static final String FGRUN_A     = "A";  // RFID(通常印刷) 4.0.3.0 (2007/12/26)
050        private static final String FGRUN_B     = "B";  // RFID(全印刷) 4.0.3.0 (2007/12/26)
051        private static final String FGRUN_C     = "C";  // RFID(全消去) 4.0.3.0 (2007/12/26)
052        private static final String FGRUN_D     = "D";  // RFID(連続消去) 4.1.1.0 (2008/02/21)
053
054        private static final String CR     = HybsSystem.CR ;
055
056        // 印刷時に使用するテンポラリフォルダ名
057        private final String REPORT_URL =
058                HybsSystem.url2dir( StringUtil.nval(
059                                                                HybsSystem.sys( "REPORT_FILE_URL" ) ,
060                                                                HybsSystem.sys( "FILE_URL"   ) + "REPORT/" ) ) ;
061
062        // 3.8.0.0 (2005/06/07) 追加
063        // EXCEL取込時に使用するテンポラリフォルダ名。ファイル名は、要求番号.xls
064        private final String EXCELIN_URL =
065                HybsSystem.url2dir( StringUtil.nval(
066                                                                HybsSystem.sys( "EXCEL_IN_FILE_URL" ) ,
067                                                                HybsSystem.sys( "FILE_URL"   ) + "EXCELIN/" ) ) ;
068
069        private StringBuilder errMsg = new StringBuilder();
070
071        // 各種DBを検索するときに、キー情報
072        private String          SYSTEM_ID       = null;
073        private String          YKNO            = null;
074        private String          GROUPID         = null;
075        private String          LISTID          = null;
076        private String          JOKEN           = null;
077        private String          OUT_DIR         = null;         // 5.1.0.0 (2009/11/04) OUTDIR ⇒ OUT_DIR
078        private String          OUT_FILE        = null;         // 5.1.0.0 (2009/11/04) OUTFILE ⇒ OUT_FILE
079        private String          outputFile      = null;
080        private boolean         isDebug         = false;        // 3.8.5.0 (2006/03/06) デバッグ用のフラグを追加
081
082        // GE53 検索結果
083        private String          FGRUN           = null;
084        private String          PRTID           = null;
085        private String          LANG            = "ja";
086        private String          PRGDIR          = null;
087        private String          PRGFILE         = null;
088        private String          DMN_GRP         = null;         // 3.8.0.5 (2005/08/26)
089        private String          programFile     = null;
090
091        // GE53 の帳票振分情報を取得するSQL文です。
092        // 3.8.0.5 (2005/08/26) デーモングループ追加
093        // 4.0.0 (2005/01/31) 共有 system_id を、考慮
094        private static final String GE53_SELECT =
095                "SELECT FGRUN,PRTID,LANG,PRGDIR,PRGFILE,SYSTEM_ID,DMN_GRP" +
096                " FROM GE53" +
097                " WHERE FGJ = '1'" +
098                " AND  SYSTEM_ID IN (?,'**')" +
099                " AND  JOKEN = ?" ;
100
101        private static final int GE53_FGRUN             = 0;
102        private static final int GE53_PRTID             = 1;
103        private static final int GE53_LANG              = 2;
104        private static final int GE53_PRGDIR    = 3;
105        private static final int GE53_PRGFILE   = 4;
106        private static final int GE53_SYSTEM_ID = 5;
107        private static final int GE53_DMN_GRP   = 6;
108
109        /** コネクションにアプリケーション情報を追記するかどうか指定 */
110        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
111
112        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
113        private ApplicationInfo appInfo;
114        private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );          // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
115
116        /**
117         * 処理を実行します。
118         * このメソッドを実行すると、レポート変換、レポート出力を順次処理していきます。
119         *
120         * @og.rev 3.0.0.4 (2003/02/26) FGRUN が PRT のみのときは,MODELFILE のみセットして終了する。
121         * @og.rev 3.8.0.0 (2005/06/07) ReportConverter の initialDataSet() を呼び出して,MODELFILE をセットする。
122         * @og.rev 3.8.0.0 (2005/06/07) EXCEL 登録機能を追加します。
123         * @og.rev 3.8.0.0 (2005/06/07) 実行結果を boolean ではなく、文字列(FGKAN_XX)で返します。
124         * @og.rev 3.8.0.5 (2005/08/26) デーモングループ追加
125         * @og.rev 3.8.0.9 (2005/10/17) エラーメッセージ強化
126         * @og.rev 3.8.5.0 (2006/03/06) 標準画面出力メッセージの変更。日付、プリンタIDの表示
127         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
128         * @og.rev 4.0.3.0 (2007/12/26) RFID対応(実行方法='A','B','C'の処理追加)
129         * @og.rev 4.1.1.0 (2008/02/21) RFID対応(実行方法='D'の処理追加)
130         * @og.rev 4.3.3.0 (2008/10/01) 板金RFID対応(PRGDIR,PRGFILEの渡し等)
131         * @og.rev 5.4.3.9 (2012/01/25) RFIDの雛形ファイル名私は旧帳票は無視する
132         *
133         * @return 結果 (FGKAN_XX エラー時は、null)
134         */
135        public String execute() {
136                System.out.println();
137                System.out.println( "Process Start:" + HybsSystem.getDate( "yyyy/MM/dd HH:mm:ss" ) );
138                System.out.println( "  SYSTEM_ID=[" + SYSTEM_ID + "] YKNO=[" + YKNO + "] GROUPID=[" + GROUPID + "]" );
139                System.out.println( "  PRTID=[" + PRTID + "] LISTID=[" + LISTID + "] JOKEN=[" + JOKEN + "]" );
140                String  fgkan = null;
141
142                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
143                if( USE_DB_APPLICATION_INFO ) {
144                        appInfo = new ApplicationInfo();
145                        // ユーザーID,IPアドレス,ホスト名
146                        appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
147                        // 画面ID,操作,プログラムID
148                        appInfo.setModuleInfo( "ReportProcessing",YKNO,LISTID );
149                }
150                else {
151                        appInfo = null;
152                }
153
154                boolean flag ;
155                try {
156                        flag = initialDataSet( appInfo );
157                        System.out.print( "INIT=" + flag + "," );
158                        String reportDir  = REPORT_URL + SYSTEM_ID + HybsSystem.FS + LISTID ;
159                        String modelFile = null;
160
161        // ================== FGRUN_1,2,3 は、帳票印刷処理 ===========================================
162                        // 3.8.0.0 (2005/06/07) 実行方法(FGRUN)に、EXCEL取込関連のフラグ値を追加。Stringからintに変更
163                        if( flag && ( FGRUN.equals( FGRUN_1 ) || FGRUN.equals( FGRUN_2 ) || FGRUN.equals( FGRUN_3 ) ) ) {
164                                System.out.println( "RUN_" + FGRUN );
165                                ReportConverter rc = new ReportConverter( SYSTEM_ID,YKNO,LISTID,reportDir,LANG,isDebug );
166
167                                // 3.8.0.0 (2005/06/07) MODELFILE のセットは、initialDataSet() で行う。
168                                flag = rc.initialDataSet();
169                                modelFile = rc.modelFile(); // 4.0.1.0 (2007/12/18)
170
171                                if( flag && ( FGRUN.equals( FGRUN_1 ) || FGRUN.equals( FGRUN_3 ) ) ) {
172                                        flag = rc.execute();
173                                }
174
175                                if( flag ) { fgkan = GE50Access.FG_OK; }
176                                errMsg.append( rc.getErrMsg() ).append( CR );
177                        }
178                        if( flag && ( FGRUN.equals( FGRUN_2 ) || FGRUN.equals( FGRUN_3 ) ) ) {
179                                System.out.println( "RUN_" + FGRUN );
180                                fgkan = null;
181                                // 3.8.0.5 (2005/08/26) デーモングループ追加
182                                ReportPrint rp = new ReportPrint( SYSTEM_ID,YKNO,PRTID,programFile,reportDir,modelFile,outputFile,DMN_GRP,isDebug );
183                                flag = rp.execute();
184                                if( flag ) { fgkan = GE50Access.FG_OK; }
185                                errMsg.append( rp.getErrMsg() ).append( CR );
186                        }
187
188        // ================== FGRUN_4,5,6 は、EXCEL取込処理 ===========================================
189                        // 3.8.0.0 (2005/06/07) EXCEL 登録機能を追加します。
190                        String excelinDir = EXCELIN_URL + SYSTEM_ID + HybsSystem.FS + LISTID;
191                        if( flag && ( FGRUN.equals( FGRUN_5 ) || FGRUN.equals( FGRUN_7 ) ) ) {
192                                System.out.println( "RUN_" + FGRUN );
193                                ExcelInsert ei = new ExcelInsert( SYSTEM_ID,YKNO,LISTID,excelinDir,isDebug );
194
195                                flag = ei.execute();
196                                if( flag ) { fgkan = GE50Access.FG_DBIN; }
197                                errMsg.append( ei.getErrMsg() ).append( CR );
198                        }
199                        if( flag && ( FGRUN.equals( FGRUN_6 ) || FGRUN.equals( FGRUN_7 ) ) ) {
200                                System.out.println( "RUN_" + FGRUN );
201                                fgkan = null;
202                                ProgramRun pr = new ProgramRun( SYSTEM_ID,YKNO,LISTID,isDebug );
203                                flag = pr.execute();
204                                if( flag ) { fgkan = GE50Access.FG_OK; }
205                                errMsg.append( pr.getErrMsg() ).append( CR );
206                        }
207
208        // ================== FGRUN_A,B,C,D は、RFID出力処理 ===========================================
209                        if( flag && ( FGRUN.equals( FGRUN_A ) || FGRUN.equals( FGRUN_B ) || FGRUN.equals( FGRUN_C ) || FGRUN.equals( FGRUN_D ) ) ) {
210                                System.out.println( "RUN_" + FGRUN );
211                                //RFIDPrintRequest rpr = new RFIDPrintRequest( SYSTEM_ID,YKNO,LISTID,LANG,FGRUN,PRTID,isDebug );
212                                // 4.3.3.0 (2008/10/01) RFIDPrintRequestのコンストラクタ引数追加
213                                // 5.4.3.9 (2012/01/25) 雛形ファイル名は新帳票のみ対応
214                                RFIDPrintRequest rpr = new RFIDPrintRequest( SYSTEM_ID,YKNO,LISTID,LANG,FGRUN,PRTID,PRGDIR,PRGFILE,OUT_DIR,null,isDebug );
215                                flag = rpr.initialDataSet();
216                                if( flag ) { flag = rpr.execute(); }
217                                //if( flag ) { fgkan = GE50Access.FG_RUN; }
218                                // 4.3.3.0 (2008/10/01) 完成フラグの取り方変更
219                                if( flag ) { fgkan = rpr.getFgkan(); }
220                                errMsg.append( rpr.getErrMsg() ).append( CR );
221                        }
222                }
223                catch ( RuntimeException ex ) {
224                        errMsg.append( "ReportProcessing Execute Error! " ).append( CR ) ;
225                        errMsg.append( "==============================" ).append( CR );
226                        errMsg.append( StringUtil.stringStackTrace( ex ) ).append( CR ) ;
227                        flag = false;
228                }
229
230                return flag ? fgkan : null ;    // 正常なら、fgkan を、異常なら null を返します。
231        }
232
233        /**
234         * 内部変数をクリアします。
235         * このオブジェクトを再利用する場合は、必ずこのメソッドで内部変数の
236         * クリアが必要です。
237         * 注意:このクラス自身は、同期処理は入っていません
238         *
239         * @og.rev 3.8.0.5 (2005/08/26) デーモングループ追加
240         *
241         */
242        public void clear() {
243                SYSTEM_ID       = null;
244                YKNO            = null;
245                GROUPID         = null;
246                LISTID          = null;
247                JOKEN           = null;
248                OUT_DIR         = null;         // 5.1.0.0 (2009/11/04) OUTDIR ⇒ OUT_DIR
249                OUT_FILE        = null;         // 5.1.0.0 (2009/11/04) OUTFILE ⇒ OUT_FILE
250                outputFile      = null;
251                isDebug         = false;        // 3.8.5.0 (2006/03/06) デバッグ用のフラグを追加
252
253                FGRUN           = null;
254                PRTID           = null;
255                LANG            = null;
256                PRGDIR          = null;
257                PRGFILE         = null;
258                DMN_GRP         = null;         // 3.8.0.5 (2005/08/26)
259                programFile     = null;
260
261                errMsg          = new StringBuilder() ;
262        }
263
264        /**
265         * システムID(SYSTEM_ID)をセットします。
266         *
267         * @param val システムID
268         */
269        public void setSystemId( final String val ) { SYSTEM_ID = val; }
270
271        /**
272         * 要求番号(YKNO)をセットします。
273         *
274         * @param val 要求番号
275         */
276        public void setYkno( final String val ) { YKNO = val; }
277
278        /**
279         * グループID(GROUPID)をセットします。
280         *
281         * @param val グループID
282         */
283        public void setGroupId( final String val ) { GROUPID = val; }
284
285        /**
286         * 帳票ID(LISTID)をセットします。
287         *
288         * @param val 帳票ID
289         */
290        public void setListId( final String val ) { LISTID = val; }
291
292        /**
293         * 処理条件(JOKEN)をセットします。
294         *
295         * @param val 処理条件
296         */
297        public void setJoken( final String val ) { JOKEN = val; }
298
299        /**
300         * プリンターID(PRTID)をセットします。
301         *
302         * @og.rev 3.8.5.0 (2006/03/06) PRTID が指定されていれば、その値を使用する。なければ NULL
303         * @og.rev 4.3.4.4 (2009/01/01) メソッド名変更
304         *
305         * @param val プリンターID
306         */
307        public void setPrtId( final String val ) { PRTID = val; }
308
309        /**
310         * 出力先ディレクトリ(OUT_DIR)をセットします。
311         *
312         * @param val 出力先ディレクトリ
313         */
314        public void setOutDir( final String val ) { OUT_DIR = val; }
315
316        /**
317         * 出力先ファイル(OUT_FILE)をセットします。
318         *
319         * @param val 出力先ファイル
320         */
321        public void setOutFile( final String val ) { OUT_FILE = val; }
322
323        /**
324         * debugフラグをセットします。
325         *
326         * @og.rev 3.8.5.0 (2006/03/06) デバッグ用のフラグを追加します。
327         *
328         * @param       flag    デバッグフラグ[true:デバッグ/false:通常]
329         */
330        public void setDebug( final boolean flag ) { isDebug = flag; }
331
332        /**
333         * 初期データセットを行います。
334         * ここでは、GE53 テーブルより必要な情報を取得します。
335         *
336         * @og.rev 3.8.0.5 (2005/08/26) デーモングループ追加
337         * @og.rev 3.8.5.0 (2006/03/06) プリンタIDが引数から、渡される場合の対応
338         * @og.rev 3.8.6.0 (2006/09/29) 出力先フォルダの自動生成を行います。
339         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
340         * @og.rev 5.1.0.0 (2009/11/04) OUTDIR ⇒ OUT_DIR , OUTFILE ⇒ OUT_FILE カラム名変更
341         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
342         *
343         * @param       appInfo アプリ情報オブジェクト
344         *
345         * @return      結果[true:正常/false:異常]
346         */
347        private boolean initialDataSet( final ApplicationInfo appInfo ) {
348                String[] args = new String[] { SYSTEM_ID,JOKEN };
349                // fgrun,prtid,lang,prgdir,prgfile
350                String[][] vals = DBUtil.dbExecute( GE53_SELECT,args,appInfo, DBID );   // 5.5.5.1 (2012/08/07)
351                if( vals == null || vals.length == 0 ) {
352                        errMsg.append( "Data does not exist in GE53 table." ).append( CR );
353                        errMsg.append( "==============================" ).append( CR );
354                        errMsg.append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , " );
355                        errMsg.append( "JOKEN=["     ).append( JOKEN     ).append( "]" );
356                        errMsg.append( CR );
357                        return false;
358                }
359
360                int row = 0;
361                // 検索結果が複数帰ったとき、SYSTEM_ID が 指定されている方のデータ(行)を採用する。
362                for( int i=0; i<vals.length; i++ ) {
363                        if( SYSTEM_ID.equalsIgnoreCase( vals[i][GE53_SYSTEM_ID] ) ) { row = i; break; }
364                }
365
366                // 3.8.5.0 (2006/03/06) プリンタIDが引数から、渡される場合の対応
367                if( PRTID == null ) {
368                        PRTID = StringUtil.nval( vals[row][GE53_PRTID],PRTID   );
369                }
370
371                FGRUN   = StringUtil.nval( vals[row][GE53_FGRUN],       FGRUN   );
372                LANG    = StringUtil.nval( vals[row][GE53_LANG],        LANG    );
373                PRGDIR  = StringUtil.nval( vals[row][GE53_PRGDIR],      PRGDIR  );
374                PRGFILE = StringUtil.nval( vals[row][GE53_PRGFILE],     PRGFILE );
375                DMN_GRP = StringUtil.nval( vals[row][GE53_DMN_GRP],     DMN_GRP );      // 3.8.0.5 (2005/08/26)
376                programFile = PRGDIR + HybsSystem.FS + PRGFILE ;
377
378                if( OUT_DIR != null  && OUT_DIR.length() > 0 &&
379                        OUT_FILE != null && OUT_FILE.length() > 0 ) {
380                                outputFile  = OUT_DIR + HybsSystem.FS + OUT_FILE ;
381                                // 3.8.6.0 (2006/09/29) 出力先フォルダの自動生成を行います。
382                                File dir = new File(OUT_DIR);
383                                if( ! dir.exists() && ! dir.mkdirs() ) {
384                                        String errMsg = "ディレクトリの作成に失敗しました。[" + OUT_DIR + "]";
385                                        throw new HybsSystemException( errMsg );
386                                }
387                }
388
389                return true;
390        }
391
392        /**
393         * エラーが存在した場合に、エラーメッセージを返します。
394         *
395         * @return エラーメッセージ String
396         */
397        public String getErrMsg() {
398                return errMsg.toString();
399        }
400}