DATAGEODE-112 - Clean BeanFactoryLocator references on CacheFactoryBean destroy.

This commit is contained in:
John Blum
2018-06-07 23:34:17 -07:00
parent 5abcb10e70
commit 61eae77470
2 changed files with 32 additions and 36 deletions

View File

@@ -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);

View File

@@ -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