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