]> source.dussan.org Git - archiva.git/blob
d33985117dfdaa0a038f728cb53ea14e6303513a
[archiva.git] /
1 package org.apache.archiva.rest.services;
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 net.sf.beanlib.provider.replicator.BeanReplicator;
23 import org.apache.archiva.indexer.search.RepositorySearch;
24 import org.apache.archiva.indexer.search.RepositorySearchException;
25 import org.apache.archiva.indexer.search.SearchFields;
26 import org.apache.archiva.indexer.search.SearchResultHit;
27 import org.apache.archiva.indexer.search.SearchResultLimits;
28 import org.apache.archiva.indexer.search.SearchResults;
29 import org.apache.archiva.rest.api.model.Artifact;
30 import org.apache.archiva.rest.api.model.Dependency;
31 import org.apache.archiva.rest.api.model.GroupIdList;
32 import org.apache.archiva.rest.api.model.SearchRequest;
33 import org.apache.archiva.rest.api.model.StringList;
34 import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
35 import org.apache.archiva.rest.api.services.SearchService;
36 import org.apache.commons.collections.ListUtils;
37 import org.apache.commons.lang.StringUtils;
38 import org.springframework.stereotype.Service;
39
40 import javax.inject.Inject;
41 import java.util.ArrayList;
42 import java.util.Collections;
43 import java.util.List;
44
45 /**
46  * @author Olivier Lamy
47  */
48 @Service( "searchService#rest" )
49 public class DefaultSearchService
50     extends AbstractRestService
51     implements SearchService
52 {
53
54     @Inject
55     private RepositorySearch repositorySearch;
56
57     public List<Artifact> quickSearch( String queryString )
58         throws ArchivaRestServiceException
59     {
60         if ( StringUtils.isBlank( queryString ) )
61         {
62             return Collections.emptyList();
63         }
64
65         SearchResultLimits limits = new SearchResultLimits( 0 );
66         try
67         {
68             SearchResults searchResults =
69                 repositorySearch.search( getPrincipal(), getObservableRepos(), queryString, limits,
70                                          Collections.<String>emptyList() );
71             return getArtifacts( searchResults );
72
73         }
74         catch ( RepositorySearchException e )
75         {
76             log.error( e.getMessage(), e );
77             throw new ArchivaRestServiceException( e.getMessage(), e );
78         }
79     }
80
81     public List<Artifact> quickSearchWithRepositories( SearchRequest searchRequest )
82         throws ArchivaRestServiceException
83     {
84         String queryString = searchRequest.getQueryTerms();
85         if ( StringUtils.isBlank( queryString ) )
86         {
87             return Collections.emptyList();
88         }
89         List<String> repositories = searchRequest.getRepositories();
90         if ( repositories == null || repositories.isEmpty() )
91         {
92             repositories = getObservableRepos();
93         }
94         SearchResultLimits limits = new SearchResultLimits( 0 );
95         try
96         {
97             SearchResults searchResults = repositorySearch.search( getPrincipal(), repositories, queryString, limits,
98                                                                    Collections.<String>emptyList() );
99             return getArtifacts( searchResults );
100
101         }
102         catch ( RepositorySearchException e )
103         {
104             log.error( e.getMessage(), e );
105             throw new ArchivaRestServiceException( e.getMessage(), e );
106         }
107     }
108
109     public List<Artifact> getArtifactVersions( String groupId, String artifactId, String packaging )
110         throws ArchivaRestServiceException
111     {
112         if ( StringUtils.isBlank( groupId ) || StringUtils.isBlank( artifactId ) )
113         {
114             return Collections.emptyList();
115         }
116         SearchFields searchField = new SearchFields();
117         searchField.setGroupId( groupId );
118         searchField.setArtifactId( artifactId );
119         searchField.setPackaging( StringUtils.isBlank( packaging ) ? "jar" : packaging );
120         searchField.setRepositories( getObservableRepos() );
121
122         try
123         {
124             SearchResults searchResults = repositorySearch.search( getPrincipal(), searchField, null );
125             return getArtifacts( searchResults );
126         }
127         catch ( RepositorySearchException e )
128         {
129             log.error( e.getMessage(), e );
130             throw new ArchivaRestServiceException( e.getMessage(), e );
131         }
132     }
133
134     public List<Artifact> searchArtifacts( SearchRequest searchRequest )
135         throws ArchivaRestServiceException
136     {
137         if ( searchRequest == null )
138         {
139             return Collections.emptyList();
140         }
141         SearchFields searchField = new BeanReplicator().replicateBean( searchRequest, SearchFields.class );
142         SearchResultLimits limits = new SearchResultLimits( 0 );
143
144         // if no repos set we use ones available for the user
145         if ( searchField.getRepositories() == null || searchField.getRepositories().isEmpty() )
146         {
147             searchField.setRepositories( getObservableRepos() );
148         }
149
150         try
151         {
152             SearchResults searchResults = repositorySearch.search( getPrincipal(), searchField, limits );
153             return getArtifacts( searchResults );
154         }
155         catch ( RepositorySearchException e )
156         {
157             log.error( e.getMessage(), e );
158             throw new ArchivaRestServiceException( e.getMessage(), e );
159         }
160     }
161
162     public GroupIdList getAllGroupIds( List<String> selectedRepos )
163         throws ArchivaRestServiceException
164     {
165         List<String> observableRepos = getObservableRepos();
166         List<String> repos = ListUtils.intersection( observableRepos, selectedRepos );
167         if ( repos == null || repos.isEmpty() )
168         {
169             return new GroupIdList( Collections.<String>emptyList() );
170         }
171         try
172         {
173             return new GroupIdList( new ArrayList<String>( repositorySearch.getAllGroupIds( getPrincipal(), repos ) ) );
174         }
175         catch ( RepositorySearchException e )
176         {
177             log.error( e.getMessage(), e );
178             throw new ArchivaRestServiceException( e.getMessage(), e );
179         }
180
181     }
182
183     public List<Dependency> getDependencies( String groupId, String artifactId, String version )
184         throws ArchivaRestServiceException
185     {
186         return null;  //To change body of implemented methods use File | Settings | File Templates.
187     }
188
189     public List<Artifact> getArtifactByChecksum( String checksum )
190         throws ArchivaRestServiceException
191     {
192         return null;  //To change body of implemented methods use File | Settings | File Templates.
193     }
194
195     public StringList getObservablesRepoIds()
196         throws ArchivaRestServiceException
197     {
198         return new StringList( getObservableRepos() );
199     }
200
201     //-------------------------------------
202     // internal
203     //-------------------------------------
204     protected List<Artifact> getArtifacts( SearchResults searchResults )
205         throws ArchivaRestServiceException
206     {
207
208         if ( searchResults == null || searchResults.isEmpty() )
209         {
210             return Collections.emptyList();
211         }
212         List<Artifact> artifacts = new ArrayList<Artifact>( searchResults.getReturnedHitsCount() );
213         for ( SearchResultHit hit : searchResults.getHits() )
214         {
215             // duplicate Artifact one per available version
216             if ( hit.getVersions().size() > 0 )
217             {
218                 for ( String version : hit.getVersions() )
219                 {
220
221                     Artifact versionned = new BeanReplicator().replicateBean( hit, Artifact.class );
222
223                     if ( StringUtils.isNotBlank( version ) )
224                     {
225                         versionned.setVersion( version );
226                         versionned.setUrl( getArtifactUrl( versionned ) );
227
228                         artifacts.add( versionned );
229
230                     }
231                 }
232             }
233         }
234         return artifacts;
235     }
236
237
238 }