Subversion Repositories bacoAlunos

Rev

Rev 1085 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.web;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.UserSessionImpl;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

/**
 * @author Jorge
 * @date 18/Jan/2009
 * @time 18:35:11
 */

public class FtpServer
{
    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(FtpServer.class);


    private static HashMap<String, FtpServer> servers = new HashMap<String, FtpServer>();


    1.5.0/docs/api/java/lang/String.html">String host = null;
    int port = 21;
    1.5.0/docs/api/java/lang/String.html">String username = null;
    1.5.0/docs/api/java/lang/String.html">String password = null;


    public FtpServer(1.5.0/docs/api/java/lang/String.html">String host, int port)
    {
        this.host = host;
        if (port > 0)
            this.port = port;
    }

    public FtpServer(1.5.0/docs/api/java/lang/String.html">String host, int port, 1.5.0/docs/api/java/lang/String.html">String username, 1.5.0/docs/api/java/lang/String.html">String password)
    {
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
    }

    public static FtpServer getFtpServerForCurrentUser(1.5.0/docs/api/java/lang/String.html">String urlStr, HttpServletRequest request) throws 1.5.0/docs/api/java/net/MalformedURLException.html">MalformedURLException
    {
        1.5.0/docs/api/java/net/URL.html">URL url = new 1.5.0/docs/api/java/net/URL.html">URL(urlStr);
        int port = url.getPort();
        if (port <= 0)
            port = 21;
        1.5.0/docs/api/java/lang/String.html">String host = url.getHost();
        UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);
        1.5.0/docs/api/java/lang/String.html">String username = userSession.getUsername();
        1.5.0/docs/api/java/lang/String.html">String password = ((UserSessionImpl)userSession).getUserPasswordInSession();
        return new FtpServer(host,port,username,password);
    }

    private static final int FTP_TIMEOUT_SECONDS = pt.estgp.estgweb.Globals.FTP_TIMEOUT_SECONDS;
    public FTPClient getClient() throws 1.5.0/docs/api/java/io/IOException.html">IOException
    {
        final FTPClient ftp = new MyFTPClient();
        logger.info("CONNECTING... waiting " + FTP_TIMEOUT_SECONDS + " seconds");
        1.5.0/docs/api/java/lang/Thread.html">Thread t = new 1.5.0/docs/api/java/lang/Thread.html">Thread(new 1.5.0/docs/api/java/lang/Runnable.html">Runnable() {
            @1.5.0/docs/api/java/lang/Override.html">Override
            public void run() {
                try {
                    ftp.connect(host, port);
                } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
                    logger.error(e,e);
                }
            }
        });
        t.start();
        try {
            for(int i=0;i<FTP_TIMEOUT_SECONDS;i++)
            {
                1.5.0/docs/api/java/lang/Thread.html">Thread.sleep(1000);
                if(!t.isAlive())
                {
                    if(ftp.isConnected())
                        break;
                }
            }
            if(!ftp.isConnected())
            {
                logger.info("Not Connected will interrupt");
                t.interrupt();
                return null;
            }
        } catch (1.5.0/docs/api/java/lang/InterruptedException.html">InterruptedException e) {
           logger.error(e,e);
        }

        if (username != null && password != null)
        {
            if(ftp.login(username,password))
            {
                return ftp;
            }
        }
        return null;

        /* estava assim
        if (username != null)
            ftp.user(username);
        if (password != null)
            ftp.pass(password);*/

        //return ftp;
    }

    public 1.5.0/docs/api/java/lang/String.html">String getHost()
    {
        return host;
    }

    public void setHost(1.5.0/docs/api/java/lang/String.html">String host)
    {
        this.host = host;
    }

    public int getPort()
    {
        return port;
    }

    public void setPort(int port)
    {
        this.port = port;
    }

    public 1.5.0/docs/api/java/lang/String.html">String getUsername()
    {
        return username;
    }

    public void setUsername(1.5.0/docs/api/java/lang/String.html">String username)
    {
        this.username = username;
    }

    public 1.5.0/docs/api/java/lang/String.html">String getPassword()
    {
        return password;
    }

    public void setPassword(1.5.0/docs/api/java/lang/String.html">String password)
    {
        this.password = password;
    }

    public static FtpServer getServer(1.5.0/docs/api/java/lang/String.html">String urlStr, 1.5.0/docs/api/java/lang/String.html">String user, 1.5.0/docs/api/java/lang/String.html">String pass)
    {
        FtpServer ftpServer = servers.get(urlStr);
        if (ftpServer == null)
            ftpServer = addServer(urlStr, user, pass);
        return ftpServer;
    }

    public static FtpServer getNewServer(1.5.0/docs/api/java/lang/String.html">String urlStr, 1.5.0/docs/api/java/lang/String.html">String user, 1.5.0/docs/api/java/lang/String.html">String pass)
    {

        try
        {
            1.5.0/docs/api/java/net/URL.html">URL url = new 1.5.0/docs/api/java/net/URL.html">URL(urlStr);
            1.5.0/docs/api/java/lang/String.html">String host = url.getHost();
            int port = url.getPort();
            if (port <= 0)
                port = 21;
            logger.info("Connecting to " + host + "in port:" + port);
            return new FtpServer(host, port, user, pass);
        }
        catch (1.5.0/docs/api/java/net/MalformedURLException.html">MalformedURLException e)
        {
            logger.error(e, e);
        }
        catch (1.5.0/docs/api/java/io/IOException.html">IOException e)
        {
            logger.error(e, e);
        }
        return null;

    }

    /**
     * Add a ftpServer to Cache
     *
     * @param urlStr to parse
     * @param user   username
     * @param pass   password
     * @return ftpServer
     */

    private static synchronized FtpServer addServer(1.5.0/docs/api/java/lang/String.html">String urlStr, 1.5.0/docs/api/java/lang/String.html">String user, 1.5.0/docs/api/java/lang/String.html">String pass)
    {
        try
        {
            1.5.0/docs/api/java/net/URL.html">URL url = new 1.5.0/docs/api/java/net/URL.html">URL(urlStr);
            1.5.0/docs/api/java/lang/String.html">String host = url.getHost();
            int port = url.getPort();
            if (port <= 0)
                port = 21;
            logger.info("Connecting to " + host + " in port:" + port);
            FtpServer ftpServer = new FtpServer(host, port, user, pass);
            servers.put(urlStr, ftpServer);
            return ftpServer;
        }
        catch (1.5.0/docs/api/java/net/MalformedURLException.html">MalformedURLException e)
        {
            logger.error(e, e);
        }
        catch (1.5.0/docs/api/java/io/IOException.html">IOException e)
        {
            logger.error(e, e);
        }
        return null;
    }

    public static final int FTP_DATA_STORE_TIMEOUT_SECONDS = pt.estgp.estgweb.Globals.FTP_DATA_STORE_TIMEOUT_SECONDS;
    public class MyFTPClient extends FTPClient implements 1.5.0/docs/api/java/lang/Runnable.html">Runnable
    {
        1.5.0/docs/api/java/lang/String.html">String remote = "";
        5+0%2Fdocs%2Fapi+InputStream">InputStream local = null;
        boolean storeResult = false;

        public void run() {
            try {
                storeResult = super.storeFile(remote, local);
            } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
                logger.error(e,e);
            }
        }
        @1.5.0/docs/api/java/lang/Override.html">Override
        public boolean storeFile(1.5.0/docs/api/java/lang/String.html">String remote, 5+0%2Fdocs%2Fapi+InputStream">InputStream local) throws 1.5.0/docs/api/java/io/IOException.html">IOException
        {
            logger.info("FTP store Timeout protection of " + FTP_DATA_STORE_TIMEOUT_SECONDS + " seconds");
            this.remote = remote;
            this.local = local;
            1.5.0/docs/api/java/lang/Thread.html">Thread t = new 1.5.0/docs/api/java/lang/Thread.html">Thread(this);
            t.start();
            try {
                for(int i=0;i<FTP_DATA_STORE_TIMEOUT_SECONDS;i++)
                {
                    1.5.0/docs/api/java/lang/Thread.html">Thread.sleep(1000);
                    if(!t.isAlive())
                    {
                       break;
                    }
                }
                if(t.isAlive())
                {
                    logger.info("Timeout expired will interrupt");
                    t.interrupt();
                    return false;
                }
            } catch (1.5.0/docs/api/java/lang/InterruptedException.html">InterruptedException e) {
                logger.error(e,e);
            }
            return storeResult;
        }
    }



}