001 /** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.camel.component.file.remote; 019 020 import org.apache.camel.Exchange; 021 import org.apache.camel.RuntimeCamelException; 022 import org.apache.commons.net.ftp.FTPClient; 023 024 import java.io.IOException; 025 import java.io.InputStream; 026 027 public class FtpProducer extends RemoteFileProducer<RemoteFileExchange> { 028 FtpEndpoint endpoint; 029 private final FTPClient client; 030 031 public FtpProducer(FtpEndpoint endpoint, FTPClient client) { 032 super(endpoint); 033 this.endpoint = endpoint; 034 this.client = client; 035 } 036 037 public void process(Exchange exchange) throws Exception { 038 process(endpoint.toExchangeType(exchange)); 039 } 040 041 public void process(RemoteFileExchange exchange) throws Exception { 042 final String fileName; 043 InputStream payload = exchange.getIn().getBody(InputStream.class); 044 final String endpointFile = endpoint.getConfiguration().getFile(); 045 client.changeWorkingDirectory(endpointFile); // TODO this line might not be needed... check after finish writing unit tests 046 if (endpointFile == null) { 047 throw new NullPointerException("Null Endpoint File"); 048 } 049 else { 050 if (endpoint.getConfiguration().isDirectory()) { 051 fileName = endpointFile + "/" + exchange.getIn().getMessageId(); 052 } 053 else { 054 fileName = endpointFile; 055 } 056 } 057 buildDirectory(client, fileName.substring(0, fileName.lastIndexOf('/'))); 058 final boolean success = client.storeFile(fileName, payload); 059 if (success) { 060 061 } 062 else { 063 throw new RuntimeCamelException("error sending file"); 064 } 065 } 066 067 @Override 068 protected void doStart() throws Exception { 069 super.doStart(); 070 // client.connect(endpoint.getConfiguration().getHost()); 071 // client.login(endpoint.getConfiguration().getUsername(), endpoint.getConfiguration().getPassword()); 072 // client.setFileType(endpoint.getConfiguration().isBinary() ? FTPClient.BINARY_FILE_TYPE : FTPClient.ASCII_FILE_TYPE); 073 } 074 075 @Override 076 protected void doStop() throws Exception { 077 client.disconnect(); 078 super.doStop(); 079 } 080 081 protected static boolean buildDirectory(FTPClient ftpClient, String dirName) throws IOException { 082 boolean atLeastOneSuccess = false; 083 final StringBuilder sb = new StringBuilder(dirName.length()); 084 final String[] dirs = dirName.split("\\/"); 085 for (String dir : dirs) { 086 sb.append('/').append(dir); 087 final boolean success = ftpClient.makeDirectory(sb.toString()); 088 System.out.println(sb.toString() + " = " + success); 089 if (!atLeastOneSuccess && success) { 090 atLeastOneSuccess = true; 091 } 092 } 093 return atLeastOneSuccess; 094 } 095 }