提交 96629c7d 编写于 作者: K Keith Donald

h2 embedded db support; updated formatting conventions not to auto-format...

h2 embedded db support; updated formatting conventions not to auto-format javadoc; added hsqldb and h2 to jdbc maven pom as optional deps
上级 93cf346f
#Mon Mar 30 13:51:02 EDT 2009
#Sat May 09 18:07:13 EDT 2009
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
......@@ -55,13 +55,13 @@ org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_block_comments=false
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_html=false
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
org.eclipse.jdt.core.formatter.comment.format_line_comments=false
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=do not insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
......
......@@ -16,5 +16,6 @@
<classpathentry kind="var" path="IVY_CACHE/org.junit/com.springsource.org.junit/4.5.0/com.springsource.org.junit-4.5.0.jar" sourcepath="/IVY_CACHE/org.junit/com.springsource.org.junit/4.5.0/com.springsource.org.junit-sources-4.5.0.jar"/>
<classpathentry kind="var" path="IVY_CACHE/org.easymock/com.springsource.org.easymock/2.3.0/com.springsource.org.easymock-2.3.0.jar" sourcepath="/IVY_CACHE/org.easymock/com.springsource.org.easymock/2.3.0/com.springsource.org.easymock-sources-2.3.0.jar"/>
<classpathentry kind="var" path="IVY_CACHE/org.hsqldb/com.springsource.org.hsqldb/1.8.0.9/com.springsource.org.hsqldb-1.8.0.9.jar" sourcepath="/IVY_CACHE/org.hsqldb/com.springsource.org.hsqldb/1.8.0.9/com.springsource.org.hsqldb-sources-1.8.0.9.jar"/>
<classpathentry kind="var" path="IVY_CACHE/com.h2database/com.springsource.org.h2/1.0.71/com.springsource.org.h2-1.0.71.jar" sourcepath="/IVY_CACHE/com.h2database/com.springsource.org.h2/1.0.71/com.springsource.org.h2-sources-1.0.71.jar"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
#Wed May 06 02:42:56 EDT 2009
#Sat May 09 18:07:13 EDT 2009
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
......@@ -55,11 +55,11 @@ org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_block_comments=false
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=false
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
org.eclipse.jdt.core.formatter.comment.format_line_comments=false
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
......
......@@ -30,7 +30,8 @@
<dependency org="org.springframework" name="org.springframework.context" rev="latest.integration" conf="optional, jndi->compile"/>
<dependency org="org.springframework" name="org.springframework.core" rev="latest.integration" conf="compile->compile"/>
<dependency org="org.springframework" name="org.springframework.transaction" rev="latest.integration" conf="compile->compile"/>
<dependency org="org.hsqldb" name="com.springsource.org.hsqldb" rev="1.8.0.9" conf="optional->compile"/>
<dependency org="org.hsqldb" name="com.springsource.org.hsqldb" rev="1.8.0.9" conf="optional->compile"/>
<dependency org="com.h2database" name="com.springsource.org.h2" rev="1.0.71" conf="optional->compile"/>
<!-- test dependencies -->
<dependency org="org.junit" name="com.springsource.org.junit" rev="4.5.0" conf="test->runtime"/>
<dependency org="org.easymock" name="com.springsource.org.easymock" rev="2.3.0" conf="test->compile"/>
......
......@@ -55,6 +55,20 @@
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.7</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.0.71</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
......
/*
* Copyright 2002-2009 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.jdbc.datasource.embedded;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Base class for {@link EmbeddedDatabaseConfigurer} implementations providing common shutdown behaviour.
* @author Oliver Gierke
*/
abstract class AbstractEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigurer {
private static final Log logger = LogFactory.getLog(AbstractEmbeddedDatabaseConfigurer.class);
public void shutdown(DataSource dataSource, String databaseName) {
Connection connection = JdbcUtils.getConnection(dataSource);
Statement stmt = null;
try {
stmt = connection.createStatement();
stmt.execute("SHUTDOWN");
} catch (SQLException e) {
if (logger.isWarnEnabled()) {
logger.warn("Could not shutdown embedded database", e);
}
} finally {
JdbcUtils.closeStatement(stmt);
}
}
}
......@@ -34,7 +34,8 @@ public interface EmbeddedDatabaseConfigurer {
/**
* Shutdown the embedded database instance that backs dataSource.
* @param dataSource the data source
* @param databaseName the name of the database being shutdown
*/
void shutdown(DataSource dataSource);
void shutdown(DataSource dataSource, String databaseName);
}
......@@ -18,21 +18,25 @@ package org.springframework.jdbc.datasource.embedded;
import org.springframework.util.Assert;
/**
* Maps well-known {@link EmbeddedDatabaseType embedded database types} to
* {@link EmbeddedDatabaseConfigurer} strategies.
* Maps well-known {@link EmbeddedDatabaseType embedded database types} to {@link EmbeddedDatabaseConfigurer}
* strategies.
* @author Keith Donald
* @author Oliver Gierke
*/
final class EmbeddedDatabaseConfigurerFactory {
private EmbeddedDatabaseConfigurerFactory() {
private EmbeddedDatabaseConfigurerFactory() {
}
public static EmbeddedDatabaseConfigurer getConfigurer(EmbeddedDatabaseType type) throws IllegalStateException {
Assert.notNull(type, "The EmbeddedDatabaseType is required");
try {
if (type == EmbeddedDatabaseType.HSQL) {
switch (type) {
case HSQL:
return HsqlEmbeddedDatabaseConfigurer.getInstance();
} else {
case H2:
return H2EmbeddedDatabaseConfigurer.getInstance();
default:
throw new UnsupportedOperationException("Other embedded database types not yet supported");
}
} catch (ClassNotFoundException e) {
......@@ -40,5 +44,4 @@ final class EmbeddedDatabaseConfigurerFactory {
+ "] are not available in the classpath", e);
}
}
}
......@@ -26,8 +26,8 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.util.Assert;
/**
* Creates a {@link EmbeddedDatabase} instance.
* Callers are guaranteed that the returned database has been fully initialized and populated.
* Creates a {@link EmbeddedDatabase} instance. Callers are guaranteed that the returned database has been fully
* initialized and populated.
* <p>
* Can be configured:<br>
* Call {@link #setDatabaseName(String)} to change the name of the database.<br>
......@@ -54,8 +54,8 @@ public class EmbeddedDatabaseFactory {
private DataSource dataSource;
/**
* Creates a default {@link EmbeddedDatabaseFactory}. Calling {@link #getDatabase()} will create a embedded HSQL
* database of name 'testdb'.
* Creates a default {@link EmbeddedDatabaseFactory}.
* Calling {@link #getDatabase()} will create a embedded HSQL database of name 'testdb'.
*/
public EmbeddedDatabaseFactory() {
setDatabaseName("testdb");
......@@ -82,8 +82,8 @@ public class EmbeddedDatabaseFactory {
}
/**
* Sets the strategy that will be used to configure the embedded database instance. Call this when you wish to use
* an embedded database type not already supported.
* Sets the strategy that will be used to configure the embedded database instance.
* Call this when you wish to use an embedded database type not already supported.
* @param configurer the embedded database configurer
*/
public void setDatabaseConfigurer(EmbeddedDatabaseConfigurer configurer) {
......@@ -100,8 +100,8 @@ public class EmbeddedDatabaseFactory {
}
/**
* Sets the factory to use to create the DataSource instance that connects to the embedded database. Defaults to
* {@link SimpleDriverDataSourceFactory}.
* Sets the factory to use to create the DataSource instance that connects to the embedded database
* Defaults to {@link SimpleDriverDataSourceFactory}.
* @param dataSourceFactory the data source factory
*/
public void setDataSourceFactory(DataSourceFactory dataSourceFactory) {
......@@ -124,9 +124,8 @@ public class EmbeddedDatabaseFactory {
// subclassing hooks
/**
* Hook to initialize the embedded database.
* Subclasses may call to force initialization.
* After calling this method, {@link #getDataSource()} returns the DataSource providing connectivity to the db.
* Hook to initialize the embedded database. Subclasses may call to force initialization. After calling this method,
* {@link #getDataSource()} returns the DataSource providing connectivity to the db.
*/
protected void initDatabase() {
// create the embedded database source first
......@@ -152,14 +151,12 @@ public class EmbeddedDatabaseFactory {
}
/**
* Hook to shutdown the embedded database.
* Subclasses may call to force shutdown.
* After calling, {@link #getDataSource()} returns null.
* Does nothing if no embedded database has been initialized.
* Hook to shutdown the embedded database. Subclasses may call to force shutdown.
* After calling, {@link #getDataSource()} returns null. Does nothing if no embedded database has been initialized.
*/
protected void shutdownDatabase() {
if (dataSource != null) {
databaseConfigurer.shutdown(dataSource);
databaseConfigurer.shutdown(dataSource, databaseName);
dataSource = null;
}
}
......
......@@ -18,7 +18,8 @@ package org.springframework.jdbc.datasource.embedded;
/**
* A supported embedded database type.
* @author Keith Donald
* @author Oliver Gierke
*/
public enum EmbeddedDatabaseType {
HSQL;
HSQL, H2;
}
/*
* Copyright 2002-2009 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.jdbc.datasource.embedded;
import org.springframework.util.ClassUtils;
/**
* Initializes a HSQL embedded database instance.
* Call {@link #getInstance()} to get the singleton instance of this class. *
* @author Oliver Gierke
*/
final class H2EmbeddedDatabaseConfigurer extends AbstractEmbeddedDatabaseConfigurer {
private static H2EmbeddedDatabaseConfigurer INSTANCE;
private H2EmbeddedDatabaseConfigurer() {
}
/**
* Get the singleton {@link HsqlEmbeddedDatabaseConfigurer} instance.
* @return the configurer
* @throws ClassNotFoundException if HSQL is not on the classpath
*/
public static synchronized H2EmbeddedDatabaseConfigurer getInstance() throws ClassNotFoundException {
if (INSTANCE == null) {
ClassUtils.forName("org.h2.Driver", H2EmbeddedDatabaseConfigurer.class.getClassLoader());
INSTANCE = new H2EmbeddedDatabaseConfigurer();
}
return INSTANCE;
}
public void configureConnectionProperties(ConnectionProperties properties, String databaseName) {
properties.setDriverClass(org.h2.Driver.class);
properties.setUrl(String.format("jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1", databaseName));
properties.setUsername("sa");
properties.setPassword("");
}
}
\ No newline at end of file
......@@ -15,31 +15,21 @@
*/
package org.springframework.jdbc.datasource.embedded;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.ClassUtils;
/**
* Initializes a HSQL embedded database instance.
* Call {@link #getInstance()} to get the singleton instance of this class.
*
* @author Keith Donald
* @authoe Oliver Gierke
*/
final class HsqlEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigurer {
private static final Log logger = LogFactory.getLog(HsqlEmbeddedDatabaseConfigurer.class);
final class HsqlEmbeddedDatabaseConfigurer extends AbstractEmbeddedDatabaseConfigurer {
private static HsqlEmbeddedDatabaseConfigurer INSTANCE;
private HsqlEmbeddedDatabaseConfigurer() {
private HsqlEmbeddedDatabaseConfigurer() {
}
/**
* Get the singleton {@link HsqlEmbeddedDatabaseConfigurer} instance.
* @return the configurer
......@@ -52,27 +42,11 @@ final class HsqlEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigurer
}
return INSTANCE;
}
public void configureConnectionProperties(ConnectionProperties properties, String databaseName) {
properties.setDriverClass(org.hsqldb.jdbcDriver.class);
properties.setUrl("jdbc:hsqldb:mem:" + databaseName);
properties.setUsername("sa");
properties.setPassword("");
properties.setPassword("");
}
public void shutdown(DataSource dataSource) {
Connection connection = JdbcUtils.getConnection(dataSource);
Statement stmt = null;
try {
stmt = connection.createStatement();
stmt.execute("SHUTDOWN");
} catch (SQLException e) {
if (logger.isWarnEnabled()) {
logger.warn("Could not shutdown in-memory HSQL database", e);
}
} finally {
JdbcUtils.closeStatement(stmt);
}
}
}
......@@ -11,8 +11,9 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.CannotGetJdbcConnectionException;
/**
* Helper JDBC utilities used by other classes in this package. There is some duplication here with JdbcUtils in
* jdbc.support package. We may want to consider simply using that. Package private for now.
* Helper JDBC utilities used by other classes in this package.
* Note there is some duplication here with JdbcUtils in jdbc.support package.
* We may want to consider simply using that at some point.
* @author Keith Donald
*/
final class JdbcUtils {
......
......@@ -30,7 +30,7 @@
<xsd:documentation><![CDATA[
A SQL script to execute during embedded database initialization.
]]></xsd:documentation>
</xsd:annotation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="type" type="databaseType">
......@@ -57,7 +57,20 @@
<xsd:simpleType name="databaseType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="HSQL" />
<xsd:enumeration value="HSQL">
<xsd:annotation>
<xsd:documentation><![CDATA[
Hyper SQL Java Database Engine
]]></xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="H2">
<xsd:annotation>
<xsd:documentation><![CDATA[
H2 Java Database Engine
]]></xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
......
package org.springframework.jdbc.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.*;
import javax.sql.DataSource;
......@@ -12,9 +12,14 @@ 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);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"org/springframework/jdbc/config/jdbc-config.xml");
assertCorrectSetup(context.getBean("dataSource", DataSource.class));
assertCorrectSetup(context.getBean("h2dataSource", DataSource.class));
}
private void assertCorrectSetup(DataSource dataSource) {
JdbcTemplate t = new JdbcTemplate(dataSource);
assertEquals(1, t.queryForInt("select count(*) from T_TEST"));
}
}
package org.springframework.jdbc.datasource.embedded;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.junit.Assert.*;
import static org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType.*;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
public class EmbeddedDatabaseBuilderTests {
@Test
public void testBuildDefaults() {
EmbeddedDatabase db = EmbeddedDatabaseBuilder.buildDefault();
JdbcTemplate template = new JdbcTemplate(db);
assertEquals("Keith", template.queryForObject("select NAME from T_TEST", String.class));
db.shutdown();
assertDatabaseCreatedAndShutdown(db);
}
@Test
public void testBuild() {
EmbeddedDatabaseBuilder builder = EmbeddedDatabaseBuilder.relativeTo(getClass());
EmbeddedDatabase db = builder.script("db-schema.sql").script("db-test-data.sql").build();
JdbcTemplate template = new JdbcTemplate(db);
assertEquals("Keith", template.queryForObject("select NAME from T_TEST", String.class));
db.shutdown();
assertDatabaseCreatedAndShutdown(db);
}
@Test
public void testBuildH2() {
EmbeddedDatabaseBuilder builder = EmbeddedDatabaseBuilder.relativeTo(getClass());
EmbeddedDatabase db = builder.type(H2).script("db-schema.sql").script("db-test-data.sql").build();
assertDatabaseCreatedAndShutdown(db);
}
@Test
......@@ -34,4 +37,11 @@ public class EmbeddedDatabaseBuilderTests {
}
}
private void assertDatabaseCreatedAndShutdown(EmbeddedDatabase db) {
JdbcTemplate template = new JdbcTemplate(db);
assertEquals("Keith", template.queryForObject("select NAME from T_TEST", String.class));
db.shutdown();
}
}
\ No newline at end of file
......@@ -10,4 +10,9 @@
<jdbc:script location="classpath:org/springframework/jdbc/datasource/embedded/db-test-data.sql"/>
</jdbc:embedded-database>
<jdbc:embedded-database id="h2dataSource" type="H2">
<jdbc:script location="classpath:org/springframework/jdbc/datasource/embedded/db-schema.sql"/>
<jdbc:script location="classpath:org/springframework/jdbc/datasource/embedded/db-test-data.sql"/>
</jdbc:embedded-database>
</beans>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册