diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/config/EmbeddedDatabaseBeanDefinitionParser.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/config/EmbeddedDatabaseBeanDefinitionParser.java new file mode 100644 index 00000000000..ce0a842cf8e --- /dev/null +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/config/EmbeddedDatabaseBeanDefinitionParser.java @@ -0,0 +1,65 @@ +package org.springframework.jdbc.config; + +import java.util.List; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.core.io.Resource; +import org.springframework.jdbc.datasource.embedded.DatabasePopulator; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean; +import org.springframework.jdbc.datasource.embedded.ResourceDatabasePopulator; +import org.springframework.util.StringUtils; +import org.springframework.util.xml.DomUtils; +import org.w3c.dom.Element; + +/** + * {@link org.springframework.beans.factory.xml.BeanDefinitionParser} that parses {@code embedded-database} element and + * creates a {@link BeanDefinition} for {@link EmbeddedDatabaseFactoryBean}. Picks up nested {@code script} elements and + * configures a {@link ResourceDatabasePopulator} for them. + * + * @author Oliver Gierke + */ +public class EmbeddedDatabaseBeanDefinitionParser extends AbstractBeanDefinitionParser { + + @Override + protected AbstractBeanDefinition parseInternal(Element element, ParserContext context) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(EmbeddedDatabaseFactoryBean.class); + setDatabaseType(element, builder); + setDatabasePopulator(element, context, builder); + return getSourcedBeanDefinition(builder, element, context); + } + + private void setDatabaseType(Element element, BeanDefinitionBuilder builder) { + String type = element.getAttribute("type"); + if (StringUtils.hasText(type)) { + builder.addPropertyValue("databaseType", type); + } + } + + private void setDatabasePopulator(Element element, ParserContext context, BeanDefinitionBuilder builder) { + List scripts = DomUtils.getChildElementsByTagName(element, "script"); + if (scripts.size() > 0) { + builder.addPropertyValue("databasePopulator", createDatabasePopulator(scripts, context)); + } + } + + private DatabasePopulator createDatabasePopulator(List scripts, ParserContext context) { + ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); + for (Element scriptElement : scripts) { + Resource script = context.getReaderContext().getResourceLoader().getResource(scriptElement.getAttribute("location")); + populator.addScript(script); + } + return populator; + } + + private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Element source, + ParserContext context) { + AbstractBeanDefinition definition = builder.getBeanDefinition(); + definition.setSource(context.extractSource(source)); + return definition; + } + +} diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/config/JdbcNamespaceHandler.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/config/JdbcNamespaceHandler.java new file mode 100644 index 00000000000..b1821161088 --- /dev/null +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/config/JdbcNamespaceHandler.java @@ -0,0 +1,15 @@ +package org.springframework.jdbc.config; + +import org.springframework.beans.factory.xml.NamespaceHandler; +import org.springframework.beans.factory.xml.NamespaceHandlerSupport; + +/** + * {@link NamespaceHandler} for JDBC configuration namespace. + * @author Oliver Gierke + */ +public class JdbcNamespaceHandler extends NamespaceHandlerSupport { + + public void init() { + registerBeanDefinitionParser("embedded-database", new EmbeddedDatabaseBeanDefinitionParser()); + } +} diff --git a/org.springframework.jdbc/src/main/resources/META-INF/spring.handlers b/org.springframework.jdbc/src/main/resources/META-INF/spring.handlers new file mode 100644 index 00000000000..3009fcedee4 --- /dev/null +++ b/org.springframework.jdbc/src/main/resources/META-INF/spring.handlers @@ -0,0 +1 @@ +http\://www.springframework.org/schema/jdbc=org.springframework.jdbc.config.JdbcNamespaceHandler \ No newline at end of file diff --git a/org.springframework.jdbc/src/main/resources/META-INF/spring.schemas b/org.springframework.jdbc/src/main/resources/META-INF/spring.schemas new file mode 100644 index 00000000000..54ff8a5bbb8 --- /dev/null +++ b/org.springframework.jdbc/src/main/resources/META-INF/spring.schemas @@ -0,0 +1 @@ +http\://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd=org/springframework/jdbc/config/spring-jdbc-3.0.xsd \ No newline at end of file diff --git a/org.springframework.jdbc/src/main/resources/org/springframework/jdbc/config/spring-jdbc-3.0.xsd b/org.springframework.jdbc/src/main/resources/org/springframework/jdbc/config/spring-jdbc-3.0.xsd new file mode 100644 index 00000000000..d8adc7a453e --- /dev/null +++ b/org.springframework.jdbc/src/main/resources/org/springframework/jdbc/config/spring-jdbc-3.0.xsd @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/config/JdbcNamespaceIntegrationTest.java b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/config/JdbcNamespaceIntegrationTest.java new file mode 100644 index 00000000000..cddcff52c25 --- /dev/null +++ b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/config/JdbcNamespaceIntegrationTest.java @@ -0,0 +1,20 @@ +package org.springframework.jdbc.config; + +import static org.junit.Assert.assertEquals; + +import javax.sql.DataSource; + +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.jdbc.core.JdbcTemplate; + +public class JdbcNamespaceIntegrationTest { + + @Test + public void testCreateEmbeddedDatabase() throws Exception { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("org/springframework/jdbc/config/jdbc-config.xml"); + DataSource ds = context.getBean("dataSource", DataSource.class); + JdbcTemplate t = new JdbcTemplate(ds); + assertEquals(1, t.queryForInt("select count(*) from T_TEST")); + } +} diff --git a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/config/jdbc-config.xml b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/config/jdbc-config.xml new file mode 100644 index 00000000000..5ac4fa8773c --- /dev/null +++ b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/config/jdbc-config.xml @@ -0,0 +1,13 @@ + + + + + + + + +