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