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"