]> source.dussan.org Git - archiva.git/blob
bd72df5420ea810fd456f952538f30ce4af856c4
[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.archiva.metadata.repository.MetadataRepository;
25 import org.apache.archiva.metadata.repository.MetadataRepositoryException;
26 import org.apache.archiva.metadata.repository.RepositorySession;
27 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
28 import org.apache.commons.lang.StringUtils;
29 import org.apache.maven.archiva.configuration.Configuration;
30 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
31 import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
32 import org.codehaus.plexus.redback.role.RoleManagerException;
33 import org.springframework.context.annotation.Scope;
34 import org.springframework.stereotype.Controller;
35
36 import javax.inject.Inject;
37 import java.io.IOException;
38 import java.util.List;
39 import java.util.Map;
40
41 /**
42  * DeleteManagedRepositoryAction
43  *
44  * @version $Id$
45  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="deleteManagedRepositoryAction" instantiation-strategy="per-lookup"
46  */
47 @Controller( "deleteManagedRepositoryAction" )
48 @Scope( "prototype" )
49 public class DeleteManagedRepositoryAction
50     extends AbstractManagedRepositoriesAction
51     implements Preparable
52 {
53     private ManagedRepositoryConfiguration repository;
54
55     private ManagedRepositoryConfiguration stagingRepository;
56
57     private String repoid;
58
59     /**
60      * plexus.requirement
61      */
62     @Inject
63     private RepositoryStatisticsManager repositoryStatisticsManager;
64
65     public void prepare()
66     {
67         if ( StringUtils.isNotBlank( repoid ) )
68         {
69             this.repository = archivaConfiguration.getConfiguration().findManagedRepositoryById( repoid );
70             this.stagingRepository =
71                 archivaConfiguration.getConfiguration().findManagedRepositoryById( repoid + "-stage" );
72         }
73     }
74
75     public String confirmDelete()
76     {
77         if ( StringUtils.isBlank( repoid ) )
78         {
79             addActionError( "Unable to delete managed repository: repository id was blank." );
80             return ERROR;
81         }
82
83         return INPUT;
84     }
85
86     public String deleteEntry()
87     {
88         return deleteRepository( false );
89     }
90
91     public String deleteContents()
92     {
93         return deleteRepository( true );
94     }
95
96     private String deleteRepository( boolean deleteContents )
97     {
98         ManagedRepositoryConfiguration existingRepository = repository;
99         ManagedRepositoryConfiguration attachedStagingRepo = stagingRepository;
100         if ( existingRepository == null )
101         {
102             addActionError( "A repository with that id does not exist" );
103             return ERROR;
104         }
105
106         String result;
107
108         RepositorySession repositorySession = repositorySessionFactory.createSession();
109         try
110         {
111             Configuration configuration = archivaConfiguration.getConfiguration();
112             if ( attachedStagingRepo != null )
113             {
114                 cleanupRepositoryData( attachedStagingRepo, repositorySession );
115                 removeRepository( repoid + "-stage", configuration );
116                 triggerAuditEvent( repoid + "-stage", null, AuditEvent.DELETE_MANAGED_REPO );
117
118             }
119             cleanupRepositoryData( existingRepository, repositorySession );
120             removeRepository( repoid, configuration );
121             triggerAuditEvent( repoid, null, AuditEvent.DELETE_MANAGED_REPO );
122             result = saveConfiguration( configuration );
123
124             if ( result.equals( SUCCESS ) )
125             {
126                 if ( deleteContents )
127                 {
128                     if ( attachedStagingRepo != null )
129                     {
130                         removeContents( attachedStagingRepo );
131                     }
132                     removeContents( existingRepository );
133                 }
134             }
135         }
136         catch ( IOException e )
137         {
138             addActionError(
139                 "Unable to delete repository, content may already be partially removed: " + e.getMessage() );
140             result = ERROR;
141         }
142         catch ( RoleManagerException e )
143         {
144             addActionError(
145                 "Unable to delete repository, content may already be partially removed: " + e.getMessage() );
146             result = ERROR;
147         }
148         catch ( MetadataRepositoryException e )
149         {
150             addActionError(
151                 "Unable to delete repository, content may already be partially removed: " + e.getMessage() );
152             result = ERROR;
153         }
154         finally
155         {
156             repositorySession.close();
157         }
158
159         return result;
160     }
161
162     private void cleanupRepositoryData( ManagedRepositoryConfiguration cleanupRepository,
163                                         RepositorySession repositorySession )
164         throws RoleManagerException, MetadataRepositoryException
165     {
166         removeRepositoryRoles( cleanupRepository );
167         MetadataRepository metadataRepository = repositorySession.getRepository();
168         cleanupDatabase( metadataRepository, cleanupRepository.getId() );
169         repositoryStatisticsManager.deleteStatistics( metadataRepository, cleanupRepository.getId() );
170         // TODO: delete all content for a repository from the content API?
171         repositorySession.save();
172
173         List<ProxyConnectorConfiguration> proxyConnectors = getProxyConnectors();
174         for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
175         {
176             if ( StringUtils.equals( proxyConnector.getSourceRepoId(), cleanupRepository.getId() ) )
177             {
178                 archivaConfiguration.getConfiguration().removeProxyConnector( proxyConnector );
179             }
180         }
181
182         Map<String, List<String>> repoToGroupMap = archivaConfiguration.getConfiguration().getRepositoryToGroupMap();
183         if ( repoToGroupMap != null )
184         {
185             if ( repoToGroupMap.containsKey( cleanupRepository.getId() ) )
186             {
187                 List<String> repoGroups = repoToGroupMap.get( cleanupRepository.getId() );
188                 for ( String repoGroup : repoGroups )
189                 {
190                     archivaConfiguration.getConfiguration().findRepositoryGroupById( repoGroup ).removeRepository(
191                         cleanupRepository.getId() );
192                 }
193             }
194         }
195     }
196
197     private void cleanupDatabase( MetadataRepository metadataRepository, String repoId )
198         throws MetadataRepositoryException
199     {
200         metadataRepository.removeRepository( repoId );
201     }
202
203     public ManagedRepositoryConfiguration getRepository()
204     {
205         return repository;
206     }
207
208     public void setRepository( ManagedRepositoryConfiguration repository )
209     {
210         this.repository = repository;
211     }
212
213     public String getRepoid()
214     {
215         return repoid;
216     }
217
218     public void setRepoid( String repoid )
219     {
220         this.repoid = repoid;
221     }
222
223     public void setRepositoryStatisticsManager( RepositoryStatisticsManager repositoryStatisticsManager )
224     {
225         this.repositoryStatisticsManager = repositoryStatisticsManager;
226     }
227 }