Author: rmannibucau
Date: Mon Jul 23 23:17:13 2012
New Revision: 1364835
URL: http://svn.apache.org/viewvc?rev=1364835&view=rev
Log:
tomee-dbcp module
Added:
openejb/branches/openejb-pool/tomee/tomee-dbcp/
openejb/branches/openejb-pool/tomee/tomee-dbcp/pom.xml
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomEEDataSourceCreator.java
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomcatDbcpDataSource.java
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/org/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/org/apache/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/org/apache/tomee/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/org/apache/tomee/dbcp/
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/org/apache/tomee/dbcp/TomcatPoolTest.java
Modified:
openejb/branches/openejb-pool/tomee/pom.xml
Modified: openejb/branches/openejb-pool/tomee/pom.xml
URL:
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/tomee/pom.xml?rev=1364835&r1=1364834&r2=1364835&view=diff
==============================================================================
--- openejb/branches/openejb-pool/tomee/pom.xml (original)
+++ openejb/branches/openejb-pool/tomee/pom.xml Mon Jul 23 23:17:13 2012
@@ -44,6 +44,7 @@
<module>tomee-jaxrs-webapp</module>
<module>apache-tomee</module>
<module>apache-tomcat</module>
+ <module>tomee-dbcp</module>
</modules>
<repositories>
Added: openejb/branches/openejb-pool/tomee/tomee-dbcp/pom.xml
URL:
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/tomee/tomee-dbcp/pom.xml?rev=1364835&view=auto
==============================================================================
--- openejb/branches/openejb-pool/tomee/tomee-dbcp/pom.xml (added)
+++ openejb/branches/openejb-pool/tomee/tomee-dbcp/pom.xml Mon Jul 23 23:17:13
2012
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>tomee</artifactId>
+ <groupId>org.apache.openejb</groupId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>tomee-dbcp</artifactId>
+ <name>OpenEJB :: TomEE :: Common</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-core</artifactId>
+ <version>${openejb.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-jdbc</artifactId>
+ <version>${tomcat.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-dbcp</artifactId>
+ <version>${tomcat.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ </dependencies>
+</project>
Added:
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomEEDataSourceCreator.java
URL:
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomEEDataSourceCreator.java?rev=1364835&view=auto
==============================================================================
---
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomEEDataSourceCreator.java
(added)
+++
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomEEDataSourceCreator.java
Mon Jul 23 23:17:13 2012
@@ -0,0 +1,52 @@
+package org.apache.tomee.dbcp;
+
+import org.apache.openejb.resource.jdbc.pool.PoolDataSourceCreator;
+import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
+import org.apache.tomcat.jdbc.pool.DataSourceFactory;
+
+import javax.sql.DataSource;
+import java.util.Map;
+import java.util.Properties;
+
+public class TomEEDataSourceCreator extends PoolDataSourceCreator {
+ @Override
+ public DataSource pool(final String name, final DataSource ds) {
+ return new TomcatDbcpDataSource(ds);
+ }
+
+ @Override
+ public DataSource pool(final String name, final String driver, final
Properties properties) {
+ final Properties converted = new Properties();
+ converted.setProperty("name", name);
+ // some compatibility with old dbcp style
+ if (properties.containsKey("JdbcDriver")) {
+ converted.setProperty("driverClassName", driver);
+ }
+ if (properties.containsKey("JdbcUrl")) {
+ converted.setProperty("url", properties.getProperty("JdbcUrl"));
+ }
+ for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+ for (String key : PropertiesReader.KEYS) {
+ final String thisKey = entry.getKey().toString();
+ if (key.equalsIgnoreCase(thisKey)) {
+ converted.put(key, entry.getValue());
+ }
+ }
+ }
+ return new
org.apache.tomcat.jdbc.pool.DataSource(DataSourceFactory.parsePoolProperties(converted));
+ }
+
+ @Override
+ public boolean hasCreated(final Object object) {
+ return object instanceof org.apache.tomcat.jdbc.pool.DataSource;
+ }
+
+ @Override
+ public void destroy(final Object object) throws Throwable {
+ ((org.apache.tomcat.jdbc.pool.DataSource) object).close(true);
+ }
+
+ private static class PropertiesReader extends DataSourceFactory {
+ public static final String[] KEYS = ALL_PROPERTIES;
+ }
+}
Added:
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomcatDbcpDataSource.java
URL:
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomcatDbcpDataSource.java?rev=1364835&view=auto
==============================================================================
---
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomcatDbcpDataSource.java
(added)
+++
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/main/java/org/apache/tomee/dbcp/TomcatDbcpDataSource.java
Mon Jul 23 23:17:13 2012
@@ -0,0 +1,39 @@
+package org.apache.tomee.dbcp;
+
+import org.apache.openejb.resource.jdbc.DataSourceHelper;
+import org.apache.openejb.util.reflection.Reflections;
+import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
+import org.apache.tomcat.dbcp.dbcp.ConnectionFactory;
+import org.apache.tomcat.dbcp.dbcp.DataSourceConnectionFactory;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.logging.Logger;
+
+public class TomcatDbcpDataSource extends BasicDataSource {
+ private final DataSource dataSource;
+
+ public TomcatDbcpDataSource(final DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ @Override
+ protected ConnectionFactory createConnectionFactory() throws SQLException {
+ return new DataSourceConnectionFactory(dataSource, username, password);
+ }
+
+ @Override
+ public void setUrl(String url) {
+ try {
+ DataSourceHelper.setUrl(this, url);
+ } catch (Throwable e1) {
+ super.setUrl(url);
+ }
+ }
+
+ // @Override JDK7
+ public Logger getParentLogger() throws SQLFeatureNotSupportedException {
+ return (Logger) Reflections.invokeByReflection(dataSource,
"getParentLogger", new Class<?>[0], null);
+ }
+}
Added:
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/org/apache/tomee/dbcp/TomcatPoolTest.java
URL:
http://svn.apache.org/viewvc/openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/org/apache/tomee/dbcp/TomcatPoolTest.java?rev=1364835&view=auto
==============================================================================
---
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/org/apache/tomee/dbcp/TomcatPoolTest.java
(added)
+++
openejb/branches/openejb-pool/tomee/tomee-dbcp/src/test/java/org/apache/tomee/dbcp/TomcatPoolTest.java
Mon Jul 23 23:17:13 2012
@@ -0,0 +1,215 @@
+package org.apache.tomee.dbcp;
+
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.SingletonBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.junit.Configuration;
+import org.apache.openejb.junit.Module;
+import org.apache.openejb.resource.jdbc.managed.local.ManagedConnection;
+import org.apache.openejb.resource.jdbc.pool.DbcpDataSourceCreator;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.ejb.EJBContext;
+import javax.ejb.LocalBean;
+import javax.ejb.Singleton;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+import javax.sql.DataSource;
+import java.lang.reflect.Field;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(ApplicationComposer.class)
+public class TomcatPoolTest {
+ private static final String URL =
"jdbc:hsqldb:mem:managed;hsqldb.tx=MVCC"; // mvcc otherwise multiple
transaction tests will fail
+ private static final String USER = "sa";
+ private static final String PASSWORD = "";
+ private static final String TABLE = "PUBLIC.MANAGED_DATASOURCE_TEST";
+
+ @EJB
+ private Persister persistManager;
+
+ @BeforeClass
+ public static void createTable() throws SQLException,
ClassNotFoundException {
+ Class.forName("org.hsqldb.jdbcDriver");
+
+ final Connection connection = DriverManager.getConnection(URL, USER,
PASSWORD);
+ final Statement statement = connection.createStatement();
+ statement.execute("CREATE TABLE " + TABLE + "(ID INTEGER)");
+ statement.close();
+ connection.commit();
+ connection.close();
+ }
+
+ @Configuration
+ public Properties config() {
+ final Properties p = new Properties();
+ p.put("openejb.jdbc.datasource-creator",
TomEEDataSourceCreator.class.getName());
+
+ p.put("managed", "new://Resource?type=DataSource");
+ p.put("managed.JdbcDriver", "org.hsqldb.jdbcDriver");
+ p.put("managed.JdbcUrl", URL);
+ p.put("managed.UserName", USER);
+ p.put("managed.Password", PASSWORD);
+ p.put("managed.JtaManaged", "true");
+ return p;
+ }
+
+ @Module
+ public EjbJar app() throws Exception {
+ return new EjbJar()
+ .enterpriseBean(new SingletonBean(Persister.class).localBean())
+ .enterpriseBean(new
SingletonBean(OtherPersister.class).localBean());
+ }
+
+ @LocalBean
+ @Singleton
+ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ public static class OtherPersister {
+ @Resource(name = "managed")
+ private DataSource ds;
+
+ @Resource
+ private EJBContext context;
+
+ public void save() throws SQLException {
+ TomcatPoolTest.save(ds, 10);
+ }
+
+ public void saveAndRollback() throws SQLException {
+ TomcatPoolTest.save(ds, 11);
+ context.setRollbackOnly();
+ }
+ }
+
+ @LocalBean
+ @Singleton
+ public static class Persister {
+ @Resource(name = "managed")
+ private DataSource ds;
+
+ @Resource
+ private EJBContext context;
+
+ @EJB
+ private OtherPersister other;
+
+ public void save() throws SQLException {
+ TomcatPoolTest.save(ds, 1);
+ }
+
+ public void saveAndRollback() throws SQLException {
+ TomcatPoolTest.save(ds, 2);
+ context.setRollbackOnly();
+ }
+
+ public void saveTwice() throws SQLException {
+ TomcatPoolTest.save(ds, 3);
+ TomcatPoolTest.save(ds, 4);
+ }
+
+ public void rollbackMultipleSave() throws SQLException {
+ TomcatPoolTest.save(ds, 5);
+ TomcatPoolTest.save(ds, 6);
+ context.setRollbackOnly();
+ }
+
+ public void saveInThisTxAndAnotherOne() throws SQLException {
+ TomcatPoolTest.save(ds, 7);
+ other.save();
+ }
+
+ public void saveInThisTxAndRollbackInAnotherOne() throws SQLException {
+ TomcatPoolTest.save(ds, 8);
+ other.saveAndRollback();
+ }
+ }
+
+ @Test
+ public void commit() throws SQLException {
+ persistManager.save();
+ assertTrue(exists(1));
+ }
+
+ @Test
+ public void rollback() throws SQLException {
+ persistManager.saveAndRollback();
+ assertFalse(exists(2));
+ }
+
+ @Test
+ public void commit2() throws SQLException {
+ persistManager.saveTwice();
+ assertTrue(exists(3));
+ assertTrue(exists(4));
+ }
+
+ @Test
+ public void rollback2() throws SQLException {
+ persistManager.rollbackMultipleSave();
+ assertFalse(exists(5));
+ assertFalse(exists(6));
+ }
+
+ @Test
+ public void saveDifferentTx() throws SQLException {
+ persistManager.saveInThisTxAndAnotherOne();
+ assertTrue(exists(7));
+ assertTrue(exists(10));
+ }
+
+ @Test
+ public void saveRollbackDifferentTx() throws SQLException {
+ persistManager.saveInThisTxAndRollbackInAnotherOne();
+ assertTrue(exists(8));
+ assertFalse(exists(12));
+ }
+
+ @After
+ public void checkTxMapIsEmpty() throws Exception { // avoid memory leak
+ final Field map =
ManagedConnection.class.getDeclaredField("CONNECTION_BY_TX");
+ map.setAccessible(true);
+ final Map<?, ?> instance = (Map<?, ?>) map.get(null);
+ assertEquals(0, instance.size());
+ }
+
+ private static boolean exists(int id) throws SQLException {
+ final Connection connection = DriverManager.getConnection(URL, USER,
PASSWORD);
+ final Statement statement = connection.createStatement();
+ final ResultSet result = statement.executeQuery("SELECT count(*) AS NB
FROM " + TABLE + " WHERE ID = " + id);
+ try {
+ assertTrue(result.next());
+ return result.getInt(1) == 1;
+ } finally {
+ statement.close();
+ connection.close();
+ }
+ }
+
+ private static void save(final DataSource ds, int id) throws SQLException {
+ execute(ds, "INSERT INTO " + TABLE + "(ID) VALUES(" + id + ")");
+ }
+
+ private static void execute(final DataSource ds, final String sql) throws
SQLException {
+ final Connection connection = ds.getConnection();
+ final Statement statement = connection.createStatement();
+ statement.executeUpdate(sql);
+ statement.close();
+ connection.close();
+ }
+}
+