From e49ffa3d0ff8261be1eb1a750d4863c4826a379c Mon Sep 17 00:00:00 2001 From: John Blum Date: Mon, 20 Jul 2020 12:41:34 -0700 Subject: [PATCH] Add ResourceResolver implementation that resolves to a single (i.e. 'Singleton') Resource. Resolve gh-92. --- .../io/support/SingleResourceResolver.java | 56 +++++++++++++++++ .../SingleResourceResolverUnitTests.java | 62 +++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 spring-geode/src/main/java/org/springframework/geode/core/io/support/SingleResourceResolver.java create mode 100644 spring-geode/src/test/java/org/springframework/geode/core/io/support/SingleResourceResolverUnitTests.java diff --git a/spring-geode/src/main/java/org/springframework/geode/core/io/support/SingleResourceResolver.java b/spring-geode/src/main/java/org/springframework/geode/core/io/support/SingleResourceResolver.java new file mode 100644 index 00000000..171d2351 --- /dev/null +++ b/spring-geode/src/main/java/org/springframework/geode/core/io/support/SingleResourceResolver.java @@ -0,0 +1,56 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package org.springframework.geode.core.io.support; + +import java.util.Optional; + +import org.springframework.core.io.Resource; +import org.springframework.geode.core.io.ResourceResolver; +import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; + +/** + * {@link ResourceResolver} that returns a single (i.e. {@literal Singleton}) {@link Resource} + * regardless of {@link String location}. + * + * @author John Blum + * @see org.springframework.core.io.Resource + * @see org.springframework.geode.core.io.ResourceResolver + * @since 1.3.1 + */ +public class SingleResourceResolver implements ResourceResolver { + + @Nullable + private final Resource resource; + + /** + * Constructs a new instance of {@link SingleResourceResolver} initialized with the given {@link Resource}. + * + * @param resource the {@literal single} {@link Resource} consistently resolved by this resolver. + * @see org.springframework.core.io.Resource + */ + public SingleResourceResolver(@Nullable Resource resource) { + this.resource = resource; + } + + /** + * @inheritDoc + */ + @Override + public Optional resolve(@NonNull String location) { + return Optional.ofNullable(this.resource); + } +} diff --git a/spring-geode/src/test/java/org/springframework/geode/core/io/support/SingleResourceResolverUnitTests.java b/spring-geode/src/test/java/org/springframework/geode/core/io/support/SingleResourceResolverUnitTests.java new file mode 100644 index 00000000..e4162cc7 --- /dev/null +++ b/spring-geode/src/test/java/org/springframework/geode/core/io/support/SingleResourceResolverUnitTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package org.springframework.geode.core.io.support; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verifyNoInteractions; + +import org.junit.Test; + +import org.springframework.core.io.Resource; + +/** + * Unit Tests for {@link SingleResourceResolver}. + * + * @author John Blum + * @see org.junit.Test + * @see org.mockito.Mockito + * @see org.springframework.core.io.Resource + * @see org.springframework.geode.core.io.ResourceResolver + * @see org.springframework.geode.core.io.support.SingleResourceResolver + * @since 1.3.1 + */ +public class SingleResourceResolverUnitTests { + + @Test + public void constructsSingleResourceResolverWithNonNullResource() { + + Resource mockResource = mock(Resource.class); + + SingleResourceResolver resourceResolver = new SingleResourceResolver(mockResource); + + assertThat(resourceResolver.resolve("/location/of/resource").orElse(null)).isEqualTo(mockResource); + assertThat(resourceResolver.resolve("/path/to/resource").orElse(null)).isEqualTo(mockResource); + assertThat(resourceResolver.resolve("/another/path/to/resource").orElse(null)).isEqualTo(mockResource); + assertThat(resourceResolver.resolve("/yet/another/path/to/resource").orElse(null)).isEqualTo(mockResource); + + verifyNoInteractions(mockResource); + } + + @Test + public void constructSingleResourceResolverWithNullResource() { + + SingleResourceResolver resourceResolver = new SingleResourceResolver(null); + + assertThat(resourceResolver.resolve("/location/of/resource").orElse(null)).isNull(); + assertThat(resourceResolver.resolve("/path/to/resource").orElse(null)).isNull(); + } +}