This is an automated email from the ASF dual-hosted git repository. hboutemy pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven.git
commit 44ad1aafa608697df95225630f5a9cbc50667c79 Author: Stefan Oehme <[email protected]> AuthorDate: Tue Apr 9 15:49:56 2019 +0200 [MNG-6631] - Make DefaultArtifactVersion faster Use if-statements instead of exception-based control flow. Throwing exceptions is very expensive and should not be used for normal flow. --- .../versioning/DefaultArtifactVersion.java | 88 +++++++++++++--------- 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java b/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java index 81a52b8..0739098 100644 --- a/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java +++ b/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java @@ -20,8 +20,8 @@ package org.apache.maven.artifact.versioning; */ import java.util.StringTokenizer; -import java.util.regex.Pattern; -import java.util.NoSuchElementException; + +import static org.apache.commons.lang3.math.NumberUtils.isDigits; /** * Default implementation of artifact versioning. @@ -128,18 +128,15 @@ public class DefaultArtifactVersion if ( part2 != null ) { - try + if ( part2.length() == 1 || !part2.startsWith( "0" ) ) { - if ( ( part2.length() == 1 ) || !part2.startsWith( "0" ) ) - { - buildNumber = Integer.valueOf( part2 ); - } - else + buildNumber = tryParseInt( part2 ); + if ( buildNumber == null ) { qualifier = part2; } } - catch ( NumberFormatException e ) + else { qualifier = part2; } @@ -147,11 +144,8 @@ public class DefaultArtifactVersion if ( ( !part1.contains( "." ) ) && !part1.startsWith( "0" ) ) { - try - { - majorVersion = Integer.valueOf( part1 ); - } - catch ( NumberFormatException e ) + majorVersion = tryParseInt( part1 ); + if ( majorVersion == null ) { // qualifier is the whole version, including "-" qualifier = version; @@ -163,30 +157,42 @@ public class DefaultArtifactVersion boolean fallback = false; StringTokenizer tok = new StringTokenizer( part1, "." ); - try + if ( tok.hasMoreTokens() ) { majorVersion = getNextIntegerToken( tok ); - if ( tok.hasMoreTokens() ) - { - minorVersion = getNextIntegerToken( tok ); - } - if ( tok.hasMoreTokens() ) + if ( majorVersion == null ) { - incrementalVersion = getNextIntegerToken( tok ); + fallback = true; } - if ( tok.hasMoreTokens() ) + } + else + { + fallback = true; + } + if ( tok.hasMoreTokens() ) + { + minorVersion = getNextIntegerToken( tok ); + if ( minorVersion == null ) { - qualifier = tok.nextToken(); - fallback = Pattern.compile( "\\d+" ).matcher( qualifier ).matches(); + fallback = true; } - - // string tokenizer won't detect these and ignores them - if ( part1.contains( ".." ) || part1.startsWith( "." ) || part1.endsWith( "." ) ) + } + if ( tok.hasMoreTokens() ) + { + incrementalVersion = getNextIntegerToken( tok ); + if ( incrementalVersion == null ) { fallback = true; } } - catch ( NumberFormatException e ) + if ( tok.hasMoreTokens() ) + { + qualifier = tok.nextToken(); + fallback = isDigits( qualifier ); + } + + // string tokenizer won't detect these and ignores them + if ( part1.contains( ".." ) || part1.startsWith( "." ) || part1.endsWith( "." ) ) { fallback = true; } @@ -205,18 +211,32 @@ public class DefaultArtifactVersion private static Integer getNextIntegerToken( StringTokenizer tok ) { + String s = tok.nextToken(); + if ( ( s.length() > 1 ) && s.startsWith( "0" ) ) + { + return null; + } + return tryParseInt( s ); + } + + private static Integer tryParseInt( String s ) + { try { - String s = tok.nextToken(); - if ( ( s.length() > 1 ) && s.startsWith( "0" ) ) + if ( !isDigits( s ) ) + { + return null; + } + long longValue = Long.parseLong( s ); + if ( longValue > Integer.MAX_VALUE ) { - throw new NumberFormatException( "Number part has a leading 0: '" + s + "'" ); + return null; } - return Integer.valueOf( s ); + return (int) longValue; } - catch ( NoSuchElementException e ) + catch ( NumberFormatException e ) { - throw new NumberFormatException( "Number is invalid" ); + return null; } }
