DATACASS-91 - now scanning packages via XML & Java config
This commit is contained in:
@@ -1,46 +0,0 @@
|
||||
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<CassandraMappingContext>,
|
||||
InitializingBean {
|
||||
|
||||
protected Set<String> basePackages = new HashSet<String>();
|
||||
|
||||
@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<String> getBasePackages() {
|
||||
return basePackages;
|
||||
}
|
||||
|
||||
public void setBasePackages(Set<String> basePackages) {
|
||||
this.basePackages = basePackages;
|
||||
}
|
||||
}
|
||||
@@ -7,10 +7,7 @@ import org.springframework.data.cassandra.convert.CassandraConverter;
|
||||
import org.springframework.data.cassandra.core.CassandraAdminTemplate;
|
||||
import org.springframework.data.cassandra.mapping.CassandraMappingContext;
|
||||
import org.springframework.data.cassandra.mapping.CassandraPersistentEntity;
|
||||
import org.springframework.data.cassandra.mapping.EntityMapping;
|
||||
import org.springframework.data.cassandra.mapping.Mapping;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import com.datastax.driver.core.KeyspaceMetadata;
|
||||
import com.datastax.driver.core.Metadata;
|
||||
@@ -22,8 +19,6 @@ public class CassandraDataSessionFactoryBean extends CassandraSessionFactoryBean
|
||||
protected CassandraAdminTemplate admin;
|
||||
protected CassandraConverter converter;
|
||||
protected CassandraMappingContext mappingContext;
|
||||
protected Mapping mapping;
|
||||
protected ClassLoader entityClassLoader = getClass().getClassLoader();
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
@@ -34,42 +29,9 @@ public class CassandraDataSessionFactoryBean extends CassandraSessionFactoryBean
|
||||
|
||||
admin = new CassandraAdminTemplate(session, converter);
|
||||
|
||||
mapping = mapping == null ? new Mapping() : mapping;
|
||||
|
||||
processMappingOverrides();
|
||||
performSchemaAction();
|
||||
}
|
||||
|
||||
protected void processMappingOverrides() throws ClassNotFoundException {
|
||||
|
||||
if (mapping == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (EntityMapping entityMapping : mapping.getEntityMappings()) {
|
||||
|
||||
if (entityMapping == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String entityClassName = entityMapping.getEntityClassName();
|
||||
Class<?> entityClass = Class.forName(entityClassName, false, entityClassLoader);
|
||||
|
||||
CassandraPersistentEntity<?> entity = mappingContext.getPersistentEntity(entityClass);
|
||||
|
||||
if (entity == null) {
|
||||
throw new IllegalStateException(String.format("unknown persistent entity class name [%s]", entityClassName));
|
||||
}
|
||||
|
||||
String tableName = entityMapping.getTableName();
|
||||
if (!StringUtils.hasText(tableName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
entity.setTableName(tableName);
|
||||
}
|
||||
}
|
||||
|
||||
protected void performSchemaAction() {
|
||||
|
||||
boolean dropTables = false;
|
||||
@@ -138,22 +100,4 @@ public class CassandraDataSessionFactoryBean extends CassandraSessionFactoryBean
|
||||
this.converter = converter;
|
||||
this.mappingContext = converter.getMappingContext();
|
||||
}
|
||||
|
||||
public Mapping getMapping() {
|
||||
return mapping;
|
||||
}
|
||||
|
||||
public void setMapping(Mapping mapping) {
|
||||
Assert.notNull(mapping);
|
||||
this.mapping = mapping;
|
||||
}
|
||||
|
||||
public ClassLoader getEntityClassLoader() {
|
||||
return entityClassLoader;
|
||||
}
|
||||
|
||||
public void setEntityClassLoader(ClassLoader entityClassLoader) {
|
||||
Assert.notNull(entityClassLoader);
|
||||
this.entityClassLoader = entityClassLoader;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
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;
|
||||
import org.springframework.data.cassandra.mapping.Mapping;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
public class CassandraMappingContextFactoryBean implements FactoryBean<CassandraMappingContext>, InitializingBean {
|
||||
|
||||
protected Set<String> basePackages = new HashSet<String>();
|
||||
protected Mapping mapping;
|
||||
protected ClassLoader entityClassLoader;
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
mapping = mapping == null ? new Mapping() : mapping;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CassandraMappingContext getObject() throws Exception {
|
||||
|
||||
DefaultCassandraMappingContext mappingContext = new DefaultCassandraMappingContext();
|
||||
mappingContext.setInitialEntitySet(new CassandraEntityClassScanner(basePackages).scanForEntityClasses());
|
||||
mappingContext.setMapping(mapping);
|
||||
mappingContext.setBeanClassLoader(entityClassLoader);
|
||||
|
||||
mappingContext.initialize(); // this is necessary here
|
||||
|
||||
return mappingContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<?> getObjectType() {
|
||||
return CassandraMappingContext.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSingleton() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public Set<String> getBasePackages() {
|
||||
return basePackages;
|
||||
}
|
||||
|
||||
public void setBasePackages(Set<String> basePackages) {
|
||||
this.basePackages = basePackages == null ? new HashSet<String>() : new HashSet<String>(basePackages);
|
||||
}
|
||||
|
||||
public Mapping getMapping() {
|
||||
return mapping;
|
||||
}
|
||||
|
||||
public void setMapping(Mapping mapping) {
|
||||
|
||||
Assert.notNull(mapping);
|
||||
|
||||
this.mapping = mapping;
|
||||
}
|
||||
|
||||
public ClassLoader getEntityClassLoader() {
|
||||
return entityClassLoader;
|
||||
}
|
||||
|
||||
public void setEntityClassLoader(ClassLoader entityClassLoader) {
|
||||
this.entityClassLoader = entityClassLoader;
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import org.springframework.data.cassandra.convert.MappingCassandraConverter;
|
||||
import org.springframework.data.cassandra.mapping.CassandraMappingContext;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
public class CassandraDataMappingConverterFactoryBean implements FactoryBean<CassandraConverter>, InitializingBean {
|
||||
public class CassandraMappingConverterFactoryBean implements FactoryBean<CassandraConverter>, InitializingBean {
|
||||
|
||||
protected CassandraMappingContext mappingContext;
|
||||
protected Set<String> basePackages = new HashSet<String>();
|
||||
@@ -6,5 +6,5 @@ public interface DefaultDataBeanNames extends DefaultBeanNames {
|
||||
|
||||
public static final String DATA_TEMPLATE = "cassandraTemplate";
|
||||
public static final String CONVERTER = "cassandraConverter";
|
||||
public static final String MAPPING_CONTEXT = "cassandra-mapping";
|
||||
public static final String MAPPING_CONTEXT = "cassandraMapping";
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package org.springframework.data.cassandra.config.java;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.beans.factory.BeanClassLoaderAware;
|
||||
@@ -24,14 +25,12 @@ import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.cassandra.config.CassandraDataSessionFactoryBean;
|
||||
import org.springframework.data.cassandra.config.CassandraEntityClassScanner;
|
||||
import org.springframework.data.cassandra.config.CassandraMappingContextFactoryBean;
|
||||
import org.springframework.data.cassandra.config.CassandraMappingConverterFactoryBean;
|
||||
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;
|
||||
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.Table;
|
||||
import org.springframework.data.mapping.context.MappingContext;
|
||||
|
||||
@@ -48,7 +47,6 @@ public abstract class AbstractSpringDataCassandraConfiguration extends AbstractC
|
||||
protected abstract String getKeyspaceName();
|
||||
|
||||
protected ClassLoader beanClassLoader;
|
||||
protected Mapping mapping = new Mapping();
|
||||
|
||||
/**
|
||||
* The {@link SchemaAction} to perform. Defaults to {@link SchemaAction#NONE}.
|
||||
@@ -71,15 +69,12 @@ public abstract class AbstractSpringDataCassandraConfiguration extends AbstractC
|
||||
CassandraDataSessionFactoryBean bean = new CassandraDataSessionFactoryBean();
|
||||
|
||||
bean.setCluster(cluster().getObject());
|
||||
bean.setConverter(converter());
|
||||
bean.setConverter(converter().getObject());
|
||||
bean.setSchemaAction(getSchemaAction());
|
||||
bean.setKeyspaceName(getKeyspaceName());
|
||||
bean.setStartupScripts(getStartupScripts());
|
||||
bean.setShutdownScripts(getShutdownScripts());
|
||||
|
||||
bean.setEntityClassLoader(beanClassLoader);
|
||||
bean.setMapping(mapping);
|
||||
|
||||
return bean;
|
||||
}
|
||||
|
||||
@@ -90,7 +85,7 @@ public abstract class AbstractSpringDataCassandraConfiguration extends AbstractC
|
||||
*/
|
||||
@Bean
|
||||
public CassandraAdminOperations cassandraTemplate() throws Exception {
|
||||
return new CassandraAdminTemplate(session().getObject(), converter());
|
||||
return new CassandraAdminTemplate(session().getObject(), converter().getObject());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -99,20 +94,25 @@ public abstract class AbstractSpringDataCassandraConfiguration extends AbstractC
|
||||
* @throws ClassNotFoundException
|
||||
*/
|
||||
@Bean
|
||||
public CassandraMappingContext cassandraMappingContext() throws ClassNotFoundException {
|
||||
DefaultCassandraMappingContext context = new DefaultCassandraMappingContext();
|
||||
context.setInitialEntitySet(getInitialEntitySet());
|
||||
return context;
|
||||
public CassandraMappingContextFactoryBean cassandraMapping() throws ClassNotFoundException {
|
||||
|
||||
CassandraMappingContextFactoryBean bean = new CassandraMappingContextFactoryBean();
|
||||
bean.setBasePackages(new HashSet<String>(Arrays.asList(getMappingBasePackages())));
|
||||
bean.setEntityClassLoader(beanClassLoader);
|
||||
|
||||
return bean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the {@link CassandraConverter} instance to convert Rows to Objects, Objects to BuiltStatements
|
||||
*
|
||||
* @throws ClassNotFoundException
|
||||
*/
|
||||
@Bean
|
||||
public CassandraConverter converter() throws ClassNotFoundException {
|
||||
return new MappingCassandraConverter(cassandraMappingContext());
|
||||
public CassandraMappingConverterFactoryBean converter() throws Exception {
|
||||
|
||||
CassandraMappingConverterFactoryBean bean = new CassandraMappingConverterFactoryBean();
|
||||
bean.setMappingContext(cassandraMapping().getObject());
|
||||
|
||||
return bean;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -36,7 +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());
|
||||
registerBeanDefinitionParser("mapping-converter", new CassandraMappingConverterParser());
|
||||
registerBeanDefinitionParser("mapping", new CassandraMappingContextParser());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,15 @@
|
||||
package org.springframework.data.cassandra.config.xml;
|
||||
|
||||
import static org.springframework.cassandra.config.xml.ParsingUtils.*;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import static org.springframework.cassandra.config.xml.ParsingUtils.addOptionalPropertyReference;
|
||||
import static org.springframework.cassandra.config.xml.ParsingUtils.addOptionalPropertyValue;
|
||||
import static org.springframework.cassandra.config.xml.ParsingUtils.addRequiredPropertyReference;
|
||||
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.xml.ParserContext;
|
||||
import org.springframework.cassandra.config.xml.CassandraSessionParser;
|
||||
import org.springframework.data.cassandra.config.DefaultDataBeanNames;
|
||||
import org.springframework.data.cassandra.config.CassandraDataSessionFactoryBean;
|
||||
import org.springframework.data.cassandra.config.DefaultDataBeanNames;
|
||||
import org.springframework.data.cassandra.config.SchemaAction;
|
||||
import org.springframework.data.cassandra.mapping.EntityMapping;
|
||||
import org.springframework.data.cassandra.mapping.Mapping;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.util.xml.DomUtils;
|
||||
import org.w3c.dom.Attr;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
@@ -53,57 +48,4 @@ public class CassandraDataSessionParser extends CassandraSessionParser {
|
||||
addRequiredPropertyReference(builder, "converter", DefaultDataBeanNames.CONVERTER);
|
||||
addRequiredPropertyReference(builder, "schemaAction", SchemaAction.NONE.name());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void parseUnhandledElement(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
|
||||
|
||||
if ("mapping".equals(element.getLocalName())) {
|
||||
parseMapping(element, parserContext, builder);
|
||||
} else {
|
||||
super.parseUnhandledElement(element, parserContext, builder);
|
||||
}
|
||||
}
|
||||
|
||||
protected void parseMapping(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
|
||||
|
||||
// TODO: parse <mapping> attributes here, if there ever are any
|
||||
|
||||
Set<EntityMapping> mappings = new HashSet<EntityMapping>();
|
||||
|
||||
for (Element child : DomUtils.getChildElementsByTagName(element, "entity")) {
|
||||
|
||||
EntityMapping entityMapping = parseEntity(child);
|
||||
|
||||
if (entityMapping != null) {
|
||||
mappings.add(entityMapping);
|
||||
}
|
||||
}
|
||||
|
||||
Mapping mapping = new Mapping();
|
||||
mapping.setEntityMappings(mappings);
|
||||
|
||||
builder.addPropertyValue("mapping", mapping);
|
||||
}
|
||||
|
||||
protected EntityMapping parseEntity(Element entity) {
|
||||
|
||||
String className = entity.getAttribute("class");
|
||||
if (!StringUtils.hasText(className)) {
|
||||
throw new IllegalStateException("class attribute must not be empty");
|
||||
}
|
||||
|
||||
Element table = DomUtils.getChildElementByTagName(entity, "table");
|
||||
if (table == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String tableName = table.getAttribute("name");
|
||||
if (!StringUtils.hasText(tableName)) {
|
||||
tableName = null;
|
||||
}
|
||||
|
||||
// TODO: parse future entity mappings here, like table options
|
||||
|
||||
return new EntityMapping(className, tableName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.springframework.data.cassandra.config.xml;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.beans.factory.BeanDefinitionStoreException;
|
||||
@@ -7,21 +8,24 @@ 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.CassandraMappingContextFactoryBean;
|
||||
import org.springframework.data.cassandra.config.DefaultDataBeanNames;
|
||||
import org.springframework.data.cassandra.mapping.EntityMapping;
|
||||
import org.springframework.data.cassandra.mapping.Mapping;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.util.xml.DomUtils;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
/**
|
||||
* Spring Data Cassandra XML namespace parser for the <mapping-context> element.
|
||||
* Spring Data Cassandra XML namespace parser for the <mapping> element.
|
||||
*
|
||||
* @author Matthew T. Adams
|
||||
*/
|
||||
public class CassandraDataCassandraMappingContextParser extends AbstractSimpleBeanDefinitionParser {
|
||||
public class CassandraMappingContextParser extends AbstractSimpleBeanDefinitionParser {
|
||||
|
||||
@Override
|
||||
protected Class<?> getBeanClass(Element element) {
|
||||
return CassandraDataCassandraMappingContextFactoryBean.class;
|
||||
return CassandraMappingContextFactoryBean.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,6 +41,7 @@ public class CassandraDataCassandraMappingContextParser extends AbstractSimpleBe
|
||||
super.doParse(element, parserContext, builder);
|
||||
|
||||
parseBasePackagesAttribute(element, parserContext, builder);
|
||||
parseMapping(element, parserContext, builder);
|
||||
}
|
||||
|
||||
protected void parseBasePackagesAttribute(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
|
||||
@@ -49,4 +54,47 @@ public class CassandraDataCassandraMappingContextParser extends AbstractSimpleBe
|
||||
Set<String> basePackageSet = StringUtils.commaDelimitedListToSet(basePackages);
|
||||
builder.addPropertyValue("basePackages", basePackageSet);
|
||||
}
|
||||
|
||||
protected void parseMapping(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
|
||||
|
||||
// TODO: parse <mapping> **attributes** here, if there ever are any
|
||||
|
||||
Set<EntityMapping> mappings = new HashSet<EntityMapping>();
|
||||
|
||||
for (Element child : DomUtils.getChildElementsByTagName(element, "entity")) {
|
||||
|
||||
EntityMapping entityMapping = parseEntity(child);
|
||||
|
||||
if (entityMapping != null) {
|
||||
mappings.add(entityMapping);
|
||||
}
|
||||
}
|
||||
|
||||
Mapping mapping = new Mapping();
|
||||
mapping.setEntityMappings(mappings);
|
||||
|
||||
builder.addPropertyValue("mapping", mapping);
|
||||
}
|
||||
|
||||
protected EntityMapping parseEntity(Element entity) {
|
||||
|
||||
String className = entity.getAttribute("class");
|
||||
if (!StringUtils.hasText(className)) {
|
||||
throw new IllegalStateException("class attribute must not be empty");
|
||||
}
|
||||
|
||||
Element table = DomUtils.getChildElementByTagName(entity, "table");
|
||||
if (table == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String tableName = table.getAttribute("name");
|
||||
if (!StringUtils.hasText(tableName)) {
|
||||
tableName = null;
|
||||
}
|
||||
|
||||
// TODO: parse future entity mappings here, like table options
|
||||
|
||||
return new EntityMapping(className, tableName);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,11 @@
|
||||
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.CassandraMappingConverterFactoryBean;
|
||||
import org.springframework.data.cassandra.config.DefaultDataBeanNames;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.w3c.dom.Element;
|
||||
@@ -17,11 +15,11 @@ import org.w3c.dom.Element;
|
||||
*
|
||||
* @author Matthew T. Adams
|
||||
*/
|
||||
public class CassandraDataMappingCassandraConverterParser extends AbstractSimpleBeanDefinitionParser {
|
||||
public class CassandraMappingConverterParser extends AbstractSimpleBeanDefinitionParser {
|
||||
|
||||
@Override
|
||||
protected Class<?> getBeanClass(Element element) {
|
||||
return CassandraDataMappingConverterFactoryBean.class;
|
||||
return CassandraMappingConverterFactoryBean.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -34,29 +32,20 @@ public class CassandraDataMappingCassandraConverterParser extends AbstractSimple
|
||||
|
||||
@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");
|
||||
String mappingContextRef = element.getAttribute("mapping-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<String> basePackageSet = StringUtils.commaDelimitedListToSet(basePackages);
|
||||
}
|
||||
}
|
||||
@@ -37,6 +37,7 @@ import org.springframework.data.mapping.model.MappingException;
|
||||
import org.springframework.data.mapping.model.SimpleTypeHolder;
|
||||
import org.springframework.data.util.TypeInformation;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import com.datastax.driver.core.TableMetadata;
|
||||
|
||||
@@ -52,6 +53,9 @@ public class DefaultCassandraMappingContext extends
|
||||
CassandraMappingContext, ApplicationContextAware {
|
||||
|
||||
protected ApplicationContext context;
|
||||
protected Mapping mapping = new Mapping();
|
||||
protected ClassLoader beanClassLoader;
|
||||
protected boolean initialized;
|
||||
|
||||
// useful caches
|
||||
protected Map<String, Set<CassandraPersistentEntity<?>>> entitySetsByTableName = new HashMap<String, Set<CassandraPersistentEntity<?>>>();
|
||||
@@ -65,18 +69,27 @@ public class DefaultCassandraMappingContext extends
|
||||
setSimpleTypeHolder(new CassandraSimpleTypeHolder());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
if (initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
super.afterPropertiesSet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
|
||||
if (initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
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
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -224,4 +237,51 @@ public class DefaultCassandraMappingContext extends
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
public void setMapping(Mapping mapping) {
|
||||
|
||||
Assert.notNull(mapping);
|
||||
|
||||
this.mapping = mapping;
|
||||
}
|
||||
|
||||
protected void processMappingOverrides() {
|
||||
|
||||
if (mapping == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (EntityMapping entityMapping : mapping.getEntityMappings()) {
|
||||
|
||||
if (entityMapping == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String entityClassName = entityMapping.getEntityClassName();
|
||||
Class<?> entityClass;
|
||||
try {
|
||||
entityClass = Class.forName(entityClassName, false, beanClassLoader == null ? getClass().getClassLoader()
|
||||
: beanClassLoader);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IllegalStateException(String.format("unknown persistent entity name [%s]", entityClassName), e);
|
||||
}
|
||||
|
||||
CassandraPersistentEntity<?> entity = getPersistentEntity(entityClass);
|
||||
|
||||
if (entity == null) {
|
||||
throw new IllegalStateException(String.format("unknown persistent entity class name [%s]", entityClassName));
|
||||
}
|
||||
|
||||
String tableName = entityMapping.getTableName();
|
||||
if (!StringUtils.hasText(tableName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
entity.setTableName(tableName);
|
||||
}
|
||||
}
|
||||
|
||||
public void setBeanClassLoader(ClassLoader beanClassLoader) {
|
||||
this.beanClassLoader = beanClassLoader;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -452,8 +452,6 @@ Arbitrary CQL script to be executed against the session's keyspace during bean d
|
||||
]]></xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<xsd:element name="mapping" type="mappingType" minOccurs="0"
|
||||
maxOccurs="1" />
|
||||
</xsd:sequence>
|
||||
|
||||
<xsd:attribute name="id" type="xsd:ID" use="optional">
|
||||
@@ -629,13 +627,6 @@ The replication factor for the data center.
|
||||
<xsd:union memberTypes="xsd:string" />
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:complexType name="mappingType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="entity" type="entityType" minOccurs="0"
|
||||
maxOccurs="unbounded" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="entityType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="table" type="tableType" minOccurs="0"
|
||||
@@ -696,7 +687,7 @@ The reference to a cassandraTemplate. Will default to 'cassandraTemplate'.
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:element name="mapping-context">
|
||||
<xsd:element name="mapping">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation><![CDATA[
|
||||
Defines a CassandraMappingContext for holding rich entity mapping information.
|
||||
@@ -707,6 +698,10 @@ Defines a CassandraMappingContext for holding rich entity mapping information.
|
||||
</xsd:appinfo>
|
||||
</xsd:annotation>
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="entity" type="entityType" minOccurs="0"
|
||||
maxOccurs="unbounded" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="base-packages" type="xsd:string"
|
||||
use="optional">
|
||||
<xsd:annotation>
|
||||
@@ -729,12 +724,12 @@ Defines a CassandraConverter for getting rich mapping functionality.
|
||||
</xsd:appinfo>
|
||||
</xsd:annotation>
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="mapping-context-ref" type="mappingContextRef"
|
||||
<xsd:attribute name="mapping-ref" type="mappingContextRef"
|
||||
use="optional">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation
|
||||
source="org.springframework.data.mapping.model.MappingContext"><![CDATA[
|
||||
The reference to a MappingContext. Will default to 'mapping-context'.
|
||||
source="org.springframework.data.cassandra.mapping.CassandraMappingContext"><![CDATA[
|
||||
The reference to a CassandraMappingContext. Will default to 'cassandraMapping'.
|
||||
]]></xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:attribute>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cassandra="http://www.springframework.org/schema/data/cassandra"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cass="http://www.springframework.org/schema/data/cassandra"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:util="http://www.springframework.org/schema/util"
|
||||
xsi:schemaLocation="
|
||||
@@ -11,22 +11,24 @@
|
||||
|
||||
<import resource="classpath:/spring-data-cassandra-basic.xml" />
|
||||
|
||||
<cassandra:cluster port="${cassandra.native_transport_port}">
|
||||
<cassandra:keyspace name="CommentRepositoryXmlConfigIntegrationTests"
|
||||
<cass:mapping
|
||||
base-packages="org.springframework.data.cassandra.test.integration.composites">
|
||||
<cass:entity
|
||||
class="org.springframework.data.cassandra.test.integration.composites.Comment">
|
||||
<cass:table name="comments_x" />
|
||||
</cass:entity>
|
||||
</cass:mapping>
|
||||
|
||||
<cass:cluster port="${cassandra.native_transport_port}">
|
||||
<cass:keyspace name="CommentRepositoryXmlConfigIntegrationTests"
|
||||
action="CREATE" durable-writes="true">
|
||||
</cassandra:keyspace>
|
||||
</cassandra:cluster>
|
||||
</cass:keyspace>
|
||||
</cass:cluster>
|
||||
|
||||
<cassandra:session keyspace-name="CommentRepositoryXmlConfigIntegrationTests"
|
||||
<cass:session keyspace-name="CommentRepositoryXmlConfigIntegrationTests"
|
||||
schema-action="CREATE">
|
||||
<cassandra:mapping>
|
||||
<cassandra:entity
|
||||
class="org.springframework.data.cassandra.test.integration.composites.Comment">
|
||||
<cassandra:table name="comments" />
|
||||
</cassandra:entity>
|
||||
</cassandra:mapping>
|
||||
</cassandra:session>
|
||||
</cass:session>
|
||||
|
||||
<cassandra:repositories
|
||||
<cass:repositories
|
||||
base-package="org.springframework.data.cassandra.test.integration.composites" />
|
||||
</beans>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
</cass:cluster>
|
||||
|
||||
<!-- TODO: not require that these beans be defined -->
|
||||
<cass:mapping-context/>
|
||||
<cass:mapping />
|
||||
<cass:mapping-converter />
|
||||
|
||||
<cass:session keyspace-name="${cassandra.keyspace}"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cassandra="http://www.springframework.org/schema/data/cassandra"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cass="http://www.springframework.org/schema/data/cassandra"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:util="http://www.springframework.org/schema/util"
|
||||
xsi:schemaLocation="
|
||||
@@ -12,22 +12,24 @@
|
||||
|
||||
<import resource="classpath:/spring-data-cassandra-basic.xml" />
|
||||
|
||||
<cassandra:cluster port="${cassandra.native_transport_port}">
|
||||
<cassandra:keyspace name="UserRepositoryXmlConfigIntegrationTests"
|
||||
<cass:mapping
|
||||
base-packages="org.springframework.data.cassandra.test.integration.repository">
|
||||
<cass:entity
|
||||
class="org.springframework.data.cassandra.test.integration.repository.User">
|
||||
<cass:table name="users_x" />
|
||||
</cass:entity>
|
||||
</cass:mapping>
|
||||
|
||||
<cass:cluster port="${cassandra.native_transport_port}">
|
||||
<cass:keyspace name="UserRepositoryXmlConfigIntegrationTests"
|
||||
action="CREATE" durable-writes="true">
|
||||
</cassandra:keyspace>
|
||||
</cassandra:cluster>
|
||||
</cass:keyspace>
|
||||
</cass:cluster>
|
||||
|
||||
<cassandra:session keyspace-name="UserRepositoryXmlConfigIntegrationTests"
|
||||
<cass:session keyspace-name="UserRepositoryXmlConfigIntegrationTests"
|
||||
schema-action="CREATE">
|
||||
<cassandra:mapping>
|
||||
<cassandra:entity
|
||||
class="org.springframework.data.cassandra.test.integration.repository.User">
|
||||
<cassandra:table name="users_x" />
|
||||
</cassandra:entity>
|
||||
</cassandra:mapping>
|
||||
</cassandra:session>
|
||||
</cass:session>
|
||||
|
||||
<cassandra:repositories
|
||||
<cass:repositories
|
||||
base-package="org.springframework.data.cassandra.test.integration.repository" />
|
||||
</beans>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cassandra="http://www.springframework.org/schema/data/cassandra"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cass="http://www.springframework.org/schema/data/cassandra"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xsi:schemaLocation="
|
||||
http://www.springframework.org/schema/data/cassandra http://www.springframework.org/schema/data/cassandra/spring-cassandra-1.0.xsd
|
||||
@@ -10,10 +10,8 @@
|
||||
<context:property-placeholder
|
||||
location="classpath:/spring-data-cassandra-build.properties" />
|
||||
|
||||
<cassandra:mapping-context />
|
||||
<cass:mapping-converter />
|
||||
|
||||
<cassandra:mapping-converter />
|
||||
|
||||
<cassandra:template />
|
||||
<cass:template />
|
||||
|
||||
</beans>
|
||||
|
||||
Reference in New Issue
Block a user