Repository: commons-pool
Updated Branches:
  refs/heads/master ed9fd0b0d -> be3bcaff4


[POOL-338] GenericObjectPool constructor may throw an exception under
OSGi.

Project: http://git-wip-us.apache.org/repos/asf/commons-pool/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-pool/commit/be3bcaff
Tree: http://git-wip-us.apache.org/repos/asf/commons-pool/tree/be3bcaff
Diff: http://git-wip-us.apache.org/repos/asf/commons-pool/diff/be3bcaff

Branch: refs/heads/master
Commit: be3bcaff4f12f610d9eb74ef1da39cc004d21992
Parents: ed9fd0b
Author: Michael C <micha...@hotmail.com>
Authored: Sun May 27 10:17:14 2018 -0600
Committer: Gary Gregory <garydgreg...@gmail.com>
Committed: Sun May 27 10:17:14 2018 -0600

----------------------------------------------------------------------
 .../pool2/impl/BaseGenericObjectPool.java       | 36 +++++++++-----------
 1 file changed, 17 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-pool/blob/be3bcaff/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java 
b/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
index cb6d5a8..c4837c0 100644
--- a/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
+++ b/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
@@ -617,28 +617,18 @@ public abstract class BaseGenericObjectPool<T> extends 
BaseObject {
      *        {@link EvictionPolicy} interface.
      */
     public final void setEvictionPolicyClassName(final String 
evictionPolicyClassName, final ClassLoader classLoader) {
+        // Getting epClass here and now best matches the caller's environment
+        final Class<?> epClass = EvictionPolicy.class;
+        final ClassLoader epClassLoader = epClass.getClassLoader();
         try {
-            Class<?> clazz;
-            String epcnClassLoaderDesc;
-            // Getting epClass here and now best matches the caller's 
environment
-            final Class<?> epClass = EvictionPolicy.class;
-            final ClassLoader epClassLoader = epClass.getClassLoader();
             try {
-                epcnClassLoaderDesc = classLoader.toString();
-                clazz = Class.forName(evictionPolicyClassName, true, 
classLoader);
-            } catch (final ClassNotFoundException e) {
-                epcnClassLoaderDesc = epClassLoader.toString();
-                clazz = Class.forName(evictionPolicyClassName, true, 
epClassLoader);
-            }
-            final Object policy = clazz.getConstructor().newInstance();
-            if (epClass.isInstance(policy)) {
-                @SuppressWarnings("unchecked") // safe, because we just 
checked the class
-                final EvictionPolicy<T> evicPolicy = (EvictionPolicy<T>) 
policy;
-                this.evictionPolicy = evicPolicy;
-            } else {
-                throw new IllegalArgumentException("Class " + 
evictionPolicyClassName + " from class loader ["
-                        + epcnClassLoaderDesc + "] does not implement " + 
EVICTION_POLICY_TYPE_NAME);
+                setEvictionPolicy(evictionPolicyClassName, classLoader);
+            } catch (final ClassCastException | ClassNotFoundException e) {
+                setEvictionPolicy(evictionPolicyClassName, epClassLoader);
             }
+        } catch (final ClassCastException e) {
+            throw new IllegalArgumentException("Class " + 
evictionPolicyClassName + " from class loaders ["
+                    + classLoader + ", " + epClassLoader + "] do not implement 
" + EVICTION_POLICY_TYPE_NAME);
         } catch (final ClassNotFoundException | InstantiationException | 
IllegalAccessException
                 | InvocationTargetException | NoSuchMethodException e) {
             final String exMessage = "Unable to create " + 
EVICTION_POLICY_TYPE_NAME + " instance of type "
@@ -647,6 +637,14 @@ public abstract class BaseGenericObjectPool<T> extends 
BaseObject {
         }
     }
 
+    @SuppressWarnings("unchecked")
+    private void setEvictionPolicy(final String className, final ClassLoader 
classLoader)
+            throws ClassNotFoundException, InstantiationException, 
IllegalAccessException, InvocationTargetException, NoSuchMethodException {
+        final Class<?> clazz = Class.forName(className, true, classLoader);
+        final Object policy = clazz.getConstructor().newInstance();
+        this.evictionPolicy = (EvictionPolicy<T>) policy;
+    }
+
     /**
      * Sets the name of the {@link EvictionPolicy} implementation that is used 
by this pool. The Pool will attempt to
      * load the class using the thread context class loader. If that fails, 
the use the class loader for the

Reply via email to