View Javadoc
1   package org.apache.maven.index;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0    
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.File;
23  import java.io.IOException;
24  import java.util.Collection;
25  import java.util.List;
26  import java.util.Map;
27  
28  import org.apache.lucene.search.Query;
29  import org.apache.lucene.store.Directory;
30  import org.apache.maven.index.context.ContextMemberProvider;
31  import org.apache.maven.index.context.IndexCreator;
32  import org.apache.maven.index.context.IndexingContext;
33  import org.apache.maven.index.context.UnsupportedExistingLuceneIndexException;
34  import org.apache.maven.index.expr.SearchExpression;
35  
36  /**
37   * The Nexus indexer is a statefull facade that maintains state of indexing contexts.
38   * <p>
39   * The following code snippet shows how to register indexing context, which should be done once on the application
40   * startup and Nexus indexer instance should be reused after that.
41   * 
42   * <pre>
43   * NexusIndexer indexer;
44   * 
45   * IndexingContext context = indexer.addIndexingContext( indexId, // index id (usually the same as repository id)
46   *     repositoryId, // repository id
47   *     directory, // Lucene directory where index is stored
48   *     repositoryDir, // local repository dir or null for remote repo
49   *     repositoryUrl, // repository url, used by index updater
50   *     indexUpdateUrl, // index update url or null if derived from repositoryUrl
51   *     false, false );
52   * </pre>
53   * 
54   * An indexing context could be populated using one of {@link #scan(IndexingContext)},
55   * {@link #addArtifactToIndex(ArtifactContext, IndexingContext)} or
56   * {@link #deleteArtifactFromIndex(ArtifactContext, IndexingContext)} methods.
57   * <p>
58   * An {@link org.apache.maven.index.updater.IndexUpdater} could be used to fetch indexes from remote repositories.
59   * These indexers could be created using the Indexer CLI command line tool or
60   * {@link org.apache.maven.index.packer.IndexPacker} API.
61   * <p>
62   * Once index is populated you can perform search queries using field names declared in the {@link ArtifactInfo}:
63   * 
64   * <pre>
65   *   // run search query
66   *   BooleanQuery q = new BooleanQuery();
67   *   q.add(indexer.constructQuery(ArtifactInfo.GROUP_ID, term), Occur.SHOULD);
68   *   q.add(indexer.constructQuery(ArtifactInfo.ARTIFACT_ID, term), Occur.SHOULD);
69   *   q.add(new PrefixQuery(new Term(ArtifactInfo.SHA1, term)), Occur.SHOULD);
70   *   
71   *   FlatSearchRequest request = new FlatSearchRequest(q);
72   *   FlatSearchResponse response = indexer.searchFlat(request);
73   *   ...
74   * </pre>
75   * 
76   * Query could be also constructed using a convenience {@link NexusIndexer#constructQuery(Field, SearchExpression)}
77   * method that handles creation of the wildcard queries. Also see {@link DefaultQueryCreator} for more details on
78   * supported queries.
79   * 
80   * @see IndexingContext
81   * @see org.apache.maven.index.updater.IndexUpdater
82   * @see DefaultQueryCreator
83   * @author Jason van Zyl
84   * @author Tamas Cservenak
85   * @author Eugene Kuleshov
86   * @deprecated Use {@link Indexer} instead.
87   */
88  @Deprecated
89  public interface NexusIndexer
90  {
91      String ROLE = NexusIndexer.class.getName();
92  
93      /**
94       * Adds an indexing context to Nexus indexer.
95       * 
96       * @since 5.1.0
97       */
98      void addIndexingContext( IndexingContext context );
99  
100     /**
101      * Adds an indexing context to Nexus indexer.
102      * 
103      * @param id the ID of the context.
104      * @param repositoryId the ID of the repository that this context represents.
105      * @param repository the location of the repository.
106      * @param indexDirectory the location of the Lucene indexes.
107      * @param repositoryUrl the location of the remote repository.
108      * @param indexUpdateUrl the alternate location of the remote repository indexes (if they are not in default place).
109      * @param indexers the set of indexers to apply to this context.
110      * @return
111      * @throws IOException in case of some serious IO problem.
112      * @throws UnsupportedExistingLuceneIndexException if a Lucene index already exists where location is specified, but
113      *             it has no Nexus descriptor record or it has, but the embedded repoId differs from the repoId
114      *             specified from the supplied one.
115      * @throws IllegalArgumentException in case the supplied list of IndexCreators are not satisfiable
116      * @deprecated Use {@link Indexer} instead.
117      */
118     @Deprecated
119     IndexingContext addIndexingContext( String id, String repositoryId, File repository, File indexDirectory,
120                                         String repositoryUrl, String indexUpdateUrl,
121                                         List<? extends IndexCreator> indexers )
122         throws IOException, UnsupportedExistingLuceneIndexException;
123 
124     /**
125      * Adds an indexing context to Nexus indexer. It "forces" this operation, thus no
126      * UnsupportedExistingLuceneIndexException is thrown. If it founds an existing lucene index, it will simply
127      * stomp-over and rewrite (or add) the Nexus index descriptor.
128      * 
129      * @param id the ID of the context.
130      * @param repositoryId the ID of the repository that this context represents.
131      * @param repository the location of the repository.
132      * @param indexDirectory the location of the Lucene indexes.
133      * @param repositoryUrl the location of the remote repository.
134      * @param indexUpdateUrl the alternate location of the remote repository indexes (if they are not in default place).
135      * @param indexers the set of indexers to apply to this context.
136      * @return
137      * @throws IOException in case of some serious IO problem.
138      * @throws IllegalArgumentException in case the supplied list of IndexCreators are not satisfiable
139      * @deprecated Use {@link Indexer} instead.
140      */
141     @Deprecated
142     IndexingContext addIndexingContextForced( String id, String repositoryId, File repository, File indexDirectory,
143                                               String repositoryUrl, String indexUpdateUrl,
144                                               List<? extends IndexCreator> indexers )
145         throws IOException;
146 
147     /**
148      * Adds an indexing context to Nexus indexer.
149      * 
150      * @param id the ID of the context.
151      * @param repositoryId the ID of the repository that this context represents.
152      * @param repository the location of the repository.
153      * @param directory the location of the Lucene indexes.
154      * @param repositoryUrl the location of the remote repository.
155      * @param indexUpdateUrl the alternate location of the remote repository indexes (if they are not in default place).
156      * @param indexers the set of indexers to apply to this context.
157      * @return
158      * @throws IOException in case of some serious IO problem.
159      * @throws UnsupportedExistingLuceneIndexException if a Lucene index already exists where location is specified, but
160      *             it has no Nexus descriptor record or it has, but the embedded repoId differs from the repoId
161      *             specified from the supplied one.
162      * @throws IllegalArgumentException in case the supplied list of IndexCreators are not satisfiable
163      * @deprecated Use {@link Indexer} instead.
164      */
165     @Deprecated
166     IndexingContext addIndexingContext( String id, String repositoryId, File repository, Directory directory,
167                                         String repositoryUrl, String indexUpdateUrl,
168                                         List<? extends IndexCreator> indexers )
169         throws IOException, UnsupportedExistingLuceneIndexException;
170 
171     /**
172      * Adds an indexing context to Nexus indexer. It "forces" this operation, thus no
173      * UnsupportedExistingLuceneIndexException is thrown. If it founds an existing lucene index, it will simply
174      * stomp-over and rewrite (or add) the Nexus index descriptor.
175      * 
176      * @param id the ID of the context.
177      * @param repositoryId the ID of the repository that this context represents.
178      * @param repository the location of the repository.
179      * @param directory the location of the Lucene indexes.
180      * @param repositoryUrl the location of the remote repository.
181      * @param indexUpdateUrl the alternate location of the remote repository indexes (if they are not in default place).
182      * @param indexers the set of indexers to apply to this context.
183      * @return
184      * @throws IOException in case of some serious IO problem.
185      * @throws IllegalArgumentException in case the supplied list of IndexCreators are not satisfiable
186      * @deprecated Use {@link Indexer} instead.
187      */
188     @Deprecated
189     IndexingContext addIndexingContextForced( String id, String repositoryId, File repository, Directory directory,
190                                               String repositoryUrl, String indexUpdateUrl,
191                                               List<? extends IndexCreator> indexers )
192         throws IOException;
193 
194     @Deprecated
195     IndexingContext addMergedIndexingContext( String id, String repositoryId, File repository, File indexDirectory,
196                                               boolean searchable, Collection<IndexingContext> contexts )
197         throws IOException;
198 
199     @Deprecated
200     IndexingContext addMergedIndexingContext( String id, String repositoryId, File repository, File indexDirectory,
201                                               boolean searchable, ContextMemberProvider membersProvider )
202         throws IOException;
203 
204     @Deprecated
205     IndexingContext addMergedIndexingContext( String id, String repositoryId, File repository,
206                                               Directory indexDirectory, boolean searchable,
207                                               Collection<IndexingContext> contexts )
208         throws IOException;
209 
210     @Deprecated
211     IndexingContext addMergedIndexingContext( String id, String repositoryId, File repository,
212                                               Directory indexDirectory, boolean searchable,
213                                               ContextMemberProvider membersProvider )
214         throws IOException;
215 
216     /**
217      * Removes the indexing context from Nexus indexer, closes it and deletes (if specified) the index files.
218      * 
219      * @param context
220      * @param deleteFiles
221      * @throws IOException
222      * @deprecated Use {@link Indexer} instead.
223      */
224     @Deprecated
225     void removeIndexingContext( IndexingContext context, boolean deleteFiles )
226         throws IOException;
227 
228     /**
229      * Returns the map of indexing contexts keyed by their ID.
230      * 
231      * @deprecated Use {@link Indexer} instead.
232      */
233     @Deprecated
234     Map<String, IndexingContext> getIndexingContexts();
235 
236     // ----------------------------------------------------------------------------
237     // Scanning
238     // ----------------------------------------------------------------------------
239     /**
240      * Performs full scan (reindex) for the local repository belonging to supplied context.
241      * 
242      * @param context
243      * @deprecated Use {@link Indexer} instead.
244      */
245     @Deprecated
246     void scan( IndexingContext context )
247         throws IOException;
248 
249     /**
250      * Performs full scan (reindex) for the local repository belonging to supplied context. ArtifactListener is used
251      * during that process.
252      * 
253      * @param context
254      * @param listener
255      * @deprecated Use {@link Indexer} instead.
256      */
257     @Deprecated
258     void scan( IndexingContext context, ArtifactScanningListener listener )
259         throws IOException;
260 
261     /**
262      * Performs optionally incremental scan (reindex/full reindex) for the local repository belonging to the supplied
263      * context.
264      * 
265      * @param context
266      * @param update if incremental reindex wanted, set true, otherwise false and full reindex will happen
267      * @deprecated Use {@link Indexer} instead.
268      */
269     @Deprecated
270     void scan( IndexingContext context, boolean update )
271         throws IOException;
272 
273     /**
274      * Performs optionally incremental scan (reindex) for the local repository, with listener.
275      * 
276      * @param context
277      * @param listener
278      * @param update if incremental reindex wanted, set true, otherwise false and full reindex will happen
279      * @deprecated Use {@link Indexer} instead.
280      */
281     @Deprecated
282     void scan( IndexingContext context, ArtifactScanningListener listener, boolean update )
283         throws IOException;
284 
285     /**
286      * Performs optionally incremental scan (reindex) for the local repository.
287      * 
288      * @param context
289      * @param fromPath a path segment if you want "sub-path" reindexing (ie. reindex just a given subfolder of a
290      *            repository, ot whole repository from root.
291      * @param listener
292      * @param update if incremental reindex wanted, set true, otherwise false and full reindex will happen
293      * @deprecated Use {@link Indexer} instead.
294      */
295     @Deprecated
296     void scan( IndexingContext context, String fromPath, ArtifactScanningListener listener, boolean update )
297         throws IOException;
298 
299     @Deprecated
300     void artifactDiscovered( ArtifactContext ac, IndexingContext context )
301         throws IOException;
302 
303     // ----------------------------------------------------------------------------
304     // Modifying
305     // ----------------------------------------------------------------------------
306 
307     @Deprecated
308     void addArtifactToIndex( ArtifactContext ac, IndexingContext context )
309         throws IOException;
310 
311     @Deprecated
312     void addArtifactsToIndex( Collection<ArtifactContext> acs, IndexingContext context )
313         throws IOException;
314 
315     @Deprecated
316     void deleteArtifactFromIndex( ArtifactContext ac, IndexingContext context )
317         throws IOException;
318 
319     @Deprecated
320     void deleteArtifactsFromIndex( Collection<ArtifactContext> acs, IndexingContext context )
321         throws IOException;
322 
323     // ----------------------------------------------------------------------------
324     // Searching
325     // ----------------------------------------------------------------------------
326 
327     /**
328      * Searches according the request parameters.
329      * 
330      * @param request
331      * @return
332      * @throws IOException
333      * @deprecated Use {@link Indexer} instead.
334      */
335     @Deprecated
336     FlatSearchResponse searchFlat( FlatSearchRequest request )
337         throws IOException;
338 
339     /**
340      * Searches according to request parameters.
341      * 
342      * @param request
343      * @return
344      * @throws IOException
345      * @deprecated Use {@link Indexer} instead.
346      */
347     @Deprecated
348     IteratorSearchResponse searchIterator( IteratorSearchRequest request )
349         throws IOException;
350 
351     /**
352      * Searches according the request parameters.
353      * 
354      * @param request
355      * @return
356      * @throws IOException
357      * @deprecated Use {@link Indexer} instead.
358      */
359     @Deprecated
360     GroupedSearchResponse searchGrouped( GroupedSearchRequest request )
361         throws IOException;
362 
363     // ----------------------------------------------------------------------------
364     // Query construction
365     // ----------------------------------------------------------------------------
366 
367     /**
368      * Helper method to construct Lucene query for given field without need for knowledge (on caller side) HOW is a
369      * field indexed, and WHAT query is needed to achieve that.
370      * 
371      * @param field
372      * @param query
373      * @param type
374      * @return
375      * @deprecated Use {@link Indexer} instead.
376      */
377     @Deprecated
378     Query constructQuery( Field field, String query, SearchType type )
379         throws IllegalArgumentException;
380 
381     /**
382      * Helper method to construct Lucene query for given field without need for knowledge (on caller side) HOW is a
383      * field indexed, and WHAT query is needed to achieve that.
384      * 
385      * @param field
386      * @param expression
387      * @return
388      * @deprecated Use {@link Indexer} instead.
389      */
390     @Deprecated
391     Query constructQuery( Field field, SearchExpression expression )
392         throws IllegalArgumentException;
393 
394     // ----------------------------------------------------------------------------
395     // Identification
396     // Since 4.0: Indexer does not make any assumptions, it is caller call to decide what to do with multiple results
397     // ----------------------------------------------------------------------------
398 
399     @Deprecated
400     Collection<ArtifactInfo> identify( Field field, String query )
401         throws IllegalArgumentException, IOException;
402 
403     @Deprecated
404     Collection<ArtifactInfo> identify( File artifact )
405         throws IOException;
406 
407     @Deprecated
408     Collection<ArtifactInfo> identify( File artifact, Collection<IndexingContext> contexts )
409         throws IOException;
410 
411     @Deprecated
412     Collection<ArtifactInfo> identify( Query query )
413         throws IOException;
414 
415     @Deprecated
416     Collection<ArtifactInfo> identify( Query query, Collection<IndexingContext> contexts )
417         throws IOException;
418 
419 }