]> source.dussan.org Git - archiva.git/blob
a2f0119171b425efdb9a8161398c96d72c5fceb6
[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.factory.ArtifactFactory;
21 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
22 import org.apache.maven.artifact.repository.metadata.GroupRepositoryMetadata;
23 import org.apache.maven.artifact.repository.metadata.Metadata;
24 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
25 import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
26 import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
27 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
28
29 import java.io.File;
30 import java.io.FileNotFoundException;
31 import java.io.IOException;
32 import java.io.InputStream;
33 import java.io.InputStreamReader;
34 import java.io.Reader;
35 import java.net.MalformedURLException;
36 import java.net.URL;
37 import java.util.ArrayList;
38 import java.util.Collections;
39 import java.util.Iterator;
40 import java.util.List;
41 import java.util.StringTokenizer;
42
43 /**
44  * This class gets all the paths that contain the metadata files.
45  *
46  * @plexus.component role="org.apache.maven.repository.discovery.MetadataDiscoverer" role-hint="org.apache.maven.repository.discovery.DefaultMetadataDiscoverer"
47  */
48 public class DefaultMetadataDiscoverer
49     extends AbstractArtifactDiscoverer
50     implements MetadataDiscoverer
51 {
52     /**
53      * @plexus.requirement
54      */
55     private ArtifactFactory artifactFactory;
56
57     /**
58      * Standard patterns to include in discovery of metadata files.
59      */
60     private static final String[] STANDARD_DISCOVERY_INCLUDES = {"**/*-metadata.xml", "**/*/*-metadata.xml",
61         "**/*/*/*-metadata.xml", "**/*-metadata-*.xml", "**/*/*-metadata-*.xml", "**/*/*/*-metadata-*.xml"};
62
63     /**
64      * Search the repository for metadata files.
65      *
66      * @param repositoryBase
67      * @param blacklistedPatterns
68      */
69     public List discoverMetadata( File repositoryBase, String blacklistedPatterns )
70     {
71         List metadataFiles = new ArrayList();
72         String[] metadataPaths =
73             scanForArtifactPaths( repositoryBase, blacklistedPatterns, STANDARD_DISCOVERY_INCLUDES, null );
74
75         for ( int i = 0; i < metadataPaths.length; i++ )
76         {
77             RepositoryMetadata metadata = buildMetadata( repositoryBase.getPath(), metadataPaths[i] );
78
79             if ( metadata != null )
80             {
81                 metadataFiles.add( metadata );
82             }
83             else
84             {
85                 addKickedOutPath( metadataPaths[i] );
86             }
87         }
88
89         return metadataFiles;
90     }
91
92     /**
93      * Create RepositoryMetadata object.
94      *
95      * @param repo         The path to the repository.
96      * @param metadataPath The path to the metadata file.
97      * @return the metadata
98      */
99     private RepositoryMetadata buildMetadata( String repo, String metadataPath )
100     {
101         RepositoryMetadata metadata = null;
102
103         try
104         {
105             URL url = new File( repo + "/" + metadataPath ).toURL();
106             InputStream is = url.openStream();
107             Reader reader = new InputStreamReader( is );
108             MetadataXpp3Reader metadataReader = new MetadataXpp3Reader();
109
110             Metadata m = metadataReader.read( reader );
111             String metaGroupId = m.getGroupId();
112             String metaArtifactId = m.getArtifactId();
113             String metaVersion = m.getVersion();
114
115             // check if the groupId, artifactId and version is in the
116             // metadataPath
117             // parse the path, in reverse order
118             List pathParts = new ArrayList();
119             StringTokenizer st = new StringTokenizer( metadataPath, "/\\" );
120             while ( st.hasMoreTokens() )
121             {
122                 pathParts.add( st.nextToken() );
123             }
124
125             Collections.reverse( pathParts );
126             // remove the metadata file
127             pathParts.remove( 0 );
128             Iterator it = pathParts.iterator();
129             String tmpDir = (String) it.next();
130
131             //ArtifactHandler handler = new DefaultArtifactHandler( "jar" );
132             //if( metaVersion != null && !metaVersion.equals( "" ) )
133             //{
134             //   VersionRange version = VersionRange.createFromVersion( metaVersion );
135             //}
136
137             Artifact artifact = null;
138             if ( metaVersion != null && !metaVersion.equals( "" ) )
139             {
140                 artifact = artifactFactory.createBuildArtifact( metaGroupId, metaArtifactId, metaVersion, "jar" );
141             }
142
143             // snapshotMetadata
144             if ( tmpDir != null && tmpDir.equals( metaVersion ) )
145             {
146                 if ( artifact != null )
147                 {
148                     metadata = new SnapshotArtifactRepositoryMetadata( artifact );
149                 }
150             }
151             else if ( tmpDir != null && tmpDir.equals( metaArtifactId ) )
152             {
153                 // artifactMetadata
154                 if ( artifact != null )
155                 {
156                     metadata = new ArtifactRepositoryMetadata( artifact );
157                 }
158             }
159             else
160             {
161
162                 String groupDir = "";
163                 int ctr = 0;
164                 for ( it = pathParts.iterator(); it.hasNext(); )
165                 {
166                     String path = (String) it.next();
167                     if ( ctr == 0 )
168                     {
169                         groupDir = path;
170                     }
171                     else
172                     {
173                         groupDir = path + "." + groupDir;
174                     }
175                     ctr++;
176                 }
177
178                 // groupMetadata
179                 if ( metaGroupId != null && metaGroupId.equals( groupDir ) )
180                 {
181                     metadata = new GroupRepositoryMetadata( metaGroupId );
182                 }
183             }
184
185         }
186         catch ( FileNotFoundException fe )
187         {
188             // TODO: log ignored metadata
189         }
190         catch ( XmlPullParserException xe )
191         {
192             // TODO: log ignored metadata
193         }
194         catch ( MalformedURLException e )
195         {
196             // TODO: log ignored metadata
197         }
198         catch ( IOException ie )
199         {
200             // TODO: log ignored metadata
201         }
202
203         return metadata;
204     }
205 }