diff --git a/samples/xml/gemfire-clientserver/spring-session-sample-xml-gemfire-clientserver.gradle b/samples/xml/gemfire-clientserver/spring-session-sample-xml-gemfire-clientserver.gradle
index 4f8f3b9..16a6010 100644
--- a/samples/xml/gemfire-clientserver/spring-session-sample-xml-gemfire-clientserver.gradle
+++ b/samples/xml/gemfire-clientserver/spring-session-sample-xml-gemfire-clientserver.gradle
@@ -6,7 +6,6 @@ dependencies {
compile project(':spring-session-data-geode')
compile "org.springframework:spring-web"
- compile "org.springframework.data:spring-data-geode-test"
compile "org.webjars:bootstrap"
compile "org.webjars:webjars-taglib"
compile jstlDependencies
diff --git a/samples/xml/gemfire-clientserver/src/main/java/sample/ClientServerReadyBeanPostProcessor.java b/samples/xml/gemfire-clientserver/src/main/java/sample/ClientServerReadyBeanPostProcessor.java
index f2a032e..43b8b92 100644
--- a/samples/xml/gemfire-clientserver/src/main/java/sample/ClientServerReadyBeanPostProcessor.java
+++ b/samples/xml/gemfire-clientserver/src/main/java/sample/ClientServerReadyBeanPostProcessor.java
@@ -16,28 +16,107 @@
package sample;
+import java.io.IOException;
+import java.net.Socket;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.data.gemfire.client.ClientCacheFactoryBean;
-import org.springframework.data.gemfire.tests.integration.ClientServerIntegrationTestsSupport;
+import org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration;
@SuppressWarnings("unused")
-public class ClientServerReadyBeanPostProcessor extends ClientServerIntegrationTestsSupport
- implements BeanPostProcessor {
+public class ClientServerReadyBeanPostProcessor implements BeanPostProcessor {
- @Value("${spring.session.data.geode.cache.server.port:${spring.data.gemfire.cache.server.port:40404}}")
+ private static final long DEFAULT_TIMEOUT = TimeUnit.SECONDS.toMillis(20);
+
+ private final AtomicBoolean verifyGemFireServerIsRunning = new AtomicBoolean(true);
+
+ @Value("${spring.data.gemfire.cache.server.port:40404}")
private int port;
- @Value("${spring.session.data.geode.cache.server.host:${spring.data.gemfire.cache.server.host:localhost}}")
- private String host;
-
+ @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- if (bean instanceof ClientCacheFactoryBean) {
- waitForServerToStart(host, port);
+ if (isGemFireServerRunningVerificationEnabled(bean, beanName)) {
+ waitOn(getGemFireServerSocketCondition(this.port));
}
return bean;
}
+
+ private boolean isGemFireServerRunningVerificationEnabled(Object bean, String beanName) {
+
+ return isSessionGemFireRegion(bean, beanName)
+ && this.verifyGemFireServerIsRunning.compareAndSet(true, false);
+ }
+
+ private boolean isSessionGemFireRegion(Object bean, String beanName) {
+ return GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME.equals(beanName);
+ }
+
+ private Condition getGemFireServerSocketCondition(int port) {
+
+ AtomicBoolean gemfireServerRunning = new AtomicBoolean(false);
+
+ return () -> {
+
+ Socket socket = null;
+
+ try {
+ if (!gemfireServerRunning.get()) {
+ socket = new Socket("localhost", port);
+ gemfireServerRunning.set(true);
+ }
+ }
+ catch (IOException ignore) { }
+ finally {
+ safeClose(socket);
+ }
+
+ return gemfireServerRunning.get();
+ };
+ }
+
+ private boolean safeClose(Socket socket) {
+
+ try {
+ if (socket != null) {
+ socket.close();
+ }
+
+ return true;
+ }
+ catch (IOException ignore) {
+ return false;
+ }
+ }
+
+ private boolean waitOn(Condition condition) {
+
+ long timeout = System.currentTimeMillis() + DEFAULT_TIMEOUT;
+
+ while (doWait(condition, timeout)) {
+ synchronized (this) {
+ try {
+ TimeUnit.MICROSECONDS.timedWait(this, 500L);
+ }
+ catch (InterruptedException cause) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
+
+ return condition.evaluate();
+ }
+
+ private boolean doWait(Condition condition, long timeout) {
+ return !Thread.currentThread().isInterrupted() && System.currentTimeMillis() < timeout && !condition.evaluate();
+ }
+
+ @FunctionalInterface
+ interface Condition {
+ boolean evaluate();
+ }
}
diff --git a/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/application.properties b/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/application.properties
deleted file mode 100644
index d63e69a..0000000
--- a/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/application.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-spring.data.gemfire.cache.server.host=localhost
-spring.data.gemfire.cache.server.port=42424
diff --git a/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/session-server.xml b/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/session-server.xml
index 0ec8aa4..c773206 100644
--- a/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/session-server.xml
+++ b/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/session-server.xml
@@ -15,12 +15,12 @@
-
+
- SpringSessionDataGeodeXmlSampleServer
- ${spring.session.data.gemfire.log-level:error}
+ SpringSessionDataGeodeSampleXmlServer
+ ${spring.session.data.geode.log-level:error}
@@ -28,8 +28,8 @@
diff --git a/samples/xml/gemfire-clientserver/src/main/webapp/WEB-INF/spring/session-client.xml b/samples/xml/gemfire-clientserver/src/main/webapp/WEB-INF/spring/session-client.xml
index 32ed1bd..bd17de9 100644
--- a/samples/xml/gemfire-clientserver/src/main/webapp/WEB-INF/spring/session-client.xml
+++ b/samples/xml/gemfire-clientserver/src/main/webapp/WEB-INF/spring/session-client.xml
@@ -15,7 +15,7 @@
-
+
@@ -29,7 +29,7 @@
-