]> source.dussan.org Git - archiva.git/blob
7efe7827b8770ac099306291bb2353e50c670c85
[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
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
46 /**
47  * DeleteManagedRepositoryAction
48  * 
49  * @version $Id$
50  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="deleteManagedRepositoryAction" instantiation-strategy="per-lookup"
51  */
52 public class DeleteManagedRepositoryAction
53     extends AbstractManagedRepositoriesAction
54     implements Preparable
55 {
56     private ManagedRepositoryConfiguration repository;
57
58     private String repoid;
59
60     /**
61      * @plexus.requirement role-hint="jdo"
62      */
63     private ArchivaDAO archivaDAO;
64
65     public void prepare()
66     {
67         if ( StringUtils.isNotBlank( repoid ) )
68         {
69             this.repository = archivaConfiguration.getConfiguration().findManagedRepositoryById( repoid );
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         if ( existingRepository == null )
98         {
99             addActionError( "A repository with that id does not exist" );
100             return ERROR;
101         }
102
103         String result = SUCCESS;
104
105         try
106         {
107             Configuration configuration = archivaConfiguration.getConfiguration();
108             cleanupRepositoryData( existingRepository );
109             removeRepository( repoid, configuration );
110             result = saveConfiguration( configuration );
111
112             if ( result.equals( SUCCESS ) )
113             {
114                 if ( deleteContents )
115                 {
116                     removeContents( existingRepository );
117                 }
118             }
119         }
120         catch ( IOException e )
121         {
122             addActionError( "Unable to delete repository: " + e.getMessage() );
123             result = ERROR;
124         }
125         catch ( RoleManagerException e )
126         {
127             addActionError( "Unable to delete repository: " + e.getMessage() );
128             result = ERROR;
129         }
130         catch ( ArchivaDatabaseException e )
131         {
132             addActionError( "Unable to delete repositoy: " + e.getMessage() );
133             result = ERROR;
134         }
135
136         return result;
137     }
138
139     private void cleanupRepositoryData( ManagedRepositoryConfiguration cleanupRepository )
140         throws RoleManagerException, ArchivaDatabaseException
141     {
142         removeRepositoryRoles( cleanupRepository );
143         cleanupDatabase( cleanupRepository.getId() );
144         cleanupScanStats( cleanupRepository.getId() );
145         
146         List<ProxyConnectorConfiguration> proxyConnectors = getProxyConnectors();
147         for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
148         {
149             if ( StringUtils.equals( proxyConnector.getSourceRepoId(), cleanupRepository.getId() ) )
150             {
151                 archivaConfiguration.getConfiguration().removeProxyConnector( proxyConnector );
152             }
153         }
154
155         Map<String, List<String>> repoToGroupMap = archivaConfiguration.getConfiguration().getRepositoryToGroupMap();
156         if( repoToGroupMap != null )
157         {
158             if( repoToGroupMap.containsKey( cleanupRepository.getId() ) )
159             {
160                 List<String> repoGroups = repoToGroupMap.get( cleanupRepository.getId() );
161                 for( String repoGroup : repoGroups )
162                 {
163                     archivaConfiguration.getConfiguration().findRepositoryGroupById( repoGroup ).removeRepository( cleanupRepository.getId() );
164                 }
165             }            
166         }
167     }
168
169     private void cleanupDatabase( String repoId )
170         throws ArchivaDatabaseException
171     {
172         Constraint constraint = new ArtifactsByRepositoryConstraint( repoId );
173
174         List<ArchivaArtifact> artifacts = archivaDAO.getArtifactDAO().queryArtifacts( constraint );
175
176         for ( ArchivaArtifact artifact : artifacts )
177         {
178             getLogger().info( "Removing artifact " + artifact + " from the database." );
179             try
180             {
181                 archivaDAO.getArtifactDAO().deleteArtifact( artifact );
182
183                 ArchivaProjectModel projectModel =
184                     archivaDAO.getProjectModelDAO().getProjectModel( artifact.getGroupId(), artifact.getArtifactId(),
185                                                                      artifact.getVersion() );
186
187                 archivaDAO.getProjectModelDAO().deleteProjectModel( projectModel );
188             }
189             catch ( ObjectNotFoundException oe )
190             {
191                 getLogger().info( "Project model of artifact " + artifact + " does not exist in the database. " +
192                                       "Moving on to the next artifact." );
193             }
194             catch ( ArchivaDatabaseException ae )
195             {
196                 getLogger().info( "Unable to delete artifact " + artifact + " from the database. " +
197                                       "Moving on to the next artifact." );
198             }
199         }
200     }
201
202     private void cleanupScanStats( String repoId )
203         throws ArchivaDatabaseException
204     {
205         List<RepositoryContentStatistics> results =
206             archivaDAO.getRepositoryContentStatisticsDAO().queryRepositoryContentStatistics(
207             new RepositoryContentStatisticsByRepositoryConstraint( repoId ) );
208
209         for ( RepositoryContentStatistics stats : results )
210         {
211             archivaDAO.getRepositoryContentStatisticsDAO().deleteRepositoryContentStatistics( stats );
212         }
213     }
214
215     public ManagedRepositoryConfiguration getRepository()
216     {
217         return repository;
218     }
219
220     public void setRepository( ManagedRepositoryConfiguration repository )
221     {
222         this.repository = repository;
223     }
224
225     public String getRepoid()
226     {
227         return repoid;
228     }
229
230     public void setRepoid( String repoid )
231     {
232         this.repoid = repoid;
233     }
234
235     public void setArchivaDAO( ArchivaDAO archivaDAO )
236     {
237         this.archivaDAO = archivaDAO;
238     }
239
240     public ArchivaDAO getArchivaDAO()
241     {
242         return archivaDAO;
243     }
244 }