From 1df2f0a365c61c6a662024e5afcb3b059b8f3297 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 16 May 2023 20:44:55 +0200 Subject: [PATCH] WW-5309 Supports patterns starting with variable --- .../util/NamedVariablePatternMatcher.java | 4 ++-- .../util/NamedVariablePatternMatcherTest.java | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcher.java b/core/src/main/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcher.java index 24e5e9b352..027dc4a58f 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcher.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcher.java @@ -87,8 +87,8 @@ public CompiledPattern compilePattern(String data) { int s = 0; while (s < len) { int e = data.indexOf('{', s); - if (e < 0 && data.indexOf('}') > -1) { - throw new IllegalArgumentException("Missing openning '{' in [" + data + "]!"); + if (e < 0 && data.indexOf('}', s) > -1) { + throw new IllegalArgumentException("Missing opening '{' in [" + data + "]!"); } if (e < 0) { regex.append(Pattern.quote(data.substring(s))); diff --git a/core/src/test/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcherTest.java b/core/src/test/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcherTest.java index b5eda4f0a4..da7f3f0214 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcherTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/NamedVariablePatternMatcherTest.java @@ -53,6 +53,26 @@ public void testCompile() { assertEquals("bob", pattern.getVariableNames().get(1)); assertTrue(pattern.getPattern().matcher("foostar/jie").matches()); assertFalse(pattern.getPattern().matcher("foo/star/jie").matches()); + + pattern = matcher.compilePattern("{urlLocale}/eula_cz"); + assertEquals("([^/]+)\\Q/eula_cz\\E", pattern.getPattern().pattern()); + assertEquals("urlLocale", pattern.getVariableNames().get(0)); + assertTrue(pattern.getPattern().matcher("foostar/eula_cz").matches()); + assertFalse(pattern.getPattern().matcher("foo/star/eula_cz").matches()); + + pattern = matcher.compilePattern("{test1}/path/{test2}"); + assertEquals("([^/]+)\\Q/path/\\E([^/]+)", pattern.getPattern().pattern()); + assertEquals("test1", pattern.getVariableNames().get(0)); + assertEquals("test2", pattern.getVariableNames().get(1)); + assertTrue(pattern.getPattern().matcher("test1/path/test2").matches()); + assertFalse(pattern.getPattern().matcher("test/1/path/test2").matches()); + + pattern = matcher.compilePattern("path1/{test1}/path2/{test2}"); + assertEquals("\\Qpath1/\\E([^/]+)\\Q/path2/\\E([^/]+)", pattern.getPattern().pattern()); + assertEquals("test1", pattern.getVariableNames().get(0)); + assertEquals("test2", pattern.getVariableNames().get(1)); + assertTrue(pattern.getPattern().matcher("path1/test1/path2/test2").matches()); + assertFalse(pattern.getPattern().matcher("path1/test/1/path2/test2").matches()); } @Test(expected = IllegalArgumentException.class)