Repository: tomee Updated Branches: refs/heads/master b510ab726 -> 4444fb01b
TOMEE-1767 supporting XADataSource in @DataSourceDefinition Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/4444fb01 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/4444fb01 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/4444fb01 Branch: refs/heads/master Commit: 4444fb01b8e99661b6d89ea2c0bf0bc8151f7b4c Parents: b510ab7 Author: Romain manni-Bucau <rmannibu...@gmail.com> Authored: Mon Apr 4 17:21:21 2016 +0200 Committer: Romain manni-Bucau <rmannibu...@gmail.com> Committed: Mon Apr 4 17:21:21 2016 +0200 ---------------------------------------------------------------------- .../resource/jdbc/DataSourceFactory.java | 19 ++++-- .../classic/XADataSourceDefinitionTest.java | 72 ++++++++++++++++++++ 2 files changed, 85 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/4444fb01/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java index 4a0c265..41aeb45 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java @@ -39,6 +39,7 @@ import org.apache.xbean.recipe.Option; import org.apache.xbean.recipe.Recipe; import javax.sql.CommonDataSource; +import javax.sql.ConnectionPoolDataSource; import javax.sql.DataSource; import javax.sql.XADataSource; import java.io.Flushable; @@ -173,17 +174,18 @@ public class DataSourceFactory { recipe.setProperty("url", properties.getProperty("JdbcUrl")); } - final DataSource dataSource = (DataSource) recipe.create(); + final CommonDataSource dataSource = (CommonDataSource) recipe.create(); + final boolean isDs = DataSource.class.isInstance(dataSource); if (managed) { - if (usePool(properties)) { - ds = creator.poolManaged(name, dataSource, properties); + if (isDs && usePool(properties)) { + ds = creator.poolManaged(name, DataSource.class.cast(dataSource), properties); } else { ds = creator.managed(name, dataSource); } } else { - if (usePool(properties)) { - ds = creator.pool(name, dataSource, properties); + if (isDs && usePool(properties)) { + ds = creator.pool(name, DataSource.class.cast(dataSource), properties); } else { ds = dataSource; } @@ -437,7 +439,12 @@ public class DataSourceFactory { } private static boolean createDataSourceFromClass(final Class<?> impl) { - return DataSource.class.isAssignableFrom(impl) && !SystemInstance.get().getOptions().get("org.apache.openejb.resource.jdbc.hot.deploy", false); + return isDataSource(impl) && !SystemInstance.get().getOptions().get("org.apache.openejb.resource.jdbc.hot.deploy", false); + } + + private static boolean isDataSource(final Class<?> impl) { + return DataSource.class.isAssignableFrom(impl) || XADataSource.class.isAssignableFrom(impl) || + ConnectionPoolDataSource.class.isAssignableFrom(impl); } private static boolean usePool(final Properties properties) { http://git-wip-us.apache.org/repos/asf/tomee/blob/4444fb01/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/XADataSourceDefinitionTest.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/XADataSourceDefinitionTest.java b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/XADataSourceDefinitionTest.java new file mode 100644 index 0000000..581b0e2 --- /dev/null +++ b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/XADataSourceDefinitionTest.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.openejb.assembler.classic; + +import org.apache.openejb.junit.ApplicationComposer; +import org.apache.openejb.testing.Classes; +import org.apache.openejb.testing.SimpleLog; +import org.hsqldb.jdbc.pool.JDBCXADataSource; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.annotation.sql.DataSourceDefinition; +import javax.naming.InitialContext; +import javax.sql.DataSource; +import java.sql.Connection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +@SimpleLog +@Classes(cdi = true, innerClassesAsBean = true) +@RunWith(ApplicationComposer.class) +public class XADataSourceDefinitionTest { + @DataSourceDefinition( + name = "java:app/xads", + className = "org.hsqldb.jdbc.pool.JDBCXADataSource", + url = "jdbc:hsqldb:mem:XADataSourceDefinitionTest", + user = "sa" + ) + public static class Define { + } + + @DataSourceDefinition( + name = "java:app/xads2", + className = "org.hsqldb.jdbc.pool.JDBCXADataSource", + url = "jdbc:hsqldb:mem:XADataSourceDefinitionTest2", + user = "sa", + transactional = false + ) + public static class DefineNonJta { + } + + @Test + public void jta() throws Exception { + final Object lookup = new InitialContext().lookup("java:app/xads"); + assertTrue(DataSource.class.isInstance(lookup)); // jta so back to a ds + + final DataSource ds = DataSource.class.cast(lookup); + try (final Connection c = ds.getConnection()) { + assertEquals("jdbc:hsqldb:mem:XADataSourceDefinitionTest", c.getMetaData().getURL()); + } + } + + @Test + public void nonJta() throws Exception { + assertTrue(JDBCXADataSource.class.isInstance(new InitialContext().lookup("java:app/xads2"))); + } +}