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