diff --git a/pom.xml b/pom.xml
index 74be18bc..ead0706c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,8 +18,8 @@
- 2.4.6
- 2.4.6
+ 2.5.5
+ 2.5.5
2.1.0.BUILD-SNAPSHOT
spring.data.couchbase
diff --git a/src/integration/java/org/springframework/data/couchbase/IntegrationTestNoShutdownApplicationConfig.java b/src/integration/java/org/springframework/data/couchbase/IntegrationTestNoShutdownApplicationConfig.java
new file mode 100644
index 00000000..172ac369
--- /dev/null
+++ b/src/integration/java/org/springframework/data/couchbase/IntegrationTestNoShutdownApplicationConfig.java
@@ -0,0 +1,55 @@
+package org.springframework.data.couchbase;
+
+import java.util.Collections;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.env.Environment;
+import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
+import org.springframework.data.couchbase.config.CouchbaseConfigurer;
+
+/**
+ * Configuration for testing no shutdown
+ *
+ * @author Subhashni Balakrishnan
+ */
+public class IntegrationTestNoShutdownApplicationConfig extends AbstractCouchbaseConfiguration {
+
+ @Autowired
+ private Environment springEnv;
+
+ @Bean
+ public String couchbaseAdminUser() {
+ return springEnv.getProperty("couchbase.adminUser", "Administrator");
+ }
+
+ @Bean
+ public String couchbaseAdminPassword() {
+ return springEnv.getProperty("couchbase.adminUser", "password");
+ }
+
+ @Override
+ protected List getBootstrapHosts() {
+ return Collections.singletonList(springEnv.getProperty("couchbase.host", "127.0.0.1"));
+ }
+
+ @Override
+ protected String getBucketName() {
+ return springEnv.getProperty("couchbase.bucket", "default");
+ }
+
+ @Override
+ protected String getBucketPassword() {
+ return springEnv.getProperty("couchbase.password", "");
+ }
+
+ @Override
+ protected boolean isEnvironmentManagedBySpring() {
+ return false;
+ }
+
+ @Override
+ protected CouchbaseConfigurer couchbaseConfigurer() {
+ return this;
+ }
+}
\ No newline at end of file
diff --git a/src/integration/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxyTest.java b/src/integration/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxyTest.java
new file mode 100644
index 00000000..3c9f6c27
--- /dev/null
+++ b/src/integration/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxyTest.java
@@ -0,0 +1,26 @@
+package org.springframework.data.couchbase.config;
+
+import com.couchbase.client.java.env.CouchbaseEnvironment;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.couchbase.IntegrationTestNoShutdownApplicationConfig;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+/**
+ * Simple test to make sure that environment is not shutdown if not life cycle managed by Spring.
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = IntegrationTestNoShutdownApplicationConfig.class)
+public class CouchbaseEnvironmentNoShutdownProxyTest {
+
+ @Autowired
+ public CouchbaseEnvironment environment;
+
+ @Test
+ public void testEnvironmentShutDown() {
+ Assert.assertEquals("Should return false", false, environment.shutdown());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java
index 8dece82a..53431f51 100644
--- a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java
+++ b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java
@@ -16,6 +16,7 @@
package org.springframework.data.couchbase.config;
+import java.lang.reflect.Proxy;
import java.util.List;
import com.couchbase.client.java.Bucket;
@@ -90,11 +91,14 @@ public abstract class AbstractCouchbaseConfiguration
@Override
@Bean(destroyMethod = "shutdown", name = BeanNames.COUCHBASE_ENV)
public CouchbaseEnvironment couchbaseEnvironment() {
- CouchbaseEnvironment env = getEnvironment();
if (isEnvironmentManagedBySpring()) {
- return env;
+ return getEnvironment();
+ } else {
+ CouchbaseEnvironment proxy = (CouchbaseEnvironment) Proxy.newProxyInstance(CouchbaseEnvironment.class.getClassLoader(),
+ new Class[]{CouchbaseEnvironment.class},
+ new CouchbaseEnvironmentNoShutdownInvocationHandler(getEnvironment()));
+ return proxy;
}
- return new CouchbaseEnvironmentNoShutdownProxy(env);
}
/**
diff --git a/src/main/java/org/springframework/data/couchbase/config/AbstractReactiveCouchbaseConfiguration.java b/src/main/java/org/springframework/data/couchbase/config/AbstractReactiveCouchbaseConfiguration.java
index d5bf3ff2..8c2a662c 100644
--- a/src/main/java/org/springframework/data/couchbase/config/AbstractReactiveCouchbaseConfiguration.java
+++ b/src/main/java/org/springframework/data/couchbase/config/AbstractReactiveCouchbaseConfiguration.java
@@ -25,6 +25,7 @@ import com.couchbase.client.java.cluster.ClusterInfo;
import com.couchbase.client.java.env.CouchbaseEnvironment;
import com.couchbase.client.java.env.DefaultCouchbaseEnvironment;
+import java.lang.reflect.Proxy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -88,11 +89,14 @@ public abstract class AbstractReactiveCouchbaseConfiguration
@Override
@Bean(destroyMethod = "shutdown", name = BeanNames.COUCHBASE_ENV)
public CouchbaseEnvironment couchbaseEnvironment() {
- CouchbaseEnvironment env = getEnvironment();
if (isEnvironmentManagedBySpring()) {
- return env;
+ return getEnvironment();
+ } else {
+ CouchbaseEnvironment proxy = (CouchbaseEnvironment) java.lang.reflect.Proxy.newProxyInstance(CouchbaseEnvironment.class.getClassLoader(),
+ new Class[]{CouchbaseEnvironment.class},
+ new CouchbaseEnvironmentNoShutdownInvocationHandler(getEnvironment()));
+ return proxy;
}
- return new CouchbaseEnvironmentNoShutdownProxy(env);
}
/**
diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentFactoryBean.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentFactoryBean.java
index 3ec71b19..0f3cf8a0 100644
--- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentFactoryBean.java
+++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentFactoryBean.java
@@ -119,10 +119,6 @@ import org.springframework.beans.factory.config.AbstractFactoryBean;
this.couchbaseEnvBuilder.dnsSrvEnabled(dnsSrvEnabled);
}
- public void setDcpEnabled(boolean dcpEnabled) {
- this.couchbaseEnvBuilder.dcpEnabled(dcpEnabled);
- }
-
public void setSslEnabled(boolean sslEnabled) {
this.couchbaseEnvBuilder.sslEnabled(sslEnabled);
}
diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownInvocationHandler.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownInvocationHandler.java
new file mode 100644
index 00000000..28ad57f6
--- /dev/null
+++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownInvocationHandler.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012-2017 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
+ *
+ * http://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.couchbase.config;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import com.couchbase.client.java.env.CouchbaseEnvironment;
+
+/**
+ * A dynamic proxy around a {@link CouchbaseEnvironment} that prevents its {@link CouchbaseEnvironment#shutdown()} method
+ * to be invoked. Useful when the delegate is not to be lifecycle-managed by Spring.
+ *
+ * @author Simon Baslé
+ * @author Jonathan Edwards
+ * @author Subhashni Balakrishnan
+ */
+public class CouchbaseEnvironmentNoShutdownInvocationHandler implements InvocationHandler {
+
+ private final CouchbaseEnvironment environment;
+
+ public CouchbaseEnvironmentNoShutdownInvocationHandler(CouchbaseEnvironment environment) {
+ this.environment = environment;
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ if (method.getName().contentEquals("shutdown")) {
+ return false;
+ }
+ return method.invoke(this.environment, args);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxy.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxy.java
deleted file mode 100644
index 1ef91e5e..00000000
--- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxy.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Copyright 2012-2017 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
- *
- * http://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.couchbase.config;
-
-import java.security.KeyStore;
-import java.util.concurrent.TimeUnit;
-
-import com.couchbase.client.core.env.*;
-import com.couchbase.client.core.event.EventBus;
-import com.couchbase.client.core.metrics.MetricsCollector;
-import com.couchbase.client.core.metrics.NetworkLatencyMetricsCollector;
-import com.couchbase.client.core.node.MemcachedHashingStrategy;
-import com.couchbase.client.core.retry.RetryStrategy;
-import com.couchbase.client.core.time.Delay;
-import com.couchbase.client.deps.io.netty.channel.EventLoopGroup;
-import com.couchbase.client.java.env.CouchbaseEnvironment;
-import rx.Observable;
-import rx.Scheduler;
-
-/**
- * A proxy around a {@link CouchbaseEnvironment} that prevents its {@link #shutdown()} method
- * to be invoked. Useful when the delegate is not to be lifecycle-managed by Spring.
- *
- * @author Simon Baslé
- * @author Jonathan Edwards
- * @author Subhashni Balakrishnan
- */
-public class CouchbaseEnvironmentNoShutdownProxy implements CouchbaseEnvironment {
-
- private final CouchbaseEnvironment delegate;
-
- public CouchbaseEnvironmentNoShutdownProxy(CouchbaseEnvironment delegate) {
- this.delegate = delegate;
- }
-
- @Override
- public boolean shutdown() {
- return false;
- }
-
- //===== DELEGATION METHODS =====
-
- @Override
- public Observable shutdownAsync() {
- return delegate.shutdownAsync();
- }
-
- @Override
- public EventLoopGroup ioPool() {
- return delegate.ioPool();
- }
-
- @Override
- public EventLoopGroup kvIoPool() {
- return delegate.kvIoPool();
- }
-
- @Override
- public Scheduler scheduler() {
- return delegate.scheduler();
- }
-
- @Override
- public boolean dcpEnabled() {
- return delegate.dcpEnabled();
- }
-
- @Override
- public boolean sslEnabled() {
- return delegate.sslEnabled();
- }
-
- @Override
- public String sslKeystoreFile() {
- return delegate.sslKeystoreFile();
- }
-
- @Override
- public String sslKeystorePassword() {
- return delegate.sslKeystorePassword();
- }
-
- @Override
- public boolean bootstrapHttpEnabled() {
- return delegate.bootstrapHttpEnabled();
- }
-
- @Override
- public boolean bootstrapCarrierEnabled() {
- return delegate.bootstrapCarrierEnabled();
- }
-
- @Override
- public int bootstrapHttpDirectPort() {
- return delegate.bootstrapHttpDirectPort();
- }
-
- @Override
- public int bootstrapHttpSslPort() {
- return delegate.bootstrapHttpSslPort();
- }
-
- @Override
- public int bootstrapCarrierDirectPort() {
- return delegate.bootstrapCarrierDirectPort();
- }
-
- @Override
- public int bootstrapCarrierSslPort() {
- return delegate.bootstrapCarrierSslPort();
- }
-
- @Override
- public int ioPoolSize() {
- return delegate.ioPoolSize();
- }
-
- @Override
- public int computationPoolSize() {
- return delegate.computationPoolSize();
- }
-
- @Override
- public Delay observeIntervalDelay() {
- return delegate.observeIntervalDelay();
- }
-
- @Override
- public Delay reconnectDelay() {
- return delegate.reconnectDelay();
- }
-
- @Override
- public Delay retryDelay() {
- return delegate.retryDelay();
- }
-
- @Override
- public int requestBufferSize() {
- return delegate.requestBufferSize();
- }
-
- @Override
- public int responseBufferSize() {
- return delegate.responseBufferSize();
- }
-
- @Override
- public int dcpConnectionBufferSize() {
- return delegate.dcpConnectionBufferSize();
- }
-
- @Override
- public double dcpConnectionBufferAckThreshold() {
- return delegate.dcpConnectionBufferAckThreshold();
- }
-
- @Override
- public int kvEndpoints() {
- return delegate.kvEndpoints();
- }
-
- @Override
- public int viewEndpoints() {
- return delegate.viewEndpoints();
- }
-
- @Override
- public int queryEndpoints() {
- return delegate.queryEndpoints();
- }
-
- @Override
- public String userAgent() {
- return delegate.userAgent();
- }
-
- @Override
- public String packageNameAndVersion() {
- return delegate.packageNameAndVersion();
- }
-
- @Override
- public RetryStrategy retryStrategy() {
- return delegate.retryStrategy();
- }
-
- @Override
- public long maxRequestLifetime() {
- return delegate.maxRequestLifetime();
- }
-
- @Override
- public long autoreleaseAfter() {
- return delegate.autoreleaseAfter();
- }
-
- @Override
- public long keepAliveInterval() {
- return delegate.keepAliveInterval();
- }
-
- @Override
- public EventBus eventBus() {
- return delegate.eventBus();
- }
-
- @Override
- public boolean bufferPoolingEnabled() {
- return delegate.bufferPoolingEnabled();
- }
-
- @Override
- public long managementTimeout() {
- return delegate.managementTimeout();
- }
-
- @Override
- public long queryTimeout() {
- return delegate.queryTimeout();
- }
-
- @Override
- public long viewTimeout() {
- return delegate.viewTimeout();
- }
-
- @Override
- public long kvTimeout() {
- return delegate.kvTimeout();
- }
-
- @Override
- public long connectTimeout() {
- return delegate.connectTimeout();
- }
-
- @Override
- public long disconnectTimeout() {
- return delegate.disconnectTimeout();
- }
-
- @Override
- public boolean dnsSrvEnabled() {
- return delegate.dnsSrvEnabled();
- }
-
- @Override
- public NetworkLatencyMetricsCollector networkLatencyMetricsCollector() {
- return delegate.networkLatencyMetricsCollector();
- }
-
- @Override
- public int socketConnectTimeout() {
- return delegate.socketConnectTimeout();
- }
-
- @Override
- public MetricsCollector runtimeMetricsCollector() {
- return delegate.runtimeMetricsCollector();
- }
-
- @Override
- public boolean mutationTokensEnabled() {
- return delegate.mutationTokensEnabled();
- }
-
- @Override
- public boolean tcpNodelayEnabled() {
- return delegate.tcpNodelayEnabled();
- }
-
- @Override
- public boolean callbacksOnIoPool() {
- return delegate.callbacksOnIoPool();
- }
-
- @Override
- public String coreBuild() {
- return delegate.coreBuild();
- }
-
- @Override
- public String coreVersion() {
- return delegate.coreVersion();
- }
-
- @Override
- public String dcpConnectionName() {
- return delegate.dcpConnectionName();
- }
-
- @Override
- public int searchEndpoints() {
- return delegate.searchEndpoints();
- }
-
- @Override
- public String clientBuild() {
- return delegate.clientBuild();
- }
-
- @Override
- public String clientVersion() {
- return delegate.clientVersion();
- }
-
- @Override
- public long searchTimeout() {
- return delegate.searchTimeout();
- }
-
- @Override
- public WaitStrategyFactory requestBufferWaitStrategy() {
- return delegate.requestBufferWaitStrategy();
- }
-
- @Override
- public EventLoopGroup viewIoPool() {
- return delegate.viewIoPool();
- }
-
- @Override
- public EventLoopGroup searchIoPool() {
- return delegate.searchIoPool();
- }
-
- @Override
- public EventLoopGroup queryIoPool() {
- return delegate.queryIoPool();
- }
-
- @Override
- public KeyStore sslKeystore() {
- return delegate.sslKeystore();
- }
-
- @Override
- public boolean shutdown(long timeout, TimeUnit timeUnit) {
- return delegate.shutdown(timeout, timeUnit);
- }
-
- @Override
- public MemcachedHashingStrategy memcachedHashingStrategy() {
- return delegate.memcachedHashingStrategy();
- }
-
- @Override
- public long analyticsTimeout() {
- return delegate.analyticsTimeout();
- }
-
- @Override
- public long configPollInterval() {
- return delegate.configPollInterval();
- }
-
- @Override
- public KeyValueServiceConfig kvServiceConfig() {
- return delegate.kvServiceConfig();
- }
-
- @Override
- public QueryServiceConfig queryServiceConfig() {
- return delegate.queryServiceConfig();
- }
-
- @Override
- public SearchServiceConfig searchServiceConfig() {
- return delegate.searchServiceConfig();
- }
-
- @Override
- public ViewServiceConfig viewServiceConfig() {
- return delegate.viewServiceConfig();
- }
-}
diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentParser.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentParser.java
index 37b0f1a2..6df59204 100644
--- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentParser.java
+++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentParser.java
@@ -40,7 +40,6 @@ import org.springframework.util.StringUtils;
* {@link DefaultCouchbaseEnvironment.Builder#disconnectTimeout(long) disconnectTimeout}
* {@link DefaultCouchbaseEnvironment.Builder#dnsSrvEnabled(boolean) dnsSrvEnabled}
*
- * {@link DefaultCouchbaseEnvironment.Builder#dcpEnabled(boolean) dcpEnabled}
* {@link DefaultCouchbaseEnvironment.Builder#sslEnabled(boolean) sslEnabled}
* {@link DefaultCouchbaseEnvironment.Builder#sslKeystoreFile(String) sslKeystoreFile}
* {@link DefaultCouchbaseEnvironment.Builder#sslKeystorePassword(String) sslKeystorePassword}
@@ -113,7 +112,6 @@ public class CouchbaseEnvironmentParser extends AbstractSingleBeanDefinitionPars
setPropertyValue(envDefinitionBuilder, envElement, "disconnectTimeout", "disconnectTimeout");
setPropertyValue(envDefinitionBuilder, envElement, "dnsSrvEnabled", "dnsSrvEnabled");
- setPropertyValue(envDefinitionBuilder, envElement, "dcpEnabled", "dcpEnabled");
setPropertyValue(envDefinitionBuilder, envElement, "sslEnabled", "sslEnabled");
setPropertyValue(envDefinitionBuilder, envElement, "sslKeystoreFile", "sslKeystoreFile");
setPropertyValue(envDefinitionBuilder, envElement, "sslKeystorePassword", "sslKeystorePassword");
diff --git a/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-env-2.0.xsd b/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-env-2.0.xsd
index 6973761f..5741e6fb 100644
--- a/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-env-2.0.xsd
+++ b/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-env-2.0.xsd
@@ -29,7 +29,6 @@
-
diff --git a/src/test/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentParserTest.java b/src/test/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentParserTest.java
index ddb3f3a1..d8aa3c60 100644
--- a/src/test/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentParserTest.java
+++ b/src/test/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentParserTest.java
@@ -75,7 +75,6 @@ public class CouchbaseEnvironmentParserTest {
assertThat(env.disconnectTimeout(), is(equalTo(6L)));
assertThat(env.dnsSrvEnabled(), allOf(equalTo(true), not(defaultEnv.dnsSrvEnabled())));
- assertThat(env.dcpEnabled(), allOf(equalTo(true), not(defaultEnv.dcpEnabled())));
assertThat(env.sslEnabled(), allOf(equalTo(true), not(defaultEnv.sslEnabled())));
assertThat(env.sslKeystoreFile(), is(equalTo("test")));
assertThat(env.sslKeystorePassword(), is(equalTo("test")));
diff --git a/src/test/resources/configurations/couchbaseEnv-bean.xml b/src/test/resources/configurations/couchbaseEnv-bean.xml
index 52b8348f..5337f812 100644
--- a/src/test/resources/configurations/couchbaseEnv-bean.xml
+++ b/src/test/resources/configurations/couchbaseEnv-bean.xml
@@ -19,7 +19,6 @@
disconnectTimeout="6"
dnsSrvEnabled="true"
- dcpEnabled="true"
sslEnabled="true"
sslKeystoreFile="test"
sslKeystorePassword="test"