package org.apache.felix.bundleplugin;


/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.io.File;
import java.util.Collections;
import java.util.Map;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.plugin.testing.stubs.ArtifactStub;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;


/**
 * Test for {@link BundleAllPlugin}
 *
 * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
 */
public class BundleAllPluginTest extends AbstractBundlePluginTest
{

    private BundleAllPlugin plugin;


    @Override
    protected void setUp() throws Exception
    {
        super.setUp();
        init();
    }


    private void init() throws Exception
    {
        plugin = new BundleAllPlugin();
        File baseDirectory = new File( getBasedir() );
        File buildDirectory = new File( baseDirectory, "target" );
        plugin.setBuildDirectory( buildDirectory.getPath() );
        File outputDirectory = new File( buildDirectory, "test-classes" );
        plugin.setOutputDirectory( outputDirectory );
        setVariableValueToObject(plugin, "m_dependencyGraphBuilder", lookup(DependencyGraphBuilder.class.getName(), "default"));
    }


    public void testSnapshotMatch()
    {
        ArtifactStub artifact = getArtifactStub();
        String bundleName;

        artifact.setVersion( "2.1-SNAPSHOT" );
        bundleName = "group.artifact_2.1.0.20070207_193904_2.jar";

        assertTrue( plugin.snapshotMatch( artifact, bundleName ) );

        artifact.setVersion( "2-SNAPSHOT" );
        assertFalse( plugin.snapshotMatch( artifact, bundleName ) );

        artifact.setArtifactId( "artifactx" );
        artifact.setVersion( "2.1-SNAPSHOT" );
        assertFalse( plugin.snapshotMatch( artifact, bundleName ) );
    }


    public void testNoReBundling() throws Exception
    {
        File testFile = getTestFile( "target/test-classes/org.apache.maven.maven-model_1.0.0.0.jar" );
        if ( testFile.exists() )
        {
            testFile.delete();
        }

        VersionRange versionRange = VersionRange.createFromVersion("1.0.0.0");
        ArtifactHandler artifactHandler = new DefaultArtifactHandler( "jar" );
        Artifact artifact = new DefaultArtifact("group","artifact",versionRange, null, "jar", null, artifactHandler);

        MavenProject project = getMavenProjectStub();
        project.setGroupId( artifact.getGroupId() );
        project.setArtifactId( artifact.getArtifactId() );
        project.setVersion( artifact.getVersion() );
        project.setArtifact( artifact );
        project.setArtifacts( Collections.EMPTY_SET );
        project.setDependencyArtifacts( Collections.EMPTY_SET );
        File bundleFile = getTestFile( "src/test/resources/org.apache.maven.maven-model_2.1.0.SNAPSHOT.jar" );
        artifact.setFile( bundleFile );

        BundleInfo bundleInfo = plugin.bundle( project );

        Map exports = bundleInfo.getExportedPackages();
        String[] packages = new String[]
            { "org.apache.maven.model.io.jdom", "org.apache.maven.model" };

        for ( int i = 0; i < packages.length; i++ )
        {
            assertTrue( "Bundle info does not contain a package that it is  exported in the manifest: " + packages[i],
                exports.containsKey( packages[i] ) );
        }

        assertFalse( "Bundle info contains a package that it is not exported in the manifest",
            exports.containsKey( "org.apache.maven.model.io.xpp3" ) );
    }

    //    public void testRewriting()
    //        throws Exception
    //    {
    //
    //        MavenProjectStub project = new MavenProjectStub();
    //        project.setArtifact( getArtifactStub() );
    //        project.getArtifact().setFile( getTestBundle() );
    //        project.setDependencyArtifacts( Collections.EMPTY_SET );
    //        project.setVersion( project.getArtifact().getVersion() );
    //
    //        File output = new File( plugin.getBuildDirectory(), plugin.getBundleName( project ) );
    //        boolean delete = output.delete();
    //
    //        plugin.bundle( project );
    //
    //        init();
    //        try
    //        {
    //            plugin.bundle( project );
    //            fail();
    //        }
    //        catch ( RuntimeException e )
    //        {
    //            // expected
    //        }
    //    }
}
