You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2014/02/13 22:37:24 UTC

git commit: [KARAF-2729] Add support of XA datasources

Updated Branches:
  refs/heads/master 99ddd4ccb -> d79376eed


[KARAF-2729] Add support of XA datasources


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/d79376ee
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/d79376ee
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/d79376ee

Branch: refs/heads/master
Commit: d79376eedafa40a79b7c588770bd183018bf6d85
Parents: 99ddd4c
Author: Jean-Baptiste Onofré <jb...@apache.org>
Authored: Thu Feb 13 22:34:29 2014 +0100
Committer: Jean-Baptiste Onofré <jb...@apache.org>
Committed: Thu Feb 13 22:34:29 2014 +0100

----------------------------------------------------------------------
 .../karaf/jdbc/internal/JdbcConnector.java      | 43 +++++++++++++-------
 .../karaf/jdbc/internal/JdbcServiceImpl.java    |  9 +++-
 2 files changed, 35 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/d79376ee/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcConnector.java
----------------------------------------------------------------------
diff --git a/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcConnector.java b/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcConnector.java
index 0191554..11c7ca4 100644
--- a/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcConnector.java
+++ b/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcConnector.java
@@ -18,18 +18,17 @@ package org.apache.karaf.jdbc.internal;
 
 import java.io.Closeable;
 import java.io.IOException;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Collection;
+import java.sql.*;
 import java.util.Deque;
 import java.util.LinkedList;
 
 import javax.sql.DataSource;
+import javax.sql.XAConnection;
+import javax.sql.XADataSource;
 
 import org.apache.karaf.util.StreamUtils;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
@@ -38,7 +37,7 @@ public class JdbcConnector implements Closeable {
     private String datasourceName;
     private Connection connection;
     private Deque<Closeable> resources;
-    private ServiceReference<DataSource> reference;
+    private ServiceReference<?> reference;
 
     public JdbcConnector(BundleContext bundleContext, String datasourceName) {
         this.bundleContext = bundleContext;
@@ -48,8 +47,13 @@ public class JdbcConnector implements Closeable {
     
     public Connection connect() throws SQLException {
         reference = lookupDataSource(datasourceName);
-        DataSource ds = (DataSource) bundleContext.getService(reference);
-        connection = ds.getConnection();
+        Object datasource = bundleContext.getService(reference);
+        if (datasource instanceof DataSource) {
+            connection = ((DataSource) datasource).getConnection();
+        }
+        if (datasource instanceof XADataSource) {
+            connection = ((XADataSource) datasource).getXAConnection().getConnection();
+        }
         return connection;
     }
     
@@ -57,7 +61,13 @@ public class JdbcConnector implements Closeable {
         if (connection == null) {
             connect();
         }
-        return register(connection.createStatement());
+        if (connection instanceof Connection) {
+            return register(((Connection) connection).createStatement());
+        }
+        if (connection instanceof XAConnection) {
+            return register(((XAConnection) connection).getConnection().createStatement());
+        }
+        return null;
     }
 
     public Connection register(final Connection connection) {
@@ -106,20 +116,23 @@ public class JdbcConnector implements Closeable {
     }
     
 
-    private ServiceReference<DataSource> lookupDataSource(String name) {
-        Collection<ServiceReference<DataSource>> references;
+    private ServiceReference<?> lookupDataSource(String name) {
+        ServiceReference<?>[] references;
         try {
-            references = bundleContext.getServiceReferences(DataSource.class, "(|(osgi.jndi.service.name=" + name + ")(datasource=" + name + ")(name=" + name + ")(service.id=" + name + "))");
+            references = bundleContext.getServiceReferences((String) null,
+                    "(&(|(" + Constants.OBJECTCLASS + "=" + DataSource.class.getName() + ")"
+                    + "(" + Constants.OBJECTCLASS + "=" + XADataSource.class.getName() + "))"
+                    + "(|(osgi.jndi.service.name=" + name + ")(datasource=" + name + ")(name=" + name + ")(service.id=" + name + ")))");
         } catch (InvalidSyntaxException e) {
             throw new IllegalArgumentException("Error finding datasource with name " + name, e);
         }
-        if (references == null || references.size() == 0) {
+        if (references == null || references.length == 0) {
             throw new IllegalArgumentException("No JDBC datasource found for " + name);
         }
-        if (references.size() > 1) {
+        if (references.length > 1) {
             throw new IllegalArgumentException("Multiple JDBC datasource found for " + name);
         }
-        return references.iterator().next();
+        return references[0];
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/d79376ee/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcServiceImpl.java
----------------------------------------------------------------------
diff --git a/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcServiceImpl.java b/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcServiceImpl.java
index 37d907a..59f9418 100644
--- a/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcServiceImpl.java
+++ b/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcServiceImpl.java
@@ -18,11 +18,13 @@ package org.apache.karaf.jdbc.internal;
 
 import org.apache.karaf.jdbc.JdbcService;
 import org.apache.karaf.util.TemplateUtils;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
 import javax.sql.DataSource;
+import javax.sql.XADataSource;
 
 import java.io.*;
 import java.sql.*;
@@ -113,9 +115,11 @@ public class JdbcServiceImpl implements JdbcService {
     @Override
     public List<String> datasources() throws Exception {
         List<String> datasources = new ArrayList<String>();
-        Collection<ServiceReference<DataSource>> references = bundleContext.getServiceReferences(DataSource.class, null);
+
+        ServiceReference<?>[] references = bundleContext.getServiceReferences((String) null, "(|(" + Constants.OBJECTCLASS + "=" + DataSource.class.getName() + ")("
+        + Constants.OBJECTCLASS + "=" + XADataSource.class.getName() + "))");
         if (references != null) {
-            for (ServiceReference<DataSource> reference : references) {
+            for (ServiceReference reference : references) {
                 if (reference.getProperty("osgi.jndi.service.name") != null) {
                     datasources.add((String) reference.getProperty("osgi.jndi.service.name"));
                 } else if (reference.getProperty("datasource") != null) {
@@ -182,6 +186,7 @@ public class JdbcServiceImpl implements JdbcService {
     public Map<String, List<String>> tables(String datasource) throws Exception {
         JdbcConnector jdbcConnector = new JdbcConnector(bundleContext, datasource);
         try {
+
             DatabaseMetaData dbMetaData = jdbcConnector.connect().getMetaData();
             ResultSet resultSet = jdbcConnector.register(dbMetaData.getTables(null, null, null, null));
             ResultSetMetaData metaData = resultSet.getMetaData();