Browse Source
This change introduces a strategy for expanding a URI template into a URI and makes it a property of the RestTemplate and AsyncRestTemplate so that they can be pre-configured with such a strategy. The DefaultUriTemplateHandler relies on UriComponentsBuilder internally and provides functionality equivalent to using the UriTemplate. A DefaultUriTemplateHandler can also be configured to parse the path of a URI template into path segments in order to allow expanding URI variables according to path segment encoding rules. Issue: SPR-12750pull/763/merge
6 changed files with 270 additions and 7 deletions
@ -0,0 +1,80 @@
@@ -0,0 +1,80 @@
|
||||
/* |
||||
* Copyright 2002-2015 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.web.util; |
||||
|
||||
import java.net.URI; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* Default implementation of {@link UriTemplateHandler} that relies on |
||||
* {@link UriComponentsBuilder} internally. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 4.2 |
||||
*/ |
||||
public class DefaultUriTemplateHandler implements UriTemplateHandler { |
||||
|
||||
private boolean parsePath; |
||||
|
||||
|
||||
/** |
||||
* Whether to parse the path of a URI template string into path segments. |
||||
* <p>If set to {@code true} the path of parsed URI templates is decomposed |
||||
* into path segments so that URI variables expanded into the path are |
||||
* treated according to path segment encoding rules. In effect that means the |
||||
* "/" character is percent encoded. |
||||
* <p>By default this is set to {@code false} in which case the path is kept |
||||
* as a full path and expanded URI variables will preserve "/" characters. |
||||
* @param parsePath whether to parse the path into path segments |
||||
*/ |
||||
public void setParsePath(boolean parsePath) { |
||||
this.parsePath = parsePath; |
||||
} |
||||
|
||||
/** |
||||
* Whether the handler is configured to parse the path into path segments. |
||||
*/ |
||||
public boolean shouldParsePath() { |
||||
return this.parsePath; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public URI expand(String uriTemplate, Map<String, ?> uriVariables) { |
||||
UriComponentsBuilder builder = initBuilder(uriTemplate); |
||||
return builder.build().expand(uriVariables).encode().toUri(); |
||||
} |
||||
|
||||
@Override |
||||
public URI expand(String uriTemplate, Object... uriVariableValues) { |
||||
UriComponentsBuilder builder = initBuilder(uriTemplate); |
||||
return builder.build().expand(uriVariableValues).encode().toUri(); |
||||
} |
||||
|
||||
protected UriComponentsBuilder initBuilder(String uriTemplate) { |
||||
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(uriTemplate); |
||||
if (shouldParsePath()) { |
||||
List<String> pathSegments = builder.build().getPathSegments(); |
||||
builder.replacePath(null); |
||||
for (String pathSegment : pathSegments) { |
||||
builder.pathSegment(pathSegment); |
||||
} |
||||
} |
||||
return builder; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
/* |
||||
* Copyright 2002-2015 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.web.util; |
||||
|
||||
import java.net.URI; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* A strategy for expanding a URI template with URI variables into a {@link URI}. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 4.2 |
||||
*/ |
||||
public interface UriTemplateHandler { |
||||
|
||||
/** |
||||
* Expand the give URI template with a map of URI variables. |
||||
* @param uriTemplate the URI template string |
||||
* @param uriVariables the URI variables |
||||
* @return the resulting URI |
||||
*/ |
||||
URI expand(String uriTemplate, Map<String, ?> uriVariables); |
||||
|
||||
/** |
||||
* Expand the give URI template with an array of URI variable values. |
||||
* @param uriTemplate the URI template string |
||||
* @param uriVariableValues the URI variable values |
||||
* @return the resulting URI |
||||
*/ |
||||
URI expand(String uriTemplate, Object... uriVariableValues); |
||||
|
||||
} |
||||
@ -0,0 +1,70 @@
@@ -0,0 +1,70 @@
|
||||
/* |
||||
* Copyright 2002-2015 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.web.util; |
||||
|
||||
import static org.junit.Assert.assertEquals; |
||||
|
||||
import java.net.URI; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
|
||||
/** |
||||
* Unit tests for {@link DefaultUriTemplateHandler}. |
||||
* @author Rossen Stoyanchev |
||||
*/ |
||||
public class DefaultUriTemplateHandlerTests { |
||||
|
||||
private DefaultUriTemplateHandler handler; |
||||
|
||||
|
||||
@Before |
||||
public void setUp() throws Exception { |
||||
this.handler = new DefaultUriTemplateHandler(); |
||||
} |
||||
|
||||
|
||||
@Test |
||||
public void expandWithFullPath() throws Exception { |
||||
Map<String, String> vars = new HashMap<String, String>(2); |
||||
vars.put("hotel", "1"); |
||||
vars.put("publicpath", "pics/logo.png"); |
||||
String template = "http://example.com/hotels/{hotel}/pic/{publicpath}"; |
||||
|
||||
URI actual = this.handler.expand(template, vars); |
||||
|
||||
URI expected = new URI("http://example.com/hotels/1/pic/pics/logo.png"); |
||||
assertEquals("Invalid expanded template", expected, actual); |
||||
} |
||||
|
||||
@Test |
||||
public void expandWithFullPathParsedIntoPathSegments() throws Exception { |
||||
Map<String, String> vars = new HashMap<String, String>(2); |
||||
vars.put("hotel", "1"); |
||||
vars.put("publicpath", "pics/logo.png"); |
||||
vars.put("scale", "150x150"); |
||||
String template = "http://example.com/hotels/{hotel}/pic/{publicpath}/size/{scale}"; |
||||
|
||||
this.handler.setParsePath(true); |
||||
URI actual = this.handler.expand(template, vars); |
||||
|
||||
URI expected = new URI("http://example.com/hotels/1/pic/pics%2Flogo.png/size/150x150"); |
||||
assertEquals("Invalid expanded template", expected, actual); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue