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