]> source.dussan.org Git - archiva.git/blob
7397944034433c95a7cc183fbf3f60142d35000f
[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.database.ArchivaDatabaseException;
23 import org.apache.maven.archiva.database.ArtifactDAO;
24 import org.apache.maven.archiva.indexer.RepositoryIndexException;
25 import org.apache.maven.archiva.model.ArchivaArtifact;
26 import org.apache.maven.archiva.model.ArtifactReference;
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.io.FilenameFilter;
32 import java.util.Set;
33
34 /**
35  * Base class for all repository purge tasks.
36  * 
37  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
38  */
39 public abstract class AbstractRepositoryPurge
40     implements RepositoryPurge
41 {
42     protected ManagedRepositoryContent repository;
43
44     protected ArtifactDAO artifactDao;
45
46     public AbstractRepositoryPurge( ManagedRepositoryContent repository, ArtifactDAO artifactDao )
47     {
48         this.repository = repository;
49         this.artifactDao = artifactDao;
50     }
51
52     /**
53      * Get all files from the directory that matches the specified filename.
54      *
55      * @param dir      the directory to be scanned
56      * @param filename the filename to be matched
57      * @return
58      */
59     protected File[] getFiles( File dir, String filename )
60     {
61         FilenameFilter filter = new ArtifactFilenameFilter( filename );
62
63         File[] files = dir.listFiles( filter );
64
65         return files;
66     }
67
68     protected String toRelativePath( File artifactFile )
69     {
70         String artifactPath = artifactFile.getAbsolutePath();
71         if ( artifactPath.startsWith( repository.getRepoRoot() ) )
72         {
73             artifactPath = artifactPath.substring( repository.getRepoRoot().length() );
74         }
75
76         return artifactPath;
77     }
78
79     /**
80      * Purge the repo. Update db and index of removed artifacts.
81      *
82      * @param artifactFiles
83      * @throws RepositoryIndexException
84      */
85     protected void purge( Set<ArtifactReference> references )
86     {
87         for ( ArtifactReference reference : references )
88         {
89             File artifactFile = repository.toFile( reference );
90
91             artifactFile.delete();
92             purgeSupportFiles( artifactFile );
93
94             // intended to be swallowed
95             // continue updating the database for all artifacts
96             try
97             {
98                 String artifactPath = toRelativePath( artifactFile );
99                 updateDatabase( artifactPath );
100             }
101             catch ( ArchivaDatabaseException ae )
102             {
103                 // TODO: determine logging to be used
104             }
105             catch ( LayoutException le )
106             {
107                 // Ignore
108             }
109         }
110     }
111
112     /**
113      * <p>
114      * This find support files for the artifactFile and deletes them.
115      * </p>
116      * 
117      * <p>
118      * Support Files are things like ".sha1", ".md5", ".asc", etc.
119      * </p>
120      * 
121      * @param artifactFile the file to base off of.
122      */
123     private void purgeSupportFiles( File artifactFile )
124     {
125         File parentDir = artifactFile.getParentFile();
126
127         if ( !parentDir.exists() )
128         {
129             return;
130         }
131
132         FilenameFilter filter = new ArtifactFilenameFilter( artifactFile.getName() );
133
134         File[] files = parentDir.listFiles( filter );
135
136         for ( File file : files )
137         {
138             if ( file.exists() && file.isFile() )
139             {
140                 file.delete();
141                 // TODO: log that it was deleted?
142             }
143         }
144     }
145
146     private void updateDatabase( String path )
147         throws ArchivaDatabaseException, LayoutException
148     {
149         ArtifactReference artifact = repository.toArtifactReference( path );
150         ArchivaArtifact queriedArtifact = artifactDao.getArtifact( artifact.getGroupId(), artifact.getArtifactId(),
151                                                                    artifact.getVersion(), artifact.getClassifier(),
152                                                                    artifact.getType() );
153
154         artifactDao.deleteArtifact( queriedArtifact );
155
156         // TODO [MRM-37]: re-run the database consumers to clean up
157     }
158 }