]> source.dussan.org Git - archiva.git/blob
2785f7414eca76165df58aac4aa69924f3f9164f
[archiva.git] /
1 package org.apache.maven.archiva.web.action;
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 org.apache.commons.collections.CollectionUtils;
23 import org.apache.commons.lang.StringUtils;
24 import org.apache.maven.archiva.database.ArchivaDAO;
25 import org.apache.maven.archiva.database.Constraint;
26 import org.apache.maven.archiva.database.constraints.ArtifactsByChecksumConstraint;
27 import org.apache.maven.archiva.indexer.RepositoryIndexException;
28 import org.apache.maven.archiva.indexer.RepositoryIndexSearchException;
29 import org.apache.maven.archiva.indexer.search.CrossRepositorySearch;
30 import org.apache.maven.archiva.indexer.search.SearchResultLimits;
31 import org.apache.maven.archiva.indexer.search.SearchResults;
32 import org.apache.maven.archiva.security.AccessDeniedException;
33 import org.apache.maven.archiva.security.ArchivaSecurityException;
34 import org.apache.maven.archiva.security.ArchivaUser;
35 import org.apache.maven.archiva.security.PrincipalNotFoundException;
36 import org.apache.maven.archiva.security.UserRepositories;
37 import org.codehaus.plexus.xwork.action.PlexusActionSupport;
38
39 import java.net.MalformedURLException;
40 import java.util.Collections;
41 import java.util.List;
42
43 /**
44  * Search all indexed fields by the given criteria.
45  *
46  * @plexus.component role="com.opensymphony.xwork.Action" role-hint="searchAction"
47  */
48 public class SearchAction
49     extends PlexusActionSupport
50 {
51     /**
52      * Query string.
53      */
54     private String q;
55
56     /**
57      * @plexus.requirement role-hint="jdo"
58      */
59     private ArchivaDAO dao;
60
61     /**
62      * The Search Results.
63      */
64     private SearchResults results;
65
66     /**
67      * @plexus.requirement role-hint="default"
68      */
69     private CrossRepositorySearch crossRepoSearch;
70     
71     /**
72      * @plexus.requirement
73      */
74     private UserRepositories userRepositories;
75     
76     /**
77      * @plexus.requirement role-hint="xwork"
78      */
79     private ArchivaUser archivaUser;
80
81     private static final String RESULTS = "results";
82
83     private static final String ARTIFACT = "artifact";
84
85     private List databaseResults;
86
87     public String quickSearch()
88         throws MalformedURLException, RepositoryIndexException, RepositoryIndexSearchException
89     {
90         /* TODO: give action message if indexing is in progress.
91          * This should be based off a count of 'unprocessed' artifacts.
92          * This (yet to be written) routine could tell the user that X (unprocessed) artifacts are not yet 
93          * present in the full text search.
94          */
95
96         assert q != null && q.length() != 0;
97
98         SearchResultLimits limits = new SearchResultLimits( 0 );
99         
100         List<String> selectedRepos = getObservableRepos();
101         if ( CollectionUtils.isEmpty( selectedRepos ) )
102         {
103             return GlobalResults.ACCESS_TO_NO_REPOS;
104         }
105
106         results = crossRepoSearch.searchForTerm( getPrincipal(), selectedRepos, q, limits );
107
108         if ( results.isEmpty() )
109         {
110             addActionError( "No results found" );
111             return INPUT;
112         }
113
114         // TODO: filter / combine the artifacts by version? (is that even possible with non-artifact hits?)
115
116         /* I don't think that we should, as I expect us to utilize the 'score' system in lucene in 
117          * the future to return relevant links better.
118          * I expect the lucene scoring system to take multiple hits on different areas of a single document
119          * to result in a higher score. 
120          *   - Joakim
121          */
122
123         return SUCCESS;
124     }
125
126     public String findArtifact()
127         throws Exception
128     {
129         // TODO: give action message if indexing is in progress
130
131         if ( StringUtils.isBlank( q ) )
132         {
133             addActionError( "Unable to search for a blank checksum" );
134             return INPUT;
135         }
136
137         Constraint constraint = new ArtifactsByChecksumConstraint( q );
138         databaseResults = dao.getArtifactDAO().queryArtifacts( constraint );
139
140         if ( databaseResults.isEmpty() )
141         {
142             addActionError( "No results found" );
143             return INPUT;
144         }
145
146         if ( databaseResults.size() == 1 )
147         {
148             // 1 hit? return it's information directly!            
149             return ARTIFACT;
150         }
151         
152         return RESULTS;
153     }
154
155     @Override
156     public String doInput()
157     {
158         return INPUT;
159     }
160     
161     private String getPrincipal()
162     {
163         return archivaUser.getActivePrincipal();
164     }
165     
166     private List<String> getObservableRepos()
167     {
168         try
169         {
170             return userRepositories.getObservableRepositoryIds( getPrincipal() );
171         }
172         catch ( PrincipalNotFoundException e )
173         {
174             getLogger().warn( e.getMessage(), e );
175         }
176         catch ( AccessDeniedException e )
177         {
178             getLogger().warn( e.getMessage(), e );
179             // TODO: pass this onto the screen.
180         }
181         catch ( ArchivaSecurityException e )
182         {
183             getLogger().warn( e.getMessage(), e );
184         }
185         return Collections.emptyList();
186     }
187
188     public String getQ()
189     {
190         return q;
191     }
192
193     public void setQ( String q )
194     {
195         this.q = q;
196     }
197
198     public SearchResults getResults()
199     {
200         return results;
201     }
202
203     public List getDatabaseResults()
204     {
205         return databaseResults;
206     }
207 }