1 package org.apache.archiva.consumers.core.repository;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
54
55
56 @Service( "knownRepositoryContentConsumer#repository-purge" )
57 @Scope( "prototype" )
58 public class RepositoryPurgeConsumer
59 extends AbstractMonitoredConsumer
60 implements KnownRepositoryContentConsumer, RegistryListener
61 {
62
63
64
65 private String id = "repository-purge";
66
67
68
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
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
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
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 }