From 56eee40bd0618cf517a151afe89b2212aee661b3 Mon Sep 17 00:00:00 2001 From: Matthew Adams Date: Thu, 30 Jan 2014 17:51:36 -0600 Subject: [PATCH] basic spring java config-based CassandraRepository now working --- .../config/DataCenterReplication.java | 23 ++ ...eyspaceActionSpecificationFactoryBean.java | 3 +- .../cassandra/config/KeyspaceAttributes.java | 13 -- ...java => AbstractClusterConfiguration.java} | 18 +- .../java/AbstractSessionConfiguration.java | 31 +++ ...andraUncategorizedDataAccessException.java | 2 + .../keyspace/CreateKeyspaceSpecification.java | 31 +++ ...tractEmbeddedCassandraIntegrationTest.java | 9 +- ...AbstractKeyspaceCreatingConfiguration.java | 4 +- .../support/AbstractTestJavaConfig.java | 4 +- .../src/test/resources/logback-test.xml | 3 +- .../CassandraDataSessionFactoryBean.java | 8 +- .../data/cassandra/config/SchemaAction.java | 6 +- ...tractSpringDataCassandraConfiguration.java | 58 ++++- .../core/CassandraAdminOperations.java | 5 +- .../core/CassandraAdminTemplate.java | 125 ++--------- .../cassandra/core/CassandraOperations.java | 3 +- .../cassandra/core/CassandraTemplate.java | 211 ++---------------- .../CassandraRepositoriesRegistrar.java | 15 +- ...andraRepositoryConfigurationExtension.java | 22 +- .../config/EnableCassandraRepositories.java | 11 +- .../CassandraRepositoryFactoryBean.java | 2 +- .../data/cassandra/util/CqlUtils.java | 46 ++-- ...gDataEmbeddedCassandraIntegrationTest.java | 14 ++ .../config/CassandraNamespaceTests.java | 2 +- .../test/integration/config/TestConfig.java | 9 +- ...andraPersistentEntityIntegrationTests.java | 2 +- .../{table => repository}/User.java | 2 +- .../repository/UserRepository.java | 2 - .../UserRepositoryIntegrationTests.java | 47 ++-- .../UserRepositoryIntegrationTestsConfig.java | 19 +- .../support/AbstractDataTestJavaConfig.java | 6 +- .../test/integration/table/Domain.java | 11 + .../template/CassandraAdminTest.java | 2 +- .../template/CassandraDataOperationsTest.java | 2 +- .../{logback.xml => logback-test.xml} | 4 +- ...UserRepositoryIntegrationTests-context.xml | 2 +- .../{cassandra.yaml => spring-cassandra.yaml} | 0 38 files changed, 302 insertions(+), 475 deletions(-) create mode 100644 spring-cassandra/src/main/java/org/springframework/cassandra/config/DataCenterReplication.java rename spring-cassandra/src/main/java/org/springframework/cassandra/config/java/{AbstractCassandraConfiguration.java => AbstractClusterConfiguration.java} (85%) create mode 100644 spring-cassandra/src/main/java/org/springframework/cassandra/config/java/AbstractSessionConfiguration.java create mode 100644 spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/AbstractSpringDataEmbeddedCassandraIntegrationTest.java rename spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/{table => repository}/User.java (98%) create mode 100644 spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/table/Domain.java rename spring-data-cassandra/src/test/resources/{logback.xml => logback-test.xml} (85%) rename spring-data-cassandra/src/test/resources/{cassandra.yaml => spring-cassandra.yaml} (100%) diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/DataCenterReplication.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/DataCenterReplication.java new file mode 100644 index 000000000..8d3da4a05 --- /dev/null +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/DataCenterReplication.java @@ -0,0 +1,23 @@ +package org.springframework.cassandra.config; + +/** + * Simple data structure to be used when setting the replication factor for a given data center. + */ +public class DataCenterReplication { + + public static DataCenterReplication[] dcrs(DataCenterReplication... dcrs) { + return dcrs; + } + + public static DataCenterReplication dcr(String dataCenter, long replicationFactor) { + return new DataCenterReplication(dataCenter, replicationFactor); + } + + public String dataCenter; + public long replicationFactor; + + public DataCenterReplication(String dataCenter, long replicationFactor) { + this.dataCenter = dataCenter; + this.replicationFactor = replicationFactor; + } +} \ No newline at end of file diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/KeyspaceActionSpecificationFactoryBean.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/KeyspaceActionSpecificationFactoryBean.java index 0a3b8cfb3..b16300260 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/config/KeyspaceActionSpecificationFactoryBean.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/KeyspaceActionSpecificationFactoryBean.java @@ -109,8 +109,7 @@ public class KeyspaceActionSpecificationFactoryBean implements FactoryBean getStartupScripts() { return Collections.emptyList(); } diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/java/AbstractSessionConfiguration.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/java/AbstractSessionConfiguration.java new file mode 100644 index 000000000..7a9657cc0 --- /dev/null +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/java/AbstractSessionConfiguration.java @@ -0,0 +1,31 @@ +package org.springframework.cassandra.config.java; + +import org.springframework.cassandra.config.CassandraSessionFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.datastax.driver.core.Cluster; + +/** + * Base class for Spring Cassandra configuration that can handle creating namespaces, execute arbitrary CQL on startup & + * shutdown, and optionally drop namespaces. + * + * @author Matthew T. Adams + */ +@Configuration +public abstract class AbstractSessionConfiguration extends AbstractClusterConfiguration { + + protected abstract String getKeyspaceName(); + + @Bean + public CassandraSessionFactoryBean session() throws Exception { + + Cluster cluster = cluster().getObject(); + + CassandraSessionFactoryBean bean = new CassandraSessionFactoryBean(); + bean.setCluster(cluster); + bean.setKeyspaceName(getKeyspaceName()); + + return bean; + } +} diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraUncategorizedDataAccessException.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraUncategorizedDataAccessException.java index 2fd716638..962b64f02 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraUncategorizedDataAccessException.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/CassandraUncategorizedDataAccessException.java @@ -25,6 +25,8 @@ import org.springframework.dao.UncategorizedDataAccessException; */ public class CassandraUncategorizedDataAccessException extends UncategorizedDataAccessException { + private static final long serialVersionUID = -155082875466458401L; + /** * Create the Exception * diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/CreateKeyspaceSpecification.java b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/CreateKeyspaceSpecification.java index f945093e4..9800c27d5 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/CreateKeyspaceSpecification.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/core/keyspace/CreateKeyspaceSpecification.java @@ -1,5 +1,9 @@ package org.springframework.cassandra.core.keyspace; +import org.springframework.cassandra.config.DataCenterReplication; +import org.springframework.cassandra.core.keyspace.KeyspaceOption.ReplicationStrategy; +import org.springframework.cassandra.core.util.MapBuilder; + public class CreateKeyspaceSpecification extends KeyspaceSpecification { private boolean ifNotExists = false; @@ -35,6 +39,33 @@ public class CreateKeyspaceSpecification extends KeyspaceSpecification builder = MapBuilder.map(Option.class, Object.class).entry( + new DefaultOption("class", String.class, true, false, true), + ReplicationStrategy.NETWORK_TOPOLOGY_STRATEGY.getValue()); + + for (DataCenterReplication dcr : dcrs) { + builder.entry(new DefaultOption(dcr.dataCenter, Long.class, true, false, false), dcr.replicationFactor); + } + + return with(KeyspaceOption.REPLICATION, builder.build()); + } + @Override public CreateKeyspaceSpecification name(String name) { return (CreateKeyspaceSpecification) super.name(name); 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 78babc219..ffeb3a01e 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 @@ -23,10 +23,11 @@ public class AbstractEmbeddedCassandraIntegrationTest { static Logger log = LoggerFactory.getLogger(AbstractEmbeddedCassandraIntegrationTest.class); - protected static final BuildProperties PROPS = new BuildProperties(); - protected static final String CASSANDRA_CONFIG = "spring-cassandra.yaml"; - protected static final String CASSANDRA_HOST = "localhost"; - protected static final int CASSANDRA_NATIVE_PORT = PROPS.getCassandraPort(); + protected static String CASSANDRA_CONFIG = "spring-cassandra.yaml"; + protected static String CASSANDRA_HOST = "localhost"; + + protected static BuildProperties PROPS = new BuildProperties(); + protected static int CASSANDRA_NATIVE_PORT = PROPS.getCassandraPort(); /** * The session connected to the system keyspace. 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 index b5793bceb..cfe7dbddc 100644 --- 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 @@ -1,7 +1,7 @@ package org.springframework.cassandra.test.integration.config.java; import org.springframework.cassandra.config.CassandraSessionFactoryBean; -import org.springframework.cassandra.config.java.AbstractCassandraConfiguration; +import org.springframework.cassandra.config.java.AbstractSessionConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; @@ -9,7 +9,7 @@ import com.datastax.driver.core.KeyspaceMetadata; import com.datastax.driver.core.Session; @Configuration -public abstract class AbstractKeyspaceCreatingConfiguration extends AbstractCassandraConfiguration { +public abstract class AbstractKeyspaceCreatingConfiguration extends AbstractSessionConfiguration { @Override public CassandraSessionFactoryBean session() throws Exception { diff --git a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/support/AbstractTestJavaConfig.java b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/support/AbstractTestJavaConfig.java index 9e957e5d5..3a3ca1f10 100644 --- a/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/support/AbstractTestJavaConfig.java +++ b/spring-cassandra/src/test/java/org/springframework/cassandra/test/integration/support/AbstractTestJavaConfig.java @@ -1,10 +1,10 @@ package org.springframework.cassandra.test.integration.support; -import org.springframework.cassandra.config.java.AbstractCassandraConfiguration; +import org.springframework.cassandra.config.java.AbstractSessionConfiguration; import org.springframework.context.annotation.Configuration; @Configuration -public abstract class AbstractTestJavaConfig extends AbstractCassandraConfiguration { +public abstract class AbstractTestJavaConfig extends AbstractSessionConfiguration { public static BuildProperties PROPS = new BuildProperties(); public static final int PORT = PROPS.getCassandraPort(); diff --git a/spring-cassandra/src/test/resources/logback-test.xml b/spring-cassandra/src/test/resources/logback-test.xml index a410f7fb5..24e8a279d 100644 --- a/spring-cassandra/src/test/resources/logback-test.xml +++ b/spring-cassandra/src/test/resources/logback-test.xml @@ -9,9 +9,8 @@ - + - diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataSessionFactoryBean.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataSessionFactoryBean.java index 68c3caf4d..cd3794260 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataSessionFactoryBean.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataSessionFactoryBean.java @@ -25,16 +25,14 @@ public class CassandraDataSessionFactoryBean extends CassandraSessionFactoryBean @Override public void afterPropertiesSet() throws Exception { + super.afterPropertiesSet(); Assert.notNull(converter); - if (mapping == null) { - mapping = new Mapping(); - } + admin = new CassandraAdminTemplate(session, converter); - admin = new CassandraAdminTemplate(session); - admin.setCassandraConverter(converter); + mapping = mapping == null ? new Mapping() : mapping; processMappingOverrides(); performSchemaAction(); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SchemaAction.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SchemaAction.java index 990ec77e4..ec32b24ad 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SchemaAction.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SchemaAction.java @@ -31,15 +31,15 @@ public enum SchemaAction { // /** // * Validate that each required table and column exists. Fail if any required table or column does not exists. // */ - // VALIDATE("VALIDATE"), + // VALIDATE, // // /** // * Alter or create each table and column as necessary, leaving unused tables and columns untouched. // */ - // UPDATE("UPDATE"), + // UPDATE, // // /** // * Alter or create each table and column as necessary, removing unused tables and columns. // */ - // UPDATE_DROP_UNUNSED("UPDATE_DROP_UNUSED"); + // UPDATE_DROP_UNUNSED; } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/java/AbstractSpringDataCassandraConfiguration.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/java/AbstractSpringDataCassandraConfiguration.java index 973f7d625..0de077c04 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/java/AbstractSpringDataCassandraConfiguration.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/java/AbstractSpringDataCassandraConfiguration.java @@ -20,12 +20,15 @@ import java.util.Set; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.cassandra.config.java.AbstractCassandraConfiguration; +import org.springframework.cassandra.config.java.AbstractClusterConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.Configuration; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.data.annotation.Persistent; +import org.springframework.data.cassandra.config.CassandraDataSessionFactoryBean; +import org.springframework.data.cassandra.config.Mapping; +import org.springframework.data.cassandra.config.SchemaAction; import org.springframework.data.cassandra.convert.CassandraConverter; import org.springframework.data.cassandra.convert.MappingCassandraConverter; import org.springframework.data.cassandra.core.CassandraAdminOperations; @@ -44,27 +47,55 @@ import org.springframework.util.StringUtils; * @author Matthew T. Adams */ @Configuration -public abstract class AbstractSpringDataCassandraConfiguration extends AbstractCassandraConfiguration implements +public abstract class AbstractSpringDataCassandraConfiguration extends AbstractClusterConfiguration implements BeanClassLoaderAware { - private ClassLoader beanClassLoader; + protected abstract String getKeyspaceName(); + + protected ClassLoader beanClassLoader; + protected Mapping mapping = new Mapping(); + + /** + * The {@link SchemaAction} to perform. Defaults to {@link SchemaAction#NONE}. + */ + public SchemaAction getSchemaAction() { + return SchemaAction.NONE; + } /** * The base package to scan for entities annotated with {@link Table} annotations. By default, returns the package * name of {@literal this} (this.getClass().getPackage().getName()). */ - protected String getMappingBasePackage() { + public String getMappingBasePackage() { return getClass().getPackage().getName(); } + @Bean + public CassandraDataSessionFactoryBean session() throws Exception { + + CassandraDataSessionFactoryBean bean = new CassandraDataSessionFactoryBean(); + + bean.setCluster(cluster().getObject()); + bean.setConverter(converter()); + bean.setSchemaAction(getSchemaAction()); + bean.setKeyspaceName(getKeyspaceName()); + bean.setStartupScripts(getStartupScripts()); + bean.setShutdownScripts(getShutdownScripts()); + + bean.setEntityClassLoader(beanClassLoader); + bean.setMapping(mapping); + + return bean; + } + /** * Creates a {@link CassandraAdminTemplate}. * * @throws Exception */ @Bean - public CassandraAdminOperations adminTemplate() throws Exception { - return new CassandraAdminTemplate(session().getObject()); + public CassandraAdminOperations cassandraTemplate() throws Exception { + return new CassandraAdminTemplate(session().getObject(), converter()); } /** @@ -109,17 +140,24 @@ public abstract class AbstractSpringDataCassandraConfiguration extends AbstractC componentProvider.addIncludeFilter(new AnnotationTypeFilter(Table.class)); componentProvider.addIncludeFilter(new AnnotationTypeFilter(Persistent.class)); - // TODO: figure out which ClassLoader to use here - ClassLoader classLoader = getClass().getClassLoader(); - for (BeanDefinition candidate : componentProvider.findCandidateComponents(basePackage)) { - initialEntitySet.add(ClassUtils.forName(candidate.getBeanClassName(), classLoader)); + + Class clazz = ClassUtils.forName(candidate.getBeanClassName(), beanClassLoader); + initialEntitySet.add(clazz); } } + processMappingOverrides(initialEntitySet); + return initialEntitySet; } + protected void processMappingOverrides(Set> entityTypes) { + + // TODO: search for external entity mapping info (xml/properties/yaml/etc) here & update this.mapping + // similar to JPA's or JDO's external metadata search algorithms + } + @Override public void setBeanClassLoader(ClassLoader classLoader) { this.beanClassLoader = classLoader; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminOperations.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminOperations.java index d41d08ea4..c6e350040 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminOperations.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminOperations.java @@ -25,7 +25,7 @@ import com.datastax.driver.core.TableMetadata; * @author David Webb * @author Matthew T. Adams */ -public interface CassandraAdminOperations { +public interface CassandraAdminOperations extends CassandraOperations { /** * Create a table with the name given and fields corresponding to the given class. If the table already exists and @@ -38,9 +38,8 @@ public interface CassandraAdminOperations { * @param tableName The name of the table. * @param entityClass The class whose fields determine the columns created. * @param optionsByName Table options, given by the string option name and the appropriate option value. - * @return Returns true if a table was created, false if not. */ - boolean createTable(boolean ifNotExists, String tableName, Class entityClass, Map optionsByName); + void createTable(boolean ifNotExists, String tableName, Class entityClass, Map optionsByName); /** * Add columns to the given table from the given class. If parameter dropRemovedAttributColumns is true, then this diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminTemplate.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminTemplate.java index 09dbc902c..f15171ff7 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminTemplate.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraAdminTemplate.java @@ -7,14 +7,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cassandra.core.SessionCallback; import org.springframework.cassandra.core.cql.generator.CreateTableCqlGenerator; -import org.springframework.cassandra.support.CassandraAccessor; -import org.springframework.cassandra.support.CassandraExceptionTranslator; -import org.springframework.cassandra.support.exception.CassandraTableExistsException; import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.dao.support.PersistenceExceptionTranslator; import org.springframework.data.cassandra.convert.CassandraConverter; -import org.springframework.data.cassandra.mapping.CassandraMappingContext; import org.springframework.data.cassandra.mapping.CassandraPersistentEntity; import org.springframework.data.cassandra.util.CqlUtils; import org.springframework.util.Assert; @@ -26,77 +21,46 @@ import com.datastax.driver.core.TableMetadata; /** * Default implementation of {@link CassandraAdminOperations}. */ -public class CassandraAdminTemplate extends CassandraAccessor implements CassandraAdminOperations { +public class CassandraAdminTemplate extends CassandraTemplate implements CassandraAdminOperations { private static final Logger log = LoggerFactory.getLogger(CassandraAdminTemplate.class); - private CassandraConverter converter; - private CassandraMappingContext mappingContext; - - private final PersistenceExceptionTranslator exceptionTranslator = new CassandraExceptionTranslator(); - /** * Constructor used for a basic template configuration * * @param keyspace must not be {@literal null}. */ - public CassandraAdminTemplate(Session session) { - setSession(session); - } - - public void setCassandraConverter(CassandraConverter converter) { - Assert.notNull(converter); - this.converter = converter; - setMappingContext(this.converter.getCassandraMappingContext()); - } - - protected void setMappingContext(CassandraMappingContext mappingContext) { - Assert.notNull(mappingContext); - this.mappingContext = mappingContext; + public CassandraAdminTemplate(Session session, CassandraConverter converter) { + super(session, converter); } @Override - public boolean createTable(boolean ifNotExists, final String tableName, Class entityClass, + public void createTable(boolean ifNotExists, final String tableName, Class entityClass, Map optionsByName) { - try { - final CassandraPersistentEntity entity = mappingContext.getPersistentEntity(entityClass); + final CassandraPersistentEntity entity = getCassandraMappingContext().getPersistentEntity(entityClass); - execute(new SessionCallback() { - @Override - public Object doInSession(Session s) throws DataAccessException { + execute(new SessionCallback() { + @Override + public Object doInSession(Session s) throws DataAccessException { - String cql = new CreateTableCqlGenerator(mappingContext.getCreateTableSpecificationFor(entity)).toCql(); + String cql = new CreateTableCqlGenerator(getCassandraMappingContext().getCreateTableSpecificationFor(entity)) + .toCql(); - log.info("CREATE TABLE CQL -> " + cql); - - s.execute(cql); - return null; - } - }); - return true; - - } catch (CassandraTableExistsException ctex) { - return !ifNotExists; - } catch (RuntimeException x) { - throw tryToConvert(x); - } + s.execute(cql); + return null; + } + }); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraAdminOperations#alterTable(java.lang.String, java.lang.Class, boolean) - */ @Override public void alterTable(String tableName, Class entityClass, boolean dropRemovedAttributeColumns) { - // TODO Auto-generated method stub + throw new UnsupportedOperationException("not yet implemented"); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraAdminOperations#replaceTable(java.lang.String, java.lang.Class) - */ @Override public void replaceTable(String tableName, Class entityClass, Map optionsByName) { - // TODO + throw new UnsupportedOperationException("not yet implemented"); } /** @@ -107,12 +71,11 @@ public class CassandraAdminTemplate extends CassandraAccessor implements Cassand */ protected void doAlterTable(Class entityClass, String keyspace, String tableName) { - CassandraPersistentEntity entity = mappingContext.getPersistentEntity(entityClass); + CassandraPersistentEntity entity = getCassandraMappingContext().getPersistentEntity(entityClass); Assert.notNull(entity); final TableMetadata tableMetadata = getTableMetadata(keyspace, tableName); - final List queryList = CqlUtils.alterTable(tableName, entity, tableMetadata); execute(new SessionCallback() { @@ -126,26 +89,14 @@ public class CassandraAdminTemplate extends CassandraAccessor implements Cassand } return null; - } }); - } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#dropTable(java.lang.Class) - */ public void dropTable(Class entityClass) { - - final String tableName = determineTableName(entityClass); - - dropTable(tableName); - + dropTable(determineTableName(entityClass)); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#dropTable(java.lang.String) - */ @Override public void dropTable(String tableName) { @@ -155,62 +106,31 @@ public class CassandraAdminTemplate extends CassandraAccessor implements Cassand log.info(q); execute(new SessionCallback() { - @Override - public ResultSet doInSession(Session s) throws DataAccessException { - + public ResultSet doInSession(Session s) { return s.execute(q); - } - }); - } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#getTableMetadata(java.lang.Class) - */ @Override public TableMetadata getTableMetadata(final String keyspace, final String tableName) { Assert.notNull(tableName); return execute(new SessionCallback() { - @Override - public TableMetadata doInSession(Session s) throws DataAccessException { - + public TableMetadata doInSession(Session s) { return s.getCluster().getMetadata().getKeyspace(keyspace).getTable(tableName); } }); } - /** - * Execute a command at the Session Level - * - * @param callback - * @return - */ - protected T execute(SessionCallback callback) { - - Assert.notNull(callback); - - try { - return callback.doInSession(getSession()); - } catch (RuntimeException x) { - throw tryToConvert(x); - } - } - - protected RuntimeException tryToConvert(RuntimeException x) { - RuntimeException resolved = exceptionTranslator.translateExceptionIfPossible(x); - return resolved == null ? x : resolved; - } - /** * @param entityClass * @return */ + @Override public String determineTableName(Class entityClass) { if (entityClass == null) { @@ -218,12 +138,11 @@ public class CassandraAdminTemplate extends CassandraAccessor implements Cassand "No class parameter provided, entity table name can't be determined!"); } - CassandraPersistentEntity entity = mappingContext.getPersistentEntity(entityClass); + CassandraPersistentEntity entity = getCassandraMappingContext().getPersistentEntity(entityClass); if (entity == null) { throw new InvalidDataAccessApiUsageException("No Persitent Entity information found for the class " + entityClass.getName()); } return entity.getTableName(); } - } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraOperations.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraOperations.java index 97c08046f..db8a6c052 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraOperations.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraOperations.java @@ -17,6 +17,7 @@ package org.springframework.data.cassandra.core; import java.util.List; +import org.springframework.cassandra.core.CqlOperations; import org.springframework.cassandra.core.QueryOptions; import org.springframework.data.cassandra.convert.CassandraConverter; @@ -31,7 +32,7 @@ import com.datastax.driver.core.querybuilder.Select; * @author Matthew Adams * */ -public interface CassandraOperations { +public interface CassandraOperations extends CqlOperations { /** * The table name used for the specified class by this template. diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java index 7e929ccbc..9898088f1 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/CassandraTemplate.java @@ -30,11 +30,12 @@ import org.springframework.dao.DataAccessException; import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.cassandra.convert.CassandraConverter; +import org.springframework.data.cassandra.convert.MappingCassandraConverter; import org.springframework.data.cassandra.exception.EntityWriterException; +import org.springframework.data.cassandra.mapping.CassandraMappingContext; import org.springframework.data.cassandra.mapping.CassandraPersistentEntity; -import org.springframework.data.cassandra.mapping.CassandraPersistentProperty; +import org.springframework.data.cassandra.mapping.DefaultCassandraMappingContext; import org.springframework.data.cassandra.util.CqlUtils; -import org.springframework.data.mapping.context.MappingContext; import org.springframework.util.Assert; import com.datastax.driver.core.Query; @@ -74,9 +75,8 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation * Required elements for successful Template Operations. These can be set with the Constructor, or wired in * later. */ - private String keyspace; private CassandraConverter cassandraConverter; - private MappingContext, CassandraPersistentProperty> mappingContext; + private CassandraMappingContext mappingContext; /** * Default Constructor for wiring in the required components later @@ -90,7 +90,7 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation * @param session must not be {@literal null} */ public CassandraTemplate(Session session) { - this(session, null, null); + this(session, new MappingCassandraConverter(new DefaultCassandraMappingContext())); } /** @@ -100,46 +100,26 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation * @param converter must not be {@literal null}. */ public CassandraTemplate(Session session, CassandraConverter converter) { - this(session, converter, null); - } - - /** - * Constructor used for a basic template configuration - * - * @param session must not be {@literal null}. - * @param converter must not be {@literal null}. - * - * @deprecated use {@link #CassandraTemplate(Session, CassandraConverter)} because session should already be connected - * to keyspace - */ - @Deprecated - public CassandraTemplate(Session session, CassandraConverter converter, String keyspace) { setSession(session); - this.keyspace = keyspace; this.cassandraConverter = converter; - this.mappingContext = this.cassandraConverter.getMappingContext(); + this.mappingContext = cassandraConverter.getCassandraMappingContext(); + } + + public CassandraMappingContext getCassandraMappingContext() { + return mappingContext; } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#count(com.datastax.driver.core.querybuilder.Select) - */ @Override public Long count(Select selectQuery) { return doSelectCount(selectQuery); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#count(java.lang.String) - */ @Override public Long count(String tableName) { Select select = QueryBuilder.select().countAll().from(tableName); return doSelectCount(select); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List) - */ @Override public void delete(List entities) { String tableName = getTableName(entities.get(0).getClass()); @@ -147,9 +127,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation delete(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public void delete(List entities, QueryOptions options) { String tableName = getTableName(entities.get(0).getClass()); @@ -157,18 +134,12 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation delete(entities, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List, java.lang.String) - */ @Override public void delete(List entities, String tableName) { delete(entities, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.util.List, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public void delete(List entities, String tableName, QueryOptions options) { Assert.notNull(entities); @@ -177,9 +148,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation doBatchDelete(tableName, entities, options, false); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object) - */ @Override public void delete(T entity) { String tableName = getTableName(entity.getClass()); @@ -187,9 +155,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation delete(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public void delete(T entity, QueryOptions options) { String tableName = getTableName(entity.getClass()); @@ -197,17 +162,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation delete(entity, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object, java.lang.String) - */ @Override public void delete(T entity, String tableName) { delete(entity, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#delete(java.lang.Object, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public void delete(T entity, String tableName, QueryOptions options) { Assert.notNull(entity); @@ -215,9 +174,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation doDelete(tableName, entity, options, false); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.util.List) - */ @Override public void deleteAsynchronously(List entities) { String tableName = getTableName(entities.get(0).getClass()); @@ -225,9 +181,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation deleteAsynchronously(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.util.List, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public void deleteAsynchronously(List entities, QueryOptions options) { String tableName = getTableName(entities.get(0).getClass()); @@ -235,17 +188,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation deleteAsynchronously(entities, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.util.List, java.lang.String) - */ @Override public void deleteAsynchronously(List entities, String tableName) { deleteAsynchronously(entities, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.util.List, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public void deleteAsynchronously(List entities, String tableName, QueryOptions options) { Assert.notNull(entities); @@ -254,9 +201,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation doBatchDelete(tableName, entities, options, true); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.lang.Object) - */ @Override public void deleteAsynchronously(T entity) { String tableName = getTableName(entity.getClass()); @@ -264,9 +208,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation deleteAsynchronously(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public void deleteAsynchronously(T entity, QueryOptions options) { String tableName = getTableName(entity.getClass()); @@ -274,17 +215,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation deleteAsynchronously(entity, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.lang.Object, java.lang.String) - */ @Override public void deleteAsynchronously(T entity, String tableName) { deleteAsynchronously(entity, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#deleteAsynchronously(java.lang.Object, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public void deleteAsynchronously(T entity, String tableName, QueryOptions options) { Assert.notNull(entity); @@ -311,25 +246,16 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return entity.getTableName(); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#getConverter() - */ @Override public CassandraConverter getConverter() { return cassandraConverter; } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#getTableName(java.lang.Class) - */ @Override public String getTableName(Class entityClass) { return determineTableName(entityClass); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List) - */ @Override public List insert(List entities) { String tableName = getTableName(entities.get(0).getClass()); @@ -337,9 +263,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return insert(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public List insert(List entities, QueryOptions options) { String tableName = getTableName(entities.get(0).getClass()); @@ -347,17 +270,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return insert(entities, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List, java.lang.String) - */ @Override public List insert(List entities, String tableName) { return insert(entities, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.util.List, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public List insert(List entities, String tableName, QueryOptions options) { Assert.notNull(entities); @@ -366,9 +283,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return doBatchInsert(tableName, entities, options, false); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object) - */ @Override public T insert(T entity) { String tableName = determineTableName(entity); @@ -376,9 +290,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return insert(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public T insert(T entity, QueryOptions options) { String tableName = determineTableName(entity); @@ -386,17 +297,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return insert(entity, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object, java.lang.String) - */ @Override public T insert(T entity, String tableName) { return insert(entity, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insert(java.lang.Object, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public T insert(T entity, String tableName, QueryOptions options) { Assert.notNull(entity); @@ -405,9 +310,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return doInsert(tableName, entity, options, false); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List) - */ @Override public List insertAsynchronously(List entities) { String tableName = getTableName(entities.get(0).getClass()); @@ -415,9 +317,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return insertAsynchronously(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public List insertAsynchronously(List entities, QueryOptions options) { String tableName = getTableName(entities.get(0).getClass()); @@ -425,17 +324,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return insertAsynchronously(entities, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List, java.lang.String) - */ @Override public List insertAsynchronously(List entities, String tableName) { return insertAsynchronously(entities, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.util.List, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public List insertAsynchronously(List entities, String tableName, QueryOptions options) { Assert.notNull(entities); @@ -444,9 +337,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return doBatchInsert(tableName, entities, options, true); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object) - */ @Override public T insertAsynchronously(T entity) { String tableName = determineTableName(entity); @@ -454,9 +344,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return insertAsynchronously(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public T insertAsynchronously(T entity, QueryOptions options) { String tableName = determineTableName(entity); @@ -464,17 +351,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return insertAsynchronously(entity, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object, java.lang.String) - */ @Override public T insertAsynchronously(T entity, String tableName) { return insertAsynchronously(entity, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#insertAsynchronously(java.lang.Object, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public T insertAsynchronously(T entity, String tableName, QueryOptions options) { Assert.notNull(entity); @@ -485,41 +366,26 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return doInsert(tableName, entity, options, true); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#select(com.datastax.driver.core.querybuilder.Select, java.lang.Class) - */ @Override public List select(Select cql, Class selectClass) { return select(cql.getQueryString(), selectClass); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#select(java.lang.String, java.lang.Class) - */ @Override public List select(String cql, Class selectClass) { return doSelect(cql, new ReadRowCallback(cassandraConverter, selectClass)); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#selectOne(com.datastax.driver.core.querybuilder.Select, java.lang.Class) - */ @Override public T selectOne(Select selectQuery, Class selectClass) { return selectOne(selectQuery.getQueryString(), selectClass); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#selectOne(java.lang.String, java.lang.Class) - */ @Override public T selectOne(String cql, Class selectClass) { return doSelectOne(cql, new ReadRowCallback(cassandraConverter, selectClass)); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List) - */ @Override public List update(List entities) { String tableName = getTableName(entities.get(0).getClass()); @@ -527,9 +393,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return update(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public List update(List entities, QueryOptions options) { String tableName = getTableName(entities.get(0).getClass()); @@ -537,17 +400,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return update(entities, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List, java.lang.String) - */ @Override public List update(List entities, String tableName) { return update(entities, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.util.List, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public List update(List entities, String tableName, QueryOptions options) { Assert.notNull(entities); @@ -556,9 +413,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return doBatchUpdate(tableName, entities, options, false); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object) - */ @Override public T update(T entity) { String tableName = getTableName(entity.getClass()); @@ -566,9 +420,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return update(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public T update(T entity, QueryOptions options) { String tableName = getTableName(entity.getClass()); @@ -576,17 +427,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return update(entity, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object, java.lang.String) - */ @Override public T update(T entity, String tableName) { return update(entity, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#update(java.lang.Object, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public T update(T entity, String tableName, QueryOptions options) { Assert.notNull(entity); @@ -594,9 +439,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return doUpdate(tableName, entity, options, false); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List) - */ @Override public List updateAsynchronously(List entities) { String tableName = getTableName(entities.get(0).getClass()); @@ -604,9 +446,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return updateAsynchronously(entities, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public List updateAsynchronously(List entities, QueryOptions options) { String tableName = getTableName(entities.get(0).getClass()); @@ -614,17 +453,11 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return updateAsynchronously(entities, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List, java.lang.String) - */ @Override public List updateAsynchronously(List entities, String tableName) { return updateAsynchronously(entities, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.util.List, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public List updateAsynchronously(List entities, String tableName, QueryOptions options) { Assert.notNull(entities); @@ -633,9 +466,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return doBatchUpdate(tableName, entities, options, true); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object) - */ @Override public T updateAsynchronously(T entity) { String tableName = getTableName(entity.getClass()); @@ -643,9 +473,6 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return updateAsynchronously(entity, tableName); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public T updateAsynchronously(T entity, QueryOptions options) { String tableName = getTableName(entity.getClass()); @@ -653,18 +480,12 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation return updateAsynchronously(entity, tableName, options); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object, java.lang.String) - */ @Override public T updateAsynchronously(T entity, String tableName) { return updateAsynchronously(entity, tableName, null); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.CassandraOperations#updateAsynchronously(java.lang.Object, java.lang.String, org.springframework.data.cassandra.core.QueryOptions) - */ @Override public T updateAsynchronously(T entity, String tableName, QueryOptions options) { Assert.notNull(entity); @@ -793,7 +614,7 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation try { - final Batch b = CqlUtils.toDeleteBatchQuery(keyspace, tableName, entities, options, cassandraConverter); + final Batch b = CqlUtils.toDeleteBatchQuery(tableName, entities, options, cassandraConverter); logger.info(b.toString()); doExecute(new SessionCallback() { @@ -834,7 +655,7 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation try { - final Batch b = CqlUtils.toInsertBatchQuery(keyspace, tableName, entities, options, cassandraConverter); + final Batch b = CqlUtils.toInsertBatchQuery(tableName, entities, options, cassandraConverter); logger.info(b.getQueryString()); return doExecute(new SessionCallback>() { @@ -875,7 +696,7 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation try { - final Batch b = CqlUtils.toUpdateBatchQuery(keyspace, tableName, entities, options, cassandraConverter); + final Batch b = CqlUtils.toUpdateBatchQuery(tableName, entities, options, cassandraConverter); logger.info(b.toString()); return doExecute(new SessionCallback>() { @@ -911,7 +732,7 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation try { - final Query q = CqlUtils.toDeleteQuery(keyspace, tableName, objectToRemove, options, cassandraConverter); + final Query q = CqlUtils.toDeleteQuery(tableName, objectToRemove, options, cassandraConverter); logger.info(q.toString()); doExecute(new SessionCallback() { @@ -967,7 +788,7 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation try { - final Query q = CqlUtils.toInsertQuery(keyspace, tableName, entity, options, cassandraConverter); + final Query q = CqlUtils.toInsertQuery(tableName, entity, options, cassandraConverter); logger.info(q.toString()); if (q.getConsistencyLevel() != null) { @@ -1014,7 +835,7 @@ public class CassandraTemplate extends CqlTemplate implements CassandraOperation try { - final Query q = CqlUtils.toUpdateQuery(keyspace, tableName, entity, options, cassandraConverter); + final Query q = CqlUtils.toUpdateQuery(tableName, entity, options, cassandraConverter); logger.info(q.toString()); return doExecute(new SessionCallback() { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoriesRegistrar.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoriesRegistrar.java index ac9a1c13a..ff770aad0 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoriesRegistrar.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoriesRegistrar.java @@ -25,30 +25,17 @@ import org.springframework.data.repository.config.RepositoryConfigurationExtensi * {@link ImportBeanDefinitionRegistrar} to setup Cassandra repositories via {@link EnableCassandraRepositories}. * * @author Alex Shvid - * + * @author Matthew T. Adams */ public class CassandraRepositoriesRegistrar extends RepositoryBeanDefinitionRegistrarSupport { - /* - * (non-Javadoc) - * - * @see org.springframework.data.repository.config. - * RepositoryBeanDefinitionRegistrarSupport#getAnnotation() - */ @Override protected Class getAnnotation() { return EnableCassandraRepositories.class; } - /* - * (non-Javadoc) - * - * @see org.springframework.data.repository.config. - * RepositoryBeanDefinitionRegistrarSupport#getExtension() - */ @Override protected RepositoryConfigurationExtension getExtension() { return new CassandraRepositoryConfigurationExtension(); } - } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoryConfigurationExtension.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoryConfigurationExtension.java index 2a1f63451..a687457e8 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoryConfigurationExtension.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/CassandraRepositoryConfigurationExtension.java @@ -34,43 +34,26 @@ import org.w3c.dom.Element; */ public class CassandraRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport { - private static final String CASSANDRA_TEMPLATE_REF = "cql-template-ref"; - private static final String CREATE_QUERY_INDEXES = "create-query-indexes"; + private static final String CASSANDRA_TEMPLATE_REF = "cassandra-template-ref"; - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getModulePrefix() - */ @Override protected String getModulePrefix() { return "cassandra"; } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtension#getRepositoryFactoryClassName() - */ + @Override public String getRepositoryFactoryClassName() { return CassandraRepositoryFactoryBean.class.getName(); } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#postProcess(org.springframework.beans.factory.support.BeanDefinitionBuilder, org.springframework.data.repository.config.XmlRepositoryConfigurationSource) - */ @Override public void postProcess(BeanDefinitionBuilder builder, XmlRepositoryConfigurationSource config) { Element element = config.getElement(); ParsingUtils.setPropertyReference(builder, element, CASSANDRA_TEMPLATE_REF, "cassandraTemplate"); - ParsingUtils.setPropertyValue(builder, element, CREATE_QUERY_INDEXES, "createIndexesForQueryMethods"); } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#postProcess(org.springframework.beans.factory.support.BeanDefinitionBuilder, org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource) - */ @Override public void postProcess(BeanDefinitionBuilder builder, AnnotationRepositoryConfigurationSource config) { @@ -80,7 +63,6 @@ public class CassandraRepositoryConfigurationExtension extends RepositoryConfigu if (StringUtils.hasText(cassandraTemplateRef)) { builder.addPropertyReference("cassandraTemplate", cassandraTemplateRef); } - builder.addPropertyValue("createIndexesForQueryMethods", attributes.getBoolean("createIndexesForQueryMethods")); } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/EnableCassandraRepositories.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/EnableCassandraRepositories.java index bb035f913..b16a9b1de 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/EnableCassandraRepositories.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/config/EnableCassandraRepositories.java @@ -34,9 +34,8 @@ import org.springframework.data.repository.query.QueryLookupStrategy.Key; * Annotation to enable Cassandra repositories. * * @author Alex Shvid - * + * @author Matthew T. Adams */ - @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @@ -114,12 +113,4 @@ public @interface EnableCassandraRepositories { * @return */ String cassandraTemplateRef() default "cassandraTemplate"; - - /** - * Whether to automatically create indexes for query methods defined in the repository interface. - * - * @return - */ - boolean createIndexesForQueryMethods() default false; - } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/CassandraRepositoryFactoryBean.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/CassandraRepositoryFactoryBean.java index 833329528..235f91e46 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/CassandraRepositoryFactoryBean.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/repository/support/CassandraRepositoryFactoryBean.java @@ -45,7 +45,7 @@ public class CassandraRepositoryFactoryBean, S, ID e * * @param operations the operations to set */ - public void setCassandraDataTemplate(CassandraTemplate cassandraTemplate) { + public void setCassandraTemplate(CassandraTemplate cassandraTemplate) { this.cassandraTemplate = cassandraTemplate; setMappingContext(cassandraTemplate.getConverter().getMappingContext()); } 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 8273aa2dc..5b51d6f35 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 @@ -28,7 +28,7 @@ import com.datastax.driver.core.querybuilder.Update; * * @author Alex Shvid * @author David Webb - * + * @author Matthew T. Adams */ public abstract class CqlUtils { @@ -118,7 +118,6 @@ public abstract class CqlUtils { /** * Generates a Query Object for an insert * - * @param keyspaceName * @param tableName * @param objectToSave * @param entity @@ -127,10 +126,10 @@ public abstract class CqlUtils { * @return The Query object to run with session.execute(); * @throws EntityWriterException */ - public static Query toInsertQuery(String keyspaceName, String tableName, final Object objectToSave, - QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { + public static Query toInsertQuery(String tableName, final Object objectToSave, QueryOptions options, + EntityWriter entityWriter) throws EntityWriterException { - final Insert q = QueryBuilder.insertInto(keyspaceName, tableName); + final Insert q = QueryBuilder.insertInto(tableName); /* * Write properties @@ -156,7 +155,6 @@ public abstract class CqlUtils { /** * Generates a Query Object for an Update * - * @param keyspaceName * @param tableName * @param objectToSave * @param entity @@ -165,10 +163,10 @@ public abstract class CqlUtils { * @return The Query object to run with session.execute(); * @throws EntityWriterException */ - public static Query toUpdateQuery(String keyspaceName, String tableName, final Object objectToSave, - QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { + public static Query toUpdateQuery(String tableName, final Object objectToSave, QueryOptions options, + EntityWriter entityWriter) throws EntityWriterException { - final Update q = QueryBuilder.update(keyspaceName, tableName); + final Update q = QueryBuilder.update(tableName); /* * Write properties @@ -194,7 +192,6 @@ public abstract class CqlUtils { /** * Generates a Batch Object for multiple Updates * - * @param keyspaceName * @param tableName * @param objectsToSave * @param entity @@ -203,9 +200,8 @@ public abstract class CqlUtils { * @return The Query object to run with session.execute(); * @throws EntityWriterException */ - public static Batch toUpdateBatchQuery(final String keyspaceName, final String tableName, - final List objectsToSave, QueryOptions options, EntityWriter entityWriter) - throws EntityWriterException { + public static Batch toUpdateBatchQuery(final String tableName, final List objectsToSave, QueryOptions options, + EntityWriter entityWriter) throws EntityWriterException { /* * Return variable is a Batch statement @@ -214,7 +210,7 @@ public abstract class CqlUtils { for (final T objectToSave : objectsToSave) { - b.add((Statement) toUpdateQuery(keyspaceName, tableName, objectToSave, options, entityWriter)); + b.add((Statement) toUpdateQuery(tableName, objectToSave, options, entityWriter)); } @@ -230,7 +226,6 @@ public abstract class CqlUtils { /** * Generates a Batch Object for multiple inserts * - * @param keyspaceName * @param tableName * @param objectsToSave * @param entity @@ -239,9 +234,8 @@ public abstract class CqlUtils { * @return The Query object to run with session.execute(); * @throws EntityWriterException */ - public static Batch toInsertBatchQuery(final String keyspaceName, final String tableName, - final List objectsToSave, QueryOptions options, EntityWriter entityWriter) - throws EntityWriterException { + public static Batch toInsertBatchQuery(final String tableName, final List objectsToSave, QueryOptions options, + EntityWriter entityWriter) throws EntityWriterException { /* * Return variable is a Batch statement @@ -250,7 +244,7 @@ public abstract class CqlUtils { for (final T objectToSave : objectsToSave) { - b.add((Statement) toInsertQuery(keyspaceName, tableName, objectToSave, options, entityWriter)); + b.add((Statement) toInsertQuery(tableName, objectToSave, options, entityWriter)); } @@ -266,7 +260,6 @@ public abstract class CqlUtils { /** * Create a Delete Query Object from an annotated POJO * - * @param keyspace * @param tableName * @param objectToRemove * @param entity @@ -274,11 +267,11 @@ public abstract class CqlUtils { * @return * @throws EntityWriterException */ - public static Query toDeleteQuery(String keyspace, String tableName, final Object objectToRemove, - QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { + public static Query toDeleteQuery(String tableName, final Object objectToRemove, QueryOptions options, + EntityWriter entityWriter) throws EntityWriterException { final Delete.Selection ds = QueryBuilder.delete(); - final Delete q = ds.from(keyspace, tableName); + final Delete q = ds.from(tableName); final Where w = q.where(); /* @@ -332,7 +325,6 @@ public abstract class CqlUtils { /** * Create a Batch Query object for multiple deletes. * - * @param keyspaceName * @param tableName * @param entities * @param entity @@ -341,8 +333,8 @@ public abstract class CqlUtils { * @return * @throws EntityWriterException */ - public static Batch toDeleteBatchQuery(String keyspaceName, String tableName, List entities, - QueryOptions options, EntityWriter entityWriter) throws EntityWriterException { + public static Batch toDeleteBatchQuery(String tableName, List entities, QueryOptions options, + EntityWriter entityWriter) throws EntityWriterException { /* * Return variable is a Batch statement @@ -351,7 +343,7 @@ public abstract class CqlUtils { for (final T objectToSave : entities) { - b.add((Statement) toDeleteQuery(keyspaceName, tableName, objectToSave, options, entityWriter)); + b.add((Statement) toDeleteQuery(tableName, objectToSave, options, entityWriter)); } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/AbstractSpringDataEmbeddedCassandraIntegrationTest.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/AbstractSpringDataEmbeddedCassandraIntegrationTest.java new file mode 100644 index 000000000..da701f3ff --- /dev/null +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/AbstractSpringDataEmbeddedCassandraIntegrationTest.java @@ -0,0 +1,14 @@ +package org.springframework.data.cassandra.test.integration; + +import org.springframework.cassandra.test.integration.AbstractEmbeddedCassandraIntegrationTest; +import org.springframework.data.cassandra.test.integration.support.SpringDataBuildProperties; + +public class AbstractSpringDataEmbeddedCassandraIntegrationTest extends AbstractEmbeddedCassandraIntegrationTest { + + static { + // override necessary superclass statics + + SpringDataBuildProperties props = new SpringDataBuildProperties(); + CASSANDRA_NATIVE_PORT = props.getCassandraPort(); + } +} 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 7eb3f69ed..3099814bc 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 @@ -25,7 +25,7 @@ public class CassandraNamespaceTests { @BeforeClass public static void startCassandra() throws IOException, TTransportException, ConfigurationException, InterruptedException { - EmbeddedCassandraServerHelper.startEmbeddedCassandra("cassandra.yaml"); + EmbeddedCassandraServerHelper.startEmbeddedCassandra("spring-cassandra.yaml"); } @After 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 cd47ad815..9ec75b2bc 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 @@ -5,8 +5,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.config.java.AbstractSpringDataCassandraConfiguration; import org.springframework.data.cassandra.convert.CassandraConverter; import org.springframework.data.cassandra.convert.MappingCassandraConverter; -import org.springframework.data.cassandra.core.CassandraOperations; -import org.springframework.data.cassandra.core.CassandraTemplate; +import org.springframework.data.cassandra.core.CassandraAdminOperations; +import org.springframework.data.cassandra.core.CassandraAdminTemplate; import org.springframework.data.cassandra.mapping.DefaultCassandraMappingContext; import org.springframework.data.cassandra.test.integration.support.SpringDataBuildProperties; @@ -40,8 +40,9 @@ public class TestConfig extends AbstractSpringDataCassandraConfiguration { return new MappingCassandraConverter(new DefaultCassandraMappingContext()); } + @Override @Bean - public CassandraOperations cassandraTemplate() throws Exception { - return new CassandraTemplate(session().getObject(), converter(), KEYSPACE_NAME); + public CassandraAdminOperations cassandraTemplate() throws Exception { + return new CassandraAdminTemplate(session().getObject(), converter()); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/mapping/BasicCassandraPersistentEntityIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/mapping/BasicCassandraPersistentEntityIntegrationTests.java index b5940e112..b5f2e88d6 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/mapping/BasicCassandraPersistentEntityIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/mapping/BasicCassandraPersistentEntityIntegrationTests.java @@ -49,7 +49,7 @@ public class BasicCassandraPersistentEntityIntegrationTests { @BeforeClass public static void startCassandra() throws IOException, TTransportException, ConfigurationException, InterruptedException { - EmbeddedCassandraServerHelper.startEmbeddedCassandra("cassandra.yaml"); + EmbeddedCassandraServerHelper.startEmbeddedCassandra("spring-cassandra.yaml"); } @Test diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/table/User.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/User.java similarity index 98% rename from spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/table/User.java rename to spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/User.java index 08179459a..28eb75e7d 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/table/User.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/User.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.cassandra.test.integration.table; +package org.springframework.data.cassandra.test.integration.repository; import java.util.Set; diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepository.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepository.java index 99256f7f3..b0c53bad7 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepository.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepository.java @@ -16,7 +16,6 @@ package org.springframework.data.cassandra.test.integration.repository; import org.springframework.data.cassandra.repository.CassandraRepository; -import org.springframework.data.cassandra.test.integration.table.User; /** * Sample repository managing {@link User} entities. @@ -25,5 +24,4 @@ import org.springframework.data.cassandra.test.integration.table.User; * */ public interface UserRepository extends CassandraRepository { - } 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 4fb35ab01..09554ceaf 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 @@ -21,17 +21,19 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertThat; -import java.io.IOException; import java.util.Arrays; import java.util.List; -import org.apache.cassandra.exceptions.ConfigurationException; -import org.apache.thrift.transport.TTransportException; -import org.cassandraunit.utils.EmbeddedCassandraServerHelper; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.cassandra.core.CassandraOperations; -import org.springframework.data.cassandra.test.integration.table.User; +import org.springframework.data.cassandra.test.integration.AbstractSpringDataEmbeddedCassandraIntegrationTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.google.common.collect.Lists; @@ -39,29 +41,23 @@ import com.google.common.collect.Lists; * Base class for tests for {@link UserRepository}. * * @author Alex Shvid - * + * @author Matthew T. Adams */ -// @ContextConfiguration(classes = UserRepositoryIntegrationTestsConfig.class) -// @RunWith(SpringJUnit4ClassRunner.class) -public class UserRepositoryIntegrationTests { +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = UserRepositoryIntegrationTestsConfig.class) +public class UserRepositoryIntegrationTests extends AbstractSpringDataEmbeddedCassandraIntegrationTest { @Autowired protected UserRepository repository; @Autowired - protected CassandraOperations dataOperations; + protected CassandraOperations template; User tom, bob, alice, scott; List all; - // @BeforeClass - public static void startCassandra() throws IOException, TTransportException, ConfigurationException, - InterruptedException { - EmbeddedCassandraServerHelper.startEmbeddedCassandra("cassandra.yaml"); - } - - // @Before + @Before public void setUp() throws InterruptedException { repository.deleteAll(); @@ -94,10 +90,15 @@ public class UserRepositoryIntegrationTests { scott.setPassword("444"); scott.setPlace("Boston"); - all = dataOperations.insert(Arrays.asList(tom, bob, alice, scott)); + all = template.insert(Arrays.asList(tom, bob, alice, scott)); } - // @Test + @After + public void after() { + repository.deleteAll(); + } + + @Test public void findsUserById() throws Exception { User user = repository.findOne(bob.getUsername()); @@ -106,7 +107,7 @@ public class UserRepositoryIntegrationTests { } - // @Test + @Test public void findsAll() throws Exception { List result = Lists.newArrayList(repository.findAll()); assertThat(result.size(), is(all.size())); @@ -114,7 +115,7 @@ public class UserRepositoryIntegrationTests { } - // @Test + @Test public void findsAllWithGivenIds() { Iterable result = repository.findAll(Arrays.asList(bob.getUsername(), tom.getUsername())); @@ -122,7 +123,7 @@ public class UserRepositoryIntegrationTests { assertThat(result, not(hasItems(alice, scott))); } - // @Test + @Test public void deletesUserCorrectly() throws Exception { repository.delete(tom); @@ -133,7 +134,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/repository/UserRepositoryIntegrationTestsConfig.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTestsConfig.java index 1e0bb7534..5477d5507 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTestsConfig.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryIntegrationTestsConfig.java @@ -1,11 +1,18 @@ package org.springframework.data.cassandra.test.integration.repository; +import static org.springframework.cassandra.core.keyspace.CreateKeyspaceSpecification.createKeyspace; + import java.util.ArrayList; import java.util.List; import org.springframework.cassandra.core.keyspace.CreateKeyspaceSpecification; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.cassandra.config.SchemaAction; +import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories; import org.springframework.data.cassandra.test.integration.support.AbstractDataTestJavaConfig; +@Configuration +@EnableCassandraRepositories(basePackageClasses = UserRepository.class) public class UserRepositoryIntegrationTestsConfig extends AbstractDataTestJavaConfig { @Override @@ -17,8 +24,18 @@ public class UserRepositoryIntegrationTestsConfig extends AbstractDataTestJavaCo protected List getKeyspaceCreations() { List creates = new ArrayList(); - // TODO + creates.add(createKeyspace().name(getKeyspaceName()).withSimpleReplication()); return creates; } + + @Override + public SchemaAction getSchemaAction() { + return SchemaAction.RECREATE; + } + + @Override + public String getMappingBasePackage() { + return User.class.getPackage().getName(); + } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/support/AbstractDataTestJavaConfig.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/support/AbstractDataTestJavaConfig.java index bd49e2749..f9c7fd362 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/support/AbstractDataTestJavaConfig.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/support/AbstractDataTestJavaConfig.java @@ -1,10 +1,10 @@ package org.springframework.data.cassandra.test.integration.support; -import org.springframework.cassandra.config.java.AbstractCassandraConfiguration; +import org.springframework.data.cassandra.config.java.AbstractSpringDataCassandraConfiguration; -public abstract class AbstractDataTestJavaConfig extends AbstractCassandraConfiguration { +public abstract class AbstractDataTestJavaConfig extends AbstractSpringDataCassandraConfiguration { - public static SpringDataBuildProperties PROPS = new SpringDataBuildProperties(); + public static final SpringDataBuildProperties PROPS = new SpringDataBuildProperties(); public static final int PORT = PROPS.getCassandraPort(); @Override diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/table/Domain.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/table/Domain.java new file mode 100644 index 000000000..d0ea555d7 --- /dev/null +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/table/Domain.java @@ -0,0 +1,11 @@ +package org.springframework.data.cassandra.test.integration.table; + +import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories; + +/** + * Spring Data Cassandra marker interface for use with {@link EnableCassandraRepositories#basePackageClasses()} + * + * @author Matthew T. Adams + */ +public interface Domain { +} diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/template/CassandraAdminTest.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/template/CassandraAdminTest.java index 3392612d5..d5ccd5d79 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/template/CassandraAdminTest.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/template/CassandraAdminTest.java @@ -54,7 +54,7 @@ public class CassandraAdminTest { @BeforeClass public static void startCassandra() throws IOException, TTransportException, ConfigurationException, InterruptedException { - EmbeddedCassandraServerHelper.startEmbeddedCassandra("cassandra.yaml"); + EmbeddedCassandraServerHelper.startEmbeddedCassandra("spring-cassandra.yaml"); /* * Load data file to creat the test keyspace before we init the template 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 7f7e5fe0c..56ae82be3 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 @@ -66,7 +66,7 @@ public class CassandraDataOperationsTest { private static Logger log = LoggerFactory.getLogger(CassandraDataOperationsTest.class); public static final SpringDataBuildProperties PROPS = new SpringDataBuildProperties(); - private final static String CASSANDRA_CONFIG = "cassandra.yaml"; + private final static String CASSANDRA_CONFIG = "spring-cassandra.yaml"; private final static String KEYSPACE_NAME = "test"; private final static String CASSANDRA_HOST = "localhost"; private final static int CASSANDRA_NATIVE_PORT = PROPS.getCassandraPort(); diff --git a/spring-data-cassandra/src/test/resources/logback.xml b/spring-data-cassandra/src/test/resources/logback-test.xml similarity index 85% rename from spring-data-cassandra/src/test/resources/logback.xml rename to spring-data-cassandra/src/test/resources/logback-test.xml index 38a367981..d28b214b6 100644 --- a/spring-data-cassandra/src/test/resources/logback.xml +++ b/spring-data-cassandra/src/test/resources/logback-test.xml @@ -5,12 +5,12 @@ %d %5p | %t | %-55logger{55} | %m | %n - + - + 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 c8f75cf2e..c20c961d4 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 @@ -43,7 +43,7 @@ cassandra-converter-ref="cassandra-converter" schema-action="CREATE"> + class="org.springframework.data.cassandra.test.integration.repository.User"> diff --git a/spring-data-cassandra/src/test/resources/cassandra.yaml b/spring-data-cassandra/src/test/resources/spring-cassandra.yaml similarity index 100% rename from spring-data-cassandra/src/test/resources/cassandra.yaml rename to spring-data-cassandra/src/test/resources/spring-cassandra.yaml