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();