]> source.dussan.org Git - archiva.git/blob
92a8609b331b3979b3f840d3550e2bea205e684d
[archiva.git] /
1 package org.apache.maven.archiva.repository.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  *
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.ArtifactReference;
24 import org.apache.maven.archiva.repository.layout.LayoutException;
25
26 /**
27  * LegacyPathParser is a parser for maven 1 (legacy layout) paths to ArtifactReference. 
28  *
29  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
30  * @version $Id$
31  */
32 public class LegacyPathParser
33 {
34     private static final String INVALID_ARTIFACT_PATH = "Invalid path to Artifact: ";
35
36     protected static ArtifactReference toArtifactReference( String path )
37         throws LayoutException
38     {
39         ArtifactReference artifact = new ArtifactReference();
40
41         String normalizedPath = StringUtils.replace( path, "\\", "/" );
42
43         String pathParts[] = StringUtils.split( normalizedPath, '/' );
44
45         /* Always 3 parts. (Never more or less)
46          * 
47          *   path = "commons-lang/jars/commons-lang-2.1.jar"
48          *   path[0] = "commons-lang";          // The Group ID
49          *   path[1] = "jars";                  // The Directory Type
50          *   path[2] = "commons-lang-2.1.jar";  // The Filename.
51          */
52
53         if ( pathParts.length != 3 )
54         {
55             // Illegal Path Parts Length.
56             throw new LayoutException( INVALID_ARTIFACT_PATH
57                 + "legacy paths should only have 3 parts [groupId]/[type]s/[artifactId]-[version].[type], found "
58                 + pathParts.length + " instead." );
59         }
60
61         // The Group ID.
62         artifact.setGroupId( pathParts[0] );
63
64         // The Expected Type.
65         String expectedType = pathParts[1];
66
67         // Sanity Check: expectedType should end in "s".
68         if ( !expectedType.endsWith( "s" ) )
69         {
70             throw new LayoutException( INVALID_ARTIFACT_PATH
71                 + "legacy paths should have an expected type ending in [s] in the second part of the path." );
72         }
73
74         // The Filename.
75         String filename = pathParts[2];
76
77         FilenameParser parser = new FilenameParser( filename );
78
79         artifact.setArtifactId( parser.nextNonVersion() );
80
81         // Sanity Check: does it have an artifact id?
82         if ( StringUtils.isEmpty( artifact.getArtifactId() ) )
83         {
84             // Special Case: The filename might start with a version id (like "test-arch-1.0.jar").
85             int idx = filename.indexOf( '-' );
86             if ( idx > 0 )
87             {
88                 parser.reset();
89                 // Take the first section regardless of content.
90                 String artifactId = parser.next();
91                 
92                 // Is there anything more that is considered not a version id?
93                 String moreArtifactId = parser.nextNonVersion();
94                 if ( StringUtils.isNotBlank( moreArtifactId ) )
95                 {
96                     artifact.setArtifactId( artifactId + "-" + moreArtifactId );
97                 }
98                 else
99                 {
100                     artifact.setArtifactId( artifactId );
101                 }
102             }
103
104             // Sanity Check: still no artifact id?
105             if ( StringUtils.isEmpty( artifact.getArtifactId() ) )
106             {
107                 throw new LayoutException( INVALID_ARTIFACT_PATH + "no artifact id present." );
108             }
109         }
110
111         artifact.setVersion( parser.remaining() );
112
113         // Sanity Check: does it have a version?
114         if ( StringUtils.isEmpty( artifact.getVersion() ) )
115         {
116             // Special Case: use last section of artifactId as version.
117             String artifactId = artifact.getArtifactId();
118             int idx = artifactId.lastIndexOf( '-' );
119             if ( idx > 0 )
120             {
121                 artifact.setVersion( artifactId.substring( idx + 1 ) );
122                 artifact.setArtifactId( artifactId.substring( 0, idx ) );
123             }
124             else
125             {
126                 throw new LayoutException( INVALID_ARTIFACT_PATH + "no version found." );
127             }
128         }
129
130         artifact.setType( ArtifactExtensionMapping.guessTypeFromFilename( filename ) );
131
132         // Sanity Check: does it have an extension?
133         if ( StringUtils.isEmpty( artifact.getType() ) )
134         {
135             throw new LayoutException( INVALID_ARTIFACT_PATH + "no extension found." );
136         }
137
138         String trimPathType = expectedType.substring( 0, expectedType.length() - 1 );
139
140         // Sanity Check: does extension match pathType on path?
141         String expectedExtension = ArtifactExtensionMapping.getExtension( trimPathType );
142         String actualExtension = parser.getExtension();
143
144         if ( !expectedExtension.equals( actualExtension ) )
145         {
146             throw new LayoutException( INVALID_ARTIFACT_PATH + "mismatch on extension [" + actualExtension
147                 + "] and layout specified type [" + expectedType + "] (which maps to extension: [" + expectedExtension
148                 + "]) on path [" + path + "]" );
149         }
150
151         return artifact;
152     }
153 }