]> source.dussan.org Git - archiva.git/blob
52c799593af5561fbd7ea2aaac994c4c8ee19b89
[archiva.git] /
1 package org.apache.maven.archiva.consumers.database;
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.StringUtils;
23 import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
24 import org.apache.maven.archiva.consumers.ConsumerException;
25 import org.apache.maven.archiva.model.ArchivaArtifact;
26 import org.apache.maven.archiva.model.ArchivaProjectModel;
27 import org.apache.maven.archiva.repository.ManagedRepositoryContent;
28 import org.apache.maven.archiva.repository.RepositoryContentFactory;
29 import org.apache.maven.archiva.repository.RepositoryException;
30 import org.apache.maven.archiva.database.ProjectModelDAO;
31 import org.apache.maven.archiva.database.ArchivaDatabaseException;
32 import org.apache.maven.archiva.database.updater.DatabaseCleanupConsumer;
33 import org.codehaus.plexus.cache.Cache;
34
35 import java.util.List;
36 import java.io.File;
37
38 /**
39  * Consumer for removing or deleting from the database the project models fo artifacts that have been
40  * deleted/removed from the repository.
41  *
42  *         <a href="mailto:oching@apache.org">Maria Odea Ching</a>
43  * @version $Id$
44  * 
45  * @plexus.component role="org.apache.maven.archiva.database.updater.DatabaseCleanupConsumer"
46  *                   role-hint="not-present-remove-db-project"
47  *                   instantiation-strategy="per-lookup"
48  */
49 public class DatabaseCleanupRemoveProjectConsumer
50     extends AbstractMonitoredConsumer
51     implements DatabaseCleanupConsumer
52 {
53     /**
54      * @plexus.configuration default-value="not-present-remove-db-project"
55      */
56     private String id;
57
58     /**
59      * @plexus.configuration default-value="Remove project from database if not present on filesystem."
60      */
61     private String description;
62
63     /**
64      * @plexus.requirement role-hint="jdo"
65      */
66     private ProjectModelDAO projectModelDAO;
67    
68     /**
69      * @plexus.requirement
70      */
71     private RepositoryContentFactory repositoryFactory;
72
73     /**
74      * @plexus.requirement role-hint="effective-project-cache"
75      */
76     private Cache effectiveProjectCache;
77
78     public void beginScan()
79     {
80         // TODO Auto-generated method stub
81     }
82
83     public void completeScan()
84     {
85         // TODO Auto-generated method stub
86     }
87
88     public List<String> getIncludedTypes()
89     {
90         return null;
91     }
92
93     public void processArchivaArtifact( ArchivaArtifact artifact )
94         throws ConsumerException
95     {
96         if ( !StringUtils.equals( "pom", artifact.getType() ) )
97         {
98             // Not a pom. Skip it.
99             return;
100         }
101
102         try
103         {
104             ManagedRepositoryContent repositoryContent =
105                 repositoryFactory.getManagedRepositoryContent( artifact.getModel().getRepositoryId() );
106
107             File file = new File( repositoryContent.getRepoRoot(), repositoryContent.toPath( artifact ) );
108
109             if ( !file.exists() )
110             {
111                 ArchivaProjectModel projectModel =
112                     projectModelDAO.getProjectModel( artifact.getGroupId(), artifact.getArtifactId(),
113                                                      artifact.getVersion() );
114
115                 projectModelDAO.deleteProjectModel( projectModel );
116                 
117                 // Force removal of project model from effective cache
118                 String projectKey = toProjectKey( projectModel );
119                 synchronized ( effectiveProjectCache )
120                 {
121                     if ( effectiveProjectCache.hasKey( projectKey ) )
122                     {
123                         effectiveProjectCache.remove( projectKey );
124                     }
125                 }
126             }
127         }
128         catch ( RepositoryException re )
129         {
130             throw new ConsumerException( "Can't run database cleanup remove artifact consumer: " + re.getMessage() );
131         }
132         catch ( ArchivaDatabaseException e )
133         {
134             throw new ConsumerException( e.getMessage() );
135         }
136
137     }
138
139     public String getDescription()
140     {
141         return description;
142     }
143
144     public String getId()
145     {
146         return id;
147     }
148
149     public boolean isPermanent()
150     {
151         return false;
152     }
153
154     public void setProjectModelDAO( ProjectModelDAO projectModelDAO )
155     {
156         this.projectModelDAO = projectModelDAO;
157     }
158
159     public void setRepositoryFactory( RepositoryContentFactory repositoryFactory )
160     {
161         this.repositoryFactory = repositoryFactory;
162     }
163     
164     public void setEffectiveProjectCache( Cache effectiveProjectCache )
165     {
166         this.effectiveProjectCache = effectiveProjectCache;
167     }
168
169     private String toProjectKey( ArchivaProjectModel project )
170     {
171         StringBuilder key = new StringBuilder();
172
173         key.append( project.getGroupId() ).append( ":" );
174         key.append( project.getArtifactId() ).append( ":" );
175         key.append( project.getVersion() );
176
177         return key.toString();
178     }
179 }