    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.fukurou.transfer;
    017
    018import java.util.ArrayList;
    019import java.util.List;
    020
    021import org.opengion.fukurou.db.DBUtil;
    022import org.opengion.fukurou.db.Transaction;
    023import org.opengion.fukurou.util.ApplicationInfo;
    024import org.opengion.fukurou.util.StringUtil;
    025
    026/**
    027 * 伝送要求に対して、旧伝送DBのデータを読取します。
    028 *
    029 * 伝送定義マスタの読取対象は、以下の形式で定義する必要があります。
    030 *   (データコード) (送り先) (テキスト種別)   例):"3 D9 B119"
    031 * 処理実行後は、読み取ったヘッダーデータの状況を'2'に更新します。
    032 * 但し、読取パラメーターに"NOUPDATE"を指定した場合、処理後の更新は行われません。
    033 * また、エラーが発生した場合はヘッダーデータの状況を'9'に更新します。
    034 *
    035 * @og.group 伝送システム
    036 *
    037 * @version  5.0
    038 * @author   Hiroki.Nakamura
    039 * @since    JDK1.6
    040 */
    041public class TransferRead_CB01 implements TransferRead {
    042
    043        // 更新対象の通番NO(配列)
    044        private String[] htcnoArr = null;
    045
    046        /**
    047         * 伝送データを読み取ります。
    048         *
    049         * @param config 伝送設定オブジェクト
    050         * @param tran トランザクションオブジェクト
    051         *
    052         * @return 読み取りしたデータ(配列)
    053         * @see #getKeys()
    054         */
    055        @Override
    056        public String[] read( final TransferConfig config, final Transaction tran ) {
    057                htcnoArr = getHtcno( config, tran );
    058                return getData( htcnoArr, tran );
    059        }
    060
    061        /**
    062         * 旧伝送DBを検索し、対象の通番NO(配列)を返します。
    063         *
    064         * @param config 伝送設定オブジェクト
    065         * @param tran トランザクションオブジェクト
    066         *
    067         * @return 通番NO(配列)
    068         */
    069        private String[] getHtcno( final TransferConfig config, final Transaction tran ) {
    070                String readObj = config.getReadObj();
    071                String[] obj = StringUtil.csv2Array( readObj, ' ' );
    072                if( obj.length < 3 ) {
    073                        String errMsg = "読取対象は、(データコード) (送り先) (テキスト種別) の形式で指定して下さい。[READOBJ=" + readObj + "]";
    074                        throw new RuntimeException( errMsg );
    075                }
    076                String hcdd = obj[0];
    077                String hto = obj[1];
    078                String hsyu = obj[2];
    079                if( hcdd == null || hcdd.length() == 0
    080                 || hto  == null || hto.length()  == 0
    081                 || hsyu == null || hsyu.length() == 0 ) {
    082                        String errMsg = "読取対象は、(データコード) (送り先) (テキスト種別) は必須です。[READOBJ=" + readObj + "]";
    083                        throw new RuntimeException( errMsg );
    084                }
    085
    086                StringBuilder buf = new StringBuilder();
    087                buf.append( "SELECT A.HTCNO" );
    088                buf.append( " FROM CB01 A" );
    089                buf.append( " WHERE A.HCDD = '" + hcdd + "'" );
    090                buf.append( " AND A.HTO = '" + hto + "'" );
    091                buf.append( " AND A.HSYU = '" + hsyu + "'" );
    092                buf.append( " AND A.HCDJ = '1'" );
    093                buf.append( " ORDER BY A.HTC" );
    094
    095                String[][] vals = DBUtil.dbExecute( buf.toString(),null,tran );
    096                List<String> hnoList = new ArrayList<String>();
    097                if( vals != null && vals.length > 0 ) {
    098                        for( int row=0; row<vals.length; row++ ) {
    099                                hnoList.add( vals[row][0] );
    100                        }
    101                }
    102
    103                return hnoList.toArray( new String[hnoList.size()] );
    104        }
    105
    106        /**
    107         * 対象の通番NOに対してCB01を読み込みデータを配列で返します。
    108         *
    109         * @param htcnoArr 読取対象の通番NO(配列)
    110         * @param tran トランザクション
    111         *
    112         * @return データ(配列)
    113         */
    114        private String[] getData( final String[] htcnoArr, final Transaction tran ) {
    115                if( htcnoArr == null || htcnoArr.length == 0 ) { return new String[0]; }
    116
    117                String htcnos = StringUtil.array2csv( htcnoArr );
    118                StringBuilder buf = new StringBuilder();
    119                buf.append( "SELECT A.HTEXT" );
    120                buf.append( " FROM CB01 A" );
    121                buf.append( " WHERE A.HCDJ = '5'" );
    122                buf.append( " AND A.HTCNO IN (" );
    123                buf.append( htcnos );
    124                buf.append( ") ORDER BY A.HTC, A.HTCNO" );
    125
    126                String[][] vals = DBUtil.dbExecute( buf.toString(),null,tran );
    127                String[] rtn = new String[vals.length];
    128                for( int i=0; i<vals.length; i++ ) {
    129                        rtn[i] = vals[i][0];
    130                }
    131                return rtn;
    132        }
    133
    134        /**
    135         * 更新対象の通番NO(配列)を返します。
    136         *
    137         * @og.rev 5.5.2.4 (2012/05/16) 配列を返す場合は、内部表現を暴露しないように、clone を返します。
    138         *
    139         * @return 通番NO(配列)
    140         */
    141        @Override
    142        public String[] getKeys() {
    143                String[] rtn = null ;
    144                if( htcnoArr != null ) { rtn = htcnoArr.clone(); }
    145                return rtn ;
    146        }
    147
    148        /**
    149         * 更新対象の通番NO(配列)をセットします。
    150         *
    151         * @og.rev 5.5.2.4 (2012/05/16) 参照の格納には、System.arraycopy を使います。
    152         *
    153         * @param keys 通番NO(配列)
    154         */
    155        @Override
    156        public void setKeys( final String[] keys ) {
    157                if( keys != null ) {
    158                        int size = keys.length ;
    159                        htcnoArr = new String[size];
    160                        System.arraycopy( keys,0,htcnoArr,0,size );
    161                }
    162                else {
    163                        htcnoArr = null;
    164                }
    165        }
    166
    167        /**
    168         * 読取した伝送データのヘッダーデータの状況を'2'(抜出済み)に更新します。
    169         * 更新対象の通番NOについては、{@link #setKeys(String[])}で外部からセットすることもできます。
    170         *
    171         * @param config 伝送設定オブジェクト
    172         * @param tran トランザクションオブジェクト
    173         * @see #setKeys(String[])
    174         */
    175        @Override
    176        public void complete( final TransferConfig config, final Transaction tran ) {
    177                if( htcnoArr == null || htcnoArr.length == 0 ) { return; }
    178                // 読取パラメーターに"NOUPDATE"が指定されている場合は、CB01の状況を更新しない
    179                if( "NOUPDATE".equalsIgnoreCase( config.getReadPrm() ) ) { return; }
    180
    181                String htcnos = StringUtil.array2csv( htcnoArr );
    182                StringBuilder buf = new StringBuilder();
    183                buf.append( "UPDATE CB01 A" );
    184                buf.append( " SET A.HCDJ = '2'" );
    185                buf.append( " WHERE A.HCDJ = '1'" );
    186                buf.append( " AND A.HTCNO IN (" );
    187                buf.append( htcnos );
    188                buf.append( ")" );
    189
    190                DBUtil.dbExecute( buf.toString(),null,tran );
    191        }
    192
    193        /**
    194         * 読取した伝送データのヘッダーデータの状況を'9'(エラー)に更新します。
    195         * 更新対象の通番NOについては、{@link #setKeys(String[])}で外部からセットすることもできます。
    196         *
    197         * @param config 伝送設定オブジェクト
    198         * @param appInfo DB接続情報
    199         * @see #setKeys(String[])
    200         */
    201        @Override
    202        public void error( final TransferConfig config, final ApplicationInfo appInfo ) {
    203                if( htcnoArr == null || htcnoArr.length == 0 ) { return; }
    204
    205                String htcnos = StringUtil.array2csv( htcnoArr );
    206                StringBuilder buf = new StringBuilder();
    207                buf.append( "UPDATE CB01 A" );
    208                buf.append( " SET A.HCDJ = '9'" );
    209                buf.append( " WHERE A.HCDJ in ('1','2')" ); // 既に実行PGで抜出済みに更新されている可能性がある
    210                buf.append( " AND A.HTCNO IN (" );
    211                buf.append( htcnos );
    212                buf.append( ")" );
    213
    214                DBUtil.dbExecute( buf.toString(),null,appInfo ); // エラー更新はトランザクションを分けて処理する
    215        }
    216
    217}