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
018// import java.text.DateFormat;
019// import java.text.SimpleDateFormat;
020// import java.util.Calendar;
021// import java.util.Date;
022// import java.util.Locale;
023
024import org.opengion.fukurou.db.DBUtil;
025import org.opengion.fukurou.db.Transaction;
026import org.opengion.fukurou.util.StringUtil;
027import org.opengion.fukurou.util.HybsDateUtil;
028
029/**
030 * 伝送要求に対して旧伝送DB(CB01)に登録を行います。
031 *
032 * 旧伝送DB登録時のデータコード、送り先、テキスト種別は、伝送定義マスタの実行対象で指定します。
033 * 具体的には以下の形式で定義します。
034 *   (データコード) (送り先) (テキスト種別) [(レコード長)] 例):"3 D9 B119 [400]"
035 * 4番目のパラメーターであるレコード長は任意です。レコード長が指定されない場合、
036 * デフォルト値として 400 が定義されます。
037 *
038 * CB01の各項目のセット基準は以下の通りです。
039 *
040 *                                              ヘッダーデータ         明細データ
041 *  ---------------------------------------------------
042 *  HCDJ(状況)                    1                                       5
043 *  HCDD(カードコード)        [実行対象]                  [実行対象]
044 *  HTO(送り先)                    [実行対象]                  [実行対象]
045 *  HSYU(テキスト種別)        [実行対象]                  [実行対象]
046 *  HLDAY(登録日)          システム日付          システム日付
047 *  HLTIME(登録時間)        システム日付          システム日付
048 *  HDPDAY(削除日)         システム日付+14日      システム日付+14日
049 *  HFROM(送り元)          [システムリソース]      [システムリソース]      ※TRANSFER_HOST_CODEの値
050 *  HTCNO(通番NO)         CB010001.NEXTVAL        CB010001.NEXTVAL
051 *  HTC(通番)                     CB010002.NEXTVAL        CB010002.NEXTVAL
052 *  HTEXT(データ)          送り先+登録件数                データ
053 *  DYUNYOU(運用日)                CJ03.DYUNYOU            CJ03.DYUNYOU
054 *  RECL(レコード長) [実行対象]                  [実行対象]                  ※初期値400
055 *
056 *  この_CB01を利用する場合CB01テーブル以外に次のテーブル及びシーケンスが必要です
057 *  テーブル:CB02
058 *  シーケンス:CB010001,CB010002
059 *
060 * @og.rev 5.4.4.1 コメント修正
061 * @og.rev 5.5.7.3 CB01登録時のHPASS,HNAME変更
062 * @og.group 伝送システム
063 *
064 * @version  5.0
065 * @author   Hiroki.Nakamura
066 * @since    JDK1.6
067 */
068public class TransferExec_CB01 implements TransferExec {
069
070        // 旧伝送DB(CB01)登録
071        // 5.5.7.3 (2012/10/12) HPASS,HNAMEがnullでは駄目なのでスペース
072        private static final String CB01_INSERT =
073                "INSERT INTO CB01 ("
074                + "HCDJ,HCDD,HTO,HSYU,HLDAY,HLTIME,HDPDAY,HTEXT1,HTEXT2"
075                + ",HPASS,HFROM,HNAME,HTCNO,HTC,HTEXT,DYUNYOU,RECL"
076                + ") VALUES ("
077                + "?,?,?,?,?,?,?,null,null"
078//              + ",null,?,null,?,?,?,?,?"
079                + ",'        ',?,'                    ',?,?,?,?,?"
080                + ")";
081
082        // 通番NO取得
083        private static final String HTCNO_GET = "SELECT CB010001.NEXTVAL FROM DUAL";
084
085        // 通番取得
086        private static final String HTC_GET = "SELECT CB010002.NEXTVAL FROM DUAL";
087
088        // 運用日取得
089        private static final String DYUNYOU_GET = "SELECT DYUNYOU FROM CJ03";
090
091        // 削除日付基準日数
092        private static final int HDAY = 14;
093
094        // レコード長の初期値
095        private static final String DEFAULT_RECL = "400";
096
097        /**
098         * CB01に登録します。
099         *
100         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
101         *
102         * @param vals 伝送データ(配列)
103         * @param config 伝送設定オブジェクト
104         * @param tran トランザクションオブジェクト
105         */
106        @Override
107        public void execute( final String[] vals, final TransferConfig config, final Transaction tran ) {
108                if( vals == null || vals.length == 0 ) { return; }
109
110                String execObj = config.getExecObj();
111                String[] obj = StringUtil.csv2Array( execObj, ' ' );
112                if( obj.length < 3 ) {
113                        String errMsg = "実行対象は、(データコード) (送り先) (テキスト種別) の形式で指定して下さい。"
114                                                        + "EXECOBJ=[" + execObj + "]";
115                        throw new RuntimeException( errMsg );
116                }
117                String hcdd = obj[0];
118                String hto = obj[1];
119                String hsyu = obj[2];
120                if( hcdd == null || hcdd.length() == 0
121                 || hto  == null || hto.length()  == 0
122                 || hsyu == null || hsyu.length() == 0 ) {
123                        String errMsg = "実行対象は、(データコード) (送り先) (テキスト種別) は必須です。"
124                                                        + "EXECOBJ=[" + execObj + "]";
125                        throw new RuntimeException( errMsg );
126                }
127                String recl = ( obj.length > 3 ) ? obj[3] : DEFAULT_RECL;
128
129                String execDbid = config.getExecDbid();
130
131                String htcno = getHtcno( tran, execDbid );
132//              String hlday = getDate( "yyyyMMdd" );
133//              String hltime = getDate( "HHmm" );
134//              String hdpday = getDate( hlday, HDAY );
135                String hlday  = HybsDateUtil.getDate( "yyyyMMdd" );                     // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
136                String hltime = HybsDateUtil.getDate( "HHmm" );                         // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
137                String hdpday = HybsDateUtil.getDatePlus( hlday, HDAY );        // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
138
139                // ヘッダー行追加
140                String[] headerArgs = new String[] {
141                                "1",                                                            // HCDJ
142                                hcdd ,                                                          // HCDD
143                                hto,                                                            // HTO
144                                hsyu,                                                           // HSYU
145                                hlday.substring( 2 ),                           // HLDAY
146                                hltime,                                                         // HLTIME
147                                hdpday.substring( 2 ),                          // HDPDAY
148                                config.getHfrom(),                                      // HFROM
149                                htcno,                                                          // HTCNO
150                                getHtc( tran, execDbid ),                       // HTC
151                                getHeaderText( hto, vals.length ),      // HTEXT
152                                getDyunyou( tran, execDbid ),           // DYUNYOU
153                                recl                                                            // RECL
154                        };
155                DBUtil.dbExecute( CB01_INSERT, headerArgs, tran, execDbid );
156
157                // 明細行追加
158                for( String text : vals ) {
159                        String[] dataArgs = new String[] {
160                                        "5",                                                            // HCDJ
161                                        hcdd ,                                                          // HCDD
162                                        hto,                                                            // HTO
163                                        hsyu,                                                           // HSYU
164                                        hlday.substring( 2 ),                           // HLDAY
165                                        hltime,                                                         // HLTIME
166                                        hdpday.substring( 2 ),                          // HDPDAY
167                                        config.getHfrom(),                                      // HFROM
168                                        htcno,                                                          // HTCNO
169                                        getHtc( tran, execDbid ),                       // HTC
170                                        text,                                                           // HTEXT
171                                        getDyunyou( tran, execDbid ),           // DYUNYOU
172                                        recl                                                            // RECL
173                                };
174                        DBUtil.dbExecute( CB01_INSERT, dataArgs, tran, execDbid );
175                }
176        }
177
178        /**
179         * ヘッダーデータのテキストを返します。
180         * (CSP00007と同じ仕様で実装)
181         *
182         * @param hto 送り先
183         * @param cnt 登録件数
184         *
185         * @return ヘッダーデータのテキスト
186         */
187        private static String getHeaderText( final String hto, final int cnt ) {
188                return StringUtil.stringFill( hto, 8, "UTF-8" )
189//                                              + " 登録件数 = " + String.valueOf( cnt );
190                                                + " 登録件数 = " + cnt;
191        }
192
193        /**
194         * 通番NOを採番します。
195         * (CSP00007と同じ仕様で実装)
196         *
197         * @param tran トランザクションオブジェクト
198         * @param execDbid 実行接続先DBID
199         *
200         * @return 通番NO
201         */
202        private static String getHtcno( final Transaction tran, final String execDbid ) {
203                String[][] rtn = DBUtil.dbExecute( HTCNO_GET, new String[0], tran, execDbid );
204                return rtn[0][0];
205        }
206
207        /**
208         * 通番を採番します。
209         * (CSP00007と同じ仕様で実装)
210         *
211         * @param tran トランザクションオブジェクト
212         * @param execDbid 実行接続先DBID
213         *
214         * @return 通番
215         */
216        private static String getHtc( final Transaction tran, final String execDbid ) {
217                String[][] rtn = DBUtil.dbExecute( HTC_GET, new String[0], tran, execDbid );
218                return rtn[0][0];
219        }
220
221        /**
222         * 運用日を取得します。(CJ03>運用日)
223         * (CSP00007と同じ仕様で実装)
224         *
225         * @param tran トランザクションオブジェクト
226         * @param execDbid 実行接続先DBID
227         *
228         * @return 運用日
229         */
230        private static String getDyunyou( final Transaction tran, final String execDbid ) {
231                String[][] rtn = DBUtil.dbExecute( DYUNYOU_GET, new String[0], tran, execDbid );
232                return rtn[0][0];
233        }
234
235        /**
236         * 現在日付、時刻をフォーマットを指定して、所得します。
237         * フォーマットの指定方法は、java.text.SimpleDateFormat の指定方法と同一です。
238         *
239         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するため廃止
240         *
241         * @param       form フォーム文字列 ( 例 "yyyy/MM/dd HH:mm:ss.SSS" )
242         *
243         * @return      現在日付、時刻
244         */
245//      private static String getDate( final String form ) {
246//              DateFormat formatter = new SimpleDateFormat( form,Locale.JAPAN );
247//              return formatter.format(new Date());
248//      }
249
250        /**
251         * 指定の引数の日付け文字列(YYYYMMDDHHMMSS)より、カレンダオブジェクトを作成します。
252         * 引数は、YYYYMMDD の8文字か、YYYYMMDDHHMMSS の14文字のどちらかです。
253         *
254         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するため廃止
255         *
256         * @param value 日付け文字列(YYYYMMDD または YYYYMMDDHHMMSS)
257         *
258         * @return      カレンダオブジェクト
259         */
260//      private static Calendar getCalendar( final String value ) {
261//              if ( value == null || ( value.length() != 8 && value.length() != 14 ) ) {
262//                      String errMsg = "引数は、YYYYMMDD または YYYYMMDDHHMMSS 形式の日付け文字列のみです。"
263//                                      + " value=[" + value + "]" ;
264//                      throw new RuntimeException( errMsg );
265//              }
266// 
267//              Calendar cal = Calendar.getInstance();
268//              cal.clear();
269// 
270//              int hour=0,minute=0,second=0;
271// 
272//              int year   = Integer.parseInt( value.substring( 0,4 ) );
273//              int month  = Integer.parseInt( value.substring( 4,6 ) ) - 1;
274//              int date   = Integer.parseInt( value.substring( 6,8 ) );
275// 
276//              if( value.length() == 14 ) {
277//                      hour   = Integer.parseInt( value.substring( 8,10 ) );
278//                      minute = Integer.parseInt( value.substring( 10,12 ) );
279//                      second = Integer.parseInt( value.substring( 12,14 ) );
280//              }
281// 
282//              cal.set( year,month,date,hour,minute,second );
283// 
284//              return cal;
285//      }
286
287        /**
288         * 指定の引数の日付け文字列(YYYYMMDD)より、差分の日付を計算して返します。
289         * 引数は、YYYYMMDD と 差分の日数。
290         *
291         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するため廃止
292         * ※ diffのコメント(過去の日付[+]、将来の日付は[-])と内部ロジックが異なるように思います。
293         *    移した先の HybsDateUtil.getDatePlus でも同じ処理です。バグかどうかテストできていません。
294         *
295         * @param baseDate 日付け文字列(YYYYMMDD)
296         * @param diff     差分の日数(過去の日付[+]、将来の日付は[-])
297         *
298         * @return      結果の日付(YYYYMMDD)
299         */
300//      private static String getDate( final String baseDate,final int diff ) {
301//              if ( baseDate == null || ( baseDate.length() != 8 ) ) {
302//                      String errMsg = "引数 baseDate は、YYYYMMDD 形式の日付け文字列のみです。"
303//                                      + " baseDate=[" + baseDate + "]" ;
304//                      throw new RuntimeException( errMsg );
305//              }
306// 
307//              Calendar cal = getCalendar( baseDate );
308//              cal.add( Calendar.DATE,diff );
309//              String rtn = null;
310// 
311//              int calYear             = cal.get( Calendar.YEAR );
312//              int calMonth    = cal.get( Calendar.MONTH ) + 1;
313//              int calDay              = cal.get( Calendar.DATE );
314//              rtn = String.valueOf( calYear );
315//              if( calMonth < 10 ) {
316//                      rtn = rtn + "0" + calMonth;
317//              }
318//              else {
319//                      rtn = rtn + calMonth;
320//              }
321//              if( calDay < 10 ) {
322//                      rtn = rtn + "0" + calDay;
323//              }
324//              else {
325//                      rtn = rtn + calDay;
326//              }
327//              return rtn;
328//      }
329
330}