diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryEntityController.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryEntityController.java index c9836d565..9206b6032 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryEntityController.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryEntityController.java @@ -111,9 +111,14 @@ public class RepositoryEntityController extends AbstractRepositoryRestController } for(Object o : results) { + BeanWrapper wrapper = BeanWrapper.create(o, conversionService); + Link selfLink = entityLinks.linkForSingleResource(repoRequest.getPersistentEntity().getType(), + wrapper.getProperty(repoRequest.getPersistentEntity() + .getIdProperty())) + .withSelfRel(); resources.add(new PersistentEntityResource(repoRequest.getPersistentEntity(), o, - repoRequest.buildEntitySelfLink(o, conversionService)) + selfLink) .setBaseUri(repoRequest.getBaseUri())); } @@ -172,7 +177,11 @@ public class RepositoryEntityController extends AbstractRepositoryRestController Object obj = repoMethodInvoker.save(incoming.getContent()); applicationContext.publishEvent(new AfterCreateEvent(obj)); - Link selfLink = repoRequest.buildEntitySelfLink(obj, conversionService); + BeanWrapper wrapper = BeanWrapper.create(obj, conversionService); + Link selfLink = entityLinks.linkForSingleResource(repoRequest.getPersistentEntity().getType(), + wrapper.getProperty(repoRequest.getPersistentEntity() + .getIdProperty())) + .withSelfRel(); HttpHeaders headers = new HttpHeaders(); headers.setLocation(URI.create(selfLink.getHref())); @@ -220,7 +229,12 @@ public class RepositoryEntityController extends AbstractRepositoryRestController PersistentEntityResource per = PersistentEntityResource.wrap(repoRequest.getPersistentEntity(), domainObj, repoRequest.getBaseUri()); - per.add(repoRequest.buildEntitySelfLink(domainObj, conversionService)); + BeanWrapper wrapper = BeanWrapper.create(domainObj, conversionService); + Link selfLink = entityLinks.linkForSingleResource(repoRequest.getPersistentEntity().getType(), + wrapper.getProperty(repoRequest.getPersistentEntity() + .getIdProperty())) + .withSelfRel(); + per.add(selfLink); return per; } @@ -267,7 +281,12 @@ public class RepositoryEntityController extends AbstractRepositoryRestController PersistentEntityResource per = PersistentEntityResource.wrap(repoRequest.getPersistentEntity(), obj, repoRequest.getBaseUri()); - per.add(repoRequest.buildEntitySelfLink(obj, conversionService)); + BeanWrapper wrapper = BeanWrapper.create(obj, conversionService); + Link selfLink = entityLinks.linkForSingleResource(repoRequest.getPersistentEntity().getType(), + wrapper.getProperty(repoRequest.getPersistentEntity() + .getIdProperty())) + .withSelfRel(); + per.add(selfLink); return resourceResponse(null, per, HttpStatus.OK); diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryPropertyReferenceController.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryPropertyReferenceController.java index 3cc04540c..cc7792861 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryPropertyReferenceController.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryPropertyReferenceController.java @@ -79,8 +79,11 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes List> resources = new ArrayList>(); PersistentEntity entity = repositories.getPersistentEntity(prop.propertyType); for(Object obj : ((Iterable)prop.propertyValue)) { + BeanWrapper wrapper = BeanWrapper.create(obj, conversionService); PersistentEntityResource per = PersistentEntityResource.wrap(entity, obj, repoRequest.getBaseUri()); - Link selfLink = repoRequest.buildEntitySelfLink(obj, conversionService); + Link selfLink = entityLinks.linkForSingleResource(entity.getType(), + wrapper.getProperty(entity.getIdProperty())) + .withSelfRel(); per.add(selfLink); resources.add(per); } @@ -93,7 +96,10 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes PersistentEntityResource per = PersistentEntityResource.wrap(entity, entry.getValue(), repoRequest.getBaseUri()); - Link selfLink = repoRequest.buildEntitySelfLink(entry.getValue(), conversionService); + BeanWrapper wrapper = BeanWrapper.create(entry.getValue(), conversionService); + Link selfLink = entityLinks.linkForSingleResource(entity.getType(), + wrapper.getProperty(entity.getIdProperty())) + .withSelfRel(); per.add(selfLink); resources.put(entry.getKey(), per); } @@ -103,9 +109,11 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes PersistentEntityResource per = PersistentEntityResource.wrap(repositories.getPersistentEntity(prop.propertyType), prop.propertyValue, repoRequest.getBaseUri()); - Link selfLink = repoRequest.buildEntitySelfLink(prop.propertyValue, conversionService); + BeanWrapper wrapper = BeanWrapper.create(prop.propertyValue, conversionService); + Link selfLink = entityLinks.linkForSingleResource(prop.propertyType, + wrapper.getProperty(prop.entity.getIdProperty())) + .withSelfRel(); per.add(selfLink); - headers.set("Content-Location", selfLink.getHref()); return new Resource(per); @@ -146,7 +154,7 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes String sId = propValWrapper.getProperty(prop.entity.getIdProperty()).toString(); if(propertyId.equals(sId)) { PersistentEntityResource per = PersistentEntityResource.wrap(entity, obj, repoRequest.getBaseUri()); - Link selfLink = repoRequest.buildEntitySelfLink(obj, conversionService); + Link selfLink = entityLinks.linkForSingleResource(entity.getType(), sId).withSelfRel(); per.add(selfLink); headers.set("Content-Location", selfLink.getHref()); return per; @@ -161,7 +169,7 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes PersistentEntityResource per = PersistentEntityResource.wrap(entity, entry.getValue(), repoRequest.getBaseUri()); - Link selfLink = repoRequest.buildEntitySelfLink(entry.getValue(), conversionService); + Link selfLink = entityLinks.linkForSingleResource(entity.getType(), sId).withSelfRel(); per.add(selfLink); headers.set("Content-Location", selfLink.getHref()); return per; diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestRequest.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestRequest.java index 00943fc6d..10bb300fa 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestRequest.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositoryRestRequest.java @@ -8,10 +8,8 @@ import java.util.Enumeration; import java.util.List; import javax.servlet.http.HttpServletRequest; -import org.springframework.core.convert.ConversionService; import org.springframework.data.domain.Page; import org.springframework.data.mapping.PersistentEntity; -import org.springframework.data.mapping.model.BeanWrapper; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.support.Repositories; import org.springframework.data.rest.config.RepositoryRestConfiguration; @@ -26,125 +24,118 @@ import org.springframework.web.util.UriComponentsBuilder; */ class RepositoryRestRequest { - private final RepositoryRestConfiguration config; - private final HttpServletRequest request; - private final PagingAndSorting pagingAndSorting; - private final URI baseUri; - private final RepositoryInformation repoInfo; - private final ResourceMapping repoMapping; - private final Link repoLink; - private final Object repository; - private final RepositoryMethodInvoker repoMethodInvoker; - private final PersistentEntity persistentEntity; - private final ResourceMapping entityMapping; + private final RepositoryRestConfiguration config; + private final HttpServletRequest request; + private final PagingAndSorting pagingAndSorting; + private final URI baseUri; + private final RepositoryInformation repoInfo; + private final ResourceMapping repoMapping; + private final Link repoLink; + private final Object repository; + private final RepositoryMethodInvoker repoMethodInvoker; + private final PersistentEntity persistentEntity; + private final ResourceMapping entityMapping; - public RepositoryRestRequest(RepositoryRestConfiguration config, - Repositories repositories, - HttpServletRequest request, - PagingAndSorting pagingAndSorting, - URI baseUri, - RepositoryInformation repoInfo) { - this.config = config; - this.request = request; - this.pagingAndSorting = pagingAndSorting; - this.baseUri = baseUri; - this.repoInfo = repoInfo; - this.repoMapping = getResourceMapping(config, repoInfo); - if(null == repoMapping) { - this.repoLink = null; - this.repository = null; - this.repoMethodInvoker = null; - this.persistentEntity = null; - this.entityMapping = null; - } else { - this.repoLink = new Link(buildUri(baseUri, repoMapping.getPath()).toString(), repoMapping.getRel()); - this.repository = repositories.getRepositoryFor(repoInfo.getDomainType()); - this.persistentEntity = repositories.getPersistentEntity(repoInfo.getDomainType()); - this.repoMethodInvoker = new RepositoryMethodInvoker(repository, repoInfo, persistentEntity); - this.entityMapping = getResourceMapping(config, persistentEntity); - } - } + public RepositoryRestRequest(RepositoryRestConfiguration config, + Repositories repositories, + HttpServletRequest request, + PagingAndSorting pagingAndSorting, + URI baseUri, + RepositoryInformation repoInfo) { + this.config = config; + this.request = request; + this.pagingAndSorting = pagingAndSorting; + this.baseUri = baseUri; + this.repoInfo = repoInfo; + this.repoMapping = getResourceMapping(config, repoInfo); + if(null == repoMapping) { + this.repoLink = null; + this.repository = null; + this.repoMethodInvoker = null; + this.persistentEntity = null; + this.entityMapping = null; + } else { + this.repoLink = new Link(buildUri(baseUri, repoMapping.getPath()).toString(), repoMapping.getRel()); + this.repository = repositories.getRepositoryFor(repoInfo.getDomainType()); + this.persistentEntity = repositories.getPersistentEntity(repoInfo.getDomainType()); + this.repoMethodInvoker = new RepositoryMethodInvoker(repository, repoInfo, persistentEntity); + this.entityMapping = getResourceMapping(config, persistentEntity); + } + } - HttpServletRequest getRequest() { - return request; - } + HttpServletRequest getRequest() { + return request; + } - PagingAndSorting getPagingAndSorting() { - return pagingAndSorting; - } + PagingAndSorting getPagingAndSorting() { + return pagingAndSorting; + } - URI getBaseUri() { - return baseUri; - } + URI getBaseUri() { + return baseUri; + } - RepositoryInformation getRepositoryInformation() { - return repoInfo; - } + RepositoryInformation getRepositoryInformation() { + return repoInfo; + } - ResourceMapping getRepositoryResourceMapping() { - return repoMapping; - } + ResourceMapping getRepositoryResourceMapping() { + return repoMapping; + } - Link getRepositoryLink() { - return repoLink; - } + Link getRepositoryLink() { + return repoLink; + } - Object getRepository() { - return repository; - } + Object getRepository() { + return repository; + } - RepositoryMethodInvoker getRepositoryMethodInvoker() { - return repoMethodInvoker; - } + RepositoryMethodInvoker getRepositoryMethodInvoker() { + return repoMethodInvoker; + } - PersistentEntity getPersistentEntity() { - return persistentEntity; - } + PersistentEntity getPersistentEntity() { + return persistentEntity; + } - ResourceMapping getPersistentEntityResourceMapping() { - return entityMapping; - } + ResourceMapping getPersistentEntityResourceMapping() { + return entityMapping; + } - void addNextLink(Page page, List links) { - UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseUri); - // Add existing query parameters - addQueryParameters(request, builder); + void addNextLink(Page page, List links) { + UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseUri); + // Add existing query parameters + addQueryParameters(request, builder); - builder.queryParam(config.getPageParamName(), page.getNumber() + 1) - .queryParam(config.getLimitParamName(), pagingAndSorting.getPageSize()); + builder.queryParam(config.getPageParamName(), page.getNumber() + 1) + .queryParam(config.getLimitParamName(), pagingAndSorting.getPageSize()); - links.add(new Link(builder.build().toString(), "page.next")); - } + links.add(new Link(builder.build().toString(), "page.next")); + } - void addPrevLink(Page page, List links) { - UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseUri); - // Add existing query parameters - addQueryParameters(request, builder); + void addPrevLink(Page page, List links) { + UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseUri); + // Add existing query parameters + addQueryParameters(request, builder); - builder.queryParam(config.getPageParamName(), page.getNumber() - 1) - .queryParam(config.getLimitParamName(), pagingAndSorting.getPageSize()); + builder.queryParam(config.getPageParamName(), page.getNumber() - 1) + .queryParam(config.getLimitParamName(), pagingAndSorting.getPageSize()); - links.add(new Link(builder.build().toString(), "page.previous")); - } + links.add(new Link(builder.build().toString(), "page.previous")); + } - @SuppressWarnings({"unchecked"}) Link buildEntitySelfLink(Object o, ConversionService conversionService) { - BeanWrapper bean = BeanWrapper.create(o, conversionService); - Object id = bean.getProperty(persistentEntity.getIdProperty()); - URI uri = buildUri(baseUri, repoMapping.getPath(), id.toString()); - return new Link(uri.toString(), "self"); - } + private void addQueryParameters(HttpServletRequest request, + UriComponentsBuilder builder) { + for(Enumeration names = request.getParameterNames(); names.hasMoreElements(); ) { + String name = names.nextElement(); + String value = request.getParameter(name); + if(name.equals(config.getPageParamName()) || name.equals(config.getLimitParamName())) { + continue; + } - private void addQueryParameters(HttpServletRequest request, - UriComponentsBuilder builder) { - for(Enumeration names = request.getParameterNames(); names.hasMoreElements(); ) { - String name = names.nextElement(); - String value = request.getParameter(name); - if(name.equals(config.getPageParamName()) || name.equals(config.getLimitParamName())) { - continue; - } - - builder.queryParam(name, value); - } - } + builder.queryParam(name, value); + } + } } diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositorySearchController.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositorySearchController.java index 234e23d32..69393db9b 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositorySearchController.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/RepositorySearchController.java @@ -13,6 +13,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.mapping.PersistentEntity; +import org.springframework.data.mapping.model.BeanWrapper; import org.springframework.data.repository.support.DomainClassConverter; import org.springframework.data.repository.support.Repositories; import org.springframework.data.rest.config.RepositoryRestConfiguration; @@ -152,7 +153,12 @@ public class RepositorySearchController extends AbstractRepositoryRestController PersistentEntityResource per = PersistentEntityResource.wrap(repoRequest.getPersistentEntity(), result, repoRequest.getBaseUri()); - per.add(repoRequest.buildEntitySelfLink(result, conversionService)); + BeanWrapper wrapper = BeanWrapper.create(result, conversionService); + Link selfLink = entityLinks.linkForSingleResource(result.getClass(), + wrapper.getProperty(repoRequest.getPersistentEntity() + .getIdProperty())) + .withSelfRel(); + per.add(selfLink); resources = per; } resources.setBaseUri(repoRequest.getBaseUri()) @@ -209,8 +215,12 @@ public class RepositorySearchController extends AbstractRepositoryRestController continue; } + BeanWrapper wrapper = BeanWrapper.create(obj, conversionService); PersistentEntityResource per = PersistentEntityResource.wrap(persistentEntity, obj, repoRequest.getBaseUri()); - per.add(repoRequest.buildEntitySelfLink(obj, conversionService)); + Link selfLink = entityLinks.linkForSingleResource(persistentEntity.getType(), + wrapper.getProperty(persistentEntity.getIdProperty())) + .withSelfRel(); + per.add(selfLink); resources.add(per); } return new BaseUriAwareResource(resources)