org.springframework.jdbc.datasource.init
Class ResourceDatabasePopulator

java.lang.Object
  extended by org.springframework.jdbc.datasource.init.ResourceDatabasePopulator
All Implemented Interfaces:
DatabasePopulator

public class ResourceDatabasePopulator
extends java.lang.Object
implements DatabasePopulator

Populates a database from SQL scripts defined in external resources.

Call addScript(Resource) to add a SQL script location. Call setSqlScriptEncoding(String) to set the encoding for all added scripts.

Since:
3.0
Author:
Keith Donald, Dave Syer, Juergen Hoeller, Chris Beams

Field Summary
private  java.lang.String commentPrefix
           
private  boolean continueOnError
           
private static java.lang.String DEFAULT_COMMENT_PREFIX
           
private static java.lang.String DEFAULT_STATEMENT_SEPARATOR
           
private  boolean ignoreFailedDrops
           
private static Log logger
           
private  java.util.List<Resource> scripts
           
private  java.lang.String separator
           
private  java.lang.String sqlScriptEncoding
           
 
Constructor Summary
ResourceDatabasePopulator()
           
 
Method Summary
 void addScript(Resource script)
          Add a script to execute to populate the database.
private  EncodedResource applyEncodingIfNecessary(Resource script)
           
private  boolean containsSqlScriptDelimiters(java.lang.String script, java.lang.String delim)
          Does the provided SQL script contain the specified delimiter?
private  void executeSqlScript(java.sql.Connection connection, EncodedResource resource, boolean continueOnError, boolean ignoreFailedDrops)
          Execute the given SQL script.
private  void maybeAddSeparatorToScript(java.lang.StringBuilder scriptBuilder)
           
 void populate(java.sql.Connection connection)
          Populate the database using the JDBC connection provided.
private  java.lang.String readScript(EncodedResource resource)
          Read a script from the given resource and build a String containing the lines.
 void setCommentPrefix(java.lang.String commentPrefix)
          Set the line prefix that identifies comments in the SQL script.
 void setContinueOnError(boolean continueOnError)
          Flag to indicate that all failures in SQL should be logged but not cause a failure.
 void setIgnoreFailedDrops(boolean ignoreFailedDrops)
          Flag to indicate that a failed SQL DROP statement can be ignored.
 void setScripts(Resource[] scripts)
          Set the scripts to execute to populate the database.
 void setSeparator(java.lang.String separator)
          Specify the statement separator, if a custom one.
 void setSqlScriptEncoding(java.lang.String sqlScriptEncoding)
          Specify the encoding for SQL scripts, if different from the platform encoding.
private  void splitSqlScript(java.lang.String script, java.lang.String delim, java.util.List<java.lang.String> statements)
          Split an SQL script into separate statements delimited with the provided delimiter character.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT_COMMENT_PREFIX

private static java.lang.String DEFAULT_COMMENT_PREFIX

DEFAULT_STATEMENT_SEPARATOR

private static java.lang.String DEFAULT_STATEMENT_SEPARATOR

logger

private static final Log logger

scripts

private java.util.List<Resource> scripts

sqlScriptEncoding

private java.lang.String sqlScriptEncoding

separator

private java.lang.String separator

commentPrefix

private java.lang.String commentPrefix

continueOnError

private boolean continueOnError

ignoreFailedDrops

private boolean ignoreFailedDrops
Constructor Detail

ResourceDatabasePopulator

public ResourceDatabasePopulator()
Method Detail

addScript

public void addScript(Resource script)
Add a script to execute to populate the database.

Parameters:
script - the path to a SQL script

setScripts

public void setScripts(Resource[] scripts)
Set the scripts to execute to populate the database.

Parameters:
scripts - the scripts to execute

setSqlScriptEncoding

public void setSqlScriptEncoding(java.lang.String sqlScriptEncoding)
Specify the encoding for SQL scripts, if different from the platform encoding. Note setting this property has no effect on added scripts that are already encoded resources.

See Also:
addScript(Resource)

setSeparator

public void setSeparator(java.lang.String separator)
Specify the statement separator, if a custom one. Default is ";".


setCommentPrefix

public void setCommentPrefix(java.lang.String commentPrefix)
Set the line prefix that identifies comments in the SQL script. Default is "--".


setContinueOnError

public void setContinueOnError(boolean continueOnError)
Flag to indicate that all failures in SQL should be logged but not cause a failure. Defaults to false.


setIgnoreFailedDrops

public void setIgnoreFailedDrops(boolean ignoreFailedDrops)
Flag to indicate that a failed SQL DROP statement can be ignored.

This is useful for non-embedded databases whose SQL dialect does not support an IF EXISTS clause in a DROP. The default is false so that if the populator runs accidentally, it will fail fast when the script starts with a DROP.


populate

public void populate(java.sql.Connection connection)
              throws java.sql.SQLException
Description copied from interface: DatabasePopulator
Populate the database using the JDBC connection provided.

Specified by:
populate in interface DatabasePopulator
Parameters:
connection - the JDBC connection to use to populate the db; already configured and ready to use
Throws:
java.sql.SQLException - if an unrecoverable data access exception occurs during database population

applyEncodingIfNecessary

private EncodedResource applyEncodingIfNecessary(Resource script)

executeSqlScript

private void executeSqlScript(java.sql.Connection connection,
                              EncodedResource resource,
                              boolean continueOnError,
                              boolean ignoreFailedDrops)
                       throws java.sql.SQLException
Execute the given SQL script.

The script will normally be loaded by classpath. There should be one statement per line. Any statement separators will be removed.

Do not use this method to execute DDL if you expect rollback.

Parameters:
connection - the JDBC Connection with which to perform JDBC operations
resource - the resource (potentially associated with a specific encoding) to load the SQL script from
continueOnError - whether or not to continue without throwing an exception in the event of an error
ignoreFailedDrops - whether of not to continue in the event of specifically an error on a DROP
Throws:
java.sql.SQLException

readScript

private java.lang.String readScript(EncodedResource resource)
                             throws java.io.IOException
Read a script from the given resource and build a String containing the lines.

Parameters:
resource - the resource to be read
Returns:
String containing the script lines
Throws:
java.io.IOException - in case of I/O errors

maybeAddSeparatorToScript

private void maybeAddSeparatorToScript(java.lang.StringBuilder scriptBuilder)

containsSqlScriptDelimiters

private boolean containsSqlScriptDelimiters(java.lang.String script,
                                            java.lang.String delim)
Does the provided SQL script contain the specified delimiter?

Parameters:
script - the SQL script
delim - character delimiting each statement - typically a ';' character

splitSqlScript

private void splitSqlScript(java.lang.String script,
                            java.lang.String delim,
                            java.util.List<java.lang.String> statements)
Split an SQL script into separate statements delimited with the provided delimiter character. Each individual statement will be added to the provided List.

Parameters:
script - the SQL script
delim - character delimiting each statement (typically a ';' character)
statements - the List that will contain the individual statements