Author: gnodet
Date: Tue Mar 3 10:40:05 2015
New Revision: 1663615
URL: http://svn.apache.org/r1663615
Log:
[FELIX-4820] Optimize version range parsing a bit
Modified:
felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionCleaner.java
felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionRange.java
Modified:
felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionCleaner.java
URL:
http://svn.apache.org/viewvc/felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionCleaner.java?rev=1663615&r1=1663614&r2=1663615&view=diff
==============================================================================
---
felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionCleaner.java
(original)
+++
felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionCleaner.java
Tue Mar 3 10:40:05 2015
@@ -42,6 +42,11 @@ public final class VersionCleaner {
{
return "0.0.0";
}
+ String clean = fastSyntax(version);
+ if (clean != null)
+ {
+ return clean;
+ }
StringBuffer result = new StringBuffer();
Matcher m = FUZZY_VERSION.matcher(version);
if (m.matches())
@@ -108,4 +113,45 @@ public final class VersionCleaner {
}
}
+ private static String fastSyntax(String version) {
+ int state = 0;
+ for (int i = 0, l = version.length(); i < l; i++) {
+ char ch = version.charAt(i);
+ switch (state) {
+ case 0:
+ case 2:
+ case 4:
+ if (ch < '0' || ch > '9') {
+ return null;
+ }
+ state++;
+ break;
+ case 1:
+ case 3:
+ case 5:
+ if (ch == '.') {
+ state++;
+ } else if (ch < '0' || ch > '9') {
+ return null;
+ }
+ break;
+ case 6:
+ if (ch == '.') {
+ return null;
+ }
+ break;
+ }
+ }
+ switch (state) {
+ case 0:
+ case 1:
+ return version + ".0.0";
+ case 2:
+ case 3:
+ return version + ".0";
+ default:
+ return version;
+ }
+ }
+
}
Modified:
felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionRange.java
URL:
http://svn.apache.org/viewvc/felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionRange.java?rev=1663615&r1=1663614&r2=1663615&view=diff
==============================================================================
---
felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionRange.java
(original)
+++
felix/trunk/utils/src/main/java/org/apache/felix/utils/version/VersionRange.java
Tue Mar 3 10:40:05 2015
@@ -101,8 +101,7 @@ public class VersionRange implements Ser
public VersionRange( String val, boolean exact, boolean clean ) throws
IllegalArgumentException, NumberFormatException
{
- val = val.replaceAll( "\\s", "" );
- val = val.replaceAll( "\"", "" );
+ val = removeQuotesAndWhitespaces(val);
int fst = val.charAt( 0 );
if ( fst == '[' )
{
@@ -136,17 +135,53 @@ public class VersionRange implements Ser
+ ": range must end in ')' or ']'" );
}
- String inner = val.substring( 1, val.length() - 1 );
- String[] floorCeiling = inner.split( "," );
- if ( floorCeiling.length != 2 )
+ int comma = val.indexOf( ',' );
+ if ( comma < 0 )
+ {
+ throw new IllegalArgumentException( "illegal version range syntax
" + "no comma" );
+ }
+ if ( val.indexOf( ',', comma + 1 ) > 0 )
{
throw new IllegalArgumentException( "illegal version range syntax
" + "too many commas" );
}
- floor = VersionTable.getVersion( floorCeiling[0], clean );
- ceiling = "*".equals( floorCeiling[1] ) ? INFINITE_VERSION :
VersionTable.getVersion( floorCeiling[1], clean );
+ String strFloor = val.substring( 1, comma );
+ String strCeil = val.substring( comma + 1, val.length() - 1 );
+ floor = VersionTable.getVersion( strFloor, clean );
+ ceiling = "*".equals( strCeil ) ? INFINITE_VERSION :
VersionTable.getVersion( strCeil, clean );
checkRange();
}
+ private String removeQuotesAndWhitespaces(String val) {
+ for (int i = 0, l = val.length(); i < l; i++) {
+ char ch = val.charAt(i);
+ if (isRemoveable(ch)) {
+ StringBuilder sb = new StringBuilder(l);
+ sb.append(val, 0, i);
+ for (i++; i < l; i++) {
+ ch = val.charAt(i);
+ if (!isRemoveable(ch)) {
+ sb.append(ch);
+ }
+ }
+ return sb.toString();
+ }
+ }
+ return val;
+ }
+
+ private static boolean[] removeable;
+ static {
+ removeable = new boolean[256];
+ for (int i = 0; i < 256; i++) {
+ removeable[i] = Character.isWhitespace(i);
+ }
+ removeable['"'] = true;
+ }
+
+ private boolean isRemoveable(char ch) {
+ return ch < 256 ? removeable[ch] : Character.isWhitespace(ch);
+ }
+
public static VersionRange parseVersionRange( String val ) throws
IllegalArgumentException, NumberFormatException
{
if ( val == null || val.trim().length() == 0 )