]> source.dussan.org Git - archiva.git/blob
aebfb1527c8427b596b7f626b8b3eab8f9dab385
[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 java.util.Collections;
23 import java.util.List;
24
25 import com.opensymphony.xwork2.ActionContext;
26 import org.apache.commons.collections.CollectionUtils;
27 import org.apache.commons.lang.StringUtils;
28 import org.apache.maven.archiva.database.ArchivaDatabaseException;
29 import org.apache.maven.archiva.database.ObjectNotFoundException;
30 import org.apache.maven.archiva.database.browsing.BrowsingResults;
31 import org.apache.maven.archiva.database.browsing.RepositoryBrowsing;
32 import org.apache.maven.archiva.model.ArchivaProjectModel;
33 import org.apache.maven.archiva.security.*;
34
35 /**
36  * Browse the repository.
37  *
38  * @todo cache browsing results.
39  * @todo implement repository selectors (all or specific repository)
40  * @todo implement security around browse (based on repository id at first)
41  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="browseAction" instantiation-strategy="per-lookup"
42  */
43 public class BrowseAction
44     extends PlexusActionSupport
45 {
46     /**
47      * @plexus.requirement role-hint="default"
48      */
49     private RepositoryBrowsing repoBrowsing;
50     
51     /**
52      * @plexus.requirement
53      */
54     private UserRepositories userRepositories;
55     
56     /**
57      * @plexus.requirement
58      */
59     private ArchivaXworkUser archivaXworkUser;
60     
61     private BrowsingResults results;
62
63     private String groupId;
64
65     private String artifactId;
66     
67     private String repositoryId;
68     
69     private ArchivaProjectModel sharedModel;
70     
71     public String browse()
72     {
73         List<String> selectedRepos = getObservableRepos();
74         if ( CollectionUtils.isEmpty( selectedRepos ) )
75         {
76             return GlobalResults.ACCESS_TO_NO_REPOS;
77         }
78
79         this.results = repoBrowsing.getRoot( getPrincipal(), selectedRepos );
80         return SUCCESS;
81     }
82
83     public String browseGroup()
84     {
85         if ( StringUtils.isEmpty( groupId ) )
86         {
87             // TODO: i18n
88             addActionError( "You must specify a group ID to browse" );
89             return ERROR;
90         }
91
92         List<String> selectedRepos = getObservableRepos();
93         if ( CollectionUtils.isEmpty( selectedRepos ) )
94         {
95             return GlobalResults.ACCESS_TO_NO_REPOS;
96         }
97
98         
99         this.results = repoBrowsing.selectGroupId( getPrincipal(), selectedRepos, groupId );
100         return SUCCESS;
101     }
102
103     public String browseArtifact()
104     {
105         if ( StringUtils.isEmpty( groupId ) )
106         {
107             // TODO: i18n
108             addActionError( "You must specify a group ID to browse" );
109             return ERROR;
110         }
111
112         if ( StringUtils.isEmpty( artifactId ) )
113         {
114             // TODO: i18n
115             addActionError( "You must specify a artifact ID to browse" );
116             return ERROR;
117         }
118
119         List<String> selectedRepos = getObservableRepos();
120         if ( CollectionUtils.isEmpty( selectedRepos ) )
121         {
122             return GlobalResults.ACCESS_TO_NO_REPOS;
123         }
124         
125         this.results = repoBrowsing.selectArtifactId( getPrincipal(), selectedRepos, groupId, artifactId );
126
127         populateSharedModel();
128         
129         return SUCCESS;
130     }
131
132     private void populateSharedModel()
133     {
134         sharedModel = new ArchivaProjectModel();
135         sharedModel.setGroupId( groupId );
136         sharedModel.setArtifactId( artifactId );
137         boolean isFirstVersion = true;
138                 
139         for( String version :  this.results.getVersions() )
140         {            
141             try
142             {
143                 ArchivaProjectModel model =
144                     repoBrowsing.selectVersion( getPrincipal(), getObservableRepos(), groupId, artifactId, version );
145                 
146                 if( isFirstVersion )
147                 {
148                     sharedModel = model;
149                 }
150                 else
151                 {
152                     if ( sharedModel.getPackaging() != null &&
153                         !StringUtils.equalsIgnoreCase( sharedModel.getPackaging(), model.getPackaging() ) )
154                     {
155                         sharedModel.setPackaging( null );
156                     }
157                     
158                     if ( sharedModel.getName() != null &&
159                         !StringUtils.equalsIgnoreCase( sharedModel.getName(), model.getName() ) )
160                     {
161                         sharedModel.setName( "" );
162                     }
163
164                     if ( sharedModel.getDescription() != null &&
165                         !StringUtils.equalsIgnoreCase( sharedModel.getDescription(), model.getDescription() ) )
166                     {
167                         sharedModel.setDescription( null );
168                     }
169
170                     if ( sharedModel.getIssueManagement() != null &&
171                         !StringUtils.equalsIgnoreCase( sharedModel.getIssueManagement().getUrl(), model.getIssueManagement().getUrl() ) )
172                     {
173                         sharedModel.setIssueManagement( null );
174                     }
175
176                     if ( sharedModel.getCiManagement() != null &&
177                         !StringUtils.equalsIgnoreCase( sharedModel.getCiManagement().getUrl(), model.getCiManagement().getUrl() ) )
178                     {
179                         sharedModel.setCiManagement( null );
180                     }
181
182                     if ( sharedModel.getOrganization() != null &&
183                         !StringUtils.equalsIgnoreCase( sharedModel.getOrganization().getName(), model.getOrganization().getName() ) )
184                     {
185                         sharedModel.setOrganization( null );
186                     }
187
188                     if ( sharedModel.getUrl() != null && !StringUtils.equalsIgnoreCase( sharedModel.getUrl(), model.getUrl() ) )
189                     {
190                         sharedModel.setUrl( null );
191                     }
192                 }
193                 
194                 isFirstVersion = false;
195             }
196             catch ( ObjectNotFoundException e )
197             {
198                 log.debug( e.getMessage(), e );
199             }
200             catch ( ArchivaDatabaseException e )
201             {
202                 log.debug( e.getMessage(), e );
203             }
204         }        
205     }
206     
207     private String getPrincipal()
208     {
209         return archivaXworkUser.getActivePrincipal( ActionContext.getContext().getSession() );
210     }
211     
212     private List<String> getObservableRepos()
213     {
214         try
215         {
216             return userRepositories.getObservableRepositoryIds( getPrincipal() );
217         }
218         catch ( PrincipalNotFoundException e )
219         {
220             log.warn( e.getMessage(), e );
221         }
222         catch ( AccessDeniedException e )
223         {
224             log.warn( e.getMessage(), e );
225             // TODO: pass this onto the screen.
226         }
227         catch ( ArchivaSecurityException e )
228         {
229             log.warn( e.getMessage(), e );
230         }
231         return Collections.emptyList();
232     }
233
234     public String getGroupId()
235     {
236         return groupId;
237     }
238
239     public void setGroupId( String groupId )
240     {
241         this.groupId = groupId;
242     }
243
244     public String getArtifactId()
245     {
246         return artifactId;
247     }
248
249     public void setArtifactId( String artifactId )
250     {
251         this.artifactId = artifactId;
252     }
253
254     public BrowsingResults getResults()
255     {
256         return results;
257     }
258     
259     public String getRepositoryId(){
260         
261         return repositoryId;
262     }
263     
264     public void setRepositoryId(String repositoryId){
265         
266         this.repositoryId = repositoryId;
267     }
268
269     public ArchivaProjectModel getSharedModel()
270     {
271         return sharedModel;
272     }
273
274     public void setSharedModel( ArchivaProjectModel sharedModel )
275     {
276         this.sharedModel = sharedModel;
277     }
278 }