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 */
016 package org.opengion.fukurou.process;
017
018 import org.opengion.fukurou.util.Argument;
019 import org.opengion.fukurou.util.FTPConnect;
020 import org.opengion.fukurou.util.LogWriter;
021
022 import java.util.Map ;
023 import java.util.LinkedHashMap ;
024
025 import java.io.File;
026
027 /**
028 * Process_FileFtp は、上流から受け取っ?FileLineModel を??る?
029 * ChainProcess インターフェースの実?ラスです?
030 *
031 * 上流から受け取っ?FileLineModel の ファイルから、localPath のローカル共通パス?
032 * remotePath のFTP共通パスに、PFT伝?します?(-command=PUT 処??み)
033 * ファイルそ?も?の階層構?は、維持されるため、ローカルからFTPサーバ?
034 * へのフォル?ピ?に近いイメージになります?
035 *
036 * Process_FileCopy との違いは、ファイルのエンコード変換は行いません。た??
037 * FTP伝?での改行コード?変換は?mode=ASCII で?できます?
038 * もうひとつ、Process_FileCopy では、inPath と outPath でのCOPY処?したが?
039 * こ?クラスでは、localPath と、remotePath でそれぞれの共通パスを指定します?
040 *
041 * 上流?ロセスでは、Name 属?として、?File』を持ち、?は、Fileオブジェク?
042 * である、Process_FileSearch を使用するのが?便利です?それ以外?クラス?
043 * 使用する場合でも?Name属?と、File オブジェクトを持つ LineModel を受け渡?
044 * できれば、使用可能です?
045 *
046 * 引数??中に空白を含??合?、ダブルコー??ション("") で括って下さ??
047 * 引数??の ?』?前後には、空白は挟めません。??key=value の様に
048 * 繋げてください?
049 *
050 * @og.formSample
051 * Process_FileFtp -host=FTPサーバ? -user=ユーザー -pass=パスワー?-localPath=ローカル共通パス -remotePath=FTP共通パス
052 * [-mode=[ASCII/BINARY] ] [-passive=[true/false] ]
053 *
054 * -host=FTPサーバ? ?FTPサーバ?
055 * -user=ユーザー ?ユーザー
056 * -pass=パスワー? ?パスワー?
057 * -localPath=ローカル共通パス ?上流で検索されたファイルパスのローカル側共通部?
058 * -remotePath=FTP共通パス ?上流で検索されたファイルパスのFTP側共通部?
059 * [-mode=[ASCII/BINARY] ] ?扱?ァイルの種類を?しま?初期値:ASCII)
060 * [-passive=[true/false] ] ?パ?ブモー?ローカルからサーバ?へ接続を張?を利用するかど?(初期値:true)
061 * (false:アク?ブモー?通常のFTPの初期値)で通信します?)
062 * [-mkdirs=[true/false] ] ?受け?ファイル(GET?LOCAL、PUT?FTPサーバ?)に?レクトリを作?するかど?(初期値:true)
063 * (false:?レクトリが無ければ、エラーにします?)
064 * [-encode=エンコード名 ] ?日本語ファイル名などのエンコード名を指定しま?初期値:UTF-8)
065 * [-timeout=タイ?ウ?秒] ] ?Dataタイ?ウ?初期値:600 [秒])
066 * [-display=[false/true] ] ?trueは、検索状況を表示しま?初期値:false)
067 * [-debug=[false/true] ] ?デバッグ??を標準?力に表示する(true)かしな?false)?初期値:false[表示しない])
068 *
069 * @og.rev 5.1.5.0 (2010/04/01) 新規追?
070 *
071 * ※ 注?
072 * Windwosにおいて、大量ファイルのFTP伝?を行う場合?、注意が?です?
073 * Windowsにおけるソケ?の?値は?000がデフォルト?です?
074 * また?TIME_WAITの?ォルト?は??=240?です?
075 * FTPの様に??タ伝?時に毎回、ソケ?を作?すると、?ートが枯?ます?
076 *
077 * こ?値を変更するには、レジストリに以下?キーを設定する?があります?
078 *
079 * ?ケ?の?数(5,000??5,534の間で設???
080 * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort (DWORD)
081 *
082 * ?IME_WAITの時間(30??00秒?間で設???
083 * HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay (DWORD)
084 *
085 * ※ 設定後?再起動しな?設定が反映されません?
086 *
087 * @version 4.0
088 * @author Kazuhiko Hasegawa
089 * @since JDK5.0,
090 */
091 public class Process_FileFtp extends AbstractProcess implements ChainProcess {
092 private static final int TIMEOUT = 600 ; // Dataタイ?ウ?初期値:600 [秒])
093
094 private FTPConnect ftp = null;
095 // private File tempFile = null;
096
097 private String host = null; // FTPサーバ?
098 private String user = null; // ユーザー
099 // private String pass = null; // パスワー?
100 private String command = "PUT"; // FTPサーバ?側での処??方?GET/PUT/DEL)を指定します?(PUTのみ固?
101 private String localPath = null; // 上流で検索されたファイルパスのローカル側共通部?
102 private String remotePath = null; // 上流で検索されたファイルパスのFTP側共通部?
103
104 private boolean display = false; // trueは、検索状況を表示しま?初期値:false)
105 private boolean debug = false; // ????を標準?力に表示する(true)かしな?false)?
106
107 private int localPathLen = 0;
108 private int inCount = 0;
109
110 private static final Map<String,String> mustProparty ; // ?プロパティ???チェ?用 Map
111 private static final Map<String,String> usableProparty ; // ?プロパティ?整合?チェ? Map
112
113 private static final String[] MODE_LST = new String[] { "ASCII","BINARY" };
114 // private static final String[] CMD_LST = new String[] { "GET","PUT","DEL" };
115
116 static {
117 mustProparty = new LinkedHashMap<String,String>();
118 mustProparty.put( "host", "接続?のFTPサーバ?のアドレスまた?、サーバ????)" );
119 mustProparty.put( "user", "接続するユーザー???)" );
120 mustProparty.put( "pass", "接続するユーザーのパスワー???)" );
121 mustProparty.put( "localPath", "上流で検索されたファイルパスのローカル側共通部???)" );
122 mustProparty.put( "remotePath", "上流で検索されたファイルパスのFTP側共通部???)" );
123
124 usableProparty = new LinkedHashMap<String,String>();
125 usableProparty.put( "mode", "扱?ァイルの種?ASCII/BINARY)を指定しま?初期値:ASCII)" );
126 // usableProparty.put( "command", "FTPサーバ?側での処??方?GET/PUT/DEL)を指定しま?初期値:PUT)" );
127 usableProparty.put( "passive", "パッシブモー?ローカルからサーバ?へ接続を張?を利用するかど?(初期値:true)" );
128 usableProparty.put( "mkdirs", "受け側ファイル(GET?LOCAL、PUT?FTPサーバ?)に?レクトリを作?するかど?(初期値:true)" );
129 usableProparty.put( "encode", "日本語ファイル名などのエンコード名を指定しま?初期値:UTF-8)" );
130 usableProparty.put( "timeout", "Dataタイ?ウ?初期値:600 [秒])" );
131 usableProparty.put( "display", "[false/true]:trueは、検索状況を表示しま?初期値:false)" );
132 usableProparty.put( "debug", "????を標準?力に表示する(true)かしな?false)? +
133 CR + "(初期値:false:表示しな?" );
134 }
135
136 /**
137 * ?ォルトコンストラクター?
138 * こ?クラスは、動??されます??ォルトコンストラクターで?
139 * super クラスに対して、?な初期化を行っておきます?
140 *
141 */
142 public Process_FileFtp() {
143 super( "org.opengion.fukurou.process.Process_FileFtp",mustProparty,usableProparty );
144 }
145
146 /**
147 * プロセスの初期化を行います?初めに??、呼び出されます?
148 * 初期処?ファイルオープン??オープン?に使用します?
149 *
150 * @param paramProcess ??タベ?スの接続???などを持って?オブジェク?
151 */
152 public void init( final ParamProcess paramProcess ) {
153 Argument arg = getArgument();
154
155 // String host = arg.getProparty( "host"); // FTPサーバ?
156 // String user = arg.getProparty( "user" ); // ユーザー
157 String pass = arg.getProparty( "pass" ); // パスワー?
158 host = arg.getProparty( "host"); // FTPサーバ?
159 user = arg.getProparty( "user" ); // ユーザー
160 // pass = arg.getProparty( "pass" ); // パスワー?
161
162 ftp = new FTPConnect();
163
164 ftp.setHostUserPass( host , user , pass );
165
166 // localPath と、remotePath をセ?します?
167 localPath = arg.getProparty("localPath" );
168 remotePath = arg.getProparty("remotePath" );
169
170 localPathLen = localPath.length();
171
172 // FTP処??な?パラメータをセ?します?
173 ftp.setMode( arg.getProparty( "mode" ,"ASCII",MODE_LST )); // 扱?ァイルの種類を?します?
174 // ftp.setCommand( "PUT" ); // FTP処??方法を?します?
175 ftp.setPassive( arg.getProparty( "passive" ,true )); // パッシブモードを利用するかど?
176 ftp.setMkdirs( arg.getProparty( "mkdirs" ,true )); // 受け側ファイルに?レクトリを作?するかど?
177 ftp.setEncode( arg.getProparty( "encode" ,"UTF-8" )); // 日本語ファイル名などのエンコード名を指定しま?初期値:UTF-8)
178 ftp.setTimeout( arg.getProparty( "timeout" ,TIMEOUT )); // Dataタイ?ウ?初期値:600 [秒])
179
180 display = arg.getProparty("display",display);
181 debug = arg.getProparty("display",debug);
182 // if( debug ) { println( arg.toString() ); } // 5.7.3.0 (2014/02/07) ????
183
184 ftp.setDisplay( display ); // trueは、検索状況を表示します?(初期値:false)
185 ftp.setDebug( debug ); // ????を標準?力に表示する(true)かしな?false)?
186
187 // FTPConnect を?期化します?
188 ftp.connect();
189 }
190
191 /**
192 * プロセスの終?行います??に??、呼び出されます?
193 * 終???ファイルクローズ??クローズ?に使用します?
194 *
195 * @param isOK ト?タルで、OK?たかど?[true:成功/false:失敗]
196 */
197 public void end( final boolean isOK ) {
198 if( ftp != null ) {
199 ftp.disconnect();
200 }
201 }
202
203 /**
204 * 引数の LineModel を??るメソ?です?
205 * 変換処?? LineModel を返します?
206 * 後続??行わな?????タのフィルタリングを行う場?は?
207 * null ??タを返します?つまり?null ??タは、後続??行わな?
208 * フラグの代わりにも使用して?す?
209 * なお?変換処?? LineModel と、オリジナルの LineModel が?
210 * 同?、コピ?(クローン)か?、各処?ソ??決めて?す?
211 * ドキュメントに明記されて???合?、副作用が問題になる?合??
212 * ???とに自?コピ?(クローン)して下さ??
213 *
214 * @param data オリジナルのLineModel
215 *
216 * @return 処?換後?LineModel
217 */
218 public LineModel action( final LineModel data ) {
219 inCount++ ;
220 final FileLineModel fileData ;
221 if( data instanceof FileLineModel ) {
222 fileData = (FileLineModel)data ;
223 }
224 else {
225 // LineModel ?FileLineModel でな??合?オブジェクトを作?します?
226 fileData = new FileLineModel( data );
227 }
228
229 File localFile = fileData.getFile() ; // LineModel から取得したファイル?
230 if( ! localFile.isFile() ) {
231 if( display ) { println( data.dataLine() ); }
232 return data;
233 }
234
235 String lclFileName = localFile.getAbsolutePath();
236
237 // ファイル名?、引数ファイル?から?localPathを引き、remotePath を加えます?
238 String rmtFileName = remotePath + lclFileName.substring( localPathLen );
239
240 // ftp.setLocalFile( lclFileName ); // ローカルのファイル?
241 // ftp.setRemoteFile( rmtFileName ); // FTP先?ファイル?
242
243 ftp.action( command,lclFileName,rmtFileName );
244
245 if( display ) { println( data.dataLine() ); }
246 return data ;
247 }
248
249 /**
250 * プロセスの処?果のレポ?ト表現を返します?
251 * 処??ログラ?、?力件数、?力件数などの??です?
252 * こ???をそのまま、標準?力に出すことで、結果レポ?トと出来るよ?
253 * 形式で出してください?
254 *
255 * @return 処?果のレポ??
256 */
257 public String report() {
258 String report = "[" + getClass().getName() + "]" + CR
259 + TAB + "Copy Count : " + inCount + CR
260 + TAB + "host : " + host + CR
261 + TAB + "user : " + user + CR
262 + TAB + "localPath : " + localPath + CR
263 + TAB + "remotePath : " + remotePath ;
264
265 return report ;
266 }
267
268 /**
269 * こ?クラスの使用方法を返します?
270 *
271 * @return こ?クラスの使用方?
272 */
273 public String usage() {
274 StringBuilder buf = new StringBuilder();
275
276 buf.append( "Process_FileFtp は、上流から受け取っ?FileLineModel を??? ).append( CR );
277 buf.append( "ChainProcess インターフェースの実?ラスです?" ).append( CR );
278 buf.append( CR );
279 buf.append( "上流から受け取っ?FileLineModel の ファイルから、localPath のローカル共通パス? ).append( CR );
280 buf.append( "remotePath のFTP共通パスに、PFT伝?します?(-command=PUT 処??み) " ).append( CR );
281 buf.append( "ファイルそ?も?の階層構?は、維持されるため、ローカルからFTPサーバ?" ).append( CR );
282 buf.append( "へのフォル?ピ?に近いイメージになります?" ).append( CR );
283 buf.append( CR );
284 buf.append( "Process_FileCopy との違いは、ファイルのエンコード変換は行いません。た?? ).append( CR );
285 buf.append( "FTP伝?での改行コード?変換は?mode=ASCII で?できます?" ).append( CR );
286 buf.append( "もうひとつ、Process_FileCopy では、inPath と outPath でのCOPY処?したが?" ).append( CR );
287 buf.append( "こ?クラスでは、localPath と、remotePath でそれぞれの共通パスを指定します?" ).append( CR );
288 buf.append( CR );
289 buf.append( "上流?ロセスでは、Name 属?として、?File』を持ち、?は、Fileオブジェク? ).append( CR );
290 buf.append( "である、Process_FileSearch を使用するのが?便利です?それ以外?クラス? ).append( CR );
291 buf.append( "使用する場合でも?Name属?と、File オブジェクトを持つ LineModel を受け渡? ).append( CR );
292 buf.append( "できれば、使用可能です?" ).append( CR );
293 buf.append( CR ).append( CR );
294
295 buf.append( getArgument().usage() ).append( CR );
296
297 return buf.toString();
298 }
299
300 /**
301 * こ?クラスは、main メソ?から実行できません?
302 *
303 * @param args コマンド引数配?
304 */
305 public static void main( final String[] args ) {
306 LogWriter.log( new Process_FileFtp().usage() );
307 }
308 }