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");

Reply via email to