1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.util;
18
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.Comparator;
22 import java.util.LinkedHashMap;
23 import java.util.List;
24 import java.util.Map;
25
26 import org.junit.Before;
27 import org.junit.Test;
28
29 import static org.junit.Assert.*;
30
31
32
33
34
35
36
37
38 public class AntPathMatcherTests {
39
40 private AntPathMatcher pathMatcher;
41
42 @Before
43 public void createMatcher() {
44 pathMatcher = new AntPathMatcher();
45 }
46
47 @Test
48 public void match() {
49
50 assertTrue(pathMatcher.match("test", "test"));
51 assertTrue(pathMatcher.match("/test", "/test"));
52 assertFalse(pathMatcher.match("/test.jpg", "test.jpg"));
53 assertFalse(pathMatcher.match("test", "/test"));
54 assertFalse(pathMatcher.match("/test", "test"));
55
56
57 assertTrue(pathMatcher.match("t?st", "test"));
58 assertTrue(pathMatcher.match("??st", "test"));
59 assertTrue(pathMatcher.match("tes?", "test"));
60 assertTrue(pathMatcher.match("te??", "test"));
61 assertTrue(pathMatcher.match("?es?", "test"));
62 assertFalse(pathMatcher.match("tes?", "tes"));
63 assertFalse(pathMatcher.match("tes?", "testt"));
64 assertFalse(pathMatcher.match("tes?", "tsst"));
65
66
67 assertTrue(pathMatcher.match("*", "test"));
68 assertTrue(pathMatcher.match("test*", "test"));
69 assertTrue(pathMatcher.match("test*", "testTest"));
70 assertTrue(pathMatcher.match("test/*", "test/Test"));
71 assertTrue(pathMatcher.match("test/*", "test/t"));
72 assertTrue(pathMatcher.match("test/*", "test/"));
73 assertTrue(pathMatcher.match("*test*", "AnothertestTest"));
74 assertTrue(pathMatcher.match("*test", "Anothertest"));
75 assertTrue(pathMatcher.match("*.*", "test."));
76 assertTrue(pathMatcher.match("*.*", "test.test"));
77 assertTrue(pathMatcher.match("*.*", "test.test.test"));
78 assertTrue(pathMatcher.match("test*aaa", "testblaaaa"));
79 assertFalse(pathMatcher.match("test*", "tst"));
80 assertFalse(pathMatcher.match("test*", "tsttest"));
81 assertFalse(pathMatcher.match("test*", "test/"));
82 assertFalse(pathMatcher.match("test*", "test/t"));
83 assertFalse(pathMatcher.match("test/*", "test"));
84 assertFalse(pathMatcher.match("*test*", "tsttst"));
85 assertFalse(pathMatcher.match("*test", "tsttst"));
86 assertFalse(pathMatcher.match("*.*", "tsttst"));
87 assertFalse(pathMatcher.match("test*aaa", "test"));
88 assertFalse(pathMatcher.match("test*aaa", "testblaaab"));
89
90
91 assertTrue(pathMatcher.match("/?", "/a"));
92 assertTrue(pathMatcher.match("/?/a", "/a/a"));
93 assertTrue(pathMatcher.match("/a/?", "/a/b"));
94 assertTrue(pathMatcher.match("/??/a", "/aa/a"));
95 assertTrue(pathMatcher.match("/a/??", "/a/bb"));
96 assertTrue(pathMatcher.match("/?", "/a"));
97
98
99 assertTrue(pathMatcher.match("/**", "/testing/testing"));
100 assertTrue(pathMatcher.match("/*/**", "/testing/testing"));
101 assertTrue(pathMatcher.match("/**/*", "/testing/testing"));
102 assertTrue(pathMatcher.match("/bla/**/bla", "/bla/testing/testing/bla"));
103 assertTrue(pathMatcher.match("/bla/**/bla", "/bla/testing/testing/bla/bla"));
104 assertTrue(pathMatcher.match("/**/test", "/bla/bla/test"));
105 assertTrue(pathMatcher.match("/bla/**/**/bla", "/bla/bla/bla/bla/bla/bla"));
106 assertTrue(pathMatcher.match("/bla*bla/test", "/blaXXXbla/test"));
107 assertTrue(pathMatcher.match("/*bla/test", "/XXXbla/test"));
108 assertFalse(pathMatcher.match("/bla*bla/test", "/blaXXXbl/test"));
109 assertFalse(pathMatcher.match("/*bla/test", "XXXblab/test"));
110 assertFalse(pathMatcher.match("/*bla/test", "XXXbl/test"));
111
112 assertFalse(pathMatcher.match("/????", "/bala/bla"));
113 assertFalse(pathMatcher.match("/**/*bla", "/bla/bla/bla/bbb"));
114
115 assertTrue(pathMatcher.match("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing/"));
116 assertTrue(pathMatcher.match("/*bla*/**/bla/*", "/XXXblaXXXX/testing/testing/bla/testing"));
117 assertTrue(pathMatcher.match("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing"));
118 assertTrue(pathMatcher.match("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing.jpg"));
119
120 assertTrue(pathMatcher.match("*bla*/**/bla/**", "XXXblaXXXX/testing/testing/bla/testing/testing/"));
121 assertTrue(pathMatcher.match("*bla*/**/bla/*", "XXXblaXXXX/testing/testing/bla/testing"));
122 assertTrue(pathMatcher.match("*bla*/**/bla/**", "XXXblaXXXX/testing/testing/bla/testing/testing"));
123 assertFalse(pathMatcher.match("*bla*/**/bla/*", "XXXblaXXXX/testing/testing/bla/testing/testing"));
124
125 assertFalse(pathMatcher.match("/x/x/**/bla", "/x/x/x/"));
126
127 assertTrue(pathMatcher.match("", ""));
128
129 assertTrue(pathMatcher.match("/{bla}.*", "/testing.html"));
130 }
131
132 @Test
133 public void withMatchStart() {
134
135 assertTrue(pathMatcher.matchStart("test", "test"));
136 assertTrue(pathMatcher.matchStart("/test", "/test"));
137 assertFalse(pathMatcher.matchStart("/test.jpg", "test.jpg"));
138 assertFalse(pathMatcher.matchStart("test", "/test"));
139 assertFalse(pathMatcher.matchStart("/test", "test"));
140
141
142 assertTrue(pathMatcher.matchStart("t?st", "test"));
143 assertTrue(pathMatcher.matchStart("??st", "test"));
144 assertTrue(pathMatcher.matchStart("tes?", "test"));
145 assertTrue(pathMatcher.matchStart("te??", "test"));
146 assertTrue(pathMatcher.matchStart("?es?", "test"));
147 assertFalse(pathMatcher.matchStart("tes?", "tes"));
148 assertFalse(pathMatcher.matchStart("tes?", "testt"));
149 assertFalse(pathMatcher.matchStart("tes?", "tsst"));
150
151
152 assertTrue(pathMatcher.matchStart("*", "test"));
153 assertTrue(pathMatcher.matchStart("test*", "test"));
154 assertTrue(pathMatcher.matchStart("test*", "testTest"));
155 assertTrue(pathMatcher.matchStart("test/*", "test/Test"));
156 assertTrue(pathMatcher.matchStart("test/*", "test/t"));
157 assertTrue(pathMatcher.matchStart("test/*", "test/"));
158 assertTrue(pathMatcher.matchStart("*test*", "AnothertestTest"));
159 assertTrue(pathMatcher.matchStart("*test", "Anothertest"));
160 assertTrue(pathMatcher.matchStart("*.*", "test."));
161 assertTrue(pathMatcher.matchStart("*.*", "test.test"));
162 assertTrue(pathMatcher.matchStart("*.*", "test.test.test"));
163 assertTrue(pathMatcher.matchStart("test*aaa", "testblaaaa"));
164 assertFalse(pathMatcher.matchStart("test*", "tst"));
165 assertFalse(pathMatcher.matchStart("test*", "test/"));
166 assertFalse(pathMatcher.matchStart("test*", "tsttest"));
167 assertFalse(pathMatcher.matchStart("test*", "test/"));
168 assertFalse(pathMatcher.matchStart("test*", "test/t"));
169 assertTrue(pathMatcher.matchStart("test/*", "test"));
170 assertTrue(pathMatcher.matchStart("test/t*.txt", "test"));
171 assertFalse(pathMatcher.matchStart("*test*", "tsttst"));
172 assertFalse(pathMatcher.matchStart("*test", "tsttst"));
173 assertFalse(pathMatcher.matchStart("*.*", "tsttst"));
174 assertFalse(pathMatcher.matchStart("test*aaa", "test"));
175 assertFalse(pathMatcher.matchStart("test*aaa", "testblaaab"));
176
177
178 assertTrue(pathMatcher.matchStart("/?", "/a"));
179 assertTrue(pathMatcher.matchStart("/?/a", "/a/a"));
180 assertTrue(pathMatcher.matchStart("/a/?", "/a/b"));
181 assertTrue(pathMatcher.matchStart("/??/a", "/aa/a"));
182 assertTrue(pathMatcher.matchStart("/a/??", "/a/bb"));
183 assertTrue(pathMatcher.matchStart("/?", "/a"));
184
185
186 assertTrue(pathMatcher.matchStart("/**", "/testing/testing"));
187 assertTrue(pathMatcher.matchStart("/*/**", "/testing/testing"));
188 assertTrue(pathMatcher.matchStart("/**/*", "/testing/testing"));
189 assertTrue(pathMatcher.matchStart("test*/**", "test/"));
190 assertTrue(pathMatcher.matchStart("test*/**", "test/t"));
191 assertTrue(pathMatcher.matchStart("/bla/**/bla", "/bla/testing/testing/bla"));
192 assertTrue(pathMatcher.matchStart("/bla/**/bla", "/bla/testing/testing/bla/bla"));
193 assertTrue(pathMatcher.matchStart("/**/test", "/bla/bla/test"));
194 assertTrue(pathMatcher.matchStart("/bla/**/**/bla", "/bla/bla/bla/bla/bla/bla"));
195 assertTrue(pathMatcher.matchStart("/bla*bla/test", "/blaXXXbla/test"));
196 assertTrue(pathMatcher.matchStart("/*bla/test", "/XXXbla/test"));
197 assertFalse(pathMatcher.matchStart("/bla*bla/test", "/blaXXXbl/test"));
198 assertFalse(pathMatcher.matchStart("/*bla/test", "XXXblab/test"));
199 assertFalse(pathMatcher.matchStart("/*bla/test", "XXXbl/test"));
200
201 assertFalse(pathMatcher.matchStart("/????", "/bala/bla"));
202 assertTrue(pathMatcher.matchStart("/**/*bla", "/bla/bla/bla/bbb"));
203
204 assertTrue(pathMatcher.matchStart("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing/"));
205 assertTrue(pathMatcher.matchStart("/*bla*/**/bla/*", "/XXXblaXXXX/testing/testing/bla/testing"));
206 assertTrue(pathMatcher.matchStart("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing"));
207 assertTrue(pathMatcher.matchStart("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing.jpg"));
208
209 assertTrue(pathMatcher.matchStart("*bla*/**/bla/**", "XXXblaXXXX/testing/testing/bla/testing/testing/"));
210 assertTrue(pathMatcher.matchStart("*bla*/**/bla/*", "XXXblaXXXX/testing/testing/bla/testing"));
211 assertTrue(pathMatcher.matchStart("*bla*/**/bla/**", "XXXblaXXXX/testing/testing/bla/testing/testing"));
212 assertTrue(pathMatcher.matchStart("*bla*/**/bla/*", "XXXblaXXXX/testing/testing/bla/testing/testing"));
213
214 assertTrue(pathMatcher.matchStart("/x/x/**/bla", "/x/x/x/"));
215
216 assertTrue(pathMatcher.matchStart("", ""));
217 }
218
219 @Test
220 public void uniqueDeliminator() {
221 pathMatcher.setPathSeparator(".");
222
223
224 assertTrue(pathMatcher.match("test", "test"));
225 assertTrue(pathMatcher.match(".test", ".test"));
226 assertFalse(pathMatcher.match(".test/jpg", "test/jpg"));
227 assertFalse(pathMatcher.match("test", ".test"));
228 assertFalse(pathMatcher.match(".test", "test"));
229
230
231 assertTrue(pathMatcher.match("t?st", "test"));
232 assertTrue(pathMatcher.match("??st", "test"));
233 assertTrue(pathMatcher.match("tes?", "test"));
234 assertTrue(pathMatcher.match("te??", "test"));
235 assertTrue(pathMatcher.match("?es?", "test"));
236 assertFalse(pathMatcher.match("tes?", "tes"));
237 assertFalse(pathMatcher.match("tes?", "testt"));
238 assertFalse(pathMatcher.match("tes?", "tsst"));
239
240
241 assertTrue(pathMatcher.match("*", "test"));
242 assertTrue(pathMatcher.match("test*", "test"));
243 assertTrue(pathMatcher.match("test*", "testTest"));
244 assertTrue(pathMatcher.match("*test*", "AnothertestTest"));
245 assertTrue(pathMatcher.match("*test", "Anothertest"));
246 assertTrue(pathMatcher.match("*/*", "test/"));
247 assertTrue(pathMatcher.match("*/*", "test/test"));
248 assertTrue(pathMatcher.match("*/*", "test/test/test"));
249 assertTrue(pathMatcher.match("test*aaa", "testblaaaa"));
250 assertFalse(pathMatcher.match("test*", "tst"));
251 assertFalse(pathMatcher.match("test*", "tsttest"));
252 assertFalse(pathMatcher.match("*test*", "tsttst"));
253 assertFalse(pathMatcher.match("*test", "tsttst"));
254 assertFalse(pathMatcher.match("*/*", "tsttst"));
255 assertFalse(pathMatcher.match("test*aaa", "test"));
256 assertFalse(pathMatcher.match("test*aaa", "testblaaab"));
257
258
259 assertTrue(pathMatcher.match(".?", ".a"));
260 assertTrue(pathMatcher.match(".?.a", ".a.a"));
261 assertTrue(pathMatcher.match(".a.?", ".a.b"));
262 assertTrue(pathMatcher.match(".??.a", ".aa.a"));
263 assertTrue(pathMatcher.match(".a.??", ".a.bb"));
264 assertTrue(pathMatcher.match(".?", ".a"));
265
266
267 assertTrue(pathMatcher.match(".**", ".testing.testing"));
268 assertTrue(pathMatcher.match(".*.**", ".testing.testing"));
269 assertTrue(pathMatcher.match(".**.*", ".testing.testing"));
270 assertTrue(pathMatcher.match(".bla.**.bla", ".bla.testing.testing.bla"));
271 assertTrue(pathMatcher.match(".bla.**.bla", ".bla.testing.testing.bla.bla"));
272 assertTrue(pathMatcher.match(".**.test", ".bla.bla.test"));
273 assertTrue(pathMatcher.match(".bla.**.**.bla", ".bla.bla.bla.bla.bla.bla"));
274 assertTrue(pathMatcher.match(".bla*bla.test", ".blaXXXbla.test"));
275 assertTrue(pathMatcher.match(".*bla.test", ".XXXbla.test"));
276 assertFalse(pathMatcher.match(".bla*bla.test", ".blaXXXbl.test"));
277 assertFalse(pathMatcher.match(".*bla.test", "XXXblab.test"));
278 assertFalse(pathMatcher.match(".*bla.test", "XXXbl.test"));
279 }
280
281 @Test
282 public void extractPathWithinPattern() throws Exception {
283 assertEquals("", pathMatcher.extractPathWithinPattern("/docs/commit.html", "/docs/commit.html"));
284
285 assertEquals("cvs/commit", pathMatcher.extractPathWithinPattern("/docs/*", "/docs/cvs/commit"));
286 assertEquals("commit.html", pathMatcher.extractPathWithinPattern("/docs/cvs/*.html", "/docs/cvs/commit.html"));
287 assertEquals("cvs/commit", pathMatcher.extractPathWithinPattern("/docs/**", "/docs/cvs/commit"));
288 assertEquals("cvs/commit.html",
289 pathMatcher.extractPathWithinPattern("/docs/**/*.html", "/docs/cvs/commit.html"));
290 assertEquals("commit.html", pathMatcher.extractPathWithinPattern("/docs/**/*.html", "/docs/commit.html"));
291 assertEquals("commit.html", pathMatcher.extractPathWithinPattern("/*.html", "/commit.html"));
292 assertEquals("docs/commit.html", pathMatcher.extractPathWithinPattern("/*.html", "/docs/commit.html"));
293 assertEquals("/commit.html", pathMatcher.extractPathWithinPattern("*.html", "/commit.html"));
294 assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("*.html", "/docs/commit.html"));
295 assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("**/*.*", "/docs/commit.html"));
296 assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("*", "/docs/commit.html"));
297
298 assertEquals("/docs/cvs/other/commit.html", pathMatcher.extractPathWithinPattern("**/commit.html", "/docs/cvs/other/commit.html"));
299 assertEquals("cvs/other/commit.html", pathMatcher.extractPathWithinPattern("/docs/**/commit.html", "/docs/cvs/other/commit.html"));
300 assertEquals("cvs/other/commit.html", pathMatcher.extractPathWithinPattern("/docs/**/**/**/**", "/docs/cvs/other/commit.html"));
301
302 assertEquals("docs/cvs/commit", pathMatcher.extractPathWithinPattern("/d?cs/*", "/docs/cvs/commit"));
303 assertEquals("cvs/commit.html",
304 pathMatcher.extractPathWithinPattern("/docs/c?s/*.html", "/docs/cvs/commit.html"));
305 assertEquals("docs/cvs/commit", pathMatcher.extractPathWithinPattern("/d?cs/**", "/docs/cvs/commit"));
306 assertEquals("docs/cvs/commit.html",
307 pathMatcher.extractPathWithinPattern("/d?cs/**/*.html", "/docs/cvs/commit.html"));
308 }
309
310 @Test
311 public void extractUriTemplateVariables() throws Exception {
312 Map<String, String> result = pathMatcher.extractUriTemplateVariables("/hotels/{hotel}", "/hotels/1");
313 assertEquals(Collections.singletonMap("hotel", "1"), result);
314
315 result = pathMatcher.extractUriTemplateVariables("/h?tels/{hotel}", "/hotels/1");
316 assertEquals(Collections.singletonMap("hotel", "1"), result);
317
318 result = pathMatcher.extractUriTemplateVariables("/hotels/{hotel}/bookings/{booking}", "/hotels/1/bookings/2");
319 Map<String, String> expected = new LinkedHashMap<String, String>();
320 expected.put("hotel", "1");
321 expected.put("booking", "2");
322 assertEquals(expected, result);
323
324 result = pathMatcher.extractUriTemplateVariables("/**/hotels/**/{hotel}", "/foo/hotels/bar/1");
325 assertEquals(Collections.singletonMap("hotel", "1"), result);
326
327 result = pathMatcher.extractUriTemplateVariables("/{page}.html", "/42.html");
328 assertEquals(Collections.singletonMap("page", "42"), result);
329
330 result = pathMatcher.extractUriTemplateVariables("/{page}.*", "/42.html");
331 assertEquals(Collections.singletonMap("page", "42"), result);
332
333 result = pathMatcher.extractUriTemplateVariables("/A-{B}-C", "/A-b-C");
334 assertEquals(Collections.singletonMap("B", "b"), result);
335
336 result = pathMatcher.extractUriTemplateVariables("/{name}.{extension}", "/test.html");
337 expected = new LinkedHashMap<String, String>();
338 expected.put("name", "test");
339 expected.put("extension", "html");
340 assertEquals(expected, result);
341 }
342
343 @Test
344 public void extractUriTemplateVariablesRegex() {
345 Map<String, String> result = pathMatcher
346 .extractUriTemplateVariables("{symbolicName:[\\w\\.]+}-{version:[\\w\\.]+}.jar",
347 "com.example-1.0.0.jar");
348 assertEquals("com.example", result.get("symbolicName"));
349 assertEquals("1.0.0", result.get("version"));
350
351 result = pathMatcher.extractUriTemplateVariables("{symbolicName:[\\w\\.]+}-sources-{version:[\\w\\.]+}.jar",
352 "com.example-sources-1.0.0.jar");
353 assertEquals("com.example", result.get("symbolicName"));
354 assertEquals("1.0.0", result.get("version"));
355 }
356
357
358
359 @Test
360 public void extractUriTemplateVarsRegexQualifiers() {
361 Map<String, String> result = pathMatcher.extractUriTemplateVariables(
362 "{symbolicName:[\\p{L}\\.]+}-sources-{version:[\\p{N}\\.]+}.jar",
363 "com.example-sources-1.0.0.jar");
364 assertEquals("com.example", result.get("symbolicName"));
365 assertEquals("1.0.0", result.get("version"));
366
367 result = pathMatcher.extractUriTemplateVariables(
368 "{symbolicName:[\\w\\.]+}-sources-{version:[\\d\\.]+}-{year:\\d{4}}{month:\\d{2}}{day:\\d{2}}.jar",
369 "com.example-sources-1.0.0-20100220.jar");
370 assertEquals("com.example", result.get("symbolicName"));
371 assertEquals("1.0.0", result.get("version"));
372 assertEquals("2010", result.get("year"));
373 assertEquals("02", result.get("month"));
374 assertEquals("20", result.get("day"));
375
376 result = pathMatcher.extractUriTemplateVariables(
377 "{symbolicName:[\\p{L}\\.]+}-sources-{version:[\\p{N}\\.\\{\\}]+}.jar",
378 "com.example-sources-1.0.0.{12}.jar");
379 assertEquals("com.example", result.get("symbolicName"));
380 assertEquals("1.0.0.{12}", result.get("version"));
381 }
382
383
384
385 @Test
386 public void extractUriTemplateVarsRegexCapturingGroups() {
387 try {
388 pathMatcher.extractUriTemplateVariables("/web/{id:foo(bar)?}", "/web/foobar");
389 fail("Expected exception");
390 }
391 catch (IllegalArgumentException ex) {
392 assertTrue("Expected helpful message on the use of capturing groups",
393 ex.getMessage().contains("The number of capturing groups in the pattern"));
394 }
395 }
396
397 @Test
398 public void combine() {
399 assertEquals("", pathMatcher.combine(null, null));
400 assertEquals("/hotels", pathMatcher.combine("/hotels", null));
401 assertEquals("/hotels", pathMatcher.combine(null, "/hotels"));
402 assertEquals("/hotels/booking", pathMatcher.combine("/hotels/*", "booking"));
403 assertEquals("/hotels/booking", pathMatcher.combine("/hotels/*", "/booking"));
404 assertEquals("/hotels/**/booking", pathMatcher.combine("/hotels/**", "booking"));
405 assertEquals("/hotels/**/booking", pathMatcher.combine("/hotels/**", "/booking"));
406 assertEquals("/hotels/booking", pathMatcher.combine("/hotels", "/booking"));
407 assertEquals("/hotels/booking", pathMatcher.combine("/hotels", "booking"));
408 assertEquals("/hotels/booking", pathMatcher.combine("/hotels/", "booking"));
409 assertEquals("/hotels/{hotel}", pathMatcher.combine("/hotels/*", "{hotel}"));
410 assertEquals("/hotels/**/{hotel}", pathMatcher.combine("/hotels/**", "{hotel}"));
411 assertEquals("/hotels/{hotel}", pathMatcher.combine("/hotels", "{hotel}"));
412 assertEquals("/hotels/{hotel}.*", pathMatcher.combine("/hotels", "{hotel}.*"));
413 assertEquals("/hotels/*/booking/{booking}", pathMatcher.combine("/hotels/*/booking", "{booking}"));
414 assertEquals("/hotel.html", pathMatcher.combine("/*.html", "/hotel.html"));
415 assertEquals("/hotel.html", pathMatcher.combine("/*.html", "/hotel"));
416 assertEquals("/hotel.html", pathMatcher.combine("/*.html", "/hotel.*"));
417 assertEquals("/*.html", pathMatcher.combine("/**", "/*.html"));
418 assertEquals("/*.html", pathMatcher.combine("/*", "/*.html"));
419 assertEquals("/*.html", pathMatcher.combine("/*.*", "/*.html"));
420 assertEquals("/{foo}/bar", pathMatcher.combine("/{foo}", "/bar"));
421 assertEquals("/user/user", pathMatcher.combine("/user", "/user"));
422 assertEquals("/{foo:.*[^0-9].*}/edit/", pathMatcher.combine("/{foo:.*[^0-9].*}", "/edit/"));
423 assertEquals("/1.0/foo/test", pathMatcher.combine("/1.0", "/foo/test"));
424 }
425
426 @Test
427 public void patternComparator() {
428 Comparator<String> comparator = pathMatcher.getPatternComparator("/hotels/new");
429
430 assertEquals(0, comparator.compare(null, null));
431 assertEquals(1, comparator.compare(null, "/hotels/new"));
432 assertEquals(-1, comparator.compare("/hotels/new", null));
433
434 assertEquals(0, comparator.compare("/hotels/new", "/hotels/new"));
435
436 assertEquals(-1, comparator.compare("/hotels/new", "/hotels/*"));
437 assertEquals(1, comparator.compare("/hotels/*", "/hotels/new"));
438 assertEquals(0, comparator.compare("/hotels/*", "/hotels/*"));
439
440 assertEquals(-1, comparator.compare("/hotels/new", "/hotels/{hotel}"));
441 assertEquals(1, comparator.compare("/hotels/{hotel}", "/hotels/new"));
442 assertEquals(0, comparator.compare("/hotels/{hotel}", "/hotels/{hotel}"));
443 assertEquals(-1, comparator.compare("/hotels/{hotel}/booking", "/hotels/{hotel}/bookings/{booking}"));
444 assertEquals(1, comparator.compare("/hotels/{hotel}/bookings/{booking}", "/hotels/{hotel}/booking"));
445
446
447 assertEquals(-1, comparator.compare("/hotels/{hotel}/bookings/{booking}/cutomers/{customer}", "/**"));
448 assertEquals(1, comparator.compare("/**","/hotels/{hotel}/bookings/{booking}/cutomers/{customer}"));
449 assertEquals(0, comparator.compare("/**","/**"));
450
451 assertEquals(-1, comparator.compare("/hotels/{hotel}", "/hotels/*"));
452 assertEquals(1, comparator.compare("/hotels/*", "/hotels/{hotel}"));
453
454 assertEquals(-1, comparator.compare("/hotels/*", "/hotels/*/**"));
455 assertEquals(1, comparator.compare("/hotels/*/**", "/hotels/*"));
456
457 assertEquals(-1, comparator.compare("/hotels/new", "/hotels/new.*"));
458 assertEquals(2, comparator.compare("/hotels/{hotel}", "/hotels/{hotel}.*"));
459
460
461 assertEquals(-1, comparator.compare("/hotels/{hotel}/bookings/{booking}/cutomers/{customer}", "/hotels/**"));
462 assertEquals(1, comparator.compare("/hotels/**", "/hotels/{hotel}/bookings/{booking}/cutomers/{customer}"));
463 assertEquals(1, comparator.compare("/hotels/foo/bar/**", "/hotels/{hotel}"));
464 assertEquals(-1, comparator.compare("/hotels/{hotel}", "/hotels/foo/bar/**"));
465 assertEquals(2, comparator.compare("/hotels/**/bookings/**", "/hotels/**"));
466 assertEquals(-2, comparator.compare("/hotels/**", "/hotels/**/bookings/**"));
467
468
469 assertEquals(1, comparator.compare("/**", "/hotels/{hotel}"));
470
471
472 assertEquals(1, comparator.compare("/hotels", "/hotels2"));
473 }
474
475 @Test
476 public void patternComparatorSort() {
477 Comparator<String> comparator = pathMatcher.getPatternComparator("/hotels/new");
478 List<String> paths = new ArrayList<String>(3);
479
480 paths.add(null);
481 paths.add("/hotels/new");
482 Collections.sort(paths, comparator);
483 assertEquals("/hotels/new", paths.get(0));
484 assertNull(paths.get(1));
485 paths.clear();
486
487 paths.add("/hotels/new");
488 paths.add(null);
489 Collections.sort(paths, comparator);
490 assertEquals("/hotels/new", paths.get(0));
491 assertNull(paths.get(1));
492 paths.clear();
493
494 paths.add("/hotels/*");
495 paths.add("/hotels/new");
496 Collections.sort(paths, comparator);
497 assertEquals("/hotels/new", paths.get(0));
498 assertEquals("/hotels/*", paths.get(1));
499 paths.clear();
500
501 paths.add("/hotels/new");
502 paths.add("/hotels/*");
503 Collections.sort(paths, comparator);
504 assertEquals("/hotels/new", paths.get(0));
505 assertEquals("/hotels/*", paths.get(1));
506 paths.clear();
507
508 paths.add("/hotels/**");
509 paths.add("/hotels/*");
510 Collections.sort(paths, comparator);
511 assertEquals("/hotels/*", paths.get(0));
512 assertEquals("/hotels/**", paths.get(1));
513 paths.clear();
514
515 paths.add("/hotels/*");
516 paths.add("/hotels/**");
517 Collections.sort(paths, comparator);
518 assertEquals("/hotels/*", paths.get(0));
519 assertEquals("/hotels/**", paths.get(1));
520 paths.clear();
521
522 paths.add("/hotels/{hotel}");
523 paths.add("/hotels/new");
524 Collections.sort(paths, comparator);
525 assertEquals("/hotels/new", paths.get(0));
526 assertEquals("/hotels/{hotel}", paths.get(1));
527 paths.clear();
528
529 paths.add("/hotels/new");
530 paths.add("/hotels/{hotel}");
531 Collections.sort(paths, comparator);
532 assertEquals("/hotels/new", paths.get(0));
533 assertEquals("/hotels/{hotel}", paths.get(1));
534 paths.clear();
535
536 paths.add("/hotels/*");
537 paths.add("/hotels/{hotel}");
538 paths.add("/hotels/new");
539 Collections.sort(paths, comparator);
540 assertEquals("/hotels/new", paths.get(0));
541 assertEquals("/hotels/{hotel}", paths.get(1));
542 assertEquals("/hotels/*", paths.get(2));
543 paths.clear();
544
545 paths.add("/hotels/ne*");
546 paths.add("/hotels/n*");
547 Collections.shuffle(paths);
548 Collections.sort(paths, comparator);
549 assertEquals("/hotels/ne*", paths.get(0));
550 assertEquals("/hotels/n*", paths.get(1));
551 paths.clear();
552
553 comparator = pathMatcher.getPatternComparator("/hotels/new.html");
554 paths.add("/hotels/new.*");
555 paths.add("/hotels/{hotel}");
556 Collections.shuffle(paths);
557 Collections.sort(paths, comparator);
558 assertEquals("/hotels/new.*", paths.get(0));
559 assertEquals("/hotels/{hotel}", paths.get(1));
560 paths.clear();
561
562 comparator = pathMatcher.getPatternComparator("/web/endUser/action/login.html");
563 paths.add("/**/login.*");
564 paths.add("/**/endUser/action/login.*");
565 Collections.sort(paths, comparator);
566 assertEquals("/**/endUser/action/login.*", paths.get(0));
567 assertEquals("/**/login.*", paths.get(1));
568 paths.clear();
569 }
570
571
572
573 @Test
574 public void trimTokensOff() {
575 pathMatcher.setTrimTokens(false);
576
577 assertTrue(pathMatcher.match("/group/{groupName}/members", "/group/sales/members"));
578 assertTrue(pathMatcher.match("/group/{groupName}/members", "/group/ sales/members"));
579 }
580
581 @Test
582 public void testDefaultCacheSetting() {
583 match();
584 assertTrue(pathMatcher.stringMatcherCache.size() > 20);
585
586 for (int i = 0; i < 65536; i++) {
587 pathMatcher.match("test" + i, "test");
588 }
589
590 assertTrue(pathMatcher.stringMatcherCache.isEmpty());
591 }
592
593 @Test
594 public void testCacheSetToTrue() {
595 pathMatcher.setCachePatterns(true);
596 match();
597 assertTrue(pathMatcher.stringMatcherCache.size() > 20);
598
599 for (int i = 0; i < 65536; i++) {
600 pathMatcher.match("test" + i, "test");
601 }
602
603 assertTrue(pathMatcher.stringMatcherCache.size() > 65536);
604 }
605
606 @Test
607 public void testCacheSetToFalse() {
608 pathMatcher.setCachePatterns(false);
609 match();
610 assertTrue(pathMatcher.stringMatcherCache.isEmpty());
611 }
612
613 @Test
614 public void testExtensionMappingWithDotPathSeparator() {
615 pathMatcher.setPathSeparator(".");
616 assertEquals("Extension mapping should be disabled with \".\" as path separator",
617 "/*.html.hotel.*", pathMatcher.combine("/*.html", "hotel.*"));
618 }
619
620 }