[ 
https://issues.apache.org/jira/browse/ARIES-1342?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16002484#comment-16002484
 ] 

ASF subversion and git services commented on ARIES-1342:
--------------------------------------------------------

Commit 1794535 from [~gzres] in branch 'aries/trunk'
[ https://svn.apache.org/r1794535 ]

[ARIES-1618][ARIES-1342] Better sorting of separate interface hierarchies 
(+test)

> Aries Proxy Impl fails to proxy a service with covariant type hierarchy in 
> Java 8
> ---------------------------------------------------------------------------------
>
>                 Key: ARIES-1342
>                 URL: https://issues.apache.org/jira/browse/ARIES-1342
>             Project: Aries
>          Issue Type: Bug
>          Components: Blueprint
>    Affects Versions: proxy-impl-1.0.3
>         Environment: Karaf 3.0.3/Karaf 4.0.0, JDK 1.8.0_u45
>            Reporter: Declan Cox
>            Assignee: Guillaume Nodet
>            Priority: Critical
>              Labels: proxy-impl-1.0.4
>             Fix For: proxy-impl-1.0.5
>
>         Attachments: ARIES-1342.patch, aries-proxy-issue.rar
>
>
> I have a simple type hierarchy with a base interface and an extending 
> interface with method overriding (covariant return types). A service 
> implements the derived interface (ColumnDAO - see attached test case). The 
> attached test case illustrates the scenario. In certain situations AriesProxy 
> Impl (more specifically the InterfaceCombiningClassAdapter) fails to properly 
> synthesize the proxy code. In particular it is a combination of the lexical 
> naming of the classes in the hierarchy and Java 8 method access flags that 
> does it. The naming of the classes determines the order in which they are 
> processed since the ProxyClassLoader receives a sorted set of classes when 
> building the proxy. If that order happens to be such that the types are 
> processed in hierarchy order starting with the base type, then all is cool. 
> If not then trouble arises. 
> Why ? Well if a more derived type is processed then it instruments base 
> methods which are marked (in Java 8) with Synthetic and Bridge access flags. 
> In this case the {{visitMethod()}} in {{AbstractWovenProxyAdapter}} does not 
> generate any code but records the fact that this method has been visited. 
> When it subsequently visits the base type, the methods are skipped since they 
> are considered already visited. 
> In the test case running {{javap -verbose ColumnDAO.class}} yields the 
> following (note the base type is named ZanyDAO to force the lexical ordering 
> and thus the error) : 
> {noformat}
> public abstract org.deklanowski.aries.dao.ColumnBatch<R, C, V> prepareBatch();
>     flags: ACC_PUBLIC, ACC_ABSTRACT
>     Signature: #9                           // 
> ()Lorg/deklanowski/aries/dao/ColumnBatch<TR;TC;TV;>;
>   public abstract org.deklanowski.aries.dao.ColumnQuery<R, C, V> 
> createQuery();
>     flags: ACC_PUBLIC, ACC_ABSTRACT
>     Signature: #12                          // 
> ()Lorg/deklanowski/aries/dao/ColumnQuery<TR;TC;TV;>;
>   public org.deklanowski.aries.dao.Batch prepareBatch();
>     flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
>     Code:
>       stack=1, locals=1, args_size=1
>          0: aload_0
>          1: invokeinterface #1,  1            // InterfaceMethod 
> prepareBatch:()Lorg/deklanowski/aries/dao/ColumnBatch;
>          6: areturn
>       LineNumberTable:
>         line 3: 0
>       LocalVariableTable:
>         Start  Length  Slot  Name   Signature
>                0       7     0  this   Lorg/deklanowski/aries/dao/ColumnDAO;
>       LocalVariableTypeTable:
>         Start  Length  Slot  Name   Signature
>             0       7     0  this   
> Lorg/deklanowski/aries/dao/ColumnDAO<TR;TC;TV;>;
>   public org.deklanowski.aries.dao.Query createQuery();
>     flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
>     Code:
>       stack=1, locals=1, args_size=1
>          0: aload_0
>          1: invokeinterface #2,  1            // InterfaceMethod 
> createQuery:()Lorg/deklanowski/aries/dao/ColumnQuery;
>          6: areturn
>       LineNumberTable:
>         line 3: 0
>       LocalVariableTable:
>         Start  Length  Slot  Name   Signature
>                0       7     0  this   Lorg/deklanowski/aries/dao/ColumnDAO;
>       LocalVariableTypeTable:
>         Start  Length  Slot  Name   Signature
>             0       7     0  this   
> Lorg/deklanowski/aries/dao/ColumnDAO<TR;TC;TV;>;
> {noformat}
> The logic in the aforementioned {{AbstractWovenProxyAdapter.visitMethod()}} 
> on line 341 is as follows:
> {noformat}
>     if ((access & (ACC_STATIC | ACC_PRIVATE | ACC_SYNTHETIC 
>         | ACC_NATIVE | ACC_BRIDGE)) == 0 && !!!name.equals("<init>") && 
>         !!!name.equals("<clinit>")) {
> <snip>
> {noformat}
> The if statement evaluates to false and no code is generated though the 
> methods are recorded as having been visited.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to