Browse Source

Update port related code in UriComponentsBuilder

Use null to indicate no port has been provided.
Raise exception when port has not been expanded.

Issue: SPR-12123
pull/634/merge
Rossen Stoyanchev 12 years ago
parent
commit
a0b231d36d
  1. 9
      spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java
  2. 11
      spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java
  3. 42
      spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java

9
spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java

@ -109,6 +109,13 @@ final class HierarchicalUriComponents extends UriComponents {
@Override @Override
public int getPort() { public int getPort() {
if (this.port == null) {
return -1;
}
else if (this.port.contains("{")) {
throw new IllegalStateException(
"The port contains a URI variable but has not been expanded yet: " + this.port);
}
return Integer.parseInt(this.port); return Integer.parseInt(this.port);
} }
@ -360,7 +367,7 @@ final class HierarchicalUriComponents extends UriComponents {
if (this.host != null) { if (this.host != null) {
uriBuilder.append(host); uriBuilder.append(host);
} }
if (!"-1".equals(this.port)) { if (getPort() != -1) {
uriBuilder.append(':'); uriBuilder.append(':');
uriBuilder.append(port); uriBuilder.append(port);
} }

11
spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java

@ -96,7 +96,7 @@ public class UriComponentsBuilder {
private String host; private String host;
private String port = "-1"; private String port;
private CompositePathComponentBuilder pathBuilder = new CompositePathComponentBuilder(); private CompositePathComponentBuilder pathBuilder = new CompositePathComponentBuilder();
@ -272,7 +272,7 @@ public class UriComponentsBuilder {
return new OpaqueUriComponents(this.scheme, this.ssp, this.fragment); return new OpaqueUriComponents(this.scheme, this.ssp, this.fragment);
} }
else { else {
return new HierarchicalUriComponents(this.scheme, this.userInfo, this.host, String.valueOf(this.port), return new HierarchicalUriComponents(this.scheme, this.userInfo, this.host, this.port,
this.pathBuilder.build(), this.queryParams, this.fragment, encoded, true); this.pathBuilder.build(), this.queryParams, this.fragment, encoded, true);
} }
} }
@ -353,7 +353,7 @@ public class UriComponentsBuilder {
private void resetHierarchicalComponents() { private void resetHierarchicalComponents() {
this.userInfo = null; this.userInfo = null;
this.host = null; this.host = null;
this.port = "-1"; this.port = null;
this.pathBuilder = new CompositePathComponentBuilder(); this.pathBuilder = new CompositePathComponentBuilder();
this.queryParams.clear(); this.queryParams.clear();
} }
@ -468,8 +468,9 @@ public class UriComponentsBuilder {
} }
/** /**
* Set the URI port. Passing {@code "-1"} will clear the port of this builder. * Set the URI port. Use this method only when the port needs to be
* The given port may contain URI template variables. * parameterized with a URI variable. Otherwise use {@link #port(int)}.
* Passing {@code null} will clear the port of this builder.
* @param port the URI port * @param port the URI port
* @return this UriComponentsBuilder * @return this UriComponentsBuilder
*/ */

42
spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,6 +16,8 @@
package org.springframework.web.util; package org.springframework.web.util;
import org.junit.Test;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
@ -23,10 +25,12 @@ import java.io.ObjectOutputStream;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import org.junit.Test; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.not;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.springframework.web.util.UriComponentsBuilder.fromUriString;
/** /**
* @author Arjen Poutsma * @author Arjen Poutsma
@ -84,22 +88,18 @@ public class UriComponentsTests {
@Test @Test
public void port() { public void port() {
UriComponents uriComponents1 = UriComponentsBuilder.fromUriString( UriComponents uri1 = fromUriString("http://example.com:8080/bar").build();
"http://example.com:8080/bar").build(); UriComponents uri2 = fromUriString("http://example.com/bar").port(8080).build();
UriComponents uriComponents2 = UriComponentsBuilder.fromUriString( UriComponents uri3 = fromUriString("http://example.com/bar").port("{port}").build().expand(8080);
"http://example.com/bar").port(8080).build(); UriComponents uri4 = fromUriString("http://example.com/bar").port("808{digit}").build().expand(0);
UriComponents uriComponents3 = UriComponentsBuilder.fromUriString( assertEquals(8080, uri1.getPort());
"http://example.com/bar").port("{port}").build().expand(8080); assertEquals("http://example.com:8080/bar", uri1.toUriString());
UriComponents uriComponents4 = UriComponentsBuilder.fromUriString( assertEquals(8080, uri2.getPort());
"http://example.com/bar").port("808{digit}").build().expand(0); assertEquals("http://example.com:8080/bar", uri2.toUriString());
assertEquals(8080, uriComponents1.getPort()); assertEquals(8080, uri3.getPort());
assertEquals("http://example.com:8080/bar", uriComponents1.toUriString()); assertEquals("http://example.com:8080/bar", uri3.toUriString());
assertEquals(8080, uriComponents2.getPort()); assertEquals(8080, uri4.getPort());
assertEquals("http://example.com:8080/bar", uriComponents2.toUriString()); assertEquals("http://example.com:8080/bar", uri4.toUriString());
assertEquals(8080, uriComponents3.getPort());
assertEquals("http://example.com:8080/bar", uriComponents3.toUriString());
assertEquals(8080, uriComponents4.getPort());
assertEquals("http://example.com:8080/bar", uriComponents4.toUriString());
} }
@Test(expected = IllegalStateException.class) @Test(expected = IllegalStateException.class)

Loading…
Cancel
Save