DATAGEODE-112 - Clean BeanFactoryLocator references on CacheFactoryBean destroy.
This commit is contained in:
@@ -57,7 +57,7 @@ import org.springframework.util.StringUtils;
|
||||
@SuppressWarnings("all")
|
||||
public class GemfireBeanFactoryLocator implements BeanFactoryAware, BeanNameAware, DisposableBean, InitializingBean {
|
||||
|
||||
// bean alias/name <-> BeanFactory mapping
|
||||
// Bean alias/name <-> BeanFactory mapping
|
||||
protected static final ConcurrentMap<String, BeanFactory> BEAN_FACTORIES = new ConcurrentHashMap<>();
|
||||
|
||||
private BeanFactory beanFactory;
|
||||
@@ -68,6 +68,13 @@ public class GemfireBeanFactoryLocator implements BeanFactoryAware, BeanNameAwar
|
||||
|
||||
private String associatedBeanName;
|
||||
|
||||
/**
|
||||
* Cleans up all {@link BeanFactory} references tracked by this locator.
|
||||
*/
|
||||
public static void clear() {
|
||||
BEAN_FACTORIES.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory method to construct a new, initialized instance of {@link GemfireBeanFactoryLocator}.
|
||||
*
|
||||
@@ -164,8 +171,8 @@ public class GemfireBeanFactoryLocator implements BeanFactoryAware, BeanNameAwar
|
||||
}
|
||||
}
|
||||
|
||||
Assert.state(allTheSameBeanFactory, String.format(
|
||||
"BeanFactory key must be specified when more than one BeanFactory %s is registered",
|
||||
Assert.state(allTheSameBeanFactory,
|
||||
String.format("BeanFactory key must be specified when more than one BeanFactory %s is registered",
|
||||
new TreeSet(BEAN_FACTORIES.keySet()).toString()));
|
||||
|
||||
return BEAN_FACTORIES.values().iterator().next();
|
||||
@@ -187,10 +194,12 @@ public class GemfireBeanFactoryLocator implements BeanFactoryAware, BeanNameAwar
|
||||
*/
|
||||
protected static synchronized void registerAliases(Set<String> names, BeanFactory beanFactory) {
|
||||
|
||||
Assert.isTrue(nullSafeSet(names).isEmpty() || beanFactory != null,
|
||||
Set<String> safeNames = nullSafeSet(names);
|
||||
|
||||
Assert.isTrue(safeNames.isEmpty() || beanFactory != null,
|
||||
"BeanFactory must not be null when aliases are specified");
|
||||
|
||||
for (String name : nullSafeSet(names)) {
|
||||
for (String name : safeNames) {
|
||||
|
||||
BeanFactory existingBeanFactory = BEAN_FACTORIES.putIfAbsent(name, beanFactory);
|
||||
|
||||
|
||||
@@ -33,8 +33,11 @@ import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Matchers.same;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||
@@ -66,7 +69,6 @@ import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.data.gemfire.support.GemfireBeanFactoryLocator;
|
||||
import org.springframework.data.util.ReflectionUtils;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link CacheFactoryBean}.
|
||||
@@ -702,15 +704,14 @@ public class CacheFactoryBeanTest {
|
||||
|
||||
when(mockCache.isClosed()).thenReturn(false);
|
||||
|
||||
CacheFactoryBean cacheFactoryBean = new CacheFactoryBean() {
|
||||
@Override protected GemFireCache fetchCache() {
|
||||
fetchCacheCalled.set(true);
|
||||
return mockCache;
|
||||
}
|
||||
};
|
||||
CacheFactoryBean cacheFactoryBean = spy(new CacheFactoryBean());
|
||||
|
||||
ReflectionUtils.setField(CacheFactoryBean.class.getDeclaredField("beanFactoryLocator"), cacheFactoryBean,
|
||||
mockGemfireBeanFactoryLocator);
|
||||
doAnswer(invocation -> {
|
||||
fetchCacheCalled.set(true);
|
||||
return mockCache;
|
||||
}).when(cacheFactoryBean).fetchCache();
|
||||
|
||||
doReturn(mockGemfireBeanFactoryLocator).when(cacheFactoryBean).getBeanFactoryLocator();
|
||||
|
||||
cacheFactoryBean.setClose(true);
|
||||
cacheFactoryBean.setUseBeanFactoryLocator(true);
|
||||
@@ -729,12 +730,12 @@ public class CacheFactoryBeanTest {
|
||||
|
||||
AtomicBoolean fetchCacheCalled = new AtomicBoolean(false);
|
||||
|
||||
CacheFactoryBean cacheFactoryBean = new CacheFactoryBean() {
|
||||
@Override protected <T extends GemFireCache> T fetchCache() {
|
||||
fetchCacheCalled.set(true);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
CacheFactoryBean cacheFactoryBean = spy(new CacheFactoryBean());
|
||||
|
||||
doAnswer(invocation -> {
|
||||
fetchCacheCalled.set(true);
|
||||
return null;
|
||||
}).when(cacheFactoryBean).fetchCache();
|
||||
|
||||
cacheFactoryBean.setClose(true);
|
||||
cacheFactoryBean.setUseBeanFactoryLocator(true);
|
||||
@@ -745,27 +746,13 @@ public class CacheFactoryBeanTest {
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void destroyWhenCacheClosedIsTrue() throws Exception {
|
||||
public void destroyWhenCloseIsFalse() throws Exception {
|
||||
|
||||
AtomicBoolean fetchCacheCalled = new AtomicBoolean(false);
|
||||
|
||||
Cache mockCache = mock(Cache.class, "GemFireCache");
|
||||
|
||||
CacheFactoryBean cacheFactoryBean = new CacheFactoryBean() {
|
||||
@Override @SuppressWarnings("unchecked") protected <T extends GemFireCache> T fetchCache() {
|
||||
fetchCacheCalled.set(true);
|
||||
return (T) mockCache;
|
||||
}
|
||||
};
|
||||
CacheFactoryBean cacheFactoryBean = new CacheFactoryBean();
|
||||
|
||||
cacheFactoryBean.setClose(false);
|
||||
cacheFactoryBean.setUseBeanFactoryLocator(false);
|
||||
cacheFactoryBean.destroy();
|
||||
|
||||
verify(mockCache, never()).isClosed();
|
||||
verify(mockCache, never()).close();
|
||||
|
||||
assertFalse(fetchCacheCalled.get());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user