]> source.dussan.org Git - archiva.git/blob
14e62d4e6448e60f2c47845e1591503e529ba046
[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.xwork.Preparable;
23
24 import org.apache.commons.lang.StringUtils;
25 import org.apache.maven.archiva.configuration.Configuration;
26 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
27
28 import org.apache.maven.archiva.database.ArchivaDAO;
29 import org.apache.maven.archiva.database.ArchivaDatabaseException;
30 import org.apache.maven.archiva.database.Constraint;
31 import org.apache.maven.archiva.database.ObjectNotFoundException;
32 import org.apache.maven.archiva.database.constraints.ArtifactsByRepositoryConstraint;
33 import org.apache.maven.archiva.database.constraints.RepositoryContentStatisticsByRepositoryConstraint;
34 import org.apache.maven.archiva.model.ArchivaArtifact;
35 import org.apache.maven.archiva.model.ArchivaProjectModel;
36 import org.apache.maven.archiva.model.RepositoryContentStatistics;
37
38 import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
39
40 import org.codehaus.plexus.redback.role.RoleManagerException;
41
42 import java.io.IOException;
43 import java.util.List;
44 import java.util.Map;
45 import java.util.Properties;
46
47 /**
48  * DeleteManagedRepositoryAction
49  * 
50  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
51  * @version $Id$
52  * @plexus.component role="com.opensymphony.xwork.Action" role-hint="deleteManagedRepositoryAction"
53  */
54 public class DeleteManagedRepositoryAction
55     extends AbstractManagedRepositoriesAction
56     implements Preparable
57 {
58     private ManagedRepositoryConfiguration repository;
59
60     private String repoid;
61
62     /**
63      * @plexus.requirement role-hint="jdo"
64      */
65     private ArchivaDAO archivaDAO;
66
67     public void prepare()
68     {
69         if ( StringUtils.isNotBlank( repoid ) )
70         {
71             this.repository = archivaConfiguration.getConfiguration().findManagedRepositoryById( repoid );
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         if ( existingRepository == null )
100         {
101             addActionError( "A repository with that id does not exist" );
102             return ERROR;
103         }
104
105         if( deleteContents )
106         {
107             // [MRM-789] Archiva may delete your app server installation
108             Properties props = System.getProperties();
109             for( Object value : props.values() )
110             {
111                 if( StringUtils.equalsIgnoreCase( ( (String) value ).trim(), existingRepository.getLocation().trim() ) )
112                 {
113                     addActionError( "Unable to delete repository. The location is being referenced in the system properties." );
114                     return ERROR;
115                 }
116             }
117         }
118         
119         String result = SUCCESS;
120
121         try
122         {
123             Configuration configuration = archivaConfiguration.getConfiguration();
124             cleanupRepositoryData( existingRepository );
125             removeRepository( repoid, configuration );
126             result = saveConfiguration( configuration );
127
128             if ( result.equals( SUCCESS ) )
129             {
130                 if ( deleteContents )
131                 {
132                     removeContents( existingRepository );
133                 }
134             }
135         }
136         catch ( IOException e )
137         {
138             addActionError( "Unable to delete repository: " + e.getMessage() );
139             result = ERROR;
140         }
141         catch ( RoleManagerException e )
142         {
143             addActionError( "Unable to delete repository: " + e.getMessage() );
144             result = ERROR;
145         }
146         catch ( ArchivaDatabaseException e )
147         {
148             addActionError( "Unable to delete repositoy: " + e.getMessage() );
149             result = ERROR;
150         }
151
152         return result;
153     }
154
155     private void cleanupRepositoryData( ManagedRepositoryConfiguration cleanupRepository )
156         throws RoleManagerException, ArchivaDatabaseException
157     {
158         removeRepositoryRoles( cleanupRepository );
159         cleanupDatabase( cleanupRepository.getId() );
160         cleanupScanStats( cleanupRepository.getId() );
161         
162         List<ProxyConnectorConfiguration> proxyConnectors = getProxyConnectors();
163         for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
164         {
165             if ( StringUtils.equals( proxyConnector.getSourceRepoId(), cleanupRepository.getId() ) )
166             {
167                 archivaConfiguration.getConfiguration().removeProxyConnector( proxyConnector );
168             }
169         }
170
171         Map<String, List<String>> repoToGroupMap = archivaConfiguration.getConfiguration().getRepositoryToGroupMap();
172         if( repoToGroupMap != null )
173         {
174             if( repoToGroupMap.containsKey( cleanupRepository.getId() ) )
175             {
176                 List<String> repoGroups = repoToGroupMap.get( cleanupRepository.getId() );
177                 for( String repoGroup : repoGroups )
178                 {
179                     archivaConfiguration.getConfiguration().findRepositoryGroupById( repoGroup ).removeRepository( cleanupRepository.getId() );
180                 }
181             }            
182         }
183     }
184
185     private void cleanupDatabase( String repoId )
186         throws ArchivaDatabaseException
187     {
188         Constraint constraint = new ArtifactsByRepositoryConstraint( repoId );
189
190         List<ArchivaArtifact> artifacts = archivaDAO.getArtifactDAO().queryArtifacts( constraint );
191
192         for ( ArchivaArtifact artifact : artifacts )
193         {
194             getLogger().info( "Removing artifact " + artifact + " from the database." );
195             try
196             {
197                 archivaDAO.getArtifactDAO().deleteArtifact( artifact );
198
199                 ArchivaProjectModel projectModel =
200                     archivaDAO.getProjectModelDAO().getProjectModel( artifact.getGroupId(), artifact.getArtifactId(),
201                                                                      artifact.getVersion() );
202
203                 archivaDAO.getProjectModelDAO().deleteProjectModel( projectModel );
204             }
205             catch ( ObjectNotFoundException oe )
206             {
207                 getLogger().info( "Project model of artifact " + artifact + " does not exist in the database. " +
208                                       "Moving on to the next artifact." );
209             }
210             catch ( ArchivaDatabaseException ae )
211             {
212                 getLogger().info( "Unable to delete artifact " + artifact + " from the database. " +
213                                       "Moving on to the next artifact." );
214             }
215         }
216     }
217
218     private void cleanupScanStats( String repoId )
219         throws ArchivaDatabaseException
220     {
221         List<RepositoryContentStatistics> results =
222             archivaDAO.getRepositoryContentStatisticsDAO().queryRepositoryContentStatistics(
223             new RepositoryContentStatisticsByRepositoryConstraint( repoId ) );
224
225         for ( RepositoryContentStatistics stats : results )
226         {
227             archivaDAO.getRepositoryContentStatisticsDAO().deleteRepositoryContentStatistics( stats );
228         }
229     }
230
231     public ManagedRepositoryConfiguration getRepository()
232     {
233         return repository;
234     }
235
236     public void setRepository( ManagedRepositoryConfiguration repository )
237     {
238         this.repository = repository;
239     }
240
241     public String getRepoid()
242     {
243         return repoid;
244     }
245
246     public void setRepoid( String repoid )
247     {
248         this.repoid = repoid;
249     }
250
251     public void setArchivaDAO( ArchivaDAO archivaDAO )
252     {
253         this.archivaDAO = archivaDAO;
254     }
255
256     public ArchivaDAO getArchivaDAO()
257     {
258         return archivaDAO;
259     }
260 }