Skip to content

Commit

Permalink
When fully-qualified links are enabled AND a path is specified for th…
Browse files Browse the repository at this point in the history
…e StoreRestResource SDR should return content
  • Loading branch information
paulcwarren committed May 7, 2020
1 parent 2a35cb3 commit 3a65a85
Show file tree
Hide file tree
Showing 9 changed files with 225 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m

// property content
} else {
return this.resolveProperty(HttpMethod.valueOf(webRequest.getNativeRequest(HttpServletRequest.class).getMethod()), this.getRepositories(), this.getStores(), pathSegments, (i, e, p, propertyIsEmbedded) -> {
return this.resolveProperty(HttpMethod.valueOf(webRequest.getNativeRequest(HttpServletRequest.class).getMethod()), this.getRepositories(), info, pathSegments, (i, e, p, propertyIsEmbedded) -> {

if (ContentStore.class.isAssignableFrom(info.getInterface())) {
if (propertyIsEmbedded) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package internal.org.springframework.content.rest.controllers;

import javax.persistence.Version;
import javax.servlet.http.HttpServletRequest;

import internal.org.springframework.content.rest.utils.ContentStoreUtils;

import org.springframework.content.commons.repository.AssociativeStore;
import org.springframework.content.commons.storeservice.ContentStoreInfo;
import org.springframework.content.commons.storeservice.ContentStoreService;
Expand All @@ -19,6 +15,9 @@
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.util.UrlPathHelper;

import javax.persistence.Version;
import javax.servlet.http.HttpServletRequest;

public class ResourceETagMethodArgumentResolver extends StoreHandlerMethodArgumentResolver {

public ResourceETagMethodArgumentResolver(RestConfiguration config, Repositories repositories, RepositoryInvokerFactory repoInvokerFactory, ContentStoreService stores) {
Expand Down Expand Up @@ -67,7 +66,7 @@ public Object resolveArgument(MethodParameter methodParameter, ModelAndViewConta
// property content
} else {
return resolveProperty(HttpMethod
.valueOf(nativeWebRequest.getNativeRequest(HttpServletRequest.class).getMethod()), this.getRepositories(), this.getStores(), pathSegments, (s, e, p, propertyIsEmbedded) -> {
.valueOf(nativeWebRequest.getNativeRequest(HttpServletRequest.class).getMethod()), this.getRepositories(), info, pathSegments, (s, e, p, propertyIsEmbedded) -> {
Object version = BeanUtils.getFieldWithAnnotation(p, Version.class);
if (version == null) {
version = BeanUtils.getFieldWithAnnotation(e, Version.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package internal.org.springframework.content.rest.controllers;

import javax.servlet.http.HttpServletRequest;

import internal.org.springframework.content.rest.io.AssociatedResource;
import internal.org.springframework.content.rest.io.AssociatedResourceImpl;
import internal.org.springframework.content.rest.io.RenderableResourceImpl;
import internal.org.springframework.content.rest.utils.ContentStoreUtils;

import org.springframework.content.commons.renditions.Renderable;
import org.springframework.content.commons.repository.AssociativeStore;
import org.springframework.content.commons.repository.Store;
Expand All @@ -23,6 +20,8 @@
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.util.UrlPathHelper;

import javax.servlet.http.HttpServletRequest;

public class ResourceHandlerMethodArgumentResolver extends StoreHandlerMethodArgumentResolver {

public ResourceHandlerMethodArgumentResolver(RestConfiguration config, Repositories repositories, RepositoryInvokerFactory repoInvokerFactory, ContentStoreService stores) {
Expand Down Expand Up @@ -74,7 +73,7 @@ public Object resolveArgument(MethodParameter methodParameter, ModelAndViewConta
// property content
else {
HttpMethod method = HttpMethod.valueOf(nativeWebRequest.getNativeRequest(HttpServletRequest.class).getMethod());
r = (Resource) this.resolveProperty(method, this.getRepositories(), this.getStores(), pathSegments, (i, e, p, propertyIsEmbedded) -> {
r = (Resource) this.resolveProperty(method, this.getRepositories(), info, pathSegments, (i, e, p, propertyIsEmbedded) -> {

AssociativeStore s = i.getImplementation(AssociativeStore.class);
Resource resource = s.getResource(p);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package internal.org.springframework.content.rest.controllers;

import javax.activation.MimetypesFileTypeMap;
import javax.servlet.http.HttpServletRequest;

import internal.org.springframework.content.rest.utils.ContentStoreUtils;

import org.springframework.content.commons.annotations.MimeType;
import org.springframework.content.commons.repository.AssociativeStore;
import org.springframework.content.commons.repository.Store;
Expand All @@ -22,6 +18,9 @@
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.util.UrlPathHelper;

import javax.activation.MimetypesFileTypeMap;
import javax.servlet.http.HttpServletRequest;

public class ResourceTypeMethodArgumentResolver extends StoreHandlerMethodArgumentResolver {

public ResourceTypeMethodArgumentResolver(RestConfiguration config, Repositories repositories, RepositoryInvokerFactory repoInvokerFactory, ContentStoreService stores) {
Expand Down Expand Up @@ -65,7 +64,7 @@ public Object resolveArgument(MethodParameter methodParameter, ModelAndViewConta

// property content
} else {
return resolveProperty(HttpMethod.valueOf(nativeWebRequest.getNativeRequest(HttpServletRequest.class).getMethod()), this.getRepositories(), this.getStores(), pathSegments, (s, e, p, propertyIsEmbedded) -> {
return resolveProperty(HttpMethod.valueOf(nativeWebRequest.getNativeRequest(HttpServletRequest.class).getMethod()), this.getRepositories(), info, pathSegments, (s, e, p, propertyIsEmbedded) -> {
Object mimeType = BeanUtils.getFieldWithAnnotation(p, MimeType.class);
return MediaType.valueOf(mimeType != null ? mimeType.toString() : MediaType.ALL_VALUE);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,8 @@
package internal.org.springframework.content.rest.controllers;

import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Optional;
import java.util.UUID;

import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.servlet.http.HttpServletRequest;

import internal.org.springframework.content.rest.utils.ContentStoreUtils;
import internal.org.springframework.content.rest.utils.PersistentEntityUtils;
import internal.org.springframework.content.rest.utils.RepositoryUtils;

import org.springframework.content.commons.annotations.ContentId;
import org.springframework.content.commons.repository.AssociativeStore;
import org.springframework.content.commons.repository.Store;
Expand All @@ -40,6 +29,13 @@
import org.springframework.web.server.MethodNotAllowedException;
import org.springframework.web.util.UrlPathHelper;

import javax.persistence.Embeddable;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Optional;
import java.util.UUID;

public class StoreHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

private final RestConfiguration config;
Expand Down Expand Up @@ -119,7 +115,7 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
throw new IllegalArgumentException();
}

protected <T> Object resolveProperty(HttpMethod method, Repositories repositories, ContentStoreService stores, String[] segments, PropertyResolver<T> resolver) {
protected <T> Object resolveProperty(HttpMethod method, Repositories repositories, ContentStoreInfo storeInfo, String[] segments, PropertyResolver<T> resolver) {

String repository = segments[1];
String id = segments[2];
Expand All @@ -131,7 +127,11 @@ protected <T> Object resolveProperty(HttpMethod method, Repositories repositorie

Object domainObj = null;
try {
domainObj = findOne(repoInvokerFactory, repositories, repository, id);
try {
domainObj = findOne(repoInvokerFactory, repositories, storeInfo.getDomainObjectClass(), id);
} catch (IllegalArgumentException iae) {
domainObj = findOne(repoInvokerFactory, repositories, repository, id);
}
}
catch (HttpRequestMethodNotSupportedException e) {
throw new ResourceNotFoundException();
Expand All @@ -147,12 +147,7 @@ protected <T> Object resolveProperty(HttpMethod method, Repositories repositorie

if (isPrimitiveProperty(propertyClass)) {

ContentStoreInfo info = ContentStoreUtils.findContentStore(stores, domainObj.getClass());
if (info == null) {
throw new IllegalStateException(String.format("Store for property %s not found", property.getName()));
}

return resolver.resolve(info, domainObj, domainObj, false);
return resolver.resolve(storeInfo, domainObj, domainObj, false);
}

// get or create property value
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,5 @@
package internal.org.springframework.content.rest.controllers;

import java.io.File;
import java.io.StringReader;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

import com.github.paulcwarren.ginkgo4j.Ginkgo4jConfiguration;
import com.github.paulcwarren.ginkgo4j.Ginkgo4jSpringRunner;
import com.theoryinpractise.halbuilder.api.ReadableRepresentation;
Expand All @@ -20,10 +8,8 @@
import internal.org.springframework.content.rest.support.config.JpaInfrastructureConfig;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.content.commons.annotations.ContentId;
import org.springframework.content.commons.repository.ContentStore;
import org.springframework.content.commons.search.Searchable;
import org.springframework.content.commons.utils.ReflectionService;
import org.springframework.content.fs.config.EnableFilesystemStores;
Expand All @@ -39,7 +25,6 @@
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.extensions.contentsearch.ContentSearchRestController;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
import org.springframework.data.rest.webmvc.support.DefaultedPageable;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
Expand All @@ -52,29 +37,25 @@
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration;

import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.BeforeEach;
import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.Context;
import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.Describe;
import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.FDescribe;
import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.FIt;
import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.It;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.io.File;
import java.io.StringReader;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.*;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasProperty;
import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import static org.springframework.test.web.client.ExpectedCount.once;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

Expand Down Expand Up @@ -456,9 +437,9 @@ public void noop() {
}

@Configuration
@EnableJpaRepositories(basePackages = "internal.org.springframework.content.rest.controllers", considerNestedRepositories = true)
@EnableJpaRepositories(considerNestedRepositories = true)
@EnableTransactionManagement
@EnableFilesystemStores(basePackages = "internal.org.springframework.content.rest.controllers")
@EnableFilesystemStores
@Profile("search")
public static class TestConfig extends JpaInfrastructureConfig {

Expand All @@ -476,8 +457,11 @@ public File filesystemRoot() {
return filesystemRoot;
}

protected String packagesToScan() {
return "internal.org.springframework.content.rest.controllers";
protected String[] packagesToScan() {
return new String[]{
"internal.org.springframework.content.rest.controllers",
"internal.org.springframework.content.rest.support"
};
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package internal.org.springframework.content.rest.controllers;

import com.github.paulcwarren.ginkgo4j.Ginkgo4jSpringRunner;
import internal.org.springframework.content.rest.support.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.content.rest.config.RestConfiguration;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration;

import static com.github.paulcwarren.ginkgo4j.Ginkgo4jDSL.*;

@RunWith(Ginkgo4jSpringRunner.class)
//@Ginkgo4jConfiguration(threads=1)
@WebAppConfiguration
@ContextConfiguration(classes = {
FullyQualifiedLinksConfig.class,
DelegatingWebMvcConfiguration.class,
RepositoryRestMvcConfiguration.class,
RestConfiguration.class })
@Transactional
public class FullyQualifiedLinksIT {

@Autowired
private TestEntityRepository repo3;

@Autowired
private TestEntityContentRepository store3;

@Autowired
private WebApplicationContext context;

private MockMvc mvc;

private TestEntity testEntity3;

private Content contentTests;

{
Describe("ContextPath Content Tests", () -> {
BeforeEach(() -> {
mvc = MockMvcBuilders.webAppContextSetup(context).build();
});
Context("given an entity is the subject of a repository and storage", () -> {
BeforeEach(() -> {
testEntity3 = repo3.save(new TestEntity());
testEntity3 = repo3.save(testEntity3);

contentTests.setMvc(mvc);
contentTests.setUrl("/testEntitiesContent/" + testEntity3.getId() + "/content");
contentTests.setEntity(testEntity3);
contentTests.setRepository(repo3);
contentTests.setStore(store3);

});
contentTests = Content.tests();
});
});
}

@Test
public void noop() {}
}
Loading

0 comments on commit 3a65a85

Please sign in to comment.