You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2014/01/31 12:50:38 UTC

git commit: KARAF-2745 Improve error handling

Updated Branches:
  refs/heads/master 50909ecfd -> 2de258779


KARAF-2745 Improve error handling

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

Branch: refs/heads/master
Commit: 2de25877954025952f16463dde3465e93d1679a7
Parents: 50909ec
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Fri Jan 31 12:50:19 2014 +0100
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Fri Jan 31 12:50:19 2014 +0100

----------------------------------------------------------------------
 .../karaf/jdbc/internal/JdbcConnector.java      | 133 +++++++++++++++++++
 .../karaf/jdbc/internal/JdbcServiceImpl.java    | 102 +++-----------
 .../org/apache/karaf/util/TemplateUtils.java    |   1 -
 3 files changed, 155 insertions(+), 81 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/2de25877/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
new file mode 100644
index 0000000..0191554
--- /dev/null
+++ b/jdbc/core/src/main/java/org/apache/karaf/jdbc/internal/JdbcConnector.java
@@ -0,0 +1,133 @@
+/*
+ * 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.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.util.Deque;
+import java.util.LinkedList;
+
+import javax.sql.DataSource;
+
+import org.apache.karaf.util.StreamUtils;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class JdbcConnector implements Closeable {
+    private BundleContext bundleContext;
+    private String datasourceName;
+    private Connection connection;
+    private Deque<Closeable> resources;
+    private ServiceReference<DataSource> reference;
+
+    public JdbcConnector(BundleContext bundleContext, String datasourceName) {
+        this.bundleContext = bundleContext;
+        this.datasourceName = datasourceName;
+        this.resources = new LinkedList<Closeable>();
+    }
+    
+    public Connection connect() throws SQLException {
+        reference = lookupDataSource(datasourceName);
+        DataSource ds = (DataSource) bundleContext.getService(reference);
+        connection = ds.getConnection();
+        return connection;
+    }
+    
+    public Statement createStatement() throws SQLException {
+        if (connection == null) {
+            connect();
+        }
+        return register(connection.createStatement());
+    }
+
+    public Connection register(final Connection connection) {
+        resources.addFirst(new Closeable() {
+            
+            @Override
+            public void close() throws IOException {
+                try {
+                    connection.close();
+                } catch (SQLException e) {
+                    // Ignore
+                }
+            }
+        });
+        return connection;
+    }
+
+    public Statement register(final Statement statement) {
+        resources.addFirst(new Closeable() {
+            
+            @Override
+            public void close() throws IOException {
+                try {
+                    statement.close();
+                } catch (SQLException e) {
+                    // Ignore
+                }
+            }
+        });
+        return statement;
+    }
+
+    public ResultSet register(final ResultSet resultSet) {
+        resources.addFirst(new Closeable() {
+            
+            @Override
+            public void close() throws IOException {
+                try {
+                    resultSet.close();
+                } catch (SQLException e) {
+                    // Ignore
+                }
+            }
+        });
+        return resultSet;
+    }
+    
+
+    private ServiceReference<DataSource> lookupDataSource(String name) {
+        Collection<ServiceReference<DataSource>> references;
+        try {
+            references = bundleContext.getServiceReferences(DataSource.class, "(|(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) {
+            throw new IllegalArgumentException("No JDBC datasource found for " + name);
+        }
+        if (references.size() > 1) {
+            throw new IllegalArgumentException("Multiple JDBC datasource found for " + name);
+        }
+        return references.iterator().next();
+    }
+
+    @Override
+    public void close() {
+        StreamUtils.close(resources.toArray(new Closeable[]{}));
+        if (reference != null) {
+            bundleContext.ungetService(reference);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/2de25877/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 1668116..37d907a 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
@@ -113,9 +113,9 @@ public class JdbcServiceImpl implements JdbcService {
     @Override
     public List<String> datasources() throws Exception {
         List<String> datasources = new ArrayList<String>();
-        ServiceReference[] references = bundleContext.getServiceReferences(DataSource.class.getName(), null);
+        Collection<ServiceReference<DataSource>> references = bundleContext.getServiceReferences(DataSource.class, null);
         if (references != null) {
-            for (ServiceReference reference : references) {
+            for (ServiceReference<DataSource> 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) {
@@ -148,15 +148,11 @@ public class JdbcServiceImpl implements JdbcService {
 
     @Override
     public Map<String, List<String>> query(String datasource, String query) throws Exception {
-        Map<String, List<String>> map = new HashMap<String, List<String>>();
-        ServiceReference reference = this.lookupDataSource(datasource);
-        Connection connection = null;
-        Statement statement = null;
+        JdbcConnector jdbcConnector = new JdbcConnector(bundleContext, datasource);
         try {
-            DataSource ds = (DataSource) bundleContext.getService(reference);
-            connection = ds.getConnection();
-            statement = connection.createStatement();
-            ResultSet resultSet = statement.executeQuery(query);
+            Map<String, List<String>> map = new HashMap<String, List<String>>();
+            Statement statement = jdbcConnector.createStatement();
+            ResultSet resultSet = jdbcConnector.register(statement.executeQuery(query));
             ResultSetMetaData metaData = resultSet.getMetaData();
             for (int c = 1; c <= metaData.getColumnCount(); c++) {
                 map.put(metaData.getColumnLabel(c), new ArrayList<String>());
@@ -166,55 +162,30 @@ public class JdbcServiceImpl implements JdbcService {
                     map.get(metaData.getColumnLabel(c)).add(resultSet.getString(c));
                 }
             }
-            resultSet.close();
+            return map;
         } finally {
-            if (statement != null) {
-                statement.close();
-            }
-            if (connection != null) {
-                connection.close();
-            }
-            if (reference != null) {
-                bundleContext.ungetService(reference);
-            }
+            jdbcConnector.close();
         }
-        return map;
     }
 
     @Override
     public void execute(String datasource, String command) throws Exception {
-        ServiceReference reference = this.lookupDataSource(datasource);
-        Connection connection = null;
-        Statement statement = null;
+        JdbcConnector jdbcConnector = new JdbcConnector(bundleContext, datasource);
         try {
-            DataSource ds = (DataSource) bundleContext.getService(reference);
-            connection = ds.getConnection();
-            statement = connection.createStatement();
-            statement.execute(command);
+            jdbcConnector.createStatement().execute(command);
         } finally {
-            if (statement != null) {
-                statement.close();
-            }
-            if (connection != null) {
-                connection.close();
-            }
-            if (reference != null) {
-                bundleContext.ungetService(reference);
-            }
+            jdbcConnector.close();
         }
     }
 
     @Override
     public Map<String, List<String>> tables(String datasource) throws Exception {
-        Map<String, List<String>> map = new HashMap<String, List<String>>();
-        ServiceReference reference = this.lookupDataSource(datasource);
-        Connection connection = null;
+        JdbcConnector jdbcConnector = new JdbcConnector(bundleContext, datasource);
         try {
-            DataSource ds = (DataSource) bundleContext.getService(reference);
-            connection = ds.getConnection();
-            DatabaseMetaData dbMetaData = connection.getMetaData();
-            ResultSet resultSet = dbMetaData.getTables(null, null, null, null);
+            DatabaseMetaData dbMetaData = jdbcConnector.connect().getMetaData();
+            ResultSet resultSet = jdbcConnector.register(dbMetaData.getTables(null, null, null, null));
             ResultSetMetaData metaData = resultSet.getMetaData();
+            Map<String, List<String>> map = new HashMap<String, List<String>>();
             for (int c = 1; c <= metaData.getColumnCount(); c++) {
                 map.put(metaData.getColumnLabel(c), new ArrayList<String>());
             }
@@ -223,57 +194,28 @@ public class JdbcServiceImpl implements JdbcService {
                     map.get(metaData.getColumnLabel(c)).add(resultSet.getString(c));
                 }
             }
-            resultSet.close();
+            return map;
         } finally {
-            if (connection != null) {
-                connection.close();
-            }
-            if (reference != null) {
-                bundleContext.ungetService(reference);
-            }
+            jdbcConnector.close();
         }
-        return map;
     }
 
     @Override
     public Map<String, String> info(String datasource) throws Exception {
-        Map<String, String> map = new HashMap<String, String>();
-        ServiceReference reference = this.lookupDataSource(datasource);
-        Connection connection = null;
+        JdbcConnector jdbcConnector = new JdbcConnector(bundleContext, datasource);
         try {
-            DataSource ds = (DataSource) bundleContext.getService(reference);
-            connection = ds.getConnection();
-            DatabaseMetaData dbMetaData = connection.getMetaData();
+            DatabaseMetaData dbMetaData = jdbcConnector.connect().getMetaData();
+            Map<String, String> map = new HashMap<String, String>();
             map.put("db.product", dbMetaData.getDatabaseProductName());
             map.put("db.version", dbMetaData.getDatabaseProductVersion());
             map.put("url", dbMetaData.getURL());
             map.put("username", dbMetaData.getUserName());
             map.put("driver.name", dbMetaData.getDriverName());
             map.put("driver.version", dbMetaData.getDriverVersion());
+            return map;
         } finally {
-            if (connection != null) {
-                connection.close();
-            }
-            if (reference != null) {
-                bundleContext.ungetService(reference);
-            }
-        }
-        return map;
-    }
-
-    private ServiceReference lookupDataSource(String name) throws Exception {
-        ServiceReference[] references = bundleContext.getServiceReferences(DataSource.class.getName(), "(|(osgi.jndi.service.name=" + name + ")(datasource=" + name + ")(name=" + name + ")(service.id=" + name + "))");
-        if (references == null || references.length == 0) {
-            throw new IllegalArgumentException("No JDBC datasource found for " + name);
-        }
-        if (references.length > 1) {
-            throw new IllegalArgumentException("Multiple JDBC datasource found for " + name);
+            jdbcConnector.close();
         }
-        return references[0];
-    }
-
-    public BundleContext getBundleContext() {
-        return bundleContext;
     }
 
     public void setBundleContext(BundleContext bundleContext) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/2de25877/util/src/main/java/org/apache/karaf/util/TemplateUtils.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/TemplateUtils.java b/util/src/main/java/org/apache/karaf/util/TemplateUtils.java
index 067c491..cfc59c6 100644
--- a/util/src/main/java/org/apache/karaf/util/TemplateUtils.java
+++ b/util/src/main/java/org/apache/karaf/util/TemplateUtils.java
@@ -50,7 +50,6 @@ public class TemplateUtils {
         } catch (FileNotFoundException e) {
             throw new RuntimeException("Can not create " + outFile, e);
         } finally {
-            safeClose(scanner);
             safeClose(out);
             safeClose(templateIs);
         }