]> source.dussan.org Git - archiva.git/blob
2f2b2f7494cf448576dc08bb0911df7c98985726
[archiva.git] /
1 package org.apache.archiva.repository.maven.content;
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  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  */
20
21 import org.apache.archiva.common.utils.VersionUtil;
22 import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
23 import org.apache.archiva.repository.maven.metadata.storage.ArtifactMappingProvider;
24 import org.apache.archiva.repository.maven.metadata.storage.Maven2RepositoryPathTranslator;
25 import org.apache.archiva.model.ArchivaArtifact;
26 import org.apache.archiva.model.ArtifactReference;
27 import org.apache.archiva.model.ProjectReference;
28 import org.apache.archiva.model.VersionedReference;
29 import org.apache.archiva.repository.LayoutException;
30 import org.apache.archiva.repository.RepositoryContent;
31 import org.apache.archiva.repository.content.ItemSelector;
32 import org.apache.archiva.repository.content.PathParser;
33 import org.apache.commons.lang3.StringUtils;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 import java.util.List;
38
39 /**
40  * AbstractDefaultRepositoryContent - common methods for working with default (maven 2) layout.
41  */
42 public abstract class AbstractDefaultRepositoryContent implements RepositoryContent
43 {
44
45
46     protected Logger log = LoggerFactory.getLogger( getClass() );
47
48     public static final String MAVEN_METADATA = "maven-metadata.xml";
49
50     protected static final char PATH_SEPARATOR = '/';
51
52     protected static final char GROUP_SEPARATOR = '.';
53
54     protected static final char ARTIFACT_SEPARATOR = '-';
55
56     private RepositoryPathTranslator pathTranslator = new Maven2RepositoryPathTranslator();
57
58     private PathParser defaultPathParser = new DefaultPathParser();
59
60
61     PathParser getPathParser() {
62         return defaultPathParser;
63     }
64
65
66
67     /**
68      *
69      */
70     protected List<? extends ArtifactMappingProvider> artifactMappingProviders;
71
72     AbstractDefaultRepositoryContent(List<? extends ArtifactMappingProvider> artifactMappingProviders) {
73         this.artifactMappingProviders = artifactMappingProviders;
74     }
75
76     public void setArtifactMappingProviders(List<? extends ArtifactMappingProvider> artifactMappingProviders) {
77         this.artifactMappingProviders = artifactMappingProviders;
78     }
79
80     @Override
81     public ItemSelector toItemSelector( String path ) throws LayoutException
82     {
83         return defaultPathParser.toItemSelector( path );
84     }
85
86     public String toPath ( ProjectReference reference) {
87         final StringBuilder path = new StringBuilder();
88         path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
89         path.append( reference.getArtifactId( ) );
90         return path.toString( );
91     }
92
93     @Override
94     public String toPath ( ItemSelector selector ) {
95         if (selector==null) {
96             throw new IllegalArgumentException( "ItemSelector must not be null." );
97         }
98         String projectId;
99         // Initialize the project id if not set
100         if (selector.hasProjectId()) {
101             projectId = selector.getProjectId( );
102         } else if (selector.hasArtifactId()) {
103             // projectId same as artifact id, if set
104             projectId = selector.getArtifactId( );
105         } else {
106             // we arrive here, if projectId && artifactId not set
107             return pathTranslator.toPath( selector.getNamespace(), "");
108         }
109         if ( !selector.hasArtifactId( )) {
110             return pathTranslator.toPath( selector.getNamespace( ), projectId );
111         }
112         // this part only, if projectId && artifactId is set
113         String artifactVersion = "";
114         String version = "";
115         if (selector.hasVersion() && selector.hasArtifactVersion() ) {
116             artifactVersion = selector.getArtifactVersion();
117             version = VersionUtil.getBaseVersion( selector.getVersion( ) );
118         } else if (!selector.hasVersion() && selector.hasArtifactVersion()) {
119             // we try to retrieve the base version, if artifact version is only set
120             version = VersionUtil.getBaseVersion( selector.getArtifactVersion( ) );
121             artifactVersion = selector.getArtifactVersion( );
122         } else if (selector.hasVersion() && !selector.hasArtifactVersion()) {
123             artifactVersion = selector.getVersion();
124             version = VersionUtil.getBaseVersion( selector.getVersion( ) );
125         }
126
127         return pathTranslator.toPath( selector.getNamespace(), projectId, version,
128                 constructId( selector.getArtifactId(), artifactVersion, selector.getClassifier(), selector.getType() ) );
129
130     }
131
132
133     public String toMetadataPath( ProjectReference reference )
134     {
135         final StringBuilder path = new StringBuilder();
136         path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
137         path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );
138         path.append( MAVEN_METADATA );
139         return path.toString();
140     }
141
142     public String toPath( String namespace )
143     {
144         return formatAsDirectory( namespace );
145     }
146
147     public String toPath( VersionedReference reference )
148     {
149         final StringBuilder path = new StringBuilder();
150         path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
151         path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );
152         if ( reference.getVersion() != null )
153         {
154             // add the version only if it is present
155             path.append( VersionUtil.getBaseVersion( reference.getVersion() ) );
156         }
157         return path.toString();
158     }
159
160     public String toMetadataPath( VersionedReference reference )
161     {
162         StringBuilder path = new StringBuilder();
163
164         path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
165         path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );
166         if ( reference.getVersion() != null )
167         {
168             // add the version only if it is present
169             path.append( VersionUtil.getBaseVersion( reference.getVersion() ) ).append( PATH_SEPARATOR );
170         }
171         path.append( MAVEN_METADATA );
172
173         return path.toString();
174     }
175
176     public String toPath( ArchivaArtifact reference )
177     {
178         if ( reference == null )
179         {
180             throw new IllegalArgumentException( "ArchivaArtifact cannot be null" );
181         }
182
183         String baseVersion = VersionUtil.getBaseVersion( reference.getVersion() );
184         return toPath( reference.getGroupId(), reference.getArtifactId(), baseVersion, reference.getVersion(),
185                        reference.getClassifier(), reference.getType() );
186     }
187
188     @Override
189     public String toPath( ArtifactReference reference )
190     {
191         if ( reference == null )
192         {
193             throw new IllegalArgumentException( "Artifact reference cannot be null" );
194         }
195         if ( reference.getVersion() != null )
196         {
197             String baseVersion = VersionUtil.getBaseVersion( reference.getVersion() );
198             return toPath( reference.getGroupId(), reference.getArtifactId(), baseVersion, reference.getVersion(),
199                            reference.getClassifier(), reference.getType() );
200         }
201         return toPath( reference.getGroupId(), reference.getArtifactId(), null, null,
202                        reference.getClassifier(), reference.getType() );
203     }
204
205
206
207     protected String formatAsDirectory( String directory )
208     {
209         return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR );
210     }
211
212     private String toPath( String groupId, String artifactId, String baseVersion, String version, String classifier,
213                            String type )
214     {
215         if ( baseVersion != null )
216         {
217             return pathTranslator.toPath( groupId, artifactId, baseVersion,
218                                           constructId( artifactId, version, classifier, type ) );
219         }
220         else
221         {
222             return pathTranslator.toPath( groupId, artifactId );
223         }
224     }
225
226     // TODO: move into the Maven Artifact facet when refactoring away the caller - the caller will need to have access
227     //       to the facet or filename (for the original ID)
228     private String constructId( String artifactId, String version, String classifier, String type )
229     {
230         String ext = null;
231         for ( ArtifactMappingProvider provider : artifactMappingProviders )
232         {
233             ext = provider.mapTypeToExtension( type );
234             if ( ext != null )
235             {
236                 break;
237             }
238         }
239         if ( ext == null )
240         {
241             ext = type;
242         }
243
244         StringBuilder id = new StringBuilder();
245         if ( ( version != null ) && ( type != null ) )
246         {
247             id.append( artifactId ).append( ARTIFACT_SEPARATOR ).append( version );
248
249             if ( StringUtils.isNotBlank( classifier ) )
250             {
251                 id.append( ARTIFACT_SEPARATOR ).append( classifier );
252             }
253
254             id.append( "." ).append( ext );
255         }
256         return id.toString();
257     }
258 }