You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cxf.apache.org by Sergey Beryozkin <sb...@gmail.com> on 2014/12/03 12:03:14 UTC

Re: cxf git commit: [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi

Hi Freeman

Thanks for this effort, I did a minor update to avoid updating all of 
ClasspathScanner client code (JAX-RS server & client for now - but 
possibly JAXWS Spring parsers in the future too).
Dan may likely have more comments but for now I have a couple of questions,
- is FrameworkUtil.getBundle useful ? That returns a CXF bundle, right ?
- should this Spring DM code be pushed to a dedicated SpringOsgiUtil to 
minimize the risk of some JVMs failing with some eager resolution class 
loading exceptions in non-OSGI cases ?

Cheers, Sergey


On 03/12/14 05:06, ffang@apache.org wrote:
> Repository: cxf
> Updated Branches:
>    refs/heads/master 76c4df1bc -> 0de0309f2
>
>
> [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi
>
>
> Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
> Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/0de0309f
> Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/0de0309f
> Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/0de0309f
>
> Branch: refs/heads/master
> Commit: 0de0309f28e1543660c763c158f4353d6d2189be
> Parents: 76c4df1
> Author: Freeman Fang <fr...@gmail.com>
> Authored: Wed Dec 3 13:06:42 2014 +0800
> Committer: Freeman Fang <fr...@gmail.com>
> Committed: Wed Dec 3 13:06:42 2014 +0800
>
> ----------------------------------------------------------------------
>   core/pom.xml                                    | 20 ++++++++++++++++++-
>   .../org/apache/cxf/bus/osgi/CXFActivator.java   | 13 ++++++++++++
>   .../cxf/common/util/SpringClasspathScanner.java | 21 ++++++++++++++++++--
>   parent/pom.xml                                  | 11 ++++++++++
>   .../JAXRSServerFactoryBeanDefinitionParser.java | 12 +++++++++--
>   5 files changed, 72 insertions(+), 5 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/pom.xml
> ----------------------------------------------------------------------
> diff --git a/core/pom.xml b/core/pom.xml
> index 83ec6f8..d7e8f7a 100644
> --- a/core/pom.xml
> +++ b/core/pom.xml
> @@ -44,7 +44,13 @@
>               org.slf4j*;resolution:=optional;version="${cxf.osgi.slf4j.version}",
>               org.apache.log4j*;resolution:=optional,
>               net.sf.cglib*;resolution:=optional;version="${cxf.cglib.osgi.version}",
> -            org.springframework*;resolution:=optional;version="${cxf.osgi.spring.version}",
> +            org.springframework.osgi.io;resolution:=optional;version="${cxf.osgi.spring.osgi.version}",
> +            org.springframework.osgi.util;resolution:=optional;version="${cxf.osgi.spring.osgi.version}",
> +            org.springframework.aop*;resolution:=optional;version="${cxf.osgi.spring.version}",
> +            org.springframework.beans*;resolution:=optional;version="${cxf.osgi.spring.version}",
> +            org.springframework.context*;resolution:=optional;version="${cxf.osgi.spring.version}",
> +            org.springframework.core*;resolution:=optional;version="${cxf.osgi.spring.version}",
> +            org.springframework.util*;resolution:=optional;version="${cxf.osgi.spring.version}",
>               org.objectweb.asm*;resolution:=optional;version="${cxf.osgi.asm.version}",
>               javax.activation;version="${cxf.osgi.javax.activation.version}",
>               javax.annotation;version="${cxf.osgi.javax.annotation.version}",
> @@ -205,6 +211,18 @@
>               <optional>true</optional>
>               <scope>provided</scope>
>           </dependency>
> +        <dependency>
> +            <groupId>org.springframework.osgi</groupId>
> +            <artifactId>spring-osgi-io</artifactId>
> +            <optional>true</optional>
> +            <scope>provided</scope>
> +        </dependency>
> +        <dependency>
> +            <groupId>org.springframework.osgi</groupId>
> +            <artifactId>spring-osgi-core</artifactId>
> +            <optional>true</optional>
> +            <scope>provided</scope>
> +        </dependency>
>       </dependencies>
>       <build>
>           <plugins>
>
> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
> ----------------------------------------------------------------------
> diff --git a/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java b/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
> index 3fed8a8..cb9cce1 100644
> --- a/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
> +++ b/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
> @@ -45,14 +45,23 @@ import org.osgi.util.tracker.ServiceTracker;
>    * - Blueprint namespaces
>    */
>   public class CXFActivator implements BundleActivator {
> +
> +    /*
> +     * a flag to tell if run the CXF in OSGi cont
> +     */
> +    private static boolean inOSGi;
> +
>       private List<Extension> extensions;
>       private ManagedWorkQueueList workQueues = new ManagedWorkQueueList();
>       private ServiceTracker configAdminTracker;
>       private CXFExtensionBundleListener cxfBundleListener;
>       private ServiceRegistration workQueueServiceRegistration;
> +
> +
>
>       /** {@inheritDoc}*/
>       public void start(BundleContext context) throws Exception {
> +        inOSGi = true;
>           cxfBundleListener = new CXFExtensionBundleListener(context.getBundle().getBundleId());
>           context.addBundleListener(cxfBundleListener);
>           cxfBundleListener.registerExistingBundles(context);
> @@ -123,5 +132,9 @@ public class CXFActivator implements BundleActivator {
>           configAdminTracker.close();
>           ExtensionRegistry.removeExtensions(extensions);
>       }
> +
> +    public static boolean isInOSGi() {
> +        return inOSGi;
> +    }
>
>   }
>
> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
> ----------------------------------------------------------------------
> diff --git a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
> index 769d1f0..ce4dd7f 100644
> --- a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
> +++ b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
> @@ -28,7 +28,10 @@ import java.util.HashSet;
>   import java.util.List;
>   import java.util.Map;
>
> +import org.apache.cxf.bus.osgi.CXFActivator;
>   import org.apache.cxf.common.classloader.ClassLoaderUtils;
> +import org.osgi.framework.Bundle;
> +import org.osgi.framework.FrameworkUtil;
>   import org.springframework.core.io.Resource;
>   import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
>   import org.springframework.core.io.support.ResourcePatternResolver;
> @@ -36,6 +39,8 @@ import org.springframework.core.type.AnnotationMetadata;
>   import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
>   import org.springframework.core.type.classreading.MetadataReader;
>   import org.springframework.core.type.classreading.MetadataReaderFactory;
> +import org.springframework.osgi.io.OsgiBundleResourcePatternResolver;
> +import org.springframework.osgi.util.BundleDelegatingClassLoader;
>   import org.springframework.util.ClassUtils;
>
>   class SpringClasspathScanner extends ClasspathScanner {
> @@ -156,8 +161,20 @@ class SpringClasspathScanner extends ClasspathScanner {
>       }
>
>       private ResourcePatternResolver getResolver(ClassLoader loader) {
> -        return loader != null
> -            ? new PathMatchingResourcePatternResolver(loader) : new PathMatchingResourcePatternResolver();
> +        if (CXFActivator.isInOSGi()) {
> +            //in OSGi should use spring-dm OsgiBundleResourcePatternResolver
> +            // which can handle bundle url
> +            Bundle bundle = null;
> +            if (loader instanceof BundleDelegatingClassLoader) {
> +                bundle = ((BundleDelegatingClassLoader)loader).getBundle();
> +            } else {
> +                bundle = FrameworkUtil.getBundle(SpringClasspathScanner.class);
> +            }
> +            return new OsgiBundleResourcePatternResolver(bundle);
> +        } else {
> +            return loader != null
> +                ? new PathMatchingResourcePatternResolver(loader) : new PathMatchingResourcePatternResolver();
> +        }
>       }
>
>       private boolean shouldSkip(final String classname) {
>
> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/parent/pom.xml
> ----------------------------------------------------------------------
> diff --git a/parent/pom.xml b/parent/pom.xml
> index cc4cbaa..7122127 100644
> --- a/parent/pom.xml
> +++ b/parent/pom.xml
> @@ -56,6 +56,7 @@
>           <cxf.osgi.symbolic.name>${project.groupId}.${project.artifactId}</cxf.osgi.symbolic.name>
>           <cxf.osgi.dynamic.import />
>           <cxf.osgi.spring.version>[3.1,5)</cxf.osgi.spring.version>
> +        <cxf.osgi.spring.osgi.version>[1.2.0,2)</cxf.osgi.spring.osgi.version>
>           <cxf.osgi.commons.lang.version>[2.4,3)</cxf.osgi.commons.lang.version>
>           <cxf.osgi.slf4j.version>[1.5,2)</cxf.osgi.slf4j.version>
>           <cxf.osgi.javax.annotation.version>[0.0,2)</cxf.osgi.javax.annotation.version>
> @@ -1296,6 +1297,16 @@
>                   </exclusions>
>               </dependency>
>               <dependency>
> +                <groupId>org.springframework.osgi</groupId>
> +                <artifactId>spring-osgi-io</artifactId>
> +                <version>${cxf.spring.osgi.version}</version>
> +            </dependency>
> +            <dependency>
> +                 <groupId>org.springframework.osgi</groupId>
> +                 <artifactId>spring-osgi-core</artifactId>
> +                 <version>${cxf.spring.osgi.version}</version>
> +            </dependency>
> +            <dependency>
>                   <groupId>commons-codec</groupId>
>                   <artifactId>commons-codec</artifactId>
>                   <version>${cxf.commons-codec.version}</version>
>
> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
> ----------------------------------------------------------------------
> diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
> index 40b6286..e17bd1a 100644
> --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
> +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
> @@ -21,6 +21,7 @@ package org.apache.cxf.jaxrs.spring;
>   import java.io.IOException;
>   import java.lang.annotation.Annotation;
>   import java.util.ArrayList;
> +import java.util.Arrays;
>   import java.util.Collection;
>   import java.util.List;
>   import java.util.Map;
> @@ -31,6 +32,7 @@ import javax.xml.namespace.QName;
>
>   import org.w3c.dom.Element;
>
> +import org.apache.cxf.bus.osgi.CXFActivator;
>   import org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor;
>   import org.apache.cxf.common.util.ClasspathScanner;
>   import org.apache.cxf.common.util.StringUtils;
> @@ -192,8 +194,14 @@ public class JAXRSServerFactoryBeanDefinitionParser extends AbstractBeanDefiniti
>
>               try {
>                   if (basePackages != null) {
> -                    final Map< Class< ? extends Annotation >, Collection< Class< ? > > > classes =
> -                        ClasspathScanner.findClasses(basePackages, Provider.class, Path.class);
> +                    //if run CXF in OSGi, we should pass in the classloader associated with
> +                    //the bundle which has JAXRS resources under a certain basePackages
> +                    ClassLoader loader = Thread.currentThread().getContextClassLoader();
> +                    final Map< Class< ? extends Annotation >, Collection< Class< ? > > > classes =
> +                        CXFActivator.isInOSGi()
> +                            ? ClasspathScanner.findClasses(
> +                                  basePackages, Arrays.asList(Provider.class, Path.class), loader)
> +                            : ClasspathScanner.findClasses(basePackages, Provider.class, Path.class);
>
>                       this.setProviders(createBeans(classes.get(Provider.class)));
>                       this.setServiceBeans(createBeans(classes.get(Path.class)));
>


-- 

Re: cxf git commit: [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi

Posted by Freeman Fang <fr...@gmail.com>.
Hi Andriy, Sergey,

Yeah, I saw that change, +1 for it
-------------
Freeman(Yue) Fang

Red Hat, Inc. 
FuseSource is now part of Red Hat



On 2014-12-3, at 下午8:40, Sergey Beryozkin wrote:

> Hi Andriy
> Indeed - as I mentioned I reverted the changes to the parser
> Cheers, Sergey
> 
> On 03/12/14 12:38, Andrey Redko wrote:
>> Hi guys,
>> 
>> Thanks a lot for adding OSGi support. One question though: I think we
>> should hide the environment discovery (OSGi/non-OSGI) inside the
>> ClasspathScanner class.
>> ClasspathScanner, when instantiated, can figure out if it runs in OSGi
>> and create the right classpath scanner delegate (so
>> JAXRSServerFactoryBeanDefiniti__onParser will stay unchanged).
>> Thanks.
>> 
>> Best Regards,
>>     Andriy Redko
>> 
>> 
>> 
>> On Wed, Dec 3, 2014 at 6:03 AM, Sergey Beryozkin <sberyozkin@gmail.com
>> <ma...@gmail.com>> wrote:
>> 
>>    Hi Freeman
>> 
>>    Thanks for this effort, I did a minor update to avoid updating all
>>    of ClasspathScanner client code (JAX-RS server & client for now -
>>    but possibly JAXWS Spring parsers in the future too).
>>    Dan may likely have more comments but for now I have a couple of
>>    questions,
>>    - is FrameworkUtil.getBundle useful ? That returns a CXF bundle, right ?
>>    - should this Spring DM code be pushed to a dedicated SpringOsgiUtil
>>    to minimize the risk of some JVMs failing with some eager resolution
>>    class loading exceptions in non-OSGI cases ?
>> 
>>    Cheers, Sergey
>> 
>> 
>>    On 03/12/14 05:06, ffang@apache.org <ma...@apache.org> wrote:
>> 
>>        Repository: cxf
>>        Updated Branches:
>>            refs/heads/master 76c4df1bc -> 0de0309f2
>> 
>> 
>>        [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi
>> 
>> 
>>        Project: http://git-wip-us.apache.org/__repos/asf/cxf/repo
>>        <http://git-wip-us.apache.org/repos/asf/cxf/repo>
>>        Commit:
>>        http://git-wip-us.apache.org/__repos/asf/cxf/commit/0de0309f
>>        <http://git-wip-us.apache.org/repos/asf/cxf/commit/0de0309f>
>>        Tree: http://git-wip-us.apache.org/__repos/asf/cxf/tree/0de0309f
>>        <http://git-wip-us.apache.org/repos/asf/cxf/tree/0de0309f>
>>        Diff: http://git-wip-us.apache.org/__repos/asf/cxf/diff/0de0309f
>>        <http://git-wip-us.apache.org/repos/asf/cxf/diff/0de0309f>
>> 
>>        Branch: refs/heads/master
>>        Commit: 0de0309f28e1543660c763c158f435__3d6d2189be
>>        Parents: 76c4df1
>>        Author: Freeman Fang <freeman.fang@gmail.com
>>        <ma...@gmail.com>>
>>        Authored: Wed Dec 3 13:06:42 2014 +0800
>>        Committer: Freeman Fang <freeman.fang@gmail.com
>>        <ma...@gmail.com>>
>>        Committed: Wed Dec 3 13:06:42 2014 +0800
>> 
>>        ------------------------------__------------------------------__----------
>>           core/pom.xml                                    | 20
>>        ++++++++++++++++++-
>>           .../org/apache/cxf/bus/osgi/__CXFActivator.java   | 13
>>        ++++++++++++
>>           .../cxf/common/util/__SpringClasspathScanner.java | 21
>>        ++++++++++++++++++--
>>           parent/pom.xml                                  | 11 ++++++++++
>>           .../__JAXRSServerFactoryBeanDefiniti__onParser.java | 12
>>        +++++++++--
>>           5 files changed, 72 insertions(+), 5 deletions(-)
>>        ------------------------------__------------------------------__----------
>> 
>> 
>>        http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__core/pom.xml
>>        <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/pom.xml>
>>        ------------------------------__------------------------------__----------
>>        diff --git a/core/pom.xml b/core/pom.xml
>>        index 83ec6f8..d7e8f7a 100644
>>        --- a/core/pom.xml
>>        +++ b/core/pom.xml
>>        @@ -44,7 +44,13 @@
>> 
>>        org.slf4j*;resolution:=__optional;version="${cxf.osgi.__slf4j.version}",
>>                       org.apache.log4j*;resolution:=__optional,
>> 
>>        net.sf.cglib*;resolution:=__optional;version="${cxf.cglib.__osgi.version}",
>>        -
>>        org.springframework*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>>        + org.springframework.osgi.io
>>        <http://org.springframework.osgi.io>;__resolution:=optional;version="__${cxf.osgi.spring.osgi.__version}",
>>        +
>>        org.springframework.osgi.util;__resolution:=optional;version="__${cxf.osgi.spring.osgi.__version}",
>>        +
>>        org.springframework.aop*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>>        +
>>        org.springframework.beans*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>>        +
>>        org.springframework.context*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>>        +
>>        org.springframework.core*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>>        +
>>        org.springframework.util*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>> 
>>        org.objectweb.asm*;resolution:__=optional;version="${cxf.osgi.__asm.version}",
>> 
>>        javax.activation;version="${__cxf.osgi.javax.activation.__version}",
>> 
>>        javax.annotation;version="${__cxf.osgi.javax.annotation.__version}",
>>        @@ -205,6 +211,18 @@
>>                       <optional>true</optional>
>>                       <scope>provided</scope>
>>                   </dependency>
>>        +        <dependency>
>>        +            <groupId>org.springframework.__osgi</groupId>
>>        +            <artifactId>spring-osgi-io</__artifactId>
>>        +            <optional>true</optional>
>>        +            <scope>provided</scope>
>>        +        </dependency>
>>        +        <dependency>
>>        +            <groupId>org.springframework.__osgi</groupId>
>>        +            <artifactId>spring-osgi-core</__artifactId>
>>        +            <optional>true</optional>
>>        +            <scope>provided</scope>
>>        +        </dependency>
>>               </dependencies>
>>               <build>
>>                   <plugins>
>> 
>>        http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__core/src/main/java/org/apache/__cxf/bus/osgi/CXFActivator.java
>>        <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java>
>>        ------------------------------__------------------------------__----------
>>        diff --git
>>        a/core/src/main/java/org/__apache/cxf/bus/osgi/__CXFActivator.java
>>        b/core/src/main/java/org/__apache/cxf/bus/osgi/__CXFActivator.java
>>        index 3fed8a8..cb9cce1 100644
>>        ---
>>        a/core/src/main/java/org/__apache/cxf/bus/osgi/__CXFActivator.java
>>        +++
>>        b/core/src/main/java/org/__apache/cxf/bus/osgi/__CXFActivator.java
>>        @@ -45,14 +45,23 @@ import org.osgi.util.tracker.__ServiceTracker;
>>            * - Blueprint namespaces
>>            */
>>           public class CXFActivator implements BundleActivator {
>>        +
>>        +    /*
>>        +     * a flag to tell if run the CXF in OSGi cont
>>        +     */
>>        +    private static boolean inOSGi;
>>        +
>>               private List<Extension> extensions;
>>               private ManagedWorkQueueList workQueues = new
>>        ManagedWorkQueueList();
>>               private ServiceTracker configAdminTracker;
>>               private CXFExtensionBundleListener cxfBundleListener;
>>               private ServiceRegistration workQueueServiceRegistration;
>>        +
>>        +
>> 
>>               /** {@inheritDoc}*/
>>               public void start(BundleContext context) throws Exception {
>>        +        inOSGi = true;
>>                   cxfBundleListener = new
>>        CXFExtensionBundleListener(__context.getBundle().__getBundleId());
>>                   context.addBundleListener(__cxfBundleListener);
>>                   cxfBundleListener.__registerExistingBundles(__context);
>>        @@ -123,5 +132,9 @@ public class CXFActivator implements
>>        BundleActivator {
>>                   configAdminTracker.close();
>>                   ExtensionRegistry.__removeExtensions(extensions);
>>               }
>>        +
>>        +    public static boolean isInOSGi() {
>>        +        return inOSGi;
>>        +    }
>> 
>>           }
>> 
>>        http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__core/src/main/java/org/apache/__cxf/common/util/__SpringClasspathScanner.java
>>        <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java>
>>        ------------------------------__------------------------------__----------
>>        diff --git
>>        a/core/src/main/java/org/__apache/cxf/common/util/__SpringClasspathScanner.java
>>        b/core/src/main/java/org/__apache/cxf/common/util/__SpringClasspathScanner.java
>>        index 769d1f0..ce4dd7f 100644
>>        ---
>>        a/core/src/main/java/org/__apache/cxf/common/util/__SpringClasspathScanner.java
>>        +++
>>        b/core/src/main/java/org/__apache/cxf/common/util/__SpringClasspathScanner.java
>>        @@ -28,7 +28,10 @@ import java.util.HashSet;
>>           import java.util.List;
>>           import java.util.Map;
>> 
>>        +import org.apache.cxf.bus.osgi.__CXFActivator;
>>           import org.apache.cxf.common.__classloader.ClassLoaderUtils;
>>        +import org.osgi.framework.Bundle;
>>        +import org.osgi.framework.__FrameworkUtil;
>>           import org.springframework.core.io
>>        <http://org.springframework.core.io>.__Resource;
>>           import org.springframework.core.io
>>        <http://org.springframework.core.io>.__support.__PathMatchingResourcePatternRes__olver;
>>           import org.springframework.core.io
>>        <http://org.springframework.core.io>.__support.__ResourcePatternResolver;
>>        @@ -36,6 +39,8 @@ import
>>        org.springframework.core.type.__AnnotationMetadata;
>>           import
>>        org.springframework.core.type.__classreading.__CachingMetadataReaderFactory;
>>           import
>>        org.springframework.core.type.__classreading.MetadataReader;
>>           import
>>        org.springframework.core.type.__classreading.__MetadataReaderFactory;
>>        +import org.springframework.osgi.io
>>        <http://org.springframework.osgi.io>.__OsgiBundleResourcePatternResol__ver;
>>        +import org.springframework.osgi.util.__BundleDelegatingClassLoader;
>>           import org.springframework.util.__ClassUtils;
>> 
>>           class SpringClasspathScanner extends ClasspathScanner {
>>        @@ -156,8 +161,20 @@ class SpringClasspathScanner extends
>>        ClasspathScanner {
>>               }
>> 
>>               private ResourcePatternResolver getResolver(ClassLoader
>>        loader) {
>>        -        return loader != null
>>        -            ? new PathMatchingResourcePatternRes__olver(loader)
>>        : new PathMatchingResourcePatternRes__olver();
>>        +        if (CXFActivator.isInOSGi()) {
>>        +            //in OSGi should use spring-dm
>>        OsgiBundleResourcePatternResol__ver
>>        +            // which can handle bundle url
>>        +            Bundle bundle = null;
>>        +            if (loader instanceof BundleDelegatingClassLoader) {
>>        +                bundle =
>>        ((BundleDelegatingClassLoader)__loader).getBundle();
>>        +            } else {
>>        +                bundle =
>>        FrameworkUtil.getBundle(__SpringClasspathScanner.class);
>>        +            }
>>        +            return new OsgiBundleResourcePatternResol__ver(bundle);
>>        +        } else {
>>        +            return loader != null
>>        +                ? new
>>        PathMatchingResourcePatternRes__olver(loader) : new
>>        PathMatchingResourcePatternRes__olver();
>>        +        }
>>               }
>> 
>>               private boolean shouldSkip(final String classname) {
>> 
>>        http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__parent/pom.xml
>>        <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/parent/pom.xml>
>>        ------------------------------__------------------------------__----------
>>        diff --git a/parent/pom.xml b/parent/pom.xml
>>        index cc4cbaa..7122127 100644
>>        --- a/parent/pom.xml
>>        +++ b/parent/pom.xml
>>        @@ -56,6 +56,7 @@
>>                   <cxf.osgi.symbolic.name
>>        <http://cxf.osgi.symbolic.name>>${__project.groupId}.${project.__artifactId}</cxf.osgi.__symbolic.name
>>        <http://cxf.osgi.symbolic.name>>
>>                   <cxf.osgi.dynamic.import />
>> 
>>        <cxf.osgi.spring.version>[3.1,__5)</cxf.osgi.spring.version>
>>        +
>>        <cxf.osgi.spring.osgi.version>__[1.2.0,2)</cxf.osgi.spring.__osgi.version>
>> 
>>        <cxf.osgi.commons.lang.__version>[2.4,3)</cxf.osgi.__commons.lang.version>
>> 
>>        <cxf.osgi.slf4j.version>[1.5,__2)</cxf.osgi.slf4j.version>
>> 
>>        <cxf.osgi.javax.annotation.__version>[0.0,2)</cxf.osgi.__javax.annotation.version>
>>        @@ -1296,6 +1297,16 @@
>>                           </exclusions>
>>                       </dependency>
>>                       <dependency>
>>        +                <groupId>org.springframework.__osgi</groupId>
>>        +                <artifactId>spring-osgi-io</__artifactId>
>>        +                <version>${cxf.spring.osgi.__version}</version>
>>        +            </dependency>
>>        +            <dependency>
>>        +                 <groupId>org.springframework.__osgi</groupId>
>>        +                 <artifactId>spring-osgi-core</__artifactId>
>>        +                 <version>${cxf.spring.osgi.__version}</version>
>>        +            </dependency>
>>        +            <dependency>
>>                           <groupId>commons-codec</__groupId>
>>                           <artifactId>commons-codec</__artifactId>
>>                           <version>${cxf.commons-codec.__version}</version>
>> 
>>        http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>>        <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java>
>>        ------------------------------__------------------------------__----------
>>        diff --git
>>        a/rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>>        b/rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>>        index 40b6286..e17bd1a 100644
>>        ---
>>        a/rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>>        +++
>>        b/rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>>        @@ -21,6 +21,7 @@ package org.apache.cxf.jaxrs.spring;
>>           import java.io.IOException;
>>           import java.lang.annotation.__Annotation;
>>           import java.util.ArrayList;
>>        +import java.util.Arrays;
>>           import java.util.Collection;
>>           import java.util.List;
>>           import java.util.Map;
>>        @@ -31,6 +32,7 @@ import javax.xml.namespace.QName;
>> 
>>           import org.w3c.dom.Element;
>> 
>>        +import org.apache.cxf.bus.osgi.__CXFActivator;
>>           import
>>        org.apache.cxf.bus.spring.__BusWiringBeanFactoryPostProces__sor;
>>           import org.apache.cxf.common.util.__ClasspathScanner;
>>           import org.apache.cxf.common.util.__StringUtils;
>>        @@ -192,8 +194,14 @@ public class
>>        JAXRSServerFactoryBeanDefiniti__onParser extends
>>        AbstractBeanDefiniti
>> 
>>                       try {
>>                           if (basePackages != null) {
>>        -                    final Map< Class< ? extends Annotation >,
>>        Collection< Class< ? > > > classes =
>>        -
>>        ClasspathScanner.findClasses(__basePackages, Provider.class,
>>        Path.class);
>>        +                    //if run CXF in OSGi, we should pass in the
>>        classloader associated with
>>        +                    //the bundle which has JAXRS resources
>>        under a certain basePackages
>>        +                    ClassLoader loader =
>>        Thread.currentThread().__getContextClassLoader();
>>        +                    final Map< Class< ? extends Annotation >,
>>        Collection< Class< ? > > > classes =
>>        +                        CXFActivator.isInOSGi()
>>        +                            ? ClasspathScanner.findClasses(
>>        +                                  basePackages,
>>        Arrays.asList(Provider.class, Path.class), loader)
>>        +                            :
>>        ClasspathScanner.findClasses(__basePackages, Provider.class,
>>        Path.class);
>> 
>> 
>>        this.setProviders(createBeans(__classes.get(Provider.class)));
>> 
>>        this.setServiceBeans(__createBeans(classes.get(Path.__class)));
>> 
>> 
>> 
>>    --
>> 
>> 
> 


Re: cxf git commit: [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi Andriy
Indeed - as I mentioned I reverted the changes to the parser
Cheers, Sergey

On 03/12/14 12:38, Andrey Redko wrote:
> Hi guys,
>
> Thanks a lot for adding OSGi support. One question though: I think we
> should hide the environment discovery (OSGi/non-OSGI) inside the
> ClasspathScanner class.
> ClasspathScanner, when instantiated, can figure out if it runs in OSGi
> and create the right classpath scanner delegate (so
> JAXRSServerFactoryBeanDefiniti__onParser will stay unchanged).
> Thanks.
>
> Best Regards,
>      Andriy Redko
>
>
>
> On Wed, Dec 3, 2014 at 6:03 AM, Sergey Beryozkin <sberyozkin@gmail.com
> <ma...@gmail.com>> wrote:
>
>     Hi Freeman
>
>     Thanks for this effort, I did a minor update to avoid updating all
>     of ClasspathScanner client code (JAX-RS server & client for now -
>     but possibly JAXWS Spring parsers in the future too).
>     Dan may likely have more comments but for now I have a couple of
>     questions,
>     - is FrameworkUtil.getBundle useful ? That returns a CXF bundle, right ?
>     - should this Spring DM code be pushed to a dedicated SpringOsgiUtil
>     to minimize the risk of some JVMs failing with some eager resolution
>     class loading exceptions in non-OSGI cases ?
>
>     Cheers, Sergey
>
>
>     On 03/12/14 05:06, ffang@apache.org <ma...@apache.org> wrote:
>
>         Repository: cxf
>         Updated Branches:
>             refs/heads/master 76c4df1bc -> 0de0309f2
>
>
>         [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi
>
>
>         Project: http://git-wip-us.apache.org/__repos/asf/cxf/repo
>         <http://git-wip-us.apache.org/repos/asf/cxf/repo>
>         Commit:
>         http://git-wip-us.apache.org/__repos/asf/cxf/commit/0de0309f
>         <http://git-wip-us.apache.org/repos/asf/cxf/commit/0de0309f>
>         Tree: http://git-wip-us.apache.org/__repos/asf/cxf/tree/0de0309f
>         <http://git-wip-us.apache.org/repos/asf/cxf/tree/0de0309f>
>         Diff: http://git-wip-us.apache.org/__repos/asf/cxf/diff/0de0309f
>         <http://git-wip-us.apache.org/repos/asf/cxf/diff/0de0309f>
>
>         Branch: refs/heads/master
>         Commit: 0de0309f28e1543660c763c158f435__3d6d2189be
>         Parents: 76c4df1
>         Author: Freeman Fang <freeman.fang@gmail.com
>         <ma...@gmail.com>>
>         Authored: Wed Dec 3 13:06:42 2014 +0800
>         Committer: Freeman Fang <freeman.fang@gmail.com
>         <ma...@gmail.com>>
>         Committed: Wed Dec 3 13:06:42 2014 +0800
>
>         ------------------------------__------------------------------__----------
>            core/pom.xml                                    | 20
>         ++++++++++++++++++-
>            .../org/apache/cxf/bus/osgi/__CXFActivator.java   | 13
>         ++++++++++++
>            .../cxf/common/util/__SpringClasspathScanner.java | 21
>         ++++++++++++++++++--
>            parent/pom.xml                                  | 11 ++++++++++
>            .../__JAXRSServerFactoryBeanDefiniti__onParser.java | 12
>         +++++++++--
>            5 files changed, 72 insertions(+), 5 deletions(-)
>         ------------------------------__------------------------------__----------
>
>
>         http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__core/pom.xml
>         <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/pom.xml>
>         ------------------------------__------------------------------__----------
>         diff --git a/core/pom.xml b/core/pom.xml
>         index 83ec6f8..d7e8f7a 100644
>         --- a/core/pom.xml
>         +++ b/core/pom.xml
>         @@ -44,7 +44,13 @@
>
>         org.slf4j*;resolution:=__optional;version="${cxf.osgi.__slf4j.version}",
>                        org.apache.log4j*;resolution:=__optional,
>
>         net.sf.cglib*;resolution:=__optional;version="${cxf.cglib.__osgi.version}",
>         -
>         org.springframework*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>         + org.springframework.osgi.io
>         <http://org.springframework.osgi.io>;__resolution:=optional;version="__${cxf.osgi.spring.osgi.__version}",
>         +
>         org.springframework.osgi.util;__resolution:=optional;version="__${cxf.osgi.spring.osgi.__version}",
>         +
>         org.springframework.aop*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>         +
>         org.springframework.beans*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>         +
>         org.springframework.context*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>         +
>         org.springframework.core*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>         +
>         org.springframework.util*;__resolution:=optional;version="__${cxf.osgi.spring.version}",
>
>         org.objectweb.asm*;resolution:__=optional;version="${cxf.osgi.__asm.version}",
>
>         javax.activation;version="${__cxf.osgi.javax.activation.__version}",
>
>         javax.annotation;version="${__cxf.osgi.javax.annotation.__version}",
>         @@ -205,6 +211,18 @@
>                        <optional>true</optional>
>                        <scope>provided</scope>
>                    </dependency>
>         +        <dependency>
>         +            <groupId>org.springframework.__osgi</groupId>
>         +            <artifactId>spring-osgi-io</__artifactId>
>         +            <optional>true</optional>
>         +            <scope>provided</scope>
>         +        </dependency>
>         +        <dependency>
>         +            <groupId>org.springframework.__osgi</groupId>
>         +            <artifactId>spring-osgi-core</__artifactId>
>         +            <optional>true</optional>
>         +            <scope>provided</scope>
>         +        </dependency>
>                </dependencies>
>                <build>
>                    <plugins>
>
>         http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__core/src/main/java/org/apache/__cxf/bus/osgi/CXFActivator.java
>         <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java>
>         ------------------------------__------------------------------__----------
>         diff --git
>         a/core/src/main/java/org/__apache/cxf/bus/osgi/__CXFActivator.java
>         b/core/src/main/java/org/__apache/cxf/bus/osgi/__CXFActivator.java
>         index 3fed8a8..cb9cce1 100644
>         ---
>         a/core/src/main/java/org/__apache/cxf/bus/osgi/__CXFActivator.java
>         +++
>         b/core/src/main/java/org/__apache/cxf/bus/osgi/__CXFActivator.java
>         @@ -45,14 +45,23 @@ import org.osgi.util.tracker.__ServiceTracker;
>             * - Blueprint namespaces
>             */
>            public class CXFActivator implements BundleActivator {
>         +
>         +    /*
>         +     * a flag to tell if run the CXF in OSGi cont
>         +     */
>         +    private static boolean inOSGi;
>         +
>                private List<Extension> extensions;
>                private ManagedWorkQueueList workQueues = new
>         ManagedWorkQueueList();
>                private ServiceTracker configAdminTracker;
>                private CXFExtensionBundleListener cxfBundleListener;
>                private ServiceRegistration workQueueServiceRegistration;
>         +
>         +
>
>                /** {@inheritDoc}*/
>                public void start(BundleContext context) throws Exception {
>         +        inOSGi = true;
>                    cxfBundleListener = new
>         CXFExtensionBundleListener(__context.getBundle().__getBundleId());
>                    context.addBundleListener(__cxfBundleListener);
>                    cxfBundleListener.__registerExistingBundles(__context);
>         @@ -123,5 +132,9 @@ public class CXFActivator implements
>         BundleActivator {
>                    configAdminTracker.close();
>                    ExtensionRegistry.__removeExtensions(extensions);
>                }
>         +
>         +    public static boolean isInOSGi() {
>         +        return inOSGi;
>         +    }
>
>            }
>
>         http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__core/src/main/java/org/apache/__cxf/common/util/__SpringClasspathScanner.java
>         <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java>
>         ------------------------------__------------------------------__----------
>         diff --git
>         a/core/src/main/java/org/__apache/cxf/common/util/__SpringClasspathScanner.java
>         b/core/src/main/java/org/__apache/cxf/common/util/__SpringClasspathScanner.java
>         index 769d1f0..ce4dd7f 100644
>         ---
>         a/core/src/main/java/org/__apache/cxf/common/util/__SpringClasspathScanner.java
>         +++
>         b/core/src/main/java/org/__apache/cxf/common/util/__SpringClasspathScanner.java
>         @@ -28,7 +28,10 @@ import java.util.HashSet;
>            import java.util.List;
>            import java.util.Map;
>
>         +import org.apache.cxf.bus.osgi.__CXFActivator;
>            import org.apache.cxf.common.__classloader.ClassLoaderUtils;
>         +import org.osgi.framework.Bundle;
>         +import org.osgi.framework.__FrameworkUtil;
>            import org.springframework.core.io
>         <http://org.springframework.core.io>.__Resource;
>            import org.springframework.core.io
>         <http://org.springframework.core.io>.__support.__PathMatchingResourcePatternRes__olver;
>            import org.springframework.core.io
>         <http://org.springframework.core.io>.__support.__ResourcePatternResolver;
>         @@ -36,6 +39,8 @@ import
>         org.springframework.core.type.__AnnotationMetadata;
>            import
>         org.springframework.core.type.__classreading.__CachingMetadataReaderFactory;
>            import
>         org.springframework.core.type.__classreading.MetadataReader;
>            import
>         org.springframework.core.type.__classreading.__MetadataReaderFactory;
>         +import org.springframework.osgi.io
>         <http://org.springframework.osgi.io>.__OsgiBundleResourcePatternResol__ver;
>         +import org.springframework.osgi.util.__BundleDelegatingClassLoader;
>            import org.springframework.util.__ClassUtils;
>
>            class SpringClasspathScanner extends ClasspathScanner {
>         @@ -156,8 +161,20 @@ class SpringClasspathScanner extends
>         ClasspathScanner {
>                }
>
>                private ResourcePatternResolver getResolver(ClassLoader
>         loader) {
>         -        return loader != null
>         -            ? new PathMatchingResourcePatternRes__olver(loader)
>         : new PathMatchingResourcePatternRes__olver();
>         +        if (CXFActivator.isInOSGi()) {
>         +            //in OSGi should use spring-dm
>         OsgiBundleResourcePatternResol__ver
>         +            // which can handle bundle url
>         +            Bundle bundle = null;
>         +            if (loader instanceof BundleDelegatingClassLoader) {
>         +                bundle =
>         ((BundleDelegatingClassLoader)__loader).getBundle();
>         +            } else {
>         +                bundle =
>         FrameworkUtil.getBundle(__SpringClasspathScanner.class);
>         +            }
>         +            return new OsgiBundleResourcePatternResol__ver(bundle);
>         +        } else {
>         +            return loader != null
>         +                ? new
>         PathMatchingResourcePatternRes__olver(loader) : new
>         PathMatchingResourcePatternRes__olver();
>         +        }
>                }
>
>                private boolean shouldSkip(final String classname) {
>
>         http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__parent/pom.xml
>         <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/parent/pom.xml>
>         ------------------------------__------------------------------__----------
>         diff --git a/parent/pom.xml b/parent/pom.xml
>         index cc4cbaa..7122127 100644
>         --- a/parent/pom.xml
>         +++ b/parent/pom.xml
>         @@ -56,6 +56,7 @@
>                    <cxf.osgi.symbolic.name
>         <http://cxf.osgi.symbolic.name>>${__project.groupId}.${project.__artifactId}</cxf.osgi.__symbolic.name
>         <http://cxf.osgi.symbolic.name>>
>                    <cxf.osgi.dynamic.import />
>
>         <cxf.osgi.spring.version>[3.1,__5)</cxf.osgi.spring.version>
>         +
>         <cxf.osgi.spring.osgi.version>__[1.2.0,2)</cxf.osgi.spring.__osgi.version>
>
>         <cxf.osgi.commons.lang.__version>[2.4,3)</cxf.osgi.__commons.lang.version>
>
>         <cxf.osgi.slf4j.version>[1.5,__2)</cxf.osgi.slf4j.version>
>
>         <cxf.osgi.javax.annotation.__version>[0.0,2)</cxf.osgi.__javax.annotation.version>
>         @@ -1296,6 +1297,16 @@
>                            </exclusions>
>                        </dependency>
>                        <dependency>
>         +                <groupId>org.springframework.__osgi</groupId>
>         +                <artifactId>spring-osgi-io</__artifactId>
>         +                <version>${cxf.spring.osgi.__version}</version>
>         +            </dependency>
>         +            <dependency>
>         +                 <groupId>org.springframework.__osgi</groupId>
>         +                 <artifactId>spring-osgi-core</__artifactId>
>         +                 <version>${cxf.spring.osgi.__version}</version>
>         +            </dependency>
>         +            <dependency>
>                            <groupId>commons-codec</__groupId>
>                            <artifactId>commons-codec</__artifactId>
>                            <version>${cxf.commons-codec.__version}</version>
>
>         http://git-wip-us.apache.org/__repos/asf/cxf/blob/0de0309f/__rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>         <http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java>
>         ------------------------------__------------------------------__----------
>         diff --git
>         a/rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>         b/rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>         index 40b6286..e17bd1a 100644
>         ---
>         a/rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>         +++
>         b/rt/frontend/jaxrs/src/main/__java/org/apache/cxf/jaxrs/__spring/__JAXRSServerFactoryBeanDefiniti__onParser.java
>         @@ -21,6 +21,7 @@ package org.apache.cxf.jaxrs.spring;
>            import java.io.IOException;
>            import java.lang.annotation.__Annotation;
>            import java.util.ArrayList;
>         +import java.util.Arrays;
>            import java.util.Collection;
>            import java.util.List;
>            import java.util.Map;
>         @@ -31,6 +32,7 @@ import javax.xml.namespace.QName;
>
>            import org.w3c.dom.Element;
>
>         +import org.apache.cxf.bus.osgi.__CXFActivator;
>            import
>         org.apache.cxf.bus.spring.__BusWiringBeanFactoryPostProces__sor;
>            import org.apache.cxf.common.util.__ClasspathScanner;
>            import org.apache.cxf.common.util.__StringUtils;
>         @@ -192,8 +194,14 @@ public class
>         JAXRSServerFactoryBeanDefiniti__onParser extends
>         AbstractBeanDefiniti
>
>                        try {
>                            if (basePackages != null) {
>         -                    final Map< Class< ? extends Annotation >,
>         Collection< Class< ? > > > classes =
>         -
>         ClasspathScanner.findClasses(__basePackages, Provider.class,
>         Path.class);
>         +                    //if run CXF in OSGi, we should pass in the
>         classloader associated with
>         +                    //the bundle which has JAXRS resources
>         under a certain basePackages
>         +                    ClassLoader loader =
>         Thread.currentThread().__getContextClassLoader();
>         +                    final Map< Class< ? extends Annotation >,
>         Collection< Class< ? > > > classes =
>         +                        CXFActivator.isInOSGi()
>         +                            ? ClasspathScanner.findClasses(
>         +                                  basePackages,
>         Arrays.asList(Provider.class, Path.class), loader)
>         +                            :
>         ClasspathScanner.findClasses(__basePackages, Provider.class,
>         Path.class);
>
>
>         this.setProviders(createBeans(__classes.get(Provider.class)));
>
>         this.setServiceBeans(__createBeans(classes.get(Path.__class)));
>
>
>
>     --
>
>


Re: cxf git commit: [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi

Posted by Andrey Redko <dr...@gmail.com>.
Hi guys,

Thanks a lot for adding OSGi support. One question though: I think we
should hide the environment discovery (OSGi/non-OSGI) inside the
ClasspathScanner class.
ClasspathScanner, when instantiated, can figure out if it runs in OSGi and
create the right classpath scanner delegate (so
JAXRSServerFactoryBeanDefinitionParser will stay unchanged).
Thanks.

Best Regards,
    Andriy Redko



On Wed, Dec 3, 2014 at 6:03 AM, Sergey Beryozkin <sb...@gmail.com>
wrote:

> Hi Freeman
>
> Thanks for this effort, I did a minor update to avoid updating all of
> ClasspathScanner client code (JAX-RS server & client for now - but possibly
> JAXWS Spring parsers in the future too).
> Dan may likely have more comments but for now I have a couple of questions,
> - is FrameworkUtil.getBundle useful ? That returns a CXF bundle, right ?
> - should this Spring DM code be pushed to a dedicated SpringOsgiUtil to
> minimize the risk of some JVMs failing with some eager resolution class
> loading exceptions in non-OSGI cases ?
>
> Cheers, Sergey
>
>
> On 03/12/14 05:06, ffang@apache.org wrote:
>
>> Repository: cxf
>> Updated Branches:
>>    refs/heads/master 76c4df1bc -> 0de0309f2
>>
>>
>> [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi
>>
>>
>> Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/0de0309f
>> Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/0de0309f
>> Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/0de0309f
>>
>> Branch: refs/heads/master
>> Commit: 0de0309f28e1543660c763c158f4353d6d2189be
>> Parents: 76c4df1
>> Author: Freeman Fang <fr...@gmail.com>
>> Authored: Wed Dec 3 13:06:42 2014 +0800
>> Committer: Freeman Fang <fr...@gmail.com>
>> Committed: Wed Dec 3 13:06:42 2014 +0800
>>
>> ----------------------------------------------------------------------
>>   core/pom.xml                                    | 20 ++++++++++++++++++-
>>   .../org/apache/cxf/bus/osgi/CXFActivator.java   | 13 ++++++++++++
>>   .../cxf/common/util/SpringClasspathScanner.java | 21
>> ++++++++++++++++++--
>>   parent/pom.xml                                  | 11 ++++++++++
>>   .../JAXRSServerFactoryBeanDefinitionParser.java | 12 +++++++++--
>>   5 files changed, 72 insertions(+), 5 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/pom.xml
>> ----------------------------------------------------------------------
>> diff --git a/core/pom.xml b/core/pom.xml
>> index 83ec6f8..d7e8f7a 100644
>> --- a/core/pom.xml
>> +++ b/core/pom.xml
>> @@ -44,7 +44,13 @@
>>               org.slf4j*;resolution:=optional;version="${cxf.osgi.
>> slf4j.version}",
>>               org.apache.log4j*;resolution:=optional,
>>               net.sf.cglib*;resolution:=optional;version="${cxf.cglib.
>> osgi.version}",
>> -            org.springframework*;resolution:=optional;version="
>> ${cxf.osgi.spring.version}",
>> +            org.springframework.osgi.io;resolution:=optional;version="
>> ${cxf.osgi.spring.osgi.version}",
>> +            org.springframework.osgi.util;resolution:=optional;version="
>> ${cxf.osgi.spring.osgi.version}",
>> +            org.springframework.aop*;resolution:=optional;version="
>> ${cxf.osgi.spring.version}",
>> +            org.springframework.beans*;resolution:=optional;version="
>> ${cxf.osgi.spring.version}",
>> +            org.springframework.context*;resolution:=optional;version="
>> ${cxf.osgi.spring.version}",
>> +            org.springframework.core*;resolution:=optional;version="
>> ${cxf.osgi.spring.version}",
>> +            org.springframework.util*;resolution:=optional;version="
>> ${cxf.osgi.spring.version}",
>>               org.objectweb.asm*;resolution:
>> =optional;version="${cxf.osgi.asm.version}",
>>               javax.activation;version="${cxf.osgi.javax.activation.
>> version}",
>>               javax.annotation;version="${cxf.osgi.javax.annotation.
>> version}",
>> @@ -205,6 +211,18 @@
>>               <optional>true</optional>
>>               <scope>provided</scope>
>>           </dependency>
>> +        <dependency>
>> +            <groupId>org.springframework.osgi</groupId>
>> +            <artifactId>spring-osgi-io</artifactId>
>> +            <optional>true</optional>
>> +            <scope>provided</scope>
>> +        </dependency>
>> +        <dependency>
>> +            <groupId>org.springframework.osgi</groupId>
>> +            <artifactId>spring-osgi-core</artifactId>
>> +            <optional>true</optional>
>> +            <scope>provided</scope>
>> +        </dependency>
>>       </dependencies>
>>       <build>
>>           <plugins>
>>
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/
>> core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
>> ----------------------------------------------------------------------
>> diff --git a/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
>> b/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
>> index 3fed8a8..cb9cce1 100644
>> --- a/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
>> +++ b/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
>> @@ -45,14 +45,23 @@ import org.osgi.util.tracker.ServiceTracker;
>>    * - Blueprint namespaces
>>    */
>>   public class CXFActivator implements BundleActivator {
>> +
>> +    /*
>> +     * a flag to tell if run the CXF in OSGi cont
>> +     */
>> +    private static boolean inOSGi;
>> +
>>       private List<Extension> extensions;
>>       private ManagedWorkQueueList workQueues = new
>> ManagedWorkQueueList();
>>       private ServiceTracker configAdminTracker;
>>       private CXFExtensionBundleListener cxfBundleListener;
>>       private ServiceRegistration workQueueServiceRegistration;
>> +
>> +
>>
>>       /** {@inheritDoc}*/
>>       public void start(BundleContext context) throws Exception {
>> +        inOSGi = true;
>>           cxfBundleListener = new CXFExtensionBundleListener(
>> context.getBundle().getBundleId());
>>           context.addBundleListener(cxfBundleListener);
>>           cxfBundleListener.registerExistingBundles(context);
>> @@ -123,5 +132,9 @@ public class CXFActivator implements BundleActivator {
>>           configAdminTracker.close();
>>           ExtensionRegistry.removeExtensions(extensions);
>>       }
>> +
>> +    public static boolean isInOSGi() {
>> +        return inOSGi;
>> +    }
>>
>>   }
>>
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/
>> core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>> ----------------------------------------------------------------------
>> diff --git a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>> b/core/src/main/java/org/apache/cxf/common/util/
>> SpringClasspathScanner.java
>> index 769d1f0..ce4dd7f 100644
>> --- a/core/src/main/java/org/apache/cxf/common/util/
>> SpringClasspathScanner.java
>> +++ b/core/src/main/java/org/apache/cxf/common/util/
>> SpringClasspathScanner.java
>> @@ -28,7 +28,10 @@ import java.util.HashSet;
>>   import java.util.List;
>>   import java.util.Map;
>>
>> +import org.apache.cxf.bus.osgi.CXFActivator;
>>   import org.apache.cxf.common.classloader.ClassLoaderUtils;
>> +import org.osgi.framework.Bundle;
>> +import org.osgi.framework.FrameworkUtil;
>>   import org.springframework.core.io.Resource;
>>   import org.springframework.core.io.support.
>> PathMatchingResourcePatternResolver;
>>   import org.springframework.core.io.support.ResourcePatternResolver;
>> @@ -36,6 +39,8 @@ import org.springframework.core.type.
>> AnnotationMetadata;
>>   import org.springframework.core.type.classreading.
>> CachingMetadataReaderFactory;
>>   import org.springframework.core.type.classreading.MetadataReader;
>>   import org.springframework.core.type.classreading.
>> MetadataReaderFactory;
>> +import org.springframework.osgi.io.OsgiBundleResourcePatternResolver;
>> +import org.springframework.osgi.util.BundleDelegatingClassLoader;
>>   import org.springframework.util.ClassUtils;
>>
>>   class SpringClasspathScanner extends ClasspathScanner {
>> @@ -156,8 +161,20 @@ class SpringClasspathScanner extends
>> ClasspathScanner {
>>       }
>>
>>       private ResourcePatternResolver getResolver(ClassLoader loader) {
>> -        return loader != null
>> -            ? new PathMatchingResourcePatternResolver(loader) : new
>> PathMatchingResourcePatternResolver();
>> +        if (CXFActivator.isInOSGi()) {
>> +            //in OSGi should use spring-dm OsgiBundleResourcePatternResol
>> ver
>> +            // which can handle bundle url
>> +            Bundle bundle = null;
>> +            if (loader instanceof BundleDelegatingClassLoader) {
>> +                bundle = ((BundleDelegatingClassLoader)
>> loader).getBundle();
>> +            } else {
>> +                bundle = FrameworkUtil.getBundle(
>> SpringClasspathScanner.class);
>> +            }
>> +            return new OsgiBundleResourcePatternResolver(bundle);
>> +        } else {
>> +            return loader != null
>> +                ? new PathMatchingResourcePatternResolver(loader) : new
>> PathMatchingResourcePatternResolver();
>> +        }
>>       }
>>
>>       private boolean shouldSkip(final String classname) {
>>
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/parent/pom.xml
>> ----------------------------------------------------------------------
>> diff --git a/parent/pom.xml b/parent/pom.xml
>> index cc4cbaa..7122127 100644
>> --- a/parent/pom.xml
>> +++ b/parent/pom.xml
>> @@ -56,6 +56,7 @@
>>           <cxf.osgi.symbolic.name>${project.groupId}.${project.
>> artifactId}</cxf.osgi.symbolic.name>
>>           <cxf.osgi.dynamic.import />
>>           <cxf.osgi.spring.version>[3.1,5)</cxf.osgi.spring.version>
>> +        <cxf.osgi.spring.osgi.version>[1.2.0,2)</cxf.osgi.spring.
>> osgi.version>
>>           <cxf.osgi.commons.lang.version>[2.4,3)</cxf.osgi.
>> commons.lang.version>
>>           <cxf.osgi.slf4j.version>[1.5,2)</cxf.osgi.slf4j.version>
>>           <cxf.osgi.javax.annotation.version>[0.0,2)</cxf.osgi.
>> javax.annotation.version>
>> @@ -1296,6 +1297,16 @@
>>                   </exclusions>
>>               </dependency>
>>               <dependency>
>> +                <groupId>org.springframework.osgi</groupId>
>> +                <artifactId>spring-osgi-io</artifactId>
>> +                <version>${cxf.spring.osgi.version}</version>
>> +            </dependency>
>> +            <dependency>
>> +                 <groupId>org.springframework.osgi</groupId>
>> +                 <artifactId>spring-osgi-core</artifactId>
>> +                 <version>${cxf.spring.osgi.version}</version>
>> +            </dependency>
>> +            <dependency>
>>                   <groupId>commons-codec</groupId>
>>                   <artifactId>commons-codec</artifactId>
>>                   <version>${cxf.commons-codec.version}</version>
>>
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/
>> rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/
>> JAXRSServerFactoryBeanDefinitionParser.java
>> ----------------------------------------------------------------------
>> diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/
>> JAXRSServerFactoryBeanDefinitionParser.java b/rt/frontend/jaxrs/src/main/
>> java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefiniti
>> onParser.java
>> index 40b6286..e17bd1a 100644
>> --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/
>> JAXRSServerFactoryBeanDefinitionParser.java
>> +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/
>> JAXRSServerFactoryBeanDefinitionParser.java
>> @@ -21,6 +21,7 @@ package org.apache.cxf.jaxrs.spring;
>>   import java.io.IOException;
>>   import java.lang.annotation.Annotation;
>>   import java.util.ArrayList;
>> +import java.util.Arrays;
>>   import java.util.Collection;
>>   import java.util.List;
>>   import java.util.Map;
>> @@ -31,6 +32,7 @@ import javax.xml.namespace.QName;
>>
>>   import org.w3c.dom.Element;
>>
>> +import org.apache.cxf.bus.osgi.CXFActivator;
>>   import org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor;
>>   import org.apache.cxf.common.util.ClasspathScanner;
>>   import org.apache.cxf.common.util.StringUtils;
>> @@ -192,8 +194,14 @@ public class JAXRSServerFactoryBeanDefinitionParser
>> extends AbstractBeanDefiniti
>>
>>               try {
>>                   if (basePackages != null) {
>> -                    final Map< Class< ? extends Annotation >,
>> Collection< Class< ? > > > classes =
>> -                        ClasspathScanner.findClasses(basePackages,
>> Provider.class, Path.class);
>> +                    //if run CXF in OSGi, we should pass in the
>> classloader associated with
>> +                    //the bundle which has JAXRS resources under a
>> certain basePackages
>> +                    ClassLoader loader = Thread.currentThread().
>> getContextClassLoader();
>> +                    final Map< Class< ? extends Annotation >,
>> Collection< Class< ? > > > classes =
>> +                        CXFActivator.isInOSGi()
>> +                            ? ClasspathScanner.findClasses(
>> +                                  basePackages,
>> Arrays.asList(Provider.class, Path.class), loader)
>> +                            : ClasspathScanner.findClasses(basePackages,
>> Provider.class, Path.class);
>>
>>                       this.setProviders(createBeans(
>> classes.get(Provider.class)));
>>                       this.setServiceBeans(createBeans(classes.get(Path.
>> class)));
>>
>>
>
> --
>

Re: cxf git commit: [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi

Posted by Freeman Fang <fr...@gmail.com>.
Hi Sergey,

Please see my comment inline
-------------
Freeman(Yue) Fang

Red Hat, Inc. 
FuseSource is now part of Red Hat



On 2014-12-3, at 下午7:03, Sergey Beryozkin wrote:

> Hi Freeman
> 
> Thanks for this effort, I did a minor update to avoid updating all of ClasspathScanner client code (JAX-RS server & client for now - but possibly JAXWS Spring parsers in the future too).
> Dan may likely have more comments but for now I have a couple of questions,
> - is FrameworkUtil.getBundle useful ? That returns a CXF bundle, right ?
It is useful as a fallback to get a Bundle, it will return cxf-core bundle so that we can create an OsgiBundleResourcePatternResolver instance to try to find the resources
> 
> - should this Spring DM code be pushed to a dedicated SpringOsgiUtil to minimize the risk of some JVMs failing with some eager resolution class loading exceptions in non-OSGI cases ?
+1 for this proposal, I can put the spring dm code into a separated Util class to avoid such concern.

Cheers
> 
> Cheers, Sergey
> 
> 
> On 03/12/14 05:06, ffang@apache.org wrote:
>> Repository: cxf
>> Updated Branches:
>>   refs/heads/master 76c4df1bc -> 0de0309f2
>> 
>> 
>> [CXF-6131]JAX-RS resource spring auto-discovery doesn't work in OSGi
>> 
>> 
>> Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/0de0309f
>> Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/0de0309f
>> Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/0de0309f
>> 
>> Branch: refs/heads/master
>> Commit: 0de0309f28e1543660c763c158f4353d6d2189be
>> Parents: 76c4df1
>> Author: Freeman Fang <fr...@gmail.com>
>> Authored: Wed Dec 3 13:06:42 2014 +0800
>> Committer: Freeman Fang <fr...@gmail.com>
>> Committed: Wed Dec 3 13:06:42 2014 +0800
>> 
>> ----------------------------------------------------------------------
>>  core/pom.xml                                    | 20 ++++++++++++++++++-
>>  .../org/apache/cxf/bus/osgi/CXFActivator.java   | 13 ++++++++++++
>>  .../cxf/common/util/SpringClasspathScanner.java | 21 ++++++++++++++++++--
>>  parent/pom.xml                                  | 11 ++++++++++
>>  .../JAXRSServerFactoryBeanDefinitionParser.java | 12 +++++++++--
>>  5 files changed, 72 insertions(+), 5 deletions(-)
>> ----------------------------------------------------------------------
>> 
>> 
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/pom.xml
>> ----------------------------------------------------------------------
>> diff --git a/core/pom.xml b/core/pom.xml
>> index 83ec6f8..d7e8f7a 100644
>> --- a/core/pom.xml
>> +++ b/core/pom.xml
>> @@ -44,7 +44,13 @@
>>              org.slf4j*;resolution:=optional;version="${cxf.osgi.slf4j.version}",
>>              org.apache.log4j*;resolution:=optional,
>>              net.sf.cglib*;resolution:=optional;version="${cxf.cglib.osgi.version}",
>> -            org.springframework*;resolution:=optional;version="${cxf.osgi.spring.version}",
>> +            org.springframework.osgi.io;resolution:=optional;version="${cxf.osgi.spring.osgi.version}",
>> +            org.springframework.osgi.util;resolution:=optional;version="${cxf.osgi.spring.osgi.version}",
>> +            org.springframework.aop*;resolution:=optional;version="${cxf.osgi.spring.version}",
>> +            org.springframework.beans*;resolution:=optional;version="${cxf.osgi.spring.version}",
>> +            org.springframework.context*;resolution:=optional;version="${cxf.osgi.spring.version}",
>> +            org.springframework.core*;resolution:=optional;version="${cxf.osgi.spring.version}",
>> +            org.springframework.util*;resolution:=optional;version="${cxf.osgi.spring.version}",
>>              org.objectweb.asm*;resolution:=optional;version="${cxf.osgi.asm.version}",
>>              javax.activation;version="${cxf.osgi.javax.activation.version}",
>>              javax.annotation;version="${cxf.osgi.javax.annotation.version}",
>> @@ -205,6 +211,18 @@
>>              <optional>true</optional>
>>              <scope>provided</scope>
>>          </dependency>
>> +        <dependency>
>> +            <groupId>org.springframework.osgi</groupId>
>> +            <artifactId>spring-osgi-io</artifactId>
>> +            <optional>true</optional>
>> +            <scope>provided</scope>
>> +        </dependency>
>> +        <dependency>
>> +            <groupId>org.springframework.osgi</groupId>
>> +            <artifactId>spring-osgi-core</artifactId>
>> +            <optional>true</optional>
>> +            <scope>provided</scope>
>> +        </dependency>
>>      </dependencies>
>>      <build>
>>          <plugins>
>> 
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
>> ----------------------------------------------------------------------
>> diff --git a/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java b/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
>> index 3fed8a8..cb9cce1 100644
>> --- a/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
>> +++ b/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
>> @@ -45,14 +45,23 @@ import org.osgi.util.tracker.ServiceTracker;
>>   * - Blueprint namespaces
>>   */
>>  public class CXFActivator implements BundleActivator {
>> +
>> +    /*
>> +     * a flag to tell if run the CXF in OSGi cont
>> +     */
>> +    private static boolean inOSGi;
>> +
>>      private List<Extension> extensions;
>>      private ManagedWorkQueueList workQueues = new ManagedWorkQueueList();
>>      private ServiceTracker configAdminTracker;
>>      private CXFExtensionBundleListener cxfBundleListener;
>>      private ServiceRegistration workQueueServiceRegistration;
>> +
>> +
>> 
>>      /** {@inheritDoc}*/
>>      public void start(BundleContext context) throws Exception {
>> +        inOSGi = true;
>>          cxfBundleListener = new CXFExtensionBundleListener(context.getBundle().getBundleId());
>>          context.addBundleListener(cxfBundleListener);
>>          cxfBundleListener.registerExistingBundles(context);
>> @@ -123,5 +132,9 @@ public class CXFActivator implements BundleActivator {
>>          configAdminTracker.close();
>>          ExtensionRegistry.removeExtensions(extensions);
>>      }
>> +
>> +    public static boolean isInOSGi() {
>> +        return inOSGi;
>> +    }
>> 
>>  }
>> 
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>> ----------------------------------------------------------------------
>> diff --git a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>> index 769d1f0..ce4dd7f 100644
>> --- a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>> +++ b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>> @@ -28,7 +28,10 @@ import java.util.HashSet;
>>  import java.util.List;
>>  import java.util.Map;
>> 
>> +import org.apache.cxf.bus.osgi.CXFActivator;
>>  import org.apache.cxf.common.classloader.ClassLoaderUtils;
>> +import org.osgi.framework.Bundle;
>> +import org.osgi.framework.FrameworkUtil;
>>  import org.springframework.core.io.Resource;
>>  import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
>>  import org.springframework.core.io.support.ResourcePatternResolver;
>> @@ -36,6 +39,8 @@ import org.springframework.core.type.AnnotationMetadata;
>>  import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
>>  import org.springframework.core.type.classreading.MetadataReader;
>>  import org.springframework.core.type.classreading.MetadataReaderFactory;
>> +import org.springframework.osgi.io.OsgiBundleResourcePatternResolver;
>> +import org.springframework.osgi.util.BundleDelegatingClassLoader;
>>  import org.springframework.util.ClassUtils;
>> 
>>  class SpringClasspathScanner extends ClasspathScanner {
>> @@ -156,8 +161,20 @@ class SpringClasspathScanner extends ClasspathScanner {
>>      }
>> 
>>      private ResourcePatternResolver getResolver(ClassLoader loader) {
>> -        return loader != null
>> -            ? new PathMatchingResourcePatternResolver(loader) : new PathMatchingResourcePatternResolver();
>> +        if (CXFActivator.isInOSGi()) {
>> +            //in OSGi should use spring-dm OsgiBundleResourcePatternResolver
>> +            // which can handle bundle url
>> +            Bundle bundle = null;
>> +            if (loader instanceof BundleDelegatingClassLoader) {
>> +                bundle = ((BundleDelegatingClassLoader)loader).getBundle();
>> +            } else {
>> +                bundle = FrameworkUtil.getBundle(SpringClasspathScanner.class);
>> +            }
>> +            return new OsgiBundleResourcePatternResolver(bundle);
>> +        } else {
>> +            return loader != null
>> +                ? new PathMatchingResourcePatternResolver(loader) : new PathMatchingResourcePatternResolver();
>> +        }
>>      }
>> 
>>      private boolean shouldSkip(final String classname) {
>> 
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/parent/pom.xml
>> ----------------------------------------------------------------------
>> diff --git a/parent/pom.xml b/parent/pom.xml
>> index cc4cbaa..7122127 100644
>> --- a/parent/pom.xml
>> +++ b/parent/pom.xml
>> @@ -56,6 +56,7 @@
>>          <cxf.osgi.symbolic.name>${project.groupId}.${project.artifactId}</cxf.osgi.symbolic.name>
>>          <cxf.osgi.dynamic.import />
>>          <cxf.osgi.spring.version>[3.1,5)</cxf.osgi.spring.version>
>> +        <cxf.osgi.spring.osgi.version>[1.2.0,2)</cxf.osgi.spring.osgi.version>
>>          <cxf.osgi.commons.lang.version>[2.4,3)</cxf.osgi.commons.lang.version>
>>          <cxf.osgi.slf4j.version>[1.5,2)</cxf.osgi.slf4j.version>
>>          <cxf.osgi.javax.annotation.version>[0.0,2)</cxf.osgi.javax.annotation.version>
>> @@ -1296,6 +1297,16 @@
>>                  </exclusions>
>>              </dependency>
>>              <dependency>
>> +                <groupId>org.springframework.osgi</groupId>
>> +                <artifactId>spring-osgi-io</artifactId>
>> +                <version>${cxf.spring.osgi.version}</version>
>> +            </dependency>
>> +            <dependency>
>> +                 <groupId>org.springframework.osgi</groupId>
>> +                 <artifactId>spring-osgi-core</artifactId>
>> +                 <version>${cxf.spring.osgi.version}</version>
>> +            </dependency>
>> +            <dependency>
>>                  <groupId>commons-codec</groupId>
>>                  <artifactId>commons-codec</artifactId>
>>                  <version>${cxf.commons-codec.version}</version>
>> 
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/0de0309f/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
>> ----------------------------------------------------------------------
>> diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
>> index 40b6286..e17bd1a 100644
>> --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
>> +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/JAXRSServerFactoryBeanDefinitionParser.java
>> @@ -21,6 +21,7 @@ package org.apache.cxf.jaxrs.spring;
>>  import java.io.IOException;
>>  import java.lang.annotation.Annotation;
>>  import java.util.ArrayList;
>> +import java.util.Arrays;
>>  import java.util.Collection;
>>  import java.util.List;
>>  import java.util.Map;
>> @@ -31,6 +32,7 @@ import javax.xml.namespace.QName;
>> 
>>  import org.w3c.dom.Element;
>> 
>> +import org.apache.cxf.bus.osgi.CXFActivator;
>>  import org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor;
>>  import org.apache.cxf.common.util.ClasspathScanner;
>>  import org.apache.cxf.common.util.StringUtils;
>> @@ -192,8 +194,14 @@ public class JAXRSServerFactoryBeanDefinitionParser extends AbstractBeanDefiniti
>> 
>>              try {
>>                  if (basePackages != null) {
>> -                    final Map< Class< ? extends Annotation >, Collection< Class< ? > > > classes =
>> -                        ClasspathScanner.findClasses(basePackages, Provider.class, Path.class);
>> +                    //if run CXF in OSGi, we should pass in the classloader associated with
>> +                    //the bundle which has JAXRS resources under a certain basePackages
>> +                    ClassLoader loader = Thread.currentThread().getContextClassLoader();
>> +                    final Map< Class< ? extends Annotation >, Collection< Class< ? > > > classes =
>> +                        CXFActivator.isInOSGi()
>> +                            ? ClasspathScanner.findClasses(
>> +                                  basePackages, Arrays.asList(Provider.class, Path.class), loader)
>> +                            : ClasspathScanner.findClasses(basePackages, Provider.class, Path.class);
>> 
>>                      this.setProviders(createBeans(classes.get(Provider.class)));
>>                      this.setServiceBeans(createBeans(classes.get(Path.class)));
>> 
> 
> 
> --