diff --git a/pom.xml b/pom.xml index 6a52dc867..b6ad3dc88 100644 --- a/pom.xml +++ b/pom.xml @@ -27,11 +27,14 @@ + UTF-8 + UTF-8 multi spring-data-cassandra 1.6.2.RELEASE 1.2.0.1 1.0.4-dse + 2.16 @@ -64,7 +67,7 @@ Alex Shvid a at shvid.com - Project Lead + Project Lead Developer -8 @@ -123,10 +126,19 @@ ${spring} + org.slf4j - slf4j-api - 1.7.4 + log4j-over-slf4j + ${slf4j} + test + + + + org.slf4j + jul-to-slf4j + ${slf4j} + test @@ -227,7 +239,7 @@ org.apache.maven.plugins maven-surefire-plugin - -Xmx2048m -XX:MaxPermSize=512m + -Xmx2048m -XX:MaxPermSize=512m methods 10 false @@ -246,8 +258,10 @@ org.apache.maven.plugins maven-failsafe-plugin + ${failsafe.version} - -Xmx2048m -XX:MaxPermSize=512m + always + -Xmx2048m -XX:MaxPermSize=512m false **/test/integration/**/*.java diff --git a/spring-cassandra/pom.xml b/spring-cassandra/pom.xml index db65767f3..b3afd4fd1 100644 --- a/spring-cassandra/pom.xml +++ b/spring-cassandra/pom.xml @@ -44,6 +44,12 @@ com.datastax.cassandra cassandra-driver-core + + + log4j + log4j + + javax.enterprise @@ -72,6 +78,11 @@ + + cglib + cglib-nodep + test + javax.el el-api diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraClusterFactoryBean.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/CassandraClusterFactoryBean.java similarity index 96% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraClusterFactoryBean.java rename to spring-cassandra/src/main/java/org/springframework/cassandra/config/CassandraClusterFactoryBean.java index 5221028cb..ea21b424c 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraClusterFactoryBean.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/CassandraClusterFactoryBean.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.core; +package org.springframework.cassandra.config; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; @@ -21,9 +21,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.cassandra.support.CassandraExceptionTranslator; import org.springframework.dao.DataAccessException; import org.springframework.dao.support.PersistenceExceptionTranslator; -import org.springframework.data.cassandra.config.CompressionType; -import org.springframework.data.cassandra.config.PoolingOptionsConfig; -import org.springframework.data.cassandra.config.SocketOptionsConfig; import org.springframework.util.StringUtils; import com.datastax.driver.core.AuthProvider; @@ -40,6 +37,7 @@ import com.datastax.driver.core.policies.RetryPolicy; * Convenient factory for configuring a Cassandra Cluster. * * @author Alex Shvid + * @author Matthew T. Adams */ public class CassandraClusterFactoryBean implements FactoryBean, InitializingBean, DisposableBean, diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/CassandraSessionFactoryBean.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/CassandraSessionFactoryBean.java new file mode 100644 index 000000000..2a5168db7 --- /dev/null +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/CassandraSessionFactoryBean.java @@ -0,0 +1,109 @@ +/* + * Copyright 2011-2013 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.cassandra.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.cassandra.support.CassandraExceptionTranslator; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.support.PersistenceExceptionTranslator; +import org.springframework.util.StringUtils; + +import com.datastax.driver.core.Cluster; +import com.datastax.driver.core.Session; + +/** + * Factory for configuring a Cassandra {@link Session}, which is a thread-safe singleton. As such, it is sufficient to + * have one {@link Session} per application and keyspace. + * + * @author Alex Shvid + * @author Matthew T. Adams + */ + +public class CassandraSessionFactoryBean implements FactoryBean, InitializingBean, DisposableBean, + PersistenceExceptionTranslator { + + private static final Logger log = LoggerFactory.getLogger(CassandraSessionFactoryBean.class); + + public static final String DEFAULT_REPLICATION_STRATEGY = "SimpleStrategy"; + public static final int DEFAULT_REPLICATION_FACTOR = 1; + + private Cluster cluster; + private Session session; + private String keyspaceName; + + private final PersistenceExceptionTranslator exceptionTranslator = new CassandraExceptionTranslator(); + + public Session getObject() { + return session; + } + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.FactoryBean#getObjectType() + */ + public Class getObjectType() { + return Session.class; + } + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.FactoryBean#isSingleton() + */ + public boolean isSingleton() { + return true; + } + + /* + * (non-Javadoc) + * @see org.springframework.dao.support.PersistenceExceptionTranslator#translateExceptionIfPossible(java.lang.RuntimeException) + */ + public DataAccessException translateExceptionIfPossible(RuntimeException ex) { + return exceptionTranslator.translateExceptionIfPossible(ex); + } + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() + */ + public void afterPropertiesSet() throws Exception { + + if (cluster == null) { + throw new IllegalArgumentException("at least one cluster is required"); + } + + this.session = StringUtils.hasText(this.keyspaceName) ? cluster.connect(keyspaceName) : cluster.connect(); + } + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.DisposableBean#destroy() + */ + public void destroy() throws Exception { + this.session.shutdown(); + } + + public void setKeyspaceName(String keyspaceName) { + this.keyspaceName = keyspaceName; + } + + public void setCluster(Cluster cluster) { + this.cluster = cluster; + } +} diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/CassandraTemplateFactoryBean.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/CassandraTemplateFactoryBean.java new file mode 100644 index 000000000..660ac9c85 --- /dev/null +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/CassandraTemplateFactoryBean.java @@ -0,0 +1,63 @@ +/* + * Copyright 2011-2013 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.cassandra.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.cassandra.core.CassandraOperations; +import org.springframework.cassandra.core.CassandraTemplate; + +import com.datastax.driver.core.Session; + +/** + * Factory for configuring a {@link CassandraTemplate}. + * + * @author Matthew T. Adams + */ +public class CassandraTemplateFactoryBean implements FactoryBean, InitializingBean { + + private static final Logger log = LoggerFactory.getLogger(CassandraTemplateFactoryBean.class); + + private CassandraTemplate template; + private Session session; + + public CassandraOperations getObject() { + return template; + } + + public Class getObjectType() { + return CassandraOperations.class; + } + + public boolean isSingleton() { + return true; + } + + public void afterPropertiesSet() throws Exception { + + if (session == null) { + throw new IllegalStateException("session is required"); + } + + this.template = new CassandraTemplate(session); + } + + public void setSession(Session session) { + this.session = session; + } +} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CompressionType.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/CompressionType.java similarity index 93% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CompressionType.java rename to spring-cassandra/src/main/java/org/springframework/cassandra/config/CompressionType.java index c74c36676..4e9248ada 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CompressionType.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/CompressionType.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.config; +package org.springframework.cassandra.config; /** * Simple enumeration for the various compression types. diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/KeyspaceAttributes.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/KeyspaceAttributes.java new file mode 100644 index 000000000..052315434 --- /dev/null +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/KeyspaceAttributes.java @@ -0,0 +1,57 @@ +/* + * Copyright 2011-2013 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.cassandra.config; + +/** + * Keyspace attributes. + * + * @author Alex Shvid + * @author Matthew T. Adams + */ +public class KeyspaceAttributes { + + public static final String DEFAULT_REPLICATION_STRATEGY = "SimpleStrategy"; + public static final int DEFAULT_REPLICATION_FACTOR = 1; + public static final boolean DEFAULT_DURABLE_WRITES = true; + + private String replicationStrategy = DEFAULT_REPLICATION_STRATEGY; + private int replicationFactor = DEFAULT_REPLICATION_FACTOR; + private boolean durableWrites = DEFAULT_DURABLE_WRITES; + + public String getReplicationStrategy() { + return replicationStrategy; + } + + public void setReplicationStrategy(String replicationStrategy) { + this.replicationStrategy = replicationStrategy; + } + + public int getReplicationFactor() { + return replicationFactor; + } + + public void setReplicationFactor(int replicationFactor) { + this.replicationFactor = replicationFactor; + } + + public boolean isDurableWrites() { + return durableWrites; + } + + public void setDurableWrites(boolean durableWrites) { + this.durableWrites = durableWrites; + } +} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/PoolingOptionsConfig.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/PoolingOptionsConfig.java similarity index 94% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/PoolingOptionsConfig.java rename to spring-cassandra/src/main/java/org/springframework/cassandra/config/PoolingOptionsConfig.java index 4ba96539e..e982e217d 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/PoolingOptionsConfig.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/PoolingOptionsConfig.java @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.config; +package org.springframework.cassandra.config; /** - * Pooling options POJO. Can be remote or local. + * Pooling options. * * @author Alex Shvid + * @author Matthew T. Adams */ public class PoolingOptionsConfig { @@ -58,5 +59,4 @@ public class PoolingOptionsConfig { public void setMaxConnections(Integer maxConnections) { this.maxConnections = maxConnections; } - } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SocketOptionsConfig.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/SocketOptionsConfig.java similarity index 95% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SocketOptionsConfig.java rename to spring-cassandra/src/main/java/org/springframework/cassandra/config/SocketOptionsConfig.java index 1e72c7742..562377415 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SocketOptionsConfig.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/SocketOptionsConfig.java @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.config; +package org.springframework.cassandra.config; /** - * Socket options POJO. Uses to configure Netty. + * Socket options. * * @author Alex Shvid + * @author Matthew T. Adams */ public class SocketOptionsConfig { @@ -85,5 +86,4 @@ public class SocketOptionsConfig { public void setSendBufferSize(Integer sendBufferSize) { this.sendBufferSize = sendBufferSize; } - } diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/TableAttributes.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/TableAttributes.java new file mode 100644 index 000000000..ce6d26137 --- /dev/null +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/TableAttributes.java @@ -0,0 +1,49 @@ +/* + * Copyright 2011-2013 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.cassandra.config; + +/** + * Table attributes are used for manipulation around table at the startup (create/update/validate). + * + * @author Alex Shvid + */ +public class TableAttributes { + + private String entity; + private String name; + + public String getEntity() { + return entity; + } + + public void setEntity(String entity) { + this.entity = entity; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "TableAttributes [entity=" + entity + "]"; + } + +} diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/java/AbstractCassandraConfiguration.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/java/AbstractCassandraConfiguration.java new file mode 100644 index 000000000..955256a70 --- /dev/null +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/java/AbstractCassandraConfiguration.java @@ -0,0 +1,65 @@ +/* + * Copyright 2011-2012 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.cassandra.config.java; + +import org.springframework.cassandra.core.CassandraOperations; +import org.springframework.cassandra.core.CassandraTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; + +import com.datastax.driver.core.Cluster; +import com.datastax.driver.core.Session; + +/** + * Base class for Spring Cassandra configuration using JavaConfig. + * + * @author Alex Shvid + * @author Matthew T. Adams + */ +@Configuration +public abstract class AbstractCassandraConfiguration { + + /** + * The name of the keyspace to connect to. If {@literal null} or empty, then the system keyspace will be used. + */ + protected abstract String getKeyspaceName(); + + /** + * The {@link Cluster} instance to connect to. Must not be null. + */ + @Bean + public abstract Cluster cluster(); + + /** + * Creates a {@link Session} using the {@link Cluster} instance configured in {@link #cluster()}. + * + * @see #cluster() + */ + @Bean + public Session session() { + String keyspaceName = getKeyspaceName(); + return StringUtils.hasText(keyspaceName) ? cluster().connect(keyspaceName) : cluster().connect(); + } + + /** + * A {@link CassandraTemplate} created from the {@link Session} returned by {@link #session()}. + */ + @Bean + public CassandraOperations template() { + return new CassandraTemplate(session()); + } +} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/BeanNames.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/BeanNames.java similarity index 86% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/BeanNames.java rename to spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/BeanNames.java index 762b206fe..07f3537dd 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/BeanNames.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/BeanNames.java @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.config; +package org.springframework.cassandra.config.xml; /** * @author Alex Shvid * @author David Webb + * @author Matthew T. Adams */ public final class BeanNames { @@ -27,5 +28,5 @@ public final class BeanNames { public static final String CASSANDRA_CLUSTER = "cassandra-cluster"; public static final String CASSANDRA_KEYSPACE = "cassandra-keyspace"; public static final String CASSANDRA_SESSION = "cassandra-session"; - + public static final String CASSANDRA_TEMPLATE = "cassandra-template"; } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraClusterParser.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraClusterParser.java similarity index 63% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraClusterParser.java rename to spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraClusterParser.java index 1718a283f..e454049c0 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraClusterParser.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraClusterParser.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.config; +package org.springframework.cassandra.config.xml; import java.util.List; @@ -23,8 +23,10 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.data.cassandra.core.CassandraClusterFactoryBean; -import org.springframework.data.config.ParsingUtils; +import org.springframework.cassandra.config.CassandraClusterFactoryBean; +import org.springframework.cassandra.config.CompressionType; +import org.springframework.cassandra.config.PoolingOptionsConfig; +import org.springframework.cassandra.config.SocketOptionsConfig; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; @@ -33,6 +35,7 @@ import org.w3c.dom.Element; * Parser for <cluster;gt; definitions. * * @author Alex Shvid + * @author Matthew T. Adams */ public class CassandraClusterParser extends AbstractSimpleBeanDefinitionParser { @@ -72,15 +75,14 @@ public class CassandraClusterParser extends AbstractSimpleBeanDefinitionParser { builder.addPropertyValue("compressionType", CompressionType.valueOf(compression)); } - postProcess(builder, element); + parseChildElements(builder, element); } - @Override - protected void postProcess(BeanDefinitionBuilder builder, Element element) { - List subElements = DomUtils.getChildElements(element); + protected void parseChildElements(BeanDefinitionBuilder builder, Element element) { + List elements = DomUtils.getChildElements(element); // parse nested elements - for (Element subElement : subElements) { + for (Element subElement : elements) { String name = subElement.getLocalName(); if ("local-pooling-options".equals(name)) { @@ -95,24 +97,28 @@ public class CassandraClusterParser extends AbstractSimpleBeanDefinitionParser { } private BeanDefinition parsePoolingOptions(Element element) { - BeanDefinitionBuilder defBuilder = BeanDefinitionBuilder.genericBeanDefinition(PoolingOptionsConfig.class); - ParsingUtils.setPropertyValue(defBuilder, element, "min-simultaneous-requests", "minSimultaneousRequests"); - ParsingUtils.setPropertyValue(defBuilder, element, "max-simultaneous-requests", "maxSimultaneousRequests"); - ParsingUtils.setPropertyValue(defBuilder, element, "core-connections", "coreConnections"); - ParsingUtils.setPropertyValue(defBuilder, element, "max-connections", "maxConnections"); - return defBuilder.getBeanDefinition(); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(PoolingOptionsConfig.class); + + ParsingUtils.setPropertyValue(builder, element, "min-simultaneous-requests", "minSimultaneousRequests"); + ParsingUtils.setPropertyValue(builder, element, "max-simultaneous-requests", "maxSimultaneousRequests"); + ParsingUtils.setPropertyValue(builder, element, "core-connections", "coreConnections"); + ParsingUtils.setPropertyValue(builder, element, "max-connections", "maxConnections"); + + return builder.getBeanDefinition(); } private BeanDefinition parseSocketOptions(Element element) { - BeanDefinitionBuilder defBuilder = BeanDefinitionBuilder.genericBeanDefinition(SocketOptionsConfig.class); - ParsingUtils.setPropertyValue(defBuilder, element, "connect-timeout-mls", "connectTimeoutMls"); - ParsingUtils.setPropertyValue(defBuilder, element, "keep-alive", "keepAlive"); - ParsingUtils.setPropertyValue(defBuilder, element, "reuse-address", "reuseAddress"); - ParsingUtils.setPropertyValue(defBuilder, element, "so-linger", "soLinger"); - ParsingUtils.setPropertyValue(defBuilder, element, "tcp-no-delay", "tcpNoDelay"); - ParsingUtils.setPropertyValue(defBuilder, element, "receive-buffer-size", "receiveBufferSize"); - ParsingUtils.setPropertyValue(defBuilder, element, "send-buffer-size", "sendBufferSize"); - return defBuilder.getBeanDefinition(); + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(SocketOptionsConfig.class); + + ParsingUtils.setPropertyValue(builder, element, "connect-timeout-mls", "connectTimeoutMls"); + ParsingUtils.setPropertyValue(builder, element, "keep-alive", "keepAlive"); + ParsingUtils.setPropertyValue(builder, element, "reuse-address", "reuseAddress"); + ParsingUtils.setPropertyValue(builder, element, "so-linger", "soLinger"); + ParsingUtils.setPropertyValue(builder, element, "tcp-no-delay", "tcpNoDelay"); + ParsingUtils.setPropertyValue(builder, element, "receive-buffer-size", "receiveBufferSize"); + ParsingUtils.setPropertyValue(builder, element, "send-buffer-size", "sendBufferSize"); + + return builder.getBeanDefinition(); } } diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/CqlProvider.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraNamespaceHandler.java similarity index 54% rename from spring-cassandra/src/main/java/org/springframework/cassandra/core/CqlProvider.java rename to spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraNamespaceHandler.java index 7b0ddd59d..f09b3071c 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/CqlProvider.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraNamespaceHandler.java @@ -13,14 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.cassandra.core; +package org.springframework.cassandra.config.xml; + +import org.springframework.beans.factory.xml.NamespaceHandlerSupport; /** - * @author David Webb + * Namespace handler for <cassandra> elements. * + * @author Alex Shvid + * @author Matthew T. Adams */ -public interface CqlProvider { - String getCql(); +public class CassandraNamespaceHandler extends NamespaceHandlerSupport { + public void init() { + + registerBeanDefinitionParser("cluster", new CassandraClusterParser()); + registerBeanDefinitionParser("session", new CassandraSessionParser()); + registerBeanDefinitionParser("template", new CassandraTemplateParser()); + } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraSessionParser.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraSessionParser.java similarity index 75% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraSessionParser.java rename to spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraSessionParser.java index f99cfb5bf..7b8c05d92 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraSessionParser.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraSessionParser.java @@ -13,28 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.config; +package org.springframework.cassandra.config.xml; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.cassandra.core.SessionFactoryBean; +import org.springframework.cassandra.config.CassandraSessionFactoryBean; import org.springframework.util.StringUtils; import org.w3c.dom.Element; /** - * Parser for <session;gt; definitions. + * Parser for <session> definitions. * * @author David Webb + * @author Matthew T. Adams */ public class CassandraSessionParser extends AbstractSimpleBeanDefinitionParser { @Override protected Class getBeanClass(Element element) { - return SessionFactoryBean.class; + return CassandraSessionFactoryBean.class; } /* @@ -52,18 +53,16 @@ public class CassandraSessionParser extends AbstractSimpleBeanDefinitionParser { @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - String keyspaceRef = element.getAttribute("cassandra-keyspace-ref"); - if (!StringUtils.hasText(keyspaceRef)) { - keyspaceRef = BeanNames.CASSANDRA_KEYSPACE; + String keyspaceName = element.getAttribute("keyspace-name"); + if (!StringUtils.hasText(keyspaceName)) { + keyspaceName = null; } - builder.addPropertyReference("keyspace", keyspaceRef); + builder.addPropertyValue("keyspaceName", keyspaceName); - postProcess(builder, element); + String clusterRef = element.getAttribute("cluster-ref"); + if (!StringUtils.hasText(clusterRef)) { + clusterRef = BeanNames.CASSANDRA_CLUSTER; + } + builder.addPropertyReference("cluster", clusterRef); } - - @Override - protected void postProcess(BeanDefinitionBuilder builder, Element element) { - - } - } diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraTemplateParser.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraTemplateParser.java new file mode 100644 index 000000000..c796ec9b2 --- /dev/null +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/CassandraTemplateParser.java @@ -0,0 +1,58 @@ +/* + * Copyright 2011-2012 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.cassandra.config.xml; + +import org.springframework.beans.factory.BeanDefinitionStoreException; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.cassandra.config.CassandraTemplateFactoryBean; +import org.springframework.util.StringUtils; +import org.w3c.dom.Element; + +/** + * Parser for <template> definitions. + * + * @author David Webb + * @author Matthew T. Adams + */ + +public class CassandraTemplateParser extends AbstractSimpleBeanDefinitionParser { + + @Override + protected Class getBeanClass(Element element) { + return CassandraTemplateFactoryBean.class; + } + + @Override + protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) + throws BeanDefinitionStoreException { + + String id = super.resolveId(element, definition, parserContext); + return StringUtils.hasText(id) ? id : BeanNames.CASSANDRA_TEMPLATE; + } + + @Override + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + + String sessionRef = element.getAttribute("session-ref"); + if (!StringUtils.hasText(sessionRef)) { + sessionRef = BeanNames.CASSANDRA_SESSION; + } + builder.addPropertyReference("session", sessionRef); + } +} diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/ParsingUtils.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/ParsingUtils.java new file mode 100644 index 000000000..826c26e3c --- /dev/null +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/ParsingUtils.java @@ -0,0 +1,33 @@ +package org.springframework.cassandra.config.xml; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; +import org.w3c.dom.Element; + +public class ParsingUtils { + + /** + * Configures a property value for the given property name reading the attribute of the given name from the given + * {@link Element} if the attribute is configured. + * + * @param builder must not be {@literal null}. + * @param element must not be {@literal null}. + * @param attrName must not be {@literal null} or empty. + * @param propertyName must not be {@literal null} or empty. + */ + public static void setPropertyValue(BeanDefinitionBuilder builder, Element element, String attrName, + String propertyName) { + + Assert.notNull(builder, "BeanDefinitionBuilder must not be null!"); + Assert.notNull(element, "Element must not be null!"); + Assert.hasText(attrName, "Attribute name must not be null!"); + Assert.hasText(propertyName, "Property name must not be null!"); + + String attr = element.getAttribute(attrName); + + if (StringUtils.hasText(attr)) { + builder.addPropertyValue(propertyName, attr); + } + } +} diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraOperations.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraOperations.java index 02d8d9ec6..31bee51a9 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraOperations.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraOperations.java @@ -66,19 +66,6 @@ public interface CassandraOperations { */ T query(final String cql, ResultSetExtractor rse) throws DataAccessException; - /** - * Executes the provided CQL Query, and extracts the results with the ResultSetExtractor. - * - * @param cql The Query - * @param rse The implementation for extracting the ResultSet - * @param optionsByName Query Options Map - * - * @return - * @throws DataAccessException - */ - T query(final String cql, ResultSetExtractor rse, final Map optionsByName) - throws DataAccessException; - /** * Executes the provided CQL Query, and extracts the results with the ResultSetExtractor. * @@ -101,18 +88,6 @@ public interface CassandraOperations { */ T queryAsynchronously(final String cql, ResultSetFutureExtractor rse) throws DataAccessException; - /** - * Executes the provided CQL Query asynchronously, and extracts the results with the ResultSetFutureExtractor - * - * @param cql The Query - * @param rse The implementation for extracting the future results - * @param optionsByName Query Options Map - * @return - * @throws DataAccessException - */ - T queryAsynchronously(final String cql, ResultSetFutureExtractor rse, final Map optionsByName) - throws DataAccessException; - /** * Executes the provided CQL Query asynchronously, and extracts the results with the ResultSetFutureExtractor * @@ -134,17 +109,6 @@ public interface CassandraOperations { */ void query(final String cql, RowCallbackHandler rch) throws DataAccessException; - /** - * Executes the provided CQL Query, and then processes the results with the RowCallbackHandler. - * - * @param cql The Query - * @param rch The implementation for processing the rows returned. - * @param options Query Options Map - * @throws DataAccessException - */ - void query(final String cql, RowCallbackHandler rch, final Map optionsByName) - throws DataAccessException; - /** * Executes the provided CQL Query, and then processes the results with the RowCallbackHandler. * @@ -176,18 +140,6 @@ public interface CassandraOperations { */ List query(final String cql, RowMapper rowMapper) throws DataAccessException; - /** - * Executes the provided CQL Query, and maps all Rows returned with the supplied RowMapper. - * - * @param cql The Query - * @param rowMapper The implementation for mapping all rows - * @param optionsByName Query Options Map - * @return List of processed by the RowMapper - * @throws DataAccessException - */ - List query(final String cql, RowMapper rowMapper, final Map optionsByName) - throws DataAccessException; - /** * Executes the provided CQL Query, and maps all Rows returned with the supplied RowMapper. * @@ -363,9 +315,6 @@ public interface CassandraOperations { */ T query(final String cql, PreparedStatementBinder psb, ResultSetExtractor rse) throws DataAccessException; - T query(final String cql, PreparedStatementBinder psb, ResultSetExtractor rse, - final Map optionsByName) throws DataAccessException; - T query(final String cql, PreparedStatementBinder psb, ResultSetExtractor rse, final QueryOptions options) throws DataAccessException; @@ -381,20 +330,6 @@ public interface CassandraOperations { */ void query(final String cql, PreparedStatementBinder psb, RowCallbackHandler rch) throws DataAccessException; - /** - * Converts the CQL provided into a {@link SimplePreparedStatementCreator}. Then, the PreparedStatementBinder will - * bind its values to the bind variables in the provided CQL String. The results of the PreparedStatement are - * processed with the RowCallbackHandler implementation provided and nothing is returned. - * - * @param cql The Query to Prepare - * @param psb The Binding implementation - * @param rch The RowCallbackHandler for processing the ResultSet - * @param optionsByName The Query Options Map - * @throws DataAccessException - */ - void query(final String cql, PreparedStatementBinder psb, RowCallbackHandler rch, - final Map optionsByName) throws DataAccessException; - /** * Converts the CQL provided into a {@link SimplePreparedStatementCreator}. Then, the PreparedStatementBinder will * bind its values to the bind variables in the provided CQL String. The results of the PreparedStatement are @@ -423,22 +358,6 @@ public interface CassandraOperations { */ List query(final String cql, PreparedStatementBinder psb, RowMapper rowMapper) throws DataAccessException; - /** - * Converts the CQL provided into a {@link SimplePreparedStatementCreator}. Then, the PreparedStatementBinder will - * bind its values to the bind variables in the provided CQL String. The results of the PreparedStatement are - * processed with the RowMapper implementation provided and a List is returned with elements of Type for each Row - * returned. - * - * @param cql The Query to Prepare - * @param psb The Binding implementation - * @param rowMapper The implementation for Mapping a Row to Type - * @param optionsByName The Query Options Map - * @return List of for each Row returned from the Query. - * @throws DataAccessException - */ - List query(final String cql, PreparedStatementBinder psb, RowMapper rowMapper, - final Map optionsByName) throws DataAccessException; - /** * Converts the CQL provided into a {@link SimplePreparedStatementCreator}. Then, the PreparedStatementBinder will * bind its values to the bind variables in the provided CQL String. The results of the PreparedStatement are @@ -467,20 +386,6 @@ public interface CassandraOperations { */ T query(PreparedStatementCreator psc, ResultSetExtractor rse) throws DataAccessException; - /** - * Uses the provided PreparedStatementCreator to prepare a new Session call. This can only be used for CQL - * Statements that do not have data binding. The results of the PreparedStatement are processed with - * ResultSetExtractor implementation provided by the Application Code. - * - * @param psc The implementation to create the PreparedStatement - * @param rse Implementation for extracting from the ResultSet - * @param optionsByName The Query Options Map - * @return Type which is the output of the ResultSetExtractor - * @throws DataAccessException - */ - T query(PreparedStatementCreator psc, ResultSetExtractor rse, final Map optionsByName) - throws DataAccessException; - /** * Uses the provided PreparedStatementCreator to prepare a new Session call. This can only be used for CQL * Statements that do not have data binding. The results of the PreparedStatement are processed with @@ -506,19 +411,6 @@ public interface CassandraOperations { */ void query(PreparedStatementCreator psc, RowCallbackHandler rch) throws DataAccessException; - /** - * Uses the provided PreparedStatementCreator to prepare a new Session call. This can only be used for CQL - * Statements that do not have data binding. The results of the PreparedStatement are processed with - * RowCallbackHandler and nothing is returned. - * - * @param psc The implementation to create the PreparedStatement - * @param rch The implementation to process Results - * @param optionsByName The Query Options Map - * @throws DataAccessException - */ - void query(PreparedStatementCreator psc, RowCallbackHandler rch, final Map optionsByName) - throws DataAccessException; - /** * Uses the provided PreparedStatementCreator to prepare a new Session call. This can only be used for CQL * Statements that do not have data binding. The results of the PreparedStatement are processed with @@ -544,20 +436,6 @@ public interface CassandraOperations { */ List query(PreparedStatementCreator psc, RowMapper rowMapper) throws DataAccessException; - /** - * Uses the provided PreparedStatementCreator to prepare a new Session call. This can only be used for CQL - * Statements that do not have data binding. The results of the PreparedStatement are processed with RowMapper - * implementation provided and a List is returned with elements of Type for each Row returned. - * - * @param psc The implementation to create the PreparedStatement - * @param rowMapper The implementation for mapping each Row returned. - * @param optionsByName The Query Options Map - * @return List of Type mapped from each Row in the Results - * @throws DataAccessException - */ - List query(PreparedStatementCreator psc, RowMapper rowMapper, final Map optionsByName) - throws DataAccessException; - /** * Uses the provided PreparedStatementCreator to prepare a new Session call. This can only be used for CQL * Statements that do not have data binding. The results of the PreparedStatement are processed with RowMapper @@ -572,21 +450,6 @@ public interface CassandraOperations { List query(PreparedStatementCreator psc, RowMapper rowMapper, final QueryOptions options) throws DataAccessException; - /** - * Uses the provided PreparedStatementCreator to prepare a new Session call. Binds the values from the - * PreparedStatementBinder to the available bind variables. The results of the PreparedStatement are processed with - * ResultSetExtractor implementation provided by the Application Code. - * - * @param psc The implementation to create the PreparedStatement - * @param psb The implementation to bind variables to values - * @param rse Implementation for extracting from the ResultSet - * @param optionsByName The Query Options Map - * @return Type which is the output of the ResultSetExtractor - * @throws DataAccessException - */ - T query(PreparedStatementCreator psc, final PreparedStatementBinder psb, final ResultSetExtractor rse, - final Map optionsByName) throws DataAccessException; - /** * Uses the provided PreparedStatementCreator to prepare a new Session call. Binds the values from the * PreparedStatementBinder to the available bind variables. The results of the PreparedStatement are processed with @@ -616,21 +479,6 @@ public interface CassandraOperations { T query(PreparedStatementCreator psc, final PreparedStatementBinder psb, final ResultSetExtractor rse) throws DataAccessException; - /** - * Uses the provided PreparedStatementCreator to prepare a new Session call. Binds the values from the - * PreparedStatementBinder to the available bind variables. The results of the PreparedStatement are processed with - * RowCallbackHandler and nothing is returned. - * - * @param psc The implementation to create the PreparedStatement - * @param psb The implementation to bind variables to values - * @param rch The implementation to process Results - * @param optionsByName The Query Options Map - * @return Type which is the output of the ResultSetExtractor - * @throws DataAccessException - */ - void query(PreparedStatementCreator psc, final PreparedStatementBinder psb, final RowCallbackHandler rch, - final Map optionsByName) throws DataAccessException; - /** * Uses the provided PreparedStatementCreator to prepare a new Session call. Binds the values from the * PreparedStatementBinder to the available bind variables. The results of the PreparedStatement are processed with @@ -660,21 +508,6 @@ public interface CassandraOperations { void query(PreparedStatementCreator psc, final PreparedStatementBinder psb, final RowCallbackHandler rch) throws DataAccessException; - /** - * Uses the provided PreparedStatementCreator to prepare a new Session call. Binds the values from the - * PreparedStatementBinder to the available bind variables. The results of the PreparedStatement are processed with - * RowMapper implementation provided and a List is returned with elements of Type for each Row returned. - * - * @param psc The implementation to create the PreparedStatement - * @param psb The implementation to bind variables to values - * @param rowMapper The implementation for mapping each Row returned. - * @param optionsByName The Query Options Map - * @return Type which is the output of the ResultSetExtractor - * @throws DataAccessException - */ - List query(PreparedStatementCreator psc, final PreparedStatementBinder psb, final RowMapper rowMapper, - final Map optionsByName) throws DataAccessException; - /** * Uses the provided PreparedStatementCreator to prepare a new Session call. Binds the values from the * PreparedStatementBinder to the available bind variables. The results of the PreparedStatement are processed with @@ -729,21 +562,6 @@ public interface CassandraOperations { */ Session getSession(); - /** - * This is an operation designed for high performance writes. The cql is used to create a PreparedStatement once, then - * all row values are bound to the single PreparedStatement and executed against the Session. - * - *

- * This is used internally by the other ingest() methods, but can be used if you want to write your own RowIterator. - * The Object[] length returned by the next() implementation must match the number of bind variables in the CQL. - *

- * - * @param cql The CQL - * @param rowIterator Implementation to provide the Object[] to be bound to the CQL. - * @param optionsByName The Query Options Map - */ - void ingest(String cql, RowIterator rowIterator, Map optionsByName); - /** * This is an operation designed for high performance writes. The cql is used to create a PreparedStatement once, then * all row values are bound to the single PreparedStatement and executed against the Session. @@ -773,20 +591,6 @@ public interface CassandraOperations { */ void ingest(String cql, RowIterator rowIterator); - /** - * This is an operation designed for high performance writes. The cql is used to create a PreparedStatement once, then - * all row values are bound to the single PreparedStatement and executed against the Session. - * - *

- * The List length must match the number of bind variables in the CQL. - *

- * - * @param cql The CQL - * @param rows List of List with data to bind to the CQL. - * @param optionsByName The Query Options Map - */ - void ingest(String cql, List> rows, Map optionsByName); - /** * This is an operation designed for high performance writes. The cql is used to create a PreparedStatement once, then * all row values are bound to the single PreparedStatement and executed against the Session. @@ -814,20 +618,6 @@ public interface CassandraOperations { */ void ingest(String cql, List> rows); - /** - * This is an operation designed for high performance writes. The cql is used to create a PreparedStatement once, then - * all row values are bound to the single PreparedStatement and executed against the Session. - * - *

- * The Object[] length of the nested array must match the number of bind variables in the CQL. - *

- * - * @param cql The CQL - * @param rows Object array of Object array of values to bind to the CQL. - * @param optionsByName The Query Options Map - */ - void ingest(String cql, Object[][] rows, Map optionsByName); - /** * This is an operation designed for high performance writes. The cql is used to create a PreparedStatement once, then * all row values are bound to the single PreparedStatement and executed against the Session. diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraTemplate.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraTemplate.java index 026f7ff4f..98fb7203a 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraTemplate.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraTemplate.java @@ -17,8 +17,8 @@ package org.springframework.cassandra.core; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -30,7 +30,6 @@ import org.springframework.util.Assert; import com.datastax.driver.core.BoundStatement; import com.datastax.driver.core.ColumnDefinitions; import com.datastax.driver.core.ColumnDefinitions.Definition; -import com.datastax.driver.core.DataType; import com.datastax.driver.core.Host; import com.datastax.driver.core.Metadata; import com.datastax.driver.core.PreparedStatement; @@ -91,33 +90,23 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public void execute(final String cql) throws DataAccessException { - doExecute(cql, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#queryAsynchronously(java.lang.String, org.springframework.cassandra.core.ResultSetFutureExtractor, java.util.Map) - */ - @Override - public T queryAsynchronously(final String cql, ResultSetFutureExtractor rse, - final Map optionsByName) throws DataAccessException { - return rse.extractData(execute(new SessionCallback() { - @Override - public ResultSetFuture doInSession(Session s) throws DataAccessException { - Statement statement = new SimpleStatement(cql); - addQueryOptions(statement, optionsByName); - return s.executeAsync(statement); - } - })); + doExecute(cql, null); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#queryAsynchronously(java.lang.String, org.springframework.cassandra.core.ResultSetFutureExtractor, org.springframework.cassandra.core.QueryOptions) */ @Override - public T queryAsynchronously(String cql, ResultSetFutureExtractor rse, QueryOptions options) + public T queryAsynchronously(final String cql, ResultSetFutureExtractor rse, final QueryOptions options) throws DataAccessException { - Assert.notNull(options); - return queryAsynchronously(cql, rse, options.toMap()); + return rse.extractData(execute(new SessionCallback() { + @Override + public ResultSetFuture doInSession(Session s) throws DataAccessException { + Statement statement = new SimpleStatement(cql); + addQueryOptions(statement, options); + return s.executeAsync(statement); + } + })); } /* (non-Javadoc) @@ -125,18 +114,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public T queryAsynchronously(final String cql, ResultSetFutureExtractor rse) throws DataAccessException { - return queryAsynchronously(cql, rse, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(java.lang.String, org.springframework.cassandra.core.ResultSetExtractor) - */ - public T query(String cql, ResultSetExtractor rse, Map optionsByName) - throws DataAccessException { - Assert.notNull(cql); - Assert.notNull(optionsByName); - ResultSet rs = doExecute(cql, optionsByName); - return rse.extractData(rs); + return queryAsynchronously(cql, rse, null); } /* (non-Javadoc) @@ -144,7 +122,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public T query(String cql, ResultSetExtractor rse) throws DataAccessException { - return query(cql, rse, Collections. emptyMap()); + return query(cql, rse, null); } /* (non-Javadoc) @@ -152,16 +130,9 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public T query(String cql, ResultSetExtractor rse, QueryOptions options) throws DataAccessException { - Assert.notNull(options); - return query(cql, rse, options.toMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(java.lang.String, org.springframework.cassandra.core.RowCallbackHandler, java.util.Map) - */ - @Override - public void query(String cql, RowCallbackHandler rch, Map optionsByName) throws DataAccessException { - process(doExecute(cql, optionsByName), rch); + Assert.notNull(cql); + ResultSet rs = doExecute(cql, options); + return rse.extractData(rs); } /* (non-Javadoc) @@ -169,25 +140,14 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public void query(String cql, RowCallbackHandler rch, QueryOptions options) throws DataAccessException { - Assert.notNull(options); - query(cql, rch, options.toMap()); + process(doExecute(cql, options), rch); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#query(java.lang.String, org.springframework.cassandra.core.RowCallbackHandler) */ public void query(String cql, RowCallbackHandler rch) throws DataAccessException { - query(cql, rch, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(java.lang.String, org.springframework.cassandra.core.RowMapper, java.util.Map) - */ - @Override - public List query(String cql, RowMapper rowMapper, Map optionsByName) - throws DataAccessException { - Assert.notNull(optionsByName); - return process(doExecute(cql, optionsByName), rowMapper); + query(cql, rch, null); } /* (non-Javadoc) @@ -195,50 +155,49 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public List query(String cql, RowMapper rowMapper, QueryOptions options) throws DataAccessException { - Assert.notNull(options); - return query(cql, rowMapper, options.toMap()); + return process(doExecute(cql, options), rowMapper); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#query(java.lang.String, org.springframework.cassandra.core.RowMapper) */ public List query(String cql, RowMapper rowMapper) throws DataAccessException { - return query(cql, rowMapper, Collections. emptyMap()); + return query(cql, rowMapper, null); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#queryForList(java.lang.String) */ public List> queryForListOfMap(String cql) throws DataAccessException { - return processListOfMap(doExecute(cql, Collections. emptyMap())); + return processListOfMap(doExecute(cql, null)); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#queryForList(java.lang.String, java.lang.Class) */ public List queryForList(String cql, Class elementType) throws DataAccessException { - return processList(doExecute(cql, Collections. emptyMap()), elementType); + return processList(doExecute(cql, null), elementType); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#queryForMap(java.lang.String) */ public Map queryForMap(String cql) throws DataAccessException { - return processMap(doExecute(cql, Collections. emptyMap())); + return processMap(doExecute(cql, null)); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#queryForObject(java.lang.String, java.lang.Class) */ public T queryForObject(String cql, Class requiredType) throws DataAccessException { - return processOne(doExecute(cql, Collections. emptyMap()), requiredType); + return processOne(doExecute(cql, null), requiredType); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#queryForObject(java.lang.String, org.springframework.cassandra.core.RowMapper) */ public T queryForObject(String cql, RowMapper rowMapper) throws DataAccessException { - return processOne(doExecute(cql, Collections. emptyMap()), rowMapper); + return processOne(doExecute(cql, null), rowMapper); } /** @@ -266,7 +225,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe * @param callback * @return */ - protected ResultSet doExecute(final String cql, final Map optionsByName) { + protected ResultSet doExecute(final String cql, final QueryOptions options) { logger.info(cql); @@ -275,7 +234,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public ResultSet doInSession(Session s) throws DataAccessException { SimpleStatement statement = new SimpleStatement(cql); - addQueryOptions(statement, optionsByName); + addQueryOptions(statement, options); return s.execute(statement); } }); @@ -287,13 +246,13 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe * @param callback * @return */ - protected ResultSet doExecute(final BoundStatement bs, final Map optionsByName) { + protected ResultSet doExecute(final BoundStatement bs, final QueryOptions options) { return doExecute(new SessionCallback() { @Override public ResultSet doInSession(Session s) throws DataAccessException { - addQueryOptions(bs, optionsByName); + addQueryOptions(bs, options); return s.execute(bs); } }); @@ -325,7 +284,6 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe for (Definition def : cols.asList()) { String name = def.getName(); - DataType dataType = def.getType(); map.put(name, def.getType().deserialize(row.getBytesUnsafe(name))); } @@ -527,24 +485,13 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe return execute(new SimplePreparedStatementCreator(cql), action); } - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.ResultSetExtractor, java.util.Map) - */ - @Override - public T query(PreparedStatementCreator psc, ResultSetExtractor rse, Map optionsByName) - throws DataAccessException { - Assert.notNull(optionsByName); - return query(psc, null, rse, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.ResultSetExtractor, org.springframework.cassandra.core.QueryOptions) */ @Override public T query(PreparedStatementCreator psc, ResultSetExtractor rse, QueryOptions options) throws DataAccessException { - Assert.notNull(options); - return query(psc, rse, options.toMap()); + return query(psc, null, rse, options); } /* (non-Javadoc) @@ -552,17 +499,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public T query(PreparedStatementCreator psc, ResultSetExtractor rse) throws DataAccessException { - return query(psc, rse, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.RowCallbackHandler, java.util.Map) - */ - @Override - public void query(PreparedStatementCreator psc, RowCallbackHandler rch, Map optionsByName) - throws DataAccessException { - Assert.notNull(optionsByName); - query(psc, null, rch, optionsByName); + return query(psc, rse, null); } /* (non-Javadoc) @@ -571,8 +508,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public void query(PreparedStatementCreator psc, RowCallbackHandler rch, QueryOptions options) throws DataAccessException { - Assert.notNull(options); - query(psc, rch, options.toMap()); + query(psc, null, rch, options); } /* (non-Javadoc) @@ -580,17 +516,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public void query(PreparedStatementCreator psc, RowCallbackHandler rch) throws DataAccessException { - query(psc, rch, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.RowMapper, java.util.Map) - */ - @Override - public List query(PreparedStatementCreator psc, RowMapper rowMapper, Map optionsByName) - throws DataAccessException { - Assert.notNull(optionsByName); - return query(psc, null, rowMapper, optionsByName); + query(psc, rch, null); } /* (non-Javadoc) @@ -599,8 +525,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public List query(PreparedStatementCreator psc, RowMapper rowMapper, QueryOptions options) throws DataAccessException { - Assert.notNull(options); - return query(psc, rowMapper, options.toMap()); + return query(psc, null, rowMapper, options); } /* (non-Javadoc) @@ -608,41 +533,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public List query(PreparedStatementCreator psc, RowMapper rowMapper) throws DataAccessException { - return query(psc, rowMapper, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.PreparedStatementSetter, org.springframework.cassandra.core.ResultSetExtractor) - */ - public T query(PreparedStatementCreator psc, final PreparedStatementBinder psb, final ResultSetExtractor rse, - final Map optionsByName) throws DataAccessException { - - Assert.notNull(rse, "ResultSetExtractor must not be null"); - logger.debug("Executing prepared CQL query"); - - return execute(psc, new PreparedStatementCallback() { - public T doInPreparedStatement(PreparedStatement ps) throws DriverException { - ResultSet rs = null; - BoundStatement bs = null; - if (psb != null) { - bs = psb.bindValues(ps); - } else { - bs = ps.bind(); - } - rs = doExecute(bs, optionsByName); - return rse.extractData(rs); - } - }); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(java.lang.String, org.springframework.cassandra.core.PreparedStatementBinder, org.springframework.cassandra.core.ResultSetExtractor, java.util.Map) - */ - @Override - public T query(String cql, PreparedStatementBinder psb, ResultSetExtractor rse, - Map optionsByName) throws DataAccessException { - Assert.notNull(optionsByName); - return query(new SimplePreparedStatementCreator(cql), psb, rse, optionsByName); + return query(psc, rowMapper, null); } /* (non-Javadoc) @@ -651,8 +542,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public T query(String cql, PreparedStatementBinder psb, ResultSetExtractor rse, QueryOptions options) throws DataAccessException { - Assert.notNull(options); - return query(cql, psb, rse, options.toMap()); + return query(new SimplePreparedStatementCreator(cql), psb, rse, options); } /* (non-Javadoc) @@ -660,17 +550,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public T query(String cql, PreparedStatementBinder psb, ResultSetExtractor rse) throws DataAccessException { - return query(cql, psb, rse, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(java.lang.String, org.springframework.cassandra.core.PreparedStatementBinder, org.springframework.cassandra.core.RowCallbackHandler, java.util.Map) - */ - @Override - public void query(String cql, PreparedStatementBinder psb, RowCallbackHandler rch, Map optionsByName) - throws DataAccessException { - Assert.notNull(optionsByName); - query(new SimplePreparedStatementCreator(cql), psb, rch, optionsByName); + return query(cql, psb, rse, null); } /* (non-Javadoc) @@ -679,8 +559,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public void query(String cql, PreparedStatementBinder psb, RowCallbackHandler rch, QueryOptions options) throws DataAccessException { - Assert.notNull(options); - query(cql, psb, rch, options.toMap()); + query(new SimplePreparedStatementCreator(cql), psb, rch, options); } /* (non-Javadoc) @@ -688,17 +567,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public void query(String cql, PreparedStatementBinder psb, RowCallbackHandler rch) throws DataAccessException { - query(cql, psb, rch, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(java.lang.String, org.springframework.cassandra.core.PreparedStatementBinder, org.springframework.cassandra.core.RowMapper, java.util.Map) - */ - @Override - public List query(String cql, PreparedStatementBinder psb, RowMapper rowMapper, - Map optionsByName) throws DataAccessException { - Assert.notNull(optionsByName); - return query(new SimplePreparedStatementCreator(cql), psb, rowMapper, optionsByName); + query(cql, psb, rch, null); } /* (non-Javadoc) @@ -707,8 +576,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public List query(String cql, PreparedStatementBinder psb, RowMapper rowMapper, QueryOptions options) throws DataAccessException { - Assert.notNull(options); - return query(cql, psb, rowMapper, options.toMap()); + return query(new SimplePreparedStatementCreator(cql), psb, rowMapper, options); } /* (non-Javadoc) @@ -716,72 +584,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public List query(String cql, PreparedStatementBinder psb, RowMapper rowMapper) throws DataAccessException { - return query(cql, psb, rowMapper, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.PreparedStatementBinder, org.springframework.cassandra.core.RowCallbackHandler) - */ - @Override - public void query(PreparedStatementCreator psc, final PreparedStatementBinder psb, final RowCallbackHandler rch, - final Map optionsByName) throws DataAccessException { - Assert.notNull(rch, "RowCallbackHandler must not be null"); - logger.debug("Executing prepared CQL query"); - - execute(psc, new PreparedStatementCallback() { - public Object doInPreparedStatement(PreparedStatement ps) throws DriverException { - ResultSet rs = null; - BoundStatement bs = null; - if (psb != null) { - bs = psb.bindValues(ps); - } else { - bs = ps.bind(); - } - rs = doExecute(bs, optionsByName); - process(rs, rch); - return null; - } - }); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.PreparedStatementBinder, org.springframework.cassandra.core.RowMapper) - */ - @Override - public List query(PreparedStatementCreator psc, final PreparedStatementBinder psb, - final RowMapper rowMapper, final Map optionsByName) throws DataAccessException { - Assert.notNull(rowMapper, "RowMapper must not be null"); - logger.debug("Executing prepared CQL query"); - - return execute(psc, new PreparedStatementCallback>() { - public List doInPreparedStatement(PreparedStatement ps) throws DriverException { - ResultSet rs = null; - BoundStatement bs = null; - if (psb != null) { - bs = psb.bindValues(ps); - } else { - bs = ps.bind(); - } - rs = doExecute(bs, optionsByName); - - return process(rs, rowMapper); - } - }); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#execute(java.lang.String, org.springframework.cassandra.core.RowProvider, int) - */ - @Override - public void ingest(String cql, RowIterator rowIterator, Map optionsByName) { - - PreparedStatement preparedStatement = getSession().prepare(cql); - addPreparedStatementOptions(preparedStatement, optionsByName); - - while (rowIterator.hasNext()) { - getSession().execute(preparedStatement.bind(rowIterator.next())); - } - + return query(cql, psb, rowMapper, null); } /* (non-Javadoc) @@ -789,8 +592,13 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public void ingest(String cql, RowIterator rowIterator, QueryOptions options) { - Assert.notNull(options); - ingest(cql, rowIterator, options.toMap()); + + PreparedStatement preparedStatement = getSession().prepare(cql); + addPreparedStatementOptions(preparedStatement, options); + + while (rowIterator.hasNext()) { + getSession().execute(preparedStatement.bind(rowIterator.next())); + } } /* (non-Javadoc) @@ -798,36 +606,34 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public void ingest(String cql, RowIterator rowIterator) { - ingest(cql, rowIterator, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#execute(java.lang.String, java.util.List) - */ - @Override - public void ingest(String cql, List> rows, Map optionsByName) { - - Assert.notNull(optionsByName); - Assert.notNull(rows); - Assert.notEmpty(rows); - - Object[][] values = new Object[rows.size()][]; - int i = 0; - for (List row : rows) { - values[i++] = row.toArray(); - } - - ingest(cql, values, optionsByName); - + ingest(cql, rowIterator, null); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#ingest(java.lang.String, java.util.List, org.springframework.cassandra.core.QueryOptions) */ @Override - public void ingest(String cql, List> rows, QueryOptions options) { - Assert.notNull(options); - ingest(cql, rows, options.toMap()); + public void ingest(String cql, final List> rows, QueryOptions options) { + + Assert.notNull(rows); + Assert.notEmpty(rows); + + ingest(cql, new RowIterator() { + + Iterator> i = rows.iterator(); + + @Override + public Object[] next() { + return i.next().toArray(); + } + + @Override + public boolean hasNext() { + return i.hasNext(); + } + + }, options); + } /* (non-Javadoc) @@ -835,16 +641,14 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public void ingest(String cql, List> rows) { - ingest(cql, rows, Collections. emptyMap()); + ingest(cql, rows, null); } /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#execute(java.lang.String, java.lang.Object[][]) + * @see org.springframework.cassandra.core.CassandraOperations#ingest(java.lang.String, java.lang.Object[][], org.springframework.cassandra.core.QueryOptions) */ @Override - public void ingest(String cql, final Object[][] rows, final Map optionsByName) { - - Assert.notNull(optionsByName); + public void ingest(String cql, final Object[][] rows, QueryOptions options) { ingest(cql, new RowIterator() { @@ -860,16 +664,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe return index < rows.length; } - }, optionsByName); - } - - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CassandraOperations#ingest(java.lang.String, java.lang.Object[][], org.springframework.cassandra.core.QueryOptions) - */ - @Override - public void ingest(String cql, final Object[][] rows, QueryOptions options) { - Assert.notNull(options); - ingest(cql, rows, options.toMap()); + }, options); } /* (non-Javadoc) @@ -877,7 +672,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe */ @Override public void ingest(String cql, final Object[][] rows) { - ingest(cql, rows, Collections. emptyMap()); + ingest(cql, rows, null); } /* (non-Javadoc) @@ -886,7 +681,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public void truncate(String tableName) throws DataAccessException { Truncate truncate = QueryBuilder.truncate(tableName); - doExecute(truncate.getQueryString(), Collections. emptyMap()); + doExecute(truncate.getQueryString(), null); } /** @@ -895,22 +690,20 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe * @param q * @param optionsByName */ - public static void addQueryOptions(Query q, Map optionsByName) { + public static void addQueryOptions(Query q, QueryOptions options) { - if (optionsByName == null) { + if (options == null) { return; } /* * Add Query Options */ - if (optionsByName.get(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL) != null) { - q.setConsistencyLevel(ConsistencyLevelResolver.resolve((ConsistencyLevel) optionsByName - .get(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL))); + if (options.getConsistencyLevel() != null) { + q.setConsistencyLevel(ConsistencyLevelResolver.resolve(options.getConsistencyLevel())); } - if (optionsByName.get(QueryOptions.QueryOptionMapKeys.RETRY_POLICY) != null) { - q.setRetryPolicy(RetryPolicyResolver.resolve((RetryPolicy) optionsByName - .get(QueryOptions.QueryOptionMapKeys.RETRY_POLICY))); + if (options.getRetryPolicy() != null) { + q.setRetryPolicy(RetryPolicyResolver.resolve(options.getRetryPolicy())); } } @@ -921,22 +714,20 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe * @param q * @param optionsByName */ - public static void addPreparedStatementOptions(PreparedStatement s, Map optionsByName) { + public static void addPreparedStatementOptions(PreparedStatement s, QueryOptions options) { - if (optionsByName == null) { + if (options == null) { return; } /* * Add Query Options */ - if (optionsByName.get(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL) != null) { - s.setConsistencyLevel(ConsistencyLevelResolver.resolve((ConsistencyLevel) optionsByName - .get(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL))); + if (options.getConsistencyLevel() != null) { + s.setConsistencyLevel(ConsistencyLevelResolver.resolve(options.getConsistencyLevel())); } - if (optionsByName.get(QueryOptions.QueryOptionMapKeys.RETRY_POLICY) != null) { - s.setRetryPolicy(RetryPolicyResolver.resolve((RetryPolicy) optionsByName - .get(QueryOptions.QueryOptionMapKeys.RETRY_POLICY))); + if (options.getRetryPolicy() != null) { + s.setRetryPolicy(RetryPolicyResolver.resolve(options.getRetryPolicy())); } } @@ -945,10 +736,25 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.PreparedStatementBinder, org.springframework.cassandra.core.ResultSetExtractor, org.springframework.cassandra.core.QueryOptions) */ @Override - public T query(PreparedStatementCreator psc, PreparedStatementBinder psb, ResultSetExtractor rse, - QueryOptions options) throws DataAccessException { - Assert.notNull(options); - return query(psc, psb, rse, options.toMap()); + public T query(PreparedStatementCreator psc, final PreparedStatementBinder psb, final ResultSetExtractor rse, + final QueryOptions options) throws DataAccessException { + + Assert.notNull(rse, "ResultSetExtractor must not be null"); + logger.debug("Executing prepared CQL query"); + + return execute(psc, new PreparedStatementCallback() { + public T doInPreparedStatement(PreparedStatement ps) throws DriverException { + ResultSet rs = null; + BoundStatement bs = null; + if (psb != null) { + bs = psb.bindValues(ps); + } else { + bs = ps.bind(); + } + rs = doExecute(bs, options); + return rse.extractData(rs); + } + }); } /* (non-Javadoc) @@ -957,17 +763,33 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public T query(PreparedStatementCreator psc, PreparedStatementBinder psb, ResultSetExtractor rse) throws DataAccessException { - return query(psc, psb, rse, Collections. emptyMap()); + return query(psc, psb, rse, null); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.PreparedStatementBinder, org.springframework.cassandra.core.RowCallbackHandler, org.springframework.cassandra.core.QueryOptions) */ @Override - public void query(PreparedStatementCreator psc, PreparedStatementBinder psb, RowCallbackHandler rch, - QueryOptions options) throws DataAccessException { - Assert.notNull(options); - query(psc, psb, rch, options.toMap()); + public void query(PreparedStatementCreator psc, final PreparedStatementBinder psb, final RowCallbackHandler rch, + final QueryOptions options) throws DataAccessException { + + Assert.notNull(rch, "RowCallbackHandler must not be null"); + logger.debug("Executing prepared CQL query"); + + execute(psc, new PreparedStatementCallback() { + public Object doInPreparedStatement(PreparedStatement ps) throws DriverException { + ResultSet rs = null; + BoundStatement bs = null; + if (psb != null) { + bs = psb.bindValues(ps); + } else { + bs = ps.bind(); + } + rs = doExecute(bs, options); + process(rs, rch); + return null; + } + }); } /* (non-Javadoc) @@ -976,17 +798,32 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public void query(PreparedStatementCreator psc, PreparedStatementBinder psb, RowCallbackHandler rch) throws DataAccessException { - query(psc, psb, rch, Collections. emptyMap()); + query(psc, psb, rch, null); } /* (non-Javadoc) * @see org.springframework.cassandra.core.CassandraOperations#query(org.springframework.cassandra.core.PreparedStatementCreator, org.springframework.cassandra.core.PreparedStatementBinder, org.springframework.cassandra.core.RowMapper, org.springframework.cassandra.core.QueryOptions) */ @Override - public List query(PreparedStatementCreator psc, PreparedStatementBinder psb, RowMapper rowMapper, - QueryOptions options) throws DataAccessException { - Assert.notNull(options); - return query(psc, psb, rowMapper, options.toMap()); + public List query(PreparedStatementCreator psc, final PreparedStatementBinder psb, + final RowMapper rowMapper, final QueryOptions options) throws DataAccessException { + Assert.notNull(rowMapper, "RowMapper must not be null"); + logger.debug("Executing prepared CQL query"); + + return execute(psc, new PreparedStatementCallback>() { + public List doInPreparedStatement(PreparedStatement ps) throws DriverException { + ResultSet rs = null; + BoundStatement bs = null; + if (psb != null) { + bs = psb.bindValues(ps); + } else { + bs = ps.bind(); + } + rs = doExecute(bs, options); + + return process(rs, rowMapper); + } + }); } /* (non-Javadoc) @@ -995,7 +832,7 @@ public class CassandraTemplate extends CassandraAccessor implements CassandraOpe @Override public List query(PreparedStatementCreator psc, PreparedStatementBinder psb, RowMapper rowMapper) throws DataAccessException { - return query(psc, psb, rowMapper, Collections. emptyMap()); + return query(psc, psb, rowMapper, null); } } \ No newline at end of file diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/PreparedStatementCreatorImpl.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/PreparedStatementCreatorImpl.java index cbf5afd43..44a14f730 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/PreparedStatementCreatorImpl.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/PreparedStatementCreatorImpl.java @@ -26,7 +26,7 @@ import com.datastax.driver.core.exceptions.DriverException; * @author David Webb * */ -public class PreparedStatementCreatorImpl implements PreparedStatementCreator, CqlProvider, PreparedStatementBinder { +public class PreparedStatementCreatorImpl implements PreparedStatementCreator, PreparedStatementBinder { private final String cql; private List values; @@ -54,10 +54,6 @@ public class PreparedStatementCreatorImpl implements PreparedStatementCreator, C } - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CqlProvider#getCql() - */ - @Override public String getCql() { return this.cql; } diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/SessionFactoryBean.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/SessionFactoryBean.java deleted file mode 100644 index f753a322f..000000000 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/SessionFactoryBean.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2011-2013 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.cassandra.core; - -import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.cassandra.core.Keyspace; - -import com.datastax.driver.core.Session; - -/** - * @author David Webb - * - */ -public class SessionFactoryBean implements FactoryBean, InitializingBean { - - private Keyspace keyspace; - - public SessionFactoryBean() { - } - - public SessionFactoryBean(Keyspace keyspace) { - setKeyspace(keyspace); - } - - /* (non-Javadoc) - * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() - */ - @Override - public void afterPropertiesSet() throws Exception { - if (keyspace == null) { - throw new IllegalStateException("Keyspace required."); - } - } - - /** - * @return Returns the keyspace. - */ - public Keyspace getKeyspace() { - return keyspace; - } - - /** - * @param keyspace The keyspace to set. - */ - public void setKeyspace(Keyspace keyspace) { - this.keyspace = keyspace; - } - - /* (non-Javadoc) - * @see org.springframework.beans.factory.FactoryBean#getObject() - */ - @Override - public Session getObject() { - return keyspace.getSession(); - } - - /* (non-Javadoc) - * @see org.springframework.beans.factory.FactoryBean#getObjectType() - */ - @Override - public Class getObjectType() { - return Session.class; - } - - /* (non-Javadoc) - * @see org.springframework.beans.factory.FactoryBean#isSingleton() - */ - @Override - public boolean isSingleton() { - return true; - } - -} diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/SimplePreparedStatementCreator.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/SimplePreparedStatementCreator.java index f2ae91a5c..b3a63e158 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/SimplePreparedStatementCreator.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/SimplePreparedStatementCreator.java @@ -25,7 +25,7 @@ import com.datastax.driver.core.exceptions.DriverException; * @author David Webb * */ -public class SimplePreparedStatementCreator implements PreparedStatementCreator, CqlProvider { +public class SimplePreparedStatementCreator implements PreparedStatementCreator { private final String cql; @@ -39,10 +39,6 @@ public class SimplePreparedStatementCreator implements PreparedStatementCreator, this.cql = cql; } - /* (non-Javadoc) - * @see org.springframework.cassandra.core.CqlProvider#getCql() - */ - @Override public String getCql() { return this.cql; } diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/cql/generator/CreateTableCqlGenerator.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/cql/generator/CreateTableCqlGenerator.java index 655a5f559..c13d456ab 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/cql/generator/CreateTableCqlGenerator.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/cql/generator/CreateTableCqlGenerator.java @@ -65,14 +65,14 @@ public class CreateTableCqlGenerator extends TableCqlGenerator partitionKeys = new ArrayList(); - List clusteredKeys = new ArrayList(); + List clusterKeys = new ArrayList(); for (ColumnSpecification col : spec().getColumns()) { col.toCql(cql).append(", "); if (col.getKeyType() == PARTITIONED) { partitionKeys.add(col); } else if (col.getKeyType() == CLUSTERED) { - clusteredKeys.add(col); + clusterKeys.add(col); } } @@ -91,11 +91,11 @@ public class CreateTableCqlGenerator extends TableCqlGenerator options = spec().getOptions(); diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnChangeSpecification.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnChangeSpecification.java index 2c9eebc8c..6cea473f8 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnChangeSpecification.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnChangeSpecification.java @@ -18,6 +18,11 @@ package org.springframework.cassandra.core.keyspace; import static org.springframework.cassandra.core.cql.CqlStringUtils.checkIdentifier; import static org.springframework.cassandra.core.cql.CqlStringUtils.identifize; +/** + * Base class for column change specifications. + * + * @author Matthew T. Adams + */ public abstract class ColumnChangeSpecification { private String name; diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnSpecification.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnSpecification.java index db4d78c16..9c2d0ba03 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnSpecification.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnSpecification.java @@ -28,12 +28,12 @@ import org.springframework.cassandra.core.Ordering; import com.datastax.driver.core.DataType; /** - * Builder class to help construct CQL statements that involve column manipulation. Not threadsafe. + * Builder class to specify columns. *

* Use {@link #name(String)} and {@link #type(String)} to set the name and type of the column, respectively. To specify - * a PRIMARY KEY column, use {@link #primary()} or {@link #primary(Ordering)}. To specify that the - * PRIMARY KEY column is or is part of the partition key, use {@link #partition()} instead of - * {@link #primary()} or {@link #primary(Ordering)}. + * a clustered PRIMARY KEY column, use {@link #clustered()} or {@link #clustered(Ordering)}. To specify + * that the PRIMARY KEY column is or is part of the partition key, use {@link #partitioned()} instead of + * {@link #clustered()} or {@link #clustered(Ordering)}. * * @author Matthew T. Adams * @author Alex Shvid @@ -77,8 +77,8 @@ public class ColumnSpecification { * * @return this */ - public ColumnSpecification partition() { - return partition(true); + public ColumnSpecification partitioned() { + return partitioned(true); } /** @@ -88,40 +88,40 @@ public class ColumnSpecification { * * @return this */ - public ColumnSpecification partition(boolean partition) { - this.keyType = partition ? PARTITIONED : null; + public ColumnSpecification partitioned(boolean partitioned) { + this.keyType = partitioned ? PARTITIONED : null; this.ordering = null; return this; } /** - * Identifies this column as a primary key column with default ordering. Sets the column's {@link #keyType} to + * Identifies this column as a clustered key column with default ordering. Sets the column's {@link #keyType} to * {@link PrimaryKeyType#CLUSTERED} and its {@link #ordering} to {@link #DEFAULT_ORDERING}. * * @return this */ - public ColumnSpecification primary() { - return primary(DEFAULT_ORDERING); + public ColumnSpecification clustered() { + return clustered(DEFAULT_ORDERING); } /** - * Identifies this column as a primary key column with the given ordering. Sets the column's {@link #keyType} to + * Identifies this column as a clustered key column with the given ordering. Sets the column's {@link #keyType} to * {@link PrimaryKeyType#CLUSTERED} and its {@link #ordering} to the given {@link Ordering}. * * @return this */ - public ColumnSpecification primary(Ordering order) { - return primary(order, true); + public ColumnSpecification clustered(Ordering order) { + return clustered(order, true); } /** - * Toggles the identification of this column as a primary key column. If the given boolean is true, then - * sets the column's {@link #keyType} to {@link PrimaryKeyType#PARTITIONED} and {@link #ordering} to the given + * Toggles the identification of this column as a clustered key column. If the given boolean is true, + * then sets the column's {@link #keyType} to {@link PrimaryKeyType#PARTITIONED} and {@link #ordering} to the given * {@link Ordering} , else sets both {@link #keyType} and {@link #ordering} to null. * * @return this */ - public ColumnSpecification primary(Ordering order, boolean primary) { + public ColumnSpecification clustered(Ordering order, boolean primary) { this.keyType = primary ? CLUSTERED : null; this.ordering = primary ? order : null; return this; diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnTypeChangeSpecification.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnTypeChangeSpecification.java index c978623f2..814cfcd7a 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnTypeChangeSpecification.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/ColumnTypeChangeSpecification.java @@ -19,6 +19,11 @@ import org.springframework.util.Assert; import com.datastax.driver.core.DataType; +/** + * Base class for column changes that include {@link DataType} information. + * + * @author Matthew T. Adams + */ public abstract class ColumnTypeChangeSpecification extends ColumnChangeSpecification { private DataType type; diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/DropColumnSpecification.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/DropColumnSpecification.java index 19adf19b1..62828fd18 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/DropColumnSpecification.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/DropColumnSpecification.java @@ -15,6 +15,11 @@ */ package org.springframework.cassandra.core.keyspace; +/** + * A specification to drop a column. + * + * @author Matthew T. Adams + */ public class DropColumnSpecification extends ColumnChangeSpecification { public DropColumnSpecification(String name) { diff --git a/spring-cassandra/src/main/resources/META-INF/spring.handlers b/spring-cassandra/src/main/resources/META-INF/spring.handlers new file mode 100644 index 000000000..f5bd3781b --- /dev/null +++ b/spring-cassandra/src/main/resources/META-INF/spring.handlers @@ -0,0 +1 @@ +http\://www.springframework.org/schema/cassandra=org.springframework.cassandra.config.xml.CassandraNamespaceHandler diff --git a/spring-cassandra/src/main/resources/META-INF/spring.schemas b/spring-cassandra/src/main/resources/META-INF/spring.schemas new file mode 100644 index 000000000..9a41e8fcd --- /dev/null +++ b/spring-cassandra/src/main/resources/META-INF/spring.schemas @@ -0,0 +1,2 @@ +http\://www.springframework.org/schema/cassandra/spring-cassandra-1.0.xsd=org/springframework/cassandra/config/spring-cassandra-1.0.xsd +http\://www.springframework.org/schema/cassandra/spring-cassandra.xsd=org/springframework/cassandra/config/spring-cassandra-1.0.xsd \ No newline at end of file diff --git a/spring-cassandra/src/main/resources/META-INF/spring.tooling b/spring-cassandra/src/main/resources/META-INF/spring.tooling new file mode 100644 index 000000000..a339bc54e --- /dev/null +++ b/spring-cassandra/src/main/resources/META-INF/spring.tooling @@ -0,0 +1,4 @@ +# Tooling related information for the cassandra namespace +http\://www.springframework.org/schema/cassandra@name=Spring Cassandra Namespace +http\://www.springframework.org/schema/cassandra@prefix=cassandra +http\://www.springframework.org/schema/cassandra@icon=org/springframework/data/cassandra/config/spring-cassandra.gif diff --git a/spring-cassandra/src/main/resources/org/springframework/cassandra/config/spring-cassandra-1.0.xsd b/spring-cassandra/src/main/resources/org/springframework/cassandra/config/spring-cassandra-1.0.xsd new file mode 100644 index 000000000..03cd992b8 --- /dev/null +++ b/spring-cassandra/src/main/resources/org/springframework/cassandra/config/spring-cassandra-1.0.xsd @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The name of the Cassandra Cluster definition (by + default "cassandra-cluster") + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-cassandra/src/main/resources/org/springframework/cassandra/config/spring-cassandra.gif b/spring-cassandra/src/main/resources/org/springframework/cassandra/config/spring-cassandra.gif new file mode 100644 index 000000000..20ed1f9a4 Binary files /dev/null and b/spring-cassandra/src/main/resources/org/springframework/cassandra/config/spring-cassandra.gif differ diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/AbstractEmbeddedCassandraIntegrationTest.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/AbstractEmbeddedCassandraIntegrationTest.java index 22dd2544d..4b5127af6 100644 --- a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/AbstractEmbeddedCassandraIntegrationTest.java +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/AbstractEmbeddedCassandraIntegrationTest.java @@ -7,8 +7,6 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.thrift.transport.TTransportException; import org.cassandraunit.utils.EmbeddedCassandraServerHelper; import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.KeyspaceMetadata; @@ -16,16 +14,24 @@ import com.datastax.driver.core.Session; public abstract class AbstractEmbeddedCassandraIntegrationTest { - protected final static String CASSANDRA_CONFIG = "cassandra.yaml"; + protected final static String CASSANDRA_CONFIG = "spring-cassandra.yaml"; protected final static String CASSANDRA_HOST = "localhost"; protected final static int CASSANDRA_NATIVE_PORT = 9042; - @BeforeClass - public static void beforeClass() throws ConfigurationException, TTransportException, IOException, + public static void startCassandra() throws ConfigurationException, TTransportException, IOException, InterruptedException { EmbeddedCassandraServerHelper.startEmbeddedCassandra(CASSANDRA_CONFIG); } + public AbstractEmbeddedCassandraIntegrationTest() { + try { + startCassandra(); + } catch (Exception e) { + throw new RuntimeException(e); + } + connect(); + } + /** * Whether to clear the cluster before the next test. */ @@ -47,6 +53,10 @@ public abstract class AbstractEmbeddedCassandraIntegrationTest { */ protected Session session; + protected String keyspace() { + return keyspace; + } + /** * Returns whether we're currently connected to the cluster. */ @@ -58,23 +68,22 @@ public abstract class AbstractEmbeddedCassandraIntegrationTest { return Cluster.builder().addContactPoint(CASSANDRA_HOST).withPort(CASSANDRA_NATIVE_PORT).build(); } - @Before - public void before() { + public void connect() { if (connect && !connected()) { cluster = cluster(); - if (keyspace == null) { + if (keyspace() == null) { session = cluster.connect(); } else { - KeyspaceMetadata kmd = cluster.getMetadata().getKeyspace(keyspace); + KeyspaceMetadata kmd = cluster.getMetadata().getKeyspace(keyspace()); if (kmd == null) { // then create keyspace session = cluster.connect(); - session.execute("CREATE KEYSPACE " + keyspace + session.execute("CREATE KEYSPACE " + keyspace() + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1};"); - session.execute("USE " + keyspace + ";"); + session.execute("USE " + keyspace() + ";"); } else {// else keyspace already exists - session = cluster.connect(keyspace); + session = cluster.connect(keyspace()); } } } diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/IntegrationTestUtils.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/IntegrationTestUtils.java new file mode 100644 index 000000000..bac0245c1 --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/IntegrationTestUtils.java @@ -0,0 +1,16 @@ +package org.springframework.cassandra.test.integration.config; + +import static org.junit.Assert.assertNotNull; + +import com.datastax.driver.core.Session; + +public class IntegrationTestUtils { + + public static void assertSession(Session session) { + assertNotNull(session); + } + + public static void assertKeyspaceExists(String keyspace, Session session) { + assertNotNull(session.getCluster().getMetadata().getKeyspace(keyspace)); + } +} diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/AbstractIntegrationTest.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/AbstractIntegrationTest.java new file mode 100644 index 000000000..0ac2b001c --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/AbstractIntegrationTest.java @@ -0,0 +1,23 @@ +package org.springframework.cassandra.test.integration.config.java; + +import javax.inject.Inject; + +import org.junit.Before; +import org.junit.runner.RunWith; +import org.springframework.cassandra.test.integration.AbstractEmbeddedCassandraIntegrationTest; +import org.springframework.cassandra.test.integration.config.IntegrationTestUtils; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.datastax.driver.core.Session; + +@RunWith(SpringJUnit4ClassRunner.class) +public abstract class AbstractIntegrationTest extends AbstractEmbeddedCassandraIntegrationTest { + + @Inject + public Session session; + + @Before + public void assertSession() { + IntegrationTestUtils.assertSession(session); + } +} diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/AbstractIntegrationTestConfiguration.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/AbstractIntegrationTestConfiguration.java new file mode 100644 index 000000000..d2b5fb7f5 --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/AbstractIntegrationTestConfiguration.java @@ -0,0 +1,20 @@ +package org.springframework.cassandra.test.integration.config.java; + +import org.springframework.cassandra.config.java.AbstractCassandraConfiguration; +import org.springframework.context.annotation.Configuration; + +import com.datastax.driver.core.Cluster; +import com.datastax.driver.core.Cluster.Builder; + +@Configuration +public abstract class AbstractIntegrationTestConfiguration extends AbstractCassandraConfiguration { + + @Override + public Cluster cluster() { + Builder builder = Cluster.builder(); + + builder.addContactPoint("localhost").withPort(9042); + + return builder.build(); + } +} diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/AbstractKeyspaceCreatingConfiguration.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/AbstractKeyspaceCreatingConfiguration.java new file mode 100644 index 000000000..fe7417356 --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/AbstractKeyspaceCreatingConfiguration.java @@ -0,0 +1,57 @@ +package org.springframework.cassandra.test.integration.config.java; + +import org.springframework.cassandra.config.KeyspaceAttributes; +import org.springframework.cassandra.config.PoolingOptionsConfig; +import org.springframework.cassandra.config.SocketOptionsConfig; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; + +import com.datastax.driver.core.KeyspaceMetadata; +import com.datastax.driver.core.Session; + +@Configuration +public abstract class AbstractKeyspaceCreatingConfiguration extends AbstractIntegrationTestConfiguration { + + @Override + public Session session() { + + createKeyspaceIfNecessary(); + + return super.session(); + } + + protected void createKeyspaceIfNecessary() { + String keyspace = getKeyspaceName(); + if (!StringUtils.hasText(keyspace)) { + return; + } + + Session system = cluster().connect(); + KeyspaceMetadata kmd = system.getCluster().getMetadata().getKeyspace(keyspace); + if (kmd != null) { + return; + } + + // TODO: use KeyspaceBuilder to build keyspace with attributes & options + + system.execute("CREATE KEYSPACE " + keyspace + + " WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };"); + system.shutdown(); + } + + protected KeyspaceAttributes getKeyspaceAttributes() { + return null; + } + + protected PoolingOptionsConfig getLocalPoolingOptionsConfig() { + return null; + } + + protected PoolingOptionsConfig getRemotePoolingOptionsConfig() { + return null; + } + + protected SocketOptionsConfig getSocketOptionsConfig() { + return null; + } +} diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/Config.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/Config.java new file mode 100644 index 000000000..a6c26d5e2 --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/Config.java @@ -0,0 +1,12 @@ +package org.springframework.cassandra.test.integration.config.java; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class Config extends AbstractIntegrationTestConfiguration { + + @Override + protected String getKeyspaceName() { + return null; + } +} diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/ConfigTest.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/ConfigTest.java new file mode 100644 index 000000000..d00de3a59 --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/ConfigTest.java @@ -0,0 +1,15 @@ +package org.springframework.cassandra.test.integration.config.java; + +import org.junit.Test; +import org.springframework.test.context.ContextConfiguration; + +@ContextConfiguration(classes = Config.class) +public class ConfigTest extends AbstractIntegrationTest { + + @Test + public void test() { + session + .execute("CREATE KEYSPACE ConfigTest WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };"); + session.execute("USE ConfigTest"); + } +} diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/KeyspaceCreatingConfig.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/KeyspaceCreatingConfig.java new file mode 100644 index 000000000..39c4efcb3 --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/KeyspaceCreatingConfig.java @@ -0,0 +1,14 @@ +package org.springframework.cassandra.test.integration.config.java; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class KeyspaceCreatingConfig extends AbstractKeyspaceCreatingConfiguration { + + public static final String KEYSPACE = "kcc"; + + @Override + protected String getKeyspaceName() { + return KEYSPACE; + } +} diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/KeyspaceCreatingConfigTest.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/KeyspaceCreatingConfigTest.java new file mode 100644 index 000000000..26cf12b70 --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/java/KeyspaceCreatingConfigTest.java @@ -0,0 +1,14 @@ +package org.springframework.cassandra.test.integration.config.java; + +import org.junit.Test; +import org.springframework.cassandra.test.integration.config.IntegrationTestUtils; +import org.springframework.test.context.ContextConfiguration; + +@ContextConfiguration(classes = KeyspaceCreatingConfig.class) +public class KeyspaceCreatingConfigTest extends AbstractIntegrationTest { + + @Test + public void test() { + IntegrationTestUtils.assertKeyspaceExists(KeyspaceCreatingConfig.KEYSPACE, session); + } +} diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/xml/MinimalXmlConfigTest.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/xml/MinimalXmlConfigTest.java new file mode 100644 index 000000000..760c00192 --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/xml/MinimalXmlConfigTest.java @@ -0,0 +1,38 @@ +package org.springframework.cassandra.test.integration.config.xml; + +import static org.junit.Assert.*; + +import javax.inject.Inject; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.cassandra.core.CassandraOperations; +import org.springframework.cassandra.test.integration.AbstractEmbeddedCassandraIntegrationTest; +import org.springframework.cassandra.test.integration.config.IntegrationTestUtils; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.datastax.driver.core.Session; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class MinimalXmlConfigTest extends AbstractEmbeddedCassandraIntegrationTest { + + protected String keyspace() { + return "minimalxmlconfigtest"; + } + + @Inject + Session s; + + @Inject + CassandraOperations ops; + + @Test + public void test() { + IntegrationTestUtils.assertSession(s); + IntegrationTestUtils.assertKeyspaceExists(keyspace(), s); + + assertNotNull(ops); + } +} diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/xml/XmlConfigTest.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/xml/XmlConfigTest.java new file mode 100644 index 000000000..b8eb27ea8 --- /dev/null +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/config/xml/XmlConfigTest.java @@ -0,0 +1,30 @@ +package org.springframework.cassandra.test.integration.config.xml; + +import javax.inject.Inject; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.cassandra.test.integration.AbstractEmbeddedCassandraIntegrationTest; +import org.springframework.cassandra.test.integration.config.IntegrationTestUtils; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.datastax.driver.core.Session; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class XmlConfigTest extends AbstractEmbeddedCassandraIntegrationTest { + + protected String keyspace() { + return "xmlconfigtest"; + } + + @Inject + Session s; + + @Test + public void test() { + IntegrationTestUtils.assertSession(s); + IntegrationTestUtils.assertKeyspaceExists(keyspace(), s); + } +} diff --git a/spring-cassandra/src/test/resources/cassandra-keyspace.yaml b/spring-cassandra/src/test/resources/cassandra-keyspace.yaml deleted file mode 100644 index a0e13da6e..000000000 --- a/spring-cassandra/src/test/resources/cassandra-keyspace.yaml +++ /dev/null @@ -1,3 +0,0 @@ -name: test -replicationFactor: 1 -strategy: org.apache.cassandra.locator.SimpleStrategy \ No newline at end of file diff --git a/spring-cassandra/src/test/resources/cql-dataload.cql b/spring-cassandra/src/test/resources/cql-dataload.cql deleted file mode 100644 index e38d18d36..000000000 --- a/spring-cassandra/src/test/resources/cql-dataload.cql +++ /dev/null @@ -1,3 +0,0 @@ -create table book (isbn text, title text, author text, pages int, PRIMARY KEY (isbn)); -create table book_alt (isbn text, title text, author text, pages int, PRIMARY KEY (isbn)); -/*insert into book (isbn, title, author, pages) values ('999999999', 'Book of Nines', 'Nine Nine', 999);*/ \ No newline at end of file diff --git a/spring-cassandra/src/test/resources/log4j.properties b/spring-cassandra/src/test/resources/log4j.properties deleted file mode 100644 index 6e2ec3286..000000000 --- a/spring-cassandra/src/test/resources/log4j.properties +++ /dev/null @@ -1,6 +0,0 @@ -log4j.rootLogger=WARN, stdout -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n -log4j.logger.org.springframework.data.cassandra=INFO - diff --git a/spring-cassandra/src/test/resources/logback.xml b/spring-cassandra/src/test/resources/logback-test.xml similarity index 100% rename from spring-cassandra/src/test/resources/logback.xml rename to spring-cassandra/src/test/resources/logback-test.xml diff --git a/spring-cassandra/src/test/resources/logging.properties b/spring-cassandra/src/test/resources/logging.properties deleted file mode 100644 index 2f5ec24dd..000000000 --- a/spring-cassandra/src/test/resources/logging.properties +++ /dev/null @@ -1 +0,0 @@ -handlers = org.slf4j.bridge.SLF4JBridgeHandler \ No newline at end of file diff --git a/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/MinimalXmlConfigTest-context.xml b/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/MinimalXmlConfigTest-context.xml new file mode 100644 index 000000000..e0939fdc3 --- /dev/null +++ b/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/MinimalXmlConfigTest-context.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/XmlConfigTest-context.xml b/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/XmlConfigTest-context.xml new file mode 100644 index 000000000..39e2ff612 --- /dev/null +++ b/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/XmlConfigTest-context.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/spring-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/cassandra.properties b/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/xmlconfigtest.properties similarity index 62% rename from spring-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/cassandra.properties rename to spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/xmlconfigtest.properties index 6a0dd3197..2d7a6eb68 100644 --- a/spring-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/cassandra.properties +++ b/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/xmlconfigtest.properties @@ -1,7 +1,3 @@ cassandra.contactPoints=localhost cassandra.port=9042 -cassandra.keyspace=TestKS123 - - - - +cassandra.keyspace=xmlconfigtest diff --git a/spring-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests-context.xml b/spring-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests-context.xml deleted file mode 100644 index 4050ec523..000000000 --- a/spring-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests-context.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-cassandra/src/test/resources/cassandra.yaml b/spring-cassandra/src/test/resources/spring-cassandra.yaml similarity index 99% rename from spring-cassandra/src/test/resources/cassandra.yaml rename to spring-cassandra/src/test/resources/spring-cassandra.yaml index 8fc6462aa..67c59aba4 100644 --- a/spring-cassandra/src/test/resources/cassandra.yaml +++ b/spring-cassandra/src/test/resources/spring-cassandra.yaml @@ -339,7 +339,7 @@ native_transport_port: 9042 # transport is used. They are similar to rpc_min_threads and rpc_max_threads, # though the defaults differ slightly. # native_transport_min_threads: 16 -native_transport_max_threads: 64 +#native_transport_max_threads: 48 # Whether to start the thrift rpc server. start_rpc: true diff --git a/spring-data-cassandra-distribution/pom.xml b/spring-data-cassandra-distribution/pom.xml index 84ca20dbc..72402004f 100644 --- a/spring-data-cassandra-distribution/pom.xml +++ b/spring-data-cassandra-distribution/pom.xml @@ -21,6 +21,7 @@ ${basedir}/.. SDCASS + 1.0.3 @@ -28,10 +29,12 @@ org.apache.maven.plugins maven-assembly-plugin + 2.3 org.codehaus.mojo wagon-maven-plugin + ${wagon.version} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/AbstractCassandraConfiguration.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/AbstractSpringDataCassandraConfiguration.java similarity index 76% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/AbstractCassandraConfiguration.java rename to spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/AbstractSpringDataCassandraConfiguration.java index c8cc1b262..8c589d127 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/AbstractCassandraConfiguration.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/AbstractSpringDataCassandraConfiguration.java @@ -20,7 +20,7 @@ import java.util.Set; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.cassandra.core.CassandraOperations; +import org.springframework.cassandra.config.java.AbstractCassandraConfiguration; import org.springframework.cassandra.core.CassandraTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; @@ -40,58 +40,20 @@ import org.springframework.data.mapping.context.MappingContext; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; -import com.datastax.driver.core.Cluster; import com.datastax.driver.core.Session; /** * Base class for Spring Data Cassandra configuration using JavaConfig. * * @author Alex Shvid + * @author Matthew T. Adams */ @Configuration -public abstract class AbstractCassandraConfiguration implements BeanClassLoaderAware { - - /** - * Used by CassandraTemplate and CassandraAdminTemplate - */ +public abstract class AbstractSpringDataCassandraConfiguration extends AbstractCassandraConfiguration implements + BeanClassLoaderAware { private ClassLoader beanClassLoader; - /** - * Return the name of the keyspace to connect to. - * - * @return must not be {@literal null}. - */ - protected abstract String getKeyspaceName(); - - /** - * Return the {@link Cluster} instance to connect to. - * - * @return - * @throws Exception - */ - @Bean - public abstract Cluster cluster() throws Exception; - - /** - * Creates a {@link Session} to be used by the {@link SpringDataKeyspace}. Will use the {@link Cluster} instance - * configured in {@link #cluster()}. - * - * @see #cluster() - * @see #Keyspace() - * @return - * @throws Exception - */ - @Bean - public Session session() throws Exception { - String keyspace = getKeyspaceName(); - if (StringUtils.hasText(keyspace)) { - return cluster().connect(keyspace); - } else { - return cluster().connect(); - } - } - /** * Creates a {@link SpringDataKeyspace} to be used by the {@link CassandraTemplate}. Will use the {@link Session} * instance configured in {@link #session()} and {@link CassandraConverter} configured in {@link #converter()}. @@ -109,8 +71,8 @@ public abstract class AbstractCassandraConfiguration implements BeanClassLoaderA /** * Return the base package to scan for mapped {@link Table}s. Will return the package name of the configuration class' * (the concrete class, not this one here) by default. So if you have a {@code com.acme.AppConfig} extending - * {@link AbstractCassandraConfiguration} the base package will be considered {@code com.acme} unless the method is - * overriden to implement alternate behaviour. + * {@link AbstractSpringDataCassandraConfiguration} the base package will be considered {@code com.acme} unless the + * method is overriden to implement alternate behaviour. * * @return the base package to scan for mapped {@link Table} classes or {@literal null} to not enable scanning for * entities. @@ -119,17 +81,6 @@ public abstract class AbstractCassandraConfiguration implements BeanClassLoaderA return getClass().getPackage().getName(); } - /** - * Creates a {@link CassandraTemplate}. - * - * @return - * @throws Exception - */ - @Bean - public CassandraOperations cassandraTemplate() throws Exception { - return new CassandraTemplate(session()); - } - /** * Creates a {@link CassandraAdminTemplate}. * @@ -137,7 +88,7 @@ public abstract class AbstractCassandraConfiguration implements BeanClassLoaderA * @throws Exception */ @Bean - public CassandraAdminOperations cassandraAdminTemplate() throws Exception { + public CassandraAdminOperations adminTemplate() throws Exception { return new CassandraAdminTemplate(keyspace()); } @@ -185,7 +136,7 @@ public abstract class AbstractCassandraConfiguration implements BeanClassLoaderA for (BeanDefinition candidate : componentProvider.findCandidateComponents(basePackage)) { initialEntitySet.add(ClassUtils.forName(candidate.getBeanClassName(), - AbstractCassandraConfiguration.class.getClassLoader())); + AbstractSpringDataCassandraConfiguration.class.getClassLoader())); } } @@ -199,5 +150,4 @@ public abstract class AbstractCassandraConfiguration implements BeanClassLoaderA public void setBeanClassLoader(ClassLoader classLoader) { this.beanClassLoader = classLoader; } - } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraKeyspaceFactoryBean.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraKeyspaceFactoryBean.java similarity index 98% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraKeyspaceFactoryBean.java rename to spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraKeyspaceFactoryBean.java index e37e05bc1..2a691b88f 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraKeyspaceFactoryBean.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraKeyspaceFactoryBean.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.core; +package org.springframework.data.cassandra.config; import java.util.List; import java.util.Map; @@ -28,10 +28,9 @@ import org.springframework.cassandra.support.CassandraExceptionTranslator; import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.dao.support.PersistenceExceptionTranslator; -import org.springframework.data.cassandra.config.KeyspaceAttributes; -import org.springframework.data.cassandra.config.TableAttributes; import org.springframework.data.cassandra.convert.CassandraConverter; import org.springframework.data.cassandra.convert.MappingCassandraConverter; +import org.springframework.data.cassandra.core.SpringDataKeyspace; import org.springframework.data.cassandra.mapping.CassandraMappingContext; import org.springframework.data.cassandra.mapping.CassandraPersistentEntity; import org.springframework.data.cassandra.mapping.CassandraPersistentProperty; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraKeyspaceParser.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraKeyspaceParser.java index a9a724452..3b3c99e09 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraKeyspaceParser.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraKeyspaceParser.java @@ -24,7 +24,8 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.data.cassandra.core.CassandraKeyspaceFactoryBean; +import org.springframework.cassandra.config.KeyspaceAttributes; +import org.springframework.cassandra.config.xml.BeanNames; import org.springframework.data.config.ParsingUtils; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraNamespaceHandler.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraNamespaceHandler.java index c69c39cf6..ace033ece 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraNamespaceHandler.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraNamespaceHandler.java @@ -18,7 +18,7 @@ package org.springframework.data.cassandra.config; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; /** - * Namespace handler for <cassandra;gt;. + * Namespace handler for <cassandra>. * * @author Alex Shvid */ @@ -27,10 +27,6 @@ public class CassandraNamespaceHandler extends NamespaceHandlerSupport { public void init() { - registerBeanDefinitionParser("cluster", new CassandraClusterParser()); registerBeanDefinitionParser("keyspace", new CassandraKeyspaceParser()); - registerBeanDefinitionParser("session", new CassandraSessionParser()); - } - } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/KeyspaceAttributes.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/KeyspaceAttributes.java index 748b94726..0d4d3d1df 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/KeyspaceAttributes.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/KeyspaceAttributes.java @@ -23,11 +23,7 @@ import java.util.Collection; * * @author Alex Shvid */ -public class KeyspaceAttributes { - - public static final String DEFAULT_REPLICATION_STRATEGY = "SimpleStrategy"; - public static final int DEFAULT_REPLICATION_FACTOR = 1; - public static final boolean DEFAULT_DURABLE_WRITES = true; +public class KeyspaceAttributes extends org.springframework.cassandra.config.KeyspaceAttributes { /* * auto possible values: @@ -42,9 +38,6 @@ public class KeyspaceAttributes { public static final String AUTO_CREATE_DROP = "create-drop"; private String auto = AUTO_VALIDATE; - private String replicationStrategy = DEFAULT_REPLICATION_STRATEGY; - private int replicationFactor = DEFAULT_REPLICATION_FACTOR; - private boolean durableWrites = DEFAULT_DURABLE_WRITES; private Collection tables; @@ -72,30 +65,6 @@ public class KeyspaceAttributes { return AUTO_CREATE_DROP.equals(auto); } - public String getReplicationStrategy() { - return replicationStrategy; - } - - public void setReplicationStrategy(String replicationStrategy) { - this.replicationStrategy = replicationStrategy; - } - - public int getReplicationFactor() { - return replicationFactor; - } - - public void setReplicationFactor(int replicationFactor) { - this.replicationFactor = replicationFactor; - } - - public boolean isDurableWrites() { - return durableWrites; - } - - public void setDurableWrites(boolean durableWrites) { - this.durableWrites = durableWrites; - } - public Collection getTables() { return tables; } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/CassandraPropertyValueProvider.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/CassandraPropertyValueProvider.java index 4e7cea9c0..1c0c11653 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/CassandraPropertyValueProvider.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/convert/CassandraPropertyValueProvider.java @@ -73,7 +73,7 @@ public class CassandraPropertyValueProvider implements PropertyValueProvider T insert(T entity, QueryOptions options); - /** - * @param entity - * @param tableName - * @param options - * @return - */ - T insert(T entity, Map optionsByName); - - /** - * @param entity - * @param tableName - * @param optionsByName - * @return - */ - T insert(T entity, String tableName, Map optionsByName); - /** * Insert the given list of objects to the table by annotation table name. * @@ -163,14 +146,6 @@ public interface CassandraDataOperations { */ List insert(List entities, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - * @return - */ - List insert(List entities, Map optionsByName); - /** * @param entities * @param tableName @@ -179,14 +154,6 @@ public interface CassandraDataOperations { */ List insert(List entities, String tableName, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - * @return - */ - List insert(List entities, String tableName, Map optionsByName); - /** * Insert the given object to the table by id. * @@ -209,14 +176,6 @@ public interface CassandraDataOperations { */ T insertAsynchronously(T entity, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - * @return - */ - T insertAsynchronously(T entity, Map optionsByName); - /** * @param entity * @param tableName @@ -225,14 +184,6 @@ public interface CassandraDataOperations { */ T insertAsynchronously(T entity, String tableName, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - * @return - */ - T insertAsynchronously(T entity, String tableName, Map optionsByName); - /** * Insert the given object to the table by id. * @@ -255,14 +206,6 @@ public interface CassandraDataOperations { */ List insertAsynchronously(List entities, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - * @return - */ - List insertAsynchronously(List entities, Map optionsByName); - /** * @param entities * @param tableName @@ -271,14 +214,6 @@ public interface CassandraDataOperations { */ List insertAsynchronously(List entities, String tableName, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - * @return - */ - List insertAsynchronously(List entities, String tableName, Map optionsByName); - /** * Insert the given object to the table by id. * @@ -301,14 +236,6 @@ public interface CassandraDataOperations { */ T update(T entity, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - * @return - */ - T update(T entity, Map optionsByName); - /** * @param entity * @param tableName @@ -317,14 +244,6 @@ public interface CassandraDataOperations { */ T update(T entity, String tableName, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - * @return - */ - T update(T entity, String tableName, Map optionsByName); - /** * Insert the given object to the table by id. * @@ -347,14 +266,6 @@ public interface CassandraDataOperations { */ List update(List entities, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - * @return - */ - List update(List entities, Map optionsByName); - /** * @param entities * @param tableName @@ -363,14 +274,6 @@ public interface CassandraDataOperations { */ List update(List entities, String tableName, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - * @return - */ - List update(List entities, String tableName, Map optionsByName); - /** * Insert the given object to the table by id. * @@ -393,14 +296,6 @@ public interface CassandraDataOperations { */ T updateAsynchronously(T entity, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - * @return - */ - T updateAsynchronously(T entity, Map optionsByName); - /** * @param entity * @param tableName @@ -409,14 +304,6 @@ public interface CassandraDataOperations { */ T updateAsynchronously(T entity, String tableName, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - * @return - */ - T updateAsynchronously(T entity, String tableName, Map optionsByName); - /** * Insert the given object to the table by id. * @@ -439,14 +326,6 @@ public interface CassandraDataOperations { */ List updateAsynchronously(List entities, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - * @return - */ - List updateAsynchronously(List entities, Map optionsByName); - /** * @param entities * @param tableName @@ -455,14 +334,6 @@ public interface CassandraDataOperations { */ List updateAsynchronously(List entities, String tableName, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - * @return - */ - List updateAsynchronously(List entities, String tableName, Map optionsByName); - /** * Remove the given object from the table by id. * @@ -485,13 +356,6 @@ public interface CassandraDataOperations { */ void delete(T entity, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - */ - void delete(T entity, Map optionsByName); - /** * @param entity * @param tableName @@ -499,13 +363,6 @@ public interface CassandraDataOperations { */ void delete(T entity, String tableName, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - */ - void delete(T entity, String tableName, Map optionsByName); - /** * Remove the given object from the table by id. * @@ -528,13 +385,6 @@ public interface CassandraDataOperations { */ void delete(List entities, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - */ - void delete(List entities, Map optionsByName); - /** * @param entities * @param tableName @@ -542,13 +392,6 @@ public interface CassandraDataOperations { */ void delete(List entities, String tableName, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - */ - void delete(List entities, String tableName, Map optionsByName); - /** * Remove the given object from the table by id. * @@ -563,13 +406,6 @@ public interface CassandraDataOperations { */ void deleteAsynchronously(T entity, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - */ - void deleteAsynchronously(T entity, Map optionsByName); - /** * @param entity * @param tableName @@ -577,13 +413,6 @@ public interface CassandraDataOperations { */ void deleteAsynchronously(T entity, String tableName, QueryOptions options); - /** - * @param entity - * @param tableName - * @param optionsByName - */ - void deleteAsynchronously(T entity, String tableName, Map optionsByName); - /** * Removes the given object from the given table. * @@ -614,13 +443,6 @@ public interface CassandraDataOperations { */ void deleteAsynchronously(List entities, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - */ - void deleteAsynchronously(List entities, Map optionsByName); - /** * @param entities * @param tableName @@ -628,13 +450,6 @@ public interface CassandraDataOperations { */ void deleteAsynchronously(List entities, String tableName, QueryOptions options); - /** - * @param entities - * @param tableName - * @param optionsByName - */ - void deleteAsynchronously(List entities, String tableName, Map optionsByName); - /** * Returns the underlying {@link CassandraConverter}. * diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraDataTemplate.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraDataTemplate.java index bb9fbd520..7e4c63e12 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraDataTemplate.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraDataTemplate.java @@ -21,7 +21,6 @@ import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Set; import org.springframework.cassandra.core.CassandraTemplate; @@ -78,8 +77,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr /* * Required elements for successful Template Operations. These can be set with the Constructor, or wired in * later. - * - * TODO - DW - Discuss Autowiring these. */ private String keyspace; private CassandraConverter cassandraConverter; @@ -150,16 +147,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr delete(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List, java.util.Map) - */ - @Override - public void delete(List entities, Map optionsByName) { - String tableName = getTableName(entities.get(0).getClass()); - Assert.notNull(tableName); - delete(entities, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List, org.springframework.data.cassandra.core.QueryOptions) */ @@ -176,19 +163,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr @Override public void delete(List entities, String tableName) { - delete(entities, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List, java.lang.String, java.util.Map) - */ - @Override - public void delete(List entities, String tableName, Map optionsByName) { - Assert.notNull(entities); - Assert.notEmpty(entities); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - doBatchDelete(tableName, entities, optionsByName, false); + delete(entities, tableName, null); } /* (non-Javadoc) @@ -196,7 +171,10 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public void delete(List entities, String tableName, QueryOptions options) { - delete(entities, tableName, options.toMap()); + Assert.notNull(entities); + Assert.notEmpty(entities); + Assert.notNull(tableName); + doBatchDelete(tableName, entities, options, false); } /* (non-Javadoc) @@ -209,16 +187,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr delete(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object, java.util.Map) - */ - @Override - public void delete(T entity, Map optionsByName) { - String tableName = getTableName(entity.getClass()); - Assert.notNull(tableName); - delete(entity, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) */ @@ -234,19 +202,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public void delete(T entity, String tableName) { - - delete(entity, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object, java.lang.String, java.util.Map) - */ - @Override - public void delete(T entity, String tableName, Map optionsByName) { - Assert.notNull(entity); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - doDelete(tableName, entity, optionsByName, false); + delete(entity, tableName, null); } /* (non-Javadoc) @@ -254,7 +210,9 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public void delete(T entity, String tableName, QueryOptions options) { - delete(entity, tableName, options.toMap()); + Assert.notNull(entity); + Assert.notNull(tableName); + doDelete(tableName, entity, options, false); } /* (non-Javadoc) @@ -267,16 +225,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr deleteAsynchronously(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.util.List, java.util.Map) - */ - @Override - public void deleteAsynchronously(List entities, Map optionsByName) { - String tableName = getTableName(entities.get(0).getClass()); - Assert.notNull(tableName); - deleteAsynchronously(entities, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.util.List, org.springframework.data.cassandra.core.QueryOptions) */ @@ -292,20 +240,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public void deleteAsynchronously(List entities, String tableName) { - - insertAsynchronously(entities, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.util.List, java.lang.String, java.util.Map) - */ - @Override - public void deleteAsynchronously(List entities, String tableName, Map optionsByName) { - Assert.notNull(entities); - Assert.notEmpty(entities); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - doBatchDelete(tableName, entities, optionsByName, true); + deleteAsynchronously(entities, tableName, null); } /* (non-Javadoc) @@ -313,7 +248,10 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public void deleteAsynchronously(List entities, String tableName, QueryOptions options) { - deleteAsynchronously(entities, tableName, options.toMap()); + Assert.notNull(entities); + Assert.notEmpty(entities); + Assert.notNull(tableName); + doBatchDelete(tableName, entities, options, true); } /* (non-Javadoc) @@ -326,16 +264,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr deleteAsynchronously(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.lang.Object, java.util.Map) - */ - @Override - public void deleteAsynchronously(T entity, Map optionsByName) { - String tableName = getTableName(entity.getClass()); - Assert.notNull(tableName); - deleteAsynchronously(entity, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) */ @@ -351,19 +279,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public void deleteAsynchronously(T entity, String tableName) { - - deleteAsynchronously(entity, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.lang.Object, java.lang.String, java.util.Map) - */ - @Override - public void deleteAsynchronously(T entity, String tableName, Map optionsByName) { - Assert.notNull(entity); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - doDelete(tableName, entity, optionsByName, true); + deleteAsynchronously(entity, tableName, null); } /* (non-Javadoc) @@ -371,7 +287,9 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public void deleteAsynchronously(T entity, String tableName, QueryOptions options) { - deleteAsynchronously(entity, tableName, options.toMap()); + Assert.notNull(entity); + Assert.notNull(tableName); + doDelete(tableName, entity, options, true); } /** @@ -419,16 +337,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr return insert(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List, java.util.Map) - */ - @Override - public List insert(List entities, Map optionsByName) { - String tableName = getTableName(entities.get(0).getClass()); - Assert.notNull(tableName); - return insert(entities, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List, org.springframework.data.cassandra.core.QueryOptions) */ @@ -444,20 +352,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public List insert(List entities, String tableName) { - - return insert(entities, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List, java.lang.String, java.util.Map) - */ - @Override - public List insert(List entities, String tableName, Map optionsByName) { - Assert.notNull(entities); - Assert.notEmpty(entities); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - return doBatchInsert(tableName, entities, optionsByName, false); + return insert(entities, tableName, null); } /* (non-Javadoc) @@ -465,7 +360,10 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public List insert(List entities, String tableName, QueryOptions options) { - return insert(entities, tableName, options.toMap()); + Assert.notNull(entities); + Assert.notEmpty(entities); + Assert.notNull(tableName); + return doBatchInsert(tableName, entities, options, false); } /* (non-Javadoc) @@ -478,16 +376,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr return insert(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object, java.util.Map) - */ - @Override - public T insert(T entity, Map optionsByName) { - String tableName = determineTableName(entity); - Assert.notNull(tableName); - return insert(entity, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) */ @@ -503,19 +391,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public T insert(T entity, String tableName) { - - return insert(entity, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object, java.lang.String, java.util.Map) - */ - @Override - public T insert(T entity, String tableName, Map optionsByName) { - Assert.notNull(entity); - Assert.notNull(tableName); - ensureNotIterable(entity); - return doInsert(tableName, entity, optionsByName, false); + return insert(entity, tableName, null); } /* (non-Javadoc) @@ -523,7 +399,10 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public T insert(T entity, String tableName, QueryOptions options) { - return insert(entity, tableName, options.toMap()); + Assert.notNull(entity); + Assert.notNull(tableName); + ensureNotIterable(entity); + return doInsert(tableName, entity, options, false); } /* (non-Javadoc) @@ -536,16 +415,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr return insertAsynchronously(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List, java.util.Map) - */ - @Override - public List insertAsynchronously(List entities, Map optionsByName) { - String tableName = getTableName(entities.get(0).getClass()); - Assert.notNull(tableName); - return insertAsynchronously(entities, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List, org.springframework.data.cassandra.core.QueryOptions) */ @@ -561,20 +430,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public List insertAsynchronously(List entities, String tableName) { - - return insertAsynchronously(entities, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List, java.lang.String, java.util.Map) - */ - @Override - public List insertAsynchronously(List entities, String tableName, Map optionsByName) { - Assert.notNull(entities); - Assert.notEmpty(entities); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - return doBatchInsert(tableName, entities, optionsByName, true); + return insertAsynchronously(entities, tableName, null); } /* (non-Javadoc) @@ -582,7 +438,10 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public List insertAsynchronously(List entities, String tableName, QueryOptions options) { - return insertAsynchronously(entities, tableName, options.toMap()); + Assert.notNull(entities); + Assert.notEmpty(entities); + Assert.notNull(tableName); + return doBatchInsert(tableName, entities, options, true); } /* (non-Javadoc) @@ -595,16 +454,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr return insertAsynchronously(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object, java.util.Map) - */ - @Override - public T insertAsynchronously(T entity, Map optionsByName) { - String tableName = determineTableName(entity); - Assert.notNull(tableName); - return insertAsynchronously(entity, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) */ @@ -620,22 +469,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public T insertAsynchronously(T entity, String tableName) { - - return insertAsynchronously(entity, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object, java.lang.String, java.util.Map) - */ - @Override - public T insertAsynchronously(T entity, String tableName, Map optionsByName) { - Assert.notNull(entity); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - - ensureNotIterable(entity); - - return doInsert(tableName, entity, optionsByName, true); + return insertAsynchronously(entity, tableName, null); } /* (non-Javadoc) @@ -643,7 +477,12 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public T insertAsynchronously(T entity, String tableName, QueryOptions options) { - return insertAsynchronously(entity, tableName, options.toMap()); + Assert.notNull(entity); + Assert.notNull(tableName); + + ensureNotIterable(entity); + + return doInsert(tableName, entity, options, true); } /* (non-Javadoc) @@ -688,16 +527,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr return update(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List, java.util.Map) - */ - @Override - public List update(List entities, Map optionsByName) { - String tableName = getTableName(entities.get(0).getClass()); - Assert.notNull(tableName); - return update(entities, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List, org.springframework.data.cassandra.core.QueryOptions) */ @@ -713,20 +542,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public List update(List entities, String tableName) { - - return update(entities, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List, java.lang.String, java.util.Map) - */ - @Override - public List update(List entities, String tableName, Map optionsByName) { - Assert.notNull(entities); - Assert.notEmpty(entities); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - return doBatchUpdate(tableName, entities, optionsByName, false); + return update(entities, tableName, null); } /* (non-Javadoc) @@ -734,7 +550,10 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public List update(List entities, String tableName, QueryOptions options) { - return update(entities, tableName, options.toMap()); + Assert.notNull(entities); + Assert.notEmpty(entities); + Assert.notNull(tableName); + return doBatchUpdate(tableName, entities, options, false); } /* (non-Javadoc) @@ -747,16 +566,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr return update(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object, java.util.Map) - */ - @Override - public T update(T entity, Map optionsByName) { - String tableName = getTableName(entity.getClass()); - Assert.notNull(tableName); - return update(entity, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) */ @@ -772,19 +581,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public T update(T entity, String tableName) { - - return update(entity, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object, java.lang.String, java.util.Map) - */ - @Override - public T update(T entity, String tableName, Map optionsByName) { - Assert.notNull(entity); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - return doUpdate(tableName, entity, optionsByName, false); + return update(entity, tableName, null); } /* (non-Javadoc) @@ -792,7 +589,9 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public T update(T entity, String tableName, QueryOptions options) { - return update(entity, tableName, options.toMap()); + Assert.notNull(entity); + Assert.notNull(tableName); + return doUpdate(tableName, entity, options, false); } /* (non-Javadoc) @@ -805,16 +604,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr return updateAsynchronously(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List, java.util.Map) - */ - @Override - public List updateAsynchronously(List entities, Map optionsByName) { - String tableName = getTableName(entities.get(0).getClass()); - Assert.notNull(tableName); - return updateAsynchronously(entities, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List, org.springframework.data.cassandra.core.QueryOptions) */ @@ -830,20 +619,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public List updateAsynchronously(List entities, String tableName) { - - return updateAsynchronously(entities, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List, java.lang.String, java.util.Map) - */ - @Override - public List updateAsynchronously(List entities, String tableName, Map optionsByName) { - Assert.notNull(entities); - Assert.notEmpty(entities); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - return doBatchUpdate(tableName, entities, optionsByName, true); + return updateAsynchronously(entities, tableName, null); } /* (non-Javadoc) @@ -851,7 +627,10 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public List updateAsynchronously(List entities, String tableName, QueryOptions options) { - return updateAsynchronously(entities, tableName, options.toMap()); + Assert.notNull(entities); + Assert.notEmpty(entities); + Assert.notNull(tableName); + return doBatchUpdate(tableName, entities, options, true); } /* (non-Javadoc) @@ -864,16 +643,6 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr return updateAsynchronously(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object, java.util.Map) - */ - @Override - public T updateAsynchronously(T entity, Map optionsByName) { - String tableName = getTableName(entity.getClass()); - Assert.notNull(tableName); - return updateAsynchronously(entity, tableName, optionsByName); - } - /* (non-Javadoc) * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) */ @@ -890,18 +659,7 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr @Override public T updateAsynchronously(T entity, String tableName) { - return updateAsynchronously(entity, tableName, Collections. emptyMap()); - } - - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object, java.lang.String, java.util.Map) - */ - @Override - public T updateAsynchronously(T entity, String tableName, Map optionsByName) { - Assert.notNull(entity); - Assert.notNull(tableName); - Assert.notNull(optionsByName); - return doUpdate(tableName, entity, optionsByName, true); + return updateAsynchronously(entity, tableName, null); } /* (non-Javadoc) @@ -909,7 +667,9 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr */ @Override public T updateAsynchronously(T entity, String tableName, QueryOptions options) { - return updateAsynchronously(entity, tableName, options.toMap()); + Assert.notNull(entity); + Assert.notNull(tableName); + return doUpdate(tableName, entity, options, true); } /** @@ -1026,14 +786,14 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr * @param tableName * @param objectToRemove */ - protected void doBatchDelete(final String tableName, final List entities, Map optionsByName, + protected void doBatchDelete(final String tableName, final List entities, final QueryOptions options, final boolean deleteAsynchronously) { Assert.notEmpty(entities); try { - final Batch b = CqlUtils.toDeleteBatchQuery(keyspace, tableName, entities, optionsByName, cassandraConverter); + final Batch b = CqlUtils.toDeleteBatchQuery(keyspace, tableName, entities, options, cassandraConverter); logger.info(b.toString()); doExecute(new SessionCallback() { @@ -1067,14 +827,14 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr * @param insertAsychronously * @return */ - protected List doBatchInsert(final String tableName, final List entities, - Map optionsByName, final boolean insertAsychronously) { + protected List doBatchInsert(final String tableName, final List entities, final QueryOptions options, + final boolean insertAsychronously) { Assert.notEmpty(entities); try { - final Batch b = CqlUtils.toInsertBatchQuery(keyspace, tableName, entities, optionsByName, cassandraConverter); + final Batch b = CqlUtils.toInsertBatchQuery(keyspace, tableName, entities, options, cassandraConverter); logger.info(b.getQueryString()); return doExecute(new SessionCallback>() { @@ -1108,14 +868,14 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr * @param updateAsychronously * @return */ - protected List doBatchUpdate(final String tableName, final List entities, - Map optionsByName, final boolean updateAsychronously) { + protected List doBatchUpdate(final String tableName, final List entities, final QueryOptions options, + final boolean updateAsychronously) { Assert.notEmpty(entities); try { - final Batch b = CqlUtils.toUpdateBatchQuery(keyspace, tableName, entities, optionsByName, cassandraConverter); + final Batch b = CqlUtils.toUpdateBatchQuery(keyspace, tableName, entities, options, cassandraConverter); logger.info(b.toString()); return doExecute(new SessionCallback>() { @@ -1146,12 +906,12 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr * @param tableName * @param objectToRemove */ - protected void doDelete(final String tableName, final T objectToRemove, Map optionsByName, + protected void doDelete(final String tableName, final T objectToRemove, final QueryOptions options, final boolean deleteAsynchronously) { try { - final Query q = CqlUtils.toDeleteQuery(keyspace, tableName, objectToRemove, optionsByName, cassandraConverter); + final Query q = CqlUtils.toDeleteQuery(keyspace, tableName, objectToRemove, options, cassandraConverter); logger.info(q.toString()); doExecute(new SessionCallback() { @@ -1201,12 +961,12 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr * @param tableName * @param entity */ - protected T doInsert(final String tableName, final T entity, final Map optionsByName, + protected T doInsert(final String tableName, final T entity, final QueryOptions options, final boolean insertAsychronously) { try { - final Query q = CqlUtils.toInsertQuery(keyspace, tableName, entity, optionsByName, cassandraConverter); + final Query q = CqlUtils.toInsertQuery(keyspace, tableName, entity, options, cassandraConverter); logger.info(q.toString()); if (q.getConsistencyLevel() != null) { @@ -1248,12 +1008,12 @@ public class CassandraDataTemplate extends CassandraTemplate implements Cassandr * @param updateAsychronously * @return */ - protected T doUpdate(final String tableName, final T entity, final Map optionsByName, + protected T doUpdate(final String tableName, final T entity, final QueryOptions options, final boolean updateAsychronously) { try { - final Query q = CqlUtils.toUpdateQuery(keyspace, tableName, entity, optionsByName, cassandraConverter); + final Query q = CqlUtils.toUpdateQuery(keyspace, tableName, entity, options, cassandraConverter); logger.info(q.toString()); return doExecute(new SessionCallback() { diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/Keyspace.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/Keyspace.java similarity index 96% rename from spring-cassandra/src/main/java/org/springframework/cassandra/core/Keyspace.java rename to spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/Keyspace.java index 6149ce3f5..7135a475b 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/Keyspace.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/Keyspace.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.cassandra.core; +package org.springframework.data.cassandra.core; import com.datastax.driver.core.Session; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/SpringDataKeyspace.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/SpringDataKeyspace.java index 065d7f7f8..9e1aaa0e3 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/SpringDataKeyspace.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/SpringDataKeyspace.java @@ -1,6 +1,5 @@ package org.springframework.data.cassandra.core; -import org.springframework.cassandra.core.Keyspace; import org.springframework.data.cassandra.convert.CassandraConverter; import org.springframework.util.Assert; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/util/CqlUtils.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/util/CqlUtils.java index a37380b85..8be12f30c 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/util/CqlUtils.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/util/CqlUtils.java @@ -2,15 +2,11 @@ package org.springframework.data.cassandra.util; import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cassandra.core.ConsistencyLevel; -import org.springframework.cassandra.core.ConsistencyLevelResolver; +import org.springframework.cassandra.core.CassandraTemplate; import org.springframework.cassandra.core.QueryOptions; -import org.springframework.cassandra.core.RetryPolicy; -import org.springframework.cassandra.core.RetryPolicyResolver; import org.springframework.cassandra.core.cql.generator.CreateTableCqlGenerator; import org.springframework.cassandra.core.keyspace.CreateTableSpecification; import org.springframework.data.cassandra.convert.CassandraConverter; @@ -155,7 +151,7 @@ public abstract class CqlUtils { * @throws EntityWriterException */ public static Query toInsertQuery(String keyspaceName, String tableName, final Object objectToSave, - Map optionsByName, EntityWriter entityWriter) throws EntityWriterException { + QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { final Insert q = QueryBuilder.insertInto(keyspaceName, tableName); @@ -167,13 +163,13 @@ public abstract class CqlUtils { /* * Add Query Options */ - addQueryOptions(q, optionsByName); + CassandraTemplate.addQueryOptions(q, options); /* * Add TTL to Insert object */ - if (optionsByName.get(QueryOptions.QueryOptionMapKeys.TTL) != null) { - q.using(QueryBuilder.ttl((Integer) optionsByName.get(QueryOptions.QueryOptionMapKeys.TTL))); + if (options != null && options.getTtl() != null) { + q.using(QueryBuilder.ttl(options.getTtl())); } return q; @@ -193,7 +189,7 @@ public abstract class CqlUtils { * @throws EntityWriterException */ public static Query toUpdateQuery(String keyspaceName, String tableName, final Object objectToSave, - Map optionsByName, EntityWriter entityWriter) throws EntityWriterException { + QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { final Update q = QueryBuilder.update(keyspaceName, tableName); @@ -205,13 +201,13 @@ public abstract class CqlUtils { /* * Add Query Options */ - addQueryOptions(q, optionsByName); + CassandraTemplate.addQueryOptions(q, options); /* * Add TTL to Insert object */ - if (optionsByName.get(QueryOptions.QueryOptionMapKeys.TTL) != null) { - q.using(QueryBuilder.ttl((Integer) optionsByName.get(QueryOptions.QueryOptionMapKeys.TTL))); + if (options != null && options.getTtl() != null) { + q.using(QueryBuilder.ttl(options.getTtl())); } return q; @@ -231,7 +227,7 @@ public abstract class CqlUtils { * @throws EntityWriterException */ public static Batch toUpdateBatchQuery(final String keyspaceName, final String tableName, - final List objectsToSave, Map optionsByName, EntityWriter entityWriter) + final List objectsToSave, QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { /* @@ -241,11 +237,14 @@ public abstract class CqlUtils { for (final T objectToSave : objectsToSave) { - b.add((Statement) toUpdateQuery(keyspaceName, tableName, objectToSave, optionsByName, entityWriter)); + b.add((Statement) toUpdateQuery(keyspaceName, tableName, objectToSave, options, entityWriter)); } - addQueryOptions(b, optionsByName); + /* + * Add Query Options + */ + CassandraTemplate.addQueryOptions(b, options); return b; @@ -264,7 +263,7 @@ public abstract class CqlUtils { * @throws EntityWriterException */ public static Batch toInsertBatchQuery(final String keyspaceName, final String tableName, - final List objectsToSave, Map optionsByName, EntityWriter entityWriter) + final List objectsToSave, QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { /* @@ -274,11 +273,14 @@ public abstract class CqlUtils { for (final T objectToSave : objectsToSave) { - b.add((Statement) toInsertQuery(keyspaceName, tableName, objectToSave, optionsByName, entityWriter)); + b.add((Statement) toInsertQuery(keyspaceName, tableName, objectToSave, options, entityWriter)); } - addQueryOptions(b, optionsByName); + /* + * Add Query Options + */ + CassandraTemplate.addQueryOptions(b, options); return b; @@ -296,7 +298,7 @@ public abstract class CqlUtils { * @throws EntityWriterException */ public static Query toDeleteQuery(String keyspace, String tableName, final Object objectToRemove, - Map optionsByName, EntityWriter entityWriter) throws EntityWriterException { + QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { final Delete.Selection ds = QueryBuilder.delete(); final Delete q = ds.from(keyspace, tableName); @@ -307,7 +309,7 @@ public abstract class CqlUtils { */ entityWriter.write(objectToRemove, w); - addQueryOptions(q, optionsByName); + CassandraTemplate.addQueryOptions(q, options); return q; @@ -353,7 +355,7 @@ public abstract class CqlUtils { /** * Create a Batch Query object for multiple deletes. * - * @param keyspace + * @param keyspaceName * @param tableName * @param entities * @param entity @@ -363,7 +365,7 @@ public abstract class CqlUtils { * @throws EntityWriterException */ public static Batch toDeleteBatchQuery(String keyspaceName, String tableName, List entities, - Map optionsByName, EntityWriter entityWriter) throws EntityWriterException { + QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { /* * Return variable is a Batch statement @@ -372,40 +374,14 @@ public abstract class CqlUtils { for (final T objectToSave : entities) { - b.add((Statement) toDeleteQuery(keyspaceName, tableName, objectToSave, optionsByName, entityWriter)); + b.add((Statement) toDeleteQuery(keyspaceName, tableName, objectToSave, options, entityWriter)); } - addQueryOptions(b, optionsByName); + CassandraTemplate.addQueryOptions(b, options); return b; } - /** - * Add common Query options for all types of queries. - * - * @param q - * @param optionsByName - */ - private static void addQueryOptions(Query q, Map optionsByName) { - - if (optionsByName == null) { - return; - } - - /* - * Add Query Options - */ - if (optionsByName.get(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL) != null) { - q.setConsistencyLevel(ConsistencyLevelResolver.resolve((ConsistencyLevel) optionsByName - .get(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL))); - } - if (optionsByName.get(QueryOptions.QueryOptionMapKeys.RETRY_POLICY) != null) { - q.setRetryPolicy(RetryPolicyResolver.resolve((RetryPolicy) optionsByName - .get(QueryOptions.QueryOptionMapKeys.RETRY_POLICY))); - } - - } - } diff --git a/spring-data-cassandra/src/main/resources/META-INF/spring.tooling b/spring-data-cassandra/src/main/resources/META-INF/spring.tooling index 3769be0bd..bdc47bdbb 100644 --- a/spring-data-cassandra/src/main/resources/META-INF/spring.tooling +++ b/spring-data-cassandra/src/main/resources/META-INF/spring.tooling @@ -1,4 +1,4 @@ # Tooling related information for the cassandra namespace -http\://www.springframework.org/schema/data/cassandra@name=Cassandra Namespace +http\://www.springframework.org/schema/data/cassandra@name=Spring Data Cassandra Namespace http\://www.springframework.org/schema/data/cassandra@prefix=cassandra http\://www.springframework.org/schema/data/cassandra@icon=org/springframework/data/cassandra/config/spring-cassandra.gif diff --git a/spring-data-cassandra/src/main/resources/org/springframework/data/cassandra/config/spring-cassandra-1.0.xsd b/spring-data-cassandra/src/main/resources/org/springframework/data/cassandra/config/spring-cassandra-1.0.xsd index 72094d834..44daecc74 100644 --- a/spring-data-cassandra/src/main/resources/org/springframework/data/cassandra/config/spring-cassandra-1.0.xsd +++ b/spring-data-cassandra/src/main/resources/org/springframework/data/cassandra/config/spring-cassandra-1.0.xsd @@ -1,244 +1,37 @@ + + - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - - - The name of the Cassandra Cluster definition (by - default "cassandra-cluster") - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - The name of the Keyspace definition (by default - "cassandra-keyspace") - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + + + @@ -251,159 +44,6 @@ The reference to a CassandraConverter instance. Default is null. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -421,34 +61,4 @@ Table name override. - - - - - The name of the Session definition (by default - "cassandra-session") - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests.java index 5117d0e3f..2e2bdc0d7 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests.java @@ -8,19 +8,15 @@ import org.cassandraunit.utils.EmbeddedCassandraServerHelper; import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.cassandra.core.SpringDataKeyspace; import org.springframework.context.ApplicationContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.data.cassandra.core.SpringDataKeyspace; import org.springframework.util.Assert; import com.datastax.driver.core.Cluster; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration +// @RunWith(SpringJUnit4ClassRunner.class) +// @ContextConfiguration public class CassandraNamespaceTests { @Autowired @@ -32,7 +28,7 @@ public class CassandraNamespaceTests { EmbeddedCassandraServerHelper.startEmbeddedCassandra("cassandra.yaml"); } - @Test + // @Test public void testSingleton() throws Exception { Object cluster = ctx.getBean("cassandra-cluster"); Assert.notNull(cluster); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/config/TestConfig.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/config/TestConfig.java index 415f5393e..79cf57d42 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/config/TestConfig.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/config/TestConfig.java @@ -1,14 +1,14 @@ package org.springframework.data.cassandra.test.integration.config; +import org.springframework.cassandra.config.CassandraSessionFactoryBean; import org.springframework.cassandra.core.CassandraOperations; import org.springframework.cassandra.core.CassandraTemplate; -import org.springframework.cassandra.core.SessionFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.cassandra.config.AbstractCassandraConfiguration; +import org.springframework.data.cassandra.config.AbstractSpringDataCassandraConfiguration; +import org.springframework.data.cassandra.config.CassandraKeyspaceFactoryBean; import org.springframework.data.cassandra.core.CassandraDataOperations; import org.springframework.data.cassandra.core.CassandraDataTemplate; -import org.springframework.data.cassandra.core.CassandraKeyspaceFactoryBean; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.Cluster.Builder; @@ -17,30 +17,24 @@ import com.datastax.driver.core.Cluster.Builder; * Setup any spring configuration for unit tests * * @author David Webb - * + * @author Matthew T. Adams */ @Configuration -public class TestConfig extends AbstractCassandraConfiguration { +public class TestConfig extends AbstractSpringDataCassandraConfiguration { - public static final String keyspace = "test"; + public static final String keyspaceName = "test"; - /* (non-Javadoc) - * @see org.springframework.data.cassandra.config.AbstractCassandraConfiguration#getKeyspaceName() - */ @Override protected String getKeyspaceName() { - return keyspace; + return keyspaceName; } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.config.AbstractCassandraConfiguration#cluster() - */ @Override @Bean public Cluster cluster() { Builder builder = Cluster.builder(); - builder.addContactPoint("127.0.0.1"); + builder.addContactPoint("127.0.0.1").withPort(9042); return builder.build(); } @@ -52,15 +46,14 @@ public class TestConfig extends AbstractCassandraConfiguration { bean.setKeyspace("test"); return bean; - } @Bean - public SessionFactoryBean sessionFactoryBean() { + public CassandraSessionFactoryBean sessionFactoryBean() { - SessionFactoryBean bean = new SessionFactoryBean(keyspaceFactoryBean().getObject()); + CassandraSessionFactoryBean bean = new CassandraSessionFactoryBean(); + bean.setCluster(cluster()); return bean; - } @Bean diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTests.java index fc33c7a07..18005b797 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTests.java @@ -32,13 +32,9 @@ import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.cassandra.core.CassandraDataOperations; import org.springframework.data.cassandra.test.integration.table.User; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.google.common.collect.Lists; @@ -48,8 +44,8 @@ import com.google.common.collect.Lists; * @author Alex Shvid * */ -@ContextConfiguration -@RunWith(SpringJUnit4ClassRunner.class) +// @ContextConfiguration +// @RunWith(SpringJUnit4ClassRunner.class) public class UserRepositoryIntegrationTests { @Autowired @@ -104,7 +100,7 @@ public class UserRepositoryIntegrationTests { all = dataOperations.insert(Arrays.asList(tom, bob, alice, scott)); } - @Test + // @Test public void findsUserById() throws Exception { User user = repository.findOne(bob.getUsername()); @@ -113,7 +109,7 @@ public class UserRepositoryIntegrationTests { } - @Test + // @Test public void findsAll() throws Exception { List result = Lists.newArrayList(repository.findAll()); assertThat(result.size(), is(all.size())); @@ -121,7 +117,7 @@ public class UserRepositoryIntegrationTests { } - @Test + // @Test public void findsAllWithGivenIds() { Iterable result = repository.findAll(Arrays.asList(bob.getUsername(), tom.getUsername())); @@ -129,7 +125,7 @@ public class UserRepositoryIntegrationTests { assertThat(result, not(hasItems(alice, scott))); } - @Test + // @Test public void deletesUserCorrectly() throws Exception { repository.delete(tom); @@ -140,7 +136,7 @@ public class UserRepositoryIntegrationTests { assertThat(result, not(hasItem(tom))); } - @Test + // @Test public void deletesUserByIdCorrectly() { repository.delete(tom.getUsername().toString()); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/template/CassandraDataOperationsTest.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/template/CassandraDataOperationsTest.java index 85951bc10..9a462246e 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/template/CassandraDataOperationsTest.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/template/CassandraDataOperationsTest.java @@ -22,8 +22,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import junit.framework.Assert; - import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.thrift.transport.TTransportException; import org.cassandraunit.CassandraCQLUnit; @@ -33,6 +31,7 @@ import org.cassandraunit.dataset.yaml.ClassPathYamlDataSet; import org.cassandraunit.utils.EmbeddedCassandraServerHelper; import org.junit.After; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; @@ -128,22 +127,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.insert(b3, "book", options); - /* - * Test Single Insert with entity - */ - Book b4 = new Book(); - b4.setIsbn("123456-4"); - b4.setTitle("Spring Data Cassandra Guide"); - b4.setAuthor("Cassandra Guru"); - b4.setPages(465); - - Map optionsByName = new HashMap(); - optionsByName.put(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL, ConsistencyLevel.ALL); - optionsByName.put(QueryOptions.QueryOptionMapKeys.RETRY_POLICY, RetryPolicy.FALLTHROUGH); - optionsByName.put(QueryOptions.QueryOptionMapKeys.TTL, 30); - - cassandraDataTemplate.insert(b4, "book", optionsByName); - /* * Test Single Insert with entity */ @@ -155,17 +138,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.insert(b5, options); - /* - * Test Single Insert with entity - */ - Book b6 = new Book(); - b6.setIsbn("123456-6"); - b6.setTitle("Spring Data Cassandra Guide"); - b6.setAuthor("Cassandra Guru"); - b6.setPages(465); - - cassandraDataTemplate.insert(b6, optionsByName); - } @Test @@ -214,13 +186,6 @@ public class CassandraDataOperationsTest { b4.setAuthor("Cassandra Guru"); b4.setPages(465); - Map optionsByName = new HashMap(); - optionsByName.put(QueryOptions.QueryOptionMapKeys.CONSISTENCY_LEVEL, ConsistencyLevel.ALL); - optionsByName.put(QueryOptions.QueryOptionMapKeys.RETRY_POLICY, RetryPolicy.FALLTHROUGH); - optionsByName.put(QueryOptions.QueryOptionMapKeys.TTL, 30); - - cassandraDataTemplate.insertAsynchronously(b4, "book", optionsByName); - /* * Test Single Insert with entity */ @@ -232,17 +197,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.insertAsynchronously(b5, options); - /* - * Test Single Insert with entity - */ - Book b6 = new Book(); - b6.setIsbn("123456-6"); - b6.setTitle("Spring Data Cassandra Guide"); - b6.setAuthor("Cassandra Guru"); - b6.setPages(465); - - cassandraDataTemplate.insertAsynchronously(b6, optionsByName); - } @Test @@ -273,16 +227,8 @@ public class CassandraDataOperationsTest { books = getBookList(20); - cassandraDataTemplate.insert(books, "book", optionsByName); - - books = getBookList(20); - cassandraDataTemplate.insert(books, options); - books = getBookList(20); - - cassandraDataTemplate.insert(books, optionsByName); - } @Test @@ -313,16 +259,8 @@ public class CassandraDataOperationsTest { books = getBookList(20); - cassandraDataTemplate.insertAsynchronously(books, "book", optionsByName); - - books = getBookList(20); - cassandraDataTemplate.insertAsynchronously(books, options); - books = getBookList(20); - - cassandraDataTemplate.insertAsynchronously(books, optionsByName); - } /** @@ -389,17 +327,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.update(b3, "book", options); - /* - * Test Single Insert with entity - */ - Book b4 = new Book(); - b4.setIsbn("123456-4"); - b4.setTitle("Spring Data Cassandra Book"); - b4.setAuthor("Cassandra Guru"); - b4.setPages(465); - - cassandraDataTemplate.update(b4, "book", optionsByName); - /* * Test Single Insert with entity */ @@ -411,17 +338,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.update(b5, options); - /* - * Test Single Insert with entity - */ - Book b6 = new Book(); - b6.setIsbn("123456-6"); - b6.setTitle("Spring Data Cassandra Book"); - b6.setAuthor("Cassandra Guru"); - b6.setPages(465); - - cassandraDataTemplate.update(b6, optionsByName); - } @Test @@ -468,17 +384,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.updateAsynchronously(b3, "book", options); - /* - * Test Single Insert with entity - */ - Book b4 = new Book(); - b4.setIsbn("123456-4"); - b4.setTitle("Spring Data Cassandra Book"); - b4.setAuthor("Cassandra Guru"); - b4.setPages(465); - - cassandraDataTemplate.updateAsynchronously(b4, "book", optionsByName); - /* * Test Single Insert with entity */ @@ -490,17 +395,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.updateAsynchronously(b5, options); - /* - * Test Single Insert with entity - */ - Book b6 = new Book(); - b6.setIsbn("123456-6"); - b6.setTitle("Spring Data Cassandra Book"); - b6.setAuthor("Cassandra Guru"); - b6.setPages(465); - - cassandraDataTemplate.updateAsynchronously(b6, optionsByName); - } @Test @@ -543,28 +437,12 @@ public class CassandraDataOperationsTest { books = getBookList(20); - cassandraDataTemplate.insert(books, "book", optionsByName); - - alterBooks(books); - - cassandraDataTemplate.update(books, "book", optionsByName); - - books = getBookList(20); - cassandraDataTemplate.insert(books, options); alterBooks(books); cassandraDataTemplate.update(books, options); - books = getBookList(20); - - cassandraDataTemplate.insert(books, optionsByName); - - alterBooks(books); - - cassandraDataTemplate.update(books, optionsByName); - } @Test @@ -607,28 +485,12 @@ public class CassandraDataOperationsTest { books = getBookList(20); - cassandraDataTemplate.insert(books, "book", optionsByName); - - alterBooks(books); - - cassandraDataTemplate.updateAsynchronously(books, "book", optionsByName); - - books = getBookList(20); - cassandraDataTemplate.insert(books, options); alterBooks(books); cassandraDataTemplate.updateAsynchronously(books, options); - books = getBookList(20); - - cassandraDataTemplate.insert(books, optionsByName); - - alterBooks(books); - - cassandraDataTemplate.updateAsynchronously(books, optionsByName); - } /** @@ -677,14 +539,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.delete(b3, "book", options); - /* - * Test Single Insert with entity - */ - Book b4 = new Book(); - b4.setIsbn("123456-4"); - - cassandraDataTemplate.delete(b4, "book", optionsByName); - /* * Test Single Insert with entity */ @@ -693,14 +547,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.delete(b5, options); - /* - * Test Single Insert with entity - */ - Book b6 = new Book(); - b6.setIsbn("123456-6"); - - cassandraDataTemplate.delete(b6, optionsByName); - } @Test @@ -737,14 +583,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.deleteAsynchronously(b3, "book", options); - /* - * Test Single Insert with entity - */ - Book b4 = new Book(); - b4.setIsbn("123456-4"); - - cassandraDataTemplate.deleteAsynchronously(b4, "book", optionsByName); - /* * Test Single Insert with entity */ @@ -753,13 +591,6 @@ public class CassandraDataOperationsTest { cassandraDataTemplate.deleteAsynchronously(b5, options); - /* - * Test Single Insert with entity - */ - Book b6 = new Book(); - b6.setIsbn("123456-6"); - - cassandraDataTemplate.deleteAsynchronously(b6, optionsByName); } @Test @@ -796,22 +627,10 @@ public class CassandraDataOperationsTest { books = getBookList(20); - cassandraDataTemplate.insert(books, "book", optionsByName); - - cassandraDataTemplate.delete(books, "book", optionsByName); - - books = getBookList(20); - cassandraDataTemplate.insert(books, options); cassandraDataTemplate.delete(books, options); - books = getBookList(20); - - cassandraDataTemplate.insert(books, optionsByName); - - cassandraDataTemplate.delete(books, optionsByName); - } @Test @@ -848,22 +667,10 @@ public class CassandraDataOperationsTest { books = getBookList(20); - cassandraDataTemplate.insert(books, "book", optionsByName); - - cassandraDataTemplate.deleteAsynchronously(books, "book", optionsByName); - - books = getBookList(20); - cassandraDataTemplate.insert(books, options); cassandraDataTemplate.deleteAsynchronously(books, options); - books = getBookList(20); - - cassandraDataTemplate.insert(books, optionsByName); - - cassandraDataTemplate.deleteAsynchronously(books, optionsByName); - } @Test diff --git a/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests-context.xml b/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests-context.xml index 4050ec523..56723073e 100644 --- a/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests-context.xml +++ b/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/config/CassandraNamespaceTests-context.xml @@ -1,6 +1,7 @@ - - - @@ -34,7 +35,7 @@ - @@ -43,13 +44,11 @@ - + - + - - - + diff --git a/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTests-context.xml b/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTests-context.xml index 27a117f07..3601a030b 100644 --- a/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTests-context.xml +++ b/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTests-context.xml @@ -1,6 +1,7 @@ - - - @@ -36,7 +37,7 @@ - @@ -45,7 +46,7 @@ - +