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

Java tutorial

Introduction

Here is the source code for org.apache.maven.index.SearchWithAnEmptyIndexTest.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 org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.maven.index.context.IndexCreator;
import org.apache.maven.index.context.IndexingContext;
import org.apache.maven.index.expr.StringSearchExpression;
import org.apache.maven.index.packer.IndexPacker;
import org.apache.maven.index.packer.IndexPackingRequest;
import org.codehaus.plexus.util.FileUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author Olivier Lamy
 */
public class SearchWithAnEmptyIndexTest extends AbstractTestSupport {
    static final String INDEX_ID1 = "osgi-test1";
    static final String INDEX_ID2 = "empty-repo";
    protected List<IndexCreator> indexCreators;
    private NexusIndexer nexusIndexer;
    private IndexPacker indexPacker;

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

        indexCreators = this.getContainer().lookupList(IndexCreator.class);

        nexusIndexer = this.lookup(NexusIndexer.class);

        indexPacker = this.lookup(IndexPacker.class);

        if (!nexusIndexer.getIndexingContexts().isEmpty()) {
            for (IndexingContext context : nexusIndexer.getIndexingContexts().values()) {
                nexusIndexer.removeIndexingContext(context, true);
            }
        }
    }

    public void testWithTwoContextWithOneEmptyFirstInContextsListSearchFlat() throws Exception {

        String repoPath = "target/test/empty-repo-for-searchtest";

        File emptyRepo = new File(getBasedir(), repoPath);

        if (emptyRepo.exists()) {
            FileUtils.deleteDirectory(emptyRepo);
        }

        emptyRepo.mkdirs();

        //createIndex( "/src/test/repo", repoPath + "/.index", INDEX_ID2 );
        createIndex(repoPath, repoPath, INDEX_ID2);

        createIndex("src/test/repo-with-osgi", "target/test/repo-with-osgi/", INDEX_ID1);

        try {
            BooleanQuery q = new BooleanQuery();

            q.add(nexusIndexer.constructQuery(OSGI.SYMBOLIC_NAME,
                    new StringSearchExpression("org.apache.karaf.features.command")), BooleanClause.Occur.MUST);

            FlatSearchRequest request = new FlatSearchRequest(q);
            assertEquals(2, nexusIndexer.getIndexingContexts().values().size());
            request.setContexts(Arrays.asList(nexusIndexer.getIndexingContexts().get(INDEX_ID2),
                    nexusIndexer.getIndexingContexts().get(INDEX_ID1)));

            FlatSearchResponse response = nexusIndexer.searchFlat(request);

            assertEquals(1, response.getResults().size());

            q = new BooleanQuery();

            q.add(nexusIndexer.constructQuery(OSGI.SYMBOLIC_NAME,
                    new StringSearchExpression("org.apache.karaf.features.core")), BooleanClause.Occur.MUST);

            request = new FlatSearchRequest(q);
            request.setContexts(new ArrayList(nexusIndexer.getIndexingContexts().values()));

            response = nexusIndexer.searchFlat(request);

            assertEquals(3, response.getResults().size());

            String term = "org.apache.karaf.features";

            q = new BooleanQuery();

            q.add(nexusIndexer.constructQuery(MAVEN.GROUP_ID, new StringSearchExpression(term)),
                    BooleanClause.Occur.SHOULD);
            q.add(nexusIndexer.constructQuery(MAVEN.ARTIFACT_ID, new StringSearchExpression(term)),
                    BooleanClause.Occur.SHOULD);
            q.add(nexusIndexer.constructQuery(MAVEN.VERSION, new StringSearchExpression(term)),
                    BooleanClause.Occur.SHOULD);
            q.add(nexusIndexer.constructQuery(MAVEN.PACKAGING, new StringSearchExpression(term)),
                    BooleanClause.Occur.SHOULD);
            q.add(nexusIndexer.constructQuery(MAVEN.CLASSNAMES, new StringSearchExpression(term)),
                    BooleanClause.Occur.SHOULD);

            request = new FlatSearchRequest(q);
            request.setContexts(new ArrayList(nexusIndexer.getIndexingContexts().values()));

            response = nexusIndexer.searchFlat(request);

            System.out.println(" result size with term usage " + response.getResults().size());

            assertEquals(4, response.getResults().size());

        } finally {
            closeAllIndexs();
        }
    }

    /**
     * both repos contains commons-cli so ensure we don't return duplicates
     */
    public void testSearchNoDuplicateArtifactInfo() throws Exception {

        String repoPathIndex = "target/test/repo-for-searchdupe";

        File emptyRepo = new File(getBasedir(), repoPathIndex);

        if (emptyRepo.exists()) {
            FileUtils.deleteDirectory(emptyRepo);
        }

        emptyRepo.mkdirs();

        //createIndex( "/src/test/repo", repoPath + "/.index", INDEX_ID2 );
        createIndex("/src/test/repo", repoPathIndex, INDEX_ID2);

        createIndex("src/test/repo-with-osgi", "target/test/repo-with-osgi/", INDEX_ID1);

        try {
            BooleanQuery q = new BooleanQuery();

            q.add(nexusIndexer.constructQuery(MAVEN.GROUP_ID, new StringSearchExpression("commons-cli")),
                    BooleanClause.Occur.MUST);

            q.add(nexusIndexer.constructQuery(MAVEN.PACKAGING, new StringSearchExpression("jar")),
                    BooleanClause.Occur.MUST);

            q.add(nexusIndexer.constructQuery(MAVEN.CLASSIFIER, new StringSearchExpression("sources")),
                    BooleanClause.Occur.MUST);

            FlatSearchRequest request = new FlatSearchRequest(q);
            assertEquals(2, nexusIndexer.getIndexingContexts().values().size());
            request.setContexts(Arrays.asList(nexusIndexer.getIndexingContexts().get(INDEX_ID2),
                    nexusIndexer.getIndexingContexts().get(INDEX_ID1)));

            FlatSearchResponse response = nexusIndexer.searchFlat(request);

            assertEquals(1, response.getResults().size());

        } finally {
            closeAllIndexs();
        }
    }

    private void closeAllIndexs() throws Exception {
        for (IndexingContext context : nexusIndexer.getIndexingContexts().values()) {
            context.close(true);
        }
    }

    private void createIndex(String filePath, String repoIndex, String contextId) throws Exception {

        File repo = new File(getBasedir(), filePath);

        File repoIndexDir = new File(getBasedir(), repoIndex + "/.index");

        if (repoIndexDir.exists()) {
            FileUtils.deleteDirectory(repoIndexDir);
        }

        repoIndexDir.mkdirs();

        System.out.println(
                "creating Index with id " + contextId + " path : " + filePath + " , indexPath " + repoIndex);

        IndexingContext indexingContext = nexusIndexer.addIndexingContext(contextId, contextId, repo, repoIndexDir,
                "http://www.apache.org", "http://www.apache.org/.index", indexCreators);
        indexingContext.setSearchable(true);
        nexusIndexer.scan(indexingContext, false);

        indexingContext.optimize();

        File managedRepository = new File(repoIndex);
        final IndexSearcher indexSearcher = indexingContext.acquireIndexSearcher();
        try {
            final File indexLocation = new File(managedRepository, ".index");
            IndexPackingRequest request = new IndexPackingRequest(indexingContext, indexSearcher.getIndexReader(),
                    indexLocation);
            indexPacker.packIndex(request);
        } finally {
            indexingContext.releaseIndexSearcher(indexSearcher);
        }

    }
}