/* ======================================================================
 The Bodington System Software License, Version 1.0
 
 Copyright (c) 2001 The University of Leeds.  All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
 
 1.  Redistributions of source code must retain the above copyright notice,
 this list of conditions and the following disclaimer.
 
 2.  Redistributions in binary form must reproduce the above copyright
 notice, this list of conditions and the following disclaimer in the
 documentation and/or other materials provided with the distribution.
 
 3.  The end-user documentation included with the redistribution, if any,
 must include the following acknowledgement:  "This product includes
 software developed by the University of Leeds
 (http://www.bodington.org/)."  Alternately, this acknowledgement may
 appear in the software itself, if and wherever such third-party
 acknowledgements normally appear.
 
 4.  The names "Bodington", "Nathan Bodington", "Bodington System",
 "Bodington Open Source Project", and "The University of Leeds" must not be
 used to endorse or promote products derived from this software without
 prior written permission. For written permission, please contact
 d.gardner@leeds.ac.uk.
 
 5.  The name "Bodington" may not appear in the name of products derived
 from this software without prior written permission of the University of
 Leeds.
 
 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  TITLE,  THE IMPLIED WARRANTIES 
 OF QUALITY  AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO 
 EVENT SHALL THE UNIVERSITY OF LEEDS OR ITS CONTRIBUTORS BE LIABLE FOR 
 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 
 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 POSSIBILITY OF SUCH DAMAGE.
 =========================================================
 
 This software was originally created by the University of Leeds and may contain voluntary 
 contributions from others.  For more information on the Bodington Open Source Project, please 
 see http://bodington.org/
 
 ====================================================================== */

package org.bodington.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

/**
 * File for moving and copying files. Uses the new Java IO classes so it should be
 * fast. 
 * @author Jon Maber
 * @author Colin Tatham
 * @author buckett
 */
public class FileMover
{	
    
    /**
     * Copies a file or folder to the folder specified.
     * @param source The file/folder to copy.
     * @param destination The destination.
     * @exception IOException Thrown if there is any problem copying the file/folder.
     */
    public static void copyFile( File source, File destination )
    throws IOException
    {
        try
        {
            cloneFile( source, destination );
        }
        catch (IOException e)
        {
            throw new IOException("Cannot copy file: "+ e.getMessage());
        }
    }
    
    /**
     * Moves a file or folder to the folder specified.
     * @param source The file/folder to move.
     * @param destination The destination.
     * @exception IOException Thrown if there is any problem moving the file/folder.
     */
    public static void moveFile( File source, File destination )
    throws IOException
    {
        try
        {
            cloneFile( source, destination );
        }
        catch (IOException e)
        {
            throw new IOException("Cannot move file: "+ e.getMessage());
        }
        source.delete();
    }
    
    /**
     * Low Level method that does the checks and copies the file.
     */
    private static void cloneFile(File source, File destination) throws IOException
    {
        if ( destination.exists() )
            throw new IOException( source.getAbsolutePath() + " because " + destination.getAbsolutePath() + " already exists." );
        if ( !source.exists() )
            throw new IOException( source.getAbsolutePath() + " because it doesn't exist." );
        if ( !source.isFile() )
            throw new IOException(source.getAbsolutePath() + " because it isn't a file." );
        
        FileChannel sourceChannel = null, destinationChannel = null;
        try
        {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            destinationChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
        }
        finally
        {
            if (sourceChannel != null)
                sourceChannel.close();
            if (destinationChannel != null)
                destinationChannel.close();
        }
    }
    
}