org.apache.maven.index.Nexus1911IncrementalTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.maven.index.Nexus1911IncrementalTest.java

Source

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.FileInputStream;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import junit.framework.Assert;

import org.apache.lucene.search.IndexSearcher;
import org.apache.maven.index.context.IndexingContext;
import org.apache.maven.index.packer.IndexPacker;
import org.apache.maven.index.packer.IndexPackingRequest;
import org.codehaus.plexus.util.FileUtils;

//FIXME - hardcoded assumptions in test that break with lucene 4, or bugs?
//@Ignore("Segment merge may work differently in Lucene 4")
public class Nexus1911IncrementalTest extends AbstractIndexCreatorHelper {
    NexusIndexer indexer;

    IndexingContext context;

    IndexingContext reindexedContext;

    IndexPacker packer;

    File indexDir;

    File indexPackDir;

    File reposTargetDir;

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

        indexer = lookup(NexusIndexer.class);
        packer = lookup(IndexPacker.class);

        indexDir = super.getDirectory("index/nexus-1911");
        indexPackDir = indexDir; //super.getDirectory( "index/nexus-1911-pack" );

        File reposSrcDir = new File(getBasedir(), "src/test/nexus-1911");
        this.reposTargetDir = super.getDirectory("repos/nexus-1911");

        FileUtils.copyDirectoryStructure(reposSrcDir, reposTargetDir);

        File repo = new File(reposTargetDir, "repo");
        repo.mkdirs();
        reindexedContext = context = indexer.addIndexingContext("test", "test", repo, indexDir, null, null,
                DEFAULT_CREATORS);
        indexer.scan(context);
    }

    @Override
    protected void tearDown() throws Exception {
        indexer.removeIndexingContext(context, true);
        super.deleteDirectory(this.reposTargetDir);
        super.deleteDirectory(this.indexDir);
        super.deleteDirectory(this.indexPackDir);
        super.tearDown();
    }

    public void testNoIncremental() throws Exception {
        final IndexSearcher indexSearcher = context.acquireIndexSearcher();
        try {
            IndexPackingRequest request = new IndexPackingRequest(context, indexSearcher.getIndexReader(),
                    indexPackDir);
            request.setCreateIncrementalChunks(true);
            packer.packIndex(request);
        } finally {
            context.releaseIndexSearcher(indexSearcher);
        }

        Set<String> filenames = getFilenamesFromFiles(indexPackDir.listFiles());
        Properties props = getPropertiesFromFiles(indexPackDir.listFiles());

        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".gz"));
        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".properties"));
        Assert.assertFalse(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".1.gz"));
        Assert.assertFalse(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".2.gz"));

        Assert.assertNotNull(props);

        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "0"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "1"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "2"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "3"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "4"));
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_COUNTER), "0");
        Assert.assertNotNull(props.getProperty(IndexingContext.INDEX_CHAIN_ID));
    }

    public void test1Incremental() throws Exception {
        final IndexSearcher indexSearcher = context.acquireIndexSearcher();
        try {
            IndexPackingRequest request = new IndexPackingRequest(context, indexSearcher.getIndexReader(),
                    indexPackDir);
            request.setCreateIncrementalChunks(true);
            packer.packIndex(request);
        } finally {
            context.releaseIndexSearcher(indexSearcher);
        }

        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-1"),
                IndexPackingRequest.MAX_CHUNKS);

        Set<String> filenames = getFilenamesFromFiles(indexPackDir.listFiles());
        Properties props = getPropertiesFromFiles(indexPackDir.listFiles());

        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".gz"));
        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".properties"));
        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".1.gz"));
        Assert.assertFalse(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".2.gz"));

        Assert.assertNotNull(props);

        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "0"), "1");
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "1"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "2"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "3"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "4"));
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_COUNTER), "1");
        Assert.assertNotNull(props.getProperty(IndexingContext.INDEX_CHAIN_ID));
    }

    public void test2Incremental() throws Exception {
        final IndexSearcher indexSearcher = context.acquireIndexSearcher();
        try {
            IndexPackingRequest request = new IndexPackingRequest(context, indexSearcher.getIndexReader(),
                    indexPackDir);
            request.setCreateIncrementalChunks(true);
            packer.packIndex(request);
        } finally {
            context.releaseIndexSearcher(indexSearcher);
        }

        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-1"),
                IndexPackingRequest.MAX_CHUNKS);
        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-2"),
                IndexPackingRequest.MAX_CHUNKS);

        Set<String> filenames = getFilenamesFromFiles(indexPackDir.listFiles());
        Properties props = getPropertiesFromFiles(indexPackDir.listFiles());

        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".gz"));
        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".properties"));
        //1 is missing with updated Lucene 4 implementation
        //        Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".1.gz" ) );
        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".2.gz"));
        Assert.assertFalse(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".3.gz"));

        Assert.assertNotNull(props);

        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "0"), "2");
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "1"), "1");
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "2"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "3"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "4"));
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_COUNTER), "2");
        Assert.assertNotNull(props.getProperty(IndexingContext.INDEX_CHAIN_ID));
    }

    public void test3Incremental() throws Exception {
        final IndexSearcher indexSearcher = context.acquireIndexSearcher();
        try {
            IndexPackingRequest request = new IndexPackingRequest(context, indexSearcher.getIndexReader(),
                    indexPackDir);
            request.setCreateIncrementalChunks(true);
            packer.packIndex(request);
        } finally {
            context.releaseIndexSearcher(indexSearcher);
        }

        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-1"),
                IndexPackingRequest.MAX_CHUNKS);
        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-2"),
                IndexPackingRequest.MAX_CHUNKS);
        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-3"),
                IndexPackingRequest.MAX_CHUNKS);

        Set<String> filenames = getFilenamesFromFiles(indexPackDir.listFiles());
        Properties props = getPropertiesFromFiles(indexPackDir.listFiles());

        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".gz"));
        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".properties"));
        //1,2 are missing with updated Lucene 4 implementation
        //        Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".1.gz" ) );
        //        Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".2.gz" ) );
        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".3.gz"));

        Assert.assertNotNull(props);

        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "0"), "3");
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "1"), "2");
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "2"), "1");
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "3"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "4"));
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_COUNTER), "3");
        Assert.assertNotNull(props.getProperty(IndexingContext.INDEX_CHAIN_ID));
    }

    public void testMaxChunks() throws Exception {
        final IndexSearcher indexSearcher = context.acquireIndexSearcher();
        try {
            IndexPackingRequest request = new IndexPackingRequest(context, indexSearcher.getIndexReader(),
                    indexPackDir);
            request.setCreateIncrementalChunks(true);
            request.setMaxIndexChunks(3);
            packer.packIndex(request);
        } finally {
            context.releaseIndexSearcher(indexSearcher);
        }

        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-1"), 3);
        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-2"), 3);
        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-3"), 3);
        copyRepoContentsAndReindex(new File(getBasedir(), "src/test/nexus-1911/repo-inc-4"), 3);

        Set<String> filenames = getFilenamesFromFiles(indexPackDir.listFiles());
        Properties props = getPropertiesFromFiles(indexPackDir.listFiles());

        System.out.println(filenames);

        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".gz"));
        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".properties"));
        Assert.assertFalse(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".1.gz"));

        //2,3 are missing with updated Lucene 4 implementation
        //        Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".2.gz" ) );
        //        Assert.assertTrue( filenames.contains( IndexingContext.INDEX_FILE_PREFIX + ".3.gz" ) );
        Assert.assertTrue(filenames.contains(IndexingContext.INDEX_FILE_PREFIX + ".4.gz"));

        Assert.assertNotNull(props);

        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "0"), "4");
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "1"), "3");
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "2"), "2");
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "3"));
        Assert.assertNull(props.getProperty(IndexingContext.INDEX_CHUNK_PREFIX + "4"));
        Assert.assertEquals(props.getProperty(IndexingContext.INDEX_CHUNK_COUNTER), "4");
        Assert.assertNotNull(props.getProperty(IndexingContext.INDEX_CHAIN_ID));
    }

    private void copyRepoContentsAndReindex(File src, int maxIndexChunks) throws Exception {
        File reposTargetDir = new File(getBasedir(), "target/repos/nexus-1911/repo");

        FileUtils.copyDirectoryStructure(src, reposTargetDir);

        // this was ALWAYS broken, if incremental reindex wanted, this has to be TRUE!!!
        // TODO: fix this!
        indexer.scan(reindexedContext, false);

        final IndexSearcher indexSearcher = context.acquireIndexSearcher();
        try {
            IndexPackingRequest request = new IndexPackingRequest(context, indexSearcher.getIndexReader(),
                    indexPackDir);
            request.setCreateIncrementalChunks(true);
            request.setMaxIndexChunks(maxIndexChunks);
            packer.packIndex(request);
        } finally {
            context.releaseIndexSearcher(indexSearcher);
        }
    }

    private Set<String> getFilenamesFromFiles(File[] files) {
        Set<String> filenames = new HashSet<String>();

        for (int i = 0; i < files.length; i++) {
            filenames.add(files[i].getName());
        }

        return filenames;
    }

    private Properties getPropertiesFromFiles(File[] files) throws Exception {
        Properties props = new Properties();
        File propertyFile = null;

        for (int i = 0; i < files.length; i++) {
            if ((IndexingContext.INDEX_REMOTE_PROPERTIES_FILE).equalsIgnoreCase(files[i].getName())) {
                propertyFile = files[i];
                break;
            }
        }

        FileInputStream fis = null;

        try {
            fis = new FileInputStream(propertyFile);
            props.load(fis);
        } finally {
            fis.close();
        }

        return props;
    }
}