diff --git a/src/main/java/org/springframework/hateoas/LinkBuilder.java b/src/main/java/org/springframework/hateoas/LinkBuilder.java index d854ff9f..88b72e3e 100644 --- a/src/main/java/org/springframework/hateoas/LinkBuilder.java +++ b/src/main/java/org/springframework/hateoas/LinkBuilder.java @@ -25,7 +25,8 @@ import java.net.URI; public interface LinkBuilder { /** - * Adds the given object's {@link String} representation as sub-resource to the current URI. + * Adds the given object's {@link String} representation as sub-resource to the current URI. Will unwrap + * {@link Identifiable}s to their id value (see {@link Identifiable#getId()}). * * @param object * @return diff --git a/src/main/java/org/springframework/hateoas/mvc/UriComponentsLinkBuilder.java b/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java similarity index 86% rename from src/main/java/org/springframework/hateoas/mvc/UriComponentsLinkBuilder.java rename to src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java index 51e0ac27..e7c64406 100644 --- a/src/main/java/org/springframework/hateoas/mvc/UriComponentsLinkBuilder.java +++ b/src/main/java/org/springframework/hateoas/core/LinkBuilderSupport.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.hateoas.mvc; +package org.springframework.hateoas.core; import java.net.URI; @@ -31,16 +31,16 @@ import org.springframework.web.util.UriComponentsBuilder; * @author Ricardo Gladwell * @author Oliver Gierke */ -public abstract class UriComponentsLinkBuilder implements LinkBuilder { +public abstract class LinkBuilderSupport implements LinkBuilder { private final UriComponents uriComponents; /** - * Creates a new {@link UriComponentsLinkBuilder} using the given {@link UriComponentsBuilder}. + * Creates a new {@link LinkBuilderSupport} using the given {@link UriComponentsBuilder}. * * @param builder must not be {@literal null}. */ - public UriComponentsLinkBuilder(UriComponentsBuilder builder) { + public LinkBuilderSupport(UriComponentsBuilder builder) { Assert.notNull(builder); this.uriComponents = builder.build(); @@ -56,6 +56,10 @@ public abstract class UriComponentsLinkBuilder implements return getThis(); } + if (object instanceof Identifiable) { + return slash((Identifiable) object); + } + String[] segments = StringUtils.tokenizeToStringArray(object.toString(), "/"); return createNewInstance(UriComponentsBuilder.fromUri(uriComponents.toUri()).pathSegment(segments)); } @@ -64,10 +68,10 @@ public abstract class UriComponentsLinkBuilder implements * (non-Javadoc) * @see org.springframework.hateoas.LinkBuilder#slash(org.springframework.hateoas.Identifiable) */ - public LinkBuilder slash(Identifiable identifyable) { + public T slash(Identifiable identifyable) { if (identifyable == null) { - return this; + return getThis(); } return slash(identifyable.getId()); diff --git a/src/main/java/org/springframework/hateoas/jaxrs/JaxRsLinkBuilder.java b/src/main/java/org/springframework/hateoas/jaxrs/JaxRsLinkBuilder.java index 9c0144ad..9352586f 100644 --- a/src/main/java/org/springframework/hateoas/jaxrs/JaxRsLinkBuilder.java +++ b/src/main/java/org/springframework/hateoas/jaxrs/JaxRsLinkBuilder.java @@ -19,7 +19,7 @@ import javax.ws.rs.Path; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.hateoas.LinkBuilder; -import org.springframework.hateoas.mvc.UriComponentsLinkBuilder; +import org.springframework.hateoas.core.LinkBuilderSupport; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriTemplate; @@ -29,7 +29,7 @@ import org.springframework.web.util.UriTemplate; * * @author Oliver Gierke */ -public class JaxRsLinkBuilder extends UriComponentsLinkBuilder { +public class JaxRsLinkBuilder extends LinkBuilderSupport { /** * Creates a new {@link JaxRsLinkBuilder} from the given {@link UriComponentsBuilder}. diff --git a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java index a0cae63a..f595a1cb 100755 --- a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java +++ b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilder.java @@ -17,6 +17,7 @@ package org.springframework.hateoas.mvc; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.hateoas.Link; +import org.springframework.hateoas.core.LinkBuilderSupport; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; @@ -28,7 +29,7 @@ import org.springframework.web.util.UriTemplate; * * @author Oliver Gierke */ -public class ControllerLinkBuilder extends UriComponentsLinkBuilder { +public class ControllerLinkBuilder extends LinkBuilderSupport { /** * Creates a new {@link ControllerLinkBuilder} using the given {@link UriComponentsBuilder}. diff --git a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilderFactory.java b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilderFactory.java index 44027230..60cc353d 100644 --- a/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilderFactory.java +++ b/src/main/java/org/springframework/hateoas/mvc/ControllerLinkBuilderFactory.java @@ -16,9 +16,10 @@ package org.springframework.hateoas.mvc; import org.springframework.hateoas.LinkBuilderFactory; +import org.springframework.hateoas.core.LinkBuilderSupport; /** - * Factory for {@link UriComponentsLinkBuilder} instances based on the request mapping annotated on the given + * Factory for {@link LinkBuilderSupport} instances based on the request mapping annotated on the given * controller. * * @author Ricardo Gladwell diff --git a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java index d6370637..88b749f9 100644 --- a/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java @@ -95,7 +95,7 @@ public class ControllerLinkBuilderUnitTest extends TestUtils { assertThat(link.getHref(), Matchers.endsWith("/people")); } - class Person implements Identifiable { + static class Person implements Identifiable { Long id;