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