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