DATAGEODE-218 - Amended GatewayReceiverConfigurer to use LazyResolvingComposableGatewayReceiverConfigurer.

Amended GatewayReceiverFactoryBean to now define a List<GatewayReceiverConfigurer> rather than single GatewayReceiverConfigurer reference.

Resolves gh-26.
This commit is contained in:
Udo Kohlmeyer
2019-08-07 14:57:00 -07:00
committed by John Blum
parent 77c5c41214
commit d76a21b40e
3 changed files with 87 additions and 16 deletions

View File

@@ -13,15 +13,18 @@
* 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;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import org.apache.geode.cache.wan.GatewayReceiver;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanReference;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
@@ -48,7 +51,7 @@ import org.springframework.data.gemfire.wan.GatewayReceiverFactoryBean;
* @since 2.2.0
*/
public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSupport
implements ImportBeanDefinitionRegistrar {
implements ImportBeanDefinitionRegistrar {
static final boolean DEFAULT_MANUAL_START = GatewayReceiver.DEFAULT_MANUAL_START;
@@ -78,6 +81,9 @@ public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSuppor
private final String HOSTNAME_FOR_SENDERS_PROPERTY_LITERAL = "hostname-for-senders";
private final String TRANSPORT_FILTERS_PROPERTY_LITERAL = "transport-filters";
@Autowired(required = false)
private List<GatewayReceiverConfigurer> gatewayReceiverConfigurers = Collections.emptyList();
@Override
protected Class<? extends Annotation> getAnnotationType() {
return EnableGatewayReceiver.class;
@@ -102,7 +108,7 @@ public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSuppor
* @param registry
*/
private void registerGatewayReceiverBeanDefinition(AnnotationAttributes enableGatewayReceiverAttributes,
BeanDefinitionRegistry registry) {
BeanDefinitionRegistry registry) {
BeanDefinitionBuilder gatewayReceiverBeanBuilder =
BeanDefinitionBuilder.genericBeanDefinition(GatewayReceiverFactoryBean.class);
@@ -128,7 +134,7 @@ public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSuppor
* @param gatewayReceiverBeanName
*/
private void configureBeanFromAnnotationAttributes(AnnotationAttributes enableGatewayReceiverAttributes,
BeanDefinitionBuilder gatewayReceiverBeanBuilder, String gatewayReceiverBeanName) {
BeanDefinitionBuilder gatewayReceiverBeanBuilder, String gatewayReceiverBeanName) {
gatewayReceiverBeanBuilder.addConstructorArgReference(GemfireConstants.DEFAULT_GEMFIRE_CACHE_NAME);
@@ -159,7 +165,8 @@ public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSuppor
enableGatewayReceiverAttributes.getString(HOSTNAME_FOR_SENDERS_LITERAL), DEFAULT_HOSTNAME_FOR_SENDERS);
setPropertyValueIfNotDefault(gatewayReceiverBeanBuilder, TRANSPORT_FILTERS_LITERAL,
resolveGatewayTransportFilterBeanReferences(enableGatewayReceiverAttributes.getStringArray(TRANSPORT_FILTERS_LITERAL)),
resolveGatewayTransportFilterBeanReferences(
enableGatewayReceiverAttributes.getStringArray(TRANSPORT_FILTERS_LITERAL)),
new ManagedList<BeanReference>());
}
@@ -173,6 +180,8 @@ public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSuppor
MutablePropertyValues beanPropertyValues =
gatewayReceiverBeanBuilder.getRawBeanDefinition().getPropertyValues();
gatewayReceiverBeanBuilder.addPropertyValue("gatewayReceiverConfigurers", resolveGatewayReceiverConfigurers());
configureFromProperties(gatewayReceiverBeanBuilder, START_PORT_LITERAL, START_PORT_PROPERTY_LITERAL,
Integer.class, (Integer) beanPropertyValues.getPropertyValue(START_PORT_LITERAL).getValue());
@@ -184,7 +193,8 @@ public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSuppor
configureFromProperties(gatewayReceiverBeanBuilder,
MAXIMUM_TIME_BETWEEN_PINGS_LITERAL, MAXIMUM_TIME_BETWEEN_PINGS_PROPERTY_LITERAL,
Integer.class, (Integer) beanPropertyValues.getPropertyValue(MAXIMUM_TIME_BETWEEN_PINGS_LITERAL).getValue());
Integer.class,
(Integer) beanPropertyValues.getPropertyValue(MAXIMUM_TIME_BETWEEN_PINGS_LITERAL).getValue());
configureFromProperties(gatewayReceiverBeanBuilder,
SOCKET_BUFFER_SIZE_LITERAL, SOCKET_BUFFER_SIZE_PROPERTY_LITERAL,
@@ -208,15 +218,16 @@ public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSuppor
}
private <T> void configureFromProperties(BeanDefinitionBuilder gatewayReceiverBeanBuilder,
String beanPropertyName, String propertyName, Class<T> propertyType, T annotationAttributeValue) {
String beanPropertyName, String propertyName, Class<T> propertyType, T annotationAttributeValue) {
T propertyValue = resolveProperty(gatewayReceiverProperty(propertyName), propertyType, annotationAttributeValue);
T propertyValue = resolveProperty(gatewayReceiverProperty(propertyName), propertyType,
annotationAttributeValue);
gatewayReceiverBeanBuilder.addPropertyValue(beanPropertyName, propertyValue);
}
private ManagedList<BeanReference> resolveGatewayTransportFilterBeanReferences(
String[] gatewayTransportFilterBeanNames) {
String[] gatewayTransportFilterBeanNames) {
ManagedList<BeanReference> gatewayTransportFilterBeanReferences = new ManagedList<>();
@@ -229,7 +240,7 @@ public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSuppor
}
private void registerGatewayTransportFilterDependencies(AnnotationAttributes annotationAttributes,
BeanDefinitionBuilder gatewayReceiverBeanBuilder) {
BeanDefinitionBuilder gatewayReceiverBeanBuilder) {
String[] transportFilters = annotationAttributes.getStringArray(TRANSPORT_FILTERS_LITERAL);
@@ -238,10 +249,18 @@ public class GatewayReceiverConfiguration extends AbstractAnnotationConfigSuppor
}
private <T> BeanDefinitionBuilder setPropertyValueIfNotDefault(BeanDefinitionBuilder beanDefinitionBuilder,
String propertyName, T value, T defaultValue) {
String propertyName, T value, T defaultValue) {
return value != null
? beanDefinitionBuilder.addPropertyValue(propertyName, value)
: beanDefinitionBuilder.addPropertyValue(propertyName, defaultValue);
}
private List<GatewayReceiverConfigurer> resolveGatewayReceiverConfigurers() {
return Optional.ofNullable(this.gatewayReceiverConfigurers)
.filter(gatewayReceiverConfigurers -> !gatewayReceiverConfigurers.isEmpty())
.orElseGet(() ->
Collections.singletonList(LazyResolvingComposableGatewayReceiverConfigurer.create(getBeanFactory())));
}
}

View File

@@ -0,0 +1,49 @@
/*
* 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 org.springframework.beans.factory.BeanFactory;
import org.springframework.data.gemfire.config.annotation.support.AbstractLazyResolvingComposableConfigurer;
import org.springframework.data.gemfire.wan.GatewayReceiverFactoryBean;
import org.springframework.lang.Nullable;
/**
* Composition of {@link GatewayReceiverConfigurer}.
*
* @author Udo Kohlmeyer
* @see GatewayReceiverFactoryBean
* @see GatewayReceiverConfigurer
* @see AbstractLazyResolvingComposableConfigurer
* @since 2.2.0
*/
public class LazyResolvingComposableGatewayReceiverConfigurer
extends AbstractLazyResolvingComposableConfigurer<GatewayReceiverFactoryBean, GatewayReceiverConfigurer>
implements GatewayReceiverConfigurer {
public static LazyResolvingComposableGatewayReceiverConfigurer create() {
return create(null);
}
public static LazyResolvingComposableGatewayReceiverConfigurer create(@Nullable BeanFactory beanFactory) {
return new LazyResolvingComposableGatewayReceiverConfigurer().with(beanFactory);
}
@Override
protected Class<GatewayReceiverConfigurer> getConfigurerType() {
return GatewayReceiverConfigurer.class;
}
}

View File

@@ -15,6 +15,9 @@
*/
package org.springframework.data.gemfire.wan;
import static java.util.stream.StreamSupport.stream;
import static org.springframework.data.gemfire.util.CollectionUtils.nullSafeIterable;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -24,7 +27,6 @@ import org.apache.geode.cache.Cache;
import org.apache.geode.cache.wan.GatewayReceiver;
import org.apache.geode.cache.wan.GatewayReceiverFactory;
import org.apache.geode.cache.wan.GatewayTransportFilter;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.gemfire.config.annotation.GatewayReceiverConfigurer;
@@ -59,7 +61,7 @@ public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean<
private Integer startPort;
@Autowired(required = false)
private GatewayReceiverConfigurer gatewayReceiverConfigurer;
private List<GatewayReceiverConfigurer> gatewayReceiverConfigurers;
@Autowired(required = false)
private List<GatewayTransportFilter> transportFilters;
@@ -83,7 +85,8 @@ public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean<
GatewayReceiverFactory gatewayReceiverFactory = this.cache.createGatewayReceiverFactory();
Optional.ofNullable(this.gatewayReceiverConfigurer).ifPresent(it -> it.configure(getName(),this));
stream(nullSafeIterable(this.gatewayReceiverConfigurers).spliterator(), false)
.forEach(it -> it.configure(getName(), this));
Optional.ofNullable(this.bindAddress)
.filter(StringUtils::hasText)
@@ -132,8 +135,8 @@ public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean<
this.gatewayReceiver = gatewayReceiver;
}
public void setGatewayReceiverConfigurer(GatewayReceiverConfigurer gatewayReceiverConfigurer) {
this.gatewayReceiverConfigurer = gatewayReceiverConfigurer;
public void setGatewayReceiverConfigurers(List<GatewayReceiverConfigurer> gatewayReceiverConfigurers) {
this.gatewayReceiverConfigurers = gatewayReceiverConfigurers;
}
public void setBindAddress(String bindAddress) {