]> source.dussan.org Git - archiva.git/blob
41d5d2181f5da16a7f291a31575ee3dfd3f5cecc
[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() );
78         }
79     }
80
81     public List<Artifact> getArtifactVersions( String groupId, String artifactId, String packaging )
82         throws ArchivaRestServiceException
83     {
84         if ( StringUtils.isBlank( groupId ) || StringUtils.isBlank( artifactId ) )
85         {
86             return Collections.emptyList();
87         }
88         SearchFields searchField = new SearchFields();
89         searchField.setGroupId( groupId );
90         searchField.setArtifactId( artifactId );
91         searchField.setPackaging( StringUtils.isBlank( packaging ) ? "jar" : packaging );
92         searchField.setRepositories( getObservableRepos() );
93
94         try
95         {
96             SearchResults searchResults = repositorySearch.search( getPrincipal(), searchField, null );
97             return getArtifacts( searchResults );
98         }
99         catch ( RepositorySearchException e )
100         {
101             log.error( e.getMessage(), e );
102             throw new ArchivaRestServiceException( e.getMessage() );
103         }
104     }
105
106     public List<Artifact> searchArtifacts( SearchRequest searchRequest )
107         throws ArchivaRestServiceException
108     {
109         if ( searchRequest == null )
110         {
111             return Collections.emptyList();
112         }
113         SearchFields searchField = new BeanReplicator().replicateBean( searchRequest, SearchFields.class );
114         SearchResultLimits limits = new SearchResultLimits( 0 );
115
116         // if no repos set we use ones available for the user
117         if ( searchField.getRepositories() == null || searchField.getRepositories().isEmpty() )
118         {
119             searchField.setRepositories( getObservableRepos() );
120         }
121
122         try
123         {
124             SearchResults searchResults = repositorySearch.search( getPrincipal(), searchField, limits );
125             return getArtifacts( searchResults );
126         }
127         catch ( RepositorySearchException e )
128         {
129             log.error( e.getMessage(), e );
130             throw new ArchivaRestServiceException( e.getMessage() );
131         }
132     }
133
134     public GroupIdList getAllGroupIds( List<String> selectedRepos )
135         throws ArchivaRestServiceException
136     {
137         List<String> observableRepos = getObservableRepos();
138         List<String> repos = ListUtils.intersection( observableRepos, selectedRepos );
139         if ( repos == null || repos.isEmpty() )
140         {
141             return new GroupIdList( Collections.<String>emptyList() );
142         }
143         try
144         {
145             return new GroupIdList( new ArrayList<String>( repositorySearch.getAllGroupIds( getPrincipal(), repos ) ) );
146         }
147         catch ( RepositorySearchException e )
148         {
149             log.error( e.getMessage(), e );
150             throw new ArchivaRestServiceException( e.getMessage() );
151         }
152
153     }
154
155     public List<Dependency> getDependencies( String groupId, String artifactId, String version )
156         throws ArchivaRestServiceException
157     {
158         return null;  //To change body of implemented methods use File | Settings | File Templates.
159     }
160
161     public List<Artifact> getArtifactByChecksum( String checksum )
162         throws ArchivaRestServiceException
163     {
164         return null;  //To change body of implemented methods use File | Settings | File Templates.
165     }
166
167     public StringList getObservablesRepoIds()
168         throws ArchivaRestServiceException
169     {
170         return new StringList( getObservableRepos() );
171     }
172
173     //-------------------------------------
174     // internal
175     //-------------------------------------
176     protected List<Artifact> getArtifacts( SearchResults searchResults )
177     {
178
179         if ( searchResults == null || searchResults.isEmpty() )
180         {
181             return Collections.emptyList();
182         }
183         List<Artifact> artifacts = new ArrayList<Artifact>( searchResults.getReturnedHitsCount() );
184         for ( SearchResultHit hit : searchResults.getHits() )
185         {
186             // duplicate Artifact one per available version
187             if ( hit.getVersions().size() > 0 )
188             {
189                 for ( String version : hit.getVersions() )
190                 {
191
192                     Artifact versionned = new BeanReplicator().replicateBean( hit, Artifact.class );
193
194                     if ( StringUtils.isNotBlank( version ) )
195                     {
196                         versionned.setVersion( version );
197                         versionned.setUrl( getArtifactUrl( versionned, version ) );
198
199                         artifacts.add( versionned );
200
201                     }
202                 }
203             }
204         }
205         return artifacts;
206     }
207
208     /**
209      * TODO add a configuration mechanism to have configured the base archiva url
210      *
211      * @param artifact
212      * @return
213      */
214     private String getArtifactUrl( Artifact artifact, String version )
215     {
216
217         if ( httpServletRequest == null )
218         {
219             return null;
220         }
221         if ( StringUtils.isEmpty( artifact.getUrl() ) )
222         {
223             return null;
224         }
225         StringBuilder sb = new StringBuilder( getBaseUrl( httpServletRequest ) );
226
227         sb.append( "/repository" );
228
229         sb.append( '/' ).append( artifact.getContext() );
230
231         sb.append( '/' ).append( StringUtils.replaceChars( artifact.getGroupId(), '.', '/' ) );
232         sb.append( '/' ).append( artifact.getArtifactId() );
233         sb.append( '/' ).append( artifact.getVersion() );
234         sb.append( '/' ).append( artifact.getArtifactId() );
235         sb.append( '-' ).append( artifact.getVersion() );
236         if ( StringUtils.isNotBlank( artifact.getClassifier() ) )
237         {
238             sb.append( '-' ).append( artifact.getClassifier() );
239         }
240         // maven-plugin packaging is a jar
241         if ( StringUtils.equals( "maven-plugin", artifact.getPackaging() ) )
242         {
243             sb.append( "jar" );
244         }
245         else
246         {
247             sb.append( '.' ).append( artifact.getPackaging() );
248         }
249
250         return sb.toString();
251     }
252
253
254 }