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 String fileEncode = null; // 5.5.2.4 (2012/05/16) ローカル変数化 058 059 // 完了時に読取ファイルを削除するかどうか 060 private boolean fileDel = true; 061 062 /** 063 * ファイルからデータを読み取ります。 064 * 065 * @param config 伝送設定オブジェクト 066 * @param tran トランザクションオブジェクト 067 * 068 * @return 読み取りしたデータ(配列) 069 */ 070 @Override 071 public String[] read( final TransferConfig config, final Transaction tran ) { 072 fileName = config.getReadObj(); 073 File fileRead = new File( fileName ); 074 if( !fileRead.exists() ) { return new String[0]; } 075 076 String readPrm = config.getReadPrm(); 077 if( readPrm != null && readPrm.indexOf( "UNDEL" ) >= 0 ) { 078 fileDel = false; 079 readPrm = readPrm.replace( "UNDEL", "" ).trim(); 080 } 081 String fileEncode = readPrm; 082 if( fileEncode == null || fileEncode.length() == 0 ) { 083 fileEncode = "UTF-8"; 084 } 085 086 List<String> valList = new ArrayList<String>(); 087 BufferedReader reader = FileUtil.getBufferedReader( fileRead, fileEncode ); 088 String line = null; 089 try { 090 while( ( line = reader.readLine() ) != null ) { 091 line = StringUtil.stringFill( line, 500, fileEncode ); 092 byte[] bytes = StringUtil.makeByte( line, fileEncode ); 093 line = StringUtil.makeString( bytes, 30, 400, fileEncode ); 094 valList.add( line ); 095 } 096 } 097 catch( Throwable ex ) { 098 LogWriter.log( ex ); 099 String errMsg = "ファイル読取時にエラーが発生しました。[LINE=" + line + "]"; 100 throw new RuntimeException( errMsg, ex ); 101 } 102 finally { 103 Closer.ioClose( reader ); 104 } 105 106// return valList.toArray( new String[0] ); 107 return valList.toArray( new String[valList.size()] ); 108 } 109 110 /** 111 * 更新(削除)対象のファイル名(配列)を返します。 112 * 113 * @return ファイル名(配列) 114 */ 115 @Override 116 public String[] getKeys() { 117// String[] rtn = { fileName }; 118// return rtn; 119 return new String[] { fileName }; // 5.5.2.4 (2012/05/16) 120 } 121 122 /** 123 * 更新(削除)対象のファイル名をセットします。 124 * 125 * @param keys ファイル名(配列) 126 */ 127 @Override 128 public void setKeys( final String[] keys ) { 129 if( keys == null || keys.length == 0 ) { return; } 130 fileName = keys[0]; 131 } 132 133 /** 134 * 読取したデータに対して完了処理を行います。 135 * 具体的には、読取したテキストファイルを削除します。 136 * 137 * @param config 伝送設定オブジェクト 138 * @param tran トランザクションオブジェクト 139 */ 140 @Override 141 public void complete( final TransferConfig config, final Transaction tran ) { 142 if( !fileDel ) { return; } 143 144 File fileRead = new File( fileName ); 145 if( !fileRead.exists() ) { 146 return; 147// String errMsg = "ファイルが存在しません。[FILE=" + fileRead.getAbsolutePath() + "]"; 148// throw new RuntimeException( errMsg ); 149 } 150 151 boolean rtn = fileRead.delete(); 152 if( !rtn ) { 153 String errMsg = "ファイルの削除に失敗しました。[FILE=" + fileRead.getAbsolutePath() + "]"; 154 throw new RuntimeException( errMsg ); 155 } 156 } 157 158 /** 159 * 読取したデータに対してエラー処理を行います。 160 * (ここでは何も処理しません) 161 * 162 * @param config 伝送設定オブジェクト 163 * @param appInfo DB接続情報 164 */ 165 @Override 166 public void error( final TransferConfig config, final ApplicationInfo appInfo ) { 167 } 168}