]> source.dussan.org Git - archiva.git/blob
be141b307cee01dba844f96d80cfa9dcd08260f9
[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 java.io.File;
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.Date;
27 import java.util.List;
28
29 import org.apache.archiva.scheduler.ArchivaTaskScheduler;
30 import org.apache.archiva.scheduler.indexing.ArtifactIndexingTask;
31 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
32 import org.apache.maven.archiva.configuration.ConfigurationNames;
33 import org.apache.maven.archiva.configuration.FileTypes;
34 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
35 import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
36 import org.apache.maven.archiva.consumers.ConsumerException;
37 import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
38 import org.apache.maven.archiva.repository.content.ManagedDefaultRepositoryContent;
39 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
40 import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
41 import org.codehaus.plexus.registry.Registry;
42 import org.codehaus.plexus.registry.RegistryListener;
43 import org.codehaus.plexus.taskqueue.TaskQueueException;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46 import org.sonatype.nexus.index.context.IndexingContext;
47 import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException;
48
49 /**
50  * Consumer for indexing the repository to provide search and IDE integration features.
51  */
52 public class NexusIndexerConsumer
53     extends AbstractMonitoredConsumer
54     implements KnownRepositoryContentConsumer, RegistryListener, Initializable
55 {
56     private static final Logger log = LoggerFactory.getLogger( NexusIndexerConsumer.class );
57
58     private ArchivaConfiguration configuration;
59
60     private FileTypes filetypes;
61
62     private ManagedDefaultRepositoryContent repositoryContent;
63
64     private File managedRepository;
65
66     private ArchivaTaskScheduler<ArtifactIndexingTask> scheduler;
67
68     private IndexingContext context;
69
70     private List<String> includes = new ArrayList<String>();
71
72     public NexusIndexerConsumer( ArchivaTaskScheduler<ArtifactIndexingTask> scheduler,
73                                  ArchivaConfiguration configuration, FileTypes filetypes )
74     {
75         this.configuration = configuration;
76         this.filetypes = filetypes;
77         this.scheduler = scheduler;
78     }
79
80     public String getDescription()
81     {
82         return "Indexes the repository to provide search and IDE integration features";
83     }
84
85     public String getId()
86     {
87         return "index-content";
88     }
89
90     public boolean isPermanent()
91     {
92         return false;
93     }
94
95     public void beginScan( ManagedRepositoryConfiguration repository, Date whenGathered )
96         throws ConsumerException
97     {
98         managedRepository = new File( repository.getLocation() );
99
100         repositoryContent = new ManagedDefaultRepositoryContent();
101         repositoryContent.setRepository( repository );
102
103         try
104         {
105             context = ArtifactIndexingTask.createContext( repository );
106         }
107         catch ( IOException e )
108         {
109             throw new ConsumerException( e.getMessage(), e );
110         }
111         catch ( UnsupportedExistingLuceneIndexException e )
112         {
113             throw new ConsumerException( e.getMessage(), e );
114         }
115     }
116
117     public void processFile( String path )
118         throws ConsumerException
119     {
120         File artifactFile = new File( managedRepository, path );
121
122         ArtifactIndexingTask task =
123             new ArtifactIndexingTask( repositoryContent.getRepository(), artifactFile, ArtifactIndexingTask.Action.ADD,
124                                       context );
125         try
126         {
127             log.debug( "Queueing indexing task + '" + task + "' to add or update the artifact in the index." );
128             scheduler.queueTask( task );
129         }
130         catch ( TaskQueueException e )
131         {
132             throw new ConsumerException( e.getMessage(), e );
133         }
134     }
135
136     public void completeScan()
137     {
138         ArtifactIndexingTask task =
139             new ArtifactIndexingTask( repositoryContent.getRepository(), null, ArtifactIndexingTask.Action.FINISH,
140                                       context );
141         try
142         {
143             log.debug( "Queueing indexing task + '" + task + "' to finish indexing." );
144             scheduler.queueTask( task );
145         }
146         catch ( TaskQueueException e )
147         {
148             log.error( "Error queueing task: " + task + ": " + e.getMessage(), e );
149         }
150         context = null;
151     }
152
153     public List<String> getExcludes()
154     {
155         return Collections.emptyList();
156     }
157
158     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
159     {
160         if ( ConfigurationNames.isRepositoryScanning( propertyName ) )
161         {
162             initIncludes();
163         }
164     }
165
166     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
167     {
168         /* do nothing */
169     }
170
171     private void initIncludes()
172     {
173         includes.clear();
174
175         includes.addAll( filetypes.getFileTypePatterns( FileTypes.INDEXABLE_CONTENT ) );
176
177         includes.addAll( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) );
178     }
179
180     public void initialize()
181         throws InitializationException
182     {
183         configuration.addChangeListener( this );
184
185         initIncludes();
186     }
187
188     public List<String> getIncludes()
189     {
190         return includes;
191     }
192 }