blob: 6cd9f67e7e24e73b79be21c87b14b67892e88717 [file] [log] [blame]
package org.apache.maven.index;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import org.apache.lucene.search.Query;
import org.apache.maven.index.context.ContextMemberProvider;
import org.apache.maven.index.context.ExistingLuceneIndexMismatchException;
import org.apache.maven.index.context.IndexCreator;
import org.apache.maven.index.context.IndexingContext;
import org.apache.maven.index.expr.SearchExpression;
import org.apache.maven.index.expr.SourcedSearchExpression;
import org.apache.maven.index.expr.UserInputSearchExpression;
/*
* 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.
*/
/**
* Indexer component. It is the main component of Maven Indexer, offering {@link IndexingContext} creation and close
* methods, context maintenance (scan, add, remove) and search methods. Supersedes the {@link NexusIndexer} component,
* making it less cludged, and focusing on main use cases. This component does not hold any reference to contexts
* it creates or uses, and caller of every method (except the createIndexingContext naturally) is obliged to
* explicitly supply {@link IndexingContext} to work with (perform searches or such).
*
* @author cstamas
* @since 5.1.0
*/
public interface Indexer
{
/**
* Creates an indexing context.
*
* @param id the ID of the context.
* @param repositoryId the ID of the repository that this context represents. You might have several contexts
* indexing same repository ID, but on separate locations.
* @param repository the location of the repository on FS.
* @param indexDirectory the location of the Lucene indexes on FS.
* @param repositoryUrl the location of the remote repository or {@code null} if this indexing context does not need
* remote updates (is not a proxy).
* @param indexUpdateUrl the alternate location of the remote repository indexes (if they are not in default place)
* or {@code null} if defaults are applicable.
* @param searchable if context should be searched in non-targeted mode.
* @param reclaim if indexDirectory is known to contain (or should contain) valid Maven Indexer lucene index, and no
* checks needed to be performed, or, if we want to "stomp" over existing index (unsafe to do!).
* @param indexers the set of indexers to apply to this context.
* @return the context created.
* @throws IOException in case of some serious IO problem.
* @throws ExistingLuceneIndexMismatchException if a Lucene index already exists where location is specified, but
* it has no Nexus descriptor record or it has, but the embedded repoId differs from the repoId
* specified from the supplied one. Never thrown if {@code reclaim} is {@code true}, as in that case, if
* Lucene index exists but any of those criteria above are not met, the existing index is overwritten,
* and equipped with proper descriptor silently.
* @throws IllegalArgumentException in case the supplied list of IndexCreators are having non-satisfiable
* dependencies.
*/
IndexingContext createIndexingContext( String id, String repositoryId, File repository, File indexDirectory,
String repositoryUrl, String indexUpdateUrl, boolean searchable,
boolean reclaim, List<? extends IndexCreator> indexers )
throws IOException, ExistingLuceneIndexMismatchException, IllegalArgumentException;
/**
* Creates a merged indexing context.
*
* @param id the ID of the context.
* @param repositoryId the ID of the repository that this context represents. You might have several contexts
* indexing same repository ID, but on separate locations.
* @param repository the location of the repository on FS.
* @param indexDirectory the location of the Lucene indexes on FS.
* @param searchable if context should be searched in non-targeted mode.
* @param membersProvider the {@link ContextMemberProvider}, never null.
* @return the context created.
* @throws IOException in case of some serious IO problem.
*/
IndexingContext createMergedIndexingContext( String id, String repositoryId, File repository, File indexDirectory,
boolean searchable, ContextMemberProvider membersProvider )
throws IOException;
/**
* Closes the indexing context: closes it and deletes (if specified) the index files.
*
* @param context the one needed to be closed, never {@code null}.
* @param deleteFiles {@code true} if all indexer related files (including Lucene index!) needs to be deleted,
* {@code false} otherwise.
* @throws IOException
*/
void closeIndexingContext( IndexingContext context, boolean deleteFiles )
throws IOException;
// ----------------------------------------------------------------------------
// Modifying
// ----------------------------------------------------------------------------
/**
* Adds the passed in artifact contexts to passed in indexing context.
*
* @param acs
* @param context
* @throws IOException
*/
void addArtifactsToIndex( Collection<ArtifactContext> acs, IndexingContext context )
throws IOException;
/**
* Removes the passed in artifacts contexts from passed in indexing context.
*
* @param acs
* @param context
* @throws IOException
*/
void deleteArtifactsFromIndex( Collection<ArtifactContext> acs, IndexingContext context )
throws IOException;
// ----------------------------------------------------------------------------
// Searching
// ----------------------------------------------------------------------------
/**
* Searches according the request parameters.
*
* @param request
* @return search response
* @throws IOException
*/
FlatSearchResponse searchFlat( FlatSearchRequest request )
throws IOException;
/**
* Searches according to request parameters.
*
* @param request
* @return search response
* @throws IOException
*/
IteratorSearchResponse searchIterator( IteratorSearchRequest request )
throws IOException;
/**
* Searches according the request parameters.
*
* @param request
* @return search response
* @throws IOException
*/
GroupedSearchResponse searchGrouped( GroupedSearchRequest request )
throws IOException;
// ----------------------------------------------------------------------------
// Identify
// ----------------------------------------------------------------------------
/**
* Performs an "identity" search. Passed in {@link File} will have SHA1 hash calculated, and an
* {@link #identify(Query, Collection)} method will be invoked searching with calculated hash the {@link MAVEN#SHA1}
* field. This is just a shorthand method, as these calls are simply calculating hex encoded SHA1 of the file, and
* invoking the {@link #constructQuery(Field, SearchExpression)} and {@link #identify(Query, Collection)} methods.
*
* @param artifact the file
* @param contexts in which to perform the action
* @return collection of identified matches.
* @throws IOException
*/
Collection<ArtifactInfo> identify( File artifact, Collection<IndexingContext> contexts )
throws IOException;
/**
* Performs an "identity" search. Those are usually simple key-value queries, involving "unique" fields like
* {@link MAVEN#SHA1} or such.
*
* @param query
* @param contexts
* @return collection of identified matches.
* @throws IOException
*/
Collection<ArtifactInfo> identify( Query query, Collection<IndexingContext> contexts )
throws IOException;
// ----------------------------------------------------------------------------
// Query construction
// ----------------------------------------------------------------------------
/**
* Helper method to construct Lucene query for given field without need for knowledge (on caller side) HOW is a
* field indexed, and WHAT query is needed to achieve that search.
*
* @param field
* @param expression
* @return the query to be used for search.
* @see SearchExpression
* @see UserInputSearchExpression
* @see SourcedSearchExpression
* @throws IllegalArgumentException
*/
Query constructQuery( Field field, SearchExpression expression )
throws IllegalArgumentException;
}