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