Refactor ResourceCapableCacheDataImporterExporter to use ObjectAwareUtils to initialize the import & export ResourceResolvers with the ApplicationContext, Environment and ResourceLoader managed objects if present.

Resolves gh-92.
This commit is contained in:
John Blum
2020-07-22 12:41:32 -07:00
parent faaa218f51
commit f23675fec5
2 changed files with 21 additions and 50 deletions

View File

@@ -21,6 +21,8 @@ import java.io.File;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.stream.Stream;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.Region;
@@ -56,6 +58,7 @@ import org.springframework.geode.core.io.support.FileResourceWriter;
import org.springframework.geode.core.io.support.ResourceLoaderResourceResolver;
import org.springframework.geode.core.io.support.ResourcePrefix;
import org.springframework.geode.core.io.support.ResourceUtils;
import org.springframework.geode.core.util.ObjectAwareUtils;
import org.springframework.geode.data.AbstractCacheDataImporterExporter;
import org.springframework.geode.data.CacheDataImporterExporter;
import org.springframework.geode.expression.SmartEnvironmentAccessor;
@@ -126,51 +129,15 @@ public abstract class ResourceCapableCacheDataImporterExporter extends AbstractC
setResourceReader(initialize(getResourceReader(), ByteArrayResourceReader::new));
setResourceWriter(initialize(getResourceWriter(), FileResourceWriter::new));
initApplicationContext();
initEnvironment();
initResourceLoader();
Stream.of(getExportResourceResolver(), getImportResourceResolver())
.forEach(this.newCompositeObjectAwareInitializer());
}
private void initApplicationContext() {
Consumer<Object> newCompositeObjectAwareInitializer() {
getApplicationContext().ifPresent(applicationContext -> {
if (this.exportResourceResolver instanceof ApplicationContextAware) {
((ApplicationContextAware) this.exportResourceResolver).setApplicationContext(applicationContext);
}
if (this.importResourceResolver instanceof ApplicationContextAware) {
((ApplicationContextAware) this.importResourceResolver).setApplicationContext(applicationContext);
}
});
}
private void initEnvironment() {
getEnvironment().ifPresent(environment -> {
if (this.exportResourceResolver instanceof EnvironmentAware) {
((EnvironmentAware) this.exportResourceResolver).setEnvironment(environment);
}
if (this.importResourceResolver instanceof EnvironmentAware) {
((EnvironmentAware) this.importResourceResolver).setEnvironment(environment);
}
});
}
private void initResourceLoader() {
getResourceLoader().ifPresent(resourceLoader -> {
if (this.exportResourceResolver instanceof ResourceLoaderAware) {
((ResourceLoaderAware) this.exportResourceResolver).setResourceLoader(resourceLoader);
}
if (this.importResourceResolver instanceof ResourceLoaderAware) {
((ResourceLoaderAware) this.importResourceResolver).setResourceLoader(resourceLoader);
}
});
return ObjectAwareUtils.applicationContextAwareObjectInitializer(getApplicationContext().orElse(null))
.andThen(ObjectAwareUtils.environmentAwareObjectInitializer(getEnvironment().orElse(null)))
.andThen(ObjectAwareUtils.resourceLoaderAwareObjectInitializer(getResourceLoader().orElse(null)));
}
/**

View File

@@ -116,7 +116,8 @@ public class ResourceCapableCacheDataImporterExporterUnitTests {
ResourceWriter mockResourceWriter = mock(ResourceWriter.class);
ResourceCapableCacheDataImporterExporter importerExporter = new TestResourceCapableCacheDataImporterExporter();
ResourceCapableCacheDataImporterExporter importerExporter =
spy(new TestResourceCapableCacheDataImporterExporter());
importerExporter.setApplicationContext(mockApplicationContext);
importerExporter.setEnvironment(mockEnvironment);
@@ -133,6 +134,7 @@ public class ResourceCapableCacheDataImporterExporterUnitTests {
assertThat(importerExporter.getResourceReader()).isEqualTo(mockResourceReader);
assertThat(importerExporter.getResourceWriter()).isEqualTo(mockResourceWriter);
verify(importerExporter, times(1)).newCompositeObjectAwareInitializer();
verify(mockExportResourceResolver, times(1)).setApplicationContext(eq(mockApplicationContext));
verify(mockExportResourceResolver, times(1)).setEnvironment(eq(mockEnvironment));
verify(mockExportResourceResolver, times(1)).setResourceLoader(eq(mockResourceLoader));
@@ -153,7 +155,8 @@ public class ResourceCapableCacheDataImporterExporterUnitTests {
ApplicationContextAndResourceLoaderAwareImportResourceResolver mockImportResourceResolver =
mock(ApplicationContextAndResourceLoaderAwareImportResourceResolver.class);
ResourceCapableCacheDataImporterExporter importerExporter = new TestResourceCapableCacheDataImporterExporter();
ResourceCapableCacheDataImporterExporter importerExporter =
spy(new TestResourceCapableCacheDataImporterExporter());
importerExporter.setApplicationContext(mockApplicationContext);
importerExporter.setEnvironment(mockEnvironment);
@@ -173,6 +176,7 @@ public class ResourceCapableCacheDataImporterExporterUnitTests {
assertThat(importerExporter.getResourceReader()).isInstanceOf(ByteArrayResourceReader.class);
assertThat(importerExporter.getResourceWriter()).isInstanceOf(FileResourceWriter.class);
verify(importerExporter, times(1)).newCompositeObjectAwareInitializer();
verify(mockImportResourceResolver, times(1)).setApplicationContext(eq(mockApplicationContext));
verify(mockImportResourceResolver, never()).setResourceLoader(any());
verifyNoMoreInteractions(mockImportResourceResolver);
@@ -846,24 +850,24 @@ public class ResourceCapableCacheDataImporterExporterUnitTests {
return Optional.empty();
}
@NonNull @Override
protected String getResourcePath() {
@Override
protected @NonNull String getResourcePath() {
return null;
}
}
static class TestExportResourceResolver extends AbstractExportResourceResolver {
@NonNull @Override
protected String getResourcePath() {
@Override
protected @NonNull String getResourcePath() {
return null;
}
}
static class TestImportResourceResolver extends AbstractImportResourceResolver {
@NonNull @Override
protected String getResourcePath() {
@Override
protected @NonNull String getResourcePath() {
return null;
}
}