package org.apache.maven.index;

/*
 * 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.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.apache.maven.index.context.DefaultIndexingContext;
import org.apache.maven.index.context.IndexCreator;
import org.apache.maven.index.creator.JarFileContentsIndexCreator;
import org.apache.maven.index.creator.MavenArchetypeArtifactInfoIndexCreator;
import org.apache.maven.index.creator.MavenPluginArtifactInfoIndexCreator;
import org.apache.maven.index.creator.MinimalArtifactInfoIndexCreator;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.FileUtils;

public class AbstractIndexCreatorHelper
    extends PlexusTestCase
{
    public List<IndexCreator> DEFAULT_CREATORS;

    public List<IndexCreator> FULL_CREATORS;

    public List<IndexCreator> MIN_CREATORS;

    Random rand = new Random();

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

        DEFAULT_CREATORS = new ArrayList<IndexCreator>();
        FULL_CREATORS = new ArrayList<IndexCreator>();
        MIN_CREATORS = new ArrayList<IndexCreator>();

        IndexCreator min = lookup( IndexCreator.class, MinimalArtifactInfoIndexCreator.ID );
        IndexCreator mavenPlugin = lookup( IndexCreator.class, MavenPluginArtifactInfoIndexCreator.ID );
        IndexCreator mavenArchetype = lookup( IndexCreator.class, MavenArchetypeArtifactInfoIndexCreator.ID );
        IndexCreator jar = lookup( IndexCreator.class, JarFileContentsIndexCreator.ID );

        MIN_CREATORS.add( min );

        DEFAULT_CREATORS.add( min );
        DEFAULT_CREATORS.add( mavenPlugin );
        DEFAULT_CREATORS.add( mavenArchetype );

        FULL_CREATORS.add( min );
        FULL_CREATORS.add( mavenPlugin );
        FULL_CREATORS.add( mavenArchetype );
        FULL_CREATORS.add( jar );
    }

    protected void deleteDirectory( File dir )
        throws IOException
    {
        FileUtils.deleteDirectory( dir );
    }

    protected File getDirectory( String name )
    {
        // pick random output location

        File outputFolder = new File( getBasedir(), "target/tests/" + name + "-" + rand.nextLong() + "/" );
        outputFolder.delete();
        assertFalse( outputFolder.exists() );
        return outputFolder;
    }

    public void testDirectory()
        throws IOException
    {
        File dir = this.getDirectory( "foo" );
        assert ( dir.getAbsolutePath().contains( "foo" ) );
        this.deleteDirectory( dir );
        assertFalse( dir.exists() );

        File dir2 = this.getDirectory( "foo" );
        assertFalse( "Directories aren't unique", dir.getCanonicalPath().equals( dir2.getCanonicalPath() ) );
    }
}
