package org.codehaus.mojo.natives.plugin;

/*
 * The MIT License
 * 
 * Copyright (c) 2004, The Codehaus
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
 * associated documentation files (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all copies or
 * substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.archiver.manager.ArchiverManager;

/**
 * Unpack any .inczip dependencies to be included as system include path
 *
 * @goal unzipinc
 * @phase generate-sources
 * @requiresDependencyResolution compile
 *
 * @since 1.0-alpha-4
 */
public class NativeUnZipIncMojo
    extends AbstractNativeMojo
{

    /**
     * Internal
     * @parameter default-value="${project.build.directory}/native/markers"
     * @required
     * @since 1.0-alpha-4
     */
    private File dependencyIncZipMarkerDirectory;
    
    /**
     * Internal component for archiving purposes
     * 
     * @component
     * @readonly
     * @since 1.0-alpha-4
     */
    private ArchiverManager archiverManager;
    

    public void execute()
        throws MojoExecutionException
    {
        if ( unpackIncZipDepenedencies() )
        {
            this.getPluginContext().put( AbstractNativeMojo.INCZIP_FOUND, new Boolean( "true") );
        }
    }

    private boolean unpackIncZipDepenedencies()
        throws MojoExecutionException
    {
        List files = getIncZipDependencies();

        Iterator iter = files.iterator();

        for ( int i = 0; i < files.size(); ++i )
        {
            Artifact artifact = (Artifact) iter.next();
            File incZipFile = artifact.getFile();

            File marker = new File( this.dependencyIncZipMarkerDirectory, artifact.getGroupId() + "."
                + artifact.getArtifactId() );

            if ( !marker.exists() || marker.lastModified() < incZipFile.lastModified() )
            {
                try
                {
                    unpackZipFile( incZipFile );

                    marker.delete();

                    if ( ! dependencyIncZipMarkerDirectory.exists() )
                    {
                        dependencyIncZipMarkerDirectory.mkdirs();
                    }

                    marker.createNewFile();
                }
                catch ( IOException e )
                {
                    throw new MojoExecutionException( e.getMessage(), e );
                }
            }
        }

        return files.size() != 0;

    }

    protected void unpackZipFile( File zipFile )
        throws MojoExecutionException
    {
        System.out.println( "Unpacking: " + zipFile );

        try
        {
            if ( ! dependencyIncludeDirectory.exists() )
            {
                dependencyIncludeDirectory.mkdirs();
            }
            
            
            UnArchiver archiver = this.archiverManager.getUnArchiver( "zip" );
            archiver.setOverwrite( true );
            archiver.setDestDirectory( this.dependencyIncludeDirectory );
            archiver.setSourceFile( zipFile );
            archiver.extract();
        }
        catch ( Exception e )
        {
            throw new MojoExecutionException( e.getMessage(), e );
        }

    }

    /**
     * Get all .inczip compile time dependencies  
     * @return
     */
    private List getIncZipDependencies()
    {
        List list = new ArrayList();

        Set artifacts = this.project.getDependencyArtifacts();

        if ( artifacts != null )
        {
            for ( Iterator iter = artifacts.iterator(); iter.hasNext(); )
            {
                Artifact artifact = (Artifact) iter.next();

                //pick up only native header archive
                if ( !INCZIP_TYPE.equals( artifact.getType() ) )
                {
                    continue;
                }

                list.add( artifact );
            }
        }

        return list;
    }

}

@@ -3712,26 +3712,26 @@
     
-System.out.println
+this.getLog().info
 ( %22U

use logger instead of System.out