You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2006/03/13 14:46:09 UTC

svn commit: r385550 - /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformOracle9iImpl.java

Author: arminw
Date: Mon Mar 13 05:46:07 2006
New Revision: 385550

URL: http://svn.apache.org/viewcvs?rev=385550&view=rev
Log:
add fix for OJB-101, source out unwrap of connections and statements to a helper class

Modified:
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformOracle9iImpl.java

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformOracle9iImpl.java
URL: http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformOracle9iImpl.java?rev=385550&r1=385549&r2=385550&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformOracle9iImpl.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformOracle9iImpl.java Mon Mar 13 05:46:07 2006
@@ -15,12 +15,6 @@
  * limitations under the License.
  */
 
-import org.apache.ojb.broker.metadata.JdbcConnectionDescriptor;
-import org.apache.ojb.broker.metadata.ConnectionPoolDescriptor;
-import org.apache.ojb.broker.util.ClassHelper;
-import org.apache.ojb.broker.util.logging.Logger;
-import org.apache.ojb.broker.util.logging.LoggerFactory;
-
 import java.io.ByteArrayInputStream;
 import java.lang.reflect.Method;
 import java.sql.Connection;
@@ -32,6 +26,13 @@
 import java.util.Map;
 import java.util.WeakHashMap;
 
+import org.apache.ojb.broker.metadata.ConnectionPoolDescriptor;
+import org.apache.ojb.broker.metadata.JdbcConnectionDescriptor;
+import org.apache.ojb.broker.util.ClassHelper;
+import org.apache.ojb.broker.util.UnwrapHelper;
+import org.apache.ojb.broker.util.logging.Logger;
+import org.apache.ojb.broker.util.logging.LoggerFactory;
+
 /**
  * This class is a concrete implementation of <code>Platform</code>. Provides
  * an implementation that works around some issues with Oracle in general and
@@ -122,48 +123,10 @@
     protected static boolean ORA_CLOB_HANDLING_AVAILABLE;
     protected static boolean ORA_BLOB_HANDLING_AVAILABLE;
 
-    /** Method names used by {@link #unwrapConnection}. */
-    protected static final String UNWRAP_CONN_METHOD_NAMES[] =
-            {
-                "unwrapCompletely"          /* Oracle 10g */,
-                "getInnermostDelegate"      /* Commons DBCP */,
-                "getUnderlyingConnection"   /* JBoss */,
-                "getVendorConnection"       /* BEA WebLogic */,
-                "getJDBC"                   /* P6Spy */
-            };
-    /**
-     * Method parameter signature used by {@link #unwrapConnection} for corresponding
-     * {@link #UNWRAP_CONN_METHOD_NAMES}-index.
-     * If signature is not {@link #PARAM_TYPE_EMPTY}, the actual connection object
-     * will be passed at runtime. (NB: Requires special handling of param type in constructor.)
-     */
-    protected static final Class[][] UNWRAP_CONN_PARAM_TYPES =
-            {
-                null  /* Index 0 reserved for Oracle 10g - initialized in constructor */,
-                PARAM_TYPE_EMPTY            /* Commons DBCP */,
-                PARAM_TYPE_EMPTY            /* JBoss */,
-                PARAM_TYPE_EMPTY            /* BEA WebLogic */,
-                PARAM_TYPE_EMPTY            /* P6Spy */
-            };
-    /** Method names used by {@link #unwrapStatement}. */
-    protected static final String UNWRAP_PS_METHOD_NAMES[] =
-            {
-                "getInnermostDelegate"      /* Commons DBCP */,
-                "getUnderlyingStatement"    /* JBoss */,
-                "getJDBC"                   /* P6Spy */
-            };
-    /**
-     * Method parameter signature used by {@link #unwrapStatement} for corresponding
-     * {@link #UNWRAP_PS_METHOD_NAMES}-index.
-     * If signature is not {@link #PARAM_TYPE_EMPTY}, the actual Statement object
-     * will be passed at runtime. (NB: Requires special handling of param type in constructor.)
-     */
-    protected static final Class[][] UNWRAP_PS_PARAM_TYPES =
-            {
-                PARAM_TYPE_EMPTY            /* Commons DBCP */,
-                PARAM_TYPE_EMPTY            /* JBoss */,
-                PARAM_TYPE_EMPTY            /* P6Spy */
-            };
+    /**
+     * Helper to unwrap connections and statements.
+     */
+    protected UnwrapHelper unwrapHelper = new UnwrapHelper();
 
 
     /**
@@ -466,8 +429,7 @@
      */
     protected Connection unwrapConnection(Connection conn)
     {
-        final Object unwrapped;
-        unwrapped = genericUnwrap(ORA_CONN_CLASS, conn, UNWRAP_CONN_METHOD_NAMES, UNWRAP_CONN_PARAM_TYPES);
+        final Connection unwrapped = unwrapHelper.unwrapConnection(ORA_CONN_CLASS, conn);
         if (unwrapped == null)
         {
             // mkalen:  only log this as debug since it will be logged for every connection
@@ -478,7 +440,7 @@
                              ", Oracle-extensions disabled.");
             }
         }
-        return (Connection) unwrapped;
+        return unwrapped;
     }
 
     /**
@@ -488,8 +450,7 @@
      */
     protected Statement unwrapStatement(Statement ps)
     {
-        final Object unwrapped;
-        unwrapped = genericUnwrap(ORA_PS_CLASS, ps, UNWRAP_PS_METHOD_NAMES, UNWRAP_PS_PARAM_TYPES);
+        final Statement unwrapped = unwrapHelper.unwrapStatement(ORA_PS_CLASS, ps);
         if (unwrapped == null)
         {
             // mkalen:  only log this as debug since it will be logged for every connection
@@ -500,60 +461,7 @@
                              ", large CLOB/BLOB support disabled.");
             }
         }
-        return (Statement) unwrapped;
-    }
-    
-    protected Object genericUnwrap(Class classToMatch, Object toUnwrap,
-                                   String[] methodNameCandidates,
-                                   Class[][] methodTypeCandidates)
-    {
-        if (classToMatch == null)
-        {
-            return null;
-        }
-
-        Object unwrapped;
-        final Class psClass = toUnwrap.getClass();
-        if (classToMatch.isAssignableFrom(psClass))
-        {
-            return toUnwrap;
-        }
-        try
-        {
-            String methodName;
-            Class[] paramTypes;
-            Object[] args;
-            for (int i = 0; i < methodNameCandidates.length; i++)
-            {
-                methodName = methodNameCandidates[i];
-                paramTypes = methodTypeCandidates[i];
-                final Method method = ClassHelper.getMethod(toUnwrap, methodName, paramTypes);
-                if (method != null)
-                {
-                    args = paramTypes == PARAM_TYPE_EMPTY ? PARAM_EMPTY : new Object[]{ toUnwrap };
-                    unwrapped = method.invoke(toUnwrap, args);
-                    if (unwrapped != null)
-                    {
-                        if (classToMatch.isAssignableFrom(unwrapped.getClass()))
-                        {
-                            return unwrapped;
-                        }
-                        // When using eg both DBCP and P6Spy we have to recursively unwrap
-                        return genericUnwrap(classToMatch, unwrapped,
-                                methodNameCandidates, methodTypeCandidates);
-                    }
-                }
-            }
-        }
-        catch (Exception e)
-        {
-            // ignore
-            if (logger.isDebugEnabled())
-            {
-                logger.debug("genericUnwrap failed", e);
-            }
-        }
-        return null;
+        return unwrapped;
     }
 
     /**
@@ -578,8 +486,14 @@
             PARAM_TYPE_INT_ORACLOB = new Class[]{ Integer.TYPE, ORA_CLOB_CLASS };
             PARAM_TYPE_INT_ORABLOB = new Class[]{ Integer.TYPE, ORA_BLOB_CLASS };
 
-            // Index 0 reserved for Oracle 10g
-            UNWRAP_CONN_PARAM_TYPES[0] = new Class[]{ ORA_CONN_CLASS };
+            /*
+            The unwrap pattern used in {@link org.apache.ojb.broker.util.UnwrapHelper}
+            to unwrap connection instance to Oracle's specific connection implementation class.
+            */
+            Object[] oracleUnwrapPattern = new Object[] {"oracle 10g", UnwrapHelper.TYPE_METHOD,
+                    new Class[]{ORA_CONN_CLASS}, "unwrapCompletely", null, null, null};
+            // add the oracle unwrap pattern
+            unwrapHelper.addUnwrapPattern(oracleUnwrapPattern);
 
             METHOD_SET_STATEMENT_CACHE_SIZE =
                     ClassHelper.getMethod(ORA_CONN_CLASS, "setStatementCacheSize", PARAM_TYPE_INTEGER);
@@ -610,4 +524,4 @@
         }
     }
 
-}
+}
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org