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/11 19:35:04 UTC

svn commit: r385121 - in /db/ojb/branches/OJB_1_0_RELEASE/src: java/org/apache/ojb/broker/util/UnwrapHelper.java test/org/apache/ojb/broker/UnwrapHelperTest.java

Author: arminw
Date: Sat Mar 11 10:35:02 2006
New Revision: 385121

URL: http://svn.apache.org/viewcvs?rev=385121&view=rev
Log:
improve

Modified:
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/UnwrapHelper.java
    db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/UnwrapHelperTest.java

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/UnwrapHelper.java
URL: http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/UnwrapHelper.java?rev=385121&r1=385120&r2=385121&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/UnwrapHelper.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/util/UnwrapHelper.java Sat Mar 11 10:35:02 2006
@@ -20,6 +20,8 @@
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.Statement;
+import java.util.List;
+import java.util.ArrayList;
 
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.builder.ToStringBuilder;
@@ -29,8 +31,18 @@
 
 /**
  * This a helper class make available methods to unwrap {@link java.sql.Connection} and
- * {@link java.sql.PreparedStatement} instances of connection-pool libraries,
+ * {@link java.sql.Statement} instances of connection-pool libraries,
  * application server and other.
+ * <p/>
+ * This class supports predefined unwrap patterns for:
+ * <ul>
+ *     <li>commons-DBCP</li>
+ *     <li>JBoss</li>
+ *     <li>enhydra.XAPool</li>
+ *     <li>BEA Weblogic</li>
+ *     <li>p6spy</li>
+ * </ul>
+ * To add new unwrap patterns use method {@link #addUnwrapPattern(Object[])}.
  *
  * @version $Id: $
  */
@@ -40,8 +52,8 @@
 
     private static final int UNWARP_CONNECTION = 1;
     private static final int UNWARP_STATEMENT = 2;
-    public static final Object[] EMPTY_ARG = new Object[]{};
-    public static final Class[] PARAM_TYPE_EMPTY = new Class[]{};
+    private static final Object[] EMPTY_ARG = new Object[]{};
+    public static final Class[] EMPTY_TYPE = new Class[]{};
     public static final Integer TYPE_METHOD = new Integer(5);
     public static final Integer TYPE_FIELD = new Integer(6);
     /**
@@ -49,115 +61,251 @@
      * and {@link java.sql.PreparedStatement} instances of popular connection-pool libraries,
      * application server and other libraries.
      * <p/>
-     * The array have to be a [n][5] object array. The following arguments will be expected:
+     * The array have to be a [n][7] length object array. The following arguments will be expected:
      * <ul>
-     * <li>unwrapInfo[i][0] = the vendor, product name as {@link String}</li>
+     * <li>predefinedPatterns[i][0] = the vendor, product name as {@link String}</li>
      *
-     * <li>unwrapInfo[i][1] = use {@link #TYPE_METHOD} if access to the wrapped connection via method call
+     * <li>predefinedPatterns[i][1] = use {@link #TYPE_METHOD} if access to the wrapped connection via method call
      * is possible, use {@link #TYPE_FIELD} if access to a field can be used</li>
-     * <li>unwrapInfo[i][2] = use {@link #PARAM_TYPE_EMPTY} if a no-arg method call is needed, otherwise
-     * specify the argument type class array (at runtime)</li>
-     * <li>unwrapInfo[i][3] = the name of the method/field to lookup the wrapped connection
-     * as {@link String}</li>
+     * <li>predefinedPatterns[i][2] = use {@link #EMPTY_TYPE} if a no-arg method call is needed, otherwise
+     * specify the argument type class array - in this case always a single argument
+     * type is expected and the source object (object to unwarp) was used as argument object when
+     * calling {@link #unwrapConnection(Class, java.sql.Connection)} or
+     * {@link #unwrapStatement(Class, java.sql.Statement)}</li>
+     * <li>predefinedPatterns[i][3] = the name of the method/field to lookup the wrapped connection
+     * as {@link String}<br/><br/></li>
      *
-     * <li>unwrapInfo[i][4] = use {@link #TYPE_METHOD} if access to the wrapped statment via method call
+     * <li>predefinedPatterns[i][4] = use {@link #TYPE_METHOD} if access to the wrapped statment via method call
      * is possible, use {@link #TYPE_FIELD} if access to a field can be used</li></li>
-     * <li>unwrapInfo[i][5] = use {@link #PARAM_TYPE_EMPTY} if a no-arg method call is needed, otherwise
-     * specify the argument type class array (at runtime)</li>
-     * <li>unwrapInfo[i][6] = the name of the method/field to unwrap the statement</li>
+     * <li>predefinedPatterns[i][5] = use {@link #EMPTY_TYPE} if a no-arg method call is needed, otherwise
+     * specify the argument type class array - in this case always a single argument
+     * type is expected and the source object (object to unwarp) was used as argument object when
+     * calling {@link #unwrapConnection(Class, java.sql.Connection)} or
+     * {@link #unwrapStatement(Class, java.sql.Statement)}</li>
+     * <li>predefinedPatterns[i][6] = the name of the method/field to unwrap the statement<br/><br/></li>
      * </ul>
      * Example:
-     * <pre>
-     * protected static Object[][] unwrapInfo = {
+     * <code>
+     * protected static Object[][] predefinedPatterns = {
      * {"common-DBCP", TYPE_METHOD, PARAM_TYPE_EMPTY, "getInnermostDelegate", TYPE_METHOD, PARAM_TYPE_EMPTY, "getInnermostDelegate"},
      * {"enhydra.XAPool", TYPE_FIELD, null, "con", TYPE_FIELD, null, "ps"},
      * ....
-     * </pre>
+     * </code>
      */
-    protected Object[][] unwrapInfo = {
-        {"common-DBCP", TYPE_METHOD, PARAM_TYPE_EMPTY, "getInnermostDelegate", TYPE_METHOD, PARAM_TYPE_EMPTY, "getInnermostDelegate"},
-        {"JBoss", TYPE_METHOD, PARAM_TYPE_EMPTY, "getUnderlyingConnection", TYPE_METHOD, PARAM_TYPE_EMPTY, "getUnderlyingStatement"},
+    private static final Object[][] predefinedPatterns = {
+        {"common-DBCP", TYPE_METHOD, EMPTY_TYPE, "getInnermostDelegate", TYPE_METHOD, EMPTY_TYPE, "getInnermostDelegate"},
+        {"JBoss", TYPE_METHOD, EMPTY_TYPE, "getUnderlyingConnection", TYPE_METHOD, EMPTY_TYPE, "getUnderlyingStatement"},
         {"enhydra.XAPool", TYPE_FIELD, null, "con", TYPE_FIELD, null, "ps"},
-        {"BEA Weblogic", TYPE_METHOD, PARAM_TYPE_EMPTY, "getVendorConnection", null, null, null},
-        {"p6spy", TYPE_METHOD, PARAM_TYPE_EMPTY, "getJDBC", TYPE_METHOD, PARAM_TYPE_EMPTY, "getJDBC"}
+        {"BEA Weblogic", TYPE_METHOD, EMPTY_TYPE, "getVendorConnection", null, null, null},
+        {"p6spy", TYPE_METHOD, EMPTY_TYPE, "getJDBC", TYPE_METHOD, EMPTY_TYPE, "getJDBC"}
     };
 
     /**
+     * The active unwrap patterns.
+     */
+    private Object[][] unwrapPatterns = new Object[][]{};
+    private Object[][] matchedPatterns;
+    private boolean optimized;
+
+
+    /**
+     * Default constructor, use predefined unwrap patterns and optimized
+     * search, see {@link #UnwrapHelper(boolean, boolean)}.
+     */
+    public UnwrapHelper()
+    {
+        this(true, true);
+    }
+
+    /**
+     * Alternative constructor.
+     * @param usePredefined If <em>true</em> the predefined unwrap patterns will be used,
+     * else no patterns are provided (add pattern with {@link #addUnwrapPattern(Object[])}).
+     * @param optimized If <em>true</em> all matching patterns will be bundled and used to unwrap,
+     * if <em>false</em> always all patterns are used to search for a unwrap match.
+     */
+    public UnwrapHelper(boolean usePredefined, boolean optimized)
+    {
+        resetMatchedPatterns();
+        this.optimized = optimized;
+        if(usePredefined)
+        {
+            if(log.isDebugEnabled()) log.debug("Activate predefined unwrap patterns");
+            for(int i = 0; i < predefinedPatterns.length; i++)
+            {
+                Object[] pattern = predefinedPatterns[i];
+                addUnwrapPattern(pattern);
+            }
+        }
+    }
+
+    /** Return the current unwrap patterns. */
+    public Object[][] getUnwrapPatterns()
+    {
+        return unwrapPatterns;
+    }
+
+    /**
      * Add a new unwrap pattern. The object array of length 7 have to be
-     * the following arguments:
+     * the following arguments (a vendor string, 3 arguments to unwrap connections,
+     * 3 arguments to unwrap statements):<br/><br/>
      * <ul>
-     * <li>pattern[0] = the vendor, product name as {@link String}</li>
+     * <li>
+     * pattern[0] = the vendor, product name as {@link String}.<br/><br/>
+     * </li>
      *
-     * <li>pattern[1] = use {@link #TYPE_METHOD} if access to the wrapped connection via method call
-     * is possible, use {@link #TYPE_FIELD} if access to a field can be used</li>
-     * <li>pattern[2] = use {@link #PARAM_TYPE_EMPTY} if a no-arg method call is needed, otherwise
-     * specify the argument type class array (at runtime)</li>
-     * <li>pattern[3] = the name of the method/field to lookup the wrapped connection
-     * as {@link String}</li>
+     * <li>
+     * pattern[1] = use {@link #TYPE_METHOD} if access to the wrapped connection is done via
+     * method call or use {@link #TYPE_FIELD} to specify access via field.
+     * </li>
+     * <li>
+     * pattern[2] = specify the method argument for connection unwrap. Only two types are
+     * supported: non-argument methods and single argument type methods. If field access
+     * is used nullify this argument.
+     * <br/>
+     * Non argument methods can use {@link #EMPTY_TYPE} or simply <em>null</em>.
+     * <br/>
+     * The single argument type (specified as class, class array or full qualified
+     * class name string) use the source object (object to unwarp)  as argument
+     * object when calling
+     * {@link #unwrapConnection(Class, java.sql.Connection)}.
+     * </li>
+     * <li>
+     * pattern[3] = the name of the method/field to unwrap the connection.<br/><br/>
+     * </li>
      *
-     * <li>pattern[4] = use {@link #TYPE_METHOD} if access to the wrapped statment via method call
-     * is possible, use {@link #TYPE_FIELD} if access to a field can be used</li></li>
-     * <li>pattern[5] = use {@link #PARAM_TYPE_EMPTY} if a no-arg method call is needed, otherwise
-     * specify the argument type class array (at runtime)</li>
-     * <li>pattern[6] = the name of the method/field to unwrap the statement as {@link String}</li>
+     * <li>
+     * pattern[4] = use {@link #TYPE_METHOD} if access to the wrapped statment via method call
+     * is possible, use {@link #TYPE_FIELD} if access to a field can be used
+     * </li>
+     * <li>
+     * pattern[5] = specify the method argument for statement unwrap. Only two types are
+     * supported: non-argument methods and single argument type methods. If field access
+     * is used nullify this argument.
+     * <br/>
+     * Non argument methods can use {@link #EMPTY_TYPE} or simply <em>null</em>.
+     * <br/>
+     * The single argument type (specified as class, class array or full qualified
+     * class name string) use the source object (object to unwarp) as argument
+     * object when calling {@link #unwrapStatement(Class, java.sql.Statement)}.
+     * </li>
+     * <li>
+     * pattern[6] = the name of the method/field to unwrap the statement.<br/><br/>
+     * </li>
      * </ul>
      * Here is an example how to use this method:
-     * <pre>
-     * Object test = new Object[]{"common-DBCP", TYPE_METHOD, PARAM_TYPE_EMPTY, "getInnermostDelegate",
-     * TYPE_METHOD, PARAM_TYPE_EMPTY, "getInnermostDelegate"};
-     * unwarpHelper.addUnwrapPattern(test);
-     * </pre>
+     * <code>
+     * Object pattern = new Object[]{"JBoss", TYPE_METHOD, EMPTY_TYPE, "getUnderlyingConnection",
+     * TYPE_METHOD, EMPTY_TYPE, "getUnderlyingStatement"};
+     * unwarpHelper.addUnwrapPattern(pattern);
+     * </code>
      *
      * @param pattern The unwrap pattern array.
      */
-    public void addUnwrapPattern(Object[] pattern)
+    public void addUnwrapPattern(final Object[] pattern)
     {
+        // check connection method argument
+        Object argType = pattern[2];
+        if(argType == null)
+        {
+            pattern[2] = EMPTY_TYPE;
+        }
+        else if(argType instanceof String)
+        {
+            String arg = (String) argType;
+            try
+            {
+                Class tmp = ClassHelper.getClass(arg);
+                pattern[2] = new Class[]{tmp};
+            }
+            catch(ClassNotFoundException e)
+            {
+                log.error("Can't lookup method argument type "
+                        + arg + " of pattern " + ArrayUtils.toString(pattern), e);
+            }
+        }
+        else if(argType instanceof Class)
+        {
+            pattern[2] = new Class[]{(Class)argType};
+        }
+        // check statement method argument
+        argType = pattern[5];
+        if(argType == null)
+        {
+            pattern[5] = EMPTY_TYPE;
+        }
+        else if(argType instanceof String)
+        {
+            String arg = (String) argType;
+            try
+            {
+                Class tmp = ClassHelper.getClass(arg);
+                pattern[5] = new Class[]{tmp};
+            }
+            catch(ClassNotFoundException e)
+            {
+                log.error("Can't lookup method argument type "
+                        + arg + " of pattern " + ArrayUtils.toString(pattern), e);
+            }
+        }
+        else if(argType instanceof Class)
+        {
+            pattern[5] = new Class[]{(Class)argType};
+        }
+
         Object[][] tmp = new Object[][]{pattern};
-        unwrapInfo = (Object[][]) ArrayUtils.addAll(unwrapInfo, tmp);
+        unwrapPatterns = (Object[][]) ArrayUtils.addAll(unwrapPatterns, tmp);
+        // force synchronization of optimized patterns
+        if(optimized) resetMatchedPatterns();
     }
 
-    /** Return the current unwrap patterns. */
-    public Object[][] getUnwrapPatterns()
+    protected Object genericUnwrap(final Class classToMatch, final Object toUnwrap, final int type)
     {
-        return unwrapInfo;
+        Object result;
+        if(optimized)
+        {
+            if(matchedPatterns.length == 0)
+            {
+                ArrayList matches = new ArrayList();
+                result = loopUnwrap(unwrapPatterns, classToMatch, toUnwrap, type, matches);
+                matchedPatterns = (Object[][]) matches.toArray(new Object[matches.size()][]);
+            }
+            else
+            {
+                result = loopUnwrap(matchedPatterns, classToMatch, toUnwrap, type, null);
+            }
+        }
+        else
+        {
+            result = loopUnwrap(unwrapPatterns, classToMatch, toUnwrap, type, null);
+        }
+        return result;
     }
 
-    protected Object genericUnwrap(final Class classToMatch, final Object toUnwrap, int type)
+    protected Object loopUnwrap(Object[][] patterns, final Class classToMatch, final Object toUnwrap, final int type, final List matchedPatterns)
     {
         if(classToMatch == null)
         {
             return null;
         }
-
-        Object unwrapped = null;
         if(classToMatch.isAssignableFrom(toUnwrap.getClass()))
         {
             return toUnwrap;
         }
+        Object unwrapped = null;
+
         int i = 0;
         try
         {
-            for(; i < unwrapInfo.length; i++)
+            for(; i < patterns.length; i++)
             {
-                Object[] info = unwrapInfo[i];
-                if(type == UNWARP_CONNECTION && info[3] != null)
-                {
-                    unwrapped = reflectObject(toUnwrap, info[1].equals(TYPE_METHOD), (Class[]) info[2], (String) info[3]);
-                }
-                else if(type == UNWARP_STATEMENT && info[6] != null)
-                {
-                    unwrapped = reflectObject(toUnwrap, info[4].equals(TYPE_METHOD), (Class[]) info[5], (String) info[6]);
-                }
+                Object[] pattern = patterns[i];
+                unwrapped = unwrap(pattern, toUnwrap, type);
                 if(unwrapped != null)
                 {
-                    if(classToMatch.isAssignableFrom(unwrapped.getClass()))
+                    if(matchedPatterns != null)
                     {
-                        // Bingo!
-                    }
-                    else
-                    {
-                        // When using e.g. both DBCP and P6Spy we have to recursively unwrap
-                        unwrapped = genericUnwrap(classToMatch, unwrapped, type);
+                        matchedPatterns.add(pattern);
                     }
                     break;
                 }
@@ -171,18 +319,54 @@
             {
                 if(type == UNWARP_CONNECTION)
                 {
-                    log.debug("Unwrap of connection failed using unwrap rule for " + unwrapInfo[i][0] + " connections", e);
+                    log.debug("Unwrap of connection failed using unwrap rule for " + unwrapPatterns[i][0] + " connections", e);
                 }
                 else
                 {
-                    log.debug("Unwrap of prepared stmt failed using unwrap rule for " + unwrapInfo[i][0] + " statements", e);
+                    log.debug("Unwrap of prepared stmt failed using unwrap rule for " + unwrapPatterns[i][0] + " statements", e);
                 }
             }
         }
+
+        if(unwrapped != null)
+        {
+            if(classToMatch.isAssignableFrom(unwrapped.getClass()))
+            {
+                // Bingo!
+            }
+            else
+            {
+                // When using e.g. both DBCP and P6Spy we have to recursively unwrap
+                unwrapped = loopUnwrap(patterns, classToMatch, unwrapped, type, matchedPatterns);
+            }
+        }
         return unwrapped;
     }
 
-    private Object reflectObject(Object source, boolean methodType, Class[] paramType, String fieldOrMethodName) throws Exception
+    private Object unwrap(final Object[] pattern, final Object toUnwrap, final int type) throws Exception
+    {
+        Object unwrapped = null;
+        if(type == UNWARP_CONNECTION && pattern[3] != null)
+        {
+            unwrapped = reflectObject(toUnwrap, pattern[1].equals(TYPE_METHOD), (Class[]) pattern[2], (String) pattern[3]);
+        }
+        else if(type == UNWARP_STATEMENT && pattern[6] != null)
+        {
+            unwrapped = reflectObject(toUnwrap, pattern[4].equals(TYPE_METHOD), (Class[]) pattern[5], (String) pattern[6]);
+        }
+        else
+        {
+            if(log.isDebugEnabled())
+            {
+                log.debug("Can't use the specified pattern to unwarp "
+                        + (type == UNWARP_CONNECTION ? "connection" : "statement")
+                        + ": " + ArrayUtils.toString(pattern));
+            }
+        }
+        return unwrapped;
+    }
+
+    private Object reflectObject(final Object source, final boolean methodType, final Class[] paramType, final String fieldOrMethodName) throws Exception
     {
         Object unwrapped = null;
         if(methodType)
@@ -195,7 +379,8 @@
                 {
                     method.setAccessible(true);
                 }
-                unwrapped = method.invoke(source, EMPTY_ARG);
+                Object[] arg = (paramType == null || paramType.length == 0) ? EMPTY_ARG : new Object[]{source};
+                unwrapped = method.invoke(source, arg);
             }
         }
         else
@@ -222,7 +407,7 @@
      * @param source The wrapped connection instance.
      * @return The unwrapped connection or <em>null</em> if no match is possible.
      */
-    public Connection unwrapConnection(Class target, Connection source)
+    public Connection unwrapConnection(final Class target, final Connection source)
     {
         Connection result = (Connection) genericUnwrap(target, source, UNWARP_CONNECTION);
         if(result == null && log.isDebugEnabled())
@@ -241,7 +426,7 @@
      * @param source The wrapped statement instance.
      * @return The unwrapped statement or <em>null</em> if no match is possible.
      */
-    public Statement unwrapStatement(Class target, Statement source)
+    public Statement unwrapStatement(final Class target, final Statement source)
     {
         Statement result = (Statement) genericUnwrap(target, source, UNWARP_STATEMENT);
         if(result == null && log.isDebugEnabled())
@@ -260,24 +445,23 @@
      * @param source The wrapped statement instance.
      * @return The unwrapped statement or <em>null</em> if no match is possible.
      */
-    public PreparedStatement unwrapStatement(Class target, PreparedStatement source)
+    public PreparedStatement unwrapStatement(final Class target, final PreparedStatement source)
     {
-        PreparedStatement result = (PreparedStatement) genericUnwrap(target, source, UNWARP_STATEMENT);
-        if(result == null && log.isDebugEnabled())
-        {
-            log.debug("Could not unwrap source " + source.getClass().getName()
-                    + " to target class " + target.getName());
-        }
-        return result;
+        return (PreparedStatement) unwrapStatement(target, (Statement) source);
+    }
+
+    private void resetMatchedPatterns()
+    {
+        matchedPatterns = new Object[][]{};
     }
 
     public String toString()
     {
         ToStringBuilder buf = new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE);
         buf.append("Supported unwrap pattern: ");
-        for(int i = 0; i < unwrapInfo.length; i++)
+        for(int i = 0; i < unwrapPatterns.length; i++)
         {
-            buf.append(ArrayUtils.toString(unwrapInfo[i]));
+            buf.append(ArrayUtils.toString(unwrapPatterns[i]));
         }
         return buf.toString();
     }

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/UnwrapHelperTest.java
URL: http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/UnwrapHelperTest.java?rev=385121&r1=385120&r2=385121&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/UnwrapHelperTest.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/UnwrapHelperTest.java Sat Mar 11 10:35:02 2006
@@ -63,8 +63,9 @@
         int length = helper.getUnwrapPatterns().length;
         Object[] pattern = helper.getUnwrapPatterns()[0];
         helper.addUnwrapPattern(pattern);
+        helper.addUnwrapPattern(new Object[][]{null, null, null, null, null, null, null});
         //System.out.println("## " + helper.toString());
-        assertEquals(length + 1, helper.getUnwrapPatterns().length);
+        assertEquals(length + 2, helper.getUnwrapPatterns().length);
     }
 
     public void testUnwrapConnection() throws Exception
@@ -99,7 +100,7 @@
     /**
      * Test useful for development.
      */
-    public void XXXtestUnwrapLoop() throws Exception
+    public void testUnwrapLoop() throws Exception
     {
         Platform pf = broker.serviceConnectionManager().getSupportedPlatform();
         if(!PlatformHsqldbImpl.class.isAssignableFrom(pf.getClass()))
@@ -110,8 +111,53 @@
         PreparedStatement ps = con.prepareStatement(selectExample);
         Class targetC = ClassHelper.getClass(connectionClassName);
         Class targetS = ClassHelper.getClass(statementClassName);
-        long t = System.currentTimeMillis();
         int loops = 5000;
+        long t = System.currentTimeMillis();
+        for(int i = 0;i<loops;i++)
+        {
+            Connection resultC = helper.unwrapConnection(targetC, con);
+            assertNotNull(resultC);
+            PreparedStatement resultS = helper.unwrapStatement(targetS, ps);
+            assertNotNull(resultS);
+        }
+        t = System.currentTimeMillis() - t;
+        System.out.println("Unwarp " + loops + " con/stmt (optimized mode): " + t + " ms");
+
+        Object[] pattern = helper.getUnwrapPatterns()[0];
+        helper.addUnwrapPattern(pattern);
+        helper.addUnwrapPattern(new Object[][]{null, null, null, null, null, null, null});
+        //System.out.println("Patterns: " + helper);
+
+        t = System.currentTimeMillis();
+        for(int i = 0;i<loops;i++)
+        {
+            Connection resultC = helper.unwrapConnection(targetC, con);
+            assertNotNull(resultC);
+            PreparedStatement resultS = helper.unwrapStatement(targetS, ps);
+            assertNotNull(resultS);
+        }
+        t = System.currentTimeMillis() - t;
+        System.out.println("Unwarp " + loops + " con/stmt (optimized mode): " + t + " ms");
+
+
+        helper = new UnwrapHelper(true, false);
+        t = System.currentTimeMillis();
+        for(int i = 0;i<loops;i++)
+        {
+            Connection resultC = helper.unwrapConnection(targetC, con);
+            assertNotNull(resultC);
+            PreparedStatement resultS = helper.unwrapStatement(targetS, ps);
+            assertNotNull(resultS);
+        }
+        t = System.currentTimeMillis() - t;
+        System.out.println("Unwarp " + loops + " con/stmt (search all patterns): " + t + " ms");
+
+        pattern = helper.getUnwrapPatterns()[0];
+        helper.addUnwrapPattern(pattern);
+        helper.addUnwrapPattern(new Object[][]{null, null, null, null, null, null, null});
+        //System.out.println("Patterns: " + helper);
+
+        t = System.currentTimeMillis();
         for(int i = 0;i<loops;i++)
         {
             Connection resultC = helper.unwrapConnection(targetC, con);
@@ -120,6 +166,6 @@
             assertNotNull(resultS);
         }
         t = System.currentTimeMillis() - t;
-        System.out.println("Unwarp " + loops + " con/stmt: " + t + " ms");
+        System.out.println("Unwarp " + loops + " con/stmt (search all patterns): " + t + " ms");
     }
 }



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