You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2012/10/22 18:25:52 UTC

svn commit: r1400939 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java main/java/org/apache/cxf/jaxrs/model/URITemplate.java test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java

Author: sergeyb
Date: Mon Oct 22 16:25:52 2012
New Revision: 1400939

URL: http://svn.apache.org/viewvc?rev=1400939&view=rev
Log:
Prototyping new UriBuilder method implementations

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java?rev=1400939&r1=1400938&r2=1400939&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java Mon Oct 22 16:25:52 2012
@@ -72,14 +72,14 @@ public class UriBuilderImpl extends UriB
 
     @Override
     public URI build(Object... values) throws IllegalArgumentException, UriBuilderException {
-        return doBuild(false, false, values);
+        return doBuild(false, true, values);
     }
 
     private URI doBuild(boolean fromEncoded, boolean encodePathSlash, Object... values) {
         
         String thePath = buildPath(fromEncoded);
         URITemplate pathTempl = new URITemplate(thePath);
-        thePath = substituteVarargs(pathTempl, values, 0);
+        thePath = substituteVarargs(pathTempl, values, 0, encodePathSlash);
         
         String theQuery = buildQuery(fromEncoded);
         int queryTemplateVarsSize = 0;
@@ -88,7 +88,7 @@ public class UriBuilderImpl extends UriB
             int lengthDiff = values.length - pathTempl.getVariables().size(); 
             if (lengthDiff > 0) {
                 queryTemplateVarsSize = queryTempl.getVariables().size(); 
-                theQuery = substituteVarargs(queryTempl, values, values.length - lengthDiff);
+                theQuery = substituteVarargs(queryTempl, values, values.length - lengthDiff, false);
             }
         }
         
@@ -97,7 +97,7 @@ public class UriBuilderImpl extends UriB
             URITemplate fragmentTempl = new URITemplate(theFragment);
             int lengthDiff = values.length - pathTempl.getVariables().size() - queryTemplateVarsSize; 
             if (lengthDiff > 0) {
-                theFragment = substituteVarargs(fragmentTempl, values, values.length - lengthDiff);
+                theFragment = substituteVarargs(fragmentTempl, values, values.length - lengthDiff, false);
             }
         }
         
@@ -140,6 +140,10 @@ public class UriBuilderImpl extends UriB
     
     private URI buildURIFromEncoded(String thePath, String theQuery, String theFragment) 
         throws URISyntaxException {
+        return new URI(buildUriString(thePath, theQuery, theFragment));
+    }
+    
+    private String buildUriString(String thePath, String theQuery, String theFragment) {
         StringBuilder b = new StringBuilder();
         if (scheme != null) {
             b.append(scheme).append(":");
@@ -169,7 +173,7 @@ public class UriBuilderImpl extends UriB
         if (theFragment != null) {
             b.append('#').append(theFragment);
         }
-        return new URI(b.toString());
+        return b.toString();
     }
     
     private boolean isSchemeOpaque() {
@@ -200,7 +204,7 @@ public class UriBuilderImpl extends UriB
     @Override
     public URI buildFromMap(Map<String, ?> map) throws IllegalArgumentException,
         UriBuilderException {
-        return doBuildFromMap(map, false, false);
+        return doBuildFromMap(map, false, true);
     }
 
     private URI doBuildFromMap(Map<String, ? extends Object> map, boolean fromEncoded, 
@@ -208,14 +212,15 @@ public class UriBuilderImpl extends UriB
         throws IllegalArgumentException, UriBuilderException {
         try {
             String thePath = buildPath(fromEncoded);
-            thePath = substituteMapped(thePath, map);
+            thePath = substituteMapped(thePath, map, encodePathSlash);
             
             String theQuery = buildQuery(fromEncoded);
             if (theQuery != null) {
-                theQuery = substituteMapped(theQuery, map);
+                theQuery = substituteMapped(theQuery, map, false);
             }
             
-            String theFragment = fragment == null ? null : substituteMapped(fragment, map);
+            String theFragment = fragment == null 
+                ? null : substituteMapped(fragment, map, encodePathSlash);
             
             return buildURI(fromEncoded, thePath, theQuery, theFragment);
         } catch (URISyntaxException ex) {
@@ -223,7 +228,10 @@ public class UriBuilderImpl extends UriB
         }
     }
     
-    private String substituteVarargs(URITemplate templ, Object[] values, int ind) {
+    private String substituteVarargs(URITemplate templ, 
+                                     Object[] values, 
+                                     int ind,
+                                     boolean encodePathSlash) {
         Map<String, String> varValueMap = new HashMap<String, String>();
         
         // vars in set are properly ordered due to linking in hash set
@@ -239,12 +247,15 @@ public class UriBuilderImpl extends UriB
             if (oval == null) {
                 throw new IllegalArgumentException("No object for " + var);
             }
-            varValueMap.put(var, oval.toString());
+            String value = oval.toString();
+            varValueMap.put(var, value);
         }
-        return templ.substitute(varValueMap);
+        return templ.substitute(varValueMap, encodePathSlash);
     }
     
-    private String substituteMapped(String path, Map<String, ? extends Object> varValueMap) {
+    private String substituteMapped(String path, 
+                                    Map<String, ? extends Object> varValueMap,
+                                    boolean encodePathSlash) {
     
         URITemplate templ = new URITemplate(path);
         
@@ -254,7 +265,7 @@ public class UriBuilderImpl extends UriB
                                                + " value(s) given for " + uniqueVars.size()
                                                + " unique variable(s)");
         }
-        return templ.substitute(varValueMap);
+        return templ.substitute(varValueMap, encodePathSlash);
     }
 
     @Override
@@ -402,7 +413,8 @@ public class UriBuilderImpl extends UriB
             segments = JAXRSUtils.getPathSegments(path, false, false);
         } else {
             segments = new ArrayList<PathSegment>();
-            segments.add(new PathSegmentImpl(path.replaceAll("/", "%2F"), false));
+            path = path.replaceAll("/", "%2F");
+            segments.add(new PathSegmentImpl(path, false));
         }
         if (!paths.isEmpty() && !matrix.isEmpty()) {
             PathSegment ps = paths.remove(paths.size() - 1);
@@ -745,8 +757,39 @@ public class UriBuilderImpl extends UriB
         return doBuildFromMap(map, false, encodePathSlash);
     }
 
+
     @Override
     public String toTemplate() {
+        final String thePath = buildPath(true);
+        final String theQuery = buildQuery(true);
+        return buildUriString(thePath, theQuery, fragment);
+    }
+    
+    public UriBuilder resolveTemplate(String name, Object value) throws IllegalArgumentException {
+        return resolveTemplate(name, value, true);
+    }
+    
+    public UriBuilder resolveTemplate(String name, Object value, boolean encodePathSlash) 
+        throws IllegalArgumentException {
+        throw new UnsupportedOperationException();
+    }
+    
+    public UriBuilder resolveTemplateFromEncoded(String name, Object value) throws IllegalArgumentException {
         throw new UnsupportedOperationException();
     }
+    
+    public UriBuilder resolveTemplates(Map<String, Object> values) throws IllegalArgumentException {
+        return resolveTemplates(values, true);
+    }
+    
+    public UriBuilder resolveTemplates(Map<String, Object> values, boolean encodePathSlash) 
+        throws IllegalArgumentException {
+        throw new UnsupportedOperationException();
+    }
+    
+    public UriBuilder resolveTemplatesFromEncoded(Map<String, Object> values) 
+        throws IllegalArgumentException {
+        throw new UnsupportedOperationException();
+    }
+    
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java?rev=1400939&r1=1400938&r2=1400939&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java Mon Oct 22 16:25:52 2012
@@ -248,6 +248,10 @@ public final class URITemplate {
         return sb.toString();
     }
 
+    public String substitute(Map<String, ? extends Object> valuesMap) throws IllegalArgumentException {
+        return this.substitute(valuesMap, false);
+    }
+    
     /**
      * Substitutes template variables with mapped values. Variables are mapped to values; if not all variables
      * are bound result will still contain variables. Note that all variables with the same name are replaced
@@ -260,7 +264,8 @@ public final class URITemplate {
      * @param valuesMap map variables to their values; on each value Object.toString() is called.
      * @return template with bound variables.
      */
-    public String substitute(Map<String, ? extends Object> valuesMap) throws IllegalArgumentException {
+    public String substitute(Map<String, ? extends Object> valuesMap,
+                             boolean encodePathSlash) throws IllegalArgumentException {
         if (valuesMap == null) {
             throw new IllegalArgumentException("valuesMap is null");
         }
@@ -276,7 +281,10 @@ public final class URITemplate {
                                                            + var.getName() + " with pattern "
                                                            + var.getPattern());
                     }
-                    sb.append(value);
+                    if (encodePathSlash) {
+                        sval = sval.replaceAll("/", "%2F");
+                    }
+                    sb.append(sval);
                 } else {
                     throw new IllegalArgumentException("Template variable " + var.getName() 
                         + " has no matching value"); 

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java?rev=1400939&r1=1400938&r2=1400939&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java Mon Oct 22 16:25:52 2012
@@ -327,7 +327,7 @@ public class UriBuilderImplTest extends 
     public void testBuildValuesPct() throws Exception {
         URI uri = new URI("http://zzz");
         URI newUri = new UriBuilderImpl(uri).path("/{a}").build("foo%25/bar%");
-        assertEquals("URI is not built correctly", new URI("http://zzz/foo%2525/bar%25"), newUri);
+        assertEquals("URI is not built correctly", new URI("http://zzz/foo%2525%2Fbar%25"), newUri);
     }
 
     @Test
@@ -375,7 +375,8 @@ public class UriBuilderImplTest extends 
         map.put("a", "foo%25/bar%");
         Map<String, String> immutable = Collections.unmodifiableMap(map);
         URI newUri = new UriBuilderImpl(uri).path("/{a}").buildFromMap(immutable);
-        assertEquals("URI is not built correctly", new URI("http://zzz/foo%2525/bar%25"), newUri);
+        assertEquals("URI is not built correctly", 
+                     new URI("http://zzz/foo%2525%2Fbar%25"), newUri);
     }
 
     @Test
@@ -936,7 +937,54 @@ public class UriBuilderImplTest extends 
         assertEquals(expected, uri.toString());        
     }
     
+    @Test
+    public void testSegments3() {
+        String path1 = "ab";
+        String[] path2 = {"a1", "{xy}", "3b "};
+        String expected = "ab/a1/x%2Fy/3b%20";
+
+        URI uri = UriBuilder.fromPath(path1).segment(path2).build("x/y");
+        assertEquals(uri.toString(), expected);        
+    }
+    
+    public void testToTemplate() {
+        String path1 = "ab";
+        String[] path2 = {"a1", "{xy}", "3b "};
+        String expected = "ab/a1/{xy}/3b ";
+
+        String template = UriBuilder.fromPath(path1).segment(path2).toTemplate();
+        assertEquals(template, expected);        
+    }
     
+    @Test
+    public void testSegments4() {
+        String path1 = "ab";
+        String[] path2 = {"a1", "{xy}", "3b "};
+        String expected = "ab/a1/x/y/3b%20";
+
+        URI uri = UriBuilder.fromPath(path1).segment(path2).build(new Object[]{"x/y"}, false);
+        assertEquals(uri.toString(), expected);        
+    }
+    
+    @Test
+    public void testPathEncodedSlash() {
+        String path1 = "ab";
+        String path2 = "{xy}";
+        String expected = "ab/x%2Fy";
+
+        URI uri = UriBuilder.fromPath(path1).path(path2).build(new Object[]{"x/y"}, true);
+        assertEquals(uri.toString(), expected);        
+    }
+    
+    @Test
+    public void testPathEncodedSlashNot() {
+        String path1 = "ab";
+        String path2 = "{xy}";
+        String expected = "ab/x/y";
+
+        URI uri = UriBuilder.fromPath(path1).path(path2).build(new Object[]{"x/y"}, false);
+        assertEquals(uri.toString(), expected);        
+    }
     
     @Test
     public void testNullSegment() {