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