/* * Copyright 2012-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.data.rest.webmvc; 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; import org.springframework.util.Assert; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; /** * @author Jon Brisbin * @author Oliver Gierke * @author Thibaud Lepretre */ @SuppressWarnings({ "rawtypes" }) class AbstractRepositoryRestController { private static final EmbeddedWrappers WRAPPERS = new EmbeddedWrappers(false); private final PagedResourcesAssembler<Object> pagedResourcesAssembler; /** * Creates a new {@link AbstractRepositoryRestController} for the given {@link PagedResourcesAssembler} and * {@link AuditableBeanWrapperFactory}. * * @param pagedResourcesAssembler must not be {@literal null}. */ public AbstractRepositoryRestController(PagedResourcesAssembler<Object> pagedResourcesAssembler) { Assert.notNull(pagedResourcesAssembler, "PagedResourcesAssembler must not be null!"); this.pagedResourcesAssembler = pagedResourcesAssembler; } protected Link resourceLink(RootResourceInformation resourceLink, Resource resource) { ResourceMetadata repoMapping = resourceLink.getResourceMetadata(); Link selfLink = resource.getLink("self"); String rel = repoMapping.getItemResourceRel(); return new Link(selfLink.getHref(), rel); } @SuppressWarnings({ "unchecked" }) protected Resources<?> toResources(Iterable<?> source, PersistentEntityResourceAssembler assembler, Class<?> domainType, Optional<Link> baseLink) { if (source instanceof Page) { Page<Object> page = (Page<Object>) source; return entitiesToResources(page, assembler, domainType, baseLink); } else if (source instanceof Iterable) { return entitiesToResources((Iterable<Object>) source, assembler, domainType); } else { return new Resources(EMPTY_RESOURCE_LIST); } } protected Resources<?> entitiesToResources(Page<Object> page, PersistentEntityResourceAssembler assembler, Class<?> domainType, Optional<Link> baseLink) { if (page.getContent().isEmpty()) { return baseLink.<PagedResources<?>> map(it -> pagedResourcesAssembler.toEmptyResource(page, domainType, it))// .orElseGet(() -> pagedResourcesAssembler.toEmptyResource(page, domainType)); } return baseLink.map(it -> pagedResourcesAssembler.toResource(page, assembler, it))// .orElseGet(() -> pagedResourcesAssembler.toResource(page, assembler)); } protected Resources<?> entitiesToResources(Iterable<Object> entities, PersistentEntityResourceAssembler assembler, Class<?> domainType) { if (!entities.iterator().hasNext()) { List<Object> content = Arrays.<Object> asList(WRAPPERS.emptyCollectionOf(domainType)); return new Resources<Object>(content, getDefaultSelfLink()); } List<Resource<Object>> resources = new ArrayList<Resource<Object>>(); for (Object obj : entities) { resources.add(obj == null ? null : assembler.toResource(obj)); } return new Resources<Resource<Object>>(resources, getDefaultSelfLink()); } protected Link getDefaultSelfLink() { return new Link(ServletUriComponentsBuilder.fromCurrentRequest().build().toUriString()); } }