]> source.dussan.org Git - archiva.git/blob
17371652331d377d25085e48b13e3546f5f1a29e
[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.maven.archiva.common.utils.VersionUtil;
23
24 import java.util.regex.Matcher;
25 import java.util.regex.Pattern;
26
27 /**
28  * Generic Filename Parser for use with layout routines.
29  *
30  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
31  * @version $Id$
32  */
33 public class FilenameParser
34 {
35     private String name;
36
37     private String extension;
38
39     private int offset;
40
41     private static final Pattern mavenPluginPattern = Pattern.compile( "(maven-.*-plugin)|(.*-maven-plugin)" );
42
43     private static final Pattern extensionPattern = Pattern.compile( "(.tar.gz$)|(.tar.bz2$)|(.[a-z0-9]*$)",
44                                                                      Pattern.CASE_INSENSITIVE );
45
46     private static final Pattern section = Pattern.compile( "([^-]*)" );
47
48     private Matcher matcher;
49
50     protected FilenameParser( String filename )
51     {
52         this.name = filename;
53
54         Matcher mat = extensionPattern.matcher( name );
55         if ( mat.find() )
56         {
57             extension = filename.substring( mat.start() + 1 );
58             name = name.substring( 0, name.length() - extension.length() - 1 );
59         }
60
61         matcher = section.matcher( name );
62
63         reset();
64     }
65
66     protected void reset()
67     {
68         offset = 0;
69     }
70
71     protected String next()
72     {
73         // Past the end of the string.
74         if ( offset > name.length() )
75         {
76             return null;
77         }
78
79         // Return the next section.
80         if ( matcher.find( offset ) )
81         {
82             // Return found section.
83             offset = matcher.end() + 1;
84             return matcher.group();
85         }
86
87         // Nothing to return.
88         return null;
89     }
90
91     protected String expect( String expected )
92     {
93         if ( name.startsWith( expected, offset ) )
94         {
95             // Potential hit. check for '.' or '-' at end of expected.
96             int seperatorOffset = offset + expected.length();
97
98             // Test for "out of bounds" first. 
99             if ( seperatorOffset >= name.length() )
100             {
101                 offset = name.length();
102                 return expected;
103             }
104
105             // Test for seperator char.
106             char seperatorChar = name.charAt( seperatorOffset );
107             if ( ( seperatorChar == '-' ) || ( seperatorChar == '.' ) )
108             {
109                 offset = seperatorOffset + 1;
110                 return expected;
111             }
112         }
113
114         return null;
115     }
116     
117     /**
118      * Get the current seperator character.
119      * 
120      * @return the seperator character (either '.' or '-'), or 0 if no seperator character available.
121      */
122     protected char seperator()
123     {
124         // Past the end of the string?
125         if ( offset >= name.length() )
126         {
127             return 0;
128         }
129
130         // Before the start of the string?
131         if ( offset <= 0 )
132         {
133             return 0;
134         }
135
136         return name.charAt( offset - 1 );
137     }
138
139     protected String getName()
140     {
141         return name;
142     }
143
144     protected String getExtension()
145     {
146         return extension;
147     }
148
149     protected String remaining()
150     {
151         if ( offset >= name.length() )
152         {
153             return null;
154         }
155
156         String end = name.substring( offset );
157         offset = name.length();
158         return end;
159     }
160
161     protected String nextNonVersion()
162     {
163         boolean done = false;
164
165         StringBuffer ver = new StringBuffer();
166
167         // Any text upto the end of a special case is considered non-version. 
168         Matcher specialMat = mavenPluginPattern.matcher( name );
169         if ( specialMat.find() )
170         {
171             ver.append( name.substring( offset, specialMat.end() ) );
172             offset = specialMat.end() + 1;
173         }
174
175         while ( !done )
176         {
177             int initialOffset = offset;
178             String section = next();
179             if ( section == null )
180             {
181                 done = true;
182             }
183             else if ( !VersionUtil.isVersion( section ) )
184             {
185                 if ( ver.length() > 0 )
186                 {
187                     ver.append( '-' );
188                 }
189                 ver.append( section );
190             }
191             else
192             {
193                 offset = initialOffset;
194                 done = true;
195             }
196         }
197
198         return ver.toString();
199     }
200
201     protected String nextVersion()
202     {
203         boolean done = false;
204
205         StringBuffer ver = new StringBuffer();
206
207         while ( !done )
208         {
209             int initialOffset = offset;
210             String section = next();
211             if ( section == null )
212             {
213                 done = true;
214             }
215             else if ( VersionUtil.isVersion( section ) )
216             {
217                 if ( ver.length() > 0 )
218                 {
219                     ver.append( '-' );
220                 }
221                 ver.append( section );
222             }
223             else
224             {
225                 offset = initialOffset;
226                 done = true;
227             }
228         }
229
230         return ver.toString();
231     }
232
233     
234 }