]> source.dussan.org Git - archiva.git/blob
2567d13baf7c464b71b3393a9cf05ae5d4852865
[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.maven.archiva.configuration.ArchivaConfiguration;
30 import org.apache.maven.archiva.configuration.ConfigurationNames;
31 import org.apache.maven.archiva.configuration.FileTypes;
32 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
33 import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
34 import org.apache.maven.archiva.consumers.ConsumerException;
35 import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
36 import org.apache.maven.archiva.repository.content.ManagedDefaultRepositoryContent;
37 import org.apache.maven.archiva.scheduled.ArchivaTaskScheduler;
38 import org.apache.maven.archiva.scheduled.tasks.ArtifactIndexingTask;
39 import org.apache.maven.archiva.scheduled.tasks.TaskCreator;
40 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
41 import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
42 import org.codehaus.plexus.registry.Registry;
43 import org.codehaus.plexus.registry.RegistryListener;
44 import org.codehaus.plexus.taskqueue.TaskQueueException;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47 import org.sonatype.nexus.index.context.IndexingContext;
48 import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException;
49
50 /**
51  * Consumer for indexing the repository to provide search and IDE integration features.
52  */
53 public class NexusIndexerConsumer
54     extends AbstractMonitoredConsumer
55     implements KnownRepositoryContentConsumer, RegistryListener, Initializable
56 {
57     private static final Logger log = LoggerFactory.getLogger( NexusIndexerConsumer.class );
58
59     private ArchivaConfiguration configuration;
60
61     private FileTypes filetypes;
62
63     private ManagedDefaultRepositoryContent repositoryContent;
64
65     private File managedRepository;
66
67     private ArchivaTaskScheduler scheduler;
68
69     private IndexingContext context;
70
71     private List<String> includes = new ArrayList<String>();
72
73     public NexusIndexerConsumer( ArchivaTaskScheduler scheduler, 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 = TaskCreator.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             TaskCreator.createIndexingTask( repositoryContent.getRepository(), artifactFile,
124                                             ArtifactIndexingTask.Action.ADD, context );
125         try
126         {
127             log.debug( "Queueing indexing task + '" + task + "' to add or update the artifact in the index." );
128             scheduler.queueIndexingTask( 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             TaskCreator.createIndexingTask( repositoryContent.getRepository(), null,
140                                             ArtifactIndexingTask.Action.FINISH, context );
141         try
142         {
143             log.debug( "Queueing indexing task + '" + task + "' to finish indexing." );
144             scheduler.queueIndexingTask( 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 }