1 package org.apache.continuum.web.action.admin;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26
27 import org.apache.continuum.model.repository.LocalRepository;
28 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
29 import org.apache.continuum.purge.ContinuumPurgeManager;
30 import org.apache.continuum.purge.PurgeConfigurationService;
31 import org.apache.continuum.repository.RepositoryService;
32 import org.apache.continuum.taskqueue.manager.TaskQueueManager;
33 import org.apache.continuum.web.util.AuditLog;
34 import org.apache.continuum.web.util.AuditLogConstants;
35 import org.apache.maven.continuum.model.project.ProjectGroup;
36 import org.apache.maven.continuum.security.ContinuumRoleConstants;
37 import org.apache.maven.continuum.web.action.ContinuumConfirmAction;
38 import org.codehaus.plexus.redback.rbac.Resource;
39 import org.codehaus.redback.integration.interceptor.SecureAction;
40 import org.codehaus.redback.integration.interceptor.SecureActionBundle;
41 import org.codehaus.redback.integration.interceptor.SecureActionException;
42
43 import com.opensymphony.xwork2.Preparable;
44
45
46
47
48
49
50
51 public class LocalRepositoryAction
52 extends ContinuumConfirmAction
53 implements Preparable, SecureAction
54 {
55 private static final String LAYOUT_DEFAULT = "default";
56
57 private static final String LAYOUT_LEGACY = "legacy";
58
59 private boolean confirmed;
60
61 private boolean defaultRepo;
62
63 private LocalRepository repository;
64
65 private List<LocalRepository> repositories;
66
67 private List<ProjectGroup> groups;
68
69 private List<String> layouts;
70
71 private Map<String, Boolean> defaultPurgeMap;
72
73
74
75
76 private RepositoryService repositoryService;
77
78
79
80
81 private PurgeConfigurationService purgeConfigService;
82
83 public void prepare()
84 throws Exception
85 {
86 super.prepare();
87
88 layouts = new ArrayList<String>();
89 layouts.add( LAYOUT_DEFAULT );
90 layouts.add( LAYOUT_LEGACY );
91 }
92
93 public String input()
94 throws Exception
95 {
96 defaultRepo = false;
97
98 if ( repository != null && repository.getId() > 0 )
99 {
100 repository = repositoryService.getLocalRepository( repository.getId() );
101
102 if ( repository.getName().equals( "DEFAULT" ) )
103 {
104 defaultRepo = true;
105 }
106 }
107
108 return INPUT;
109 }
110
111 public String list()
112 throws Exception
113 {
114 repositories = repositoryService.getAllLocalRepositories();
115
116 defaultPurgeMap = new HashMap<String, Boolean>();
117
118 for ( LocalRepository repo : repositories )
119 {
120
121 RepositoryPurgeConfiguration purgeConfig = purgeConfigService.getDefaultPurgeConfigurationForRepository( repo.getId() );
122
123 if ( purgeConfig == null )
124 {
125 defaultPurgeMap.put( repo.getName(), Boolean.FALSE );
126 }
127 else
128 {
129 defaultPurgeMap.put( repo.getName(), Boolean.TRUE );
130 }
131 }
132
133 return SUCCESS;
134 }
135
136 public String save()
137 throws Exception
138 {
139 List<LocalRepository> allRepositories = repositoryService.getAllLocalRepositories();
140
141 for( LocalRepository repo : allRepositories )
142 {
143 if ( repository.getId() != repo.getId() )
144 {
145 if ( repository.getName().equals( repo.getName() ) )
146 {
147 addActionError( getText( "repository.error.name.unique" ) );
148 }
149
150 if ( repository.getLocation().equals( repo.getLocation() ) )
151 {
152 addActionError( getText( "repository.error.location.unique" ) );
153 }
154 }
155 }
156
157 if ( repository.getName().trim().equals( "" ) )
158 {
159 addActionError( getText( "repository.error.name.cannot.be.spaces" ) );
160 }
161
162 if ( repository.getLocation().trim().equals( "" ) )
163 {
164 addActionError( getText( "repository.error.location.cannot.be.spaces" ) );
165 }
166
167 if ( hasActionErrors() )
168 {
169 return INPUT;
170 }
171
172 if ( repository.getId() == 0 )
173 {
174 repository = repositoryService.addLocalRepository( repository );
175
176 createDefaultPurgeConfiguration();
177 }
178 else
179 {
180
181 TaskQueueManager taskQueueManager = getContinuum().getTaskQueueManager();
182 if ( taskQueueManager.isRepositoryInUse( repository.getId() ) )
183 {
184 addActionError( getText( "repository.error.save.in.use" ) );
185 return ERROR;
186 }
187
188 LocalRepository retrievedRepo = repositoryService.getLocalRepository( repository.getId() );
189
190 retrievedRepo.setName( repository.getName() );
191 retrievedRepo.setLocation( repository.getLocation() );
192 retrievedRepo.setLayout( repository.getLayout() );
193
194 repositoryService.updateLocalRepository( retrievedRepo );
195 }
196
197 return SUCCESS;
198 }
199
200 public String remove()
201 throws Exception
202 {
203 TaskQueueManager taskQueueManager = getContinuum().getTaskQueueManager();
204
205 repository = repositoryService.getLocalRepository( repository.getId() );
206
207 if ( taskQueueManager.isRepositoryInUse( repository.getId() ) )
208 {
209 addActionError( getText( "repository.error.remove.in.use", "Unable to remove local repository because it is in use" ) );
210 }
211
212 if ( repository.getName().equals( "DEFAULT" ) )
213 {
214 addActionError( getText( "repository.error.remove.default", "Unable to remove default local repository" ) );
215 }
216
217 if ( !hasActionErrors() )
218 {
219 if ( confirmed )
220 {
221 repositoryService.removeLocalRepository( repository.getId() );
222 }
223 else
224 {
225 return CONFIRM;
226 }
227 }
228
229 return SUCCESS;
230 }
231
232 public String doPurge()
233 throws Exception
234 {
235 ContinuumPurgeManager purgeManager = getContinuum().getPurgeManager();
236 TaskQueueManager taskQueueManager = getContinuum().getTaskQueueManager();
237
238
239 if ( taskQueueManager.isRepositoryInUse( repository.getId() ) )
240 {
241 addActionError( getText( "repository.error.purge.in.use", "Unable to purge repository because it is in use" ) );
242 }
243
244 if ( !hasActionErrors() )
245 {
246
247 RepositoryPurgeConfiguration purgeConfig = purgeConfigService.getDefaultPurgeConfigurationForRepository( repository.getId() );
248
249 if ( purgeConfig != null )
250 {
251 purgeManager.purgeRepository( purgeConfig );
252
253 AuditLog event = new AuditLog( "Repository id=" + repository.getId(), AuditLogConstants.PURGE_LOCAL_REPOSITORY );
254 event.setCategory( AuditLogConstants.LOCAL_REPOSITORY );
255 event.setCurrentUser( getPrincipal() );
256 event.log();
257 }
258 }
259 return SUCCESS;
260 }
261
262 public LocalRepository getRepository()
263 {
264 return this.repository;
265 }
266
267 public void setRepository( LocalRepository repository )
268 {
269 this.repository = repository;
270 }
271
272 public List<LocalRepository> getRepositories()
273 {
274 return this.repositories;
275 }
276
277 public void setRepositories( List<LocalRepository> repositories )
278 {
279 this.repositories = repositories;
280 }
281
282 public List<ProjectGroup> getGroups()
283 {
284 return this.groups;
285 }
286
287 public void setGroups( List<ProjectGroup> groups )
288 {
289 this.groups = groups;
290 }
291
292 public boolean isConfirmed()
293 {
294 return this.confirmed;
295 }
296
297 public void setConfirmed( boolean confirmed )
298 {
299 this.confirmed = confirmed;
300 }
301
302 public boolean isDefaultRepo()
303 {
304 return this.defaultRepo;
305 }
306
307 public void setDefaultRepo( boolean defaultRepo )
308 {
309 this.defaultRepo = defaultRepo;
310 }
311
312 public List<String> getLayouts()
313 {
314 return this.layouts;
315 }
316
317 public Map<String, Boolean> getDefaultPurgeMap()
318 {
319 return this.defaultPurgeMap;
320 }
321
322 public void setDefaultPurgeMap( Map<String, Boolean> defaultPurgeMap )
323 {
324 this.defaultPurgeMap = defaultPurgeMap;
325 }
326
327 private void createDefaultPurgeConfiguration()
328 throws Exception
329 {
330 RepositoryPurgeConfiguration repoPurge = new RepositoryPurgeConfiguration();
331
332 repoPurge.setRepository( repository );
333 repoPurge.setDefaultPurge( true );
334
335 purgeConfigService.addRepositoryPurgeConfiguration( repoPurge );
336 }
337
338 public SecureActionBundle getSecureActionBundle()
339 throws SecureActionException
340 {
341 SecureActionBundle bundle = new SecureActionBundle();
342 bundle.setRequiresAuthentication( true );
343 bundle.addRequiredAuthorization( ContinuumRoleConstants.CONTINUUM_MANAGE_REPOSITORIES, Resource.GLOBAL );
344
345 return bundle;
346 }
347 }