View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.index.context;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.util.Collection;
24  import java.util.Date;
25  import java.util.List;
26  import java.util.Set;
27  
28  import org.apache.lucene.analysis.Analyzer;
29  import org.apache.lucene.index.IndexWriter;
30  import org.apache.lucene.search.IndexSearcher;
31  import org.apache.lucene.store.Directory;
32  import org.apache.maven.index.artifact.GavCalculator;
33  
34  /**
35   * An indexing context is representing artifact repository for indexing and searching. Indexing context is a statefull
36   * component, it keeps state of index readers and writers.
37   *
38   * @author Jason van Zyl
39   * @author Tamas Cservenak
40   * @author Eugene Kuleshov
41   */
42  public interface IndexingContext {
43      /**
44       * Standard name of the full repository index that is used when clients requesting index information have nothing to
45       * start with.
46       */
47      String INDEX_FILE_PREFIX = "nexus-maven-repository-index";
48  
49      String INDEX_REMOTE_PROPERTIES_FILE = INDEX_FILE_PREFIX + ".properties";
50  
51      String INDEX_UPDATER_PROPERTIES_FILE = INDEX_FILE_PREFIX + "-updater.properties";
52  
53      String INDEX_PACKER_PROPERTIES_FILE = INDEX_FILE_PREFIX + "-packer.properties";
54  
55      /**
56       * A prefix used for all index property names
57       */
58      String INDEX_PROPERTY_PREFIX = "nexus.index.";
59  
60      /**
61       * A property name used to specify index id
62       */
63      String INDEX_ID = INDEX_PROPERTY_PREFIX + "id";
64  
65      /**
66       * A property name used to specify legacy index timestamp (the last update time)
67       */
68      String INDEX_LEGACY_TIMESTAMP = INDEX_PROPERTY_PREFIX + "time";
69  
70      /**
71       * A property name used to specify index timtestamp
72       */
73      String INDEX_TIMESTAMP = INDEX_PROPERTY_PREFIX + "timestamp";
74  
75      /**
76       * A prefix used to specify an incremental update chunk name
77       */
78      String INDEX_CHUNK_PREFIX = INDEX_PROPERTY_PREFIX + "incremental-";
79  
80      /**
81       * A date format used for index timestamp
82       */
83      String INDEX_TIME_FORMAT = "yyyyMMddHHmmss.SSS Z";
84  
85      /**
86       * A date format used for incremental update chunk names
87       */
88      String INDEX_TIME_DAY_FORMAT = "yyyyMMdd";
89  
90      /**
91       * A counter used to id the chunks
92       */
93      String INDEX_CHUNK_COUNTER = INDEX_PROPERTY_PREFIX + "last-incremental";
94  
95      /**
96       * An id that defines the current incremental chain. If when checking remote repo, the index chain doesn't match
97       * you'll know that you need to download the full index
98       */
99      String INDEX_CHAIN_ID = INDEX_PROPERTY_PREFIX + "chain-id";
100 
101     /**
102      * Returns this indexing context id.
103      */
104     String getId();
105 
106     /**
107      * Returns repository id.
108      */
109     String getRepositoryId();
110 
111     /**
112      * Returns location for the local repository.
113      */
114     File getRepository();
115 
116     /**
117      * Returns public repository url.
118      */
119     String getRepositoryUrl();
120 
121     /**
122      * Returns url for the index update
123      */
124     String getIndexUpdateUrl();
125 
126     /**
127      * Is the context searchable when doing "non-targeted" searches? Ie. Should it take a part when searching without
128      * specifying context?
129      *
130      * @return
131      */
132     boolean isSearchable();
133 
134     /**
135      * Sets is the context searchable when doing "non-targeted" searches.
136      *
137      * @param searchable
138      */
139     void setSearchable(boolean searchable);
140 
141     /**
142      * Returns index update time
143      */
144     Date getTimestamp();
145 
146     void updateTimestamp() throws IOException;
147 
148     void updateTimestamp(boolean save) throws IOException;
149 
150     void updateTimestamp(boolean save, Date date) throws IOException;
151 
152     /**
153      * Returns a number that represents the "size" useful for doing comparisons between contexts (which one has more
154      * data indexed?). The number return does not represent the count of ArtifactInfos, neither other "meaningful" info,
155      * it is purely to be used for inter-context comparisons only!
156      *
157      * @return
158      * @throws IOException
159      */
160     int getSize() throws IOException;
161 
162     /**
163      * Acquires a fresh instance of {@link IndexSearcher}. You have to release the received instance with
164      * {@link #releaseIndexSearcher(IndexSearcher)} otherwise you are about to introduce leak.
165      *
166      * @return
167      */
168     IndexSearcher acquireIndexSearcher() throws IOException;
169 
170     /**
171      * Releases the {@link IndexSearcher} instance.
172      *
173      * @param s
174      */
175     void releaseIndexSearcher(IndexSearcher s) throws IOException;
176 
177     /**
178      * Returns the Lucene IndexWriter (thread safe, shared instance) of this context.
179      *
180      * @return indexWriter
181      * @throws IOException
182      */
183     IndexWriter getIndexWriter() throws IOException;
184 
185     /**
186      * List of IndexCreators used in this context.
187      *
188      * @return list of index creators.
189      */
190     List<IndexCreator> getIndexCreators();
191 
192     /**
193      * Returns the Lucene Analyzer of this context used for by IndexWriter and IndexSearcher. Note: this method always
194      * creates a new instance of analyzer!
195      *
196      * @return
197      */
198     Analyzer getAnalyzer();
199 
200     /**
201      * Commits changes to context, eventually refreshing readers/searchers too.
202      *
203      * @throws IOException
204      */
205     void commit() throws IOException;
206 
207     /**
208      * Rolls back changes to context, eventually refreshing readers/searchers too.
209      *
210      * @throws IOException
211      */
212     void rollback() throws IOException;
213 
214     /**
215      * Optimizes index. According to Lucene 3.6+ Javadoc, there is no more sense to optimize, so this method might
216      * become "noop".
217      */
218     void optimize() throws IOException;
219 
220     /**
221      * Shuts down this context.
222      */
223     void close(boolean deleteFiles) throws IOException;
224 
225     /**
226      * Purge (cleans) the context, deletes/empties the index and restores the context to new/empty state.
227      *
228      * @throws IOException
229      */
230     void purge() throws IOException;
231 
232     /**
233      * Merges content of given Lucene directory with this context.
234      *
235      * @param directory - the directory to merge
236      */
237     void merge(Directory directory) throws IOException;
238 
239     /**
240      * Merges content of given Lucene directory with this context, but filters out the unwanted ones.
241      *
242      * @param directory - the directory to merge
243      */
244     void merge(Directory directory, DocumentFilter filter) throws IOException;
245 
246     /**
247      * Merges content of given Lucene directory with this context, but filters out the unwanted ones and adds the groups to the context.
248      *
249      * @param directory - the directory to merge
250      */
251     void merge(Directory directory, DocumentFilter filter, Set<String> allGroups, Set<String> rootGroups)
252             throws IOException;
253 
254     /**
255      * Replaces the Lucene index with the one from supplied directory.
256      *
257      * @param directory
258      * @throws IOException
259      */
260     void replace(Directory directory) throws IOException;
261 
262     void replace(Directory directory, Set<String> allGroups, Set<String> rootGroups) throws IOException;
263 
264     Directory getIndexDirectory();
265 
266     File getIndexDirectoryFile();
267 
268     /**
269      * Returns the GavCalculator for this Context. Implies repository layout.
270      */
271     GavCalculator getGavCalculator();
272 
273     /**
274      * Sets all group names stored in the current indexing context
275      */
276     void setAllGroups(Collection<String> groups) throws IOException;
277 
278     /**
279      * Gets all group names stored in the current indexing context
280      */
281     Set<String> getAllGroups() throws IOException;
282 
283     /**
284      * Sets root group names stored in the current indexing context
285      */
286     void setRootGroups(Collection<String> groups) throws IOException;
287 
288     /**
289      * Gets root group names stored in the current indexing context
290      */
291     Set<String> getRootGroups() throws IOException;
292 
293     /**
294      * Rebuilds stored group names from the index
295      */
296     void rebuildGroups() throws IOException;
297 
298     /**
299      * Returns true if this context is receiving updates from remote via IndexUpdater.
300      *
301      * @return
302      */
303     boolean isReceivingUpdates();
304 }