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