Enables Spring Locator-based applications configured and bootstrapped with SDG to use the GemfireBeanFactoryLocator to autowire Apache Geode components.
Closes #620.
This commit is contained in:
@@ -15,9 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.gemfire;
|
package org.springframework.data.gemfire;
|
||||||
|
|
||||||
import static org.springframework.data.gemfire.util.ArrayUtils.nullSafeArray;
|
|
||||||
import static org.springframework.data.gemfire.util.CollectionUtils.nullSafeIterable;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -32,8 +29,10 @@ import org.springframework.beans.factory.FactoryBean;
|
|||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.data.gemfire.config.annotation.LocatorConfigurer;
|
import org.springframework.data.gemfire.config.annotation.LocatorConfigurer;
|
||||||
import org.springframework.data.gemfire.support.AbstractFactoryBeanSupport;
|
import org.springframework.data.gemfire.support.AbstractFactoryBeanSupport;
|
||||||
|
import org.springframework.data.gemfire.support.GemfireBeanFactoryLocator;
|
||||||
|
import org.springframework.data.gemfire.util.ArrayUtils;
|
||||||
import org.springframework.data.gemfire.util.CollectionUtils;
|
import org.springframework.data.gemfire.util.CollectionUtils;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.NonNull;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
@@ -57,8 +56,10 @@ public class LocatorFactoryBean extends AbstractFactoryBeanSupport<Locator> impl
|
|||||||
public static final int DEFAULT_PORT = 10334;
|
public static final int DEFAULT_PORT = 10334;
|
||||||
|
|
||||||
public static final String DEFAULT_LOG_LEVEL = GemFireProperties.LOG_LEVEL.getDefaultValueAsString();
|
public static final String DEFAULT_LOG_LEVEL = GemFireProperties.LOG_LEVEL.getDefaultValueAsString();
|
||||||
private static final String LOCATORS_PROPERTY = GemFireProperties.LOCATORS.toString();
|
private static final String LOCATORS_PROPERTY = GemFireProperties.LOCATORS.getName();
|
||||||
public static final String LOG_LEVEL_PROPERTY = GemFireProperties.LOG_LEVEL.toString();
|
public static final String LOG_LEVEL_PROPERTY = GemFireProperties.LOG_LEVEL.getName();
|
||||||
|
|
||||||
|
private boolean useBeanFactoryLocator = false;
|
||||||
|
|
||||||
private Integer port = DEFAULT_PORT;
|
private Integer port = DEFAULT_PORT;
|
||||||
|
|
||||||
@@ -82,16 +83,22 @@ public class LocatorFactoryBean extends AbstractFactoryBeanSupport<Locator> impl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() throws Exception {
|
public void afterPropertiesSet() throws Exception {
|
||||||
applyLocatorConfigurers(getCompositeLocatorConfigurer());
|
|
||||||
|
applyLocatorConfigurers();
|
||||||
|
initializeBeanFactoryLocator();
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void applyLocatorConfigurers() {
|
||||||
|
applyLocatorConfigurers(getCompositeLocatorConfigurer());
|
||||||
|
}
|
||||||
|
|
||||||
protected void applyLocatorConfigurers(LocatorConfigurer... locatorConfigurers) {
|
protected void applyLocatorConfigurers(LocatorConfigurer... locatorConfigurers) {
|
||||||
applyLocatorConfigurers(Arrays.asList(nullSafeArray(locatorConfigurers, LocatorConfigurer.class)));
|
applyLocatorConfigurers(Arrays.asList(ArrayUtils.nullSafeArray(locatorConfigurers, LocatorConfigurer.class)));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void applyLocatorConfigurers(Iterable<LocatorConfigurer> locatorConfigurers) {
|
protected void applyLocatorConfigurers(Iterable<LocatorConfigurer> locatorConfigurers) {
|
||||||
StreamSupport.stream(nullSafeIterable(locatorConfigurers).spliterator(), false)
|
StreamSupport.stream(CollectionUtils.nullSafeIterable(locatorConfigurers).spliterator(), false)
|
||||||
.forEach(locatorConfigurer -> locatorConfigurer.configure(getBeanName(), this));
|
.forEach(locatorConfigurer -> locatorConfigurer.configure(getBeanName(), this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,6 +149,13 @@ public class LocatorFactoryBean extends AbstractFactoryBeanSupport<Locator> impl
|
|||||||
return locatorBuilder;
|
return locatorBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void initializeBeanFactoryLocator() {
|
||||||
|
|
||||||
|
if (isUseBeanFactoryLocator()) {
|
||||||
|
GemfireBeanFactoryLocator.newBeanFactoryLocator(getBeanFactory(), getBeanName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected LocatorLauncher.Builder newLocatorLauncherBuilder() {
|
protected LocatorLauncher.Builder newLocatorLauncherBuilder() {
|
||||||
return new LocatorLauncher.Builder();
|
return new LocatorLauncher.Builder();
|
||||||
}
|
}
|
||||||
@@ -162,8 +176,8 @@ public class LocatorFactoryBean extends AbstractFactoryBeanSupport<Locator> impl
|
|||||||
return this.locatorLauncher;
|
return this.locatorLauncher;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable @Override
|
@Override
|
||||||
public Locator getObject() throws Exception {
|
public @NonNull Locator getObject() throws Exception {
|
||||||
|
|
||||||
Locator locator = getLocator();
|
Locator locator = getLocator();
|
||||||
|
|
||||||
@@ -172,8 +186,8 @@ public class LocatorFactoryBean extends AbstractFactoryBeanSupport<Locator> impl
|
|||||||
return locator;
|
return locator;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable @Override
|
@Override
|
||||||
public Class<?> getObjectType() {
|
public @NonNull Class<?> getObjectType() {
|
||||||
|
|
||||||
Locator locator = getLocator();
|
Locator locator = getLocator();
|
||||||
|
|
||||||
@@ -190,7 +204,7 @@ public class LocatorFactoryBean extends AbstractFactoryBeanSupport<Locator> impl
|
|||||||
.filter(StringUtils::hasText);
|
.filter(StringUtils::hasText);
|
||||||
}
|
}
|
||||||
|
|
||||||
public LocatorConfigurer getCompositeLocatorConfigurer() {
|
public @NonNull LocatorConfigurer getCompositeLocatorConfigurer() {
|
||||||
return this.compositeLocatorConfigurer;
|
return this.compositeLocatorConfigurer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,7 +212,7 @@ public class LocatorFactoryBean extends AbstractFactoryBeanSupport<Locator> impl
|
|||||||
this.gemfireProperties = gemfireProperties;
|
this.gemfireProperties = gemfireProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Properties getGemFireProperties() {
|
public @NonNull Properties getGemFireProperties() {
|
||||||
|
|
||||||
if (this.gemfireProperties == null) {
|
if (this.gemfireProperties == null) {
|
||||||
this.gemfireProperties = new Properties();
|
this.gemfireProperties = new Properties();
|
||||||
@@ -218,7 +232,7 @@ public class LocatorFactoryBean extends AbstractFactoryBeanSupport<Locator> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setLocatorConfigurers(LocatorConfigurer... locatorConfigurers) {
|
public void setLocatorConfigurers(LocatorConfigurer... locatorConfigurers) {
|
||||||
setLocatorConfigurers(Arrays.asList(nullSafeArray(locatorConfigurers, LocatorConfigurer.class)));
|
setLocatorConfigurers(Arrays.asList(ArrayUtils.nullSafeArray(locatorConfigurers, LocatorConfigurer.class)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLocatorConfigurers(List<LocatorConfigurer> locatorConfigurers) {
|
public void setLocatorConfigurers(List<LocatorConfigurer> locatorConfigurers) {
|
||||||
@@ -263,4 +277,12 @@ public class LocatorFactoryBean extends AbstractFactoryBeanSupport<Locator> impl
|
|||||||
public Integer getPort() {
|
public Integer getPort() {
|
||||||
return this.port;
|
return this.port;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setUseBeanFactoryLocator(boolean useBeanFactoryLocator) {
|
||||||
|
this.useBeanFactoryLocator = useBeanFactoryLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isUseBeanFactoryLocator() {
|
||||||
|
return this.useBeanFactoryLocator;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,10 @@ import org.springframework.beans.factory.config.BeanPostProcessor;
|
|||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.data.gemfire.CacheFactoryBean;
|
import org.springframework.data.gemfire.CacheFactoryBean;
|
||||||
|
import org.springframework.data.gemfire.LocatorFactoryBean;
|
||||||
import org.springframework.data.gemfire.client.ClientCacheFactoryBean;
|
import org.springframework.data.gemfire.client.ClientCacheFactoryBean;
|
||||||
import org.springframework.data.gemfire.support.GemfireBeanFactoryLocator;
|
import org.springframework.data.gemfire.support.GemfireBeanFactoryLocator;
|
||||||
|
import org.springframework.lang.NonNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link BeanFactoryLocatorConfiguration} class extends the Spring application configuration by enabling
|
* The {@link BeanFactoryLocatorConfiguration} class extends the Spring application configuration by enabling
|
||||||
@@ -33,8 +35,10 @@ import org.springframework.data.gemfire.support.GemfireBeanFactoryLocator;
|
|||||||
* @see org.springframework.context.annotation.Bean
|
* @see org.springframework.context.annotation.Bean
|
||||||
* @see org.springframework.context.annotation.Configuration
|
* @see org.springframework.context.annotation.Configuration
|
||||||
* @see org.springframework.data.gemfire.CacheFactoryBean
|
* @see org.springframework.data.gemfire.CacheFactoryBean
|
||||||
|
* @see org.springframework.data.gemfire.LocatorFactoryBean
|
||||||
* @see org.springframework.data.gemfire.client.ClientCacheFactoryBean
|
* @see org.springframework.data.gemfire.client.ClientCacheFactoryBean
|
||||||
* @see org.springframework.data.gemfire.config.annotation.ClientCacheConfigurer
|
* @see org.springframework.data.gemfire.config.annotation.ClientCacheConfigurer
|
||||||
|
* @see org.springframework.data.gemfire.config.annotation.LocatorConfigurer
|
||||||
* @see org.springframework.data.gemfire.config.annotation.PeerCacheConfigurer
|
* @see org.springframework.data.gemfire.config.annotation.PeerCacheConfigurer
|
||||||
* @see org.springframework.data.gemfire.config.annotation.EnableBeanFactoryLocator
|
* @see org.springframework.data.gemfire.config.annotation.EnableBeanFactoryLocator
|
||||||
* @see org.springframework.data.gemfire.support.GemfireBeanFactoryLocator
|
* @see org.springframework.data.gemfire.support.GemfireBeanFactoryLocator
|
||||||
@@ -64,6 +68,10 @@ public class BeanFactoryLocatorConfiguration {
|
|||||||
((CacheFactoryBean) bean).setUseBeanFactoryLocator(true);
|
((CacheFactoryBean) bean).setUseBeanFactoryLocator(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bean instanceof LocatorFactoryBean) {
|
||||||
|
((LocatorFactoryBean) bean).setUseBeanFactoryLocator(true);
|
||||||
|
}
|
||||||
|
|
||||||
return bean;
|
return bean;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -73,12 +81,25 @@ public class BeanFactoryLocatorConfiguration {
|
|||||||
* Declares and registers a {@link ClientCacheConfigurer} bean to configure a {@link ClientCacheFactoryBean}
|
* Declares and registers a {@link ClientCacheConfigurer} bean to configure a {@link ClientCacheFactoryBean}
|
||||||
* by setting the {@literal useBeanFactoryLocator} property to {@literal true}.
|
* by setting the {@literal useBeanFactoryLocator} property to {@literal true}.
|
||||||
*
|
*
|
||||||
* @return a {@link ClientCacheConfigurer} used to configure and set the SDG {@link ClientCacheFactoryBean}'s
|
* @return a {@link ClientCacheConfigurer} used to configure and set the SDG {@link ClientCacheFactoryBean}
|
||||||
* {@literal useBeanFactoryLocator} property to {@literal true}.
|
* {@literal useBeanFactoryLocator} property to {@literal true}.
|
||||||
* @see org.springframework.data.gemfire.config.annotation.ClientCacheConfigurer
|
* @see org.springframework.data.gemfire.config.annotation.ClientCacheConfigurer
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public ClientCacheConfigurer useBeanFactoryLocatorClientCacheConfigurer() {
|
public @NonNull ClientCacheConfigurer useBeanFactoryLocatorClientCacheConfigurer() {
|
||||||
|
return (beanName, bean) -> bean.setUseBeanFactoryLocator(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Declares and registers a {@link LocatorConfigurer} bean to configure a {@link LocatorFactoryBean}
|
||||||
|
* by setting the {@literal useBeanFactoryLocator} property to {@literal true}.
|
||||||
|
*
|
||||||
|
* @return a {@link LocatorConfigurer} used to configure and set the SDG {@link LocatorFactoryBean}
|
||||||
|
* {@literal useBeanFactoryLocator} property to {@literal true}.
|
||||||
|
* @see org.springframework.data.gemfire.config.annotation.LocatorConfigurer
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public @NonNull LocatorConfigurer useBeanFactoryLocatorLocatorConfigurer() {
|
||||||
return (beanName, bean) -> bean.setUseBeanFactoryLocator(true);
|
return (beanName, bean) -> bean.setUseBeanFactoryLocator(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,12 +107,12 @@ public class BeanFactoryLocatorConfiguration {
|
|||||||
* Declares and registers a {@link PeerCacheConfigurer} bean to configure a {@link CacheFactoryBean}
|
* Declares and registers a {@link PeerCacheConfigurer} bean to configure a {@link CacheFactoryBean}
|
||||||
* by setting the {@literal useBeanFactoryLocator} property to {@literal true}.
|
* by setting the {@literal useBeanFactoryLocator} property to {@literal true}.
|
||||||
*
|
*
|
||||||
* @return a {@link PeerCacheConfigurer} used to configure and set the SDG {@link CacheFactoryBean}'s
|
* @return a {@link PeerCacheConfigurer} used to configure and set the SDG {@link CacheFactoryBean}
|
||||||
* {@literal useBeanFactoryLocator} property to {@literal true}.
|
* {@literal useBeanFactoryLocator} property to {@literal true}.
|
||||||
* @see org.springframework.data.gemfire.config.annotation.PeerCacheConfigurer
|
* @see org.springframework.data.gemfire.config.annotation.PeerCacheConfigurer
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public PeerCacheConfigurer useBeanFactoryLocatorPeerCacheConfigurer() {
|
public @NonNull PeerCacheConfigurer useBeanFactoryLocatorPeerCacheConfigurer() {
|
||||||
return (beanName, bean) -> bean.setUseBeanFactoryLocator(true);
|
return (beanName, bean) -> bean.setUseBeanFactoryLocator(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,8 +25,10 @@ import java.lang.annotation.Target;
|
|||||||
|
|
||||||
import org.apache.geode.distributed.Locator;
|
import org.apache.geode.distributed.Locator;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.BeanFactory;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
|
import org.springframework.data.gemfire.support.GemfireBeanFactoryLocator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link LocatorApplication} {@link Annotation} enables a Spring Data for Apache Geode & Pivotal GemFire
|
* The {@link LocatorApplication} {@link Annotation} enables a Spring Data for Apache Geode & Pivotal GemFire
|
||||||
@@ -90,7 +92,7 @@ public @interface LocatorApplication {
|
|||||||
String logLevel() default LocatorApplicationConfiguration.DEFAULT_LOG_LEVEL;
|
String logLevel() default LocatorApplicationConfiguration.DEFAULT_LOG_LEVEL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures the name of the {@link Locator} application.
|
* Configures the {@link String name} of the {@link Locator} application.
|
||||||
*
|
*
|
||||||
* Defaults to {@literal SpringBasedLocatorApplication}.
|
* Defaults to {@literal SpringBasedLocatorApplication}.
|
||||||
*
|
*
|
||||||
@@ -110,4 +112,15 @@ public @interface LocatorApplication {
|
|||||||
*/
|
*/
|
||||||
int port() default LocatorApplicationConfiguration.DEFAULT_PORT;
|
int port() default LocatorApplicationConfiguration.DEFAULT_PORT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the {@link Locator} application with the {@link GemfireBeanFactoryLocator} in order to look up
|
||||||
|
* the Spring {@link BeanFactory} used to auto-wire, configure and initialize Apache Geode components
|
||||||
|
* created in a non-Spring managed, Apache Geode context (for example: {@literal cache.xml}).
|
||||||
|
*
|
||||||
|
* Defaults to {@literal false}.
|
||||||
|
*
|
||||||
|
* Use {@literal spring.data.gemfire.use-bean-factory-locator} property in {@literal application.properties}.
|
||||||
|
*/
|
||||||
|
boolean useBeanFactoryLocator() default LocatorApplicationConfiguration.DEFAULT_USE_BEAN_FACTORY_LOCATOR;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ import org.springframework.data.gemfire.CacheFactoryBean;
|
|||||||
import org.springframework.data.gemfire.LocatorFactoryBean;
|
import org.springframework.data.gemfire.LocatorFactoryBean;
|
||||||
import org.springframework.data.gemfire.client.ClientCacheFactoryBean;
|
import org.springframework.data.gemfire.client.ClientCacheFactoryBean;
|
||||||
import org.springframework.data.gemfire.config.annotation.support.AbstractAnnotationConfigSupport;
|
import org.springframework.data.gemfire.config.annotation.support.AbstractAnnotationConfigSupport;
|
||||||
|
import org.springframework.lang.NonNull;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,12 +66,14 @@ import org.springframework.util.ClassUtils;
|
|||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSupport implements ImportAware {
|
public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSupport implements ImportAware {
|
||||||
|
|
||||||
|
public static final boolean DEFAULT_USE_BEAN_FACTORY_LOCATOR = false;
|
||||||
|
|
||||||
public static final int DEFAULT_PORT = 10334;
|
public static final int DEFAULT_PORT = 10334;
|
||||||
|
|
||||||
public static final String DEFAULT_LOG_LEVEL = "warn";
|
public static final String DEFAULT_LOG_LEVEL = "warn";
|
||||||
public static final String DEFAULT_NAME = "SpringBasedLocatorApplication";
|
public static final String DEFAULT_NAME = "SpringBasedLocatorApplication";
|
||||||
|
|
||||||
protected static final String EXCLUSIVE_LOCATOR_APPLICATION_ERROR_MESSAGE =
|
protected static final String LOCATOR_APPLICATION_MUTEX_ERROR_MESSAGE =
|
||||||
"A Spring application cannot be both a Cache and a Locator application;"
|
"A Spring application cannot be both a Cache and a Locator application;"
|
||||||
+ " You may annotate your Spring application main class with 1 of"
|
+ " You may annotate your Spring application main class with 1 of"
|
||||||
+ " [@ClientCacheApplication, @CacheServerApplication, @PeerCacheApplication] or @LocatorApplication;"
|
+ " [@ClientCacheApplication, @CacheServerApplication, @PeerCacheApplication] or @LocatorApplication;"
|
||||||
@@ -81,6 +85,8 @@ public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSup
|
|||||||
private static final List<String> CACHE_FACTORY_BEAN_CLASS_NAMES =
|
private static final List<String> CACHE_FACTORY_BEAN_CLASS_NAMES =
|
||||||
Arrays.asList(CacheFactoryBean.class.getName(), ClientCacheFactoryBean.class.getName());
|
Arrays.asList(CacheFactoryBean.class.getName(), ClientCacheFactoryBean.class.getName());
|
||||||
|
|
||||||
|
private boolean useBeanFactoryLocator = DEFAULT_USE_BEAN_FACTORY_LOCATOR;
|
||||||
|
|
||||||
private int port = DEFAULT_PORT;
|
private int port = DEFAULT_PORT;
|
||||||
|
|
||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
@@ -93,13 +99,28 @@ public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSup
|
|||||||
private String logLevel;
|
private String logLevel;
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link LocatorApplication} annotation used to configure and bootstrap a {@link Locator}-based,
|
||||||
|
* Spring application.
|
||||||
|
*
|
||||||
|
* @return the {@link LocatorApplication} annotation {@link Class type}.
|
||||||
|
* @see org.springframework.data.gemfire.config.annotation.LocatorApplication
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected Class<? extends Annotation> getAnnotationType() {
|
protected @NonNull Class<? extends Annotation> getAnnotationType() {
|
||||||
return LocatorApplication.class;
|
return LocatorApplication.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a {@link BeanFactoryPostProcessor} used to enforce that the Spring application can only be
|
||||||
|
* an Apache Geode {@link GemFireCache cache} application or an Apache Geode {@link Locator} application,
|
||||||
|
* but not both.
|
||||||
|
*
|
||||||
|
* @return a {@link BeanFactoryPostProcessor} used to enforce the Spring, Apache Geode application type.
|
||||||
|
* @see org.springframework.beans.factory.config.BeanFactoryPostProcessor
|
||||||
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
BeanFactoryPostProcessor exclusiveLocatorApplicationBeanFactoryPostProcessor() {
|
@NonNull BeanFactoryPostProcessor locatorApplicationMutexBeanFactoryPostProcessor() {
|
||||||
|
|
||||||
return configurableListableBeanFactory -> {
|
return configurableListableBeanFactory -> {
|
||||||
|
|
||||||
@@ -107,25 +128,23 @@ public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSup
|
|||||||
|
|
||||||
boolean match = Arrays.stream(nullSafeArray(beanDefinitionNames, String.class))
|
boolean match = Arrays.stream(nullSafeArray(beanDefinitionNames, String.class))
|
||||||
.map(configurableListableBeanFactory::getBeanDefinition)
|
.map(configurableListableBeanFactory::getBeanDefinition)
|
||||||
.anyMatch(beanDefinition ->
|
.anyMatch(beanDefinition -> resolveBeanClassName(beanDefinition)
|
||||||
|
.map(beanClassName -> {
|
||||||
|
try {
|
||||||
|
|
||||||
resolveBeanClassName(beanDefinition)
|
Class<?> possibleCacheType =
|
||||||
.map(beanClassName -> {
|
ClassUtils.resolveClassName(beanClassName, getBeanClassLoader());
|
||||||
try {
|
|
||||||
|
|
||||||
Class<?> possibleCacheType =
|
return isCacheType(possibleCacheType);
|
||||||
ClassUtils.resolveClassName(beanClassName, getBeanClassLoader());
|
}
|
||||||
|
catch (Throwable ignore) {
|
||||||
return isCacheType(possibleCacheType);
|
return CACHE_FACTORY_BEAN_CLASS_NAMES.contains(beanClassName);
|
||||||
}
|
}
|
||||||
catch (Throwable ignore) {
|
})
|
||||||
return CACHE_FACTORY_BEAN_CLASS_NAMES.contains(beanClassName);
|
.orElse(false));
|
||||||
}
|
|
||||||
})
|
|
||||||
.orElse(false));
|
|
||||||
|
|
||||||
if (match) {
|
if (match) {
|
||||||
throw new BeanDefinitionStoreException(EXCLUSIVE_LOCATOR_APPLICATION_ERROR_MESSAGE);
|
throw new BeanDefinitionStoreException(LOCATOR_APPLICATION_MUTEX_ERROR_MESSAGE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -136,8 +155,15 @@ public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSup
|
|||||||
&& (CacheFactoryBean.class.isAssignableFrom(type) || GemFireCache.class.isAssignableFrom(type));
|
&& (CacheFactoryBean.class.isAssignableFrom(type) || GemFireCache.class.isAssignableFrom(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the {@link Annotation} metadata from the {@link LocatorApplication} annotation.
|
||||||
|
*
|
||||||
|
* @param importMetadata {@link AnnotationMetadata} containing metadata from the {@link LocatorApplication}
|
||||||
|
* annotation annotated on the Spring application {@link Configuration} {@link Class}.
|
||||||
|
* @see org.springframework.core.type.AnnotationMetadata
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setImportMetadata(AnnotationMetadata importMetadata) {
|
public void setImportMetadata(@NonNull AnnotationMetadata importMetadata) {
|
||||||
|
|
||||||
if (isAnnotationPresent(importMetadata)) {
|
if (isAnnotationPresent(importMetadata)) {
|
||||||
|
|
||||||
@@ -160,6 +186,9 @@ public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSup
|
|||||||
|
|
||||||
setPort(resolveProperty(locatorProperty("port"),
|
setPort(resolveProperty(locatorProperty("port"),
|
||||||
locatorApplicationAnnotationAttributes.<Integer>getNumber("port")));
|
locatorApplicationAnnotationAttributes.<Integer>getNumber("port")));
|
||||||
|
|
||||||
|
setUseBeanFactoryLocator(resolveProperty("use-bean-factory-locator", Boolean.class,
|
||||||
|
locatorApplicationAnnotationAttributes.getBoolean("useBeanFactoryLocator")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,6 +204,7 @@ public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSup
|
|||||||
locatorFactoryBean.setLogLevel(getLogLevel());
|
locatorFactoryBean.setLogLevel(getLogLevel());
|
||||||
locatorFactoryBean.setName(getName());
|
locatorFactoryBean.setName(getName());
|
||||||
locatorFactoryBean.setPort(getPort());
|
locatorFactoryBean.setPort(getPort());
|
||||||
|
locatorFactoryBean.setUseBeanFactoryLocator(isUseBeanFactoryLocator());
|
||||||
|
|
||||||
return locatorFactoryBean;
|
return locatorFactoryBean;
|
||||||
}
|
}
|
||||||
@@ -183,47 +213,47 @@ public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSup
|
|||||||
|
|
||||||
return Optional.ofNullable(this.locatorConfigurers)
|
return Optional.ofNullable(this.locatorConfigurers)
|
||||||
.filter(locatorConfigurers -> !locatorConfigurers.isEmpty())
|
.filter(locatorConfigurers -> !locatorConfigurers.isEmpty())
|
||||||
.orElseGet(() ->
|
.orElseGet(() -> Collections.singletonList(LazyResolvingComposableLocatorConfigurer
|
||||||
Collections.singletonList(LazyResolvingComposableLocatorConfigurer.create(getBeanFactory())));
|
.create(getBeanFactory())));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBindAddress(String bindAddress) {
|
public void setBindAddress(@Nullable String bindAddress) {
|
||||||
this.bindAddress = bindAddress;
|
this.bindAddress = bindAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBindAddress() {
|
public @Nullable String getBindAddress() {
|
||||||
return this.bindAddress;
|
return this.bindAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setHostnameForClients(String hostnameForClients) {
|
public void setHostnameForClients(@Nullable String hostnameForClients) {
|
||||||
this.hostnameForClients = hostnameForClients;
|
this.hostnameForClients = hostnameForClients;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getHostnameForClients() {
|
public @Nullable String getHostnameForClients() {
|
||||||
return this.hostnameForClients;
|
return this.hostnameForClients;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLocators(String locators) {
|
public void setLocators(@Nullable String locators) {
|
||||||
this.locators = locators;
|
this.locators = locators;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLocators() {
|
public @Nullable String getLocators() {
|
||||||
return this.locators;
|
return this.locators;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLogLevel(String logLevel) {
|
public void setLogLevel(@Nullable String logLevel) {
|
||||||
this.logLevel = logLevel;
|
this.logLevel = logLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLogLevel() {
|
public @Nullable String getLogLevel() {
|
||||||
return this.logLevel;
|
return this.logLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public void setName(@Nullable String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public @Nullable String getName() {
|
||||||
return this.name;
|
return this.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,4 +264,12 @@ public class LocatorApplicationConfiguration extends AbstractAnnotationConfigSup
|
|||||||
public int getPort() {
|
public int getPort() {
|
||||||
return this.port;
|
return this.port;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isUseBeanFactoryLocator() {
|
||||||
|
return this.useBeanFactoryLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUseBeanFactoryLocator(boolean useBeanFactoryLocator) {
|
||||||
|
this.useBeanFactoryLocator = useBeanFactoryLocator;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,11 +16,19 @@
|
|||||||
package org.springframework.data.gemfire.config.annotation;
|
package org.springframework.data.gemfire.config.annotation;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.doNothing;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.verifyNoInteractions;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||||
import org.springframework.data.gemfire.CacheFactoryBean;
|
import org.springframework.data.gemfire.CacheFactoryBean;
|
||||||
|
import org.springframework.data.gemfire.LocatorFactoryBean;
|
||||||
import org.springframework.data.gemfire.client.ClientCacheFactoryBean;
|
import org.springframework.data.gemfire.client.ClientCacheFactoryBean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,7 +44,7 @@ import org.springframework.data.gemfire.client.ClientCacheFactoryBean;
|
|||||||
*/
|
*/
|
||||||
public class EnableBeanFactoryLocatorConfigurationUnitTests {
|
public class EnableBeanFactoryLocatorConfigurationUnitTests {
|
||||||
|
|
||||||
private BeanFactoryLocatorConfiguration configuration = new BeanFactoryLocatorConfiguration();
|
private final BeanFactoryLocatorConfiguration configuration = new BeanFactoryLocatorConfiguration();
|
||||||
|
|
||||||
private void testUseBeanFactoryLocatorBeanPostProcessorProcessesBean(Object cacheBean) {
|
private void testUseBeanFactoryLocatorBeanPostProcessorProcessesBean(Object cacheBean) {
|
||||||
|
|
||||||
@@ -71,6 +79,28 @@ public class EnableBeanFactoryLocatorConfigurationUnitTests {
|
|||||||
assertThat(clientCacheFactoryBean.isUseBeanFactoryLocator()).isTrue();
|
assertThat(clientCacheFactoryBean.isUseBeanFactoryLocator()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void useBeanFactoryLocatorBeanPostProcessorProcessesLocatorFactoryBean() {
|
||||||
|
|
||||||
|
LocatorFactoryBean locatorFactoryBean = new LocatorFactoryBean();
|
||||||
|
|
||||||
|
assertThat(locatorFactoryBean.isUseBeanFactoryLocator()).isFalse();
|
||||||
|
|
||||||
|
testUseBeanFactoryLocatorBeanPostProcessorProcessesBean(locatorFactoryBean);
|
||||||
|
|
||||||
|
assertThat(locatorFactoryBean.isUseBeanFactoryLocator()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void useBeanFactoryLocatorBeanPostProcessorWillNotProcessObject() {
|
||||||
|
|
||||||
|
Object mockObject = mock(Object.class);
|
||||||
|
|
||||||
|
testUseBeanFactoryLocatorBeanPostProcessorProcessesBean(mockObject);
|
||||||
|
|
||||||
|
verifyNoInteractions(mockObject);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void useBeanFactoryLocatorClientCacheConfigurerIsCorrect() throws Exception {
|
public void useBeanFactoryLocatorClientCacheConfigurerIsCorrect() throws Exception {
|
||||||
|
|
||||||
@@ -84,6 +114,23 @@ public class EnableBeanFactoryLocatorConfigurationUnitTests {
|
|||||||
assertThat(factoryBean.isUseBeanFactoryLocator()).isTrue();
|
assertThat(factoryBean.isUseBeanFactoryLocator()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void useBeanFactoryLocatorLocatorConfigurerIsCorrect() throws Exception {
|
||||||
|
|
||||||
|
LocatorFactoryBean factoryBean = spy(new LocatorFactoryBean());
|
||||||
|
|
||||||
|
doNothing().when(factoryBean).init();
|
||||||
|
|
||||||
|
assertThat(factoryBean.isUseBeanFactoryLocator()).isFalse();
|
||||||
|
|
||||||
|
factoryBean.setLocatorConfigurers(this.configuration.useBeanFactoryLocatorLocatorConfigurer());
|
||||||
|
factoryBean.afterPropertiesSet();
|
||||||
|
|
||||||
|
assertThat(factoryBean.isUseBeanFactoryLocator()).isTrue();
|
||||||
|
|
||||||
|
verify(factoryBean, times(1)).setUseBeanFactoryLocator(eq(true));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void useBeanFactoryLocatorPeerCacheConfigurerIsCorrect() throws Exception {
|
public void useBeanFactoryLocatorPeerCacheConfigurerIsCorrect() throws Exception {
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class LocatorApplicationCannotCoexistWithCacheApplicationIntegrationTests
|
|||||||
catch (BeanDefinitionStoreException expected) {
|
catch (BeanDefinitionStoreException expected) {
|
||||||
|
|
||||||
assertThat(expected)
|
assertThat(expected)
|
||||||
.hasMessage(LocatorApplicationConfiguration.EXCLUSIVE_LOCATOR_APPLICATION_ERROR_MESSAGE);
|
.hasMessage(LocatorApplicationConfiguration.LOCATOR_APPLICATION_MUTEX_ERROR_MESSAGE);
|
||||||
|
|
||||||
assertThat(expected).hasNoCause();
|
assertThat(expected).hasNoCause();
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ public class LocatorApplicationConfigurationIntegrationTests extends Integration
|
|||||||
assertThat(this.locatorFactoryBean.getLogLevel()).isEqualTo("WARN");
|
assertThat(this.locatorFactoryBean.getLogLevel()).isEqualTo("WARN");
|
||||||
assertThat(this.locatorFactoryBean.getName().orElse(null)).isEqualTo("MockLocator");
|
assertThat(this.locatorFactoryBean.getName().orElse(null)).isEqualTo("MockLocator");
|
||||||
assertThat(this.locatorFactoryBean.getPort()).isEqualTo(9876);
|
assertThat(this.locatorFactoryBean.getPort()).isEqualTo(9876);
|
||||||
|
assertThat(this.locatorFactoryBean.isUseBeanFactoryLocator()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@EnableGemFireMockObjects
|
@EnableGemFireMockObjects
|
||||||
@@ -75,7 +76,8 @@ public class LocatorApplicationConfigurationIntegrationTests extends Integration
|
|||||||
locators = "host1[1234],host2[6789]",
|
locators = "host1[1234],host2[6789]",
|
||||||
logLevel = "WARN",
|
logLevel = "WARN",
|
||||||
name = "MockLocator",
|
name = "MockLocator",
|
||||||
port = 9876
|
port = 9876,
|
||||||
|
useBeanFactoryLocator = true
|
||||||
)
|
)
|
||||||
static class TestConfiguration {
|
static class TestConfiguration {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user