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")));
+    }
+}

Reply via email to