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