]> source.dussan.org Git - archiva.git/blob
e8d8e0d6d464957fa91cd11c2a8a5441981386a4
[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.commons.lang.time.DateUtils;
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.repository.ContentNotFoundException;
27 import org.apache.maven.archiva.repository.ManagedRepositoryContent;
28 import org.apache.maven.archiva.repository.layout.LayoutException;
29
30 import java.io.File;
31 import java.text.ParseException;
32 import java.text.SimpleDateFormat;
33 import java.util.Calendar;
34 import java.util.Date;
35 import java.util.Set;
36 import java.util.regex.Matcher;
37
38 /**
39  * Purge from repository all snapshots older than the specified days in the repository configuration.
40  *
41  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
42  */
43 public class DaysOldRepositoryPurge
44     extends AbstractRepositoryPurge
45 {
46     private SimpleDateFormat timestampParser;
47
48     private int daysOlder;
49     
50     public DaysOldRepositoryPurge( ManagedRepositoryContent repository, ArtifactDAO artifactDao,
51                                    int daysOlder )
52     {
53         super( repository, artifactDao );
54         this.daysOlder = daysOlder;
55         timestampParser = new SimpleDateFormat( "yyyyMMdd.HHmmss" );
56         timestampParser.setTimeZone( DateUtils.UTC_TIME_ZONE );
57     }
58
59     public void process( String path )
60         throws RepositoryPurgeException
61     {
62         try
63         {
64             File artifactFile = new File( repository.getRepoRoot(), path );
65
66             if ( !artifactFile.exists() )
67             {
68                 return;
69             }
70
71             ArtifactReference artifact = repository.toArtifactReference( path );
72
73             Calendar olderThanThisDate = Calendar.getInstance( DateUtils.UTC_TIME_ZONE );
74             olderThanThisDate.add( Calendar.DATE, -daysOlder );
75
76             // Is this a generic snapshot "1.0-SNAPSHOT" ?
77             if ( VersionUtil.isGenericSnapshot( artifact.getVersion() ) )
78             {
79                 if ( artifactFile.lastModified() < olderThanThisDate.getTimeInMillis() )
80                 {
81                     doPurgeAllRelated( artifactFile );
82                 }
83             }
84             // Is this a timestamp snapshot "1.0-20070822.123456-42" ?
85             else if ( VersionUtil.isUniqueSnapshot( artifact.getVersion() ) )
86             {
87                 Calendar timestampCal = uniqueSnapshotToCalendar( artifact.getVersion() );
88
89                 if ( timestampCal.getTimeInMillis() < olderThanThisDate.getTimeInMillis() )
90                 {
91                     doPurgeAllRelated( artifactFile );
92                 }
93                 else if ( artifactFile.lastModified() < olderThanThisDate.getTimeInMillis() )
94                 {
95                     doPurgeAllRelated( artifactFile );
96                 }
97             }
98         }
99         catch ( LayoutException le )
100         {
101             throw new RepositoryPurgeException( le.getMessage() );
102         }
103     }
104
105     private Calendar uniqueSnapshotToCalendar( String version )
106     {
107         // The latestVersion will contain the full version string "1.0-alpha-5-20070821.213044-8"
108         // This needs to be broken down into ${base}-${timestamp}-${build_number}
109
110         Matcher m = VersionUtil.UNIQUE_SNAPSHOT_PATTERN.matcher( version );
111         if ( m.matches() )
112         {
113             Matcher mtimestamp = VersionUtil.TIMESTAMP_PATTERN.matcher( m.group( 2 ) );
114             if ( mtimestamp.matches() )
115             {
116                 String tsDate = mtimestamp.group( 1 );
117                 String tsTime = mtimestamp.group( 2 );
118
119                 Date versionDate;
120                 try
121                 {
122                     versionDate = timestampParser.parse( tsDate + "." + tsTime );
123                     Calendar cal = Calendar.getInstance( DateUtils.UTC_TIME_ZONE );
124                     cal.setTime( versionDate );
125
126                     return cal;
127                 }
128                 catch ( ParseException e )
129                 {
130                     // Invalid Date/Time
131                     return null;
132                 }
133             }
134         }
135         return null;
136     }
137
138     private void doPurgeAllRelated( File artifactFile ) throws LayoutException
139     {
140         ArtifactReference reference = repository.toArtifactReference( artifactFile.getAbsolutePath() );
141         
142         try
143         {
144             Set<ArtifactReference> related = repository.getRelatedArtifacts( reference );
145             purge( related );
146         }
147         catch ( ContentNotFoundException e )
148         {
149             // Nothing to do here.
150             // TODO: Log this?
151         }
152     }
153 }