Refactor GemFireCacheTypeAwareRegionFactoryBean to extend SDG's o.s.d.g.config.annotation.support.CacheTypeAwareRegionFactoryBean.
This commit is contained in:
@@ -536,10 +536,10 @@ public class GemFireHttpSessionConfiguration extends AbstractGemFireHttpSessionC
|
||||
GemFireCacheTypeAwareRegionFactoryBean<Object, Session> sessionRegion =
|
||||
new GemFireCacheTypeAwareRegionFactoryBean<>();
|
||||
|
||||
sessionRegion.setAttributes(sessionRegionAttributes);
|
||||
sessionRegion.setCache(gemfireCache);
|
||||
sessionRegion.setClientRegionShortcut(getClientRegionShortcut());
|
||||
sessionRegion.setGemfireCache(gemfireCache);
|
||||
sessionRegion.setPoolName(getPoolName());
|
||||
sessionRegion.setRegionAttributes(sessionRegionAttributes);
|
||||
sessionRegion.setRegionName(getSessionRegionName());
|
||||
sessionRegion.setServerRegionShortcut(getServerRegionShortcut());
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ package org.springframework.session.data.gemfire.config.annotation.web.http.supp
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.apache.geode.cache.GemFireCache;
|
||||
import org.apache.geode.cache.Cache;
|
||||
import org.apache.geode.cache.InterestResultPolicy;
|
||||
import org.apache.geode.cache.Region;
|
||||
import org.apache.geode.cache.RegionAttributes;
|
||||
@@ -26,17 +26,12 @@ import org.apache.geode.cache.RegionShortcut;
|
||||
import org.apache.geode.cache.client.ClientRegionShortcut;
|
||||
import org.apache.geode.cache.client.Pool;
|
||||
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.FactoryBean;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.context.SmartLifecycle;
|
||||
import org.springframework.data.gemfire.GenericRegionFactoryBean;
|
||||
import org.springframework.data.gemfire.client.ClientRegionFactoryBean;
|
||||
import org.springframework.data.gemfire.client.Interest;
|
||||
import org.springframework.data.gemfire.support.AbstractFactoryBeanSupport;
|
||||
import org.springframework.data.gemfire.config.annotation.support.CacheTypeAwareRegionFactoryBean;
|
||||
import org.springframework.session.Session;
|
||||
import org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration;
|
||||
import org.springframework.session.data.gemfire.support.GemFireUtils;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
@@ -62,8 +57,7 @@ import org.springframework.util.StringUtils;
|
||||
* @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration
|
||||
* @since 1.1.0
|
||||
*/
|
||||
public class GemFireCacheTypeAwareRegionFactoryBean<K, V> extends AbstractFactoryBeanSupport<Region<K, V>>
|
||||
implements InitializingBean, SmartLifecycle {
|
||||
public class GemFireCacheTypeAwareRegionFactoryBean<K, V> extends CacheTypeAwareRegionFactoryBean<K, V> {
|
||||
|
||||
protected static final ClientRegionShortcut DEFAULT_CLIENT_REGION_SHORTCUT =
|
||||
GemFireHttpSessionConfiguration.DEFAULT_CLIENT_REGION_SHORTCUT;
|
||||
@@ -77,112 +71,25 @@ public class GemFireCacheTypeAwareRegionFactoryBean<K, V> extends AbstractFactor
|
||||
protected static final String DEFAULT_SESSION_REGION_NAME =
|
||||
GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME;
|
||||
|
||||
private ClientRegionShortcut clientRegionShortcut;
|
||||
|
||||
private GemFireCache gemfireCache;
|
||||
|
||||
private Region<K, V> region;
|
||||
|
||||
private RegionAttributes<K, V> regionAttributes;
|
||||
|
||||
private RegionShortcut serverRegionShortcut;
|
||||
|
||||
private volatile SmartLifecycle smartLifecycleComponent;
|
||||
|
||||
private String poolName;
|
||||
private String regionName;
|
||||
|
||||
/**
|
||||
* Post-construction initialization callback to create, configure and initialize the
|
||||
* Pivotal GemFire cache {@link Region} used to store, replicate (distribute) and manage
|
||||
* Session state. This method intelligently handles both client-server and
|
||||
* peer-to-peer (p2p) Pivotal GemFire supported distributed system topologies.
|
||||
*
|
||||
* @throws Exception if the initialization of the Pivotal GemFire cache {@link Region} fails.
|
||||
* @see org.springframework.session.data.gemfire.support.GemFireUtils#isClient(GemFireCache)
|
||||
* @see #getGemfireCache()
|
||||
* @see #newClientRegion(GemFireCache)
|
||||
* @see #newServerRegion(GemFireCache)
|
||||
*/
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
|
||||
GemFireCache gemfireCache = getGemfireCache();
|
||||
|
||||
this.region = GemFireUtils.isClient(gemfireCache)
|
||||
? newClientRegion(gemfireCache)
|
||||
: newServerRegion(gemfireCache);
|
||||
@Override
|
||||
public void setClientRegionShortcut(ClientRegionShortcut clientRegionShortcut) {
|
||||
super.setClientRegionShortcut(clientRegionShortcut != null ? clientRegionShortcut
|
||||
: DEFAULT_CLIENT_REGION_SHORTCUT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a Pivotal GemFire cache {@link Region} using a peer-to-peer (p2p) GemFire
|
||||
* topology to store and manage Session state in a Pivotal GemFire server cluster accessible
|
||||
* from a Pivotal GemFire cache client.
|
||||
*
|
||||
* @param gemfireCache a reference to the GemFire
|
||||
* {@link org.apache.geode.cache.Cache}.
|
||||
* @return a peer-to-peer-based Pivotal GemFire cache {@link Region} to store and manage
|
||||
* Session state.
|
||||
* @throws Exception if the instantiation, configuration and initialization of the
|
||||
* Pivotal GemFire cache {@link Region} fails.
|
||||
* @see org.springframework.data.gemfire.GenericRegionFactoryBean
|
||||
* @see org.apache.geode.cache.GemFireCache
|
||||
* @see org.apache.geode.cache.Region
|
||||
* @see #getRegionAttributes()
|
||||
* @see #getRegionName()
|
||||
* @see #getServerRegionShortcut()
|
||||
*/
|
||||
protected Region<K, V> newServerRegion(GemFireCache gemfireCache) throws Exception {
|
||||
|
||||
GenericRegionFactoryBean<K, V> serverRegion = new GenericRegionFactoryBean<K, V>();
|
||||
|
||||
serverRegion.setAttributes(getRegionAttributes());
|
||||
serverRegion.setCache(gemfireCache);
|
||||
serverRegion.setRegionName(getRegionName());
|
||||
serverRegion.setShortcut(getServerRegionShortcut());
|
||||
serverRegion.afterPropertiesSet();
|
||||
|
||||
this.smartLifecycleComponent = serverRegion;
|
||||
|
||||
return serverRegion.getObject();
|
||||
@Override
|
||||
public ClientRegionShortcut getClientRegionShortcut() {
|
||||
return super.getClientRegionShortcut();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a Pivotal GemFire cache {@link Region} using the client-server Pivotal GemFire topology
|
||||
* to store and manage Session state in a Pivotal GemFire server cluster accessible from a
|
||||
* Pivotal GemFire cache client.
|
||||
*
|
||||
* @param gemfireCache a reference to the GemFire
|
||||
* {@link org.apache.geode.cache.Cache}.
|
||||
* @return a client-server-based Pivotal GemFire cache {@link Region} to store and manage
|
||||
* Session state.
|
||||
* @throws Exception if the instantiation, configuration and initialization of the
|
||||
* Pivotal GemFire cache {@link Region} fails.
|
||||
* @see org.springframework.data.gemfire.client.ClientRegionFactoryBean
|
||||
* @see org.apache.geode.cache.GemFireCache
|
||||
* @see org.apache.geode.cache.Region
|
||||
* @see #getClientRegionShortcut()
|
||||
* @see #getRegionAttributes()
|
||||
* @see #getRegionName()
|
||||
* @see #registerInterests(boolean)
|
||||
*/
|
||||
protected Region<K, V> newClientRegion(GemFireCache gemfireCache) throws Exception {
|
||||
@Override
|
||||
protected Interest<K>[] getInterests() {
|
||||
|
||||
ClientRegionFactoryBean<K, V> clientRegion = new ClientRegionFactoryBean<K, V>();
|
||||
ClientRegionShortcut clientRegionShortcut = getClientRegionShortcut();
|
||||
|
||||
ClientRegionShortcut shortcut = getClientRegionShortcut();
|
||||
|
||||
clientRegion.setAttributes(getRegionAttributes());
|
||||
clientRegion.setBeanFactory(getBeanFactory());
|
||||
clientRegion.setCache(gemfireCache);
|
||||
clientRegion.setInterests(registerInterests(!GemFireUtils.isLocal(shortcut)));
|
||||
clientRegion.setPoolName(getPoolName());
|
||||
clientRegion.setRegionName(getRegionName());
|
||||
clientRegion.setShortcut(shortcut);
|
||||
clientRegion.afterPropertiesSet();
|
||||
|
||||
this.smartLifecycleComponent = clientRegion;
|
||||
|
||||
return clientRegion.getObject();
|
||||
return registerInterests(!(clientRegionShortcut == null || GemFireUtils.isLocal(clientRegionShortcut)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -201,123 +108,6 @@ public class GemFireCacheTypeAwareRegionFactoryBean<K, V> extends AbstractFactor
|
||||
: new Interest[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a reference to the constructed Pivotal GemFire cache {@link Region} used to store
|
||||
* and manage Session state.
|
||||
*
|
||||
* @return the {@link Region} used to store and manage Session state.
|
||||
* @throws Exception if the {@link Region} reference cannot be obtained.
|
||||
* @see org.apache.geode.cache.Region
|
||||
*/
|
||||
public Region<K, V> getObject() throws Exception {
|
||||
return this.region;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the specific type of Pivotal GemFire cache {@link Region} this factory creates when
|
||||
* initialized or Region.class when uninitialized.
|
||||
*
|
||||
* @return the Pivotal GemFire cache {@link Region} class type constructed by this factory.
|
||||
* @see org.apache.geode.cache.Region
|
||||
* @see java.lang.Class
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public Class<?> getObjectType() {
|
||||
|
||||
return Optional.ofNullable(this.region)
|
||||
.map(Object::getClass)
|
||||
.orElse((Class) Region.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a reference to the Spring {@link BeanFactory} responsible for
|
||||
* creating Apache Geode/Pivotal GemFire components.
|
||||
*
|
||||
* @param beanFactory reference to the Spring {@link BeanFactory}
|
||||
* @throws IllegalArgumentException if the {@link BeanFactory} reference is null.
|
||||
* @see org.springframework.beans.factory.BeanFactory
|
||||
*/
|
||||
@Override
|
||||
public void setBeanFactory(BeanFactory beanFactory) {
|
||||
Assert.notNull(beanFactory, "BeanFactory is required");
|
||||
super.setBeanFactory(beanFactory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a reference to the Spring {@link BeanFactory} responsible for
|
||||
* creating Apache Geode/Pivotal GemFire components.
|
||||
*
|
||||
* @return a reference to the Spring {@link BeanFactory}
|
||||
* @throws IllegalStateException if the {@link BeanFactory} reference
|
||||
* is null.
|
||||
* @see org.springframework.beans.factory.BeanFactory
|
||||
*/
|
||||
@Override
|
||||
public BeanFactory getBeanFactory() {
|
||||
return Optional.ofNullable(super.getBeanFactory()).orElseThrow(() ->
|
||||
new IllegalStateException("A reference to the BeanFactory was not properly configured"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the {@link Region} data policy used by the Pivotal GemFire cache client to manage
|
||||
* Session state.
|
||||
*
|
||||
* @param clientRegionShortcut a {@link ClientRegionShortcut} to specify the client
|
||||
* {@link Region} data management policy.
|
||||
* @see org.apache.geode.cache.client.ClientRegionShortcut
|
||||
*/
|
||||
public void setClientRegionShortcut(ClientRegionShortcut clientRegionShortcut) {
|
||||
this.clientRegionShortcut = clientRegionShortcut;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the {@link Region} data policy used by the Pivotal GemFire cache client to manage
|
||||
* Session state. Defaults to {@link ClientRegionShortcut#PROXY}.
|
||||
*
|
||||
* @return a {@link ClientRegionShortcut} specifying the client {@link Region} data
|
||||
* management policy.
|
||||
* @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration#DEFAULT_CLIENT_REGION_SHORTCUT
|
||||
* @see org.apache.geode.cache.client.ClientRegionShortcut
|
||||
*/
|
||||
protected ClientRegionShortcut getClientRegionShortcut() {
|
||||
return Optional.ofNullable(this.clientRegionShortcut).orElse(DEFAULT_CLIENT_REGION_SHORTCUT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a reference to the Pivotal GemFire cache used to construct the appropriate
|
||||
* {@link Region}.
|
||||
*
|
||||
* @param gemfireCache a reference to the Pivotal GemFire cache.
|
||||
* @throws IllegalArgumentException if the {@link GemFireCache} reference is null.
|
||||
*/
|
||||
public void setGemfireCache(GemFireCache gemfireCache) {
|
||||
this.gemfireCache = Optional.ofNullable(gemfireCache).orElseThrow(() ->
|
||||
new IllegalArgumentException("GemFireCache is required"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a reference to the Pivotal GemFire cache used to construct the appropriate
|
||||
* {@link Region}.
|
||||
*
|
||||
* @return a reference to the Pivotal GemFire cache.
|
||||
* @throws IllegalStateException if the {@link GemFireCache} reference is null.
|
||||
*/
|
||||
protected GemFireCache getGemfireCache() {
|
||||
return Optional.ofNullable(this.gemfireCache).orElseThrow(() ->
|
||||
new IllegalStateException("A reference to the GemFireCache was not properly configured"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the name of the Pivotal GemFire {@link Pool} used by the client Region for managing Sessions
|
||||
* during cache operations involving the server.
|
||||
*
|
||||
* @param poolName the name of a Pivotal GemFire {@link Pool}.
|
||||
* @see Pool#getName()
|
||||
*/
|
||||
public void setPoolName(final String poolName) {
|
||||
this.poolName = poolName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the Pivotal GemFire {@link Pool} used by the client Region for managing Sessions
|
||||
* during cache operations involving the server.
|
||||
@@ -325,8 +115,9 @@ public class GemFireCacheTypeAwareRegionFactoryBean<K, V> extends AbstractFactor
|
||||
* @return the name of a Pivotal GemFire {@link Pool}.
|
||||
* @see Pool#getName()
|
||||
*/
|
||||
protected String getPoolName() {
|
||||
return Optional.ofNullable(this.poolName).filter(StringUtils::hasText).orElse(DEFAULT_POOL_NAME);
|
||||
@Override
|
||||
protected Optional<String> getPoolName() {
|
||||
return Optional.of(super.getPoolName().orElse(DEFAULT_POOL_NAME));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -336,9 +127,11 @@ public class GemFireCacheTypeAwareRegionFactoryBean<K, V> extends AbstractFactor
|
||||
* @param regionAttributes the Pivotal GemFire {@link RegionAttributes} used to configure the
|
||||
* Pivotal GemFire cache {@link Region}.
|
||||
* @see org.apache.geode.cache.RegionAttributes
|
||||
* @deprecated use {@link #setAttributes(RegionAttributes)}.
|
||||
*/
|
||||
@Deprecated
|
||||
public void setRegionAttributes(RegionAttributes<K, V> regionAttributes) {
|
||||
this.regionAttributes = regionAttributes;
|
||||
setAttributes(regionAttributes);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -348,96 +141,52 @@ public class GemFireCacheTypeAwareRegionFactoryBean<K, V> extends AbstractFactor
|
||||
* @return the Pivotal GemFire {@link RegionAttributes} used to configure the Pivotal GemFire cache
|
||||
* {@link Region}.
|
||||
* @see org.apache.geode.cache.RegionAttributes
|
||||
* @deprecated use {@link #getAttributes()}.
|
||||
*/
|
||||
@Deprecated
|
||||
protected RegionAttributes<K, V> getRegionAttributes() {
|
||||
return this.regionAttributes;
|
||||
return getAttributes();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the name of the Pivotal GemFire cache {@link Region} use to store and manage Session
|
||||
* state.
|
||||
* Sets the {@link String name} of the {@link Region} used to store and manage {@link Session} state.
|
||||
*
|
||||
* @param regionName a String specifying the name of the Pivotal GemFire cache {@link Region}.
|
||||
* @param regionName {@link String} containing the name of the {@link Region} used to store
|
||||
* and manage {@link Session} state.
|
||||
*/
|
||||
public void setRegionName(final String regionName) {
|
||||
public void setRegionName(String regionName) {
|
||||
this.regionName = regionName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the configured name of the Pivotal GemFire cache {@link Region} use to store and
|
||||
* manage Session state. Defaults to "ClusteredSpringSessions"
|
||||
* Returns the configured {@link String name} of the {@link Region} used to store and manage {@link Session} state.
|
||||
*
|
||||
* @return a String specifying the name of the Pivotal GemFire cache {@link Region}.
|
||||
* Defaults to {@literal ClusteredSpringSessions}.
|
||||
*
|
||||
* @return a {@link String} containing the name of the {@link Region} used to store
|
||||
* and manage {@link Session} state.
|
||||
* @see org.apache.geode.cache.Region#getName()
|
||||
*/
|
||||
protected String getRegionName() {
|
||||
return Optional.ofNullable(this.regionName).filter(StringUtils::hasText).orElse(DEFAULT_SESSION_REGION_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the {@link Region} data policy used by the Pivotal GemFire peer cache to manage
|
||||
* Session state.
|
||||
*
|
||||
* @param serverRegionShortcut a {@link RegionShortcut} to specify the peer
|
||||
* {@link Region} data management policy.
|
||||
* @see org.apache.geode.cache.RegionShortcut
|
||||
*/
|
||||
public void setServerRegionShortcut(RegionShortcut serverRegionShortcut) {
|
||||
this.serverRegionShortcut = serverRegionShortcut;
|
||||
@Override
|
||||
public String resolveRegionName() {
|
||||
return getRegionName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the {@link Region} data policy used by the Pivotal GemFire peer cache to manage
|
||||
* Session state. Defaults to {@link RegionShortcut#PARTITION}.
|
||||
* Returns the {@link Region} data policy used by the Apache Geode/Pivotal GemFire peer {@link Cache}
|
||||
* to manage {@link Session} state.
|
||||
*
|
||||
* @return a {@link RegionShortcut} specifying the peer {@link Region} data management
|
||||
* policy.
|
||||
* Defaults to {@link RegionShortcut#PARTITION}.
|
||||
*
|
||||
* @return a {@link RegionShortcut} specifying the peer {@link Region} data management policy.
|
||||
* @see org.apache.geode.cache.RegionShortcut
|
||||
*/
|
||||
protected RegionShortcut getServerRegionShortcut() {
|
||||
return Optional.ofNullable(this.serverRegionShortcut).orElse(DEFAULT_SERVER_REGION_SHORTCUT);
|
||||
}
|
||||
|
||||
protected Optional<SmartLifecycle> getSmartLifecycleComponent() {
|
||||
return Optional.ofNullable(this.smartLifecycleComponent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoStartup() {
|
||||
|
||||
return getSmartLifecycleComponent()
|
||||
.map(SmartLifecycle::isAutoStartup)
|
||||
.orElse(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRunning() {
|
||||
|
||||
return getSmartLifecycleComponent()
|
||||
.map(SmartLifecycle::isRunning)
|
||||
.orElse(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
getSmartLifecycleComponent().ifPresent(SmartLifecycle::start);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
getSmartLifecycleComponent().ifPresent(SmartLifecycle::stop);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop(Runnable callback) {
|
||||
getSmartLifecycleComponent().ifPresent(it -> it.stop(callback));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPhase() {
|
||||
|
||||
return getSmartLifecycleComponent()
|
||||
.map(SmartLifecycle::getPhase)
|
||||
.orElse(0);
|
||||
public RegionShortcut getServerRegionShortcut() {
|
||||
return Optional.ofNullable(super.getServerRegionShortcut()).orElse(DEFAULT_SERVER_REGION_SHORTCUT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ import org.springframework.session.Session;
|
||||
import org.springframework.session.data.gemfire.GemFireOperationsSessionRepository;
|
||||
import org.springframework.session.data.gemfire.config.annotation.web.http.support.GemFireCacheTypeAwareRegionFactoryBean;
|
||||
import org.springframework.session.data.gemfire.config.annotation.web.http.support.SpringSessionGemFireConfigurer;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link GemFireHttpSessionConfiguration} class.
|
||||
@@ -83,21 +84,37 @@ public class GemFireHttpSessionConfigurationTests {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected <T> T getField(Object obj, String fieldName) {
|
||||
|
||||
try {
|
||||
Field field = obj.getClass().getDeclaredField(fieldName);
|
||||
Field field = resolveField(obj, fieldName);
|
||||
field.setAccessible(true);
|
||||
return (T) field.get(obj);
|
||||
}
|
||||
catch (NoSuchFieldException e) {
|
||||
throw new IllegalArgumentException(String.format(
|
||||
"field with name [%1$s] was not found in class [%2$s]", fieldName, obj), e);
|
||||
catch (NoSuchFieldException cause) {
|
||||
throw new IllegalArgumentException(cause);
|
||||
}
|
||||
catch (IllegalAccessException e) {
|
||||
throw new Error(String.format("unable to access field [%1$s] on object of type [%2$s]",
|
||||
fieldName, obj.getClass().getName()), e);
|
||||
catch (IllegalAccessException cause) {
|
||||
throw new Error(String.format("Unable to access field [%1$s] on object of type [%2$s]",
|
||||
fieldName, obj.getClass().getName()), cause);
|
||||
}
|
||||
}
|
||||
|
||||
private static Field resolveField(Object obj, String fieldName) throws NoSuchFieldException {
|
||||
return resolveField(obj.getClass(), fieldName);
|
||||
}
|
||||
|
||||
private static Field resolveField(Class type, String fieldName) throws NoSuchFieldException {
|
||||
|
||||
Field field = ReflectionUtils.findField(type, fieldName);
|
||||
|
||||
if (field == null) {
|
||||
throw new NoSuchFieldException(String.format("Field with name [%1$s] was not found in class [%2$s]",
|
||||
fieldName, type));
|
||||
}
|
||||
|
||||
return field;
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
private static <T> T[] toArray(T... array) {
|
||||
return array;
|
||||
@@ -405,16 +422,13 @@ public class GemFireHttpSessionConfigurationTests {
|
||||
this.gemfireConfiguration.sessionRegion(mockGemFireCache, mockRegionAttributes);
|
||||
|
||||
assertThat(sessionRegionFactoryBean).isNotNull();
|
||||
assertThat(this.<ClientRegionShortcut>getField(sessionRegionFactoryBean, "clientRegionShortcut"))
|
||||
.isEqualTo(ClientRegionShortcut.CACHING_PROXY);
|
||||
assertThat(this.<GemFireCache>getField(sessionRegionFactoryBean, "gemfireCache"))
|
||||
.isEqualTo(mockGemFireCache);
|
||||
assertThat(sessionRegionFactoryBean.getClientRegionShortcut()).isEqualTo(ClientRegionShortcut.CACHING_PROXY);
|
||||
assertThat(sessionRegionFactoryBean.getCache()).isEqualTo(mockGemFireCache);
|
||||
assertThat(this.<String>getField(sessionRegionFactoryBean, "poolName")).isEqualTo("TestPool");
|
||||
assertThat(this.<RegionAttributes<Object, Session>>getField(sessionRegionFactoryBean,
|
||||
"regionAttributes")).isEqualTo(mockRegionAttributes);
|
||||
assertThat(this.<String>getField(sessionRegionFactoryBean, "regionName")).isEqualTo("TestRegion");
|
||||
assertThat(this.<RegionShortcut>getField(sessionRegionFactoryBean, "serverRegionShortcut"))
|
||||
.isEqualTo(RegionShortcut.REPLICATE_PERSISTENT);
|
||||
assertThat(sessionRegionFactoryBean.getServerRegionShortcut()).isEqualTo(RegionShortcut.REPLICATE_PERSISTENT);
|
||||
|
||||
verifyZeroInteractions(mockGemFireCache);
|
||||
verifyZeroInteractions(mockRegionAttributes);
|
||||
|
||||
@@ -19,6 +19,8 @@ package org.springframework.session.data.gemfire.config.annotation.web.http.supp
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -35,6 +37,7 @@ import org.apache.geode.cache.client.ClientCache;
|
||||
import org.apache.geode.cache.client.ClientRegionShortcut;
|
||||
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.data.gemfire.client.ClientRegionShortcutWrapper;
|
||||
import org.springframework.data.gemfire.client.Interest;
|
||||
import org.springframework.session.Session;
|
||||
|
||||
@@ -81,28 +84,28 @@ public class GemFireCacheTypeAwareRegionFactoryBeanTests {
|
||||
this.regionFactoryBean = new GemFireCacheTypeAwareRegionFactoryBean<>();
|
||||
}
|
||||
|
||||
protected void afterPropertiesSetCreatesCorrectRegionForGemFireCacheType(final GemFireCache expectedCache,
|
||||
Region<Object, Session> expectedRegion) throws Exception {
|
||||
protected void afterPropertiesSetCreatesCorrectRegionForGemFireCacheType(GemFireCache expectedCache,
|
||||
Region<Object, Session> expectedRegion) throws Exception {
|
||||
|
||||
this.regionFactoryBean = new GemFireCacheTypeAwareRegionFactoryBean<Object, Session>() {
|
||||
|
||||
@Override
|
||||
protected Region<Object, Session> newClientRegion(GemFireCache gemfireCache) throws Exception {
|
||||
protected Region<Object, Session> newClientRegion(GemFireCache gemfireCache, String name) throws Exception {
|
||||
assertThat(gemfireCache).isSameAs(expectedCache);
|
||||
return GemFireCacheTypeAwareRegionFactoryBeanTests.this.mockClientRegion;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Region<Object, Session> newServerRegion(GemFireCache gemfireCache) throws Exception {
|
||||
protected Region<Object, Session> newServerRegion(GemFireCache gemfireCache, String name) throws Exception {
|
||||
assertThat(gemfireCache).isSameAs(expectedCache);
|
||||
return GemFireCacheTypeAwareRegionFactoryBeanTests.this.mockServerRegion;
|
||||
}
|
||||
};
|
||||
|
||||
this.regionFactoryBean.setGemfireCache(expectedCache);
|
||||
this.regionFactoryBean.setCache(expectedCache);
|
||||
this.regionFactoryBean.afterPropertiesSet();
|
||||
|
||||
assertThat(this.regionFactoryBean.getGemfireCache()).isSameAs(expectedCache);
|
||||
assertThat(this.regionFactoryBean.getCache()).isSameAs(expectedCache);
|
||||
assertThat(this.regionFactoryBean.getObject()).isEqualTo(expectedRegion);
|
||||
assertThat(this.regionFactoryBean.getObjectType()).isEqualTo(expectedRegion.getClass());
|
||||
}
|
||||
@@ -136,7 +139,49 @@ public class GemFireCacheTypeAwareRegionFactoryBeanTests {
|
||||
Interest<Object>[] interests = this.regionFactoryBean.registerInterests(false);
|
||||
|
||||
assertThat(interests).isNotNull();
|
||||
assertThat(interests.length).isEqualTo(0);
|
||||
assertThat(interests).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getInterestsWhenClientRegionShortcutIsNotLocalReturnsAllKeys() {
|
||||
|
||||
Arrays.stream(ClientRegionShortcut.values())
|
||||
.filter(clientRegionShortcut -> !clientRegionShortcut.name().contains("LOCAL"))
|
||||
.forEach(clientRegionShortcut -> {
|
||||
|
||||
this.regionFactoryBean.setClientRegionShortcut(clientRegionShortcut);
|
||||
|
||||
assertThat(this.regionFactoryBean.getClientRegionShortcut()).isEqualTo(clientRegionShortcut);
|
||||
assertThat(ClientRegionShortcutWrapper.valueOf(clientRegionShortcut).isLocal()).isFalse();
|
||||
|
||||
Interest<Object>[] interests = this.regionFactoryBean.getInterests();
|
||||
|
||||
assertThat(interests).isNotNull();
|
||||
assertThat(interests).hasSize(1);
|
||||
assertThat(interests[0].isDurable()).isFalse();
|
||||
assertThat(interests[0].getKey().toString()).isEqualTo("ALL_KEYS");
|
||||
assertThat(interests[0].getPolicy()).isEqualTo(InterestResultPolicy.KEYS);
|
||||
assertThat(interests[0].isReceiveValues()).isTrue();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getInterestsWhenClientRegionShortcutIsLocalReturnsNoKeys() {
|
||||
|
||||
Arrays.stream(ClientRegionShortcut.values())
|
||||
.filter(clientRegionShortcut -> clientRegionShortcut.name().contains("LOCAL"))
|
||||
.forEach(clientRegionShortcut -> {
|
||||
|
||||
this.regionFactoryBean.setClientRegionShortcut(clientRegionShortcut);
|
||||
|
||||
assertThat(this.regionFactoryBean.getClientRegionShortcut()).isEqualTo(clientRegionShortcut);
|
||||
assertThat(ClientRegionShortcutWrapper.valueOf(clientRegionShortcut).isLocal()).isTrue();
|
||||
|
||||
Interest<Object>[] interests = this.regionFactoryBean.getInterests();
|
||||
|
||||
assertThat(interests).isNotNull();
|
||||
assertThat(interests).isEmpty();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -159,38 +204,11 @@ public class GemFireCacheTypeAwareRegionFactoryBeanTests {
|
||||
assertThat(this.regionFactoryBean.getBeanFactory()).isEqualTo(mockBeanFactory);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
@SuppressWarnings("all")
|
||||
public void setBeanFactoryToNullThrowsIllegalArgumentException() {
|
||||
try {
|
||||
this.regionFactoryBean.setBeanFactory(null);
|
||||
}
|
||||
catch (IllegalArgumentException expected) {
|
||||
assertThat(expected).hasMessage("BeanFactory is required");
|
||||
assertThat(expected).hasNoCause();
|
||||
|
||||
throw expected;
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException.class)
|
||||
public void getBeanFactoryWhenNullThrowsIllegalStateException() {
|
||||
try {
|
||||
this.regionFactoryBean.getBeanFactory();
|
||||
}
|
||||
catch (IllegalStateException expected) {
|
||||
assertThat(expected).hasMessage("A reference to the BeanFactory was not properly configured");
|
||||
assertThat(expected).hasNoCause();
|
||||
|
||||
throw expected;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setAndGetClientRegionShortcut() {
|
||||
|
||||
assertThat(this.regionFactoryBean.getClientRegionShortcut()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_CLIENT_REGION_SHORTCUT);
|
||||
assertThat(this.regionFactoryBean.getClientRegionShortcut())
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_CLIENT_REGION_SHORTCUT);
|
||||
|
||||
this.regionFactoryBean.setClientRegionShortcut(ClientRegionShortcut.LOCAL_PERSISTENT);
|
||||
|
||||
@@ -208,65 +226,39 @@ public class GemFireCacheTypeAwareRegionFactoryBeanTests {
|
||||
|
||||
Cache mockCache = mock(Cache.class);
|
||||
|
||||
this.regionFactoryBean.setGemfireCache(mockCache);
|
||||
this.regionFactoryBean.setCache(mockCache);
|
||||
|
||||
assertThat(this.regionFactoryBean.getGemfireCache()).isEqualTo(mockCache);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void setGemfireCacheToNullThrowsIllegalArgumentException() {
|
||||
try {
|
||||
this.regionFactoryBean.setGemfireCache(null);
|
||||
}
|
||||
catch (IllegalArgumentException expected) {
|
||||
assertThat(expected).hasMessage("GemFireCache is required");
|
||||
assertThat(expected).hasNoCause();
|
||||
|
||||
throw expected;
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException.class)
|
||||
public void getGemfireCacheWhenNullThrowsIllegalStateException() {
|
||||
try {
|
||||
this.regionFactoryBean.getGemfireCache();
|
||||
}
|
||||
catch (IllegalStateException expected) {
|
||||
assertThat(expected).hasMessage("A reference to the GemFireCache was not properly configured");
|
||||
assertThat(expected).hasNoCause();
|
||||
|
||||
throw expected;
|
||||
}
|
||||
assertThat(this.regionFactoryBean.getCache()).isEqualTo(mockCache);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setAndGetPoolName() {
|
||||
|
||||
assertThat(this.regionFactoryBean.getPoolName()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_POOL_NAME);
|
||||
assertThat(this.regionFactoryBean.getPoolName().orElse(null))
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_POOL_NAME);
|
||||
|
||||
this.regionFactoryBean.setPoolName("TestPoolName");
|
||||
|
||||
assertThat(this.regionFactoryBean.getPoolName()).isEqualTo("TestPoolName");
|
||||
assertThat(this.regionFactoryBean.getPoolName().orElse(null)).isEqualTo("TestPoolName");
|
||||
|
||||
this.regionFactoryBean.setPoolName(" ");
|
||||
|
||||
assertThat(this.regionFactoryBean.getPoolName()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_POOL_NAME);
|
||||
assertThat(this.regionFactoryBean.getPoolName().orElse(null))
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_POOL_NAME);
|
||||
|
||||
this.regionFactoryBean.setPoolName("");
|
||||
|
||||
assertThat(this.regionFactoryBean.getPoolName()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_POOL_NAME);
|
||||
assertThat(this.regionFactoryBean.getPoolName().orElse(null))
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_POOL_NAME);
|
||||
|
||||
this.regionFactoryBean.setPoolName(null);
|
||||
|
||||
assertThat(this.regionFactoryBean.getPoolName()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_POOL_NAME);
|
||||
assertThat(this.regionFactoryBean.getPoolName().orElse(null))
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_POOL_NAME);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
@SuppressWarnings({ "deprecation", "unchecked" })
|
||||
public void setAndGetRegionAttributes() {
|
||||
|
||||
RegionAttributes<Object, Session> mockRegionAttributes = mock(RegionAttributes.class);
|
||||
@@ -285,8 +277,8 @@ public class GemFireCacheTypeAwareRegionFactoryBeanTests {
|
||||
@Test
|
||||
public void setAndGetRegionName() {
|
||||
|
||||
assertThat(this.regionFactoryBean.getRegionName()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SESSION_REGION_NAME);
|
||||
assertThat(this.regionFactoryBean.getRegionName())
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SESSION_REGION_NAME);
|
||||
|
||||
this.regionFactoryBean.setRegionName("Example");
|
||||
|
||||
@@ -294,25 +286,25 @@ public class GemFireCacheTypeAwareRegionFactoryBeanTests {
|
||||
|
||||
this.regionFactoryBean.setRegionName(" ");
|
||||
|
||||
assertThat(this.regionFactoryBean.getRegionName()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SESSION_REGION_NAME);
|
||||
assertThat(this.regionFactoryBean.getRegionName())
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SESSION_REGION_NAME);
|
||||
|
||||
this.regionFactoryBean.setRegionName("");
|
||||
|
||||
assertThat(this.regionFactoryBean.getRegionName()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SESSION_REGION_NAME);
|
||||
assertThat(this.regionFactoryBean.getRegionName())
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SESSION_REGION_NAME);
|
||||
|
||||
this.regionFactoryBean.setRegionName(null);
|
||||
|
||||
assertThat(this.regionFactoryBean.getRegionName()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SESSION_REGION_NAME);
|
||||
assertThat(this.regionFactoryBean.getRegionName())
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SESSION_REGION_NAME);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setAndGetServerRegionShortcut() {
|
||||
|
||||
assertThat(this.regionFactoryBean.getServerRegionShortcut()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SERVER_REGION_SHORTCUT);
|
||||
assertThat(this.regionFactoryBean.getServerRegionShortcut())
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SERVER_REGION_SHORTCUT);
|
||||
|
||||
this.regionFactoryBean.setServerRegionShortcut(RegionShortcut.LOCAL_PERSISTENT);
|
||||
|
||||
@@ -320,7 +312,7 @@ public class GemFireCacheTypeAwareRegionFactoryBeanTests {
|
||||
|
||||
this.regionFactoryBean.setServerRegionShortcut(null);
|
||||
|
||||
assertThat(this.regionFactoryBean.getServerRegionShortcut()).isEqualTo(
|
||||
GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SERVER_REGION_SHORTCUT);
|
||||
assertThat(this.regionFactoryBean.getServerRegionShortcut())
|
||||
.isEqualTo(GemFireCacheTypeAwareRegionFactoryBean.DEFAULT_SERVER_REGION_SHORTCUT);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user