]> source.dussan.org Git - archiva.git/blob
b29d5dec091bf8f8f985c812b0ad47e78e47064a
[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 com.opensymphony.xwork2.Validateable;
24 import org.apache.archiva.audit.AuditEvent;
25 import org.apache.archiva.metadata.repository.MetadataRepositoryException;
26 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
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.codehaus.plexus.redback.role.RoleManagerException;
31 import org.codehaus.plexus.scheduler.CronExpressionValidator;
32
33 import java.io.File;
34 import java.io.IOException;
35
36 /**
37  * AddManagedRepositoryAction
38  *
39  * @version $Id$
40  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="editManagedRepositoryAction" instantiation-strategy="per-lookup"
41  */
42 public class EditManagedRepositoryAction
43     extends AbstractManagedRepositoriesAction
44     implements Preparable, Validateable
45 {
46     /**
47      * The model for this action.
48      */
49     private ManagedRepositoryConfiguration repository;
50
51     private ManagedRepositoryConfiguration stagingRepository;
52
53     private String repoid;
54
55     private final String action = "editRepository";
56
57     private boolean stageNeeded;
58
59     /**
60      * @plexus.requirement
61      */
62     private RepositoryStatisticsManager repositoryStatisticsManager;
63
64     public void prepare()
65     {
66         if ( StringUtils.isNotBlank( repoid ) )
67         {
68             repository = archivaConfiguration.getConfiguration().findManagedRepositoryById( repoid );
69             stagingRepository = archivaConfiguration.getConfiguration().findManagedRepositoryById( repoid + "-stage" );
70         }
71         else if ( repository != null )
72         {
73             repository.setReleases( false );
74             repository.setScanned( false );
75         }
76     }
77
78     public String input()
79     {
80         if ( repository == null )
81         {
82             addActionError( "Edit failure, unable to edit a repository with a blank repository id." );
83             return ERROR;
84         }
85
86         return INPUT;
87     }
88
89     public String confirmUpdate()
90     {
91         // location was changed
92         return save( true );
93     }
94
95     public String commit()
96     {
97         ManagedRepositoryConfiguration existingConfig =
98             archivaConfiguration.getConfiguration().findManagedRepositoryById( repository.getId() );
99         boolean resetStats = false;
100
101         // check if the location was changed
102         if ( !StringUtils.equalsIgnoreCase( existingConfig.getLocation().trim(), repository.getLocation().trim() ) )
103         {
104             resetStats = true;
105
106             File dir = new File( repository.getLocation() );
107             if ( dir.exists() )
108             {
109                 return CONFIRM;
110             }
111         }
112
113         return save( resetStats );
114     }
115
116     private String save( boolean resetStats )
117     {
118         // Ensure that the fields are valid.
119         Configuration configuration = archivaConfiguration.getConfiguration();
120
121         // We are in edit mode, remove the old repository configuration.
122         removeRepository( repository.getId(), configuration );
123         if ( stagingRepository != null )
124         {
125             removeRepository( stagingRepository.getId(), configuration );
126         }
127
128         // Save the repository configuration.
129         String result;
130         try
131         {
132             addRepository( repository, configuration );
133             triggerAuditEvent( repository.getId(), null, AuditEvent.MODIFY_MANAGED_REPO );
134             addRepositoryRoles( repository );
135
136             //update changes of the staging repo
137             if ( stageNeeded )
138             {
139
140                 stagingRepository = getStageRepoConfig( configuration );
141                 addRepository( stagingRepository, configuration );
142                 addRepositoryRoles( stagingRepository );
143
144             }
145             //delete staging repo when we dont need it
146             if ( !stageNeeded )
147             {
148                 stagingRepository = getStageRepoConfig( configuration );
149                 removeRepository( stagingRepository.getId(), configuration );
150                 removeContents( stagingRepository );
151                 removeRepositoryRoles( stagingRepository );
152             }
153
154             result = saveConfiguration( configuration );
155             if ( resetStats )
156             {
157                 resetStatistics();
158             }
159         }
160         catch ( IOException e )
161         {
162             addActionError( "I/O Exception: " + e.getMessage() );
163             result = ERROR;
164         }
165         catch ( RoleManagerException e )
166         {
167             addActionError( "Role Manager Exception: " + e.getMessage() );
168             result = ERROR;
169         }
170         catch ( MetadataRepositoryException e )
171         {
172             addActionError( "Metadata Exception: " + e.getMessage() );
173             result = ERROR;
174         }
175
176         return result;
177     }
178
179     private ManagedRepositoryConfiguration getStageRepoConfig( Configuration configuration )
180     {
181         for ( ManagedRepositoryConfiguration repoConf : configuration.getManagedRepositories() )
182         {
183             if ( repoConf.getId().equals( repository.getId() + "-stage" ) )
184             {
185                 stagingRepository = repoConf;
186                 removeRepository( repoConf.getId(), configuration );
187                 updateStagingRepository( stagingRepository );
188                 return stagingRepository;
189             }
190         }
191
192         stagingRepository = new ManagedRepositoryConfiguration();
193         updateStagingRepository( stagingRepository );
194
195         return stagingRepository;
196     }
197
198     private void updateStagingRepository( ManagedRepositoryConfiguration stagingRepository )
199     {
200         stagingRepository.setId( repository.getId() + "-stage" );
201         stagingRepository.setLayout( repository.getLayout() );
202         stagingRepository.setName( repository.getName() + "-stage" );
203         stagingRepository.setBlockRedeployments( repository.isBlockRedeployments() );
204         stagingRepository.setDaysOlder( repository.getDaysOlder() );
205         stagingRepository.setDeleteReleasedSnapshots( repository.isDeleteReleasedSnapshots() );
206         stagingRepository.setIndexDir( repository.getIndexDir() );
207         String path = repository.getLocation();
208         int lastIndex = path.lastIndexOf( '/' );
209         stagingRepository.setLocation( path.substring( 0, lastIndex ) + "/" + stagingRepository.getId() );
210         stagingRepository.setRefreshCronExpression( repository.getRefreshCronExpression() );
211         stagingRepository.setReleases( repository.isReleases() );
212         stagingRepository.setRetentionCount( repository.getRetentionCount() );
213         stagingRepository.setScanned( repository.isScanned() );
214         stagingRepository.setSnapshots( repository.isSnapshots() );
215     }
216
217     @Override
218     public void validate()
219     {
220         CronExpressionValidator validator = new CronExpressionValidator();
221
222         if ( !validator.validate( repository.getRefreshCronExpression() ) )
223         {
224             addFieldError( "repository.refreshCronExpression", "Invalid cron expression." );
225         }
226     }
227
228     private void resetStatistics()
229         throws MetadataRepositoryException
230     {
231         repositoryStatisticsManager.deleteStatistics( repository.getId() );
232     }
233
234     public String getRepoid()
235     {
236         return repoid;
237     }
238
239     public void setRepoid( String repoid )
240     {
241         this.repoid = repoid;
242     }
243
244     public ManagedRepositoryConfiguration getRepository()
245     {
246         return repository;
247     }
248
249     public void setRepository( ManagedRepositoryConfiguration repository )
250     {
251         this.repository = repository;
252     }
253
254     public boolean isStageNeeded()
255     {
256         return stageNeeded;
257     }
258
259     public void setStageNeeded( boolean stageNeeded )
260     {
261         this.stageNeeded = stageNeeded;
262     }
263
264     public String getAction()
265     {
266         return action;
267     }
268
269     public void setRepositoryStatisticsManager( RepositoryStatisticsManager repositoryStatisticsManager )
270     {
271         this.repositoryStatisticsManager = repositoryStatisticsManager;
272     }
273
274     public ManagedRepositoryConfiguration getStagingRepository()
275     {
276         return stagingRepository;
277     }
278
279     public void setStagingRepository( ManagedRepositoryConfiguration stagingRepository )
280     {
281         this.stagingRepository = stagingRepository;
282     }
283 }