]> source.dussan.org Git - archiva.git/blob
330b8b976592e7c8b833b15b142fdcb3620cea23
[archiva.git] /
1 package org.apache.archiva.indexer.search;
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.List;
25 import java.util.Map;
26 import java.util.Set;
27
28 import org.apache.lucene.search.BooleanQuery;
29 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
30 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
31 import org.apache.maven.archiva.indexer.search.SearchResultHit;
32 import org.apache.maven.archiva.indexer.search.SearchResultLimits;
33 import org.apache.maven.archiva.indexer.search.SearchResults;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36 import org.sonatype.nexus.index.ArtifactInfo;
37 import org.sonatype.nexus.index.FlatSearchRequest;
38 import org.sonatype.nexus.index.FlatSearchResponse;
39 import org.sonatype.nexus.index.NexusIndexer;
40 import org.sonatype.nexus.index.context.IndexContextInInconsistentStateException;
41 import org.sonatype.nexus.index.context.IndexingContext;
42 import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException;
43
44 /**
45  * RepositorySearch implementation which uses the Nexus Indexer for searching.
46  */
47 public class NexusRepositorySearch
48     implements RepositorySearch
49 {
50     private static final Logger log = LoggerFactory.getLogger( NexusRepositorySearch.class ); 
51                                                               
52     private NexusIndexer indexer;
53     
54     private ArchivaConfiguration archivaConfig;
55     
56     public NexusRepositorySearch( NexusIndexer indexer, ArchivaConfiguration archivaConfig )
57     {
58         this.indexer = indexer;
59         this.archivaConfig = archivaConfig;
60     }
61
62     public SearchResults search( String principal, List<String> selectedRepos, String term, SearchResultLimits limits )
63         throws RepositorySearchException
64     {   
65         addIndexingContexts( selectedRepos );
66         
67         // TODO: 
68         // 1. construct query for:
69         //    - regular search
70         //    - searching within search results
71         // 2. consider pagination
72         
73         BooleanQuery q = new BooleanQuery();
74         // q.add( nexusIndexer.constructQuery( ArtifactInfo.GROUP_ID, "org.apache.archiva" ), Occur.SHOULD );
75         // q.add( nexusIndexer.constructQuery( ArtifactInfo.ARTIFACT_ID, "archiva-index-methods-jar-test" ), Occur.SHOULD );
76
77         try
78         {
79             FlatSearchRequest request = new FlatSearchRequest( q );
80             FlatSearchResponse response = indexer.searchFlat( request );
81
82             return convertToSearchResults( response );
83         }
84         catch ( IndexContextInInconsistentStateException e )
85         {
86             throw new RepositorySearchException( e );
87         }
88         catch ( IOException e )
89         {
90             throw new RepositorySearchException( e );
91         }
92     }
93     
94     public SearchResults search( String principal, SearchFields searchFields, SearchResultLimits limits )
95         throws RepositorySearchException
96     {
97         // TODO Auto-generated method stub
98         return null;
99     }
100
101     private void addIndexingContexts( List<String> selectedRepos )
102     {
103         for( String repo : selectedRepos )
104         {
105             try
106             {
107                 ManagedRepositoryConfiguration repoConfig = archivaConfig.getConfiguration().findManagedRepositoryById( repo );
108                 String indexDir = repoConfig.getIndexDir();
109                 File indexDirectory = null;
110                 if( indexDir != null && !"".equals( indexDir ) )
111                 {
112                     indexDirectory = new File( repoConfig.getLocation(), repoConfig.getIndexDir() );
113                 }
114                 else
115                 {
116                     indexDirectory = new File( repoConfig.getLocation(), ".indexer" );
117                 }
118                 
119                 IndexingContext context =
120                     indexer.addIndexingContext( repoConfig.getId(), repoConfig.getId(), new File( repoConfig.getLocation() ),
121                                                 indexDirectory, null, null, NexusIndexer.FULL_INDEX );
122                 context.setSearchable( repoConfig.isScanned() );
123             }
124             catch ( UnsupportedExistingLuceneIndexException e )
125             {
126                 // skip repository
127                 log.warn( "Error accessing index of repository '" + repo + "' : " + e.getMessage() );
128                 continue;
129             }
130             catch ( IOException e )
131             {
132                 // skip repository
133                 log.warn( "IO error occured while accessing index of repository '" + repo + "' : " + e.getMessage() );
134                 continue;
135             }
136         }
137     }
138
139     private SearchResults convertToSearchResults( FlatSearchResponse response )
140     {
141         SearchResults results = new SearchResults();
142         Set<ArtifactInfo> artifactInfos = response.getResults();
143
144         for ( ArtifactInfo artifactInfo : artifactInfos )
145         {
146             String id = artifactInfo.groupId + ":" + artifactInfo.artifactId;
147             Map<String, SearchResultHit> hitsMap = results.getHitsMap();
148
149             SearchResultHit hit = hitsMap.get( id );
150             if ( hit != null )
151             {
152                 hit.addVersion( artifactInfo.version );
153             }
154             else
155             {
156                 hit = new SearchResultHit();
157                 hit.setArtifactId( artifactInfo.artifactId );
158                 hit.setGroupId( artifactInfo.groupId );
159                 hit.setRepositoryId( artifactInfo.repository );
160                 hit.setUrl( artifactInfo.repository + "/" + artifactInfo.fname );
161                 hit.addVersion( artifactInfo.version );
162             }
163
164             results.addHit( id, hit );
165         }
166
167         return results;
168     }
169
170 }