]> source.dussan.org Git - archiva.git/blob
b6a06be9523dad38f5edd0ea7b6259b9d6e7d2f0
[archiva.git] /
1 package org.apache.archiva.repository.content.legacy;
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.common.utils.PathUtil;
24 import org.apache.archiva.configuration.FileTypes;
25 import org.apache.archiva.model.ArchivaArtifact;
26 import org.apache.archiva.model.ArtifactReference;
27 import org.apache.archiva.model.ProjectReference;
28 import org.apache.archiva.model.VersionedReference;
29 import org.apache.archiva.repository.ContentNotFoundException;
30 import org.apache.archiva.repository.ManagedRepositoryContent;
31 import org.apache.archiva.repository.RepositoryException;
32 import org.apache.archiva.repository.layout.LayoutException;
33 import org.apache.commons.collections.CollectionUtils;
34 import org.apache.commons.lang.StringUtils;
35 import org.springframework.context.annotation.Scope;
36 import org.springframework.stereotype.Service;
37
38 import javax.inject.Inject;
39 import java.io.File;
40 import java.util.HashSet;
41 import java.util.Set;
42
43 /**
44  * ManagedLegacyRepositoryContent
45  *
46  *
47  * TODO no need to be a component when filetypes, legacy path parser is not
48  */
49 @Service( "managedRepositoryContent#legacy" )
50 @Scope( "prototype" )
51 public class ManagedLegacyRepositoryContent
52     extends AbstractLegacyRepositoryContent
53     implements ManagedRepositoryContent
54 {
55     /**
56      *
57      */
58     @Inject
59     private FileTypes filetypes;
60
61     private ManagedRepository repository;
62
63     @Override
64     public void deleteVersion( VersionedReference reference )
65         throws ContentNotFoundException
66     {
67         File groupDir = new File( repository.getLocation(), reference.getGroupId() );
68
69         if ( !groupDir.exists() )
70         {
71             throw new ContentNotFoundException(
72                 "Unable to get versions using a non-existant groupId directory: " + groupDir.getAbsolutePath() );
73         }
74
75         if ( !groupDir.isDirectory() )
76         {
77             throw new ContentNotFoundException(
78                 "Unable to get versions using a non-directory: " + groupDir.getAbsolutePath() );
79         }
80
81         // First gather up the versions found as artifacts in the managed repository.
82         File typeDirs[] = groupDir.listFiles();
83         for ( File typeDir : typeDirs )
84         {
85             if ( !typeDir.isDirectory() )
86             {
87                 // Skip it, we only care about directories.
88                 continue;
89             }
90
91             if ( !typeDir.getName().endsWith( "s" ) )
92             {
93                 // Skip it, we only care about directories that end in "s".
94             }
95
96             deleteVersions( typeDir, reference );
97         }
98     }
99
100     private void deleteVersions( File typeDir, VersionedReference reference )
101     {
102         File repoFiles[] = typeDir.listFiles();
103         for ( File repoFile : repoFiles )
104         {
105             if ( repoFile.isDirectory() )
106             {
107                 // Skip it. it's a directory.
108                 continue;
109             }
110
111             String relativePath = PathUtil.getRelative( repository.getLocation(), repoFile );
112
113             if ( filetypes.matchesArtifactPattern( relativePath ) )
114             {
115                 try
116                 {
117                     ArtifactReference artifact = toArtifactReference( relativePath );
118                     if ( StringUtils.equals( artifact.getArtifactId(), reference.getArtifactId() )
119                         && StringUtils.equals( artifact.getVersion(), reference.getVersion() ) )
120                     {
121                         repoFile.delete();
122                         deleteSupportFiles( repoFile );
123                     }
124                 }
125                 catch ( LayoutException e )
126                 {
127                     /* don't fail the process if there is a bad artifact within the directory. */
128                 }
129             }
130         }
131     }
132
133     @Override
134     public void deleteProject( String namespace, String projectId )
135         throws RepositoryException
136     {
137         // TODO implements ??
138     }
139
140     private void deleteSupportFiles( File repoFile )
141     {
142         deleteSupportFile( repoFile, ".sha1" );
143         deleteSupportFile( repoFile, ".md5" );
144         deleteSupportFile( repoFile, ".asc" );
145         deleteSupportFile( repoFile, ".gpg" );
146     }
147
148     private void deleteSupportFile( File repoFile, String supportExtension )
149     {
150         File supportFile = new File( repoFile.getAbsolutePath() + supportExtension );
151         if ( supportFile.exists() && supportFile.isFile() )
152         {
153             supportFile.delete();
154         }
155     }
156
157     @Override
158     public String getId()
159     {
160         return repository.getId();
161     }
162
163     @Override
164     public Set<ArtifactReference> getRelatedArtifacts( ArtifactReference reference )
165         throws ContentNotFoundException
166     {
167         File artifactFile = toFile( reference );
168         File repoDir = artifactFile.getParentFile();
169
170         if ( !repoDir.exists() )
171         {
172             throw new ContentNotFoundException(
173                 "Unable to get related artifacts using a non-existant directory: " + repoDir.getAbsolutePath() );
174         }
175
176         if ( !repoDir.isDirectory() )
177         {
178             throw new ContentNotFoundException(
179                 "Unable to get related artifacts using a non-directory: " + repoDir.getAbsolutePath() );
180         }
181
182         Set<ArtifactReference> foundArtifacts = new HashSet<ArtifactReference>();
183
184         // First gather up the versions found as artifacts in the managed repository.
185         File projectParentDir = repoDir.getParentFile();
186         File typeDirs[] = projectParentDir.listFiles();
187         for ( File typeDir : typeDirs )
188         {
189             if ( !typeDir.isDirectory() )
190             {
191                 // Skip it, we only care about directories.
192                 continue;
193             }
194
195             if ( !typeDir.getName().endsWith( "s" ) )
196             {
197                 // Skip it, we only care about directories that end in "s".
198             }
199
200             getRelatedArtifacts( typeDir, reference, foundArtifacts );
201         }
202
203         return foundArtifacts;
204     }
205
206     @Override
207     public String getRepoRoot()
208     {
209         return repository.getLocation();
210     }
211
212     @Override
213     public ManagedRepository getRepository()
214     {
215         return repository;
216     }
217
218     @Override
219     public Set<String> getVersions( ProjectReference reference )
220         throws ContentNotFoundException
221     {
222         File groupDir = new File( repository.getLocation(), reference.getGroupId() );
223
224         if ( !groupDir.exists() )
225         {
226             throw new ContentNotFoundException(
227                 "Unable to get versions using a non-existant groupId directory: " + groupDir.getAbsolutePath() );
228         }
229
230         if ( !groupDir.isDirectory() )
231         {
232             throw new ContentNotFoundException(
233                 "Unable to get versions using a non-directory: " + groupDir.getAbsolutePath() );
234         }
235
236         Set<String> foundVersions = new HashSet<String>();
237
238         // First gather up the versions found as artifacts in the managed repository.
239         File typeDirs[] = groupDir.listFiles();
240         for ( File typeDir : typeDirs )
241         {
242             if ( !typeDir.isDirectory() )
243             {
244                 // Skip it, we only care about directories.
245                 continue;
246             }
247
248             if ( !typeDir.getName().endsWith( "s" ) )
249             {
250                 // Skip it, we only care about directories that end in "s".
251             }
252
253             getProjectVersions( typeDir, reference, foundVersions );
254         }
255
256         return foundVersions;
257     }
258
259     @Override
260     public Set<String> getVersions( VersionedReference reference )
261         throws ContentNotFoundException
262     {
263         File groupDir = new File( repository.getLocation(), reference.getGroupId() );
264
265         if ( !groupDir.exists() )
266         {
267             throw new ContentNotFoundException(
268                 "Unable to get versions using a non-existant groupId directory: " + groupDir.getAbsolutePath() );
269         }
270
271         if ( !groupDir.isDirectory() )
272         {
273             throw new ContentNotFoundException(
274                 "Unable to get versions using a non-directory: " + groupDir.getAbsolutePath() );
275         }
276
277         Set<String> foundVersions = new HashSet<String>();
278
279         // First gather up the versions found as artifacts in the managed repository.
280         File typeDirs[] = groupDir.listFiles();
281         for ( File typeDir : typeDirs )
282         {
283             if ( !typeDir.isDirectory() )
284             {
285                 // Skip it, we only care about directories.
286                 continue;
287             }
288
289             if ( !typeDir.getName().endsWith( "s" ) )
290             {
291                 // Skip it, we only care about directories that end in "s".
292             }
293
294             getVersionedVersions( typeDir, reference, foundVersions );
295         }
296
297         return foundVersions;
298     }
299
300     @Override
301     public boolean hasContent( ArtifactReference reference )
302     {
303         File artifactFile = toFile( reference );
304         return artifactFile.exists() && artifactFile.isFile();
305     }
306
307     @Override
308     public boolean hasContent( ProjectReference reference )
309     {
310         try
311         {
312             Set<String> versions = getVersions( reference );
313             return CollectionUtils.isNotEmpty( versions );
314         }
315         catch ( ContentNotFoundException e )
316         {
317             return false;
318         }
319     }
320
321     @Override
322     public boolean hasContent( VersionedReference reference )
323     {
324         try
325         {
326             Set<String> versions = getVersions( reference );
327             return CollectionUtils.isNotEmpty( versions );
328         }
329         catch ( ContentNotFoundException e )
330         {
331             return false;
332         }
333     }
334
335     @Override
336     public void setRepository( ManagedRepository repository )
337     {
338         this.repository = repository;
339     }
340
341     /**
342      * Convert a path to an artifact reference.
343      *
344      * @param path the path to convert. (relative or full location path)
345      * @throws org.apache.archiva.repository.layout.LayoutException if the path cannot be converted to an artifact reference.
346      */
347     @Override
348     public ArtifactReference toArtifactReference( String path )
349         throws LayoutException
350     {
351         if ( ( path != null ) && path.startsWith( repository.getLocation() ) )
352         {
353             return super.toArtifactReference( path.substring( repository.getLocation().length() ) );
354         }
355
356         return super.toArtifactReference( path );
357     }
358
359     @Override
360     public File toFile( ArchivaArtifact reference )
361     {
362         return new File( repository.getLocation(), toPath( reference ) );
363     }
364
365     @Override
366     public File toFile( ArtifactReference reference )
367     {
368         return new File( repository.getLocation(), toPath( reference ) );
369     }
370
371     @Override
372     public String toMetadataPath( ProjectReference reference )
373     {
374         // No metadata present in legacy repository.
375         return null;
376     }
377
378     @Override
379     public String toMetadataPath( VersionedReference reference )
380     {
381         // No metadata present in legacy repository.
382         return null;
383     }
384
385     private void getProjectVersions( File typeDir, ProjectReference reference, Set<String> foundVersions )
386     {
387         File repoFiles[] = typeDir.listFiles();
388         for ( File repoFile : repoFiles )
389         {
390             if ( repoFile.isDirectory() )
391             {
392                 // Skip it. it's a directory.
393                 continue;
394             }
395
396             String relativePath = PathUtil.getRelative( repository.getLocation(), repoFile );
397
398             if ( filetypes.matchesArtifactPattern( relativePath ) )
399             {
400                 try
401                 {
402                     ArtifactReference artifact = toArtifactReference( relativePath );
403                     if ( StringUtils.equals( artifact.getArtifactId(), reference.getArtifactId() ) )
404                     {
405                         foundVersions.add( artifact.getVersion() );
406                     }
407                 }
408                 catch ( LayoutException e )
409                 {
410                     /* don't fail the process if there is a bad artifact within the directory. */
411                 }
412             }
413         }
414     }
415
416     private void getRelatedArtifacts( File typeDir, ArtifactReference reference, Set<ArtifactReference> foundArtifacts )
417     {
418         File repoFiles[] = typeDir.listFiles();
419         for ( int i = 0; i < repoFiles.length; i++ )
420         {
421             if ( repoFiles[i].isDirectory() )
422             {
423                 // Skip it. it's a directory.
424                 continue;
425             }
426
427             String relativePath = PathUtil.getRelative( repository.getLocation(), repoFiles[i] );
428
429             if ( filetypes.matchesArtifactPattern( relativePath ) )
430             {
431                 try
432                 {
433                     ArtifactReference artifact = toArtifactReference( relativePath );
434                     if ( StringUtils.equals( artifact.getArtifactId(), reference.getArtifactId() )
435                         && artifact.getVersion().startsWith( reference.getVersion() ) )
436                     {
437                         foundArtifacts.add( artifact );
438                     }
439                 }
440                 catch ( LayoutException e )
441                 {
442                     /* don't fail the process if there is a bad artifact within the directory. */
443                 }
444             }
445         }
446     }
447
448     private void getVersionedVersions( File typeDir, VersionedReference reference, Set<String> foundVersions )
449     {
450         File repoFiles[] = typeDir.listFiles();
451         for ( int i = 0; i < repoFiles.length; i++ )
452         {
453             if ( repoFiles[i].isDirectory() )
454             {
455                 // Skip it. it's a directory.
456                 continue;
457             }
458
459             String relativePath = PathUtil.getRelative( repository.getLocation(), repoFiles[i] );
460
461             if ( filetypes.matchesArtifactPattern( relativePath ) )
462             {
463                 try
464                 {
465                     ArtifactReference artifact = toArtifactReference( relativePath );
466                     if ( StringUtils.equals( artifact.getArtifactId(), reference.getArtifactId() )
467                         && artifact.getVersion().startsWith( reference.getVersion() ) )
468                     {
469                         foundVersions.add( artifact.getVersion() );
470                     }
471                 }
472                 catch ( LayoutException e )
473                 {
474                     /* don't fail the process if there is a bad artifact within the directory. */
475                 }
476             }
477         }
478     }
479
480     public void setFileTypes( FileTypes fileTypes )
481     {
482         this.filetypes = fileTypes;
483     }
484
485     @Override
486     public void deleteArtifact( ArtifactReference artifactReference )
487         throws ContentNotFoundException
488     {
489         // TODO implements for legacy ??
490     }
491
492     @Override
493     public void deleteGroupId( String groupId )
494         throws ContentNotFoundException
495     {
496         // TODO implements for legacy ??
497     }
498 }