DATAGEODE-213 - Polish Annotation-based Configuration Model.

This commit is contained in:
John Blum
2019-07-25 19:01:50 -07:00
parent e3c8afe7fc
commit e128e14585
23 changed files with 262 additions and 114 deletions

View File

@@ -19,7 +19,6 @@ package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +29,7 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.data.gemfire.config.annotation.support.AbstractAnnotationConfigSupport;
import org.springframework.data.gemfire.config.xml.GemfireConstants;
@@ -74,10 +74,9 @@ public class AddCacheServerConfiguration extends AbstractAnnotationConfigSupport
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
if (importingClassMetadata.hasAnnotation(EnableCacheServer.class.getName())) {
if (isAnnotationPresent(importingClassMetadata)) {
Map<String, Object> enableCacheServerAttributes =
importingClassMetadata.getAnnotationAttributes(EnableCacheServer.class.getName());
AnnotationAttributes enableCacheServerAttributes = getAnnotationAttributes(importingClassMetadata);
registerCacheServerFactoryBeanDefinition(enableCacheServerAttributes, registry);
}
@@ -94,13 +93,13 @@ public class AddCacheServerConfiguration extends AbstractAnnotationConfigSupport
* @see org.springframework.beans.factory.support.BeanDefinitionRegistry
* @see org.springframework.data.gemfire.server.CacheServerFactoryBean
*/
protected void registerCacheServerFactoryBeanDefinition(Map<String, Object> enableCacheServerAttributes,
protected void registerCacheServerFactoryBeanDefinition(AnnotationAttributes enableCacheServerAttributes,
BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(CacheServerFactoryBean.class);
String beanName = registerCacheServerFactoryBeanDefinition(builder.getBeanDefinition(),
(String) enableCacheServerAttributes.get("name"), registry);
enableCacheServerAttributes.getString("name"), registry);
builder.addPropertyReference("cache", GemfireConstants.DEFAULT_GEMFIRE_CACHE_NAME);
builder.addPropertyValue("cacheServerConfigurers", resolveCacheServerConfigurers());
@@ -108,77 +107,77 @@ public class AddCacheServerConfiguration extends AbstractAnnotationConfigSupport
builder.addPropertyValue("autoStartup",
resolveProperty(namedCacheServerProperty(beanName, "auto-startup"),
resolveProperty(cacheServerProperty("auto-startup"),
(Boolean) enableCacheServerAttributes.get("autoStartup"))));
enableCacheServerAttributes.getBoolean("autoStartup"))));
builder.addPropertyValue("bindAddress",
resolveProperty(namedCacheServerProperty(beanName, "bind-address"),
resolveProperty(cacheServerProperty("bind-address"),
(String) enableCacheServerAttributes.get("bindAddress"))));
enableCacheServerAttributes.getString("bindAddress"))));
builder.addPropertyValue("hostNameForClients",
resolveProperty(namedCacheServerProperty(beanName, "hostname-for-clients"),
resolveProperty(cacheServerProperty("hostname-for-clients"),
(String) enableCacheServerAttributes.get("hostnameForClients"))));
enableCacheServerAttributes.getString("hostnameForClients"))));
builder.addPropertyValue("loadPollInterval",
resolveProperty(namedCacheServerProperty(beanName, "load-poll-interval"),
resolveProperty(cacheServerProperty("load-poll-interval"),
(Long) enableCacheServerAttributes.get("loadPollInterval"))));
enableCacheServerAttributes.<Long>getNumber("loadPollInterval"))));
builder.addPropertyValue("maxConnections",
resolveProperty(namedCacheServerProperty(beanName, "max-connections"),
resolveProperty(cacheServerProperty("max-connections"),
(Integer) enableCacheServerAttributes.get("maxConnections"))));
enableCacheServerAttributes.<Integer>getNumber("maxConnections"))));
builder.addPropertyValue("maxMessageCount",
resolveProperty(namedCacheServerProperty(beanName, "max-message-count"),
resolveProperty(cacheServerProperty("max-message-count"),
(Integer) enableCacheServerAttributes.get("maxMessageCount"))));
enableCacheServerAttributes.<Integer>getNumber("maxMessageCount"))));
builder.addPropertyValue("maxThreads",
resolveProperty(namedCacheServerProperty(beanName, "max-threads"),
resolveProperty(cacheServerProperty("max-threads"),
(Integer) enableCacheServerAttributes.get("maxThreads"))));
enableCacheServerAttributes.<Integer>getNumber("maxThreads"))));
builder.addPropertyValue("maxTimeBetweenPings",
resolveProperty(namedCacheServerProperty(beanName, "max-time-between-pings"),
resolveProperty(cacheServerProperty("max-time-between-pings"),
(Integer) enableCacheServerAttributes.get("maxTimeBetweenPings"))));
enableCacheServerAttributes.<Integer>getNumber("maxTimeBetweenPings"))));
builder.addPropertyValue("messageTimeToLive",
resolveProperty(namedCacheServerProperty(beanName, "message-time-to-live"),
resolveProperty(cacheServerProperty("message-time-to-live"),
(Integer) enableCacheServerAttributes.get("messageTimeToLive"))));
enableCacheServerAttributes.<Integer>getNumber("messageTimeToLive"))));
builder.addPropertyValue("port",
resolveProperty(namedCacheServerProperty(beanName, "port"),
resolveProperty(cacheServerProperty("port"),
(Integer) enableCacheServerAttributes.get("port"))));
enableCacheServerAttributes.<Integer>getNumber("port"))));
builder.addPropertyValue("socketBufferSize",
resolveProperty(namedCacheServerProperty(beanName, "socket-buffer-size"),
resolveProperty(cacheServerProperty("socket-buffer-size"),
(Integer) enableCacheServerAttributes.get("socketBufferSize"))));
enableCacheServerAttributes.<Integer>getNumber("socketBufferSize"))));
builder.addPropertyValue("subscriptionCapacity",
resolveProperty(namedCacheServerProperty(beanName, "subscription-capacity"),
resolveProperty(cacheServerProperty("subscription-capacity"),
(Integer) enableCacheServerAttributes.get("subscriptionCapacity"))));
enableCacheServerAttributes.<Integer>getNumber("subscriptionCapacity"))));
builder.addPropertyValue("subscriptionDiskStore",
resolveProperty(namedCacheServerProperty(beanName, "subscription-disk-store-name"),
resolveProperty(cacheServerProperty("subscription-disk-store-name"),
(String) enableCacheServerAttributes.get("subscriptionDiskStoreName"))));
enableCacheServerAttributes.getString("subscriptionDiskStoreName"))));
builder.addPropertyValue("subscriptionEvictionPolicy",
resolveProperty(namedCacheServerProperty(beanName, "subscription-eviction-policy"),
SubscriptionEvictionPolicy.class, resolveProperty(cacheServerProperty("subscription-eviction-policy"),
SubscriptionEvictionPolicy.class, (SubscriptionEvictionPolicy) enableCacheServerAttributes.get("subscriptionEvictionPolicy"))));
SubscriptionEvictionPolicy.class, enableCacheServerAttributes.getEnum("subscriptionEvictionPolicy"))));
builder.addPropertyValue("tcpNoDelay",
resolveProperty(namedCacheServerProperty(beanName, "tcp-no-delay"),
resolveProperty(cacheServerProperty("tcp-no-delay"),
(Boolean) enableCacheServerAttributes.get("tcpNoDelay"))));
enableCacheServerAttributes.getBoolean("tcpNoDelay"))));
}
private List<CacheServerConfigurer> resolveCacheServerConfigurers() {
@@ -194,8 +193,10 @@ public class AddCacheServerConfiguration extends AbstractAnnotationConfigSupport
BeanDefinitionRegistry registry) {
if (StringUtils.hasText(beanName)) {
BeanDefinitionReaderUtils.registerBeanDefinition(
newBeanDefinitionHolder(beanDefinition, beanName), registry);
BeanDefinitionHolder beanDefinitionHolder = newBeanDefinitionHolder(beanDefinition, beanName);
BeanDefinitionReaderUtils.registerBeanDefinition(beanDefinitionHolder, registry);
return beanName;
}

View File

@@ -14,14 +14,14 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.util.Map;
import java.util.Arrays;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.data.gemfire.util.ArrayUtils;
/**
* The {@link AddCacheServersConfiguration} class registers {@link org.springframework.data.gemfire.server.CacheServerFactoryBean}
@@ -41,16 +41,18 @@ public class AddCacheServersConfiguration extends AddCacheServerConfiguration {
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
if (importingClassMetadata.hasAnnotation(EnableCacheServers.class.getName())) {
Map<String, Object> enableCacheServersAttributes = importingClassMetadata.getAnnotationAttributes(
EnableCacheServers.class.getName());
AnnotationAttributes enableCacheServersAttributes =
getAnnotationAttributes(importingClassMetadata, EnableCacheServers.class.getName());
AnnotationAttributes[] serversAttributes =
(AnnotationAttributes[]) enableCacheServersAttributes.get("servers");
enableCacheServersAttributes.getAnnotationArray("servers");
for (AnnotationAttributes enableCacheServerAttributes : serversAttributes) {
registerCacheServerFactoryBeanDefinition(enableCacheServerAttributes, registry);
}
Arrays.stream(ArrayUtils.nullSafeArray(serversAttributes, AnnotationAttributes.class))
.forEach(enableCacheServerAttributes ->
registerCacheServerFactoryBeanDefinition(enableCacheServerAttributes, registry));
}
}
}

View File

@@ -73,10 +73,9 @@ public class AddPoolConfiguration extends AbstractAnnotationConfigSupport
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
if (importingClassMetadata.hasAnnotation(EnablePool.class.getName())) {
if (isAnnotationPresent(importingClassMetadata)) {
Map<String, Object> enablePoolAttributes =
importingClassMetadata.getAnnotationAttributes(EnablePool.class.getName());
AnnotationAttributes enablePoolAttributes = getAnnotationAttributes(importingClassMetadata);
registerPoolFactoryBeanDefinition(enablePoolAttributes, registry);
}
@@ -93,7 +92,7 @@ public class AddPoolConfiguration extends AbstractAnnotationConfigSupport
* @see org.springframework.data.gemfire.config.annotation.EnablePool
* @see java.util.Map
*/
protected void registerPoolFactoryBeanDefinition(Map<String, Object> enablePoolAttributes,
protected void registerPoolFactoryBeanDefinition(AnnotationAttributes enablePoolAttributes,
BeanDefinitionRegistry registry) {
String poolName = getAndValidatePoolName(enablePoolAttributes);
@@ -103,94 +102,94 @@ public class AddPoolConfiguration extends AbstractAnnotationConfigSupport
poolFactoryBean.addPropertyValue("freeConnectionTimeout",
resolveProperty(namedPoolProperty(poolName, "free-connection-timeout"),
resolveProperty(poolProperty("free-connection-timeout"),
(Integer) enablePoolAttributes.get("freeConnectionTimeout"))));
enablePoolAttributes.<Integer>getNumber("freeConnectionTimeout"))));
poolFactoryBean.addPropertyValue("idleTimeout",
resolveProperty(namedPoolProperty(poolName, "idle-timeout"),
resolveProperty(poolProperty("idle-timeout"),
(Long) enablePoolAttributes.get("idleTimeout"))));
enablePoolAttributes.<Long>getNumber("idleTimeout"))));
poolFactoryBean.addPropertyValue("loadConditioningInterval",
resolveProperty(namedPoolProperty(poolName, "load-conditioning-interval"),
resolveProperty(poolProperty("load-conditioning-interval"),
(Integer) enablePoolAttributes.get("loadConditioningInterval"))));
enablePoolAttributes.<Integer>getNumber("loadConditioningInterval"))));
poolFactoryBean.addPropertyValue("maxConnections",
resolveProperty(namedPoolProperty(poolName, "max-connections"),
resolveProperty(poolProperty("max-connections"),
(Integer) enablePoolAttributes.get("maxConnections"))));
enablePoolAttributes.<Integer>getNumber("maxConnections"))));
poolFactoryBean.addPropertyValue("minConnections",
resolveProperty(namedPoolProperty(poolName, "min-connections"),
resolveProperty(poolProperty("min-connections"),
(Integer) enablePoolAttributes.get("minConnections"))));
enablePoolAttributes.<Integer>getNumber("minConnections"))));
poolFactoryBean.addPropertyValue("multiUserAuthentication",
resolveProperty(namedPoolProperty(poolName, "multi-user-authentication"),
resolveProperty(poolProperty("multi-user-authentication"),
(Boolean) enablePoolAttributes.get("multiUserAuthentication"))));
enablePoolAttributes.getBoolean("multiUserAuthentication"))));
poolFactoryBean.addPropertyValue("pingInterval",
resolveProperty(namedPoolProperty(poolName, "ping-interval"),
resolveProperty(poolProperty("ping-interval"),
(Long) enablePoolAttributes.get("pingInterval"))));
enablePoolAttributes.<Long>getNumber("pingInterval"))));
poolFactoryBean.addPropertyValue("poolConfigurers", resolvePoolConfigurers());
poolFactoryBean.addPropertyValue("prSingleHopEnabled",
resolveProperty(namedPoolProperty(poolName, "pr-single-hop-enabled"),
resolveProperty(poolProperty("pr-single-hop-enabled"),
(Boolean) enablePoolAttributes.get("prSingleHopEnabled"))));
enablePoolAttributes.getBoolean("prSingleHopEnabled"))));
poolFactoryBean.addPropertyValue("readTimeout",
resolveProperty(namedPoolProperty(poolName, "read-timeout"),
resolveProperty(poolProperty("read-timeout"),
(Integer) enablePoolAttributes.get("readTimeout"))));
enablePoolAttributes.<Integer>getNumber("readTimeout"))));
poolFactoryBean.addPropertyValue("retryAttempts",
resolveProperty(namedPoolProperty(poolName, "retry-attempts"),
resolveProperty(poolProperty("retry-attempts"),
(Integer) enablePoolAttributes.get("retryAttempts"))));
enablePoolAttributes.<Integer>getNumber("retryAttempts"))));
poolFactoryBean.addPropertyValue("serverGroup",
resolveProperty(namedPoolProperty(poolName, "server-group"),
resolveProperty(poolProperty("server-group"),
(String) enablePoolAttributes.get("serverGroup"))));
enablePoolAttributes.getString("serverGroup"))));
poolFactoryBean.addPropertyValue("socketBufferSize",
resolveProperty(namedPoolProperty(poolName, "socket-buffer-size"),
resolveProperty(poolProperty("socket-buffer-size"),
(Integer) enablePoolAttributes.get("socketBufferSize"))));
enablePoolAttributes.<Integer>getNumber("socketBufferSize"))));
poolFactoryBean.addPropertyValue("statisticInterval",
resolveProperty(namedPoolProperty(poolName, "statistic-interval"),
resolveProperty(poolProperty("statistic-interval"),
(Integer) enablePoolAttributes.get("statisticInterval"))));
enablePoolAttributes.<Integer>getNumber("statisticInterval"))));
poolFactoryBean.addPropertyValue("subscriptionAckInterval",
resolveProperty(namedPoolProperty(poolName, "subscription-ack-interval"),
resolveProperty(poolProperty("subscription-ack-interval"),
(Integer) enablePoolAttributes.get("subscriptionAckInterval"))));
enablePoolAttributes.<Integer>getNumber("subscriptionAckInterval"))));
poolFactoryBean.addPropertyValue("subscriptionEnabled",
resolveProperty(namedPoolProperty(poolName, "subscription-enabled"),
resolveProperty(poolProperty("subscription-enabled"),
(Boolean) enablePoolAttributes.get("subscriptionEnabled"))));
enablePoolAttributes.getBoolean("subscriptionEnabled"))));
poolFactoryBean.addPropertyValue("subscriptionMessageTrackingTimeout",
resolveProperty(namedPoolProperty(poolName, "subscription-message-tracking-timeout"),
resolveProperty(poolProperty("subscription-message-tracking-timeout"),
(Integer) enablePoolAttributes.get("subscriptionMessageTrackingTimeout"))));
enablePoolAttributes.<Integer>getNumber("subscriptionMessageTrackingTimeout"))));
poolFactoryBean.addPropertyValue("subscriptionRedundancy",
resolveProperty(namedPoolProperty(poolName, "subscription-redundancy"),
resolveProperty(poolProperty("subscription-redundancy"),
(Integer) enablePoolAttributes.get("subscriptionRedundancy"))));
enablePoolAttributes.<Integer>getNumber("subscriptionRedundancy"))));
poolFactoryBean.addPropertyValue("threadLocalConnections",
resolveProperty(namedPoolProperty(poolName, "thread-local-connections"),
resolveProperty(poolProperty("thread-local-connections"),
(Boolean) enablePoolAttributes.get("threadLocalConnections"))));
enablePoolAttributes.getBoolean("threadLocalConnections"))));
configurePoolConnections(poolName, enablePoolAttributes, poolFactoryBean);
@@ -221,7 +220,7 @@ public class AddPoolConfiguration extends AbstractAnnotationConfigSupport
* @see org.springframework.data.gemfire.config.annotation.ClientCacheApplication
* @see java.util.Map
*/
protected BeanDefinitionBuilder configurePoolConnections(String poolName, Map<String, Object> enablePoolAttributes,
protected BeanDefinitionBuilder configurePoolConnections(String poolName, AnnotationAttributes enablePoolAttributes,
BeanDefinitionBuilder poolFactoryBean) {
configurePoolLocators(poolName, enablePoolAttributes, poolFactoryBean);
@@ -230,7 +229,7 @@ public class AddPoolConfiguration extends AbstractAnnotationConfigSupport
return poolFactoryBean;
}
protected BeanDefinitionBuilder configurePoolLocators(String poolName, Map<String, Object> enablePoolAttributes,
protected BeanDefinitionBuilder configurePoolLocators(String poolName, AnnotationAttributes enablePoolAttributes,
BeanDefinitionBuilder poolFactoryBean) {
String locatorsFromProperty = resolveProperty(namedPoolProperty(poolName, "locators"),
@@ -247,7 +246,7 @@ public class AddPoolConfiguration extends AbstractAnnotationConfigSupport
return poolFactoryBean;
}
protected BeanDefinitionBuilder configurePoolServers(String poolName, Map<String, Object> enablePoolAttributes,
protected BeanDefinitionBuilder configurePoolServers(String poolName, AnnotationAttributes enablePoolAttributes,
BeanDefinitionBuilder poolFactoryBean) {
String serversFromProperty = resolveProperty(namedPoolProperty(poolName, "servers"),
@@ -264,11 +263,11 @@ public class AddPoolConfiguration extends AbstractAnnotationConfigSupport
return poolFactoryBean;
}
protected ConnectionEndpointList parseConnectionEndpoints(Map<String, Object> enablePoolAttributes,
protected ConnectionEndpointList parseConnectionEndpoints(AnnotationAttributes enablePoolAttributes,
String arrayAttributeName, String stringAttributeName, int defaultPort) {
AnnotationAttributes[] connectionEndpointsMetaData =
(AnnotationAttributes[]) enablePoolAttributes.get(arrayAttributeName);
enablePoolAttributes.getAnnotationArray(arrayAttributeName);
ConnectionEndpointList connectionEndpoints = new ConnectionEndpointList();
@@ -277,7 +276,7 @@ public class AddPoolConfiguration extends AbstractAnnotationConfigSupport
connectionEndpoints.add(newConnectionEndpoint((String) annotationAttributes.get("host"),
(Integer) annotationAttributes.get("port"))));
Optional.ofNullable((String) enablePoolAttributes.get(stringAttributeName))
Optional.ofNullable(enablePoolAttributes.getString(stringAttributeName))
.filter(StringUtils::hasText)
.ifPresent(hostsPorts ->
connectionEndpoints.add(ConnectionEndpointList.parse(defaultPort, hostsPorts.split(","))));

View File

@@ -14,14 +14,14 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.util.Map;
import java.util.Arrays;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.data.gemfire.util.ArrayUtils;
/**
* The {@link AddPoolsConfiguration} class registers {@link org.springframework.data.gemfire.client.PoolFactoryBean}
@@ -42,15 +42,17 @@ public class AddPoolsConfiguration extends AddPoolConfiguration {
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
if (importingClassMetadata.hasAnnotation(EnablePools.class.getName())) {
Map<String, Object> enablePoolsAttributes = importingClassMetadata.getAnnotationAttributes(
EnablePools.class.getName());
AnnotationAttributes[] serversAttributes = (AnnotationAttributes[]) enablePoolsAttributes.get("pools");
AnnotationAttributes enablePoolsAttributes =
getAnnotationAttributes(importingClassMetadata, EnablePools.class.getName());
for (AnnotationAttributes enablePoolAttributes : serversAttributes) {
registerPoolFactoryBeanDefinition(enablePoolAttributes, registry);
}
AnnotationAttributes[] serversAttributes =
enablePoolsAttributes.getAnnotationArray("pools");
Arrays.stream(ArrayUtils.nullSafeArray(serversAttributes, AnnotationAttributes.class))
.forEach(enablePoolAttributes -> registerPoolFactoryBeanDefinition(enablePoolAttributes, registry));
}
}
}

View File

@@ -99,10 +99,9 @@ public class DiskStoreConfiguration extends AbstractAnnotationConfigSupport
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
if (importingClassMetadata.hasAnnotation(getAnnotationTypeName())) {
if (isAnnotationPresent(importingClassMetadata)) {
AnnotationAttributes enableDiskStoreAttributes =
AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(getAnnotationTypeName()));
AnnotationAttributes enableDiskStoreAttributes = getAnnotationAttributes(importingClassMetadata);
registerDiskStoreBeanDefinition(enableDiskStoreAttributes, registry);
}
@@ -332,7 +331,8 @@ public class DiskStoreConfiguration extends AbstractAnnotationConfigSupport
private <T> BeanDefinitionBuilder setPropertyValueIfNotDefault(BeanDefinitionBuilder beanDefinitionBuilder,
String propertyName, T value, T defaultValue) {
return (value != null && !value.equals(defaultValue) ?
beanDefinitionBuilder.addPropertyValue(propertyName, value) : beanDefinitionBuilder);
return value != null && !value.equals(defaultValue)
? beanDefinitionBuilder.addPropertyValue(propertyName, value)
: beanDefinitionBuilder;
}
}

View File

@@ -14,15 +14,14 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import static java.util.Arrays.stream;
import static org.springframework.data.gemfire.util.ArrayUtils.nullSafeArray;
import java.util.Arrays;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.data.gemfire.util.ArrayUtils;
/**
* The {@link DiskStoresConfiguration} class is a Spring {@link org.springframework.context.annotation.ImportBeanDefinitionRegistrar}
@@ -38,25 +37,23 @@ import org.springframework.core.type.AnnotationMetadata;
*/
public class DiskStoresConfiguration extends DiskStoreConfiguration {
/* (non-Javadoc) */
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
if (importingClassMetadata.hasAnnotation(EnableDiskStores.class.getName())) {
AnnotationAttributes enableDiskStoresAttributes = AnnotationAttributes.fromMap(
importingClassMetadata.getAnnotationAttributes(EnableDiskStores.class.getName()));
AnnotationAttributes enableDiskStoresAttributes =
getAnnotationAttributes(importingClassMetadata, EnableDiskStores.class.getName());
AnnotationAttributes[] diskStores =
enableDiskStoresAttributes.getAnnotationArray("diskStores");
stream(nullSafeArray(diskStores, AnnotationAttributes.class)).forEach(diskStoreAttributes ->
registerDiskStoreBeanDefinition(
Arrays.stream(ArrayUtils.nullSafeArray(diskStores, AnnotationAttributes.class))
.forEach(diskStoreAttributes -> registerDiskStoreBeanDefinition(
mergeDiskStoreAttributes(enableDiskStoresAttributes, diskStoreAttributes), registry));
}
}
/* (non-Javadoc) */
protected AnnotationAttributes mergeDiskStoreAttributes(AnnotationAttributes enableDiskStoresAttributes,
AnnotationAttributes diskStoreAttributes) {
@@ -72,7 +69,6 @@ public class DiskStoresConfiguration extends DiskStoreConfiguration {
return diskStoreAttributes;
}
/* (non-Javadoc) */
private <T> void setAttributeIfNotDefault(AnnotationAttributes diskStoreAttributes,
String attributeName, T newValue, T defaultValue) {
@@ -83,7 +79,6 @@ public class DiskStoresConfiguration extends DiskStoreConfiguration {
}
}
/* (non-Javadoc) */
private String toString(Object value) {
return String.valueOf(value);
}

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import static org.springframework.data.gemfire.config.annotation.EnableEviction.EvictionPolicy;
@@ -34,6 +33,7 @@ import java.util.function.Supplier;
import org.apache.geode.cache.EvictionAttributes;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.util.ObjectSizer;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import static org.springframework.data.gemfire.config.annotation.EnableExpiration.ExpirationPolicy;
@@ -33,6 +32,7 @@ import java.util.function.Supplier;
import org.apache.geode.cache.ExpirationAction;
import org.apache.geode.cache.ExpirationAttributes;
import org.apache.geode.cache.Region;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
@@ -138,7 +138,6 @@ public class ExpirationConfiguration extends AbstractAnnotationConfigSupport imp
return new BeanPostProcessor() {
@Override
@SuppressWarnings("unchecked")
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return isRegionFactoryBean(bean) ? getExpirationPolicyConfigurer().configure(bean) : bean;
}

View File

@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.gemfire.config.annotation;
import static org.springframework.data.gemfire.util.RuntimeExceptionFactory.newIllegalArgumentException;
@@ -23,7 +22,7 @@ import java.util.Map;
import java.util.Optional;
import org.apache.geode.cache.GemFireCache;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -34,6 +33,8 @@ import org.springframework.data.gemfire.config.annotation.support.GemFireAsLastR
import org.springframework.data.gemfire.config.annotation.support.GemFireAsLastResourceConnectionClosingAspect;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.aspectj.lang.annotation.Aspect;
/**
* The {@link GemFireAsLastResourceConfiguration} class is a Spring {@link Configuration @Configuration}
* annotated class used to configure the GemFire "Last Resource" Spring Data GemFire {@link Aspect Aspects}.
@@ -58,14 +59,11 @@ public class GemFireAsLastResourceConfiguration implements ImportAware {
private Integer enableTransactionManagementOrder;
/* (non-Javadoc) */
@Override
public void setImportMetadata(AnnotationMetadata importMetadata) {
this.enableTransactionManagementOrder = resolveEnableTransactionManagementOrder(importMetadata);
}
/* (non-Javadoc) */
@SuppressWarnings("all")
protected int resolveEnableTransactionManagementOrder(AnnotationMetadata importMetadata) {
AnnotationAttributes enableTransactionManagementAttributes =
@@ -81,8 +79,6 @@ public class GemFireAsLastResourceConfiguration implements ImportAware {
EnableTransactionManagement.class.getSimpleName(), String.valueOf(order)));
}
/* (non-Javadoc) */
@SuppressWarnings("all")
protected AnnotationAttributes resolveEnableTransactionManagementAttributes(
AnnotationMetadata importMetadata) {
@@ -98,7 +94,6 @@ public class GemFireAsLastResourceConfiguration implements ImportAware {
EnableTransactionManagement.class.getSimpleName()));
}
/* (non-Javadoc) */
protected Integer getEnableTransactionManagementOrder() {
return Optional.ofNullable(this.enableTransactionManagementOrder)
@@ -109,14 +104,15 @@ public class GemFireAsLastResourceConfiguration implements ImportAware {
Configuration.class.getSimpleName(), EnableGemFireAsLastResource.class.getSimpleName()));
}
/* (non-Javadoc) */
@Bean
public Object gemfireCachePostProcessor(@Autowired(required = false) GemFireCache gemfireCache) {
Optional.ofNullable(gemfireCache).ifPresent(cache -> cache.setCopyOnRead(true));
Optional.ofNullable(gemfireCache)
.ifPresent(cache -> cache.setCopyOnRead(true));
return null;
}
/* (non-Javadoc) */
@Bean
public GemFireAsLastResourceConnectionAcquiringAspect gemfireJcaConnectionAcquiringAspect() {
@@ -130,7 +126,6 @@ public class GemFireAsLastResourceConfiguration implements ImportAware {
return connectionAcquiringAspect;
}
/* (non-Javadoc) */
@Bean
public GemFireAsLastResourceConnectionClosingAspect gemfireJcaConnectionClosingAspect() {

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;
@@ -23,6 +22,7 @@ import java.util.Optional;
import java.util.Properties;
import org.apache.geode.distributed.Locator;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.data.gemfire.GemfireUtils;
import org.springframework.data.gemfire.config.annotation.support.EmbeddedServiceConfigurationSupport;

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import static java.util.Arrays.stream;
@@ -30,6 +29,7 @@ import java.util.Properties;
import java.util.Set;
import org.apache.geode.cache.Region;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValue;
import org.springframework.beans.factory.config.BeanDefinition;

View File

@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;
@@ -21,6 +20,7 @@ import java.util.Optional;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.pdx.PdxSerializer;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
@@ -241,7 +241,6 @@ public class PdxConfiguration extends AbstractAnnotationConfigSupport implements
* @see #getBeanFactory()
*/
@NonNull
@SuppressWarnings("unchecked")
protected PdxSerializer resolvePdxSerializer() {
BeanFactory beanFactory = getBeanFactory();

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;

View File

@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.gemfire.config.annotation;
import org.springframework.context.annotation.Bean;
@@ -30,7 +29,6 @@ import org.springframework.data.gemfire.config.annotation.support.RegionDataAcce
@SuppressWarnings("unused")
public class RegionDataAccessTracingConfiguration {
/* (non-Javadoc) */
@Bean
public RegionDataAccessTracingAspect regionDataAccessTracingAspect() {
return new RegionDataAccessTracingAspect();

View File

@@ -14,7 +14,6 @@
* limitations under the License.
*
*/
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;

View File

@@ -68,6 +68,7 @@ import org.slf4j.LoggerFactory;
* @author John Blum
* @author Udo Kohlmeyer
* @see java.lang.ClassLoader
* @see java.lang.annotation.Annotation
* @see org.springframework.beans.factory.BeanClassLoaderAware
* @see org.springframework.beans.factory.BeanFactory
* @see org.springframework.beans.factory.BeanFactoryAware
@@ -77,7 +78,10 @@ import org.slf4j.LoggerFactory;
* @see org.springframework.context.EnvironmentAware
* @see org.springframework.context.expression.BeanFactoryAccessor
* @see org.springframework.context.expression.EnvironmentAccessor
* @see org.springframework.core.annotation.AnnotationAttributes
* @see org.springframework.core.env.Environment
* @see org.springframework.core.type.AnnotationMetadata
* @see org.springframework.core.type.MethodMetadata
* @see org.springframework.expression.EvaluationContext
* @since 1.9.0
*/
@@ -847,6 +851,21 @@ public abstract class AbstractAnnotationConfigSupport
return resolveBeanClass(beanDefinition, resolveBeanClassLoader(registry));
}
/**
* Resolves the {@link Class type} of the bean defined by the given {@link BeanDefinition}.
*
* @param beanDefinition {@link BeanDefinition} defining the bean from which the {@link Class type} is resolved.
* @param beanFactory {@link ConfigurableBeanFactory} used to resolve the {@link ClassLoader} used to resolve
* the bean's {@link Class type}.
* @return an {@link Optional} {@link Class} specifying the resolved type of the bean.
* @see org.springframework.beans.factory.config.BeanDefinition
* @see org.springframework.beans.factory.config.ConfigurableBeanFactory
* @see #resolveBeanClass(BeanDefinition, ClassLoader)
*/
protected Optional<Class<?>> resolveBeanClass(BeanDefinition beanDefinition, ConfigurableBeanFactory beanFactory) {
return resolveBeanClass(beanDefinition, beanFactory.getBeanClassLoader());
}
/**
* Resolves the {@link Class type} of the bean defined by the given {@link BeanDefinition}.
*

View File

@@ -33,6 +33,7 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.data.gemfire.CacheFactoryBean;
import org.springframework.data.gemfire.client.ClientCacheFactoryBean;
@@ -48,13 +49,17 @@ import org.springframework.util.StringUtils;
* the configuration of Pivotal GemFire and Apache Geode embedded services.
*
* @author John Blum
* @see java.util.Map
* @see java.util.Properties
* @see org.springframework.beans.factory.BeanFactory
* @see org.springframework.beans.factory.config.AutowireCapableBeanFactory
* @see org.springframework.beans.factory.config.BeanDefinitionHolder
* @see org.springframework.beans.factory.config.BeanPostProcessor
* @see org.springframework.beans.factory.config.NamedBeanHolder
* @see org.springframework.beans.factory.support.BeanDefinitionBuilder
* @see org.springframework.beans.factory.support.BeanDefinitionRegistry
* @see org.springframework.context.annotation.ImportBeanDefinitionRegistrar
* @see org.springframework.core.annotation.AnnotationAttributes
* @see org.springframework.core.type.AnnotationMetadata
* @see org.springframework.data.gemfire.config.annotation.AbstractCacheConfiguration
* @see org.springframework.data.gemfire.config.annotation.support.AbstractAnnotationConfigSupport
@@ -91,7 +96,9 @@ public abstract class EmbeddedServiceConfigurationSupport extends AbstractAnnota
BeanDefinitionRegistry registry) {
if (isAnnotationPresent(importingClassMetadata)) {
Map<String, Object> annotationAttributes = getAnnotationAttributes(importingClassMetadata);
AnnotationAttributes annotationAttributes = getAnnotationAttributes(importingClassMetadata);
registerBeanDefinitions(importingClassMetadata, annotationAttributes, registry);
setGemFireProperties(importingClassMetadata, annotationAttributes, registry);
}
@@ -104,7 +111,7 @@ public abstract class EmbeddedServiceConfigurationSupport extends AbstractAnnota
}
protected void setGemFireProperties(AnnotationMetadata importingClassMetadata,
Map<String, Object> annotationAttributes, BeanDefinitionRegistry registry) {
AnnotationAttributes annotationAttributes, BeanDefinitionRegistry registry) {
Properties gemfireProperties = toGemFireProperties(annotationAttributes);
@@ -319,7 +326,7 @@ public abstract class EmbeddedServiceConfigurationSupport extends AbstractAnnota
Properties gemfirePropertiesBean = (Properties) bean;
gemfirePropertiesBean.putAll(gemfireProperties);
gemfirePropertiesBean.putAll(this.gemfireProperties);
}
return bean;

View File

@@ -0,0 +1,139 @@
/*
* Copyright 2018 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.data.gemfire.config.annotation;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.server.CacheServer;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.gemfire.process.ProcessWrapper;
import org.springframework.data.gemfire.test.support.ClientServerIntegrationTestsSupport;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
/**
* Integration Tests to test and assert the property configuration of a {@link PeerCacheApplication} along with
* added {@link CacheServer CacheServers} using the {@link EnableCacheServer} annotation.
*
* @author John Blum
* @see org.junit.Test
* @see org.apache.geode.cache.Cache
* @see org.apache.geode.cache.server.CacheServer
* @see org.apache.geode.distributed.internal.DistributionConfig
* @see org.springframework.test.context.junit4.SpringRunner
* @since 2.2.0
*/
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = PeerCacheApplicationWithAddedCacheServerIntegrationTests.TestPeerCacheConfiguration.class)
@SuppressWarnings("unused")
// TODO: Convert to Unit Test once STDG is used by SDG.
public class PeerCacheApplicationWithAddedCacheServerIntegrationTests extends ClientServerIntegrationTestsSupport {
private static int cacheServerPort;
private static int locatorPort;
private static ProcessWrapper gemfireLocator;
private static final String GEMFIRE_LOG_LEVEL = "config";
@BeforeClass
public static void startGemFireLocator() throws Exception {
locatorPort = findAvailablePort();
gemfireLocator = run(TestLocatorConfiguration.class,
"-Dspring.data.gemfire.locator.port=" + locatorPort,
String.format("-Dgemfire.%s=%s", DistributionConfig.ENABLE_CLUSTER_CONFIGURATION_NAME, false));
waitForServerToStart("localhost", locatorPort);
cacheServerPort = findAvailablePort();
System.setProperty("spring.data.gemfire.cache.peer.locators", String.format("localhost[%d]", locatorPort));
System.setProperty("spring.data.gemfire.cache.server.port", String.valueOf(cacheServerPort));
}
@AfterClass
public static void stopGemFireLocator() {
stop(gemfireLocator);
System.getProperties().stringPropertyNames().stream()
.filter(propertyName -> propertyName.startsWith("spring.data.gemfire."))
.forEach(System::clearProperty);
}
@Autowired
private Cache cache;
@Before
public void setup() {
assertThat(this.cache).isNotNull();
assertThat(this.cache.getName()).isEqualTo("PeerCacheApplicationWithAddedCacheServerIntegrationTests");
assertThat(this.cache.getDistributedSystem()).isNotNull();
assertThat(this.cache.getDistributedSystem().getProperties()).isNotNull();
assertThat(this.cache.getDistributedSystem().getProperties().getProperty(DistributionConfig.LOCATORS_NAME))
.isEqualTo(String.format("localhost[%d]", locatorPort));
assertThat(this.cache.getDistributedSystem().getProperties().getProperty(DistributionConfig.NAME_NAME))
.isEqualTo("PeerCacheApplicationWithAddedCacheServerIntegrationTests");
}
@Test
public void cacheServerWasConfiguredCorrectly() {
List<CacheServer> cacheServers = this.cache.getCacheServers();
assertThat(cacheServers).isNotNull();
assertThat(cacheServers).hasSize(1);
CacheServer cacheServer = cacheServers.get(0);
assertThat(cacheServer).isNotNull();
assertThat(cacheServer.getPort()).isEqualTo(cacheServerPort);
}
@LocatorApplication(logLevel = GEMFIRE_LOG_LEVEL)
static class TestLocatorConfiguration {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TestLocatorConfiguration.class);
applicationContext.registerShutdownHook();
block();
}
}
@EnableCacheServer
@PeerCacheApplication(name = "PeerCacheApplicationWithAddedCacheServerIntegrationTests")
static class TestPeerCacheConfiguration { }
}