diff --git a/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/DefaultBeanNames.java b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/DefaultBeanNames.java index c50dc5316..89b34678b 100644 --- a/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/DefaultBeanNames.java +++ b/spring-cassandra/src/main/java/org/springframework/cassandra/config/xml/DefaultBeanNames.java @@ -22,7 +22,7 @@ package org.springframework.cassandra.config.xml; */ public interface DefaultBeanNames { - public static final String CLUSTER = "cassandra-cluster"; - public static final String SESSION = "cassandra-session"; - public static final String TEMPLATE = "cql-template"; + public static final String CLUSTER = "cassandraCluster"; + public static final String SESSION = "cassandraSession"; + public static final String TEMPLATE = "cqlTemplate"; } diff --git a/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/PropertyPlaceholderNamespaceCreatingXmlConfigTest-context.xml b/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/PropertyPlaceholderNamespaceCreatingXmlConfigTest-context.xml index 906a2a32f..8259eb66c 100644 --- a/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/PropertyPlaceholderNamespaceCreatingXmlConfigTest-context.xml +++ b/spring-cassandra/src/test/resources/org/springframework/cassandra/test/integration/config/xml/PropertyPlaceholderNamespaceCreatingXmlConfigTest-context.xml @@ -10,69 +10,66 @@ location="classpath:/org/springframework/cassandra/test/integration/config/xml/ppncxct.properties" /> - - + + - + - - - + + + - - - - - + - + + + + - + - + - - - + max-simultaneous-requests="${remote.max.requests}" core-connections="${remote.core.connections}" + max-connections="${remote.max.connections}" /> + + + - - + + - - + - + 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 index 7f63c803a..c779fde4b 100644 --- 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 @@ -9,8 +9,8 @@ - + @@ -18,16 +18,15 @@ min-simultaneous-requests="25" max-simultaneous-requests="100" core-connections="1" max-connections="2" /> + connect-timeout-millis="5000" keep-alive="true" read-timeout-millis="60000" + reuse-address="true" so-linger="60" tcp-no-delay="true" + receive-buffer-size="65536" send-buffer-size="65536" /> - + - + diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataCassandraMappingContextFactoryBean.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataCassandraMappingContextFactoryBean.java new file mode 100644 index 000000000..3a087a06c --- /dev/null +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataCassandraMappingContextFactoryBean.java @@ -0,0 +1,46 @@ +package org.springframework.data.cassandra.config; + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.data.cassandra.mapping.CassandraMappingContext; +import org.springframework.data.cassandra.mapping.DefaultCassandraMappingContext; + +public class CassandraDataCassandraMappingContextFactoryBean implements FactoryBean, + InitializingBean { + + protected Set basePackages = new HashSet(); + + @Override + public void afterPropertiesSet() throws Exception { + } + + @Override + public CassandraMappingContext getObject() throws Exception { + + DefaultCassandraMappingContext cmc = new DefaultCassandraMappingContext(); + cmc.setInitialEntitySet(new CassandraEntityClassScanner(basePackages).scanForEntityClasses()); + + return cmc; + } + + @Override + public Class getObjectType() { + return CassandraMappingContext.class; + } + + @Override + public boolean isSingleton() { + return true; + } + + public Set getBasePackages() { + return basePackages; + } + + public void setBasePackages(Set basePackages) { + this.basePackages = basePackages; + } +} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataMappingConverterFactoryBean.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataMappingConverterFactoryBean.java new file mode 100644 index 000000000..48fba014a --- /dev/null +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraDataMappingConverterFactoryBean.java @@ -0,0 +1,49 @@ +package org.springframework.data.cassandra.config; + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.data.cassandra.convert.CassandraConverter; +import org.springframework.data.cassandra.convert.MappingCassandraConverter; +import org.springframework.data.cassandra.mapping.CassandraMappingContext; +import org.springframework.util.Assert; + +public class CassandraDataMappingConverterFactoryBean implements FactoryBean, InitializingBean { + + protected CassandraMappingContext mappingContext; + protected Set basePackages = new HashSet(); + + @Override + public void afterPropertiesSet() throws Exception { + Assert.notNull(mappingContext); + Assert.notNull(basePackages); + } + + @Override + public CassandraConverter getObject() throws Exception { + return new MappingCassandraConverter(mappingContext); + } + + @Override + public Class getObjectType() { + return CassandraConverter.class; + } + + @Override + public boolean isSingleton() { + return true; + } + + public CassandraMappingContext getMappingContext() { + return mappingContext; + } + + public void setMappingContext(CassandraMappingContext mappingContext) { + + Assert.notNull(mappingContext); + + this.mappingContext = mappingContext; + } +} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraEntityClassScanner.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraEntityClassScanner.java new file mode 100644 index 000000000..aeef0a590 --- /dev/null +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CassandraEntityClassScanner.java @@ -0,0 +1,110 @@ +package org.springframework.data.cassandra.config; + +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.data.annotation.Persistent; +import org.springframework.data.cassandra.mapping.PrimaryKeyClass; +import org.springframework.data.cassandra.mapping.Table; +import org.springframework.util.ClassUtils; +import org.springframework.util.StringUtils; + +/** + * Scans packages for Cassandra entities. + * + * @author Matthew T. Adams + */ +public class CassandraEntityClassScanner { + + protected Set entityBasePackages = new HashSet(); + protected Set> entityBasePackageClasses = new HashSet>(); + protected ClassLoader beanClassLoader; + + public CassandraEntityClassScanner() { + } + + public CassandraEntityClassScanner(Collection entityBasePackages) { + this(entityBasePackages, null); + } + + public CassandraEntityClassScanner(Collection entityBasePackages, + Collection> entityBasePackageClasses) { + + setEntityBasePackages(entityBasePackages); + setEntityBasePackageClasses(entityBasePackageClasses); + } + + public Set getEntityBasePackages() { + return Collections.unmodifiableSet(entityBasePackages); + } + + public void setEntityBasePackages(Collection entityBasePackages) { + this.entityBasePackages = entityBasePackages == null ? new HashSet() : new HashSet( + entityBasePackages); + } + + public Set> getEntityBasePackageClasses() { + return Collections.unmodifiableSet(entityBasePackageClasses); + } + + public void setEntityBasePackageClasses(Collection> entityBasePackageClasses) { + this.entityBasePackageClasses = entityBasePackageClasses == null ? new HashSet>() : new HashSet>( + entityBasePackageClasses); + } + + public void setBeanClassLoader(ClassLoader beanClassLoader) { + this.beanClassLoader = beanClassLoader; + } + + /** + * Scans the mapping base package for entity classes annotated with {@link Table} or {@link Persistent}. + * + * @see #getEntityBasePackages() + * @return Set<Class<?>> representing the annotated entity classes found. + * @throws ClassNotFoundException + */ + public Set> scanForEntityClasses() throws ClassNotFoundException { + + Set> classes = new HashSet>(); + + for (String basePackage : getEntityBasePackages()) { + classes.addAll(scanBasePackageForEntities(basePackage)); + } + + for (Class basePackageClass : getEntityBasePackageClasses()) { + classes.addAll(scanBasePackageForEntities(basePackageClass.getPackage().getName())); + } + + return classes; + } + + protected Set> scanBasePackageForEntities(String basePackage) throws ClassNotFoundException { + + HashSet> classes = new HashSet>(); + + if (StringUtils.hasText(basePackage)) { + ClassPathScanningCandidateComponentProvider componentProvider = new ClassPathScanningCandidateComponentProvider( + false); + for (Class annoClass : getEntityAnnotations()) { + componentProvider.addIncludeFilter(new AnnotationTypeFilter(annoClass)); + } + + for (BeanDefinition candidate : componentProvider.findCandidateComponents(basePackage)) { + classes.add(ClassUtils.forName(candidate.getBeanClassName(), beanClassLoader)); + } + } + + return classes; + } + + @SuppressWarnings("unchecked") + public Class[] getEntityAnnotations() { + return new Class[] { Table.class, Persistent.class, PrimaryKeyClass.class }; + } +} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/DefaultDataBeanNames.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/DefaultDataBeanNames.java index 43e4ded92..4443e54d6 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/DefaultDataBeanNames.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/DefaultDataBeanNames.java @@ -4,6 +4,7 @@ import org.springframework.cassandra.config.xml.DefaultBeanNames; public interface DefaultDataBeanNames extends DefaultBeanNames { - public static final String DATA_TEMPLATE = "cassandra-template"; - public static final String CONVERTER = "cassandra-converter"; + public static final String DATA_TEMPLATE = "cassandraTemplate"; + public static final String CONVERTER = "cassandraConverter"; + public static final String MAPPING_CONTEXT = "cassandra-mapping"; } 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 736aa0922..a86e13b5c 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 @@ -15,18 +15,15 @@ */ package org.springframework.data.cassandra.config.java; -import java.util.HashSet; +import java.util.Arrays; import java.util.Set; import org.springframework.beans.factory.BeanClassLoaderAware; -import org.springframework.beans.factory.config.BeanDefinition; 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.CassandraEntityClassScanner; import org.springframework.data.cassandra.config.SchemaAction; import org.springframework.data.cassandra.convert.CassandraConverter; import org.springframework.data.cassandra.convert.MappingCassandraConverter; @@ -35,11 +32,8 @@ import org.springframework.data.cassandra.core.CassandraAdminTemplate; import org.springframework.data.cassandra.mapping.CassandraMappingContext; import org.springframework.data.cassandra.mapping.DefaultCassandraMappingContext; import org.springframework.data.cassandra.mapping.Mapping; -import org.springframework.data.cassandra.mapping.PrimaryKeyClass; import org.springframework.data.cassandra.mapping.Table; import org.springframework.data.mapping.context.MappingContext; -import org.springframework.util.ClassUtils; -import org.springframework.util.StringUtils; /** * Base class for Spring Data Cassandra configuration using JavaConfig. @@ -64,11 +58,11 @@ public abstract class AbstractSpringDataCassandraConfiguration extends AbstractC } /** - * 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()). + * The base packages to scan for entities annotated with {@link Table} annotations. By default, returns the package + * name of {@literal this} (this.getClass().getPackage().getName()). This method must never return null. */ - public String getEntityBasePackage() { - return getClass().getPackage().getName(); + public String[] getMappingBasePackages() { + return new String[] { getClass().getPackage().getName() }; } @Bean @@ -118,46 +112,27 @@ public abstract class AbstractSpringDataCassandraConfiguration extends AbstractC */ @Bean public CassandraConverter converter() throws ClassNotFoundException { - MappingCassandraConverter converter = new MappingCassandraConverter(cassandraMappingContext()); - converter.setBeanClassLoader(beanClassLoader); - return converter; + return new MappingCassandraConverter(cassandraMappingContext()); } /** - * Scans the mapping base package for entity classes annotated with {@link Table} or {@link Persistent}. + * Scans the mapping base package for entity classes. * - * @see #getEntityBasePackage() + * @see #getMappingBasePackages() + * @see #getEntityScanner() * @return Set<Class<?>> representing the annotated entity classes found. * @throws ClassNotFoundException */ protected Set> getInitialEntitySet() throws ClassNotFoundException { - String basePackage = getEntityBasePackage(); - Set> initialEntitySet = new HashSet>(); + CassandraEntityClassScanner entityScanner = getEntityScanner(); + entityScanner.setEntityBasePackages(Arrays.asList(getMappingBasePackages())); - if (StringUtils.hasText(basePackage)) { - ClassPathScanningCandidateComponentProvider componentProvider = new ClassPathScanningCandidateComponentProvider( - false); - componentProvider.addIncludeFilter(new AnnotationTypeFilter(Table.class)); - componentProvider.addIncludeFilter(new AnnotationTypeFilter(Persistent.class)); - componentProvider.addIncludeFilter(new AnnotationTypeFilter(PrimaryKeyClass.class)); - - for (BeanDefinition candidate : componentProvider.findCandidateComponents(basePackage)) { - - Class clazz = ClassUtils.forName(candidate.getBeanClassName(), beanClassLoader); - initialEntitySet.add(clazz); - } - } - - processMappingOverrides(initialEntitySet); - - return initialEntitySet; + return entityScanner.scanForEntityClasses(); } - 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 + public CassandraEntityClassScanner getEntityScanner() { + return new CassandraEntityClassScanner(); } @Override diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataCassandraMappingContextParser.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataCassandraMappingContextParser.java new file mode 100644 index 000000000..fe696044c --- /dev/null +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataCassandraMappingContextParser.java @@ -0,0 +1,52 @@ +package org.springframework.data.cassandra.config.xml; + +import java.util.Set; + +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.data.cassandra.config.CassandraDataCassandraMappingContextFactoryBean; +import org.springframework.data.cassandra.config.DefaultDataBeanNames; +import org.springframework.util.StringUtils; +import org.w3c.dom.Element; + +/** + * Spring Data Cassandra XML namespace parser for the <mapping-context> element. + * + * @author Matthew T. Adams + */ +public class CassandraDataCassandraMappingContextParser extends AbstractSimpleBeanDefinitionParser { + + @Override + protected Class getBeanClass(Element element) { + return CassandraDataCassandraMappingContextFactoryBean.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 : DefaultDataBeanNames.MAPPING_CONTEXT; + } + + @Override + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + super.doParse(element, parserContext, builder); + + parseBasePackagesAttribute(element, parserContext, builder); + } + + protected void parseBasePackagesAttribute(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + + String basePackages = element.getAttribute("base-packages"); + if (!StringUtils.hasText(basePackages)) { + return; + } + + Set basePackageSet = StringUtils.commaDelimitedListToSet(basePackages); + builder.addPropertyValue("basePackages", basePackageSet); + } +} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataMappingCassandraConverterParser.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataMappingCassandraConverterParser.java new file mode 100644 index 000000000..18eefc9c7 --- /dev/null +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataMappingCassandraConverterParser.java @@ -0,0 +1,62 @@ +package org.springframework.data.cassandra.config.xml; + +import java.util.Set; + +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.data.cassandra.config.CassandraDataMappingConverterFactoryBean; +import org.springframework.data.cassandra.config.DefaultDataBeanNames; +import org.springframework.util.StringUtils; +import org.w3c.dom.Element; + +/** + * Spring Data Cassandra XML namespace parser for the <mapping-converter> element. + * + * @author Matthew T. Adams + */ +public class CassandraDataMappingCassandraConverterParser extends AbstractSimpleBeanDefinitionParser { + + @Override + protected Class getBeanClass(Element element) { + return CassandraDataMappingConverterFactoryBean.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 : DefaultDataBeanNames.CONVERTER; + } + + @Override + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + super.doParse(element, parserContext, builder); + + parseMappingContextAttribute(element, parserContext, builder); + parseBasePackagesAttribute(element, parserContext, builder); + } + + protected void parseMappingContextAttribute(Element element, ParserContext parserContext, + BeanDefinitionBuilder builder) { + + String mappingContextRef = element.getAttribute("mapping-context-ref"); + if (!StringUtils.hasText(mappingContextRef)) { + mappingContextRef = DefaultDataBeanNames.MAPPING_CONTEXT; + } + builder.addPropertyReference("mappingContext", mappingContextRef); + } + + protected void parseBasePackagesAttribute(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + + String basePackages = element.getAttribute("base-packages"); + if (!StringUtils.hasText(basePackages)) { + return; + } + + Set basePackageSet = StringUtils.commaDelimitedListToSet(basePackages); + } +} diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataNamespaceHandler.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataNamespaceHandler.java index fdd7fc80c..349b87ce3 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataNamespaceHandler.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataNamespaceHandler.java @@ -36,5 +36,7 @@ public class CassandraDataNamespaceHandler extends NamespaceHandlerSupport { registerBeanDefinitionParser("cluster", new CassandraDataClusterParser()); registerBeanDefinitionParser("session", new CassandraDataSessionParser()); registerBeanDefinitionParser("template", new CassandraDataTemplateParser()); + registerBeanDefinitionParser("mapping-converter", new CassandraDataMappingCassandraConverterParser()); + registerBeanDefinitionParser("mapping-context", new CassandraDataCassandraMappingContextParser()); } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataSessionParser.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataSessionParser.java index ea2327801..fef2f1842 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataSessionParser.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/xml/CassandraDataSessionParser.java @@ -45,6 +45,15 @@ public class CassandraDataSessionParser extends CassandraSessionParser { } } + @Override + protected void setDefaultProperties(BeanDefinitionBuilder builder) { + + super.setDefaultProperties(builder); + + addRequiredPropertyReference(builder, "converter", DefaultDataBeanNames.CONVERTER); + addRequiredPropertyReference(builder, "schemaAction", SchemaAction.NONE.name()); + } + @Override protected void parseUnhandledElement(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/DefaultCassandraMappingContext.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/DefaultCassandraMappingContext.java index e48f7ec7d..36ac828e4 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/DefaultCassandraMappingContext.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/DefaultCassandraMappingContext.java @@ -52,6 +52,8 @@ public class DefaultCassandraMappingContext extends CassandraMappingContext, ApplicationContextAware { protected ApplicationContext context; + + // useful caches protected Map>> entitySetsByTableName = new HashMap>>(); protected Set> nonPrimaryKeyEntities = new HashSet>(); protected Set> primaryKeyEntities = new HashSet>(); @@ -63,6 +65,20 @@ public class DefaultCassandraMappingContext extends setSimpleTypeHolder(new CassandraSimpleTypeHolder()); } + @Override + public void initialize() { + + super.initialize(); + + processMappingOverrides(); + } + + protected void processMappingOverrides() { + + // 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 Collection> getPersistentEntities() { return getPersistentEntities(false); 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 91b2fc35a..5821450f0 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 @@ -18,6 +18,7 @@ package org.springframework.data.cassandra.repository.config; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.cassandra.config.xml.ParsingUtils; import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.data.cassandra.config.DefaultDataBeanNames; import org.springframework.data.cassandra.repository.support.CassandraRepositoryFactoryBean; import org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource; import org.springframework.data.repository.config.RepositoryConfigurationExtension; @@ -52,7 +53,7 @@ public class CassandraRepositoryConfigurationExtension extends RepositoryConfigu Element element = config.getElement(); ParsingUtils.addOptionalPropertyReference(builder, "cassandraTemplate", element, CASSANDRA_TEMPLATE_REF, - "cassandra-template"); + DefaultDataBeanNames.TEMPLATE); } @Override diff --git a/spring-data-cassandra/src/main/resources/org/springframework/data/cassandra/config/ext-spring-cassandra-1.0.xsd b/spring-data-cassandra/src/main/resources/org/springframework/data/cassandra/config/spring-cassandra-1.0-trying-to-use-xml-extension.xsd similarity index 100% rename from spring-data-cassandra/src/main/resources/org/springframework/data/cassandra/config/ext-spring-cassandra-1.0.xsd rename to spring-data-cassandra/src/main/resources/org/springframework/data/cassandra/config/spring-cassandra-1.0-trying-to-use-xml-extension.xsd 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 bed6fd896..14d048be2 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 @@ -482,7 +482,7 @@ The name of a Cassandra Keyspace. No default; for the system keyspace, use the use="optional"> @@ -500,7 +500,7 @@ The schema action to perform; default is NONE. @@ -515,7 +515,7 @@ The reference to a Cassandra session; default is "cassandra-session". use="optional"> @@ -676,11 +676,10 @@ Table name override. - + @@ -696,4 +695,61 @@ The reference to a cassandraTemplate. Will default to 'cassandra-template'. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/composites/CommentRepositoryJavaConfigIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/composites/CommentRepositoryJavaConfigIntegrationTests.java index 4515b97af..99a396907 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/composites/CommentRepositoryJavaConfigIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/composites/CommentRepositoryJavaConfigIntegrationTests.java @@ -69,8 +69,8 @@ public class CommentRepositoryJavaConfigIntegrationTests extends AbstractSpringD } @Override - public String getEntityBasePackage() { - return Comment.class.getPackage().getName(); + public String[] getMappingBasePackages() { + return new String[] { Comment.class.getPackage().getName() }; } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryJavaConfigIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryJavaConfigIntegrationTests.java index 9ca1eac3e..1d6a180bf 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryJavaConfigIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/test/integration/repository/UserRepositoryJavaConfigIntegrationTests.java @@ -68,8 +68,8 @@ public class UserRepositoryJavaConfigIntegrationTests extends AbstractSpringData } @Override - public String getEntityBasePackage() { - return User.class.getPackage().getName(); + public String[] getMappingBasePackages() { + return new String[] { User.class.getPackage().getName() }; } } 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 047545bc8..6406ba08a 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 @@ -16,7 +16,6 @@ package org.springframework.data.cassandra.test.integration.template; import static org.springframework.cassandra.core.keyspace.CreateKeyspaceSpecification.createKeyspace; -import static org.springframework.cassandra.core.keyspace.DropTableSpecification.dropTable; import java.io.IOException; import java.util.ArrayList; @@ -24,30 +23,22 @@ import java.util.Arrays; import java.util.List; import java.util.UUID; -import org.apache.commons.io.FileUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cassandra.core.ConsistencyLevel; import org.springframework.cassandra.core.QueryOptions; import org.springframework.cassandra.core.RetryPolicy; import org.springframework.cassandra.core.keyspace.CreateKeyspaceSpecification; import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; import org.springframework.data.cassandra.config.SchemaAction; -import org.springframework.data.cassandra.core.CassandraOperations; import org.springframework.data.cassandra.test.integration.simpletons.Book; import org.springframework.data.cassandra.test.integration.support.AbstractSpringDataEmbeddedCassandraIntegrationTest; import org.springframework.data.cassandra.test.integration.support.TestConfig; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import com.datastax.driver.core.TableMetadata; import com.datastax.driver.core.querybuilder.QueryBuilder; import com.datastax.driver.core.querybuilder.Select; @@ -75,8 +66,8 @@ public class CassandraDataOperationsTest extends AbstractSpringDataEmbeddedCassa } @Override - public String getEntityBasePackage() { - return Book.class.getPackage().getName(); + public String[] getMappingBasePackages() { + return new String[] { Book.class.getPackage().getName() }; } } diff --git a/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/composites/CommentRepositoryXmlConfigIntegrationTests-context.xml b/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/composites/CommentRepositoryXmlConfigIntegrationTests-context.xml index a181a4745..325c8e0c7 100644 --- a/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/composites/CommentRepositoryXmlConfigIntegrationTests-context.xml +++ b/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/composites/CommentRepositoryXmlConfigIntegrationTests-context.xml @@ -2,24 +2,23 @@ - - + - + 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 5709113fc..a25253303 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 @@ -11,9 +11,8 @@ - + @@ -27,21 +26,13 @@ durable-writes="true" /> - - + + + - - - - + - - - - + diff --git a/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/repository/UserRepositoryXmlConfigIntegrationTests-context.xml b/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/repository/UserRepositoryXmlConfigIntegrationTests-context.xml index a80188b22..973c3c938 100644 --- a/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/repository/UserRepositoryXmlConfigIntegrationTests-context.xml +++ b/spring-data-cassandra/src/test/resources/org/springframework/data/cassandra/test/integration/repository/UserRepositoryXmlConfigIntegrationTests-context.xml @@ -1,7 +1,8 @@ - - + - + diff --git a/spring-data-cassandra/src/test/resources/spring-data-cassandra-basic.xml b/spring-data-cassandra/src/test/resources/spring-data-cassandra-basic.xml index 7c6868246..39c99629f 100644 --- a/spring-data-cassandra/src/test/resources/spring-data-cassandra-basic.xml +++ b/spring-data-cassandra/src/test/resources/spring-data-cassandra-basic.xml @@ -10,15 +10,10 @@ - + - - - + - +