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

Christian Schneider reassigned DOSGI-254:
-----------------------------------------

    Assignee: Christian Schneider

> ServiceInvocationHandler does not handle checked super-interface exceptions 
> correctly
> -------------------------------------------------------------------------------------
>
>                 Key: DOSGI-254
>                 URL: https://issues.apache.org/jira/browse/DOSGI-254
>             Project: CXF Distributed OSGi
>          Issue Type: Bug
>          Components: common
>    Affects Versions: 2.0.0
>            Reporter: Panu Hämäläinen
>            Assignee: Christian Schneider
>
> If a remote service interface is composed of an interface hierarchy, the 
> ServiceInvocationHandler (in org.apache.cxf.dosgi.dsw.handlers package on 
> 1.7.0)  only handles correctly the checked exceptions of the interface the 
> service directly implements/exports (the lowest level interface of the 
> hierarchy). The checked exceptions of the superinterface methods are thrown 
> as generic ServiceExceptions (which are RuntimeExceptions). 
> For example below, the IOException thrown by the throwBaseException method 
> gets converted to ServiceException while the URISyntaxException thrown by the 
> throwSubException method remains correctly as URISyntaxException. The service 
> is exported as a TestSubInterface service.
> {code}
>     public interface TestBaseInterface {
>         void throwBaseException() throws IOException;
>     }
>     
>     public interface TestSubInterface extends TestBaseInterface {
>         void throwSubException() throws URISyntaxException;
>     }
>     public class TestClass implements TestSubInterface {
>         @Override
>         public void throwBaseException() throws IOException {
>             throw new IOException("expected baseinterface exception");
>         }
>         @Override
>         public void throwSubException() throws URISyntaxException {
>             throw new URISyntaxException("some input", "expected subinterface 
> exception");
>         }
>     }
> {code}
> I have been using DOSGi 1.7.0 but I also checked version 2.0.0 and 
> ServiceInvocationHandler (now in org.apache.cxf.dosgi.common.proxy package) 
> seems the same as in previous releases.
> The problem seems to be in ServiceInvocationHandler in the method
> {code}
>     private void introspectType(Class<?> iType) {
>         for (Method m : iType.getDeclaredMethods()) {
>             for (Class<?> excType : m.getExceptionTypes()) {
>                 if (Exception.class.isAssignableFrom(excType)) {
>                     List<Class<?>> types = exceptionsMap.get(m);
>                     if (types == null) {
>                         types = new ArrayList<Class<?>>();
>                         exceptionsMap.put(m, types);
>                     }
>                     types.add(excType);
>                 }
>             }
>         }
>     }
> {code}
> for which the javadocs of  iType.getDeclaredMethods() say "Returns an array 
> of Method objects reflecting all the methods declared by the class or 
> interface represented by this Class object. This includes public, protected, 
> default (package) access, and private methods, *but excludes inherited 
> methods*." 
> The introspectType method should be changed so that it also processes at 
> least the public methods of the superinterfaces/classes. This can be achieved 
> e.g. with iType.getMethods().



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to