]> source.dussan.org Git - archiva.git/blob
a575f156a210725242b95e40162499c19381dabc
[archiva.git] /
1 package org.apache.maven.archiva.consumers;
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.commons.lang.StringUtils;
23 import org.apache.maven.archiva.common.utils.BaseFile;
24 import org.apache.maven.artifact.Artifact;
25 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
26 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
27 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
28 import org.apache.maven.artifact.repository.metadata.GroupRepositoryMetadata;
29 import org.apache.maven.artifact.repository.metadata.Metadata;
30 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
31 import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
32 import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
33 import org.codehaus.plexus.util.IOUtil;
34 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
35
36 import java.io.FileReader;
37 import java.io.IOException;
38 import java.io.Reader;
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  * GenericRepositoryMetadataConsumer - Consume any maven-metadata.xml files as {@link RepositoryMetadata} objects. 
47  *
48  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
49  * @version $Id$
50  */
51 public abstract class GenericRepositoryMetadataConsumer
52     extends AbstractConsumer
53     implements Consumer
54 {
55     public abstract void processRepositoryMetadata( RepositoryMetadata metadata, BaseFile file );
56
57     private static final List includePatterns;
58
59     static
60     {
61         includePatterns = new ArrayList();
62         includePatterns.add( "**/maven-metadata.xml" );
63     }
64
65     public List getIncludePatterns()
66     {
67         return includePatterns;
68     }
69
70     public boolean isEnabled()
71     {
72         // the RepositoryMetadata objects only exist in 'default' layout repositories.
73         ArtifactRepositoryLayout layout = repository.getLayout();
74         return ( layout instanceof DefaultRepositoryLayout );
75     }
76
77     public void processFile( BaseFile file )
78         throws ConsumerException
79     {
80         if ( file.length() <= 0 )
81         {
82             throw new ConsumerException( file, "File is empty." );
83         }
84
85         if ( !file.canRead() )
86         {
87             throw new ConsumerException( file, "Not allowed to read file due to permission settings on file." );
88         }
89
90         RepositoryMetadata metadata = buildMetadata( file );
91         processRepositoryMetadata( metadata, file );
92     }
93
94     private RepositoryMetadata buildMetadata( BaseFile metadataFile )
95         throws ConsumerException
96     {
97         Metadata m;
98         Reader reader = null;
99         try
100         {
101             reader = new FileReader( metadataFile );
102             MetadataXpp3Reader metadataReader = new MetadataXpp3Reader();
103
104             m = metadataReader.read( reader );
105         }
106         catch ( XmlPullParserException e )
107         {
108             throw new ConsumerException( metadataFile, "Error parsing metadata file: " + e.getMessage(), e );
109         }
110         catch ( IOException e )
111         {
112             throw new ConsumerException( metadataFile, "Error reading metadata file: " + e.getMessage(), e );
113         }
114         finally
115         {
116             IOUtil.close( reader );
117         }
118
119         RepositoryMetadata repositoryMetadata = buildMetadata( m, metadataFile );
120
121         if ( repositoryMetadata == null )
122         {
123             throw new ConsumerException( metadataFile, "Unable to build a repository metadata from path." );
124         }
125
126         return repositoryMetadata;
127     }
128
129     /**
130      * Builds a RepositoryMetadata object from a Metadata object and its path.
131      *
132      * @param m            Metadata
133      * @param metadataFile file information
134      * @return RepositoryMetadata if the parameters represent one; null if not
135      * @throws ConsumerException 
136      */
137     private RepositoryMetadata buildMetadata( Metadata m, BaseFile metadataFile )
138         throws ConsumerException
139     {
140         if ( artifactFactory == null )
141         {
142             throw new IllegalStateException( "Unable to build metadata with a null artifactFactory." );
143         }
144
145         String metaGroupId = m.getGroupId();
146         String metaArtifactId = m.getArtifactId();
147         String metaVersion = m.getVersion();
148
149         // check if the groupId, artifactId and version is in the
150         // metadataPath
151         // parse the path, in reverse order
152         List pathParts = new ArrayList();
153         StringTokenizer st = new StringTokenizer( metadataFile.getRelativePath(), "/\\" );
154         while ( st.hasMoreTokens() )
155         {
156             pathParts.add( st.nextToken() );
157         }
158
159         Collections.reverse( pathParts );
160         // remove the metadata file
161         pathParts.remove( 0 );
162         Iterator it = pathParts.iterator();
163         String tmpDir = (String) it.next();
164
165         Artifact artifact = null;
166         if ( StringUtils.isNotEmpty( metaVersion ) )
167         {
168             artifact = artifactFactory.createProjectArtifact( metaGroupId, metaArtifactId, metaVersion );
169         }
170
171         // snapshotMetadata
172         RepositoryMetadata metadata = null;
173         if ( tmpDir != null && tmpDir.equals( metaVersion ) )
174         {
175             if ( artifact != null )
176             {
177                 metadata = new SnapshotArtifactRepositoryMetadata( artifact );
178             }
179         }
180         else if ( tmpDir != null && tmpDir.equals( metaArtifactId ) )
181         {
182             // artifactMetadata
183             if ( artifact != null )
184             {
185                 metadata = new ArtifactRepositoryMetadata( artifact );
186             }
187             else
188             {
189                 artifact = artifactFactory.createProjectArtifact( metaGroupId, metaArtifactId, "1.0" );
190                 metadata = new ArtifactRepositoryMetadata( artifact );
191             }
192         }
193         else
194         {
195             String groupDir = "";
196             int ctr = 0;
197             for ( it = pathParts.iterator(); it.hasNext(); )
198             {
199                 String path = (String) it.next();
200                 if ( ctr == 0 )
201                 {
202                     groupDir = path;
203                 }
204                 else
205                 {
206                     groupDir = path + "." + groupDir;
207                 }
208                 ctr++;
209             }
210
211             // groupMetadata
212             if ( metaGroupId != null && metaGroupId.equals( groupDir ) )
213             {
214                 metadata = new GroupRepositoryMetadata( metaGroupId );
215             }
216             else
217             {
218                 /* If we reached this point, we have some bad metadata.
219                  * We have a metadata file, with values for groupId / artifactId / version.
220                  * But the information it is providing does not exist relative to the file location.
221                  * 
222                  * See ${basedir}/src/test/repository/javax/maven-metadata.xml for example
223                  */
224                 throw new ConsumerException( metadataFile,
225                                              "Contents of metadata are not appropriate for its location on disk." );
226             }
227         }
228
229         return metadata;
230     }
231 }