From 128ac9c191114693ed57512f186430efd1e75b20 Mon Sep 17 00:00:00 2001 From: mst-avaleo Date: Fri, 23 Oct 2020 16:39:48 +0200 Subject: [PATCH] Optimized LinkBuilder.slash() method for identifiers only --- .../hateoas/server/LinkBuilder.java | 10 +++++++++ .../server/core/AbstractEntityLinks.java | 2 +- .../server/core/ControllerEntityLinks.java | 2 +- .../server/core/LinkBuilderSupport.java | 21 ++++++++++++++++++- .../RepresentationModelAssemblerSupport.java | 2 +- 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/server/LinkBuilder.java b/src/main/java/org/springframework/hateoas/server/LinkBuilder.java index face8987a..68d12b738 100644 --- a/src/main/java/org/springframework/hateoas/server/LinkBuilder.java +++ b/src/main/java/org/springframework/hateoas/server/LinkBuilder.java @@ -38,6 +38,16 @@ public interface LinkBuilder { */ LinkBuilder slash(@Nullable Object object); + /** + * Adds {@link String} representation of the given object as identifier of an item resource + * from the current collection resource. + * + * This method is an optimized version of {@link #slash(Object)} mean to be used only for identifiers. + * + * @param id can be {@literal null}. + */ + LinkBuilder slashId(@Nullable Object id); + /** * Creates a URI of the link built by the current builder instance. * diff --git a/src/main/java/org/springframework/hateoas/server/core/AbstractEntityLinks.java b/src/main/java/org/springframework/hateoas/server/core/AbstractEntityLinks.java index e1e8dcc1a..a9f8d5f42 100644 --- a/src/main/java/org/springframework/hateoas/server/core/AbstractEntityLinks.java +++ b/src/main/java/org/springframework/hateoas/server/core/AbstractEntityLinks.java @@ -32,6 +32,6 @@ public abstract class AbstractEntityLinks implements EntityLinks { */ @Override public LinkBuilder linkForItemResource(Class type, Object id) { - return linkFor(type).slash(id); + return linkFor(type).slashId(id); } } diff --git a/src/main/java/org/springframework/hateoas/server/core/ControllerEntityLinks.java b/src/main/java/org/springframework/hateoas/server/core/ControllerEntityLinks.java index 492f19339..75cb37401 100644 --- a/src/main/java/org/springframework/hateoas/server/core/ControllerEntityLinks.java +++ b/src/main/java/org/springframework/hateoas/server/core/ControllerEntityLinks.java @@ -133,7 +133,7 @@ public Link linkToCollectionResource(Class entity) { */ @Override public Link linkToItemResource(Class entity, Object id) { - return linkFor(entity).slash(id).withSelfRel(); + return linkFor(entity).slashId(id).withSelfRel(); } /* diff --git a/src/main/java/org/springframework/hateoas/server/core/LinkBuilderSupport.java b/src/main/java/org/springframework/hateoas/server/core/LinkBuilderSupport.java index 5b335fa64..87abb5e45 100644 --- a/src/main/java/org/springframework/hateoas/server/core/LinkBuilderSupport.java +++ b/src/main/java/org/springframework/hateoas/server/core/LinkBuilderSupport.java @@ -76,7 +76,7 @@ protected LinkBuilderSupport(UriComponents components, List affordan */ public T slash(@Nullable Object object) { - object = object instanceof Optional ? ((Optional) object).orElse(null) : object; + object = unwrapPotentialOptional(object); if (object == null) { return getThis(); @@ -97,6 +97,25 @@ public T slash(@Nullable Object object) { return slash(UriComponentsBuilder.fromUriString(path).build(), false); } + public T slashId(@Nullable Object id) { + + id = unwrapPotentialOptional(id); + + if (id == null) { + return getThis(); + } + + UriComponentsBuilder builder = UriComponentsBuilder.newInstance().uriComponents(this.components); + builder.pathSegment(encodePath(id)); + + return createNewInstance(builder.build(), affordances); + } + + @Nullable + private Object unwrapPotentialOptional(@Nullable Object id) { + return id instanceof Optional ? ((Optional) id).orElse(null) : id; + } + protected T slash(UriComponents components, boolean encoded) { UriComponentsBuilder builder = UriComponentsBuilder.newInstance().uriComponents(this.components); diff --git a/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelAssemblerSupport.java b/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelAssemblerSupport.java index d7d5acae8..a331d92ad 100755 --- a/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelAssemblerSupport.java +++ b/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelAssemblerSupport.java @@ -95,7 +95,7 @@ protected D createModelWithId(Object id, T entity, Object... parameters) { Assert.notNull(id, "Id must not be null!"); D instance = instantiateModel(entity); - instance.add(linkTo(this.controllerClass, parameters).slash(id).withSelfRel()); + instance.add(linkTo(this.controllerClass, parameters).slashId(id).withSelfRel()); return instance; }