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 org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.maven.index.context.IndexingContext;

public class FSDirectoryDeleteTest
    extends AbstractIndexCreatorHelper
{
    protected NexusIndexer nexusIndexer;

    protected File repo = new File( getBasedir(), "src/test/nexus-13" );

    protected IndexingContext context;

    protected File indexDirFile = super.getDirectory( "fsdirectorytest/one" );

    protected Directory indexDir;

    protected IndexingContext otherContext;

    protected File otherIndexDirFile = super.getDirectory( "fsdirectorytest/other" );

    protected Directory otherIndexDir;

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

        nexusIndexer = lookup( NexusIndexer.class );

        indexDir = FSDirectory.open( indexDirFile );

        context = nexusIndexer.addIndexingContext( "one", "nexus-13", repo, indexDir, null, null, DEFAULT_CREATORS );

        nexusIndexer.scan( context );

        otherIndexDir = FSDirectory.open( otherIndexDirFile );

        otherContext =
            nexusIndexer.addIndexingContext( "other", "nexus-13", repo, otherIndexDir, null, null, DEFAULT_CREATORS );

        nexusIndexer.scan( otherContext );
    }

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

        nexusIndexer.removeIndexingContext( context, true );

        nexusIndexer.removeIndexingContext( otherContext, true );

        super.deleteDirectory( indexDirFile );

        super.deleteDirectory( otherIndexDirFile );
    }

    public void testIndexAndDelete()
        throws Exception
    {
        final IndexSearcher indexSearcher = context.acquireIndexSearcher();
        final IndexSearcher otherIndexSearcher = otherContext.acquireIndexSearcher();
        
        indexSearcher.getIndexReader().maxDoc();
        otherIndexSearcher.getIndexReader().maxDoc();
        
        context.releaseIndexSearcher( indexSearcher );
        otherContext.releaseIndexSearcher( otherIndexSearcher );

        context.replace( otherIndexDir );

        context.merge( otherIndexDir );
    }
}
