]> source.dussan.org Git - archiva.git/blob
9d63a58fd7ce8ac55fab3f259f43df09c465f572
[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  * @version plexus.component role="com.opensymphony.xwork2.Action" role-hint="repositoryGroupsAction" instantiation-strategy="per-lookup"
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, ManagedRepositoryConfiguration> 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     {
76         Configuration config = archivaConfiguration.getConfiguration();
77
78         repositoryGroup = new RepositoryGroupConfiguration();
79         repositoryGroups = config.getRepositoryGroupsAsMap();
80         managedRepositories = config.getManagedRepositoriesAsMap();
81         groupToRepositoryMap = config.getGroupToRepositoryMap();
82     }
83
84     public String addRepositoryGroup()
85     {
86         Configuration configuration = archivaConfiguration.getConfiguration();
87
88         String repoGroupId = repositoryGroup.getId();
89
90         if ( repoGroupId == null || "".equals( repoGroupId.trim() ) )
91         {
92             addActionError( "Identifier field is required." );
93             return ERROR;
94         }
95
96         if ( repoGroupId.length() > 100 )
97         {
98             addActionError( "Identifier [" + repoGroupId + "] is over the maximum limit of 100 characters" );
99             return ERROR;
100         }
101
102         Matcher matcher = REPO_GROUP_ID_PATTERN.matcher( repoGroupId );
103         if ( !matcher.matches() )
104         {
105             addActionError(
106                 "Invalid character(s) found in identifier. Only the following characters are allowed: alphanumeric, '.', '-' and '_'" );
107             return ERROR;
108         }
109
110         if ( StringUtils.isBlank( repoGroupId ) )
111         {
112             addActionError( "You must enter a repository group id." );
113             return ERROR;
114         }
115
116         if ( configuration.getRepositoryGroupsAsMap().containsKey( repoGroupId ) )
117         {
118             addActionError( "Unable to add new repository group with id [" + repoGroupId
119                                 + "], that id already exists as a repository group." );
120             return ERROR;
121         }
122         else if ( configuration.getManagedRepositoriesAsMap().containsKey( repoGroupId ) )
123         {
124             addActionError( "Unable to add new repository group with id [" + repoGroupId
125                                 + "], that id already exists as a managed repository." );
126             return ERROR;
127         }
128         else if ( configuration.getRemoteRepositoriesAsMap().containsKey( repoGroupId ) )
129         {
130             addActionError( "Unable to add new repository group with id [" + repoGroupId
131                                 + "], that id already exists as a remote repository." );
132             return ERROR;
133         }
134
135         configuration.addRepositoryGroup( repositoryGroup );
136         triggerAuditEvent( AuditEvent.ADD_REPO_GROUP + " " + repoGroupId );
137         return saveConfiguration( configuration );
138     }
139
140     public String addRepositoryToGroup()
141     {
142         Configuration config = archivaConfiguration.getConfiguration();
143         RepositoryGroupConfiguration group = config.findRepositoryGroupById( repoGroupId );
144
145         validateRepository();
146
147         if ( hasErrors() )
148         {
149             return ERROR;
150         }
151
152         if ( group.getRepositories().contains( repoId ) )
153         {
154             addActionError( "Repository with id [" + repoId + "] is already in the group" );
155             return ERROR;
156         }
157
158         // remove the old repository group configuration
159         config.removeRepositoryGroup( group );
160
161         // save repository group configuration
162         group.addRepository( repoId );
163         config.addRepositoryGroup( group );
164
165         triggerAuditEvent( repoId, null, AuditEvent.ADD_REPO_TO_GROUP + " " + repoGroupId );
166
167         return saveConfiguration( config );
168     }
169
170     public String removeRepositoryFromGroup()
171     {
172         Configuration config = archivaConfiguration.getConfiguration();
173         RepositoryGroupConfiguration group = config.findRepositoryGroupById( repoGroupId );
174
175         validateRepository();
176
177         if ( hasErrors() )
178         {
179             return ERROR;
180         }
181
182         if ( !group.getRepositories().contains( repoId ) )
183         {
184             addActionError( "No repository with id[" + repoId + "] found in the group" );
185             return ERROR;
186         }
187
188         // remove the old repository group configuration
189         config.removeRepositoryGroup( group );
190
191         // save repository group configuration
192         group.removeRepository( repoId );
193         config.addRepositoryGroup( group );
194
195         triggerAuditEvent( repoId, null, AuditEvent.DELETE_REPO_FROM_GROUP + " " + repoGroupId );
196
197         return saveConfiguration( config );
198     }
199
200     public void validateRepository()
201     {
202         Configuration config = archivaConfiguration.getConfiguration();
203         RepositoryGroupConfiguration group = config.findRepositoryGroupById( repoGroupId );
204         ManagedRepositoryConfiguration repo = config.findManagedRepositoryById( repoId );
205
206         if ( group == null )
207         {
208             addActionError( "A repository group with that id does not exist." );
209         }
210
211         if ( repo == null )
212         {
213             addActionError( "A repository with that id does not exist." );
214         }
215     }
216
217     public RepositoryGroupConfiguration getRepositoryGroup()
218     {
219         return repositoryGroup;
220     }
221
222     public void setRepositoryGroup( RepositoryGroupConfiguration repositoryGroup )
223     {
224         this.repositoryGroup = repositoryGroup;
225     }
226
227     public Map<String, RepositoryGroupConfiguration> getRepositoryGroups()
228     {
229         return repositoryGroups;
230     }
231
232     public void setRepositoryGroups( Map<String, RepositoryGroupConfiguration> repositoryGroups )
233     {
234         this.repositoryGroups = repositoryGroups;
235     }
236
237     public Map<String, ManagedRepositoryConfiguration> getManagedRepositories()
238     {
239         return managedRepositories;
240     }
241
242     public Map<String, List<String>> getGroupToRepositoryMap()
243     {
244         return this.groupToRepositoryMap;
245     }
246
247     public String getRepoGroupId()
248     {
249         return repoGroupId;
250     }
251
252     public void setRepoGroupId( String repoGroupId )
253     {
254         this.repoGroupId = repoGroupId;
255     }
256
257     public String getRepoId()
258     {
259         return repoId;
260     }
261
262     public void setRepoId( String repoId )
263     {
264         this.repoId = repoId;
265     }
266
267     public String getBaseUrl()
268     {
269         return baseUrl;
270     }
271 }