]> source.dussan.org Git - archiva.git/blob
c85a8fbea841c3f3315e58f08647f479cfb5cbee
[archiva.git] /
1 package org.apache.archiva.consumers.lucene;
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 org.apache.archiva.admin.model.RepositoryAdminException;
23 import org.apache.archiva.admin.model.beans.ManagedRepository;
24 import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
25 import org.apache.archiva.common.plexusbridge.MavenIndexerUtils;
26 import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
27 import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
28 import org.apache.archiva.configuration.ArchivaConfiguration;
29 import org.apache.archiva.configuration.ConfigurationNames;
30 import org.apache.archiva.configuration.FileTypes;
31 import org.apache.archiva.consumers.AbstractMonitoredConsumer;
32 import org.apache.archiva.consumers.ConsumerException;
33 import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
34 import org.apache.archiva.redback.components.registry.Registry;
35 import org.apache.archiva.scheduler.ArchivaTaskScheduler;
36 import org.apache.archiva.scheduler.indexing.ArtifactIndexingTask;
37 import org.apache.maven.index.NexusIndexer;
38 import org.apache.maven.index.context.IndexCreator;
39 import org.apache.maven.index.context.IndexingContext;
40 import org.apache.archiva.redback.components.registry.RegistryListener;
41 import org.apache.archiva.redback.components.taskqueue.TaskQueueException;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44 import org.springframework.context.annotation.Scope;
45 import org.springframework.stereotype.Service;
46
47 import javax.annotation.PostConstruct;
48 import javax.inject.Inject;
49 import javax.inject.Named;
50 import java.io.File;
51 import java.util.ArrayList;
52 import java.util.Collections;
53 import java.util.Date;
54 import java.util.List;
55
56 /**
57  * Consumer for indexing the repository to provide search and IDE integration features.
58  */
59 @Service( "knownRepositoryContentConsumer#index-content" )
60 @Scope( "prototype" )
61 public class NexusIndexerConsumer
62     extends AbstractMonitoredConsumer
63     implements KnownRepositoryContentConsumer, RegistryListener
64 {
65     private Logger log = LoggerFactory.getLogger( getClass() );
66
67     private ArchivaConfiguration configuration;
68
69     private FileTypes filetypes;
70
71     private File managedRepository;
72
73     private ArchivaTaskScheduler<ArtifactIndexingTask> scheduler;
74
75     private IndexingContext indexingContext;
76
77     private NexusIndexer nexusIndexer;
78
79     private List<String> includes = new ArrayList<>( 0 );
80
81     private ManagedRepository repository;
82
83     private List<? extends IndexCreator> allIndexCreators;
84
85     private ManagedRepositoryAdmin managedRepositoryAdmin;
86
87     @Inject
88     public NexusIndexerConsumer(
89         @Named( value = "archivaTaskScheduler#indexing" ) ArchivaTaskScheduler<ArtifactIndexingTask> scheduler,
90         @Named( value = "archivaConfiguration" ) ArchivaConfiguration configuration, FileTypes filetypes,
91         MavenIndexerUtils mavenIndexerUtils,
92         ManagedRepositoryAdmin managedRepositoryAdmin, NexusIndexer nexusIndexer )
93     {
94         this.configuration = configuration;
95         this.filetypes = filetypes;
96         this.scheduler = scheduler;
97         this.nexusIndexer = nexusIndexer;
98         this.allIndexCreators = mavenIndexerUtils.getAllIndexCreators();
99         this.managedRepositoryAdmin = managedRepositoryAdmin;
100     }
101
102     @Override
103     public String getDescription()
104     {
105         return "Indexes the repository to provide search and IDE integration features";
106     }
107
108     @Override
109     public String getId()
110     {
111         return "index-content";
112     }
113
114     @Override
115     public void beginScan( ManagedRepository repository, Date whenGathered )
116         throws ConsumerException
117     {
118         this.repository = repository;
119         managedRepository = new File( repository.getLocation() );
120
121         try
122         {
123             log.info( "Creating indexing context for repo : {}", repository.getId() );
124             indexingContext = managedRepositoryAdmin.createIndexContext( repository );
125         }
126         catch ( RepositoryAdminException e )
127         {
128             throw new ConsumerException( e.getMessage(), e );
129         }
130     }
131
132     @Override
133     public void beginScan( ManagedRepository repository, Date whenGathered, boolean executeOnEntireRepo )
134         throws ConsumerException
135     {
136         if ( executeOnEntireRepo )
137         {
138             beginScan( repository, whenGathered );
139         }
140         else
141         {
142             this.repository = repository;
143             managedRepository = new File( repository.getLocation() );
144         }
145     }
146
147     @Override
148     public void processFile( String path )
149         throws ConsumerException
150     {
151         File artifactFile = new File( managedRepository, path );
152
153         ArtifactIndexingTask task =
154             new ArtifactIndexingTask( repository, artifactFile, ArtifactIndexingTask.Action.ADD, getIndexingContext() );
155         try
156         {
157             log.debug( "Queueing indexing task '{}' to add or update the artifact in the index.", task );
158             scheduler.queueTask( task );
159         }
160         catch ( TaskQueueException e )
161         {
162             throw new ConsumerException( e.getMessage(), e );
163         }
164     }
165
166     @Override
167     public void processFile( String path, boolean executeOnEntireRepo )
168         throws Exception
169     {
170         if ( executeOnEntireRepo )
171         {
172             processFile( path );
173         }
174         else
175         {
176             File artifactFile = new File( managedRepository, path );
177
178             // specify in indexing task that this is not a repo scan request!
179             ArtifactIndexingTask task =
180                 new ArtifactIndexingTask( repository, artifactFile, ArtifactIndexingTask.Action.ADD,
181                                           getIndexingContext(), false );
182             // only update index we don't need to scan the full repo here
183             task.setOnlyUpdate( true );
184             try
185             {
186                 log.debug( "Queueing indexing task '{}' to add or update the artifact in the index.", task );
187                 scheduler.queueTask( task );
188             }
189             catch ( TaskQueueException e )
190             {
191                 throw new ConsumerException( e.getMessage(), e );
192             }
193         }
194     }
195
196     @Override
197     public void completeScan()
198     {
199         IndexingContext context = this.indexingContext;
200         if ( context == null )
201         {
202             try
203             {
204                 context = getIndexingContext();
205             }
206             catch ( ConsumerException e )
207             {
208                 log.warn( "failed to get an IndexingContext:{}", e.getMessage() );
209                 return;
210             }
211         }
212         ArtifactIndexingTask task =
213             new ArtifactIndexingTask( repository, null, ArtifactIndexingTask.Action.FINISH, context );
214         try
215         {
216             log.debug( "Queueing indexing task '{}' to finish indexing.", task );
217             scheduler.queueTask( task );
218         }
219         catch ( TaskQueueException e )
220         {
221             log.error( "Error queueing task: " + task + ": " + e.getMessage(), e );
222         }
223     }
224
225     @Override
226     public void completeScan( boolean executeOnEntireRepo )
227     {
228         if ( executeOnEntireRepo )
229         {
230             completeScan();
231         }
232
233         // else, do nothing as the context will be closed when indexing task is executed if not a repo scan request!
234     }
235
236     @Override
237     public List<String> getExcludes()
238     {
239         return Collections.emptyList();
240     }
241
242     @Override
243     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
244     {
245         if ( ConfigurationNames.isRepositoryScanning( propertyName ) )
246         {
247             initIncludes();
248         }
249     }
250
251     @Override
252     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
253     {
254         /* do nothing */
255     }
256
257     private void initIncludes()
258     {
259         List<String> indexable = filetypes.getFileTypePatterns( FileTypes.INDEXABLE_CONTENT );
260         List<String> artifacts = filetypes.getFileTypePatterns( FileTypes.ARTIFACTS );
261
262         includes = new ArrayList<>( indexable.size() + artifacts.size() );
263
264         includes.addAll( indexable );
265
266         includes.addAll( artifacts );
267     }
268
269     @PostConstruct
270     public void initialize()
271     {
272         configuration.addChangeListener( this );
273
274         initIncludes();
275     }
276
277     @Override
278     public List<String> getIncludes()
279     {
280         return includes;
281     }
282
283
284     private IndexingContext getIndexingContext()
285         throws ConsumerException
286     {
287
288         if ( this.indexingContext == null )
289         {
290             try
291             {
292                 indexingContext = managedRepositoryAdmin.createIndexContext( repository );
293             }
294             catch ( RepositoryAdminException e )
295             {
296                 throw new ConsumerException( e.getMessage(), e );
297             }
298         }
299         return indexingContext;
300     }
301 }