    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.io.BufferedReader;
    019import java.io.File;
    020import java.util.ArrayList;
    021import java.util.List;
    022
    023import org.opengion.fukurou.db.Transaction;
    024import org.opengion.fukurou.util.ApplicationInfo;
    025import org.opengion.fukurou.util.Closer;
    026import org.opengion.fukurou.util.FileUtil;
    027import org.opengion.fukurou.util.LogWriter;
    028import org.opengion.fukurou.util.StringUtil;
    029
    030/**
    031 * 伝送要求に対して、テキストファイルからデータを読取します。
    032 * 但し、読取されるデータについては、旧伝送システムの形式と互換性を持たせるため、
    033 * 31Byteから430Byteまでの400Byteを取得します。
    034 *
    035 * 読取するファイル名は、読取対象で指定します。
    036 * ファイル名は絶対パスで指定する必要があります。
    037 *
    038 * 読込及びその後の実行処理が正常終了した場合は、読取ファイルは削除されます。
    039 * 但し、読取パラメーターに"UNDEL"という文字を設定した場合は、正常終了した場合でも
    040 * ファイルは削除されません。
    041 *
    042 * また、読取するテキストファイルのエンコードは読取パラメーターが指定することができます。
    043 * 指定しない場合、システムリソースの"DB_ENCODE"で指定された値が適用されます。
    044 *
    045 * @og.group 伝送システム
    046 *
    047 * @version  5.0
    048 * @author   Hiroki.Nakamura
    049 * @since    JDK1.6
    050 */
    051public class TransferRead_SAMCB implements TransferRead {
    052
    053        // 読取ファイルオブジェクト
    054        private String fileName = null;
    055
    056        // 完了時に読取ファイルを削除するかどうか
    057        private boolean fileDel = true;
    058
    059        /**
    060         * ファイルからデータを読み取ります。
    061         *
    062         * @param config 伝送設定オブジェクト
    063         * @param tran トランザクションオブジェクト
    064         *
    065         * @return 読み取りしたデータ(配列)
    066         */
    067        @Override
    068        public String[] read( final TransferConfig config, final Transaction tran ) {
    069                fileName = config.getReadObj();
    070                File fileRead = new File( fileName );
    071                if( !fileRead.exists() ) { return new String[0]; }
    072
    073                String readPrm = config.getReadPrm();
    074                if( readPrm != null && readPrm.indexOf( "UNDEL" ) >= 0 ) {
    075                        fileDel = false;
    076                        readPrm = readPrm.replace( "UNDEL", "" ).trim();
    077                }
    078
    079                // 読取ファイルのエンコード
    080                String fileEncode = readPrm;
    081                if( fileEncode == null || fileEncode.length() == 0 ) {
    082                        fileEncode = "UTF-8";
    083                }
    084
    085                List<String> valList = new ArrayList<String>();
    086                BufferedReader reader = FileUtil.getBufferedReader( fileRead, fileEncode );
    087                String line = null;
    088                try {
    089                        while( ( line = reader.readLine() ) != null ) {
    090                                line = StringUtil.stringFill( line, 500, fileEncode );
    091                                byte[] bytes = StringUtil.makeByte( line, fileEncode );
    092                                line = StringUtil.makeString( bytes, 30, 400, fileEncode );
    093                                valList.add( line );
    094                        }
    095                }
    096                catch( Throwable ex ) {
    097                        LogWriter.log( ex );
    098                        String errMsg = "ファイル読取時にエラーが発生しました。[LINE=" + line + "]";
    099                        throw new RuntimeException( errMsg, ex );
    100                }
    101                finally {
    102                        Closer.ioClose( reader );
    103                }
    104
    105                return valList.toArray( new String[valList.size()] );
    106        }
    107
    108        /**
    109         * 更新(削除)対象のファイル名(配列)を返します。
    110         *
    111         * @return ファイル名(配列)
    112         */
    113        @Override
    114        public String[] getKeys() {
    115                return new String[] { fileName };               // 5.5.2.4 (2012/05/16)
    116        }
    117
    118        /**
    119         * 更新(削除)対象のファイル名をセットします。
    120         *
    121         * @param keys ファイル名(配列)
    122         */
    123        @Override
    124        public void setKeys( final String[] keys ) {
    125                if( keys == null || keys.length == 0 ) { return; }
    126                fileName = keys[0];
    127        }
    128
    129        /**
    130         * 読取したデータに対して完了処理を行います。
    131         * 具体的には、読取したテキストファイルを削除します。
    132         *
    133         * @param config 伝送設定オブジェクト
    134         * @param tran トランザクションオブジェクト
    135         */
    136        @Override
    137        public void complete( final TransferConfig config, final Transaction tran ) {
    138                if( !fileDel ) { return; }
    139
    140                File fileRead = new File( fileName );
    141                if( !fileRead.exists() ) {
    142                        return;
    143                }
    144
    145                boolean rtn = fileRead.delete();
    146                if( !rtn ) {
    147                        String errMsg = "ファイルの削除に失敗しました。[FILE=" + fileRead.getAbsolutePath() + "]";
    148                        throw new RuntimeException( errMsg );
    149                }
    150        }
    151
    152        /**
    153         * 読取したデータに対してエラー処理を行います。
    154         * (ここでは何も処理しません)
    155         *
    156         * @param config 伝送設定オブジェクト
    157         * @param appInfo DB接続情報
    158         */
    159        @Override
    160        public void error( final TransferConfig config, final ApplicationInfo appInfo ) {}
    161}