]> source.dussan.org Git - archiva.git/blob
6203611cbb846902ccc457c1d16d38d3dd1230f2
[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.Arrays;
26 import java.util.Date;
27 import java.util.HashSet;
28 import java.util.List;
29 import java.util.Set;
30
31 import org.apache.lucene.document.Document;
32 import org.apache.lucene.index.IndexReader;
33 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
34 import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
35 import org.apache.maven.archiva.consumers.ConsumerException;
36 import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
37 import org.apache.maven.archiva.repository.content.ManagedDefaultRepositoryContent;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
40 import org.sonatype.nexus.index.ArtifactContext;
41 import org.sonatype.nexus.index.ArtifactContextProducer;
42 import org.sonatype.nexus.index.ArtifactInfo;
43 import org.sonatype.nexus.index.DefaultArtifactContextProducer;
44 import org.sonatype.nexus.index.NexusIndexer;
45 import org.sonatype.nexus.index.context.IndexingContext;
46 import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException;
47 import org.sonatype.nexus.index.creator.AbstractIndexCreator;
48 import org.sonatype.nexus.index.creator.IndexerEngine;
49 import org.sonatype.nexus.index.packer.IndexPacker;
50
51 /**
52  * Consumer for indexing the repository to provide search and IDE integration features.
53  */
54 public class NexusIndexerConsumer
55     extends AbstractMonitoredConsumer
56     implements KnownRepositoryContentConsumer
57 {
58     private static final Logger log = LoggerFactory.getLogger( NexusIndexerConsumer.class );
59
60     private NexusIndexer indexer;
61
62     private ArtifactContextProducer artifactContextProducer;
63
64     private IndexPacker indexPacker;
65
66     private ManagedDefaultRepositoryContent repositoryContent;
67
68     private IndexingContext context;
69
70     private File managedRepository;
71     
72     private IndexerEngine indexerEngine;
73     
74     private Set<String> uinfos;
75
76     public NexusIndexerConsumer( NexusIndexer indexer, IndexPacker indexPacker, IndexerEngine indexerEngine )
77     {
78         this.indexer = indexer;
79         this.indexPacker = indexPacker;
80         this.indexerEngine = indexerEngine;
81         this.artifactContextProducer = new DefaultArtifactContextProducer();
82     }
83
84     public String getDescription()
85     {
86         return "Indexes the repository to provide search and IDE integration features";
87     }
88
89     public String getId()
90     {
91         return "index-content";
92     }
93
94     public boolean isPermanent()
95     {
96         return false;
97     }
98
99     public void beginScan( ManagedRepositoryConfiguration repository, Date whenGathered )
100         throws ConsumerException
101     {           
102         managedRepository = new File( repository.getLocation() );
103         String indexDir = repository.getIndexDir();
104         
105         File indexDirectory = null;
106         if( indexDir != null && !"".equals( indexDir ) )
107         {
108             indexDirectory = new File( repository.getIndexDir() );
109         }
110         else
111         {
112             indexDirectory = new File( managedRepository, ".indexer" );
113         }
114
115         repositoryContent = new ManagedDefaultRepositoryContent();
116         repositoryContent.setRepository( repository );
117         uinfos = new HashSet<String>();
118
119         synchronized ( indexer )
120         {
121             try
122             {
123                 context =
124                     indexer.addIndexingContext( repository.getId(), repository.getId(), managedRepository,
125                                                 indexDirectory, null, null, NexusIndexer.FULL_INDEX );
126                 context.setSearchable( repository.isScanned() );
127                 
128                 // read index to get all the artifacts already indexed
129                 IndexReader r = context.getIndexReader();                
130                 for ( int i = 0; i < r.numDocs(); i++ )
131                 {
132                     if ( !r.isDeleted( i ) )
133                     {
134                         Document d = r.document( i );          
135                         String uinfo = d.get( ArtifactInfo.UINFO );
136           
137                      // should we add a check here if the contents of the document still exist in the file system
138                      // for cases when there is already an existing index & the contents of that index doesn't exist
139                      // in the file system & in the database? 
140                         if ( uinfo != null )
141                         {
142                             uinfos.add( uinfo );
143                         }
144                     }
145                 }
146                 
147                 indexerEngine.beginIndexing( context );
148             }
149             catch ( UnsupportedExistingLuceneIndexException e )
150             {
151                 throw new ConsumerException( "Could not create index at " + indexDirectory.getAbsoluteFile(), e );
152             }
153             catch ( IOException e )
154             {
155                 throw new ConsumerException( "Could not create index at " + indexDirectory.getAbsoluteFile(), e );
156             }
157         }
158     }
159     
160     public void processFile( String path )
161         throws ConsumerException
162     {
163         if ( context == null )
164         {
165             // didn't start correctly, so skip
166             return;
167         }
168         
169         File artifactFile = new File( managedRepository, path );        
170         ArtifactContext artifactContext = artifactContextProducer.getArtifactContext( context, artifactFile );
171         
172         if ( artifactContext != null )
173         {
174             try
175             {                
176                 ArtifactInfo ai = artifactContext.getArtifactInfo();                
177                 String uinfo = AbstractIndexCreator.getGAV(
178                     ai.groupId, ai.artifactId, ai.version, ai.classifier, ai.packaging );
179                 
180                 // already indexed so update!
181                 if ( uinfos.contains( uinfo ) )
182                 {
183                     indexerEngine.update( context, artifactContext );
184                 }
185                 else
186                 {
187                     indexerEngine.index( context, artifactContext );
188                 }    
189             }
190             catch ( IOException e )
191             {
192                 throw new ConsumerException( e.getMessage(), e );
193             }
194         }
195     }
196
197     public void completeScan()
198     {   
199         final File indexLocation = new File( managedRepository, ".index" );
200         try
201         {
202             indexerEngine.endIndexing( context );            
203             indexPacker.packIndex( context, indexLocation );
204             indexer.removeIndexingContext( context, false );
205             uinfos = null;
206         }
207         catch ( IOException e )
208         {
209             log.error( "Could not pack index" + indexLocation.getAbsolutePath(), e );
210         }
211     }
212
213     public List<String> getExcludes()
214     {
215         return new ArrayList<String>();
216     }
217
218     public List<String> getIncludes()
219     {
220         return Arrays.asList( "**/*" );
221     }
222 }