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