No example that I know of, but here's the path to the candy house in
the woods. Beware of witches with ovens.

Endpoint.publish returns Endpoint. Endpoint can be cast to
EndpointImpl. EndpointImpl returns Service. Service returns list of
ServiceInfo. I don't understand exactly why it's a list, I keep
meaning to ask Dan. I believe it will always return a singleton list,
but if not find your particular service on the list, and then you have
the item to pass to the function you found, which is extremely
unlikely to melt.

On Thu, Feb 19, 2009 at 8:30 AM, Andrew Clegg <[email protected]> wrote:
> Yeah, as long as you wouldn't say the API is likely to change in
> future releases, I'm happy hooking into that. (And even if it does, I
> can fall back to reading the WSDL myself). Is there an example that
> demonstrates the necessary breadcrumbs?
>
> Cheers,
>
> Andrew.
>
> 2009/2/19 Benson Margulies <[email protected]>:
>> Superfically, looks like you could call that API, yes. It's used
>> internally to set up validation. Of course, you'd need to follow a
>> trail of breadcrumbs to the CXF-specific Service object to get there.
>> Is that the issue?
>>
>> On Thu, Feb 19, 2009 at 7:55 AM, Andrew Clegg <[email protected]> 
>> wrote:
>>> So the EndpointReferenceUtils.getSchema( serviceInfo ) approach is
>>> only for @WebService classes and not @WebServiceProvider classes?
>>>
>>> Andrew.
>>>
>>> 2009/2/19 Benson Margulies <[email protected]>:
>>>> CXF does not precisely have a 'copy' of the WSDL. It has a wsdl4j
>>>> representation.
>>>>
>>>> On the 2.2 branch, there is an XmlSchemaCollection of the schemas. In
>>>> earlier branches, it has a DOM copy of them.
>>>>
>>>> We could, I suppose, expose. I'm hoping that Dan will wade in at this 
>>>> point.
>>>>
>>>>
>>>> On Thu, Feb 19, 2009 at 5:42 AM, Andrew Clegg <[email protected]> 
>>>> wrote:
>>>>> Followup...
>>>>>
>>>>> So I've got this working by reading the WSDL myself in the provider
>>>>> class's constructor:
>>>>>
>>>>>
>>>>> // First read WSDL
>>>>> ClassLoader loader = this.getClass().getClassLoader();
>>>>> InputStream wsdlFile = loader.getResourceAsStream( WSDL_NAME );
>>>>> Document wsdl = org.apache.cxf.helpers.DOMUtils.readXml( wsdlFile );
>>>>>
>>>>> // Then get schema body from WSDL -- TODO tighten up query using 
>>>>> namespaces
>>>>> String schemaQuery =
>>>>> "//*[local-name()='definitions']/*[local-name()='types']/*[local-name()='schema']";
>>>>> XPathExpression schemaPath = xp.compile( schemaQuery );
>>>>> Node schemaNode = ( Node ) schemaPath.evaluate( wsdl, XPathConstants.NODE 
>>>>> );
>>>>>
>>>>> // Then compile it and store it
>>>>> String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
>>>>> SchemaFactory sf = SchemaFactory.newInstance( language );
>>>>> DOMSource ds = new DOMSource( schemaNode );
>>>>> this.schema = sf.newSchema( ds );
>>>>>
>>>>>
>>>>> This lets me easily validate messages in the invoke() method, for example:
>>>>>
>>>>>
>>>>> schema.newValidator().validate( domRequest );
>>>>>
>>>>>
>>>>> where domRequest is the DOMSource of the message payload.
>>>>>
>>>>> However it still seems a little inelegant to read the WSDL myself when
>>>>> CXF must have a copy.
>>>>>
>>>>> I've found the getSchema() method of the EndpointReferenceUtils class
>>>>> via an old thread on here, but that requires a ServiceInfo object --
>>>>> is there any way to acquire one of these for a Provider service?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Andrew.
>>>>>
>>>>> 2009/2/16 Andrew Clegg <[email protected]>:
>>>>>> Hi folks,
>>>>>>
>>>>>> From inside a Provider implementation, how can I obtain the schema of
>>>>>> the service's request/response messages, short of reading the WSDL
>>>>>> myself and extracting the schema from it?
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Andrew.
>>>>>>
>>>>>> --
>>>>>> :: http://biotext.org.uk/ ::
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> :: http://biotext.org.uk/ ::
>>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> :: http://biotext.org.uk/ ::
>>>
>>
>
>
>
> --
> :: http://biotext.org.uk/ ::
>

Reply via email to