You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gk...@apache.org on 2007/09/18 01:01:26 UTC

svn commit: r576620 - in /cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon: SpringToAvalonDataSourceBridge.java SpringToAvalonDataSourceWrapper.java

Author: gkossakowski
Date: Mon Sep 17 16:01:25 2007
New Revision: 576620

URL: http://svn.apache.org/viewvc?rev=576620&view=rev
Log:
COCOON-2083: Implemented wrapping bean that can act as DataSource and DataSourceComponent at the same time. Removed similar wrapper from SpringToAvalonDataSourceBridge.

Added:
    cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceWrapper.java   (with props)
Modified:
    cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceBridge.java

Modified: cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceBridge.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceBridge.java?rev=576620&r1=576619&r2=576620&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceBridge.java (original)
+++ cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceBridge.java Mon Sep 17 16:01:25 2007
@@ -1,14 +1,11 @@
 package org.apache.cocoon.databases.bridge.spring.avalon;
 
-import java.sql.Connection;
-import java.sql.SQLException;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import javax.sql.DataSource;
 
-import org.apache.avalon.excalibur.datasource.DataSourceComponent;
-import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceSelector;
 
@@ -21,41 +18,39 @@
 public class SpringToAvalonDataSourceBridge implements ServiceSelector {
     private ServiceSelector dataSourceSelector;
     private Map springDataSources;
+    
+    private Set sourcesFromDataSourceSelector;
+    
+    public SpringToAvalonDataSourceBridge() {
+        sourcesFromDataSourceSelector = new HashSet();
+    }
 
     public boolean isSelectable(Object policy) {
         return dataSourceSelector.isSelectable(policy) || springDataSources.containsKey(policy);
     }
 
     public void release(Object object) {
-        if (object instanceof DataSourceComponent)
+        if (sourcesFromDataSourceSelector.contains(object)) {
+            sourcesFromDataSourceSelector.remove(object);
             dataSourceSelector.release(object);
+        }
     }
 
     public Object select(Object policy) throws ServiceException {
-        if (dataSourceSelector.isSelectable(policy))
-            return dataSourceSelector.select(policy);
-        else if (springDataSources.containsKey(policy))
-            return new SpringDataSourceWrapper((DataSource) springDataSources.get(policy));
-        else
-            return null;
-    }
-    
-    private class SpringDataSourceWrapper implements DataSourceComponent {
-        
-        private DataSource springDataSource;
-        
-        private SpringDataSourceWrapper(DataSource springDataSource) {
-            this.springDataSource = springDataSource;
-        }
-
-        public Connection getConnection() throws SQLException {
-            return springDataSource.getConnection();
+        if (dataSourceSelector.isSelectable(policy)) {
+            Object object = dataSourceSelector.select(policy);
+            sourcesFromDataSourceSelector.add(object);
+            return object;
         }
-
-        public void configure(Configuration configuration) throws ConfigurationException {
-            //do nothing   
+        else if (springDataSources.containsKey(policy)) {
+            Object object = (DataSource) springDataSources.get(policy);
+            if (!(object instanceof SpringToAvalonDataSourceWrapper))
+                throw new ClassCastException("Bean with key '" + policy + "' is not SpringToAvalonDataSourceWrapper class. " +
+                		"Only this wrapper is allowed when you want to use DataSources defined in Spring way in Avalon components");
+            return object;
         }
-        
+        else
+            return null;
     }
 
     public Map getSpringDataSources() {

Added: cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceWrapper.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceWrapper.java?rev=576620&view=auto
==============================================================================
--- cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceWrapper.java (added)
+++ cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceWrapper.java Mon Sep 17 16:01:25 2007
@@ -0,0 +1,122 @@
+/**
+ * 
+ */
+package org.apache.cocoon.databases.bridge.spring.avalon;
+
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import javax.sql.DataSource;
+
+import org.apache.avalon.excalibur.datasource.DataSourceComponent;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+
+/**
+ * Wrapper bean for {@link DataSource} that implements {@link DataSourceComponent} additionally in order
+ * to provide access to DataSources for Avalon components.
+ *
+ */
+public class SpringToAvalonDataSourceWrapper implements DataSource, DataSourceComponent {
+    
+    private DataSource wrappedBean;
+
+    /**
+     * @return the wrappedBean
+     */
+    public DataSource getWrappedBean() {
+        return wrappedBean;
+    }
+
+    /**
+     * @param wrappedBean the wrappedBean to set
+     */
+    public void setWrappedBean(DataSource wrappedBean) {
+        this.wrappedBean = wrappedBean;
+    }
+
+    /**
+     * @return
+     * @throws SQLException
+     * @see javax.sql.DataSource#getConnection()
+     */
+    public Connection getConnection() throws SQLException {
+        return wrappedBean.getConnection();
+    }
+
+    /**
+     * @param username
+     * @param password
+     * @return
+     * @throws SQLException
+     * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String)
+     */
+    public Connection getConnection(String username, String password) throws SQLException {
+        return wrappedBean.getConnection(username, password);
+    }
+
+    /**
+     * @return
+     * @throws SQLException
+     * @see javax.sql.CommonDataSource#getLoginTimeout()
+     */
+    public int getLoginTimeout() throws SQLException {
+        return wrappedBean.getLoginTimeout();
+    }
+
+    /**
+     * @return
+     * @throws SQLException
+     * @see javax.sql.CommonDataSource#getLogWriter()
+     */
+    public PrintWriter getLogWriter() throws SQLException {
+        return wrappedBean.getLogWriter();
+    }
+
+    /**
+     * @param seconds
+     * @throws SQLException
+     * @see javax.sql.CommonDataSource#setLoginTimeout(int)
+     */
+    public void setLoginTimeout(int seconds) throws SQLException {
+        wrappedBean.setLoginTimeout(seconds);
+    }
+
+    /**
+     * @param out
+     * @throws SQLException
+     * @see javax.sql.CommonDataSource#setLogWriter(java.io.PrintWriter)
+     */
+    public void setLogWriter(PrintWriter out) throws SQLException {
+        wrappedBean.setLogWriter(out);
+    }
+    
+    /**
+     * @param iface
+     * @return
+     * @throws SQLException
+     * @see java.sql.Wrapper#isWrapperFor(java.lang.Class)
+     */
+    public boolean isWrapperFor(Class iface) throws SQLException {
+        throw new UnsupportedOperationException("This operation is not supported because we need to stay compatible " +
+                                                "with Java 1.4 where isWrapperFor() is not defined");
+    }
+
+    /**
+     * @param iface
+     * @return
+     * @throws SQLException
+     * @see java.sql.Wrapper#unwrap(java.lang.Class)
+     */
+    public Object unwrap(Class iface) throws SQLException {
+        //I hope that nothing will call this method (GK)
+        throw new UnsupportedOperationException("This operation is not supported because we need to stay compatible " +
+        		                                "with Java 1.4 where unwrap() is not defined");
+    }
+
+    public void configure(Configuration arg0) throws ConfigurationException {
+        //do nothing
+    }
+
+}

Propchange: cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/blocks/cocoon-databases/cocoon-databases-bridge/src/main/java/org/apache/cocoon/databases/bridge/spring/avalon/SpringToAvalonDataSourceWrapper.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain