Fix for #74. Replace self link building with calls to EntityLinks instance.

This commit is contained in:
Jon Brisbin
2013-03-06 08:25:55 -06:00
parent 35a4846590
commit 5f21071a5e
4 changed files with 143 additions and 115 deletions

View File

@@ -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<Object>(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);

View File

@@ -79,8 +79,11 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes
List<Resource<?>> resources = new ArrayList<Resource<?>>();
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<Object>(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;

View File

@@ -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<Link> links) {
UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseUri);
// Add existing query parameters
addQueryParameters(request, builder);
void addNextLink(Page page, List<Link> 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<Link> links) {
UriComponentsBuilder builder = UriComponentsBuilder.fromUri(baseUri);
// Add existing query parameters
addQueryParameters(request, builder);
void addPrevLink(Page page, List<Link> 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<String> 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<String> 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);
}
}
}

View File

@@ -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)