]> source.dussan.org Git - archiva.git/blob
167737f63b1c47ee6e24bb77e77432fcd9f5572c
[archiva.git] /
1 package org.apache.maven.repository.discovery;
2
3 /*
4  * Copyright 2005-2006 The Apache Software Foundation.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 import org.apache.maven.artifact.Artifact;
20 import org.apache.maven.artifact.repository.ArtifactRepository;
21 import org.apache.maven.model.Model;
22 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
23 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
24
25 import java.io.File;
26 import java.io.FileNotFoundException;
27 import java.io.FileReader;
28 import java.io.IOException;
29 import java.util.ArrayList;
30 import java.util.List;
31
32 /**
33  * Base class for artifact discoverers.
34  *
35  * @author John Casey
36  * @author Brett Porter
37  */
38 public abstract class AbstractArtifactDiscoverer
39     extends AbstractDiscoverer
40 {
41     /**
42      * Standard patterns to exclude from discovery as they are not artifacts.
43      */
44     private static final String[] STANDARD_DISCOVERY_EXCLUDES = {"bin/**", "reports/**", ".maven/**", "**/*.md5",
45         "**/*.MD5", "**/*.sha1", "**/*.SHA1", "**/*snapshot-version", "*/website/**", "*/licenses/**", "*/licences/**",
46         "**/.htaccess", "**/*.html", "**/*.asc", "**/*.txt", "**/*.xml", "**/README*", "**/CHANGELOG*", "**/KEYS*"};
47
48     private static final String POM = ".pom";
49
50     /**
51      * Scan the repository for artifact paths.
52      */
53     private String[] scanForArtifactPaths( File repositoryBase, String blacklistedPatterns )
54     {
55         return scanForArtifactPaths( repositoryBase, blacklistedPatterns, null, STANDARD_DISCOVERY_EXCLUDES );
56     }
57
58     protected abstract Artifact buildArtifactFromPath( String path, ArtifactRepository repository );
59
60     public List discoverArtifacts( ArtifactRepository repository, String blacklistedPatterns, boolean includeSnapshots )
61     {
62         if ( !"file".equals( repository.getProtocol() ) )
63         {
64             throw new UnsupportedOperationException( "Only filesystem repositories are supported" );
65         }
66
67         File repositoryBase = new File( repository.getBasedir() );
68
69         List artifacts = new ArrayList();
70
71         String[] artifactPaths = scanForArtifactPaths( repositoryBase, blacklistedPatterns );
72
73         for ( int i = 0; i < artifactPaths.length; i++ )
74         {
75             String path = artifactPaths[i];
76
77             Artifact artifact = buildArtifactFromPath( path, repository );
78             if ( artifact != null )
79             {
80                 if ( includeSnapshots || !artifact.isSnapshot() )
81                 {
82                     artifacts.add( artifact );
83                 }
84             }
85             else
86             {
87                 addKickedOutPath( path );
88             }
89         }
90
91         return artifacts;
92     }
93
94     public List discoverStandalonePoms( ArtifactRepository repository, String blacklistedPatterns,
95                                         boolean includeSnapshots )
96     {
97         List artifacts = new ArrayList();
98
99         File repositoryBase = new File( repository.getBasedir() );
100
101         String[] artifactPaths = scanForArtifactPaths( repositoryBase, blacklistedPatterns );
102
103         for ( int i = 0; i < artifactPaths.length; i++ )
104         {
105             String path = artifactPaths[i];
106
107             if ( path.toLowerCase().endsWith( POM ) )
108             {
109                 Artifact pomArtifact = buildArtifactFromPath( path, repository );
110                 if ( pomArtifact != null )
111                 {
112                     pomArtifact.setFile( new File( repositoryBase, path ) );
113                 }
114
115                 MavenXpp3Reader mavenReader = new MavenXpp3Reader();
116                 String filename = repositoryBase.getAbsolutePath() + "/" + path;
117                 try
118                 {
119                     Model model = mavenReader.read( new FileReader( filename ) );
120                     if ( pomArtifact != null && "pom".equals( model.getPackaging() ) )
121                     {
122                         if ( includeSnapshots || !pomArtifact.isSnapshot() )
123                         {
124                             artifacts.add( model );
125                         }
126                     }
127                 }
128                 catch ( FileNotFoundException e )
129                 {
130                     // this should never happen
131                     getLogger().error( "Error finding file during POM discovery: " + filename, e );
132                 }
133                 catch ( IOException e )
134                 {
135                     getLogger().error( "Error reading file during POM discovery: " + filename + ": " + e );
136                 }
137                 catch ( XmlPullParserException e )
138                 {
139                     getLogger().error(
140                         "Parse error reading file during POM discovery: " + filename + ": " + e.getMessage() );
141                 }
142             }
143         }
144
145         return artifacts;
146     }
147 }