Author: rmannibucau Date: Tue May 28 06:53:03 2013 New Revision: 1486777 URL: http://svn.apache.org/r1486777 Log: OPENEJB-2027 datasource definition properties wringly parsed
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionPlaceHolderTest.java tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1486777&r1=1486776&r2=1486777&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Tue May 28 06:53:03 2013 @@ -116,6 +116,7 @@ import org.apache.openejb.util.Propertie import org.apache.openejb.util.PropertyPlaceHolderHelper; import org.apache.openejb.util.References; import org.apache.openejb.util.SafeToolkit; +import org.apache.openejb.util.SuperProperties; import org.apache.openejb.util.URLs; import org.apache.openejb.util.proxy.ProxyFactory; import org.apache.openejb.util.proxy.ProxyManager; @@ -2046,19 +2047,17 @@ public class Assembler extends Assembler if (serviceInfo.properties.containsKey("Definition")) { try { // we catch classcast etc..., if it fails it is not important final InputStream is = new ByteArrayInputStream(serviceInfo.properties.getProperty("Definition").getBytes()); - final Properties p = new Properties(); + final Properties p = new SuperProperties(); IO.readProperties(is, p); for (final Map.Entry<Object, Object> entry : p.entrySet()) { final String key = entry.getKey().toString(); if (!props.containsKey(key) // never override from Definition, just use it to complete the properties set - && - !(key.equalsIgnoreCase("url") && - props.containsKey("JdbcUrl"))) { // with @DataSource we can get both, see org.apache.openejb.config.ConvertDataSourceDefinitions.rawDefinition() + && !(key.equalsIgnoreCase("url") && props.containsKey("JdbcUrl"))) { // with @DataSource we can get both, see org.apache.openejb.config.ConvertDataSourceDefinitions.rawDefinition() props.put(key, entry.getValue()); } } - } catch (Exception e) { + } catch (final Exception e) { // ignored } } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1486777&r1=1486776&r2=1486777&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Tue May 28 06:53:03 2013 @@ -118,6 +118,7 @@ import org.apache.openejb.util.Classes; import org.apache.openejb.util.Join; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; +import org.apache.openejb.util.SuperProperties; import org.apache.openejb.util.proxy.DynamicProxyImplFactory; import org.apache.xbean.finder.Annotated; import org.apache.xbean.finder.AnnotationFinder; @@ -209,7 +210,9 @@ import javax.xml.ws.WebServiceRefs; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; +import java.io.ByteArrayInputStream; import java.io.File; +import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -4431,11 +4434,25 @@ public class AnnotationDeployer implemen if (!d.url().isEmpty()) dataSource.setUrl(d.url()); if (!d.user().isEmpty()) dataSource.setUser(d.user()); - for (String s : d.properties()) { - final String key = s.substring(0, s.indexOf('=')); - final String value = s.substring(s.indexOf('=')); - - dataSource.property(key, value); + for (final String s : d.properties()) { + final int equal = s.indexOf('='); + if (equal < s.length() - 1) { + final SuperProperties props = new SuperProperties(); + try { + props.load(new ByteArrayInputStream(s.getBytes())); + for (final String key : props.stringPropertyNames()) { + if (!key.isEmpty()) { + dataSource.property(key, props.getProperty(key)); + } + } + } catch (final IOException e) { + final String key = s.substring(0, equal).trim(); + final String value = s.substring(equal + 1).trim(); + dataSource.property(key, value); + } + } else { + dataSource.property(s.trim(), ""); + } } consumer.getDataSource().add(dataSource); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java?rev=1486777&r1=1486776&r2=1486777&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/pool/DefaultDataSourceCreator.java Tue May 28 06:53:03 2013 @@ -37,13 +37,14 @@ public class DefaultDataSourceCreator ex @Override public DataSource poolManaged(final String name, final DataSource ds, final Properties properties) { - return new DbcpManagedDataSource(name, ds); + return build(DbcpManagedDataSource.class, new DbcpManagedDataSource(name, ds), properties); } @Override public DataSource poolManaged(final String name, final String driver, final Properties properties) { final BasicManagedDataSource ds = new BasicManagedDataSource(name); ds.setDriverClassName(driver); + build(BasicManagedDataSource.class, ds, properties); return ds; } @@ -51,18 +52,20 @@ public class DefaultDataSourceCreator ex public DataSource poolManagedWithRecovery(final String name, final XAResourceWrapper xaResourceWrapper, final String driver, final Properties properties) { final BasicManagedDataSource ds = new ManagedDataSourceWithRecovery(name, xaResourceWrapper); ds.setDriverClassName(driver); + build(BasicManagedDataSource.class, ds, properties); return ds; } @Override public DataSource pool(final String name, final DataSource ds, final Properties properties) { - return new DbcpDataSource(name, ds); + return build(DbcpDataSource.class, new DbcpDataSource(name, ds), properties); } @Override public DataSource pool(final String name, final String driver, final Properties properties) { final BasicDataSource ds = new BasicDataSource(name); ds.setDriverClassName(driver); + build(BasicManagedDataSource.class, ds, properties); return ds; } @@ -75,9 +78,4 @@ public class DefaultDataSourceCreator ex protected void doDestroy(final DataSource dataSource) throws Throwable { ((org.apache.commons.dbcp.BasicDataSource) dataSource).close(); } - - @Override - public ObjectRecipe clearRecipe(final Object object) { - return null; // no recipe here - } } Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionPlaceHolderTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionPlaceHolderTest.java?rev=1486777&r1=1486776&r2=1486777&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionPlaceHolderTest.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionPlaceHolderTest.java Tue May 28 06:53:03 2013 @@ -101,8 +101,7 @@ public class DataSourceDefinitionPlaceHo @Test public void checkLookup() throws Exception { - final DataSource ds = (DataSource) SystemInstance.get().getComponent(ContainerSystem.class) - .getJNDIContext().lookup("java:comp/env/superDS"); + final DataSource ds = (DataSource) SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext().lookup("java:comp/env/superDS"); check(ds); } } Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java?rev=1486777&r1=1486776&r2=1486777&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/DataSourceDefinitionTest.java Tue May 28 06:53:03 2013 @@ -17,6 +17,8 @@ package org.apache.openejb.assembler.classic; import org.apache.openejb.junit.ApplicationComposer; +import org.apache.openejb.resource.jdbc.dbcp.DbcpManagedDataSource; +import org.apache.openejb.resource.jdbc.managed.local.ManagedDataSource; import org.apache.openejb.testing.Module; import org.junit.Test; import org.junit.runner.RunWith; @@ -38,6 +40,7 @@ import java.util.List; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; /** * Note: to make this test work under JavaSE 6 you should add geronimo-annotation_1.1_spec in your endorsed dir. @@ -54,7 +57,7 @@ public class DataSourceDefinitionTest { @Module public Class<?>[] app() throws Exception { - return new Class<?>[]{DatasourceDefinitionBean.class, DatasourceDefinitionsBean.class}; + return new Class<?>[]{ DatasourceDefinitionBean.class, DatasourceDefinitionsBean.class }; } @DataSourceDefinition( @@ -62,7 +65,8 @@ public class DataSourceDefinitionTest { className = "org.hsqldb.jdbc.JDBCDataSource", user = "sa", password = "", - url = "jdbc:hsqldb:mem:superDS" + url = "jdbc:hsqldb:mem:superDS", + properties = { "poolPreparedStatements = true", "minIdle = 2", "maxOpenPreparedStatements = 20" } ) @Singleton public static class DatasourceDefinitionBean { @@ -72,6 +76,12 @@ public class DataSourceDefinitionTest { public DataSource getDs() { return ds; } + + public void validProperties() { + final DbcpManagedDataSource dbcp = DbcpManagedDataSource.class.cast(ds); + assertEquals(2, dbcp.getMinIdle()); + assertTrue(dbcp.isPoolPreparedStatements()); + } } @DataSourceDefinitions({ @@ -88,6 +98,7 @@ public class DataSourceDefinitionTest { user = "sa", password = "", url = "jdbc:hsqldb:mem:superDS" + ) }) @Stateless @@ -109,6 +120,7 @@ public class DataSourceDefinitionTest { @Test public void assertDataSourceDefinition() throws Exception { assertDataSourceDefinitionValues(uniqueDataSource.getDs(), "org.hsqldb.jdbc.JDBCDataSource", "sa", ""); + uniqueDataSource.validProperties(); } @Test @@ -165,20 +177,23 @@ public class DataSourceDefinitionTest { public Movies(DataSource movieDatabase) throws SQLException { this.movieDatabase = movieDatabase; - Connection connection = movieDatabase.getConnection(); - PreparedStatement stmt = connection.prepareStatement("CREATE TABLE movie ( director VARCHAR(255), title VARCHAR(255), year integer)"); + final Connection connection = movieDatabase.getConnection(); + final PreparedStatement stmt = connection.prepareStatement("CREATE TABLE movie ( director VARCHAR(255), title VARCHAR(255), year integer)"); stmt.execute(); + stmt.close(); + connection.close(); } public void addMovie(Movie movie) throws Exception { Connection conn = movieDatabase.getConnection(); try { - PreparedStatement sql = conn.prepareStatement("INSERT into movie (director, title, year) values (?, ?, ?)"); + final PreparedStatement sql = conn.prepareStatement("INSERT into movie (director, title, year) values (?, ?, ?)"); sql.setString(1, movie.getDirector()); sql.setString(2, movie.getTitle()); sql.setInt(3, movie.getYear()); sql.execute(); + sql.close(); } finally { conn.close(); } @@ -193,6 +208,7 @@ public class DataSourceDefinitionTest { sql.setString(2, movie.getTitle()); sql.setInt(3, movie.getYear()); sql.execute(); + sql.close(); } finally { conn.close(); }