Hi, Michael.

That was my original plan, but I needed to keep compatibility with Xerces 2.8, 
thus the extra step.

Actually, I also had to add one more layer to get it to work in a broader set 
of use cases.  I had to extend XMLEntityResolver to provide a means for 
reliably resolving schema imports without schemaLocation(s).  I tweaked my 
schema snippet collection to be keyed by targetNamespace, and inside the 
resolver, if I see a null location, I use my resolver, otherwise I delegate the 
work to the original resolver.

Currently, it would not work properly if multiple snippets had the same 
targetNamespace, but I plan on adding some code to merge grammars from the same 
namespace.

When it is all done, the net result should be the shell of a generic 
WSDL->to->XSModel parser.

- Rick



*** Sent via BlackBerry

-----Original Message-----
From: Michael Glavassevich <[EMAIL PROTECTED]>
To: j-users@xerces.apache.org <j-users@xerces.apache.org>
CC: j-dev@xerces.apache.org <j-dev@xerces.apache.org>
Sent: Sun Dec 03 12:02:19 2006
Subject: Re: (POSSIBLE SOLUTION) Serious issue/challenge with Xerces-J the 
XSLoader's loadInputList method...

Hi Rick,

If the schema element returned from WSDL4J is a DOM node, you should be 
able to pass that directly to the XMLGrammarPreparser using a 
DOMInputSource [1] and skip the serialziation step.

Thanks.

[1] 
http://xerces.apache.org/xerces2-j/javadocs/xerces2/org/apache/xerces/util/DOMInputSource.html

On Mon, 27 Nov 2006, Bullotta, Rick wrote:

> Hello, all good news!
>
> Via a combination of WSDL4J and Xerces, I think I have something that
> works that I'd like to share (for your benefit, critique, and
> improvements).
>
> The code is based on WSDL4J 1.6 and Xerces 2.9, but should work with
> older versions is well.
>
> 1) First, load the WSDL using a WSDL4J WSDLReader, being certain that
> the javax.wsdl.importDocuments feature is set to true.
>
> 2) Next, create an ArrayList or other structure to hold schema
> "snippets"
>
> 3a) Next, do a recursive walk of the WSDL (diving into imports) looking
> into the getTypes() collection for either:
>       - Schema extensibility elements
>       - Unknown extensibility elements where getElementType()
> corresponds to a schema QName
>
> 3b) Clone the schema element, and add any namespaces (via attributes) to
> it that exist in the top level Definition (and do not conflict with
> namespaces already assigned to the schema element)
>
> 3c) Serialize the schema element to a string, and create a StringReader
> for it
>
> 3d) Add it to the "schema snippet holder"
>
> 4) Use the XMLGrammarPreparser and an XSGrammarPool to iteratively
> process the schema grammar(s), then create an XSModelImpl passing the
> array of SchemaGrammar(s).
>
>    public static XSModel parseMultiple(SchemaCollection coll) {
>        try
>        {
>          XMLGrammarPreparser grammarPreparser = new
> XMLGrammarPreparser();
>          XSGrammarPool grammarPool = new XSGrammarPool();
>          grammarPreparser.setGrammarPool(grammarPool);
>          grammarPreparser.setErrorHandler(new
> XMLErrorReporter().getErrorHandler());
>
>          try
>          {
>              int nItems = coll.getLength();
>
>              SchemaGrammar[] grammars = new SchemaGrammar[nItems];
>
>              for(int i=0;i<nItems;i++) {
>                  XMLInputSource is = null;
>                  is = new
> XMLInputSource(null,null,null,coll.rawItem(i),null);
>
>
> grammarPreparser.registerPreparser(XMLGrammarDescription.XML_SCHEMA,null
> );
>                  XMLGrammarLoader schemaLoader =
> grammarPreparser.getLoader(XMLGrammarDescription.XML_SCHEMA);
>                  grammars[i] =
> (SchemaGrammar)grammarPreparser.preparseGrammar(XMLGrammarDescription.XM
> L_SCHEMA,is);
>              }
>
>              return new XSModelImpl(grammars);
>          }
>          catch (Exception e)
>          {
>            //parser will return null pointer exception if the document
> is
>          }
>        }
>        catch (Exception e)
>        {
>        }
>
>        return null;
>
>    }
>
> 5) Use the combined XSModel as needed...
>
> This approach seems to work well, but I'm certainly open for
> suggestions/improvements.
>
> Rick Bullotta
> SAP Labs, LLC
>
> http://www.sap.com/manufacturing
>
> -----Original Message-----
> From: Bullotta, Rick [mailto:[EMAIL PROTECTED]
> Sent: Saturday, November 25, 2006 11:50 PM
> To: j-dev@xerces.apache.org; j-users@xerces.apache.org
> Subject: Serious issue/challenge with Xerces-J the XSLoader's
> loadInputList method...
>
> Hello, all.
>
> Here's a quick summary - the WSDL below contains two schema elements.  I
> want to create an XSModel that represents this WSDL, and the only way I
> can see to do so is by extracting the schema elements separately,
> turning them into LSInputs, and using the loadInputList method on the
> XSLoader class.  Unfortunately, it does not work - there is always an
> error attempting to resolve the n0:YYY type when it attempts to create
> the XSModel.
>
> If I separate the first schema element into its own file, and import it,
> it works fine. However, it should work fine in the same file as well!
> :-(
>
> I suspect it has something to do with the fact that imports within the
> same "file" (in the case of loadInputList, of course, they are separate
> sources), would not have a schemaLocation attribute on the import, but
> only a namespace attribute (as below).  I am at a loss to determine how
> to handle this with Xerces.
>
> In this case, I would expect Xerces to simply see if a model or grammar
> has already been loaded for that namespace.  I tried as hard as I could
> to trace through the source, but I was completely lost working through
> the intricacies of how these things are resolved.
>
> Help!!!
>
> - Rick Bullotta
>  SAP Labs, LLC
>
>
> <?xml version="1.0" encoding="utf-8"?>
> <wsdl:definitions
> targetNamespace="urn:sap-com:document:sap:soap:functions:mc-style"
> xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
> xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
> xmlns:http="http://schemas.xmlsoap.org/wsdl/http/";
> xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/";
> xmlns:tns="urn:sap-com:document:sap:soap:functions:mc-style"
> xmlns:n1="urn:sap-com:document:sap:rfc:functions">
>       <wsdl:types>
>               <xsd:schema attributeFormDefault="qualified"
> targetNamespace="urn:sap-com:document:sap:rfc:functions"
> xmlns:tns="urn:sap-com:document:sap:rfc:functions"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
>                       <xsd:complexType name="YYY">
>                               <xsd:sequence>
>                                       <xsd:element name="Param1"
> type="xsd:string"/>
>                                       <xsd:element name="Param2"
> type="xsd:string"/>
>                                       <xsd:element name="Param3"
> type="xsd:string"/>
>                               </xsd:sequence>
>                       </xsd:complexType>
>               </xsd:schema>
>               <xsd:schema attributeFormDefault="qualified"
> targetNamespace="urn:sap-com:document:sap:soap:functions:mc-style"
> xmlns:tns="urn:sap-com:document:sap:soap:functions:mc-style"
> xmlns:n0="urn:sap-com:document:sap:rfc:functions"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
>                       <xsd:import
> namespace="urn:sap-com:document:sap:rfc:functions"/>
>                       <xsd:element name="ZmsWsXmiiTest1">
>                               <xsd:complexType>
>                                       <xsd:sequence>
>                                               <xsd:element
> name="Param" type="n0:YYY"/>
>                                       </xsd:sequence>
>                               </xsd:complexType>
>                       </xsd:element>
>                       <xsd:element name="ZmsWsXmiiTest1Response">
>                               <xsd:complexType>
>                                       <xsd:sequence/>
>                               </xsd:complexType>
>                       </xsd:element>
>               </xsd:schema>
>       </wsdl:types>
>       <wsdl:message name="ZmsWsXmiiTest1">
>               <wsdl:part name="parameters"
> element="tns:ZmsWsXmiiTest1"/>
>       </wsdl:message>
>       <wsdl:message name="ZmsWsXmiiTest1Response">
>               <wsdl:part name="parameters"
> element="tns:ZmsWsXmiiTest1Response"/>
>       </wsdl:message>
>       <wsdl:portType name="zms_ws_xmii_test1">
>               <wsdl:operation name="ZmsWsXmiiTest1">
>                       <wsdl:input message="tns:ZmsWsXmiiTest1"/>
>                       <wsdl:output
> message="tns:ZmsWsXmiiTest1Response"/>
>               </wsdl:operation>
>       </wsdl:portType>
> </wsdl:definitions>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------
Michael Glavassevich
XML Parser Development
IBM Toronto Lab
E-mail: [EMAIL PROTECTED]
E-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to