]> source.dussan.org Git - archiva.git/blob
a45dace2b03c53cbcad0dae7970e20f931bd4776
[archiva.git] /
1 package org.apache.maven.archiva.web.action.admin.repositories;
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 com.opensymphony.xwork2.Preparable;
23 import org.apache.archiva.audit.AuditEvent;
24 import org.apache.commons.lang.StringUtils;
25 import org.apache.maven.archiva.configuration.Configuration;
26 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
27 import org.apache.maven.archiva.configuration.RepositoryGroupConfiguration;
28 import org.apache.archiva.web.util.ContextUtils;
29 import org.apache.struts2.interceptor.ServletRequestAware;
30 import org.springframework.context.annotation.Scope;
31 import org.springframework.stereotype.Controller;
32
33 import javax.servlet.http.HttpServletRequest;
34 import java.util.List;
35 import java.util.Map;
36 import java.util.regex.Matcher;
37 import java.util.regex.Pattern;
38
39 /**
40  * RepositoryGroupsAction
41  *
42  */
43 @Controller( "repositoryGroupsAction" )
44 @Scope( "prototype" )
45 public class RepositoryGroupsAction
46     extends AbstractRepositoriesAdminAction
47     implements ServletRequestAware, Preparable
48 {
49     private RepositoryGroupConfiguration repositoryGroup;
50
51     private Map<String, RepositoryGroupConfiguration> repositoryGroups;
52
53     private Map<String, ManagedRepositoryConfiguration> managedRepositories;
54
55     private Map<String, List<String>> groupToRepositoryMap;
56
57     private String repoGroupId;
58
59     private String repoId;
60
61     /**
62      * Used to construct the repository WebDAV URL in the repository action.
63      */
64     private String baseUrl;
65
66     private static final Pattern REPO_GROUP_ID_PATTERN = Pattern.compile( "[A-Za-z0-9\\._\\-]+" );
67
68     public void setServletRequest( HttpServletRequest request )
69     {
70         this.baseUrl = ContextUtils.getBaseURL( request, "repository" );
71     }
72
73     public void prepare()
74     {
75         Configuration config = archivaConfiguration.getConfiguration();
76
77         repositoryGroup = new RepositoryGroupConfiguration();
78         repositoryGroups = config.getRepositoryGroupsAsMap();
79         managedRepositories = config.getManagedRepositoriesAsMap();
80         groupToRepositoryMap = config.getGroupToRepositoryMap();
81     }
82
83     public String addRepositoryGroup()
84     {
85         Configuration configuration = archivaConfiguration.getConfiguration();
86
87         String repoGroupId = repositoryGroup.getId();
88
89         if ( repoGroupId == null || "".equals( repoGroupId.trim() ) )
90         {
91             addActionError( "Identifier field is required." );
92             return ERROR;
93         }
94
95         if ( repoGroupId.length() > 100 )
96         {
97             addActionError( "Identifier [" + repoGroupId + "] is over the maximum limit of 100 characters" );
98             return ERROR;
99         }
100
101         Matcher matcher = REPO_GROUP_ID_PATTERN.matcher( repoGroupId );
102         if ( !matcher.matches() )
103         {
104             addActionError(
105                 "Invalid character(s) found in identifier. Only the following characters are allowed: alphanumeric, '.', '-' and '_'" );
106             return ERROR;
107         }
108
109         if ( StringUtils.isBlank( repoGroupId ) )
110         {
111             addActionError( "You must enter a repository group id." );
112             return ERROR;
113         }
114
115         if ( configuration.getRepositoryGroupsAsMap().containsKey( repoGroupId ) )
116         {
117             addActionError( "Unable to add new repository group with id [" + repoGroupId
118                                 + "], that id already exists as a repository group." );
119             return ERROR;
120         }
121         else if ( configuration.getManagedRepositoriesAsMap().containsKey( repoGroupId ) )
122         {
123             addActionError( "Unable to add new repository group with id [" + repoGroupId
124                                 + "], that id already exists as a managed repository." );
125             return ERROR;
126         }
127         else if ( configuration.getRemoteRepositoriesAsMap().containsKey( repoGroupId ) )
128         {
129             addActionError( "Unable to add new repository group with id [" + repoGroupId
130                                 + "], that id already exists as a remote repository." );
131             return ERROR;
132         }
133
134         configuration.addRepositoryGroup( repositoryGroup );
135         triggerAuditEvent( AuditEvent.ADD_REPO_GROUP + " " + repoGroupId );
136         return saveConfiguration( configuration );
137     }
138
139     public String addRepositoryToGroup()
140     {
141         Configuration config = archivaConfiguration.getConfiguration();
142         RepositoryGroupConfiguration group = config.findRepositoryGroupById( repoGroupId );
143
144         validateRepository();
145
146         if ( hasErrors() )
147         {
148             return ERROR;
149         }
150
151         if ( group.getRepositories().contains( repoId ) )
152         {
153             addActionError( "Repository with id [" + repoId + "] is already in the group" );
154             return ERROR;
155         }
156
157         // remove the old repository group configuration
158         config.removeRepositoryGroup( group );
159
160         // save repository group configuration
161         group.addRepository( repoId );
162         config.addRepositoryGroup( group );
163
164         triggerAuditEvent( repoId, null, AuditEvent.ADD_REPO_TO_GROUP + " " + repoGroupId );
165
166         return saveConfiguration( config );
167     }
168
169     public String removeRepositoryFromGroup()
170     {
171         Configuration config = archivaConfiguration.getConfiguration();
172         RepositoryGroupConfiguration group = config.findRepositoryGroupById( repoGroupId );
173
174         validateRepository();
175
176         if ( hasErrors() )
177         {
178             return ERROR;
179         }
180
181         if ( !group.getRepositories().contains( repoId ) )
182         {
183             addActionError( "No repository with id[" + repoId + "] found in the group" );
184             return ERROR;
185         }
186
187         // remove the old repository group configuration
188         config.removeRepositoryGroup( group );
189
190         // save repository group configuration
191         group.removeRepository( repoId );
192         config.addRepositoryGroup( group );
193
194         triggerAuditEvent( repoId, null, AuditEvent.DELETE_REPO_FROM_GROUP + " " + repoGroupId );
195
196         return saveConfiguration( config );
197     }
198
199     public void validateRepository()
200     {
201         Configuration config = archivaConfiguration.getConfiguration();
202         RepositoryGroupConfiguration group = config.findRepositoryGroupById( repoGroupId );
203         ManagedRepositoryConfiguration repo = config.findManagedRepositoryById( repoId );
204
205         if ( group == null )
206         {
207             addActionError( "A repository group with that id does not exist." );
208         }
209
210         if ( repo == null )
211         {
212             addActionError( "A repository with that id does not exist." );
213         }
214     }
215
216     public RepositoryGroupConfiguration getRepositoryGroup()
217     {
218         return repositoryGroup;
219     }
220
221     public void setRepositoryGroup( RepositoryGroupConfiguration repositoryGroup )
222     {
223         this.repositoryGroup = repositoryGroup;
224     }
225
226     public Map<String, RepositoryGroupConfiguration> getRepositoryGroups()
227     {
228         return repositoryGroups;
229     }
230
231     public void setRepositoryGroups( Map<String, RepositoryGroupConfiguration> repositoryGroups )
232     {
233         this.repositoryGroups = repositoryGroups;
234     }
235
236     public Map<String, ManagedRepositoryConfiguration> getManagedRepositories()
237     {
238         return managedRepositories;
239     }
240
241     public Map<String, List<String>> getGroupToRepositoryMap()
242     {
243         return this.groupToRepositoryMap;
244     }
245
246     public String getRepoGroupId()
247     {
248         return repoGroupId;
249     }
250
251     public void setRepoGroupId( String repoGroupId )
252     {
253         this.repoGroupId = repoGroupId;
254     }
255
256     public String getRepoId()
257     {
258         return repoId;
259     }
260
261     public void setRepoId( String repoId )
262     {
263         this.repoId = repoId;
264     }
265
266     public String getBaseUrl()
267     {
268         return baseUrl;
269     }
270 }