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}