Patrick,
Can you expand on how this problem surfaced?  I looked back at r603666 and
the commit basically has the same text.  Was there a JIRA issue or dev
mailing post that prompted this change?  Or, did you just come across it
while performing other development/test activities.  The reason it's
catching my eye is because you ported it back to 1.0.x, so you must think
it's important.  Thanks for any background you can provide.

(We are looking at a problem reported through the WebSphere EJB3 Feature
Pack and this sounds like it could be related.  I'm just trying to determine
the context for the fix.  Thanks.)

Kevin

On Jan 7, 2008 2:09 PM, <[EMAIL PROTECTED]> wrote:

> Author: pcl
> Date: Mon Jan  7 12:09:05 2008
> New Revision: 609766
>
> URL: http://svn.apache.org/viewvc?rev=609766&view=rev
> Log:
> Port of r603666 to 1.0.x. Change Services.getImplementorClasses(Class) and
> Services.getImplementorClasses(Class,ClassLoader) to filter out
> implementations that are not assignable to the Class argument. This allows
> the Services call to be more fault-tolerant in environments with odd
> classloader configurations.
>
> Modified:
>
>  
> openjpa/branches/1.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/Services.java
>
> Modified:
> openjpa/branches/1.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/Services.java
> URL:
> http://svn.apache.org/viewvc/openjpa/branches/1.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/Services.java?rev=609766&r1=609765&r2=609766&view=diff
>
> ==============================================================================
> ---
> openjpa/branches/1.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/Services.java
> (original)
> +++
> openjpa/branches/1.0.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/Services.java
> Mon Jan  7 12:09:05 2008
> @@ -25,7 +25,9 @@
>  import java.net.URL;
>  import java.security.AccessController;
>  import java.util.ArrayList;
> +import java.util.Arrays;
>  import java.util.Enumeration;
> +import java.util.HashSet;
>  import java.util.List;
>  import java.util.Set;
>  import java.util.StringTokenizer;
> @@ -145,7 +147,21 @@
>
>     public static Class[] getImplementorClasses(Class serviceClass,
>         ClassLoader loader) {
> -        return getImplementorClasses(serviceClass.getName(), loader);
> +        Set invalid = new HashSet();
> +        Class[] classes = getImplementorClasses(serviceClass.getName(),
> loader);
> +
> +        // filter out any classes that have any classloader issues wrt.
> +        // the specified service class.
> +        for (int i = 0; i < classes.length; i++)
> +            if (!serviceClass.isAssignableFrom(classes[i]))
> +                invalid.add(classes[i]);
> +        if (invalid.size() != 0) {
> +            List list = new ArrayList(Arrays.asList(classes));
> +            list.removeAll(invalid);
> +            return (Class[]) list.toArray(new Class[list.size()]);
> +        } else {
> +            return classes;
> +        }
>     }
>
>     /**
>
>
>

Reply via email to