    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}