All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.soitoolkit.commons.mule.ftp.FtpUtil Maven / Gradle / Ivy

There is a newer version: 2.0.0-M6
Show newest version
/* 
 * Licensed to the soi-toolkit project under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The soi-toolkit project licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.soitoolkit.commons.mule.ftp;

import static org.soitoolkit.commons.mule.util.MuleUtil.getImmutableEndpoint;

import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.mule.api.MuleContext;
import org.mule.api.endpoint.EndpointURI;
import org.mule.api.endpoint.ImmutableEndpoint;
import org.mule.transport.ftp.FtpConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Helper methods for the FTP-transport.
 * 
 * @author Magnus Larsson
 */
public class FtpUtil {
	
	private static final Logger logger = LoggerFactory.getLogger(FtpUtil.class);
	
	public static final int FTP_FILE_NOT_FOUND = 550;
	public static final int FTP_PATH_CREATED   = 257;

	/**
	 * Ensures that the directory exists and is writable by deleting the
	 * directory and then recreate it.
	 * 
	 * @param muleContext 
	 * @param endpointName
	 * @throws Exception 
	 */
	public static void initEndpointDirectory(MuleContext muleContext, String endpointName) throws Exception {

		logger.info("Init directory for endpoint: {}", endpointName);
		
		FTPClient ftpClient = null;

		try {
			ftpClient = getFtpClient(muleContext, endpointName);
	
			EndpointURI endpointURI = getImmutableEndpoint(muleContext, endpointName).getEndpointURI();
			String path = endpointURI.getPath();
	
			try {
				if (path.startsWith("/~/")) {
					path = path.substring(3); // Strip off the leading "/~/" to apply the command to the home-folder
				
				} else if (path.startsWith("/")) {
					path = path.substring(1); // Strip off the leading "/" to apply the command to the home-folder
				}
				recursiveDeleteDirectory(ftpClient, path);
				recursiveCreateDirectory(ftpClient, path);
			} catch (IOException e) {
				if (logger.isErrorEnabled()) logger.error("Failed to recursivly delete endpoint " + endpointName, e);
			}
			
		} finally {
			if (ftpClient != null) {
				ftpClient.disconnect();
			}
		}
	}
	
	/**
	 * Deletes a directory with all its files and sub-directories.
	 * 
	 * @param ftpClient
	 * @param path
	 * @throws IOException
	 */
	static public void recursiveDeleteDirectory(FTPClient ftpClient, String path) throws IOException {

		logger.info("Delete directory: {}", path);
		
		FTPFile[] ftpFiles = ftpClient.listFiles(path);
		logger.debug("Number of files that will be deleted: {}", ftpFiles.length);
		
		for (FTPFile ftpFile : ftpFiles){
			String filename = path + "/" + ftpFile.getName();
			if (ftpFile.getType() == FTPFile.FILE_TYPE) {
				boolean deleted = ftpClient.deleteFile(filename);
				logger.debug("Deleted {}? {}", filename, deleted);
			} else {
				recursiveDeleteDirectory(ftpClient, filename);
			}
		}

		boolean dirDeleted = ftpClient.deleteFile(path);
		logger.debug("Directory {} deleted: {}", path, dirDeleted);
	}

	/**
	 * Create a directory and all missing parent-directories.
	 * 
	 * @param ftpClient
	 * @param path
	 * @throws IOException
	 */
	static public void recursiveCreateDirectory(FTPClient ftpClient, String path) throws IOException {

		logger.info("Create Directory: {}", path);
		int createDirectoryStatus = ftpClient.mkd(path); // makeDirectory...
		logger.debug("Create Directory Status: {}", createDirectoryStatus);
		
		if (createDirectoryStatus == FTP_FILE_NOT_FOUND) {
			int sepIdx = path.lastIndexOf('/');
			if (sepIdx > -1) {
				String parentPath = path.substring(0, sepIdx);
				recursiveCreateDirectory(ftpClient, parentPath);

				logger.debug("2'nd CreateD irectory: {}", path);
				createDirectoryStatus = ftpClient.mkd(path); // makeDirectory...
				logger.debug("2'nd Create Directory Status: {}", createDirectoryStatus);
			}
		}
	}
	
	private static FTPClient getFtpClient(MuleContext muleContext, String endpointName) throws Exception {
		
		ImmutableEndpoint endpoint = getImmutableEndpoint(muleContext, endpointName);
		FtpConnector c = (FtpConnector)endpoint.getConnector();
		
		return c.getFtp(endpoint.getEndpointURI());
	}	
	
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy