Oh, I see what I was confused about.
The WebServiceBindingImpl object is not going to have an IC in your case in
which you simply declare an empty element:
<binding.ws/>
It is in fact, going to set the IC from the component ref/srvc IC. For
some reason I had it in my had that things worked differently, but
now I see why the clone is needed.
Thanks for talking me through that...
Scott
On Wed, May 14, 2008 at 1:58 PM, Luciano Resende <[EMAIL PROTECTED]>
wrote:
> This is all happening on the Axis2ServiceBindingProvider constructor,
> and I assume that at this point the resolve method you mentioned has
> not been trigerred yet. Note that when java interface is used, we
> properly handle it, but we were not handling it when a WSDl interface
> was in use. Below is the code with a local update to clone the
> interface contract that seems to workaround/fix the issue. Maybe I
> should use the code from resolve to properly fix this.
>
> InterfaceContract contract = wsBinding.getBindingInterfaceContract();
> if (contract == null) {
> contract =
> service.getInterfaceContract().makeUnidirectional(false);
> if ((contract instanceof JavaInterfaceContract)) {
> contract =
>
> Java2WSDLHelper.createWSDLInterfaceContract((JavaInterfaceContract)contract,
> requiresSOAP12(wsBinding));
> } else {
> //WORKAROUND/FIX for TUSCANY-2316
> try {
> contract = (InterfaceContract) contract.clone();
> } catch (Exception e) {
> //ignore
> }
> }
> wsBinding.setBindingInterfaceContract(contract);
> }
>
> .....
>
> // Set to use the Axiom data binding
> contract.getInterface().resetDataBinding(OMElement.class.getName());
>
>
> On Wed, May 14, 2008 at 7:45 AM, Scott Kurz <[EMAIL PROTECTED]> wrote:
> > Mike,
> >
> > On Wed, May 14, 2008 at 9:41 AM, Mike Edwards <
> > [EMAIL PROTECTED]> wrote:
> >
> >> Scott,
> >>
> >> Glad you've taken this out of the JIRA comments and on to the list -
> >> easier to communicate this way ;-).
> >>
> >> The point about the original code in Axis2ReferenceBindingProvider and
> >> Axis2ServiceBindingProvider is that there is SUPPOSED to be a new
> >> InterfaceContract for the Axis binding itself - separate from the
> >> InterfaceContract of the BPEL component. The wire, when it is created
> must
> >> be able to see the databinding for the BPEL process (DOM) and the
> separate
> >> databinding for the Axis binding code (OMElements) and then generate the
> >> appropriate conversions between the two.
> >>
> >
> >> The current code in Axis2ReferenceBindingProvider and
> >> Axis2ServiceBindingProvider is wrong since for a WSDL InterfaceContract,
> it
> >> does not create a separate InterfaceContract for the Axis binding - it
> >> simply hands over the one from the BPEL Process. When the Axis binding
> does
> >> some updates, in particular for the databinding used, it simply
> overwrites
> >> the BPEL Process information. This causes the databinding conversion
> code
> >> to assume that no transformation is necessary and as a result, the wrong
> >> stuff gets delivered. Result: BANG! - some nasty type conversion
> failure
> >> at a random point in the code.
> >>
> >
> > Yes there is supposed to be a distinct IC between the wireSource IC
> (Axis2
> > binding IC) and the wireTarget IC (where the target is the
> BPEL-implemented
> > component). But are we sure the problem is with the binding side and
> not
> > the impl side?
> >
> > Look at what the Axis2 binding code does:
> >
> > public Axis2ServiceBindingProvider(RuntimeComponent component,.....)
> > ....
> > InterfaceContract contract =
> > wsBinding.getBindingInterfaceContract();
> >
> > It just gets the IC from the WS binding.
> >
> > From what you're saying, it sounds like this IC obtained from the binding
> is
> > somehow in the picture as the wireTarget IC as well. This is what
> > surprises me, because if we look at the WS binding resolve() method, we
> seem
> > to be creating a brand new IC at this point:
> >
> > WebServiceBindingProcessor.resolve():
> > .....
> > PortType portType = getPortType(model);
> > if (portType != null) {
> > WSDLInterfaceContract interfaceContract =
> > wsdlFactory.createWSDLInterfaceContract();
> > WSDLInterface wsdlInterface;
> > try {
> > wsdlInterface =
> > wsdlFactory.createWSDLInterface(portType, wsdlDefinition, resolver);
> > } catch (InvalidInterfaceException e) {
> > throw new ContributionResolveException(e);
> > }
> > interfaceContract.setInterface(wsdlInterface);
> > model.setBindingInterfaceContract(interfaceContract);
> > }
> >
> > I don't believe the createWSDLInterface()/createWSDLInterfaceContract()
> > methods use a cache but rather instantiate new objects.
> >
> > I would think that for a component service with intf.wsdl we would be
> > building a distinct IC which would become the wireTarget IC, and just am
> > trying to understand how changing the DB of the source IC (binding IC) in
> > this case can present a problem.
> >
> >
> >> I'd have submitted a fix by now if I had not found yet another bug
> lurking
> >> behind this one....
> >> I want to get my Sample code for BPEL process exposed as a Webservice
> >> working before I commit a fix.
> >>
> >>
> >> Yours, Mike.
> >>
> >
>
>
>
> --
> Luciano Resende
> Apache Tuscany Committer
> http://people.apache.org/~lresende <http://people.apache.org/%7Elresende>
> http://lresende.blogspot.com/
>