SGF-712 - Fix incorrect server proxying behavior when registering local, client Regions using EnableCachingDefinedRegions.

This commit is contained in:
John Blum
2018-01-17 16:04:29 -08:00
parent 7cc4d48b81
commit da0c880dde
5 changed files with 186 additions and 243 deletions

View File

@@ -47,12 +47,8 @@ import org.apache.geode.cache.client.ClientRegionShortcut;
import org.apache.geode.cache.client.Pool;
import org.springframework.beans.BeanInstantiationException;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
@@ -64,9 +60,7 @@ import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.data.gemfire.client.ClientRegionFactoryBean;
import org.springframework.data.gemfire.config.annotation.support.AbstractAnnotationConfigSupport;
import org.springframework.data.gemfire.config.annotation.support.BeanDefinitionRegistryPostProcessorSupport;
import org.springframework.data.gemfire.config.annotation.support.CacheTypeAwareRegionFactoryBean;
import org.springframework.data.gemfire.config.xml.GemfireConstants;
import org.springframework.data.gemfire.util.CollectionUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
@@ -278,55 +272,6 @@ public class CachingDefinedRegionsConfiguration extends AbstractAnnotationConfig
}
}
@Bean
@SuppressWarnings("all")
public BeanDefinitionRegistryPostProcessor cachingAnnotationsRegionBeanDefinitionRegistrar() {
return new BeanDefinitionRegistryPostProcessorSupport() {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
registerBeanDefinitions(registry);
}
};
}
void registerBeanDefinitions(BeanDefinitionRegistry registry) {
for (String beanName : registry.getBeanDefinitionNames()) {
BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
if (isNotInfrastructureBean(beanDefinition)) {
resolveBeanClass(beanDefinition, registry).ifPresent(beanClass ->
registerRegionBeanDefinitions(getCacheNameResolver().resolveCacheNames(beanClass), registry));
}
}
}
private BeanDefinitionRegistry registerRegionBeanDefinitions(Set<String> cacheNames,
BeanDefinitionRegistry registry) {
cacheNames.forEach(cacheName -> {
if (!registry.containsBeanDefinition(cacheName)) {
BeanDefinitionBuilder builder =
BeanDefinitionBuilder.genericBeanDefinition(CacheTypeAwareRegionFactoryBean.class);
builder.addPropertyReference("cache", GemfireConstants.DEFAULT_GEMFIRE_CACHE_NAME);
builder.addPropertyValue("clientRegionShortcut", resolveClientRegionShortcut());
builder.addPropertyValue("poolName", resolvePoolName());
builder.addPropertyValue("regionName", cacheName);
builder.addPropertyValue("serverRegionShortcut", resolveServerRegionShortcut());
registry.registerBeanDefinition(cacheName, builder.getBeanDefinition());
}
});
return registry;
}
@Bean
@SuppressWarnings("all")
public BeanPostProcessor cachingAnnotationsRegionBeanRegistrar(ConfigurableBeanFactory beanFactory) {
@@ -352,17 +297,21 @@ public class CachingDefinedRegionsConfiguration extends AbstractAnnotationConfig
if (!beanFactory.containsBean(cacheName)) {
try {
CacheTypeAwareRegionFactoryBean<?, ?> regionFactoryBean =
new CacheTypeAwareRegionFactoryBean<>();
CacheTypeAwareRegionFactoryBean<?, ?> regionFactoryBean = new CacheTypeAwareRegionFactoryBean<>();
GemFireCache gemfireCache =
beanFactory.getBean(GemfireConstants.DEFAULT_GEMFIRE_CACHE_NAME, GemFireCache.class);
GemFireCache gemfireCache = beanFactory.getBean(GemFireCache.class);
regionFactoryBean.setCache(gemfireCache);
regionFactoryBean.setClientRegionShortcut(resolveClientRegionShortcut());
regionFactoryBean.setPoolName(resolvePoolName());
regionFactoryBean.setRegionName(cacheName);
regionFactoryBean.setServerRegionShortcut(resolveServerRegionShortcut());
String poolName = resolvePoolName();
if (!ClientRegionFactoryBean.DEFAULT_POOL_NAME.equalsIgnoreCase(poolName)) {
regionFactoryBean.setPoolName(poolName);
}
regionFactoryBean.afterPropertiesSet();
Optional.ofNullable(regionFactoryBean.getObject())

View File

@@ -626,8 +626,8 @@ public class EntityDefinedRegionsConfiguration extends AbstractAnnotationConfigS
private String poolName;
protected RegionBeanDefinitionMetadata(GemfirePersistentEntity<?> persistentEntity) {
this.persistentEntity = Optional.ofNullable(persistentEntity)
.orElseThrow(() -> newIllegalArgumentException("GemfirePeristentEntity is required"));
Assert.notNull(persistentEntity, "GemfirePersistentEntity is required");
this.persistentEntity = persistentEntity;
}
protected boolean isStrict() {

View File

@@ -1077,7 +1077,7 @@ public abstract class AbstractAnnotationConfigSupport
try {
return typeResolver.resolve();
}
catch (ClassNotFoundException cause) {
catch (ClassNotFoundException | NoClassDefFoundError cause) {
return null;
}
}