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

Nicolas Dutertry updated ARIES-1849:
------------------------------------
    Description: 
Since Java 8 it is possible to define default implementations inside interface 
definition.

It seems that Aries proxy is not compatible with interface default methods. As 
a result it is not possible to use a blueprint reference to a service 
implementing an interface with default method.

The following unit test demonstrates the issue :
{code:java}
import java.util.Collections;
import org.apache.aries.proxy.UnableToProxyException;
import org.apache.aries.proxy.impl.interfaces.InterfaceProxyGenerator;
import org.junit.Assert;
import org.junit.Test;

public class InterfaceProxyGeneratorTest {
    public static interface Service {
        String getName();
        
        default String getValue() {
            return "default";
        }
    }
    
    public static class ServiceImpl implements Service {
        @Override
        public String getName() {
            return "serviceimpl";
        }
        
        @Override
        public String getValue() {
            return "value";
        }
    }
    
    @Test
    public void testProxy() throws UnableToProxyException {
        ServiceImpl serviceImpl = new ServiceImpl();
        Assert.assertEquals("serviceimpl", serviceImpl.getName());
        Assert.assertEquals("value", serviceImpl.getValue());
        
        Service proxy = (Service)InterfaceProxyGenerator.getProxyInstance(
            null, null, Collections.singleton(Service.class),
            () -> {
                return serviceImpl;
            },
            null);
        
        Assert.assertNotNull(proxy);        
        Assert.assertEquals("serviceimpl", proxy.getName());
        Assert.assertEquals("value", proxy.getValue());
    }
}{code}

  was:
Since Java 8 it is possible to define default implementations inside interface 
definition.

It seems that Aries proxy is not compatible with interface default methods. As 
a result it is not possible to use a blueprint reference to a service 
implementing an interface with default method.

The following unit test demonstrate the issue :
{code:java}
import java.util.Collections;
import org.apache.aries.proxy.UnableToProxyException;
import org.apache.aries.proxy.impl.interfaces.InterfaceProxyGenerator;
import org.junit.Assert;
import org.junit.Test;

public class InterfaceProxyGeneratorTest {
    public static interface Service {
        String getName();
        
        default String getValue() {
            return "default";
        }
    }
    
    public static class ServiceImpl implements Service {
        @Override
        public String getName() {
            return "serviceimpl";
        }
        
        @Override
        public String getValue() {
            return "value";
        }
    }
    
    @Test
    public void testProxy() throws UnableToProxyException {
        ServiceImpl serviceImpl = new ServiceImpl();
        Assert.assertEquals("serviceimpl", serviceImpl.getName());
        Assert.assertEquals("value", serviceImpl.getValue());
        
        Service proxy = (Service)InterfaceProxyGenerator.getProxyInstance(
            null, null, Collections.singleton(Service.class),
            () -> {
                return serviceImpl;
            },
            null);
        
        Assert.assertNotNull(proxy);        
        Assert.assertEquals("serviceimpl", proxy.getName());
        Assert.assertEquals("value", proxy.getValue());
    }
}{code}


> Aries proxy does not work with interface default methods
> --------------------------------------------------------
>
>                 Key: ARIES-1849
>                 URL: https://issues.apache.org/jira/browse/ARIES-1849
>             Project: Aries
>          Issue Type: Bug
>          Components: Proxy
>    Affects Versions: proxy-impl-1.1.2
>            Reporter: Nicolas Dutertry
>            Priority: Major
>
> Since Java 8 it is possible to define default implementations inside 
> interface definition.
> It seems that Aries proxy is not compatible with interface default methods. 
> As a result it is not possible to use a blueprint reference to a service 
> implementing an interface with default method.
> The following unit test demonstrates the issue :
> {code:java}
> import java.util.Collections;
> import org.apache.aries.proxy.UnableToProxyException;
> import org.apache.aries.proxy.impl.interfaces.InterfaceProxyGenerator;
> import org.junit.Assert;
> import org.junit.Test;
> public class InterfaceProxyGeneratorTest {
>     public static interface Service {
>         String getName();
>         
>         default String getValue() {
>             return "default";
>         }
>     }
>     
>     public static class ServiceImpl implements Service {
>         @Override
>         public String getName() {
>             return "serviceimpl";
>         }
>         
>         @Override
>         public String getValue() {
>             return "value";
>         }
>     }
>     
>     @Test
>     public void testProxy() throws UnableToProxyException {
>         ServiceImpl serviceImpl = new ServiceImpl();
>         Assert.assertEquals("serviceimpl", serviceImpl.getName());
>         Assert.assertEquals("value", serviceImpl.getValue());
>         
>         Service proxy = (Service)InterfaceProxyGenerator.getProxyInstance(
>             null, null, Collections.singleton(Service.class),
>             () -> {
>                 return serviceImpl;
>             },
>             null);
>         
>         Assert.assertNotNull(proxy);        
>         Assert.assertEquals("serviceimpl", proxy.getName());
>         Assert.assertEquals("value", proxy.getValue());
>     }
> }{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to