DATAREST-1055 - Move to Optional for base link handling in repository controllers.

This commit is contained in:
Oliver Gierke
2017-04-18 13:20:18 +02:00
parent 2a2c4154be
commit 2ebc688631
4 changed files with 14 additions and 11 deletions

View File

@@ -20,12 +20,14 @@ import static org.springframework.data.rest.webmvc.ControllerUtils.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.springframework.data.auditing.AuditableBeanWrapperFactory;
import org.springframework.data.domain.Page;
import org.springframework.data.rest.core.mapping.ResourceMetadata;
import org.springframework.data.web.PagedResourcesAssembler;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.Resource;
import org.springframework.hateoas.Resources;
import org.springframework.hateoas.core.EmbeddedWrappers;
@@ -69,7 +71,7 @@ class AbstractRepositoryRestController {
@SuppressWarnings({ "unchecked" })
protected Resources<?> toResources(Iterable<?> source, PersistentEntityResourceAssembler assembler,
Class<?> domainType, Link baseLink) {
Class<?> domainType, Optional<Link> baseLink) {
if (source instanceof Page) {
Page<Object> page = (Page<Object>) source;
@@ -82,14 +84,15 @@ class AbstractRepositoryRestController {
}
protected Resources<?> entitiesToResources(Page<Object> page, PersistentEntityResourceAssembler assembler,
Class<?> domainType, Link baseLink) {
Class<?> domainType, Optional<Link> baseLink) {
if (page.getContent().isEmpty()) {
return pagedResourcesAssembler.toEmptyResource(page, domainType, baseLink);
return baseLink.<PagedResources<?>> map(it -> pagedResourcesAssembler.toEmptyResource(page, domainType, it))//
.orElseGet(() -> pagedResourcesAssembler.toEmptyResource(page, domainType));
}
return baseLink == null ? pagedResourcesAssembler.toResource(page, assembler)
: pagedResourcesAssembler.toResource(page, assembler, baseLink);
return baseLink.map(it -> pagedResourcesAssembler.toResource(page, assembler, it))//
.orElseGet(() -> pagedResourcesAssembler.toResource(page, assembler));
}
protected Resources<?> entitiesToResources(Iterable<Object> entities, PersistentEntityResourceAssembler assembler,

View File

@@ -203,8 +203,8 @@ class RepositoryEntityController extends AbstractRepositoryRestController implem
: invoker.invokeFindAll(sort);
ResourceMetadata metadata = resourceInformation.getResourceMetadata();
Link baseLink = entityLinks.linkToPagedResource(resourceInformation.getDomainType(),
pageable.isDefault() ? null : pageable.getPageable());
Optional<Link> baseLink = Optional.of(entityLinks.linkToPagedResource(resourceInformation.getDomainType(),
pageable.isDefault() ? null : pageable.getPageable()));
Resources<?> result = toResources(results, assembler, metadata.getDomainType(), baseLink);
result.add(getCollectionResourceLinks(resourceInformation, pageable));

View File

@@ -119,7 +119,7 @@ class RepositoryPropertyReferenceController extends AbstractRepositoryRestContro
if (prop.property.isCollectionLike()) {
return toResources((Iterable<?>) it, assembler, prop.propertyType, null);
return toResources((Iterable<?>) it, assembler, prop.propertyType, Optional.empty());
} else if (prop.property.isMap()) {

View File

@@ -187,7 +187,7 @@ class RepositorySearchController extends AbstractRepositoryRestController {
MethodResourceMapping methodMapping = searchMappings.getExportedMethodMappingForPath(search);
Class<?> domainType = methodMapping.getReturnedDomainType();
return toResource(result, assembler, domainType, null, headers, resourceInformation);
return toResource(result, assembler, domainType, Optional.empty(), headers, resourceInformation);
}
/**
@@ -201,7 +201,7 @@ class RepositorySearchController extends AbstractRepositoryRestController {
* @return
*/
protected ResponseEntity<?> toResource(Optional<Object> source, final PersistentEntityResourceAssembler assembler,
Class<?> domainType, Link baseLink, HttpHeaders headers, RootResourceInformation information) {
Class<?> domainType, Optional<Link> baseLink, HttpHeaders headers, RootResourceInformation information) {
return source.map(it -> {
@@ -243,7 +243,7 @@ class RepositorySearchController extends AbstractRepositoryRestController {
Optional<Object> result = executeQueryMethod(resourceInformation.getInvoker(), parameters, method, pageable, sort,
assembler);
ResourceMetadata metadata = resourceInformation.getResourceMetadata();
ResponseEntity<?> entity = toResource(result, assembler, metadata.getDomainType(), null, headers,
ResponseEntity<?> entity = toResource(result, assembler, metadata.getDomainType(), Optional.empty(), headers,
resourceInformation);
Object resource = entity.getBody();