]> source.dussan.org Git - archiva.git/blob
b46ce6e8c4fe0ea02fd6b6cb4dbc26132b9352e7
[archiva.git] /
1 package org.apache.maven.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.maven.archiva.common.utils.VersionComparator;
23 import org.apache.maven.archiva.common.utils.VersionUtil;
24 import org.apache.maven.archiva.database.ArtifactDAO;
25 import org.apache.maven.archiva.model.ArtifactReference;
26 import org.apache.maven.archiva.model.VersionedReference;
27 import org.apache.maven.archiva.repository.ContentNotFoundException;
28 import org.apache.maven.archiva.repository.ManagedRepositoryContent;
29 import org.apache.maven.archiva.repository.layout.LayoutException;
30
31 import java.io.File;
32 import java.util.ArrayList;
33 import java.util.Collections;
34 import java.util.List;
35 import java.util.Set;
36
37 /**
38  * Purge the repository by retention count. Retain only the specified number of snapshots.
39  *
40  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
41  */
42 public class RetentionCountRepositoryPurge
43     extends AbstractRepositoryPurge
44 {
45     private int retentionCount;
46
47     public RetentionCountRepositoryPurge( ManagedRepositoryContent repository, ArtifactDAO artifactDao,
48                                           int retentionCount )
49     {
50         super( repository, artifactDao );
51         this.retentionCount = retentionCount;
52     }
53
54     public void process( String path )
55         throws RepositoryPurgeException
56     {
57         try
58         {
59             File artifactFile = new File( repository.getRepoRoot(), path );
60
61             if ( !artifactFile.exists() )
62             {
63                 return;
64             }
65
66             ArtifactReference artifact = repository.toArtifactReference( path );
67
68             if ( VersionUtil.isSnapshot( artifact.getVersion() ) )
69             {
70                 VersionedReference reference = new VersionedReference();
71                 reference.setGroupId( artifact.getGroupId() );
72                 reference.setArtifactId( artifact.getArtifactId() );
73                 reference.setVersion( artifact.getVersion() );
74
75                 List<String> versions = new ArrayList<String>( repository.getVersions( reference ) );
76
77                 Collections.sort( versions, VersionComparator.getInstance() );
78
79                 if ( retentionCount > versions.size() )
80                 {
81                     // Done. nothing to do here. skip it.
82                     return;
83                 }
84
85                 int countToPurge = versions.size() - retentionCount;
86
87                 for ( String version : versions )
88                 {
89                     if ( countToPurge-- <= 0 )
90                     {
91                         break;
92                     }
93
94                     doPurgeAllRelated( artifact, version );
95                 }
96             }
97         }
98         catch ( LayoutException le )
99         {
100             throw new RepositoryPurgeException( le.getMessage() );
101         }
102         catch ( ContentNotFoundException e )
103         {
104             // Nothing to do here.
105             // TODO: Log this condition?
106         }
107     }
108
109     private void doPurgeAllRelated( ArtifactReference reference, String version )
110         throws LayoutException
111     {
112         ArtifactReference artifact = new ArtifactReference();
113         artifact.setGroupId( reference.getGroupId() );
114         artifact.setArtifactId( reference.getArtifactId() );
115         artifact.setVersion( version );
116         artifact.setClassifier( reference.getClassifier() );
117         artifact.setType( reference.getType() );
118         
119         try
120         {
121             Set<ArtifactReference> related = repository.getRelatedArtifacts( artifact );
122             purge( related );
123         }
124         catch ( ContentNotFoundException e )
125         {
126             // Nothing to do here.
127             // TODO: Log this?
128         }
129     }
130 }