[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wink-dev
Subject:    [jira] [Updated] (WINK-363) Failure to find array entity providers (such as ByteArrayProvider) in Ja
From:       "Luciano Resende (JIRA)" <jira () apache ! org>
Date:       2012-08-02 0:38:03
Message-ID: 1906551693.3432.1343867883758.JavaMail.jiratomcat () issues-vm
[Download RAW message or body]


     [ https://issues.apache.org/jira/browse/WINK-363?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel \
]

Luciano Resende updated WINK-363:
---------------------------------

    Affects Version/s:     (was: 1.1.3)
                       1.2
        Fix Version/s: 1.3
    
> Failure to find array entity providers (such as ByteArrayProvider) in Java 7
> ----------------------------------------------------------------------------
> 
> Key: WINK-363
> URL: https://issues.apache.org/jira/browse/WINK-363
> Project: Wink
> Issue Type: Bug
> Components: Providers
> Affects Versions: 1.2
> Environment: Linux, Java 1.7.0-b147
> Reporter: Georg Sander
> Fix For: 1.3
> 
> Attachments: GenericsUtils.java
> 
> 
> The ByteArrayProvider is properly registered and is found through ProvidersRegistry \
> in Java 6,but not in Java 7. The effect is a consequence of Java bug \
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5041784 which got fixed in Java \
>                 7. It can also affect other array entity providers.
> Explanation: 
> ProvidersRegistry collects the providers for the target type byte[] by checking \
> whether the provider type and the target type are assignable. The corresponding \
> utilities are in GenericsUtils. To determine the provider type, \
> GenericsUtil.getGenericInterfaceParamType retrieves the type from the generic \
> interfaces of ByteArrayProvider. The type parameters in the generic interfaces are \
> represented as java.lang.reflect.Type in Java 6 but as java.lang.Class in Java 7. \
> As consequence, the method GenericsUtils.isAssignableFrom fails to see that the \
> type parameter is an array, hence it returns that byte[] is not assignable to the \
> retrieved type of ByteArrayProvider. Here is a simple Java program that explains \
> the difference between Java 6 and Java 7.  In Java 6, the output is:
> Type Parameter byte[]
> Type Parameter class class \
> sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl Is Generic Array true
> In Java 7, the output is:
> Type Parameter class [B
> Type Parameter class class java.lang.Class
> Is Generic Array false
> {code}
> import java.lang.reflect.GenericArrayType;
> import java.lang.reflect.ParameterizedType;
> import java.lang.reflect.Type;
> public class Test
> {
> public static void main(String[] args) {
> Class cls = ByteArrayProvider.class;
> Type[] interfaces = cls.getGenericInterfaces();
> for (Type type : interfaces) {
> if (type instanceof ParameterizedType) {
> ParameterizedType pType = (ParameterizedType)type;
> Type t = pType.getActualTypeArguments()[0];
> System.err.println("Type Parameter " + t);
> System.err.println("Type Parameter class " + t.getClass());
> System.err.println("Is Generic Array " + (t instanceof GenericArrayType));
> }
> }
> }
> }
> interface MessageBodyWriter<T> { }
> class ByteArrayProvider implements MessageBodyWriter<byte[]> { }
> {code}
> I suggest the following fix in GenericsUtils (tested locally in Wink 1.1.3):
> {code:title=GenericsUtils.isAssignableFrom|borderStyle=solid}
> public static boolean isAssignableFrom(Type type, Class<?> cls) {
> if (cls.isArray()) {
> if (type instanceof GenericArrayType) {
> GenericArrayType genericArray = (GenericArrayType)type;
> Class<?> componentType = cls.getComponentType();
> return isAssignableFrom(genericArray.getGenericComponentType(), componentType);
> }
> else if ((type instanceof Class<?>) && ((Class<?>)type).isArray()) {
> Class<?> componentType1 = ((Class<?>)type).getComponentType();
> Class<?> componentType2 = cls.getComponentType();
> return isAssignableFrom(componentType1, componentType2);
> }
> } else {
> if (type instanceof GenericArrayType == false) {
> Class<?> classType = getClassType(type, null);
> if (classType == Object.class || classType.isAssignableFrom(cls)) {
> return true;
> }
> }
> }
> return false;
> }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: \
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more \
information on JIRA, see: http://www.atlassian.com/software/jira

        


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic