Fix for #74. Replace self link building with calls to EntityLinks instance.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user