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

Freeman Fang edited comment on SMXCOMP-688 at 8/26/10 11:58 PM:
----------------------------------------------------------------

Hi,

For your questions

1) & 2)
You can use providedBus. For the providedBus, you needn't write a class to 
extend CxfBus, you only need a spring file to configure the cxf bus and pass it 
to providedBus, you need take a look at the commit with this jira. With 
providedBus, you can put all class/resources in your own customer bundle.
Also for your 1), do you mean you already use providedBus but authentication 
parameters not take effect? In this case you need ensure the http-conduit 
endpoint name you specified should be same as it for cxf bc provider endpoint.


3)If you still want to use busCfg as you do in smx3, you need  create a 
fragment bundle including the busCfg file, and attach it to cxf bundle(cxf 
bundle is a bundle containing all cxf related classes/resoures, especially the 
CxfBus init code in our case). This is the way to make busCfg file visible to 
cxf bundle with OSGi classloader mechanism. So we mentioned three bundles now, 
your own customer bundle(you create it), a fragment bundle including busCfg 
file(you create it), cxf bundle(cxf bundle is already in the container by 
default, it's not created yourself, it play the role as a host for the fragment 
bundle you created.)

Hope this helps.

Freeman

      was (Author: ffang):
    Hi,

For your questions

1) & 2)
You can use providedBus. For the providedBus, you needn't write a class to 
extend CxfBus, you only need a spring file to configure the cxf bus and pass it 
to providedBus, you need take a look at the commit with this jira. With 
providedBus, you can put all class/resources in your own customer bundle.

3)If you still want to use busCfg as you do in smx3, you need  create a 
fragment bundle including the busCfg file, and attach it to cxf bundle(cxf 
bundle is a bundle containing all cxf related classes/resoures, especially the 
CxfBus init code in our case). This is the way to make busCfg file visible to 
cxf bundle with OSGi classloader mechanism. So we mentioned three bundles now, 
your own customer bundle(you create it), a fragment bundle including busCfg 
file(you create it), cxf bundle(cxf bundle is already in the container by 
default, it's not created yourself, it play the role as a host for the fragment 
bundle you created.)

Hope this helps.

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