/******************************************************************************
 * Copyright (c) 2008 Oracle
 * 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:
 *    Konstantin Komissarchik - initial implementation and ongoing maintenance
 ******************************************************************************/

package org.eclipse.wst.common.project.facet.core.util.internal;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.project.facet.core.internal.FacetCorePlugin;
import org.osgi.framework.Bundle;

/**
 * Contains utility functions for dealing with files.
 * 
 * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
 */

public final class FileUtil
{
    public static final String UTF8_ENCODING = "UTF-8"; //$NON-NLS-1$
    public static final String FILE_DOT_PROJECT = ".project"; //$NON-NLS-1$
    
    private FileUtil() {}
    
    public static void validateEdit( final IFile... files )
    
        throws CoreException
        
    {
        final IWorkspace ws = ResourcesPlugin.getWorkspace();
        final IStatus st = ws.validateEdit( files, IWorkspace.VALIDATE_PROMPT );
        
        if( st.getSeverity() == IStatus.ERROR )
        {
            throw new CoreException( st );
        }
    }
    
    public static boolean validateEdit( final Set<IFile> files )
    {
        final IFile[] filesArray = files.toArray( new IFile[ files.size() ] );
        
        Arrays.sort
        ( 
            filesArray, 
            new Comparator<IFile>()
            {
                public int compare( final IFile file1, 
                                    final IFile file2 )
                {
                    final String path1 = file1.getFullPath().toOSString();
                    final String path2 = file2.getFullPath().toOSString();
                    
                    return path1.compareTo( path2 );
                }
            }
        );
        
        final IWorkspace ws = ResourcesPlugin.getWorkspace();
        final IStatus st = ws.validateEdit( filesArray, IWorkspace.VALIDATE_PROMPT );
        
        return ( st.getSeverity() != IStatus.ERROR );
    }
    
    /**
     * Copies a resource from a plugin to a destination in the workspace.
     *
     * @param pluginId the plugin id
     * @param pathInPlugin the path of the resource within the plugin
     * @param destination the destination path within the workspace
     */
    
    public static void copyFromPlugin( final String pluginId,
                                       final IPath pathInPlugin,
                                       final IFile destination )

        throws CoreException

    {
        copyFromPlugin( pluginId, pathInPlugin, destination.getLocation().toFile() );
    }
    
    /**
     * Copies a resource from a plugin to a destination in the workspace.
     *
     * @param bundle the plugin bundle
     * @param pathInPlugin the path of the resource within the plugin
     * @param destination the destination path within the workspace
     */

    public static void copyFromPlugin( final Bundle bundle,
                                       final IPath pathInPlugin,
                                       final IFile destination )

        throws CoreException

    {
        copyFromPlugin( bundle, pathInPlugin, destination.getLocation().toFile() );
    }
    
    /**
     * Copies a resource from a plugin to a destination on the file system.
     *
     * @param pluginId the plugin id
     * @param pathInPlugin the path of the resource within the plugin
     * @param destination the destination path within the workspace
     */
    
    public static void copyFromPlugin( final String pluginId,
                                       final IPath pathInPlugin,
                                       final File destination )
    
        throws CoreException
        
    {
        final Bundle bundle = Platform.getBundle( pluginId );
        copyFromPlugin( bundle, pathInPlugin, destination );
    }
    
    /**
     * Copies a resource from a plugin to a destination on the file system.
     *
     * @param bundle the plugin bundle
     * @param pathInPlugin the path of the resource within the plugin
     * @param destination the destination path within the workspace
     */

    public static void copyFromPlugin( final Bundle bundle,
                                       final IPath pathInPlugin,
                                       final File destination )
    
        throws CoreException
        
    {
        final InputStream contents = readFileFromPlugin( bundle, pathInPlugin );
        
        try
        {
            writeFile( destination, contents );
        }
        finally
        {
            try
            {
                contents.close();
            }
            catch( Exception e ) {}
        }
    }
    
    public static InputStream readFileFromPlugin( final Bundle bundle,
                                                  final IPath pathInPlugin )
    
        throws CoreException
        
    {
        try
        {
            return FileLocator.openStream( bundle, pathInPlugin, false );
        }
        catch( IOException e )
        {
            throw new CoreException( FacetCorePlugin.createErrorStatus( e.getMessage(), e ) );
        }
    }
    
    public static IFile getWorkspaceFile( final File f )
    {
        final IWorkspace ws = ResourcesPlugin.getWorkspace();
        final IWorkspaceRoot wsroot = ws.getRoot();
        final IPath path = new Path( f.getAbsolutePath() );
        
        final IFile[] wsFiles = wsroot.findFilesForLocation( path );
        
        if( wsFiles.length > 0 )
        {
            return wsFiles[ 0 ];
        }
        
        return null;
    }
    
    public static IContainer getWorkspaceContainer( final File f )
    {
        final IWorkspace ws = ResourcesPlugin.getWorkspace();
        final IWorkspaceRoot wsroot = ws.getRoot();
        final IPath path = new Path( f.getAbsolutePath() );
        
        final IContainer[] wsContainers = wsroot.findContainersForLocation( path );
        
        if( wsContainers.length > 0 )
        {
            return wsContainers[ 0 ];
        }
        
        return null;
    }
    
    public static void mkdirs( final File f )
    
        throws CoreException
        
    {
        if( f.exists() )
        {
            if( f.isFile() )
            {
                final String msg
                    = NLS.bind( Resources.locationIsFile, 
                                f.getAbsolutePath() );
                
                throw new CoreException( FacetCorePlugin.createErrorStatus( msg ) );
            }
        }
        else
        {
            mkdirs( f.getParentFile() );
            
            final IContainer wsContainer = getWorkspaceContainer( f );
            
            if( wsContainer != null )
            {
                // Should be a folder...
                
                final IFolder iFolder = (IFolder) wsContainer;
                iFolder.create( true, true, null );
            }
            else
            {
                final boolean isSuccessful = f.mkdir();
                
                if( ! isSuccessful )
                {
                    final String msg
                        = NLS.bind( Resources.failedToCreateDirectory, 
                                    f.getAbsolutePath() );
                    
                    throw new CoreException( FacetCorePlugin.createErrorStatus( msg ) );
                }
            }
        }
    }
    
    public static void writeFile( final IFile f,
                                  final String contents )
    
        throws CoreException
        
    {
        writeFile( f.getLocation().toFile(), contents );
    }
    
    public static void writeFile( final IFile f,
                                  final byte[] contents )
    
        throws CoreException
        
    {
        writeFile( f.getLocation().toFile(), contents );
    }

    public static void writeFile( final IFile f,
                                  final InputStream contents )
    
        throws CoreException
        
    {
        writeFile( f.getLocation().toFile(), contents );
    }

    public static void writeFile( final File f,
                                  final String contents )
    
        throws CoreException
        
    {
        try
        {
            writeFile( f, contents.getBytes( UTF8_ENCODING ) );
        }
        catch( UnsupportedEncodingException e )
        {
            throw new RuntimeException( e );
        }
    }
    
    public static void writeFile( final File f,
                                  final byte[] contents )
    
        throws CoreException
        
    {
        writeFile( f, new ByteArrayInputStream( contents ) );
    }
    
    public static void writeFile( final File f,
                                  final InputStream contents )
    
        throws CoreException
        
    {
        if( f.exists() )
        {
            if( f.isDirectory() )
            {
                final String msg
                    = NLS.bind( Resources.locationIsDirectory, 
                                f.getAbsolutePath() );
                
                throw new CoreException( FacetCorePlugin.createErrorStatus( msg ) );
            }
        }
        else
        {
            mkdirs( f.getParentFile() );
        }
        
        final IFile wsfile = getWorkspaceFile( f );

        if( wsfile != null )
        {
            validateEdit( new IFile[] { wsfile } );
            
            if( wsfile.exists() )
            {
                wsfile.setContents( contents, true, false, null );
            }
            else
            {
                wsfile.create( contents, true, null );
            }
        }
        else
        {
            if( f.exists() && ! f.canWrite())
            {
                final String msg
                    = NLS.bind( Resources.cannotWriteFile, 
                                f.getAbsolutePath() );
                
                throw new CoreException( FacetCorePlugin.createErrorStatus( msg ) );
            }
            
            final byte[] buffer = new byte[ 1024 ];
            FileOutputStream out = null;
            
            try
            {
                out = new FileOutputStream( f );
                
                for( int count; ( count = contents.read( buffer ) ) != -1; )
                {
                    out.write( buffer, 0, count );
                }
                
                out.flush();
            }
            catch( IOException e )
            {
                final String msg 
                    = NLS.bind( Resources.failedWhileWriting, f.getAbsolutePath() );
                
                throw new CoreException( FacetCorePlugin.createErrorStatus( msg, e ) );
            }
            finally
            {
                if( out != null )
                {
                    try
                    {
                        out.close();
                    }
                    catch( IOException e ) {}
                }
            }
        }
    }
    
    public static void deleteFile( final File file )
    
        throws CoreException
        
    {
        final IFile wsfile = getWorkspaceFile( file );
        
        if( wsfile != null )
        {
            wsfile.delete( true, null );
        }
        else
        {
            file.delete();
        }
    }

    private static final class Resources
    
        extends NLS
        
    {
        public static String failedWhileWriting;
        public static String cannotWriteFile;
        public static String failedToCreateDirectory;
        public static String locationIsDirectory;
        public static String locationIsFile;
        
        static
        {
            initializeMessages( FileUtil.class.getName(), 
                                Resources.class );
        }
    }
    
}
