66import com .squareup .moshi .ToJson ;
77import java .io .IOException ;
88import java .util .Objects ;
9- import java .util .regex .Matcher ;
109import java .util .regex .Pattern ;
10+ import org .slf4j .Logger ;
11+ import org .slf4j .LoggerFactory ;
1112
1213public final class SemanticVersion {
13- private static final Pattern DOT_SPLITTER = Pattern .compile ("\\ ." );
14+ private static final Pattern NUMERIC_SPLITTER = Pattern .compile ("[^0-9]+" );
15+ private static final Logger LOGGER = LoggerFactory .getLogger (SemanticVersion .class .getName ());
1416
1517 public static final class SemanticVersionAdapter {
1618
@@ -54,30 +56,23 @@ public SemanticVersion(int major, int minor, int patch) {
5456 }
5557
5658 public static SemanticVersion of (String version ) {
57- String [] parts = DOT_SPLITTER .split (version );
58- if (parts .length == 3 ) {
59- return new SemanticVersion (
60- safeParseInteger ( parts [ 0 ]), safeParseInteger ( parts [ 1 ]), safeParseInteger ( parts [ 2 ]));
59+ String [] parts = NUMERIC_SPLITTER .split (version , 4 );
60+ if (parts .length == 0 ) {
61+ LOGGER . error ( "Invalid version string {} " , version );
62+ return new SemanticVersion ( 0 , 0 , 0 ); // have a sane default
6163 } else if (parts .length == 2 ) {
6264 return new SemanticVersion (safeParseInteger (parts [0 ]), safeParseInteger (parts [1 ]), 0 );
6365 } else if (parts .length == 1 ) {
6466 return new SemanticVersion (safeParseInteger (parts [0 ]), 0 , 0 );
65- } else {
66- throw new IllegalArgumentException ("Invalid version string: " + version );
6767 }
68+ return new SemanticVersion (
69+ safeParseInteger (parts [0 ]), safeParseInteger (parts [1 ]), safeParseInteger (parts [2 ]));
6870 }
6971
70- private static final Pattern INTEGER_PATTERN = Pattern .compile ("(\\ d+).*" );
71-
7272 private static int safeParseInteger (String value ) {
7373 try {
7474 return Integer .parseInt (value );
75- } catch (NumberFormatException e ) {
76- Matcher matcher = INTEGER_PATTERN .matcher (value );
77- if (matcher .matches ()) {
78- // this is guaranteed to be an integer
79- return Integer .parseInt (matcher .group (1 ));
80- }
75+ } catch (Throwable ignored ) {
8176 return 0 ;
8277 }
8378 }
@@ -98,4 +93,9 @@ public boolean equals(Object o) {
9893 public int hashCode () {
9994 return Objects .hash (major , minor , patch );
10095 }
96+
97+ @ Override
98+ public String toString () {
99+ return "SemanticVersion{" + "major=" + major + ", minor=" + minor + ", patch=" + patch + '}' ;
100+ }
101101}
0 commit comments