You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Ivanhoe Abrahams <iv...@gmail.com> on 2011/04/20 18:52:38 UTC

Contribute possible code fix - CXF DOSGI

Hi All

In my local environment I use Apache Aries and lately added CXF DOSGI.
I noticed that the greeter example works fine but my own services, which are
registered by aries blueprint
did not get exported by CXF DOSGI.

After a little scratching around I found the following code to be the
culprit.
In the dsw module there exists a class called
org.apache.cxf.dosgi.dsw.ClassUtils

the call to the public static Class<?> getInterfaceClass(Object service,
String interfaceName)  would always
return the correct interface in case of the greeter example.
But in the case of  my aries registered services, it always returned a null.


So I changed the following method
private static Class<?> getInterfaceClass(Class<?> serviceClass, String
interfaceName)  in the same class


OLD METHOD
    private static Class<?> getInterfaceClass(Class<?> serviceClass, String
interfaceName) {

        for (Class<?> iClass : serviceClass.getInterfaces()) {
            if (iClass.getName().equals(interfaceName)) {
                return iClass;
            }
            Class<?> intf = getInterfaceClass(iClass, interfaceName);
            if (intf != null) {
                return intf;
            }
        }
        if (serviceClass.getName().equals(interfaceName)) {
            return serviceClass;
        }

        return null;
    }

NEW METHOD
    private static Class<?> getInterfaceClass(Class<?> serviceClass, String
interfaceName) {

        for (Class<?> iClass : serviceClass.getInterfaces()) {
            if (iClass.getName().equals(interfaceName)) {
                return iClass;
            }
            Class<?> intf = getInterfaceClass(iClass, interfaceName);
            if (intf != null) {
                return intf;
            }
        }
        if (serviceClass.getName().equals(interfaceName)) {
            return serviceClass;
        }

        //Mark start amendment
        //Could have been enhaced by another framework ... ie. ARIES
        serviceClass = serviceClass.getSuperclass();
if (serviceClass != null){
    for (Class<?> iClass : serviceClass.getInterfaces()) {
            if (iClass.getName().equals(interfaceName)) {
                return iClass;
            }
            Class<?> intf = getInterfaceClass(iClass, interfaceName);
            if (intf != null) {
                return intf;
            }
        }
}
        //Mark end amendment

        return null;
    }

So all this extra code does is to "check" that if the passed service has
been "enhanced" (by Aries blueprint in this case), then
get the superclass and check all interfaces in the superclass.

I guess blueprint enhances the original services by weaving in a new class
which has as superclass the original.
I hope this bit of code is helpful, and makes sense ;-)

Regards
Ivanhoe

Re: Contribute possible code fix - CXF DOSGI

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi

The enhancement looks good, would it make sense to recurse instead, as
there could be multiple CGLIB proxies involved ?
Please open DOSGI JIRA and attach a patch
Cheers, Sergey

On Wed, Apr 20, 2011 at 5:52 PM, Ivanhoe Abrahams
<iv...@gmail.com> wrote:
> Hi All
>
> In my local environment I use Apache Aries and lately added CXF DOSGI.
> I noticed that the greeter example works fine but my own services, which are
> registered by aries blueprint
> did not get exported by CXF DOSGI.
>
> After a little scratching around I found the following code to be the
> culprit.
> In the dsw module there exists a class called
> org.apache.cxf.dosgi.dsw.ClassUtils
>
> the call to the public static Class<?> getInterfaceClass(Object service,
> String interfaceName)  would always
> return the correct interface in case of the greeter example.
> But in the case of  my aries registered services, it always returned a null.
>
>
> So I changed the following method
> private static Class<?> getInterfaceClass(Class<?> serviceClass, String
> interfaceName)  in the same class
>
>
> OLD METHOD
>    private static Class<?> getInterfaceClass(Class<?> serviceClass, String
> interfaceName) {
>
>        for (Class<?> iClass : serviceClass.getInterfaces()) {
>            if (iClass.getName().equals(interfaceName)) {
>                return iClass;
>            }
>            Class<?> intf = getInterfaceClass(iClass, interfaceName);
>            if (intf != null) {
>                return intf;
>            }
>        }
>        if (serviceClass.getName().equals(interfaceName)) {
>            return serviceClass;
>        }
>
>        return null;
>    }
>
> NEW METHOD
>    private static Class<?> getInterfaceClass(Class<?> serviceClass, String
> interfaceName) {
>
>        for (Class<?> iClass : serviceClass.getInterfaces()) {
>            if (iClass.getName().equals(interfaceName)) {
>                return iClass;
>            }
>            Class<?> intf = getInterfaceClass(iClass, interfaceName);
>            if (intf != null) {
>                return intf;
>            }
>        }
>        if (serviceClass.getName().equals(interfaceName)) {
>            return serviceClass;
>        }
>
>        //Mark start amendment
>        //Could have been enhaced by another framework ... ie. ARIES
>        serviceClass = serviceClass.getSuperclass();
> if (serviceClass != null){
>    for (Class<?> iClass : serviceClass.getInterfaces()) {
>            if (iClass.getName().equals(interfaceName)) {
>                return iClass;
>            }
>            Class<?> intf = getInterfaceClass(iClass, interfaceName);
>            if (intf != null) {
>                return intf;
>            }
>        }
> }
>        //Mark end amendment
>
>        return null;
>    }
>
> So all this extra code does is to "check" that if the passed service has
> been "enhanced" (by Aries blueprint in this case), then
> get the superclass and check all interfaces in the superclass.
>
> I guess blueprint enhances the original services by weaving in a new class
> which has as superclass the original.
> I hope this bit of code is helpful, and makes sense ;-)
>
> Regards
> Ivanhoe
>



-- 
Sergey Beryozkin

Application Integration Division of Talend
http://sberyozkin.blogspot.com