2222
2323import java .net .MalformedURLException ;
2424import java .net .URL ;
25+ import java .util .ArrayList ;
26+ import java .util .List ;
2527import java .util .Objects ;
2628import java .util .function .Predicate ;
2729import java .util .regex .Pattern ;
3032import static com .microsoft .playwright .impl .Utils .toJsRegexFlags ;
3133
3234class UrlMatcher {
33- final Object rawSource ;
34- private final Predicate <String > predicate ;
35-
36- private static Predicate <String > toPredicate (Pattern pattern ) {
37- return s -> pattern .matcher (s ).find ();
38- }
39-
40- static UrlMatcher any () {
41- return new UrlMatcher ((Object ) null , null );
42- }
35+ private final URL baseURL ;
36+ public final String glob ;
37+ public final Pattern pattern ;
38+ public final Predicate <String > predicate ;
4339
4440 static UrlMatcher forOneOf (URL baseUrl , Object object ) {
4541 if (object == null ) {
46- return UrlMatcher . any ( );
42+ return new UrlMatcher ( null , null , null , null );
4743 }
4844 if (object instanceof String ) {
4945 return new UrlMatcher (baseUrl , (String ) object );
@@ -68,50 +64,75 @@ static String resolveUrl(URL baseUrl, String spec) {
6864 }
6965 }
7066
71- UrlMatcher (URL base , String url ) {
72- this (url , toPredicate ( Pattern . compile ( globToRegex ( resolveUrl ( base , url )))). or ( s -> url == null || url . equals ( s )) );
67+ UrlMatcher (URL baseURL , String glob ) {
68+ this (baseURL , glob , null , null );
7369 }
7470
7571 UrlMatcher (Pattern pattern ) {
76- this (pattern , toPredicate ( pattern ) );
72+ this (null , null , pattern , null );
7773 }
74+
7875 UrlMatcher (Predicate <String > predicate ) {
79- this (predicate , predicate );
76+ this (null , null , null , predicate );
8077 }
8178
82- private UrlMatcher (Object rawSource , Predicate <String > predicate ) {
83- this .rawSource = rawSource ;
79+ private UrlMatcher (URL baseURL , String glob , Pattern pattern , Predicate <String > predicate ) {
80+ this .baseURL = baseURL ;
81+ this .glob = glob ;
82+ this .pattern = pattern ;
8483 this .predicate = predicate ;
8584 }
8685
8786 boolean test (String value ) {
88- return predicate == null || predicate .test (value );
87+ if (pattern != null ) {
88+ return pattern .matcher (value ).find ();
89+ }
90+ if (predicate != null ) {
91+ return predicate .test (value );
92+ }
93+ if (glob != null ) {
94+ return Pattern .compile (globToRegex (resolveUrl (baseURL , glob ))).matcher (value ).find ();
95+ }
96+ return true ;
8997 }
9098
9199 @ Override
92100 public boolean equals (Object o ) {
93101 if (this == o ) return true ;
94102 if (o == null || getClass () != o .getClass ()) return false ;
95103 UrlMatcher that = (UrlMatcher ) o ;
96- if (rawSource instanceof Pattern && that .rawSource instanceof Pattern ) {
97- Pattern a = (Pattern ) rawSource ;
98- Pattern b = (Pattern ) that .rawSource ;
99- return a .pattern ().equals (b .pattern ()) && a .flags () == b .flags ();
104+ if (pattern != null ) {
105+ return that .pattern != null && pattern .pattern ().equals (that .pattern .pattern ()) && pattern .flags () == that .pattern .flags ();
106+ }
107+ if (predicate != null ) {
108+ return predicate .equals (that .predicate );
109+ }
110+ if (glob != null ) {
111+ return glob .equals (that .glob );
100112 }
101- return Objects . equals ( rawSource , that .rawSource ) ;
113+ return that . pattern == null && that .predicate == null && that . glob == null ;
102114 }
103115
104116 @ Override
105117 public int hashCode () {
106- return Objects .hash (rawSource );
118+ if (pattern != null ) {
119+ return pattern .hashCode ();
120+ }
121+ if (predicate != null ) {
122+ return predicate .hashCode ();
123+ }
124+ if (glob != null ) {
125+ return glob .hashCode ();
126+ }
127+ return 0 ;
107128 }
108129
109130 @ Override
110131 public String toString () {
111- if (rawSource = = null )
112- return "<any>" ;
113- if (rawSource instanceof Predicate )
114- return "matching predicate" ;
115- return rawSource . toString ( );
132+ if (pattern ! = null )
133+ return String . format ( "<regex pattern= \" %s \" flags= \" %s \" >" , pattern . pattern (), toJsRegexFlags ( pattern )) ;
134+ if (this . predicate != null )
135+ return "< predicate> " ;
136+ return String . format ( "<glob pattern= \" %s \" >" , glob );
116137 }
117138}
0 commit comments