[ 
https://issues.apache.org/activemq/browse/SMXCOMP-688?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=61407#action_61407
 ] 

Freeman Fang commented on SMXCOMP-688:
--------------------------------------

Hi,

busCfg would  be preferred way for SMX3. We introduce providedBus for SMX4 as 
SMX4 is based on OSGi container,which use quite different  classloader 
mechanism with the old hierarchical classloader. With providedBus, we just pass 
a spring bean as an object, but with busCfg, we actually pass a resource 
file(busCfg) from the customer bundle to cxf bundle, but the resource 
file(busCfg) in customer bundle isn't visible to cxf bundle in OSGi world, so 
you see the exception. If you still want to use busCfg with smx4, I think you 
need create a fragment bundle including the busCfg file, and attach it to cxf 
bundle.

Freeman

> servicemix-cxf-bc endpoint cannot load busCfg file when packaged as an OSGi 
> bundle
> ----------------------------------------------------------------------------------
>
>                 Key: SMXCOMP-688
>                 URL: https://issues.apache.org/activemq/browse/SMXCOMP-688
>             Project: ServiceMix Components
>          Issue Type: Bug
>          Components: servicemix-cxf-bc
>    Affects Versions: servicemix-cxf-bc-2009.02
>         Environment: apache-servicemix-4.1.0-SNAPSHOT build 164
> OSX
> java version "1.6.0_17"
> Java(TM) SE Runtime Environment (build 1.6.0_17-b04-248-10M3025)
> Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode)
>            Reporter: Paul Mietz Egli
>            Assignee: Freeman Fang
>             Fix For: servicemix-cxf-bc-2010.01
>
>         Attachments: smx4-bus-config.tar.gz, smx4-provided-bus.diff
>
>
> I've been attempting to set up CXF to use digest authentication by specifying 
> a value for the busCfg attribute of a cxfbc:provider endpoint.  When I use a 
> relative file path like the example code, I get a "Failed to load 
> configuration com/example/cxf/bus.xml", which I more or less would expect.  
> Using a "classpath:" prefix for the attribute value, I this 
> IllegalArgumentException:
> Caused by: java.lang.IllegalArgumentException: name
>       at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:458)
>       at sun.misc.URLClassPath.findResource(URLClassPath.java:145)
>       at java.net.URLClassLoader$2.run(URLClassLoader.java:362)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at java.net.URLClassLoader.findResource(URLClassLoader.java:359)
>       at java.lang.ClassLoader.getResource(ClassLoader.java:1040)
>       at 
> org.springframework.osgi.context.internal.classloader.ChainedClassLoader.doGetResource(ChainedClassLoader.java:128)
>       at 
> org.springframework.osgi.context.internal.classloader.ChainedClassLoader.getResource(ChainedClassLoader.java:110)
>       at 
> org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:160)
>       at 
> org.springframework.core.io.ClassPathResource.getFile(ClassPathResource.java:175)
>       at 
> org.springframework.core.io.AbstractResource.exists(AbstractResource.java:51)
>       at 
> org.apache.cxf.bus.spring.BusApplicationContext.findResource(BusApplicationContext.java:196)
>       at 
> org.apache.cxf.bus.spring.BusApplicationContext.getConfigResources(BusApplicationContext.java:144)
>       at 
> org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:107)
>       at 
> org.apache.cxf.bus.spring.BusApplicationContext.loadBeanDefinitions(BusApplicationContext.java:262)
>       at 
> org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
>       at 
> org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:422)
>       at 
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
>       at 
> org.apache.cxf.bus.spring.BusApplicationContext.<init>(BusApplicationContext.java:91)
>       at 
> org.apache.cxf.bus.spring.SpringBusFactory.createApplicationContext(SpringBusFactory.java:102)
>       at 
> org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:93)
>       at 
> org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:88)
>       at 
> org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:64)
>       at 
> org.apache.servicemix.cxfbc.CxfBcProvider.getBus(CxfBcProvider.java:601)
>       at 
> org.apache.servicemix.cxfbc.CxfBcProvider.validate(CxfBcProvider.java:422)
>       ... 41 more
> Using a debugger, I can see that the ChainedClassLoader contains the 
> following objects:
>   [BundleDelegatingClassLoader for [ServiceMix :: CXF Binding Component 
> (servicemix-cxf-bc)], 37.0, 40.0, 42.0, 69.0]
> where 37 is spring-aop, 40 is cglib, 42 is spring-osgi-core, and 69 is 
> servicemix-common.  There is no bundle classloader for my bundle, so even 
> though I've exported com/example/cxf, I wouldn't expect the 
> ChainedClassLoader to find it.
> It seems to me that we have a chicken-and-egg problem: we need the bus to 
> validate the component, yet we can't load the bus configuration from our 
> bundle when the component is being validated.  I thought about attaching a 
> fragment bundle to the CXF binding component, but I'm not sure if that would 
> work and it seems like a lot of trouble.
> One way around the issue would be to create a means of setting the bus object 
> using Spring, like Camel's CXF component.  I'm attaching a patch for 
> consideration which adds a setBus() method to CxfBcProvider and modifies 
> getBus() to return the object from setBus() if any.  With these changes, I'm 
> able to configure my CXF bus for Digest auth and provide it to the endpoint.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to