diff --git a/src/main/java/org/springframework/data/gemfire/config/annotation/GatewayReceiverConfiguration.java b/src/main/java/org/springframework/data/gemfire/config/annotation/GatewayReceiverConfiguration.java index 5311d7c9..27d50148 100644 --- a/src/main/java/org/springframework/data/gemfire/config/annotation/GatewayReceiverConfiguration.java +++ b/src/main/java/org/springframework/data/gemfire/config/annotation/GatewayReceiverConfiguration.java @@ -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 gatewayReceiverConfigurers = Collections.emptyList(); + @Override protected Class 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()); } @@ -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 void configureFromProperties(BeanDefinitionBuilder gatewayReceiverBeanBuilder, - String beanPropertyName, String propertyName, Class propertyType, T annotationAttributeValue) { + String beanPropertyName, String propertyName, Class propertyType, T annotationAttributeValue) { - T propertyValue = resolveProperty(gatewayReceiverProperty(propertyName), propertyType, annotationAttributeValue); + T propertyValue = resolveProperty(gatewayReceiverProperty(propertyName), propertyType, + annotationAttributeValue); gatewayReceiverBeanBuilder.addPropertyValue(beanPropertyName, propertyValue); } private ManagedList resolveGatewayTransportFilterBeanReferences( - String[] gatewayTransportFilterBeanNames) { + String[] gatewayTransportFilterBeanNames) { ManagedList 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 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 resolveGatewayReceiverConfigurers() { + + return Optional.ofNullable(this.gatewayReceiverConfigurers) + .filter(gatewayReceiverConfigurers -> !gatewayReceiverConfigurers.isEmpty()) + .orElseGet(() -> + Collections.singletonList(LazyResolvingComposableGatewayReceiverConfigurer.create(getBeanFactory()))); + } } diff --git a/src/main/java/org/springframework/data/gemfire/config/annotation/LazyResolvingComposableGatewayReceiverConfigurer.java b/src/main/java/org/springframework/data/gemfire/config/annotation/LazyResolvingComposableGatewayReceiverConfigurer.java new file mode 100644 index 00000000..9d1426c4 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/config/annotation/LazyResolvingComposableGatewayReceiverConfigurer.java @@ -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 + implements GatewayReceiverConfigurer { + + public static LazyResolvingComposableGatewayReceiverConfigurer create() { + return create(null); + } + + public static LazyResolvingComposableGatewayReceiverConfigurer create(@Nullable BeanFactory beanFactory) { + return new LazyResolvingComposableGatewayReceiverConfigurer().with(beanFactory); + } + + @Override + protected Class getConfigurerType() { + return GatewayReceiverConfigurer.class; + } +} diff --git a/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java b/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java index 017847e5..7c5c2aa4 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java @@ -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 gatewayReceiverConfigurers; @Autowired(required = false) private List 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 gatewayReceiverConfigurers) { + this.gatewayReceiverConfigurers = gatewayReceiverConfigurers; } public void setBindAddress(String bindAddress) {