@@ -24,41 +24,41 @@ public static PathPattern compile(String raw) {
2424 String prev = null ;
2525 for (int i = 0 ; i < segments .length ; i ++) {
2626 String seg = segments [i ];
27- if (seg .isEmpty ()
28- && !(i == segments .length - 1 && segments .length > 1 && raw .endsWith ("/" ))) {
29- throw new IllegalArgumentException ("empty segment in path: " + raw );
30- }
31- if (seg .contains ("*" ) && !seg .equals ("*" ) && !seg .equals ("**" )) {
32- throw new IllegalArgumentException (
33- "'*' and '**' must be a whole segment, not " + seg + " in " + raw );
34- }
35- if ("**" .equals (seg ) && "**" .equals (prev )) {
36- throw new IllegalArgumentException ("adjacent '**' segments in " + raw );
37- }
27+ validateSegment (seg , prev , i , segments .length , raw );
3828 boolean trailing = i == segments .length - 1 ;
39- switch (seg ) {
40- case "*" -> {
41- rx .append ("/[^/]+" );
42- hasWildcard = true ;
43- }
44- case "**" -> {
45- if (trailing ) {
46- // Slash is required; anything (including empty string) may follow it.
47- rx .append ("/.*" );
48- } else {
49- // At least one character and a slash must appear before the next segment.
50- rx .append ("/.+" );
51- }
52- hasWildcard = true ;
53- }
54- default -> rx .append ("/" ).append (Pattern .quote (seg ));
55- }
29+ hasWildcard |= appendSegment (rx , seg , trailing );
5630 prev = seg ;
5731 }
5832 rx .append ("$" );
5933 return new PathPattern (raw , Pattern .compile (rx .toString ()), hasWildcard );
6034 }
6135
36+ private static void validateSegment (String seg , String prev , int i , int total , String raw ) {
37+ boolean trailingEmptyAllowed = i == total - 1 && total > 1 && raw .endsWith ("/" );
38+ if (seg .isEmpty () && !trailingEmptyAllowed ) {
39+ throw new IllegalArgumentException ("empty segment in path: " + raw );
40+ }
41+ if (seg .contains ("*" ) && !seg .equals ("*" ) && !seg .equals ("**" )) {
42+ throw new IllegalArgumentException (
43+ "'*' and '**' must be a whole segment, not " + seg + " in " + raw );
44+ }
45+ if ("**" .equals (seg ) && "**" .equals (prev )) {
46+ throw new IllegalArgumentException ("adjacent '**' segments in " + raw );
47+ }
48+ }
49+
50+ private static boolean appendSegment (StringBuilder rx , String seg , boolean trailing ) {
51+ switch (seg ) {
52+ case "*" -> rx .append ("/[^/]+" );
53+ case "**" -> rx .append (trailing ? "/.*" : "/.+" );
54+ default -> {
55+ rx .append ("/" ).append (Pattern .quote (seg ));
56+ return false ;
57+ }
58+ }
59+ return true ;
60+ }
61+
6262 public boolean hasWildcard () {
6363 return wildcard ;
6464 }
0 commit comments