This is an automated email from the ASF dual-hosted git repository.
reta pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/main by this push:
new b27da0d9a7 Preserve exact variable template pattern to reconstruct URI
templates later on (#3019)
b27da0d9a7 is described below
commit b27da0d9a777778f221e8d3711386c837032ba7b
Author: Andriy Redko <[email protected]>
AuthorDate: Sun Apr 5 16:33:26 2026 -0400
Preserve exact variable template pattern to reconstruct URI templates later
on (#3019)
---
.../org/apache/cxf/jaxrs/model/URITemplate.java | 12 ++++++------
.../org/apache/cxf/jaxrs/impl/UriInfoImplTest.java | 21 +++++++++++++++++++++
2 files changed, 27 insertions(+), 6 deletions(-)
diff --git
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
index 285f012648..0a9947a8f4 100644
---
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
+++
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
@@ -471,6 +471,7 @@ public final class URITemplate {
private static final Pattern VARIABLE_PATTERN =
Pattern.compile("(\\w[-\\w\\.]*[ ]*)(\\:(.+))?");
private String name;
private Pattern pattern;
+ private String template;
private Variable() {
// empty constructor
@@ -488,14 +489,16 @@ public final class URITemplate {
return null;
}
if (CurlyBraceTokenizer.insideBraces(uriChunk)) {
- uriChunk = CurlyBraceTokenizer.stripBraces(uriChunk).trim();
- Matcher matcher = VARIABLE_PATTERN.matcher(uriChunk);
+ String trimmedUriChunk =
CurlyBraceTokenizer.stripBraces(uriChunk).trim();
+ Matcher matcher = VARIABLE_PATTERN.matcher(trimmedUriChunk);
if (matcher.matches()) {
newVariable.name = matcher.group(1).trim();
if (matcher.group(2) != null && matcher.group(3) != null) {
String patternExpression = matcher.group(3).trim();
newVariable.pattern =
Pattern.compile(patternExpression);
}
+ // Store the exact variable template
+ newVariable.template = uriChunk.trim();
return newVariable;
}
}
@@ -526,10 +529,7 @@ public final class URITemplate {
@Override
public String getValue() {
- if (pattern != null) {
- return "{" + name + ":" + pattern + "}";
- }
- return "{" + name + "}";
+ return template;
}
}
diff --git
a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriInfoImplTest.java
b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriInfoImplTest.java
index bfc5c8ba87..4b893a3dcf 100644
---
a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriInfoImplTest.java
+++
b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriInfoImplTest.java
@@ -436,6 +436,12 @@ public class UriInfoImplTest {
return null;
}
+ @GET
+ @Path("one/{name: [a-zA-Z][a-zA-Z_0-9]*}")
+ public Response getTemplateSpaces() {
+ return null;
+ }
+
@GET
@Path("bar")
public Response getSubMethod() {
@@ -584,6 +590,21 @@ public class UriInfoImplTest {
assertEquals("/foo/one/{name:[a-zA-Z][a-zA-Z_0-9]*}",
u.getMatchedResourceTemplate());
}
+ @Test
+ public void
testGetMatchedResourceTemplatePreserveSpacesInTemplateVariables() throws
Exception {
+ Message m = mockMessage("http://localhost:8080/app", "/foo/one/abc");
+ OperationResourceInfoStack oriStack = new OperationResourceInfoStack();
+ ClassResourceInfo cri = getCri(RootResource.class, true);
+ OperationResourceInfo ori = getOri(cri, "getTemplateSpaces");
+
+ MethodInvocationInfo miInfo = new MethodInvocationInfo(ori,
RootResource.class, new ArrayList<String>());
+ oriStack.push(miInfo);
+ m.put(OperationResourceInfoStack.class, oriStack);
+
+ UriInfoImpl u = new UriInfoImpl(m);
+ assertEquals("/foo/one/{name: [a-zA-Z][a-zA-Z_0-9]*}",
u.getMatchedResourceTemplate());
+ }
+
@Test
public void
testGetMatchedResourceTemplateIgnoresPathBeforeApplicationPath() throws
Exception {
Message m = mockMessage("http://localhost:8080/context/service",
"/foo/bar");