]> source.dussan.org Git - archiva.git/blob
8d986cd7864a9bb23c29d243647ab2970006d69f
[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( model == null )
147                 {
148                     continue;
149                 }
150                 
151                 if( isFirstVersion )
152                 {
153                     sharedModel = model;
154                 }
155                 else
156                 {
157                     if ( sharedModel.getPackaging() != null &&
158                         !StringUtils.equalsIgnoreCase( sharedModel.getPackaging(), model.getPackaging() ) )
159                     {
160                         sharedModel.setPackaging( null );
161                     }
162                     
163                     if ( sharedModel.getName() != null &&
164                         !StringUtils.equalsIgnoreCase( sharedModel.getName(), model.getName() ) )
165                     {
166                         sharedModel.setName( "" );
167                     }
168
169                     if ( sharedModel.getDescription() != null &&
170                         !StringUtils.equalsIgnoreCase( sharedModel.getDescription(), model.getDescription() ) )
171                     {
172                         sharedModel.setDescription( null );
173                     }
174
175                     if ( sharedModel.getIssueManagement() != null && model.getIssueManagement() != null &&
176                         !StringUtils.equalsIgnoreCase( sharedModel.getIssueManagement().getUrl(), model.getIssueManagement().getUrl() ) )
177                     {
178                         sharedModel.setIssueManagement( null );
179                     }
180
181                     if ( sharedModel.getCiManagement() != null && model.getCiManagement() != null &&
182                         !StringUtils.equalsIgnoreCase( sharedModel.getCiManagement().getUrl(), model.getCiManagement().getUrl() ) )
183                     {
184                         sharedModel.setCiManagement( null );
185                     }
186
187                     if ( sharedModel.getOrganization() != null && model.getOrganization() != null && 
188                         !StringUtils.equalsIgnoreCase( sharedModel.getOrganization().getName(), model.getOrganization().getName() ) )
189                     {
190                         sharedModel.setOrganization( null );
191                     }
192
193                     if ( sharedModel.getUrl() != null && !StringUtils.equalsIgnoreCase( sharedModel.getUrl(), model.getUrl() ) )
194                     {
195                         sharedModel.setUrl( null );
196                     }
197                 }
198                 
199                 isFirstVersion = false;
200             }
201             catch ( ObjectNotFoundException e )
202             {
203                 log.debug( e.getMessage(), e );
204             }
205             catch ( ArchivaDatabaseException e )
206             {
207                 log.debug( e.getMessage(), e );
208             }
209         }        
210     }
211     
212     @SuppressWarnings("unchecked")
213     private String getPrincipal()
214     {
215         return archivaXworkUser.getActivePrincipal( ActionContext.getContext().getSession() );
216     }
217     
218     private List<String> getObservableRepos()
219     {
220         try
221         {
222             return userRepositories.getObservableRepositoryIds( getPrincipal() );
223         }
224         catch ( PrincipalNotFoundException e )
225         {
226             log.warn( e.getMessage(), e );
227         }
228         catch ( AccessDeniedException e )
229         {
230             log.warn( e.getMessage(), e );
231             // TODO: pass this onto the screen.
232         }
233         catch ( ArchivaSecurityException e )
234         {
235             log.warn( e.getMessage(), e );
236         }
237         return Collections.emptyList();
238     }
239
240     public String getGroupId()
241     {
242         return groupId;
243     }
244
245     public void setGroupId( String groupId )
246     {
247         this.groupId = groupId;
248     }
249
250     public String getArtifactId()
251     {
252         return artifactId;
253     }
254
255     public void setArtifactId( String artifactId )
256     {
257         this.artifactId = artifactId;
258     }
259
260     public BrowsingResults getResults()
261     {
262         return results;
263     }
264     
265     public String getRepositoryId(){
266         
267         return repositoryId;
268     }
269     
270     public void setRepositoryId(String repositoryId){
271         
272         this.repositoryId = repositoryId;
273     }
274
275     public ArchivaProjectModel getSharedModel()
276     {
277         return sharedModel;
278     }
279
280     public void setSharedModel( ArchivaProjectModel sharedModel )
281     {
282         this.sharedModel = sharedModel;
283     }
284 }