ch.ngiger.comm.ftp.FtpServer.java Source code

Java tutorial

Introduction

Here is the source code for ch.ngiger.comm.ftp.FtpServer.java

Source

/*******************************************************************************
 * Copyright (c) 2010, Elexis
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Based on programm version 1.0 of Julian Robichaux, http://www.nsftools.com
 *    Michael Imhof - adapted
 *    
 *******************************************************************************/

package ch.ngiger.comm.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.elexis.core.data.interfaces.events.MessageEvent;
import ch.elexis.core.data.util.FileUtility;

/**
 * This is a basic wrapper around the sun.net.ftp.FtpClient class, which is included with Sun Java
 * that allows you to make FTP connections and file transfers.
 * <p>
 * Based on programm version 1.0 of Julian Robichaux, http://www.nsftools.com
 * http://www.nsftools.com/tips/SunFtpWrapper.java
 * 
 * @author Immi
 * @version 1.0
 */
public class FtpServer extends FTPClient {

    private String fullSemaName;
    private String serverAddress;
    private static Logger logger = LoggerFactory.getLogger(FTPClient.class);

    private void setWorkingDirectory(String serverFile) throws IOException {
        String path = FileUtility.getFilepath(serverFile);
        if (path != null && path.length() > 0) {
            changeWorkingDirectory(path);
        }
    }

    /**
     * Download a file from the server, and save it to the specified local file
     */
    public void downloadFile(String remoteFilenamePath, String localFilenamePath) throws IOException {
        setWorkingDirectory(remoteFilenamePath);
        String remoteFile = FileUtility.getFilename(remoteFilenamePath);

        FileOutputStream localFile = null;

        try {
            localFile = new FileOutputStream(localFilenamePath);
            if (!retrieveFile(remoteFile, localFile)) {
                throw new IOException("File not received succesfully: " //$NON-NLS-1$
                        + getReplyString());
            }
        } finally {
            if (localFile != null) {
                localFile.close();
            }
        }
    }

    /*
     * Delete file on the FTP server
     * 
     * @name of the file to delete
     */
    public boolean deleteFile(String name) throws IOException {
        return super.deleteFile(name);
    }

    /**
     * Upload a file to the server
     */
    public boolean uploadFile(String remoteFilenamePath, String localFilenamePath) throws IOException {
        setWorkingDirectory(remoteFilenamePath);
        String remoteFile = FileUtility.getFilename(remoteFilenamePath);

        FileInputStream localFile = null;

        try {
            localFile = new FileInputStream(localFilenamePath);

            if (!storeFile(remoteFile, localFile)) {
                throw new IOException("File not sent succesfully: " //$NON-NLS-1$
                        + getReplyString());
            }
        } finally {
            if (localFile != null) {
                localFile.close();
            }
        }
        return true;
    }

    /**
     * Disconnect from Server
     */
    public void disconnect() throws IOException {
        if (isConnected()) {
            super.disconnect();
        }
    }

    /**
     * List of filenames on ftp server
     */
    public String[] listNames() throws IOException {
        String[] files = super.listNames();
        if (files == null) {
            return new String[0];
        }
        return files;
    }

    /**
     * List of files on ftp server
     */
    public FTPFile[] listFiles() throws IOException {
        FTPFile[] files = super.listFiles();
        if (files == null) {
            return new FTPFile[0];
        }
        return files;
    }

    public void openConnection(String host, String user, String pwd) throws IOException {

        if (!isConnected()) {
            connect(host);
            serverAddress = host;
            mode(FtpServer.BINARY_FILE_TYPE);
        }

        if (isConnected()) {
            if (!login(user, pwd)) {
                throw new IOException(getReplyStrings()[0]);
            }
        }

        enterLocalPassiveMode();
    }

    public void closeConnection() throws IOException {
        if (isConnected()) {
            super.disconnect();
        }
    }

    private void uploadSemaphore(String semaName) throws IOException {
        fullSemaName = System.getProperty("user.home", "") + //$NON-NLS-1$ 
                System.getProperty("file.separator") + semaName; //$NON-NLS-1$
        File file = new File(fullSemaName); //$NON-NLS-1$
        file.createNewFile();
        uploadFile(file.getName(), file.getPath());
    }

    /**
     * Copy a file to the FTP server as a simple kind of semaphore. We will upload ourFile. Once
     * this is done, we get the list of all files and verify that their file is not there Not thread
     * safe in any way!!!!
     */
    public void addSemaphore(String downloadDir, String ourFile, String theirFile) throws FtpSemaException {
        try {
            uploadSemaphore(ourFile);
            // Teamw.sem checken
            String[] filenameList = this.listNames();
            for (String filename : filenameList) {
                if (filename.toLowerCase().equals(theirFile)) {
                    throw new FtpSemaException("FtpServer.semaphore.error"); //$NON-NLS-1$
                }
            }
        } catch (IOException e) {
            throw new FtpSemaException(e);
        }
    }

    /**
     * praxis.sem auf FTP Server loeschen
     */
    public void removeSemaphore() throws IOException {
        String name = new File(fullSemaName).getName();
        boolean res = super.deleteFile(name);
        if (res) {
            logger.info(String.format("Deleted semaphore %s on %s", name, serverAddress)); //$NON-NLS-1$
        } else {
            logger.error(String.format("Unable to delete semaphore %s on %s", name, serverAddress)); //$NON-NLS-1$
            MessageEvent.fireError("FTP Semaphore delete error",
                    String.format("Unable to delete semaphore %s on %s", name, serverAddress));
        }
    }
}