]> source.dussan.org Git - archiva.git/blob
6c42176b97b6ab8ff3429928be3b1aff546a8b82
[archiva.git] /
1 package org.apache.archiva.consumers.core.repository;
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 org.apache.archiva.admin.model.RepositoryAdminException;
23 import org.apache.archiva.admin.model.beans.ManagedRepository;
24 import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
25 import org.apache.archiva.metadata.repository.MetadataRepository;
26 import org.apache.archiva.metadata.repository.RepositorySession;
27 import org.apache.archiva.repository.events.RepositoryListener;
28 import org.apache.archiva.common.utils.VersionComparator;
29 import org.apache.archiva.common.utils.VersionUtil;
30 import org.apache.archiva.model.ArtifactReference;
31 import org.apache.archiva.model.ProjectReference;
32 import org.apache.archiva.model.VersionedReference;
33 import org.apache.archiva.repository.ContentNotFoundException;
34 import org.apache.archiva.repository.ManagedRepositoryContent;
35 import org.apache.archiva.repository.RepositoryContentFactory;
36 import org.apache.archiva.repository.RepositoryException;
37 import org.apache.archiva.repository.RepositoryNotFoundException;
38 import org.apache.archiva.repository.layout.LayoutException;
39 import org.apache.archiva.repository.metadata.MetadataTools;
40 import org.apache.archiva.repository.metadata.RepositoryMetadataException;
41
42 import java.io.File;
43 import java.io.IOException;
44 import java.util.ArrayList;
45 import java.util.Collections;
46 import java.util.List;
47
48 /**
49  * <p>
50  * This will look in a single managed repository, and purge any snapshots that are present
51  * that have a corresponding released version on the same repository.
52  * </p>
53  * <p/>
54  * <p>
55  * So, if you have the following (presented in the m2/default layout form) ...
56  * <pre>
57  *   /com/foo/foo-tool/1.0-SNAPSHOT/foo-tool-1.0-SNAPSHOT.jar
58  *   /com/foo/foo-tool/1.1-SNAPSHOT/foo-tool-1.1-SNAPSHOT.jar
59  *   /com/foo/foo-tool/1.2.1-SNAPSHOT/foo-tool-1.2.1-SNAPSHOT.jar
60  *   /com/foo/foo-tool/1.2.1/foo-tool-1.2.1.jar
61  *   /com/foo/foo-tool/2.0-SNAPSHOT/foo-tool-2.0-SNAPSHOT.jar
62  *   /com/foo/foo-tool/2.0/foo-tool-2.0.jar
63  *   /com/foo/foo-tool/2.1-SNAPSHOT/foo-tool-2.1-SNAPSHOT.jar
64  * </pre>
65  * then the current highest ranked released (non-snapshot) version is 2.0, which means
66  * the snapshots from 1.0-SNAPSHOT, 1.1-SNAPSHOT, 1.2.1-SNAPSHOT, and 2.0-SNAPSHOT can
67  * be purged.  Leaving 2.1-SNAPSHOT in alone.
68  * </p>
69  *
70  * @version $Id$
71  */
72 public class CleanupReleasedSnapshotsRepositoryPurge
73     extends AbstractRepositoryPurge
74 {
75     private MetadataTools metadataTools;
76
77     private ManagedRepositoryAdmin managedRepositoryAdmin;
78
79     private RepositoryContentFactory repoContentFactory;
80
81     public CleanupReleasedSnapshotsRepositoryPurge( ManagedRepositoryContent repository, MetadataTools metadataTools,
82                                                     ManagedRepositoryAdmin managedRepositoryAdmin,
83                                                     RepositoryContentFactory repoContentFactory,
84                                                     RepositorySession repositorySession,
85                                                     List<RepositoryListener> listeners )
86     {
87         super( repository, repositorySession, listeners );
88         this.metadataTools = metadataTools;
89         this.managedRepositoryAdmin = managedRepositoryAdmin;
90         this.repoContentFactory = repoContentFactory;
91     }
92
93     public void process( String path )
94         throws RepositoryPurgeException
95     {
96         try
97         {
98             File artifactFile = new File( repository.getRepoRoot(), path );
99
100             if ( !artifactFile.exists() )
101             {
102                 // Nothing to do here, file doesn't exist, skip it.
103                 return;
104             }
105
106             ArtifactReference artifactRef = repository.toArtifactReference( path );
107
108             if ( !VersionUtil.isSnapshot( artifactRef.getVersion() ) )
109             {
110                 // Nothing to do here, not a snapshot, skip it.
111                 return;
112             }
113
114             ProjectReference reference = new ProjectReference();
115             reference.setGroupId( artifactRef.getGroupId() );
116             reference.setArtifactId( artifactRef.getArtifactId() );
117
118             // Gether the released versions
119             List<String> releasedVersions = new ArrayList<String>();
120
121             List<ManagedRepository> repos = managedRepositoryAdmin.getManagedRepositories();
122             for ( ManagedRepository repo : repos )
123             {
124                 if ( repo.isReleases() )
125                 {
126                     try
127                     {
128                         ManagedRepositoryContent repoContent =
129                             repoContentFactory.getManagedRepositoryContent( repo.getId() );
130                         for ( String version : repoContent.getVersions( reference ) )
131                         {
132                             if ( !VersionUtil.isSnapshot( version ) )
133                             {
134                                 releasedVersions.add( version );
135                             }
136                         }
137                     }
138                     catch ( RepositoryNotFoundException e )
139                     {
140                         // swallow
141                     }
142                     catch ( RepositoryException e )
143                     {
144                         // swallow
145                     }
146                 }
147             }
148
149             Collections.sort( releasedVersions, VersionComparator.getInstance() );
150
151             // Now clean out any version that is earlier than the highest released version.
152             boolean needsMetadataUpdate = false;
153
154             VersionedReference versionRef = new VersionedReference();
155             versionRef.setGroupId( artifactRef.getGroupId() );
156             versionRef.setArtifactId( artifactRef.getArtifactId() );
157
158             MetadataRepository metadataRepository = repositorySession.getRepository();
159
160             if ( releasedVersions.contains( VersionUtil.getReleaseVersion( artifactRef.getVersion() ) ) )
161             {
162                 versionRef.setVersion( artifactRef.getVersion() );
163                 repository.deleteVersion( versionRef );
164
165                 // FIXME: looks incomplete, might not delete related metadata?
166                 for ( RepositoryListener listener : listeners )
167                 {
168                     listener.deleteArtifact( metadataRepository, repository.getId(), artifactRef.getGroupId(),
169                                              artifactRef.getArtifactId(), artifactRef.getVersion(),
170                                              artifactFile.getName() );
171                 }
172
173                 needsMetadataUpdate = true;
174             }
175
176             if ( needsMetadataUpdate )
177             {
178                 updateMetadata( artifactRef );
179             }
180         } catch ( RepositoryAdminException e )
181         {
182             throw new RepositoryPurgeException( e.getMessage(), e );
183         }
184         catch ( LayoutException e )
185         {
186             log.debug( "Not processing file that is not an artifact: {}", e.getMessage() );
187         }
188         catch ( ContentNotFoundException e )
189         {
190             throw new RepositoryPurgeException( e.getMessage(), e );
191         }
192     }
193
194     private void updateMetadata( ArtifactReference artifact )
195     {
196         VersionedReference versionRef = new VersionedReference();
197         versionRef.setGroupId( artifact.getGroupId() );
198         versionRef.setArtifactId( artifact.getArtifactId() );
199         versionRef.setVersion( artifact.getVersion() );
200
201         ProjectReference projectRef = new ProjectReference();
202         projectRef.setGroupId( artifact.getGroupId() );
203         projectRef.setArtifactId( artifact.getArtifactId() );
204
205         try
206         {
207             metadataTools.updateMetadata( repository, versionRef );
208         }
209         catch ( ContentNotFoundException e )
210         {
211             // Ignore. (Just means we have no snapshot versions left to reference).
212         }
213         catch ( RepositoryMetadataException e )
214         {
215             // Ignore. 
216         }
217         catch ( IOException e )
218         {
219             // Ignore. 
220         }
221         catch ( LayoutException e )
222         {
223             // Ignore.
224         }
225
226         try
227         {
228             metadataTools.updateMetadata( repository, projectRef );
229         }
230         catch ( ContentNotFoundException e )
231         {
232             // Ignore. (Just means we have no snapshot versions left to reference).
233         }
234         catch ( RepositoryMetadataException e )
235         {
236             // Ignore. 
237         }
238         catch ( IOException e )
239         {
240             // Ignore. 
241         }
242         catch ( LayoutException e )
243         {
244             // Ignore.
245         }
246     }
247 }