DATAGEODE-113 - Add name attribute to EnableGemFireProperties.

This commit is contained in:
John Blum
2018-06-08 00:23:15 -07:00
parent 61eae77470
commit 50d0ecd8f7
4 changed files with 128 additions and 48 deletions

View File

@@ -115,14 +115,14 @@ public @interface EnableGemFireProperties {
*
* Defaults to unset.
*/
String bindAddress() default "";
String bindAddress() default GemFirePropertiesConfiguration.DEFAULT_BIND_ADDRESS;
/**
* Declarative initialization file for the members cache.
*
* Defaults to unset.
*/
String cacheXmlFile() default "";
String cacheXmlFile() default GemFirePropertiesConfiguration.DEFAULT_CACHE_XML_FILE;
/**
* This property specifies the directory in which the cluster configuration related disk-store and artifacts
@@ -131,7 +131,8 @@ public @interface EnableGemFireProperties {
*
* Defaults to unset.
*/
String clusterConfigurationDirectory() default "";
String clusterConfigurationDirectory()
default GemFirePropertiesConfiguration.DEFAULT_CLUSTER_CONFIGURATION_DIRECTORY;
/**
* Used only by clients in a client/server installation. This is a client-side property
@@ -204,7 +205,8 @@ public @interface EnableGemFireProperties {
*
* Defaults to {@literal false}.
*/
boolean enableNetworkPartitionDetection() default GemFirePropertiesConfiguration.DEFAULT_ENABLE_NETWORK_PARTITION_DETECTION;
boolean enableNetworkPartitionDetection()
default GemFirePropertiesConfiguration.DEFAULT_ENABLE_NETWORK_PARTITION_DETECTION;
/**
* Whether partitioned regions will put redundant copies of the same data in different members
@@ -232,7 +234,8 @@ public @interface EnableGemFireProperties {
*
* Defaults to {@literal false}.
*/
boolean loadClusterConfigurationFromDirectory() default GemFirePropertiesConfiguration.DEFAULT_LOAD_CLUSTER_CONFIGURATION_FROM_DIRECTORY;
boolean loadClusterConfigurationFromDirectory()
default GemFirePropertiesConfiguration.DEFAULT_LOAD_CLUSTER_CONFIGURATION_FROM_DIRECTORY;
/**
* The number of seconds that a member should wait for a Locator to start if a Locator is not available
@@ -302,6 +305,14 @@ public @interface EnableGemFireProperties {
*/
String membershipPortRange() default GemFirePropertiesConfiguration.DEFAULT_MEMBERSHIP_PORT_RANGE;
/**
* Configures the {@link String name} of this member in the Apache Geode/Pivotal GemFire distributed system
* whether the member is a client in the client/server topology or a peer in the cluster.
*
* Defaults to unset.
*/
String name() default GemFirePropertiesConfiguration.DEFAULT_NAME;
/**
* Defines this members redundancy zone. Used to separate members into different groups for satisfying
* Partitioned Region redundancy. If this property is set, GemFire will not put redundant copies of data
@@ -311,7 +322,7 @@ public @interface EnableGemFireProperties {
*
* @see <a href="http://geode.docs.pivotal.io/docs/developing/partitioned_regions/configuring_ha_for_pr.html">Configure High Availability for a Partitioned Region</a>
*/
String redundancyZone() default "";
String redundancyZone() default GemFirePropertiesConfiguration.DEFAULT_REDUNDANCY_ZONE;
/**
* Used to configure the Locators that a cluster will use in order to connect to a remote site in a multi-site
@@ -338,7 +349,7 @@ public @interface EnableGemFireProperties {
*
* Defaults to unset.
*/
String remoteLocators() default "";
String remoteLocators() default GemFirePropertiesConfiguration.DEFAULT_REMOTE_LOCATORS;
/**
* When this property is set to {@literal true}, the primary server drops unresponsive clients
@@ -350,6 +361,17 @@ public @interface EnableGemFireProperties {
*/
boolean removeUnresponsiveClient() default GemFirePropertiesConfiguration.DEFAULT_REMOVE_UNRESPONSIVE_CLIENT;
/**
* A semicolon-separated list of items that become full class names of objects that the system will serialize
* when the property {@link #validateSerializableObjects()} is set to {@literal true}.
*
* The list is expanded using the patterns specified in the createFilter method at
* <a href="https://docs.oracle.com/javase/9/docs/api/java/io/ObjectInputFilter.Config.html">Class ObjectInputFilter.Config</a>.
*
* Defaults to unset.
*/
String serializableObjectFilter() default GemFirePropertiesConfiguration.DEFAULT_SERIALIZABLE_OBJECT_FILTER;
/**
* Receive buffer sizes in bytes of the TCP/IP connections used for data transmission. To minimize the buffer size
* allocation needed for distributing large, serializable messages, the messages are sent in chunks. This setting
@@ -433,6 +455,19 @@ public @interface EnableGemFireProperties {
*
* Defaults to unset.
*/
String userCommandPackages() default "";
String userCommandPackages() default GemFirePropertiesConfiguration.DEFAULT_USER_COMMAND_PACKAGES;
/**
* A boolean that defaults to {@literal false}. When {@literal true}, instances of classes that are not internal
* to Apache Geode/Pivotal GemFire and whose class name is not allowed by the list defined in
* the {@link #serializableObjectFilter()} property will not be permitted to be deserialized.
*
* An {@literal IncompatibleClassException} is thrown for objects not listed. JDK 8 build 121 or a later build
* must be installed to use this property. Servers and clients that do not meet this requirement
* will throw an exception upon startup.
*
* Defaults to {@literal false}.
*/
boolean validateSerializableObjects() default GemFirePropertiesConfiguration.DEFAULT_VALIDATE_SERIALIZABLE_OBJECTS;
}

View File

@@ -17,6 +17,7 @@
package org.springframework.data.gemfire.config.annotation;
import java.lang.annotation.Annotation;
import java.util.Map;
import java.util.Properties;
@@ -44,6 +45,7 @@ public class GemFirePropertiesConfiguration extends EmbeddedServiceConfiguration
public static final boolean DEFAULT_LOAD_CLUSTER_CONFIGURATION_FROM_DIRECTORY = false;
public static final boolean DEFAULT_LOCK_MEMORY = false;
public static final boolean DEFAULT_REMOVE_UNRESPONSIVE_CLIENT = false;
public static final boolean DEFAULT_VALIDATE_SERIALIZABLE_OBJECTS = false;
public static final int DEFAULT_ACK_SEVERE_ALERT_THRESHOLD = 0;
public static final int DEFAULT_ACK_WAIT_THRESHOLD = 15;
@@ -63,15 +65,26 @@ public class GemFirePropertiesConfiguration extends EmbeddedServiceConfiguration
public static final long DEFAULT_MEMBER_TIMEOUT = 5000L;
public static final long DEFAULT_SOCKET_LEASE_TIME = 60000L;
public static final String DEFAULT_BIND_ADDRESS = "";
public static final String DEFAULT_CACHE_XML_FILE = "";
public static final String DEFAULT_CLUSTER_CONFIGURATION_DIRECTORY = "";
public static final String DEFAULT_CONFLATE_EVENTS = "server";
public static final String DEFAULT_DEPLOY_WORKING_DIRECTORY = ".";
public static final String DEFAULT_MEMBERSHIP_PORT_RANGE = "1024-65535";
public static final String DEFAULT_NAME = "";
public static final String DEFAULT_REDUNDANCY_ZONE = "";
public static final String DEFAULT_REMOTE_LOCATORS = "";
public static final String DEFAULT_SERIALIZABLE_OBJECT_FILTER = "";
public static final String DEFAULT_USER_COMMAND_PACKAGES = "";
@SuppressWarnings("unused")
public static final String[] DEFAULT_GROUPS = {};
/**
* {@inheritDoc}
*/
@Override
protected Class getAnnotationType() {
protected Class<? extends Annotation> getAnnotationType() {
return EnableGemFireProperties.class;
}
@@ -80,6 +93,7 @@ public class GemFirePropertiesConfiguration extends EmbeddedServiceConfiguration
*/
@Override
protected Properties toGemFireProperties(Map<String, Object> annotationAttributes) {
PropertiesBuilder gemfireProperties = new PropertiesBuilder();
gemfireProperties.setPropertyIfNotDefault("ack-severe-alert-threshold",
@@ -149,6 +163,8 @@ public class GemFirePropertiesConfiguration extends EmbeddedServiceConfiguration
gemfireProperties.setPropertyIfNotDefault("membership-port-range",
annotationAttributes.get("membershipPortRange"), DEFAULT_MEMBERSHIP_PORT_RANGE);
gemfireProperties.setProperty("name", annotationAttributes.get("name"));
gemfireProperties.setProperty("redundancy-zone", annotationAttributes.get("redundancyZone"));
gemfireProperties.setProperty("remote-locators", annotationAttributes.get("remoteLocators"));
@@ -156,13 +172,17 @@ public class GemFirePropertiesConfiguration extends EmbeddedServiceConfiguration
gemfireProperties.setPropertyIfNotDefault("remove-unresponsive-client",
annotationAttributes.get("removeUnresponsiveClient"), DEFAULT_REMOVE_UNRESPONSIVE_CLIENT);
gemfireProperties.setProperty("serializable-object-filter",
annotationAttributes.get("serializableObjectFilter"));
gemfireProperties.setPropertyIfNotDefault("socket-buffer-size",
annotationAttributes.get("socketBufferSize"), DEFAULT_SOCKET_BUFFER_SIZE);
gemfireProperties.setPropertyIfNotDefault("socket-lease-time",
annotationAttributes.get("socketLeaseTime"), DEFAULT_SOCKET_LEASE_TIME);
gemfireProperties.setPropertyIfNotDefault("tcp-port", annotationAttributes.get("tcpPort"), DEFAULT_TCP_PORT);
gemfireProperties.setPropertyIfNotDefault("tcp-port",
annotationAttributes.get("tcpPort"), DEFAULT_TCP_PORT);
gemfireProperties.setPropertyIfNotDefault("tombstone-gc-threshold",
annotationAttributes.get("tombstoneGcThreshold"), DEFAULT_TOMBSTONE_THRESHOLD);
@@ -178,6 +198,9 @@ public class GemFirePropertiesConfiguration extends EmbeddedServiceConfiguration
gemfireProperties.setProperty("user-command-packages", annotationAttributes.get("userCommandPackages"));
gemfireProperties.setPropertyIfNotDefault("validate-serializable-objects",
annotationAttributes.get("validateSerializableObjects"), DEFAULT_VALIDATE_SERIALIZABLE_OBJECTS);
return gemfireProperties.build();
}
}

View File

@@ -97,13 +97,11 @@ public abstract class EmbeddedServiceConfigurationSupport extends AbstractAnnota
}
}
/* (non-Javadoc) */
@SuppressWarnings("unused")
protected void registerBeanDefinitions(AnnotationMetadata importingClassMetaData,
Map<String, Object> annotationAttributes, BeanDefinitionRegistry registry) {
}
/* (non-Javadoc) */
protected void setGemFireProperties(AnnotationMetadata importingClassMetadata,
Map<String, Object> annotationAttributes, BeanDefinitionRegistry registry) {
@@ -119,20 +117,16 @@ public abstract class EmbeddedServiceConfigurationSupport extends AbstractAnnota
}
}
/* (non-Javadoc) */
protected abstract Properties toGemFireProperties(Map<String, Object> annotationAttributes);
/* (non-Javadoc) */
protected boolean isAnnotationPresent(AnnotationMetadata importingClassMetadata) {
return importingClassMetadata.hasAnnotation(getAnnotationTypeName());
}
/* (non-Javadoc) */
protected boolean hasProperties(Properties properties) {
return !CollectionUtils.isEmpty(properties);
}
/* (non-Javadoc) */
protected void registerGemFirePropertiesBeanPostProcessor(BeanDefinitionRegistry registry,
Properties customGemFireProperties) {
@@ -144,22 +138,18 @@ public abstract class EmbeddedServiceConfigurationSupport extends AbstractAnnota
BeanDefinitionReaderUtils.registerBeanDefinition(newBeanDefinitionHolder(builder), registry);
}
/* (non-Javadoc) */
protected BeanDefinitionHolder newBeanDefinitionHolder(BeanDefinitionBuilder builder) {
return new BeanDefinitionHolder(builder.getBeanDefinition(), generateBeanName());
}
/* (non-Javadoc) */
protected String generateBeanName() {
return generateBeanName(getAnnotationType());
}
/* (non-Javadoc) */
protected String generateBeanName(Class<?> typeQualifier) {
return generateBeanName(typeQualifier.getSimpleName());
}
/* (non-Javadoc) */
protected String generateBeanName(String nameQualifier) {
return String.format("%1$s.%2$s", getClass().getName(), nameQualifier);
}
@@ -199,22 +189,18 @@ public abstract class EmbeddedServiceConfigurationSupport extends AbstractAnnota
}
}
/* (non-Javadoc) */
protected String resolveHost(String hostname) {
return resolveHost(hostname, DEFAULT_HOST);
}
/* (non-Javadoc) */
protected String resolveHost(String hostname, String defaultHostname) {
return Optional.ofNullable(hostname).filter(StringUtils::hasText).orElse(defaultHostname);
}
/* (non-Javadoc) */
protected Integer resolvePort(Integer port) {
return resolvePort(port, DEFAULT_PORT);
}
/* (non-Javadoc) */
protected Integer resolvePort(Integer port, Integer defaultPort) {
return Optional.ofNullable(port).orElse(defaultPort);
}
@@ -240,7 +226,9 @@ public abstract class EmbeddedServiceConfigurationSupport extends AbstractAnnota
* @see java.util.Properties
*/
protected GemFirePropertiesBeanPostProcessor(Properties gemfireProperties) {
Assert.notEmpty(gemfireProperties, "GemFire Properties are required");
this.gemfireProperties = gemfireProperties;
}
@@ -251,7 +239,9 @@ public abstract class EmbeddedServiceConfigurationSupport extends AbstractAnnota
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Properties && GEMFIRE_PROPERTIES_BEAN_NAME.equals(beanName)) {
Properties gemfirePropertiesBean = (Properties) bean;
gemfirePropertiesBean.putAll(gemfireProperties);
}

View File

@@ -57,14 +57,21 @@ public class EnableGemFirePropertiesIntegrationTests {
Optional.ofNullable(this.applicationContext).ifPresent(ConfigurableApplicationContext::close);
}
private ConfigurableApplicationContext newApplicationContext(Class<?>... annotatedClasses) {
return newApplicationContext(null, annotatedClasses);
}
private ConfigurableApplicationContext newApplicationContext(PropertySource<?> testPropertySource,
Class<?>... annotatedClasses) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
MutablePropertySources propertySources = applicationContext.getEnvironment().getPropertySources();
Optional.ofNullable(testPropertySource).ifPresent(it -> {
propertySources.addFirst(testPropertySource);
MutablePropertySources propertySources = applicationContext.getEnvironment().getPropertySources();
propertySources.addFirst(testPropertySource);
});
applicationContext.registerShutdownHook();
applicationContext.register(annotatedClasses);
@@ -259,6 +266,36 @@ public class EnableGemFirePropertiesIntegrationTests {
assertThat(gemfireProperties.getProperty("memcached-protocol")).isEqualTo("BINARY");
}
@Test
public void nameAndGroupGemFirePropertiesAnnotationConfiguration() {
this.applicationContext = newApplicationContext(TestNameAndGroupGemFirePropertiesAnnotationConfiguration.class);
assertThat(this.applicationContext).isNotNull();
assertThat(this.applicationContext.containsBean("gemfireCache")).isTrue();
assertThat(this.applicationContext.containsBean("gemfireProperties")).isTrue();
Properties gemfireProperties = this.applicationContext.getBean("gemfireProperties", Properties.class);
// TODO: uncomment when Spring Test for Apache Geode/Pivotal GemFire project replaces
// the test infrastructure classes in SDG.
/*
GemFireCache gemfireCache = this.applicationContext.getBean("gemfireCache", GemFireCache.class);
assertThat(gemfireCache).isNotNull();
assertThat(gemfireCache.getDistributedSystem()).isNotNull();
Properties gemfireProperties = gemfireCache.getDistributedSystem().getProperties();
*/
assertThat(gemfireProperties).isNotNull();
assertThat(gemfireProperties.containsKey("name")).isTrue();
assertThat(gemfireProperties.getProperty("name")).isEqualTo("TestName");
assertThat(gemfireProperties.containsKey("groups")).isTrue();
assertThat(gemfireProperties.getProperty("groups")).isEqualTo("TestGroupOne,TestGroupTwo");
}
@Test
public void offHeapGemFirePropertiesConfiguration() {
@@ -422,64 +459,60 @@ public class EnableGemFirePropertiesIntegrationTests {
@PeerCacheApplication
@EnableAuth
@EnableGemFireProperties
static class TestAuthGemFirePropertiesConfiguration {
}
static class TestAuthGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties
@EnableHttpService
static class TestHttpGemFirePropertiesConfiguration {
}
static class TestHttpGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties
@EnableLocator
static class TestLocatorGemFirePropertiesConfiguration {
}
static class TestLocatorGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties
@EnableLogging
static class TestLoggingGemFirePropertiesConfiguration {
}
static class TestLoggingGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties
@EnableManager
static class TestManagerGemFirePropertiesConfiguration {
}
static class TestManagerGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties
@EnableMemcachedServer
static class TestMemcachedServerGemFirePropertiesConfiguration {
}
static class TestMemcachedServerGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties(name = "TestName", groups = { "TestGroupOne", "TestGroupTwo" })
static class TestNameAndGroupGemFirePropertiesAnnotationConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties
@EnableOffHeap(memorySize = "64g")
static class TestOffHeapGemFirePropertiesConfiguration {
}
static class TestOffHeapGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties
@EnableRedisServer
static class TestRedisServerGemFirePropertiesConfiguration {
}
static class TestRedisServerGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties
@EnableSecurity
static class TestSecurityGemFirePropertiesConfiguration {
}
static class TestSecurityGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@@ -491,13 +524,12 @@ public class EnableGemFirePropertiesIntegrationTests {
@EnableSsl.ComponentAlias(component = EnableSsl.Component.GATEWAY, alias = "WanCert"),
@EnableSsl.ComponentAlias(component = EnableSsl.Component.WEB, alias = "HttpCert")
}, defaultCertificateAlias = "MockCert", protocols = "HTTP")
static class TestSslGemFirePropertiesConfiguration {
}
static class TestSslGemFirePropertiesConfiguration { }
@EnableGemFireMockObjects
@PeerCacheApplication
@EnableGemFireProperties
@EnableStatistics
static class TestStatisticsGemFirePropertiesConfiguration {
}
static class TestStatisticsGemFirePropertiesConfiguration { }
}