]> source.dussan.org Git - archiva.git/blob
9432c2939a7ab243a19afe82ff2170f7613483ea
[archiva.git] /
1 package org.apache.maven.archiva.repository.layout;
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.model.ArchivaArtifact;
24 import org.apache.maven.archiva.model.ArtifactReference;
25 import org.apache.maven.archiva.model.ProjectReference;
26 import org.apache.maven.archiva.repository.content.ArtifactExtensionMapping;
27 import org.apache.maven.archiva.repository.content.LegacyArtifactExtensionMapping;
28
29 import java.util.HashMap;
30 import java.util.Map;
31
32 /**
33  * LegacyBidirectionalRepositoryLayout - the layout mechanism for use by Maven 1.x repositories.
34  *
35  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
36  * @version $Id$
37  * 
38  * @plexus.component role-hint="legacy"
39  */
40 public class LegacyBidirectionalRepositoryLayout
41     implements BidirectionalRepositoryLayout
42 {
43     private static final String PATH_SEPARATOR = "/";
44
45     private ArtifactExtensionMapping extensionMapper = new LegacyArtifactExtensionMapping();
46
47     private Map typeToDirectoryMap;
48
49     public LegacyBidirectionalRepositoryLayout()
50     {
51         typeToDirectoryMap = new HashMap();
52         typeToDirectoryMap.put( "ejb-client", "ejb" );
53         typeToDirectoryMap.put( "distribution-tgz", "distribution" );
54         typeToDirectoryMap.put( "distribution-zip", "distribution" );
55     }
56
57     public String getId()
58     {
59         return "legacy";
60     }
61
62     public String toPath( ArchivaArtifact reference )
63     {
64         return toPath( reference.getGroupId(), reference.getArtifactId(), reference
65             .getVersion(), reference.getClassifier(), reference.getType() );
66     }
67
68     public String toPath( ProjectReference reference )
69     {
70         // TODO: Verify type
71         return toPath( reference.getGroupId(), reference.getArtifactId(), null, null, "metadata-xml" );
72     }
73
74     public String toPath( ArtifactReference artifact )
75     {
76         return toPath( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getClassifier(),
77                        artifact.getType() );
78     }
79
80     private String toPath( String groupId, String artifactId, String version, String classifier, String type )
81     {
82         StringBuffer path = new StringBuffer();
83
84         path.append( groupId ).append( PATH_SEPARATOR );
85         path.append( getDirectory( classifier, type ) ).append( PATH_SEPARATOR );
86
87         if ( version != null )
88         {
89             path.append( artifactId ).append( '-' ).append( version );
90
91             if ( StringUtils.isNotBlank( classifier ) )
92             {
93                 path.append( '-' ).append( classifier );
94             }
95
96             path.append( '.' ).append( extensionMapper.getExtension( type ) );
97         }
98
99         return path.toString();
100     }
101
102     private String getDirectory( String classifier, String type )
103     {
104         // Special Cases involving classifiers and type.
105         if ( "jar".equals( type ) && "sources".equals( classifier ) )
106         {
107             return "javadoc.jars";
108         }
109
110         // Special Cases involving only type.
111         String dirname = (String) typeToDirectoryMap.get( type );
112
113         if ( dirname != null )
114         {
115             return dirname + "s";
116         }
117
118         // Default process.
119         return type + "s";
120     }
121
122     public ArchivaArtifact toArtifact( String path )
123         throws LayoutException
124     {
125         String normalizedPath = StringUtils.replace( path, "\\", "/" );
126
127         String pathParts[] = StringUtils.split( normalizedPath, '/' );
128
129         /* Always 3 parts. (Never more or less)
130          * 
131          *   path = "commons-lang/jars/commons-lang-2.1.jar"
132          *   path[0] = "commons-lang";          // The Group ID
133          *   path[1] = "jars";                  // The Directory Type
134          *   path[2] = "commons-lang-2.1.jar";  // The Filename.
135          */
136
137         if ( pathParts.length != 3 )
138         {
139             // Illegal Path Parts Length.
140             throw new LayoutException( "Invalid number of parts to the path [" + path
141                 + "] to construct an ArchivaArtifact from. (Required to be 3 parts)" );
142         }
143
144         // The Group ID.
145         String groupId = pathParts[0];
146
147         // The Expected Type.
148         String expectedType = pathParts[1];
149
150         // The Filename.
151         String filename = pathParts[2];
152
153         FilenameParts fileParts = RepositoryLayoutUtils.splitFilename( filename, null );
154
155         String type = extensionMapper.getType( filename );
156
157         ArchivaArtifact artifact = new ArchivaArtifact( groupId, fileParts.artifactId, fileParts.version,
158                                                         fileParts.classifier, type );
159
160         // Sanity Checks.
161         if ( StringUtils.isEmpty( fileParts.extension ) )
162         {
163             throw new LayoutException( "Invalid artifact, no extension." );
164         }
165
166         if ( !expectedType.equals( fileParts.extension + "s" ) )
167         {
168             throw new LayoutException( "Invalid artifact, extension and layout specified type mismatch." );
169         }
170
171         return artifact;
172     }
173
174 }