View Javadoc
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.beans.ManagedRepository;
23  import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
24  import org.apache.archiva.configuration.ArchivaConfiguration;
25  import org.apache.archiva.configuration.ConfigurationNames;
26  import org.apache.archiva.configuration.FileTypes;
27  import org.apache.archiva.consumers.AbstractMonitoredConsumer;
28  import org.apache.archiva.consumers.ConsumerException;
29  import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
30  import org.apache.archiva.metadata.repository.RepositorySession;
31  import org.apache.archiva.metadata.repository.RepositorySessionFactory;
32  import org.apache.archiva.redback.components.registry.Registry;
33  import org.apache.archiva.repository.ManagedRepositoryContent;
34  import org.apache.archiva.repository.RepositoryContentFactory;
35  import org.apache.archiva.repository.RepositoryException;
36  import org.apache.archiva.repository.RepositoryNotFoundException;
37  import org.apache.archiva.repository.events.RepositoryListener;
38  import org.apache.archiva.repository.metadata.MetadataTools;
39  import org.apache.archiva.redback.components.registry.RegistryListener;
40  import org.springframework.beans.factory.annotation.Autowired;
41  import org.springframework.context.annotation.Scope;
42  import org.springframework.stereotype.Service;
43  
44  import javax.annotation.PostConstruct;
45  import javax.inject.Inject;
46  import javax.inject.Named;
47  import java.util.ArrayList;
48  import java.util.Collections;
49  import java.util.Date;
50  import java.util.List;
51  
52  /**
53   * Consumer for removing old snapshots in the repository based on the criteria
54   * specified by the user.
55   */
56  @Service( "knownRepositoryContentConsumer#repository-purge" )
57  @Scope( "prototype" )
58  public class RepositoryPurgeConsumer
59      extends AbstractMonitoredConsumer
60      implements KnownRepositoryContentConsumer, RegistryListener
61  {
62      /**
63       * default-value="repository-purge"
64       */
65      private String id = "repository-purge";
66  
67      /**
68       * default-value="Purge repository of old snapshots"
69       */
70      private String description = "Purge repository of old snapshots";
71  
72      @Inject
73      @Named( value = "archivaConfiguration#default" )
74      private ArchivaConfiguration configuration;
75  
76      @Inject
77      private ManagedRepositoryAdmin managedRepositoryAdmin;
78  
79      @Inject
80      @Named( value = "repositoryContentFactory#default" )
81      private RepositoryContentFactory repositoryContentFactory;
82  
83      @Inject
84      private MetadataTools metadataTools;
85  
86      @Inject
87      @Named( value = "fileTypes" )
88      private FileTypes filetypes;
89  
90      private List<String> includes = new ArrayList<>();
91  
92      private RepositoryPurge repoPurge;
93  
94      private RepositoryPurge cleanUp;
95  
96      private boolean deleteReleasedSnapshots;
97  
98      /**
99       *
100      */
101     @Inject
102     @Autowired(required = false)
103     private List<RepositoryListener> listeners = Collections.emptyList();
104 
105     /**
106      * FIXME: this could be multiple implementations and needs to be configured.
107      */
108     @Inject
109     private RepositorySessionFactory repositorySessionFactory;
110 
111     private RepositorySession repositorySession;
112 
113     @Override
114     public String getId()
115     {
116         return this.id;
117     }
118 
119     @Override
120     public String getDescription()
121     {
122         return this.description;
123     }
124 
125     @Override
126     public List<String> getExcludes()
127     {
128         return getDefaultArtifactExclusions();
129     }
130 
131     @Override
132     public List<String> getIncludes()
133     {
134         return this.includes;
135     }
136 
137     @Override
138     public void beginScan( ManagedRepository repository, Date whenGathered )
139         throws ConsumerException
140     {
141         ManagedRepositoryContent repositoryContent;
142         try
143         {
144             repositoryContent = repositoryContentFactory.getManagedRepositoryContent( repository.getId() );
145         }
146         catch ( RepositoryNotFoundException e )
147         {
148             throw new ConsumerException( "Can't run repository purge: " + e.getMessage(), e );
149         }
150         catch ( RepositoryException e )
151         {
152             throw new ConsumerException( "Can't run repository purge: " + e.getMessage(), e );
153         }
154 
155         repositorySession = repositorySessionFactory.createSession();
156 
157         if ( repository.getDaysOlder() != 0 )
158         {
159             repoPurge = new DaysOldRepositoryPurge( repositoryContent, repository.getDaysOlder(),
160                                                     repository.getRetentionCount(), repositorySession, listeners );
161         }
162         else
163         {
164             repoPurge =
165                 new RetentionCountRepositoryPurge( repositoryContent, repository.getRetentionCount(), repositorySession,
166                                                    listeners );
167         }
168 
169         cleanUp = new CleanupReleasedSnapshotsRepositoryPurge( repositoryContent, metadataTools, managedRepositoryAdmin,
170                                                                repositoryContentFactory, repositorySession, listeners );
171 
172         deleteReleasedSnapshots = repository.isDeleteReleasedSnapshots();
173     }
174 
175     @Override
176     public void beginScan( ManagedRepository repository, Date whenGathered, boolean executeOnEntireRepo )
177         throws ConsumerException
178     {
179         beginScan( repository, whenGathered );
180     }
181 
182     @Override
183     public void processFile( String path )
184         throws ConsumerException
185     {
186         try
187         {
188             if ( deleteReleasedSnapshots )
189             {
190                 cleanUp.process( path );
191             }
192 
193             repoPurge.process( path );
194         }
195         catch ( RepositoryPurgeException rpe )
196         {
197             throw new ConsumerException( rpe.getMessage(), rpe );
198         }
199     }
200 
201     @Override
202     public void processFile( String path, boolean executeOnEntireRepo )
203         throws Exception
204     {
205         processFile( path );
206     }
207 
208     @Override
209     public void completeScan()
210     {
211         repositorySession.close();
212     }
213 
214     @Override
215     public void completeScan( boolean executeOnEntireRepo )
216     {
217         completeScan();
218     }
219 
220     @Override
221     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
222     {
223         if ( ConfigurationNames.isRepositoryScanning( propertyName ) )
224         {
225             initIncludes();
226         }
227     }
228 
229     @Override
230     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
231     {
232         /* do nothing */
233     }
234 
235     private void initIncludes()
236     {
237         includes = new ArrayList<>( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) );
238     }
239 
240     @PostConstruct
241     public void initialize()
242     {
243         configuration.addChangeListener( this );
244 
245         initIncludes();
246     }
247 
248     @Override
249     public boolean isProcessUnmodified()
250     {
251         // we need to check all files for deletion, especially if not modified
252         return true;
253     }
254 
255     public ArchivaConfiguration getConfiguration()
256     {
257         return configuration;
258     }
259 
260     public void setConfiguration( ArchivaConfiguration configuration )
261     {
262         this.configuration = configuration;
263     }
264 
265     public RepositoryContentFactory getRepositoryContentFactory()
266     {
267         return repositoryContentFactory;
268     }
269 
270     public void setRepositoryContentFactory( RepositoryContentFactory repositoryContentFactory )
271     {
272         this.repositoryContentFactory = repositoryContentFactory;
273     }
274 
275     public MetadataTools getMetadataTools()
276     {
277         return metadataTools;
278     }
279 
280     public void setMetadataTools( MetadataTools metadataTools )
281     {
282         this.metadataTools = metadataTools;
283     }
284 
285     public FileTypes getFiletypes()
286     {
287         return filetypes;
288     }
289 
290     public void setFiletypes( FileTypes filetypes )
291     {
292         this.filetypes = filetypes;
293     }
294 
295     public RepositoryPurge getRepoPurge()
296     {
297         return repoPurge;
298     }
299 
300     public void setRepoPurge( RepositoryPurge repoPurge )
301     {
302         this.repoPurge = repoPurge;
303     }
304 
305     public RepositoryPurge getCleanUp()
306     {
307         return cleanUp;
308     }
309 
310     public void setCleanUp( RepositoryPurge cleanUp )
311     {
312         this.cleanUp = cleanUp;
313     }
314 
315     public boolean isDeleteReleasedSnapshots()
316     {
317         return deleteReleasedSnapshots;
318     }
319 
320     public void setDeleteReleasedSnapshots( boolean deleteReleasedSnapshots )
321     {
322         this.deleteReleasedSnapshots = deleteReleasedSnapshots;
323     }
324 
325     public RepositorySessionFactory getRepositorySessionFactory()
326     {
327         return repositorySessionFactory;
328     }
329 
330     public void setRepositorySessionFactory( RepositorySessionFactory repositorySessionFactory )
331     {
332         this.repositorySessionFactory = repositorySessionFactory;
333     }
334 
335     public RepositorySession getRepositorySession()
336     {
337         return repositorySession;
338     }
339 
340     public void setRepositorySession( RepositorySession repositorySession )
341     {
342         this.repositorySession = repositorySession;
343     }
344 }