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}