001: /* ClientFTP.java
002: *
003: * $Id: ClientFTP.java 4573 2006-08-31 22:31:23Z paul_jack $
004: *
005: * Created on Jun 5, 2003
006: *
007: * Copyright (C) 2003 Internet Archive.
008: *
009: * This file is part of the Heritrix web crawler (crawler.archive.org).
010: *
011: * Heritrix is free software; you can redistribute it and/or modify
012: * it under the terms of the GNU Lesser Public License as published by
013: * the Free Software Foundation; either version 2.1 of the License, or
014: * any later version.
015: *
016: * Heritrix is distributed in the hope that it will be useful,
017: * but WITHOUT ANY WARRANTY; without even the implied warranty of
018: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
019: * GNU Lesser Public License for more details.
020: *
021: * You should have received a copy of the GNU Lesser Public License
022: * along with Heritrix; if not, write to the Free Software
023: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024: */
025: package org.archive.net;
026:
027: import java.io.IOException;
028: import java.net.Socket;
029:
030: import org.apache.commons.net.ftp.FTPClient;
031: import org.apache.commons.net.ftp.FTPReply;
032:
033: /**
034: * Client for FTP operations. This class is necessary only because the
035: * {@link #_openDataConnection_(int, String)} method is protected in
036: * the superclass, and we need to call it directly to handle directory
037: * listings. (The code that provides directory listings in the
038: * superclass doesn't scale: It reads the entire directory into
039: * an in-memory list).
040: *
041: * <p>Additionally, "strict" methods are provided for the other operations
042: * we use. Maddeningly, the superclass never raises exceptions. If an
043: * FTP operation fails, then the superclass methods generally return false.
044: * A developer then needs to check the {@link FTP#getReplyCode()}
045: * method to see what actually went wrong. The "strict" methods provided
046: * by this class invoke the superclass method, check if the success flag
047: * is false, and then raise an {@link FTPException} with the value of
048: * {@link FTP#getReplyCode()}.
049: *
050: * @author pjack
051: */
052: public class ClientFTP extends FTPClient {
053:
054: /**
055: * Constructs a new <code>ClientFTP</code>.
056: */
057: public ClientFTP() {
058: }
059:
060: /**
061: * Connects to the FTP server at the given host and port.
062: *
063: * @param host the host of the FTP server to connect to
064: * @param port the port the FTP server listens on
065: * @throws IOException if the connection cannot be made due to IO error
066: * @throws FTPException if the server refuses the connection
067: */
068: public void connectStrict(String host, int port) throws IOException {
069: this .connect(host, port);
070: int reply = this .getReplyCode();
071: if (!FTPReply.isPositiveCompletion(reply)) {
072: throw new FTPException(reply);
073: }
074: }
075:
076: /**
077: * Login to the FTP server with the given username and password.
078: *
079: * @param user the username to login under
080: * @param pass the password to use
081: * @throws IOException if a network error occurs
082: * @throws FTPException if the login is rejected by the server
083: * @throws org.apache.commons.net.ftp.FTPConnectionClosedException
084: * if the FTP server prematurely closes the connection (for
085: * instance, if the client was idle for too long)
086: */
087: public void loginStrict(String user, String pass)
088: throws IOException {
089: boolean r = this .login(user, pass);
090: if (!r) {
091: throw new FTPException(this .getReplyCode());
092: }
093: }
094:
095: /**
096: * Tells the FTP server to send binary files.
097: *
098: * @throws IOException if a network error occurs
099: * @throws FTPException if the server rejects the command
100: * @throws org.apache.commons.net.ftp.FTPConnectionClosedException
101: * if the FTP server prematurely closes the connection (for
102: * instance, if the client was idle for too long)
103: */
104: public void setBinary() throws IOException {
105: boolean r = super .setFileType(BINARY_FILE_TYPE);
106: if (!r) {
107: throw new FTPException(getReplyCode());
108: }
109: }
110:
111: /**
112: * Opens a data connection.
113: *
114: * @param command the data command (eg, RETR or LIST)
115: * @param path the path of the file to retrieve
116: * @return the socket to read data from
117: * @throws IOException if a network error occurs
118: * @throws FTPException if a protocol error occurs
119: */
120: public Socket openDataConnection(int command, String path)
121: throws IOException {
122: Socket socket = _openDataConnection_(command, path);
123: if (socket == null) {
124: throw new FTPException(this.getReplyCode());
125: }
126: return socket;
127: }
128:
129: }
|