@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2010 the original author or authors .
* Copyright 2002 - 2011 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -19,6 +19,8 @@ package org.springframework.jdbc.config;
@@ -19,6 +19,8 @@ package org.springframework.jdbc.config;
import java.util.ArrayList ;
import java.util.List ;
import org.w3c.dom.Element ;
import org.springframework.beans.factory.config.BeanDefinition ;
import org.springframework.beans.factory.support.AbstractBeanDefinition ;
import org.springframework.beans.factory.support.BeanDefinitionBuilder ;
@ -28,34 +30,31 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean;
@@ -28,34 +30,31 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean;
import org.springframework.jdbc.datasource.init.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 an d
* configures a { @link ResourceDatabasePopulator } for them .
*
* { @link org . springframework . beans . factory . xml . BeanDefinitionParser } that parses an { @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
* @since 3 . 0
* /
class EmbeddedDatabaseBeanDefinitionParser extends AbstractBeanDefinitionParser {
private static final String NAME_PROPERTY = "databaseName" ;
@Override
protected AbstractBeanDefinition parseInternal ( Element element , ParserContext c ontext) {
protected AbstractBeanDefinition parseInternal ( Element element , ParserContext parserContext ) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder . rootBeanDefinition ( EmbeddedDatabaseFactoryBean . class ) ;
setDatabaseType ( element , builder ) ;
setDatabasePopulator ( element , context , builder ) ;
setDatabasePopulator ( element , builder ) ;
useIdAsDatabaseNameIfGiven ( element , builder ) ;
return getSourcedBeanDefinition ( builder , element , context ) ;
builder . getRawBeanDefinition ( ) . setSource ( parserContext . extractSource ( element ) ) ;
return builder . getBeanDefinition ( ) ;
}
private void useIdAsDatabaseNameIfGiven ( Element element , BeanDefinitionBuilder builder ) {
String id = element . getAttribute ( ID_ATTRIBUTE ) ;
if ( StringUtils . hasText ( id ) ) {
builder . addPropertyValue ( NAME_PROPERTY , id ) ;
builder . addPropertyValue ( "databaseName" , id ) ;
}
}
@ -66,34 +65,24 @@ class EmbeddedDatabaseBeanDefinitionParser extends AbstractBeanDefinitionParser
@@ -66,34 +65,24 @@ class EmbeddedDatabaseBeanDefinitionParser extends AbstractBeanDefinitionParser
}
}
private void setDatabasePopulator ( Element element , ParserContext context , BeanDefinitionBuilder builder ) {
private void setDatabasePopulator ( Element element , BeanDefinitionBuilder builder ) {
List < Element > scripts = DomUtils . getChildElementsByTagName ( element , "script" ) ;
if ( scripts . size ( ) > 0 ) {
builder . addPropertyValue ( "databasePopulator" , createDatabasePopulator ( scripts , context ) ) ;
builder . addPropertyValue ( "databasePopulator" , createDatabasePopulator ( scripts ) ) ;
}
}
private BeanDefinition createDatabasePopulator ( List < Element > scripts , ParserContext context ) {
private BeanDefinition createDatabasePopulator ( List < Element > scripts ) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder . genericBeanDefinition ( ResourceDatabasePopulator . class ) ;
List < String > locations = new ArrayList < String > ( ) ;
for ( Element scriptElement : scripts ) {
locations . add ( scriptElement . getAttribute ( "location" ) ) ;
}
// Use a factory bean for the resources so they can be given an order if a pattern is used
BeanDefinitionBuilder resourcesFactory = BeanDefinitionBuilder
. genericBeanDefinition ( SortedResourcesFactoryBean . class ) ;
BeanDefinitionBuilder resourcesFactory = BeanDefinitionBuilder . genericBeanDefinition ( SortedResourcesFactoryBean . class ) ;
resourcesFactory . addConstructorArgValue ( locations ) ;
builder . addPropertyValue ( "scripts" , resourcesFactory . getBeanDefinition ( ) ) ;
return builder . getBeanDefinition ( ) ;
}
private AbstractBeanDefinition getSourcedBeanDefinition (
BeanDefinitionBuilder builder , Element source , ParserContext context ) {
AbstractBeanDefinition definition = builder . getBeanDefinition ( ) ;
definition . setSource ( context . extractSource ( source ) ) ;
return definition ;
}
}