From 73af4f0ccdbbe4fea6feecb919910eaa37e6e537 Mon Sep 17 00:00:00 2001 From: John Blum Date: Wed, 22 Jul 2020 21:14:49 -0700 Subject: [PATCH] Add postProcess(:Resource) method invocation to Resource resolution for all loaded Resources. Resolves gh-92. --- .../ResourceLoaderResourceResolver.java | 22 ++++++++++++-- ...sourceLoaderResourceResolverUnitTests.java | 30 ++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/spring-geode/src/main/java/org/springframework/geode/core/io/support/ResourceLoaderResourceResolver.java b/spring-geode/src/main/java/org/springframework/geode/core/io/support/ResourceLoaderResourceResolver.java index b74f4a11..36198ede 100644 --- a/spring-geode/src/main/java/org/springframework/geode/core/io/support/ResourceLoaderResourceResolver.java +++ b/spring-geode/src/main/java/org/springframework/geode/core/io/support/ResourceLoaderResourceResolver.java @@ -167,6 +167,18 @@ public class ResourceLoaderResourceResolver implements ResourceLoaderAware, Reso ResourceUtils.nullSafeGetDescription(resource), location)); } + /** + * Method used by subclasses to process the loaded {@link Resource} as determined by + * the {@link #getResourceLoader() ResourceLoader}. + * + * @param resource {@link Resource} to post-process. + * @return the {@link Resource}. + * @see org.springframework.core.io.Resource + */ + protected Resource postProcess(Resource resource) { + return resource; + } + /** * Tries to resolve a {@link Resource} at the given {@link String location} using a Spring {@link ResourceLoader}, * such as a Spring {@link ApplicationContext}. @@ -183,8 +195,9 @@ public class ResourceLoaderResourceResolver implements ResourceLoaderAware, Reso * @throws IllegalArgumentException if {@link String location} is not specified. * @return an {@link Optional} {@link Resource} handle for the given {@link String location}. * @see org.springframework.core.io.Resource - * @see #onMissingResource(Resource, String) * @see #isQualified(Resource) + * @see #onMissingResource(Resource, String) + * @see #postProcess(Resource) * @see java.util.Optional */ @Override @@ -194,7 +207,12 @@ public class ResourceLoaderResourceResolver implements ResourceLoaderAware, Reso String.format("The location [%s] of the Resource to resolve must be specified", location)); Resource resource = getResourceLoader().getResource(location); - Resource resolvedResource = isQualified(resource) ? resource : onMissingResource(resource, location); + + resource = postProcess(resource); + + Resource resolvedResource = isQualified(resource) + ? resource + : onMissingResource(resource, location); return Optional.ofNullable(resolvedResource); } diff --git a/spring-geode/src/test/java/org/springframework/geode/core/io/support/ResourceLoaderResourceResolverUnitTests.java b/spring-geode/src/test/java/org/springframework/geode/core/io/support/ResourceLoaderResourceResolverUnitTests.java index dbbc6815..1bf7b8b0 100644 --- a/spring-geode/src/test/java/org/springframework/geode/core/io/support/ResourceLoaderResourceResolverUnitTests.java +++ b/spring-geode/src/test/java/org/springframework/geode/core/io/support/ResourceLoaderResourceResolverUnitTests.java @@ -20,6 +20,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -31,6 +32,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import java.util.Set; import org.junit.Test; +import org.mockito.InOrder; import org.apache.shiro.util.CollectionUtils; @@ -250,6 +252,19 @@ public class ResourceLoaderResourceResolverUnitTests { } } + @Test + public void postProcessReturnsGivenResource() { + + Resource mockResource = mock(Resource.class); + + ResourceLoaderResourceResolver resourceResolver = new ResourceLoaderResourceResolver(); + + assertThat(resourceResolver.postProcess(mockResource)).isSameAs(mockResource); + assertThat(resourceResolver.postProcess(null)).isNull(); + + verifyNoInteractions(mockResource); + } + @Test public void resolveReturnsResource() { @@ -266,10 +281,14 @@ public class ResourceLoaderResourceResolverUnitTests { assertThat(resourceResolver.resolve(location).orElse(null)).isEqualTo(mockResource); - verify(resourceResolver, times(1)).getResourceLoader(); - verify(resourceResolver, times(1)).isQualified(eq(mockResource)); - verify(resourceResolver, never()).onMissingResource(any(), any()); - verify(mockResourceLoader, times(1)).getResource(eq(location)); + InOrder order = inOrder(mockResource, mockResourceLoader, resourceResolver); + + order.verify(resourceResolver, times(1)).getResourceLoader(); + order.verify(mockResourceLoader, times(1)).getResource(eq(location)); + order.verify(resourceResolver, times(1)).postProcess(eq(mockResource)); + order.verify(resourceResolver, times(1)).isQualified(eq(mockResource)); + order.verify(resourceResolver, never()).onMissingResource(any(), any()); + verifyNoInteractions(mockResource); } @@ -297,6 +316,7 @@ public class ResourceLoaderResourceResolverUnitTests { } finally { verify(resourceResolver, times(1)).getResourceLoader(); + verify(resourceResolver, times(1)).postProcess(any()); verify(resourceResolver, times(1)).isQualified(isNull()); verify(resourceResolver, times(1)).onMissingResource(isNull(), eq(location)); verify(mockResourceLoader, times(1)).getResource(eq(location)); @@ -332,6 +352,7 @@ public class ResourceLoaderResourceResolverUnitTests { } finally { verify(resourceResolver, times(1)).getResourceLoader(); + verify(resourceResolver, times(1)).postProcess(any()); verify(resourceResolver, times(1)).isQualified(eq(mockResource)); verify(resourceResolver, times(1)).onMissingResource(eq(mockResource), eq(location)); verify(mockResourceLoader, times(1)).getResource(eq(location)); @@ -360,6 +381,7 @@ public class ResourceLoaderResourceResolverUnitTests { assertThat(resourceResolver.resolve(location).orElse(null)).isEqualTo(mockResourceTwo); verify(resourceResolver, times(1)).getResourceLoader(); + verify(resourceResolver, times(1)).postProcess(any()); verify(resourceResolver, times(1)).isQualified(eq(mockResourceOne)); verify(resourceResolver, times(1)).onMissingResource(eq(mockResourceOne), eq(location)); verify(mockResourceLoader, times(1)).getResource(eq(location));