/*
* Copyright 2012 jMethods, Inc.
*
* Licensed 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 com.myjavaworld.ftp.examples;
import java.io.File;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.net.ssl.SSLContext;
import com.myjavaworld.ftp.ConnectionException;
import com.myjavaworld.ftp.ControlConnectionEvent;
import com.myjavaworld.ftp.ControlConnectionListener;
import com.myjavaworld.ftp.FTPClient;
import com.myjavaworld.ftp.FTPConstants;
import com.myjavaworld.ftp.FTPException;
import com.myjavaworld.ftp.ListParser;
import com.myjavaworld.ftp.RemoteFile;
/**
* This example demonstrates how to connect to an FTP site and download a file
* to the local system using SSL. This example assumes that the server is
* already set up for FTP over SSL. In order for this example to work, you must
* have server's certificate installed in <java_home>/lib/security/jssecacerts
* file or <java_home>/lib/security/cacerts file. For more information on this
* and to learn overriding procedures, please refer to the JSSE Reference Guilde
* that ships with JavaDoc 1.4.x. Or visit the URL
* http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html.
*
* @author Sai Pullabhotla, psai [at] jMethods [dot] com
* @version 1.0
*/
public class SSLDownload {
/**
* @param args
* command line arguments.
* @throws InstantiationException
* propogated
* @throws ClassNotFoundException
* propogated
* @throws IllegalAccessException
* propogated
* @throws FTPException
* propogated
* @throws ConnectionException
* propogated
*/
public static void main(String[] args) throws InstantiationException,
ClassNotFoundException, IllegalAccessException, FTPException,
ConnectionException {
// Determine the FTPClient implementation that you would like to use.
// For most FTP servers, the DefaultFTPClient should work.
final String className = "com.myjavaworld.ftp.DefaultFTPClient";
// final String className = "com.myjavaworld.ftp.AS400FTPClient";
final String hostName = "hostname_or_ipaddress";
final String user = "login_name";
final String password = "password";
// Use reflection to find the class and obtain an instance of the class.
FTPClient client = (FTPClient) Class.forName(className).newInstance();
// Add a ControlConnectionListener to look at the client-server
// conversation. This is optional.
client.addControlConnectionListener(new ControlConnectionListener() {
public void commandSent(ControlConnectionEvent evt) {
System.out.println("Command " + evt.getMessage());
}
public void replyReceived(ControlConnectionEvent evt) {
System.out.println("Reply " + evt.getMessage());
}
});
// Determine the directory list parser that we would like to use in this
// session. For most FTP servers, the default implementatiom should work
// fine.
ListParser parser = (ListParser) Class.forName(
"com.myjavaworld.ftp.DefaultListParser").newInstance();
// Set the list parser to use with the FTP client.
client.setListParser(parser);
// Configure for SSL connection.
client.setSSLUsage(FTPConstants.USE_EXPLICIT_SSL);
client.setSSLContext(createSSLContext());
// Connect to the FTP server.
System.out.println("Connecting...");
client.connect(hostName);
System.out.println("Connected. ");
// Login to the FTP server.
System.out.println("Logging in...");
client.login(user, password);
System.out.println("Logged in. ");
// Download a file
RemoteFile source = parser.createRemoteFile("/remote/test.txt", false);
File destination = new File("/local/test.txt");
System.out.println("Downloading: " + source);
client.download(source, destination, FTPConstants.TYPE_ASCII, false);
System.out.println("Done. ");
// Disconnect from the FTP server.
System.out.println("Disconnecting...");
client.disconnect();
System.out.println("Disconnected. ");
}
/**
* Creates and returns a default SSLContext.
*
* @return Default SSL Context.
*/
private static SSLContext createSSLContext() {
try {
SSLContext context = SSLContext.getInstance("SSL");
context.init(null, null, new SecureRandom());
return context;
} catch (KeyManagementException e) {
System.err.println("Failed to initialize SSLContext");
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
System.err.println("Failed to initialize SSLContext");
e.printStackTrace();
}
return null;
}
}