1 /*
   2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.tools.internal.ws.wsdl.parser;
  27 
  28 import com.sun.tools.internal.ws.api.wsdl.TWSDLExtensible;
  29 import com.sun.tools.internal.ws.api.wsdl.TWSDLExtensionHandler;
  30 import com.sun.tools.internal.ws.resources.WsdlMessages;
  31 import com.sun.tools.internal.ws.util.xml.XmlUtil;
  32 import com.sun.tools.internal.ws.wscompile.ErrorReceiverFilter;
  33 import com.sun.tools.internal.ws.wscompile.WsimportOptions;
  34 import com.sun.tools.internal.ws.wsdl.document.Binding;
  35 import com.sun.tools.internal.ws.wsdl.document.BindingFault;
  36 import com.sun.tools.internal.ws.wsdl.document.BindingInput;
  37 import com.sun.tools.internal.ws.wsdl.document.BindingOperation;
  38 import com.sun.tools.internal.ws.wsdl.document.BindingOutput;
  39 import com.sun.tools.internal.ws.wsdl.document.Definitions;
  40 import com.sun.tools.internal.ws.wsdl.document.Documentation;
  41 import com.sun.tools.internal.ws.wsdl.document.Fault;
  42 import com.sun.tools.internal.ws.wsdl.document.Import;
  43 import com.sun.tools.internal.ws.wsdl.document.Input;
  44 import com.sun.tools.internal.ws.wsdl.document.Message;
  45 import com.sun.tools.internal.ws.wsdl.document.MessagePart;
  46 import com.sun.tools.internal.ws.wsdl.document.Operation;
  47 import com.sun.tools.internal.ws.wsdl.document.OperationStyle;
  48 import com.sun.tools.internal.ws.wsdl.document.Output;
  49 import com.sun.tools.internal.ws.wsdl.document.Port;
  50 import com.sun.tools.internal.ws.wsdl.document.PortType;
  51 import com.sun.tools.internal.ws.wsdl.document.Service;
  52 import com.sun.tools.internal.ws.wsdl.document.WSDLConstants;
  53 import com.sun.tools.internal.ws.wsdl.document.WSDLDocument;
  54 import com.sun.tools.internal.ws.wsdl.document.jaxws.JAXWSBindingsConstants;
  55 import com.sun.tools.internal.ws.wsdl.document.schema.SchemaConstants;
  56 import com.sun.tools.internal.ws.wsdl.document.schema.SchemaKinds;
  57 import com.sun.tools.internal.ws.wsdl.framework.Entity;
  58 import com.sun.tools.internal.ws.wsdl.framework.ParserListener;
  59 import com.sun.tools.internal.ws.wsdl.framework.TWSDLParserContextImpl;
  60 import com.sun.xml.internal.ws.util.ServiceFinder;
  61 import org.w3c.dom.Attr;
  62 import org.w3c.dom.Document;
  63 import org.w3c.dom.Element;
  64 import org.w3c.dom.NodeList;
  65 import org.xml.sax.InputSource;
  66 import org.xml.sax.Locator;
  67 import org.xml.sax.SAXException;
  68 
  69 import java.io.IOException;
  70 import java.util.ArrayList;
  71 import java.util.HashMap;
  72 import java.util.Iterator;
  73 import java.util.Map;
  74 import org.w3c.dom.Node;
  75 
  76 /**
  77  * A parser for WSDL documents. This parser is used only at the tool time.
  78  * Extensions should extend TWSDLExtensionHandler, so that it will be called during
  79  * parsing wsdl to handle wsdl extenisbility elements. Generally these extensions
  80  * will effect the artifacts generated during WSDL processing.
  81  *
  82  * @see com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser which will be used for WSDL parsing
  83  * at runtime.
  84  *
  85  * @author WS Development Team
  86  */
  87 public class WSDLParser {
  88     private final ErrorReceiverFilter errReceiver;
  89     private WsimportOptions options;
  90 
  91     //wsdl extension handlers
  92     private final Map extensionHandlers;
  93     private MetadataFinder forest;
  94     private ArrayList<ParserListener> listeners;
  95 
  96     public WSDLParser(WsimportOptions options, ErrorReceiverFilter errReceiver, MetadataFinder forest) {
  97         this.extensionHandlers = new HashMap();
  98         this.options = options;
  99         this.errReceiver = errReceiver;
 100         if (forest == null) {
 101             forest = new MetadataFinder(new WSDLInternalizationLogic(), options, errReceiver);
 102             forest.parseWSDL();
 103             if (forest.isMexMetadata) {
 104                 errReceiver.reset();
 105         }
 106         }
 107         this.forest = forest;
 108         // register handlers for default extensions
 109         register(new SOAPExtensionHandler(extensionHandlers));
 110         register(new HTTPExtensionHandler(extensionHandlers));
 111         register(new MIMEExtensionHandler(extensionHandlers));
 112         register(new JAXWSBindingExtensionHandler(extensionHandlers));
 113         register(new SOAP12ExtensionHandler(extensionHandlers));
 114 
 115         // MemberSubmission Addressing not supported by WsImport anymore see JAX_WS-1040 for details
 116         //register(new MemberSubmissionAddressingExtensionHandler(extensionHandlers, errReceiver, options.isExtensionMode()));
 117 
 118         register(new W3CAddressingExtensionHandler(extensionHandlers, errReceiver));
 119         register(new W3CAddressingMetadataExtensionHandler(extensionHandlers, errReceiver));
 120         register(new Policy12ExtensionHandler());
 121         register(new Policy15ExtensionHandler());
 122         for (TWSDLExtensionHandler te : ServiceFinder.find(TWSDLExtensionHandler.class)) {
 123             register(te);
 124         }
 125 
 126     }
 127 
 128     //TODO RK remove this after tests are fixed.
 129     WSDLParser(WsimportOptions options, ErrorReceiverFilter errReceiver) {
 130         this(options,errReceiver,null);
 131     }
 132     private void register(TWSDLExtensionHandler h) {
 133         extensionHandlers.put(h.getNamespaceURI(), h);
 134     }
 135 
 136     public void addParserListener(ParserListener l) {
 137         if (listeners == null) {
 138             listeners = new ArrayList<ParserListener>();
 139         }
 140         listeners.add(l);
 141     }
 142 
 143     public WSDLDocument parse() throws SAXException, IOException {
 144         // parse external binding files
 145         for (InputSource value : options.getWSDLBindings()) {
 146             errReceiver.pollAbort();
 147             Document root = forest.parse(value, false);
 148             if(root==null)       continue;   // error must have been reported
 149             Element binding = root.getDocumentElement();
 150             if (!Internalizer.fixNull(binding.getNamespaceURI()).equals(JAXWSBindingsConstants.NS_JAXWS_BINDINGS)
 151                     || !binding.getLocalName().equals("bindings")){
 152                     errReceiver.error(forest.locatorTable.getStartLocation(binding), WsdlMessages.PARSER_NOT_A_BINDING_FILE(
 153                         binding.getNamespaceURI(),
 154                         binding.getLocalName()));
 155                 continue;
 156             }
 157 
 158             NodeList nl = binding.getElementsByTagNameNS(
 159                 "http://java.sun.com/xml/ns/javaee", "handler-chains");
 160             for(int i = 0; i < nl.getLength(); i++){
 161                 options.addHandlerChainConfiguration((Element) nl.item(i));
 162             }
 163 
 164         }
 165         return buildWSDLDocument();
 166     }
 167 
 168     public MetadataFinder getDOMForest() {
 169         return forest;
 170     }
 171 
 172     private WSDLDocument buildWSDLDocument(){
 173         /**
 174          * Currently we are working off first WSDL document
 175          * TODO: add support of creating WSDLDocument from fromjava.collection of WSDL documents
 176          */
 177 
 178         String location = forest.getRootWSDL();
 179 
 180         //It means that WSDL is not found, an error might have been reported, lets try to recover
 181         if(location == null)
 182             return null;
 183 
 184         Document root = forest.get(location);
 185 
 186         if(root == null)
 187             return null;
 188 
 189         WSDLDocument document = new WSDLDocument(forest, errReceiver);
 190         document.setSystemId(location);
 191         TWSDLParserContextImpl context = new TWSDLParserContextImpl(forest, document, listeners, errReceiver);
 192 
 193         Definitions definitions = parseDefinitions(context, root);
 194         document.setDefinitions(definitions);
 195         return document;
 196     }
 197 
 198     private Definitions parseDefinitions(TWSDLParserContextImpl context, Document root) {
 199         context.pushWSDLLocation();
 200         context.setWSDLLocation(context.getDocument().getSystemId());
 201 
 202         new Internalizer(forest, options, errReceiver).transform();
 203 
 204         Definitions definitions = parseDefinitionsNoImport(context, root);
 205         if(definitions == null){
 206             Locator locator = forest.locatorTable.getStartLocation(root.getDocumentElement());
 207             errReceiver.error(locator, WsdlMessages.PARSING_NOT_AWSDL(locator.getSystemId()));
 208 
 209         }
 210         processImports(context);
 211         context.popWSDLLocation();
 212         return definitions;
 213     }
 214 
 215     private void processImports(TWSDLParserContextImpl context) {
 216         for(String location : forest.getExternalReferences()){
 217             if (!context.getDocument().isImportedDocument(location)){
 218                 Document doc = forest.get(location);
 219                 if(doc == null)
 220                     continue;
 221                 Definitions importedDefinitions = parseDefinitionsNoImport(context, doc);
 222                 if(importedDefinitions == null)
 223                     continue;
 224                 context.getDocument().addImportedEntity(importedDefinitions);
 225                 context.getDocument().addImportedDocument(location);
 226             }
 227         }
 228     }
 229 
 230     private Definitions parseDefinitionsNoImport(
 231         TWSDLParserContextImpl context,
 232         Document doc) {
 233         Element e = doc.getDocumentElement();
 234         //at this poinjt we expect a wsdl or schema document to be fully qualified
 235         if(e.getNamespaceURI() == null || (!e.getNamespaceURI().equals(WSDLConstants.NS_WSDL) || !e.getLocalName().equals("definitions"))){
 236             return null;
 237         }
 238         context.push();
 239         context.registerNamespaces(e);
 240 
 241         Definitions definitions = new Definitions(context.getDocument(), forest.locatorTable.getStartLocation(e));
 242         String name = XmlUtil.getAttributeOrNull(e, Constants.ATTR_NAME);
 243         definitions.setName(name);
 244 
 245         String targetNamespaceURI =
 246             XmlUtil.getAttributeOrNull(e, Constants.ATTR_TARGET_NAMESPACE);
 247 
 248         definitions.setTargetNamespaceURI(targetNamespaceURI);
 249 
 250         boolean gotDocumentation = false;
 251         boolean gotTypes = false;
 252 
 253         for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) {
 254             Element e2 = Util.nextElement(iter);
 255             if (e2 == null)
 256                 break;
 257 
 258             if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) {
 259                 if (gotDocumentation) {
 260                     errReceiver.error(forest.locatorTable.getStartLocation(e2), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 261                     return null;
 262                 }
 263                 gotDocumentation = true;
 264                 if(definitions.getDocumentation() == null)
 265                     definitions.setDocumentation(getDocumentationFor(e2));
 266             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_TYPES)) {
 267                 if (gotTypes && !options.isExtensionMode()) {
 268                     errReceiver.error(forest.locatorTable.getStartLocation(e2), WsdlMessages.PARSING_ONLY_ONE_TYPES_ALLOWED(Constants.TAG_DEFINITIONS));
 269                     return null;
 270                 }
 271                 gotTypes = true;
 272                 //add all the wsdl:type elements to latter make a list of all the schema elements
 273                 // that will be needed to create jaxb model
 274                 if(!options.isExtensionMode())
 275                     validateSchemaImports(e2);
 276             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_MESSAGE)) {
 277                 Message message = parseMessage(context, definitions, e2);
 278                 definitions.add(message);
 279             } else if (
 280                 XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_PORT_TYPE)) {
 281                 PortType portType = parsePortType(context, definitions, e2);
 282                 definitions.add(portType);
 283             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_BINDING)) {
 284                 Binding binding = parseBinding(context, definitions, e2);
 285                 definitions.add(binding);
 286             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_SERVICE)) {
 287                 Service service = parseService(context, definitions, e2);
 288                 definitions.add(service);
 289             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_IMPORT)) {
 290                 definitions.add(parseImport(context, definitions, e2));
 291             } else if (XmlUtil.matchesTagNS(e2, SchemaConstants.QNAME_IMPORT)) {
 292                 errReceiver.warning(forest.locatorTable.getStartLocation(e2), WsdlMessages.WARNING_WSI_R_2003());
 293             } else {
 294                 // possible extensibility element -- must live outside the WSDL namespace
 295                 checkNotWsdlElement(e2);
 296                 if (!handleExtension(context, definitions, e2)) {
 297                     checkNotWsdlRequired(e2);
 298                 }
 299             }
 300         }
 301 
 302         context.pop();
 303         context.fireDoneParsingEntity(
 304             WSDLConstants.QNAME_DEFINITIONS,
 305             definitions);
 306         return definitions;
 307     }
 308 
 309     private Message parseMessage(
 310         TWSDLParserContextImpl context,
 311         Definitions definitions,
 312         Element e) {
 313         context.push();
 314         context.registerNamespaces(e);
 315         Message message = new Message(definitions, forest.locatorTable.getStartLocation(e), errReceiver);
 316         String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME);
 317         message.setName(name);
 318 
 319         boolean gotDocumentation = false;
 320 
 321         for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) {
 322             Element e2 = Util.nextElement(iter);
 323             if (e2 == null)
 324                 break;
 325 
 326             if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) {
 327                 if (gotDocumentation) {
 328                     Util.fail(
 329                         "parsing.onlyOneDocumentationAllowed",
 330                         e.getLocalName());
 331                 }
 332                 gotDocumentation = true;
 333                 message.setDocumentation(getDocumentationFor(e2));
 334             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_PART)) {
 335                 MessagePart part = parseMessagePart(context, e2);
 336                 message.add(part);
 337             } else {
 338                 //Ignore any extensibility elements, WS-I BP 1.1 Profiled WSDL 1.1 schema allows extension elements here.
 339                 /*Util.fail(
 340                     "parsing.invalidElement",
 341                     e2.getTagName(),
 342                     e2.getNamespaceURI());
 343                     */
 344             }
 345         }
 346 
 347         context.pop();
 348         context.fireDoneParsingEntity(WSDLConstants.QNAME_MESSAGE, message);
 349         return message;
 350     }
 351 
 352     private MessagePart parseMessagePart(TWSDLParserContextImpl context, Element e) {
 353         context.push();
 354         context.registerNamespaces(e);
 355         MessagePart part = new MessagePart(forest.locatorTable.getStartLocation(e));
 356         String partName = Util.getRequiredAttribute(e, Constants.ATTR_NAME);
 357         part.setName(partName);
 358 
 359         String elementAttr =
 360             XmlUtil.getAttributeOrNull(e, Constants.ATTR_ELEMENT);
 361         String typeAttr = XmlUtil.getAttributeOrNull(e, Constants.ATTR_TYPE);
 362 
 363         if (elementAttr != null) {
 364             if (typeAttr != null) {
 365                 errReceiver.error(context.getLocation(e), WsdlMessages.PARSING_ONLY_ONE_OF_ELEMENT_OR_TYPE_REQUIRED(partName));
 366 
 367             }
 368 
 369             part.setDescriptor(context.translateQualifiedName(context.getLocation(e), elementAttr));
 370             part.setDescriptorKind(SchemaKinds.XSD_ELEMENT);
 371         } else if (typeAttr != null) {
 372             part.setDescriptor(context.translateQualifiedName(context.getLocation(e), typeAttr));
 373             part.setDescriptorKind(SchemaKinds.XSD_TYPE);
 374         } else {
 375             // XXX-NOTE - this is wrong; for extensibility purposes,
 376             // any attribute can be specified on a <part> element, so
 377             // we need to put an extensibility hook here
 378             errReceiver.warning(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ELEMENT_OR_TYPE_REQUIRED(partName));
 379         }
 380 
 381         context.pop();
 382         context.fireDoneParsingEntity(WSDLConstants.QNAME_PART, part);
 383         return part;
 384     }
 385 
 386     private PortType parsePortType(
 387         TWSDLParserContextImpl context,
 388         Definitions definitions,
 389         Element e) {
 390         context.push();
 391         context.registerNamespaces(e);
 392         PortType portType = new PortType(definitions, forest.locatorTable.getStartLocation(e), errReceiver);
 393         String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME);
 394         portType.setName(name);
 395 
 396         boolean gotDocumentation = false;
 397 
 398         for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) {
 399             Element e2 = Util.nextElement(iter);
 400             if (e2 == null)
 401                 break;
 402 
 403             if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) {
 404                 if (gotDocumentation) {
 405                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 406                 }
 407                 gotDocumentation = true;
 408                 if(portType.getDocumentation() == null)
 409                     portType.setDocumentation(getDocumentationFor(e2));
 410             } else if (
 411                 XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_OPERATION)) {
 412                 Operation op = parsePortTypeOperation(context, e2);
 413                 op.setParent(portType);
 414                 portType.add(op);
 415             } else {
 416                 // possible extensibility element -- must live outside the WSDL namespace
 417                 checkNotWsdlElement(e2);
 418                 if (!handleExtension(context, portType, e2)) {
 419                     checkNotWsdlRequired(e2);
 420                 }
 421             }/*else {
 422                 Util.fail(
 423                     "parsing.invalidElement",
 424                     e2.getTagName(),
 425                     e2.getNamespaceURI());
 426             }*/
 427         }
 428 
 429         context.pop();
 430         context.fireDoneParsingEntity(WSDLConstants.QNAME_PORT_TYPE, portType);
 431         return portType;
 432     }
 433 
 434     private Operation parsePortTypeOperation(
 435         TWSDLParserContextImpl context,
 436         Element e) {
 437         context.push();
 438         context.registerNamespaces(e);
 439 
 440         Operation operation = new Operation(forest.locatorTable.getStartLocation(e));
 441         String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME);
 442         operation.setName(name);
 443         String parameterOrderAttr =
 444             XmlUtil.getAttributeOrNull(e, Constants.ATTR_PARAMETER_ORDER);
 445         operation.setParameterOrder(parameterOrderAttr);
 446 
 447         boolean gotDocumentation = false;
 448 
 449         boolean gotInput = false;
 450         boolean gotOutput = false;
 451         boolean gotFault = false;
 452         boolean inputBeforeOutput = false;
 453 
 454         for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) {
 455             Element e2 = Util.nextElement(iter);
 456             if (e2 == null)
 457                 break;
 458 
 459             if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) {
 460                 if (gotDocumentation) {
 461                     errReceiver.error(forest.locatorTable.getStartLocation(e2), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e2.getLocalName()));
 462                 }
 463                 gotDocumentation = true;
 464                 if(operation.getDocumentation() == null)
 465                     operation.setDocumentation(getDocumentationFor(e2));
 466             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_INPUT)) {
 467                 if (gotInput) {
 468                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_TOO_MANY_ELEMENTS(Constants.TAG_INPUT,
 469                             Constants.TAG_OPERATION,
 470                             name));
 471                 }
 472 
 473                 context.push();
 474                 context.registerNamespaces(e2);
 475                 Input input = new Input(forest.locatorTable.getStartLocation(e2), errReceiver);
 476                 input.setParent(operation);
 477                 String messageAttr =
 478                     Util.getRequiredAttribute(e2, Constants.ATTR_MESSAGE);
 479                 input.setMessage(context.translateQualifiedName(context.getLocation(e2), messageAttr));
 480                 String nameAttr =
 481                     XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME);
 482                 input.setName(nameAttr);
 483                 operation.setInput(input);
 484                 gotInput = true;
 485                 if (gotOutput) {
 486                     inputBeforeOutput = false;
 487                 }
 488 
 489                 // check for extensiblity attributes
 490                 for (Iterator iter2 = XmlUtil.getAllAttributes(e2);
 491                      iter2.hasNext();
 492                 ) {
 493                     Attr e3 = (Attr)iter2.next();
 494                     if (e3.getLocalName().equals(Constants.ATTR_MESSAGE) ||
 495                         e3.getLocalName().equals(Constants.ATTR_NAME))
 496                         continue;
 497 
 498                     // possible extensibility element -- must live outside the WSDL namespace
 499                     checkNotWsdlAttribute(e3);
 500                     handleExtension(context, input, e3, e2);
 501                 }
 502 
 503                 // verify that there is at most one child element and it is a documentation element
 504                 boolean gotDocumentation2 = false;
 505                 for (Iterator iter2 = XmlUtil.getAllChildren(e2);
 506                      iter2.hasNext();
 507                     ) {
 508                     Element e3 = Util.nextElement(iter2);
 509                     if (e3 == null)
 510                         break;
 511 
 512                     if (XmlUtil
 513                         .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) {
 514                         if (gotDocumentation2) {
 515                             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 516                         }
 517                         gotDocumentation2 = true;
 518                         input.setDocumentation(getDocumentationFor(e3));
 519                     } else {
 520                         errReceiver.error(forest.locatorTable.getStartLocation(e3), WsdlMessages.PARSING_INVALID_ELEMENT(e3.getTagName(),
 521                             e3.getNamespaceURI()));
 522                     }
 523                 }
 524                 context.pop();
 525             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_OUTPUT)) {
 526                 if (gotOutput) {
 527                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_TOO_MANY_ELEMENTS(Constants.TAG_INPUT,
 528                             Constants.TAG_OPERATION,
 529                             name));
 530                 }
 531 
 532                 context.push();
 533                 context.registerNamespaces(e2);
 534                 Output output = new Output(forest.locatorTable.getStartLocation(e2), errReceiver);
 535                 output.setParent(operation);
 536                 String messageAttr =
 537                     Util.getRequiredAttribute(e2, Constants.ATTR_MESSAGE);
 538                 output.setMessage(context.translateQualifiedName(context.getLocation(e2), messageAttr));
 539                 String nameAttr =
 540                     XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME);
 541                 output.setName(nameAttr);
 542                 operation.setOutput(output);
 543                 gotOutput = true;
 544                 if (gotInput) {
 545                     inputBeforeOutput = true;
 546                 }
 547 
 548                 // check for extensiblity attributes
 549                 for (Iterator iter2 = XmlUtil.getAllAttributes(e2);
 550                      iter2.hasNext();
 551                 ) {
 552                     Attr e3 = (Attr)iter2.next();
 553                     if (e3.getLocalName().equals(Constants.ATTR_MESSAGE) ||
 554                         e3.getLocalName().equals(Constants.ATTR_NAME))
 555                         continue;
 556 
 557                     // possible extensibility element -- must live outside the WSDL namespace
 558                     checkNotWsdlAttribute(e3);
 559                     handleExtension(context, output, e3, e2);
 560                 }
 561 
 562                 // verify that there is at most one child element and it is a documentation element
 563                 boolean gotDocumentation2 = false;
 564                 for (Iterator iter2 = XmlUtil.getAllChildren(e2);
 565                      iter2.hasNext();
 566                     ) {
 567                     Element e3 = Util.nextElement(iter2);
 568                     if (e3 == null)
 569                         break;
 570 
 571                     if (XmlUtil
 572                         .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) {
 573                         if (gotDocumentation2) {
 574                             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 575                         }
 576                         gotDocumentation2 = true;
 577                         output.setDocumentation(getDocumentationFor(e3));
 578                     } else {
 579                         errReceiver.error(forest.locatorTable.getStartLocation(e3), WsdlMessages.PARSING_INVALID_ELEMENT(e3.getTagName(),
 580                             e3.getNamespaceURI()));
 581                     }
 582                 }
 583                 context.pop();
 584             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_FAULT)) {
 585                 context.push();
 586                 context.registerNamespaces(e2);
 587                 Fault fault = new Fault(forest.locatorTable.getStartLocation(e2));
 588                 fault.setParent(operation);
 589                 String messageAttr =
 590                     Util.getRequiredAttribute(e2, Constants.ATTR_MESSAGE);
 591                 fault.setMessage(context.translateQualifiedName(context.getLocation(e2), messageAttr));
 592                 String nameAttr =
 593                     XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME);
 594                 fault.setName(nameAttr);
 595                 operation.addFault(fault);
 596                 gotFault = true;
 597 
 598                 // check for extensiblity attributes
 599                 for (Iterator iter2 = XmlUtil.getAllAttributes(e2);
 600                      iter2.hasNext();
 601                 ) {
 602                     Attr e3 = (Attr)iter2.next();
 603                     if (e3.getLocalName().equals(Constants.ATTR_MESSAGE) ||
 604                         e3.getLocalName().equals(Constants.ATTR_NAME))
 605                         continue;
 606 
 607                     // possible extensibility element -- must live outside the WSDL namespace
 608                     checkNotWsdlAttribute(e3);
 609                     handleExtension(context, fault, e3, e2);
 610                 }
 611 
 612                 // verify that there is at most one child element and it is a documentation element
 613                 boolean gotDocumentation2 = false;
 614                 for (Iterator iter2 = XmlUtil.getAllChildren(e2);
 615                      iter2.hasNext();
 616                     ) {
 617                     Element e3 = Util.nextElement(iter2);
 618                     if (e3 == null)
 619                         break;
 620 
 621                     if (XmlUtil
 622                         .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) {
 623                         if (gotDocumentation2) {
 624                             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 625                         }
 626                         gotDocumentation2 = true;
 627                         if(fault.getDocumentation() == null)
 628                             fault.setDocumentation(getDocumentationFor(e3));
 629                     } else {
 630                         // possible extensibility element -- must live outside the WSDL namespace
 631                         checkNotWsdlElement(e3);
 632                         if (!handleExtension(context, fault, e3)) {
 633                             checkNotWsdlRequired(e3);
 634                         }
 635                     }/*else {
 636                         Util.fail(
 637                             "parsing.invalidElement",
 638                             e3.getTagName(),
 639                             e3.getNamespaceURI());
 640                     }*/
 641                 }
 642                 context.pop();
 643             } else {
 644                 // possible extensibility element -- must live outside the WSDL namespace
 645                 checkNotWsdlElement(e2);
 646                 if (!handleExtension(context, operation, e2)) {
 647                     checkNotWsdlRequired(e2);
 648                 }
 649             }/*else {
 650                 Util.fail(
 651                     "parsing.invalidElement",
 652                     e2.getTagName(),
 653                     e2.getNamespaceURI());
 654             }*/
 655         }
 656 
 657         if (gotInput && !gotOutput && !gotFault) {
 658             operation.setStyle(OperationStyle.ONE_WAY);
 659         } else if (gotInput && gotOutput && inputBeforeOutput) {
 660             operation.setStyle(OperationStyle.REQUEST_RESPONSE);
 661         } else if (gotInput && gotOutput && !inputBeforeOutput) {
 662             operation.setStyle(OperationStyle.SOLICIT_RESPONSE);
 663         } else if (gotOutput && !gotInput && !gotFault) {
 664             operation.setStyle(OperationStyle.NOTIFICATION);
 665         } else {
 666             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_INVALID_OPERATION_STYLE(name));
 667         }
 668 
 669         context.pop();
 670         context.fireDoneParsingEntity(WSDLConstants.QNAME_OPERATION, operation);
 671         return operation;
 672     }
 673 
 674     private Binding parseBinding(
 675         TWSDLParserContextImpl context,
 676         Definitions definitions,
 677         Element e) {
 678         context.push();
 679         context.registerNamespaces(e);
 680         Binding binding = new Binding(definitions, forest.locatorTable.getStartLocation(e), errReceiver);
 681         String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME);
 682         binding.setName(name);
 683         String typeAttr = Util.getRequiredAttribute(e, Constants.ATTR_TYPE);
 684         binding.setPortType(context.translateQualifiedName(context.getLocation(e), typeAttr));
 685 
 686         boolean gotDocumentation = false;
 687 
 688         for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) {
 689             Element e2 = Util.nextElement(iter);
 690             if (e2 == null)
 691                 break;
 692 
 693             if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) {
 694                 if (gotDocumentation) {
 695                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 696                 }
 697                 gotDocumentation = true;
 698                 binding.setDocumentation(getDocumentationFor(e2));
 699             } else if (
 700                 XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_OPERATION)) {
 701                 BindingOperation op = parseBindingOperation(context, e2);
 702                 binding.add(op);
 703             } else {
 704                 // possible extensibility element -- must live outside the WSDL namespace
 705                 checkNotWsdlElement(e2);
 706                 if (!handleExtension(context, binding, e2)) {
 707                     checkNotWsdlRequired(e2);
 708                 }
 709             }
 710         }
 711 
 712         context.pop();
 713         context.fireDoneParsingEntity(WSDLConstants.QNAME_BINDING, binding);
 714         return binding;
 715     }
 716 
 717     private BindingOperation parseBindingOperation(
 718         TWSDLParserContextImpl context,
 719         Element e) {
 720         context.push();
 721         context.registerNamespaces(e);
 722         BindingOperation operation = new BindingOperation(forest.locatorTable.getStartLocation(e));
 723         String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME);
 724         operation.setName(name);
 725 
 726         boolean gotDocumentation = false;
 727 
 728         boolean gotInput = false;
 729         boolean gotOutput = false;
 730         boolean gotFault = false;
 731         boolean inputBeforeOutput = false;
 732 
 733         for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) {
 734             Element e2 = Util.nextElement(iter);
 735             if (e2 == null)
 736                 break;
 737             if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) {
 738                 if (gotDocumentation) {
 739                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 740                 }
 741                 gotDocumentation = true;
 742                 operation.setDocumentation(getDocumentationFor(e2));
 743             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_INPUT)) {
 744                 if (gotInput) {
 745                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_TOO_MANY_ELEMENTS(Constants.TAG_INPUT,
 746                             Constants.TAG_OPERATION,
 747                             name));
 748                 }
 749 
 750                 /* Here we check for the use scenario */
 751                 context.push();
 752                 context.registerNamespaces(e2);
 753                 BindingInput input = new BindingInput(forest.locatorTable.getStartLocation(e2));
 754                 String nameAttr =
 755                     XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME);
 756                 input.setName(nameAttr);
 757                 operation.setInput(input);
 758                 gotInput = true;
 759                 if (gotOutput) {
 760                     inputBeforeOutput = false;
 761                 }
 762 
 763                 // verify that there is at most one child element and it is a documentation element
 764                 boolean gotDocumentation2 = false;
 765                 for (Iterator iter2 = XmlUtil.getAllChildren(e2);
 766                      iter2.hasNext();
 767                     ) {
 768                     Element e3 = Util.nextElement(iter2);
 769                     if (e3 == null)
 770                         break;
 771 
 772                     if (XmlUtil
 773                         .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) {
 774                         if (gotDocumentation2) {
 775                             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 776                         }
 777                         gotDocumentation2 = true;
 778                         input.setDocumentation(getDocumentationFor(e3));
 779                     } else {
 780                         // possible extensibility element -- must live outside the WSDL namespace
 781                         checkNotWsdlElement(e3);
 782                         if (!handleExtension(context, input, e3)) {
 783                             checkNotWsdlRequired(e3);
 784                         }
 785                     }
 786                 }
 787                 context.pop();
 788             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_OUTPUT)) {
 789                 if (gotOutput) {
 790                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_TOO_MANY_ELEMENTS(Constants.TAG_INPUT,
 791                             Constants.TAG_OPERATION,
 792                             name));
 793                 }
 794 
 795                 context.push();
 796                 context.registerNamespaces(e2);
 797                 BindingOutput output = new BindingOutput(forest.locatorTable.getStartLocation(e2));
 798                 String nameAttr =
 799                     XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME);
 800                 output.setName(nameAttr);
 801                 operation.setOutput(output);
 802                 gotOutput = true;
 803                 if (gotInput) {
 804                     inputBeforeOutput = true;
 805                 }
 806 
 807                 // verify that there is at most one child element and it is a documentation element
 808                 boolean gotDocumentation2 = false;
 809                 for (Iterator iter2 = XmlUtil.getAllChildren(e2);
 810                      iter2.hasNext();
 811                     ) {
 812 
 813                     Element e3 = Util.nextElement(iter2);
 814                     if (e3 == null)
 815                         break;
 816 
 817                     if (XmlUtil
 818                         .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) {
 819                         if (gotDocumentation2) {
 820                             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 821                         }
 822                         gotDocumentation2 = true;
 823                         output.setDocumentation(getDocumentationFor(e3));
 824                     } else {
 825                         // possible extensibility element -- must live outside the WSDL namespace
 826                         checkNotWsdlElement(e3);
 827                         if (!handleExtension(context, output, e3)) {
 828                             checkNotWsdlRequired(e3);
 829                         }
 830                     }
 831                 }
 832                 context.pop();
 833             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_FAULT)) {
 834                 context.push();
 835                 context.registerNamespaces(e2);
 836                 BindingFault fault = new BindingFault(forest.locatorTable.getStartLocation(e2));
 837                 String nameAttr =
 838                     Util.getRequiredAttribute(e2, Constants.ATTR_NAME);
 839                 fault.setName(nameAttr);
 840                 operation.addFault(fault);
 841                 gotFault = true;
 842 
 843                 // verify that there is at most one child element and it is a documentation element
 844                 boolean gotDocumentation2 = false;
 845                 for (Iterator iter2 = XmlUtil.getAllChildren(e2);
 846                      iter2.hasNext();
 847                     ) {
 848                     Element e3 = Util.nextElement(iter2);
 849                     if (e3 == null)
 850                         break;
 851 
 852                     if (XmlUtil
 853                         .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) {
 854                         if (gotDocumentation2) {
 855                             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 856                         }
 857                         gotDocumentation2 = true;
 858                         if(fault.getDocumentation() == null)
 859                             fault.setDocumentation(getDocumentationFor(e3));
 860                     } else {
 861                         // possible extensibility element -- must live outside the WSDL namespace
 862                         checkNotWsdlElement(e3);
 863                         if (!handleExtension(context, fault, e3)) {
 864                             checkNotWsdlRequired(e3);
 865                         }
 866                     }
 867                 }
 868                 context.pop();
 869             } else {
 870                 // possible extensibility element -- must live outside the WSDL namespace
 871                 checkNotWsdlElement(e2);
 872                 if (!handleExtension(context, operation, e2)) {
 873                     checkNotWsdlRequired(e2);
 874                 }
 875             }
 876         }
 877 
 878         if (gotInput && !gotOutput && !gotFault) {
 879             operation.setStyle(OperationStyle.ONE_WAY);
 880         } else if (gotInput && gotOutput && inputBeforeOutput) {
 881             operation.setStyle(OperationStyle.REQUEST_RESPONSE);
 882         } else if (gotInput && gotOutput && !inputBeforeOutput) {
 883             operation.setStyle(OperationStyle.SOLICIT_RESPONSE);
 884         } else if (gotOutput && !gotInput && !gotFault) {
 885             operation.setStyle(OperationStyle.NOTIFICATION);
 886         } else {
 887             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_INVALID_OPERATION_STYLE(name));
 888         }
 889 
 890         context.pop();
 891         context.fireDoneParsingEntity(WSDLConstants.QNAME_OPERATION, operation);
 892         return operation;
 893     }
 894 
 895     private Import parseImport(
 896         TWSDLParserContextImpl context,
 897         Definitions definitions,
 898         Element e) {
 899         context.push();
 900         context.registerNamespaces(e);
 901         Import anImport = new Import(forest.locatorTable.getStartLocation(e));
 902         String namespace =
 903             Util.getRequiredAttribute(e, Constants.ATTR_NAMESPACE);
 904         anImport.setNamespace(namespace);
 905         String location = Util.getRequiredAttribute(e, Constants.ATTR_LOCATION);
 906         anImport.setLocation(location);
 907 
 908         // according to the schema in the WSDL 1.1 spec, an import can have a documentation element
 909         boolean gotDocumentation = false;
 910 
 911         for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) {
 912             Element e2 = Util.nextElement(iter);
 913             if (e2 == null)
 914                 break;
 915 
 916             if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) {
 917                 if (gotDocumentation) {
 918                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 919                 }
 920                 gotDocumentation = true;
 921                 anImport.setDocumentation(getDocumentationFor(e2));
 922             } else {
 923                 errReceiver.error(forest.locatorTable.getStartLocation(e2), WsdlMessages.PARSING_INVALID_ELEMENT(e2.getTagName(),
 924                     e2.getNamespaceURI()));
 925             }
 926         }
 927         context.pop();
 928         context.fireDoneParsingEntity(WSDLConstants.QNAME_IMPORT, anImport);
 929         return anImport;
 930     }
 931 
 932     private Service parseService(
 933         TWSDLParserContextImpl context,
 934         Definitions definitions,
 935         Element e) {
 936         context.push();
 937         context.registerNamespaces(e);
 938         Service service = new Service(definitions, forest.locatorTable.getStartLocation(e), errReceiver);
 939         String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME);
 940         service.setName(name);
 941 
 942         boolean gotDocumentation = false;
 943 
 944         for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) {
 945             Element e2 = Util.nextElement(iter);
 946             if (e2 == null)
 947                 break;
 948 
 949             if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) {
 950                 if (gotDocumentation) {
 951                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
 952                 }
 953                 gotDocumentation = true;
 954                 if (service.getDocumentation() == null) {
 955                     service.setDocumentation(getDocumentationFor(e2));
 956                 }
 957             } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_PORT)) {
 958                 Port port = parsePort(context, definitions, e2);
 959                 service.add(port);
 960             } else {
 961                 // possible extensibility element -- must live outside the WSDL namespace
 962                 checkNotWsdlElement(e2);
 963                 if (!handleExtension(context, service, e2)) {
 964                     checkNotWsdlRequired(e2);
 965                 }
 966             }
 967         }
 968 
 969         context.pop();
 970         context.fireDoneParsingEntity(WSDLConstants.QNAME_SERVICE, service);
 971         return service;
 972     }
 973 
 974     private Port parsePort(
 975         TWSDLParserContextImpl context,
 976         Definitions definitions,
 977         Element e) {
 978         context.push();
 979         context.registerNamespaces(e);
 980 
 981         Port port = new Port(definitions, forest.locatorTable.getStartLocation(e), errReceiver);
 982         String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME);
 983         port.setName(name);
 984 
 985         String bindingAttr =
 986             Util.getRequiredAttribute(e, Constants.ATTR_BINDING);
 987         port.setBinding(context.translateQualifiedName(context.getLocation(e), bindingAttr));
 988 
 989         boolean gotDocumentation = false;
 990 
 991         for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) {
 992             Element e2 = Util.nextElement(iter);
 993             if (e2 == null) {
 994                 break;
 995             }
 996 
 997             if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) {
 998                 if (gotDocumentation) {
 999                     errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName()));
1000                 }
1001                 gotDocumentation = true;
1002                 if (port.getDocumentation() == null) {
1003                     port.setDocumentation(getDocumentationFor(e2));
1004                 }
1005             } else {
1006                 // possible extensibility element -- must live outside the WSDL namespace
1007                 checkNotWsdlElement(e2);
1008                 if (!handleExtension(context, port, e2)) {
1009                     checkNotWsdlRequired(e2);
1010                 }
1011             }
1012         }
1013 
1014         context.pop();
1015         context.fireDoneParsingEntity(WSDLConstants.QNAME_PORT, port);
1016         return port;
1017     }
1018 
1019     private void validateSchemaImports(Element typesElement){
1020         for (Iterator iter = XmlUtil.getAllChildren(typesElement); iter.hasNext();) {
1021             Element e = Util.nextElement(iter);
1022             if (e == null) {
1023                 break;
1024             }
1025             if (XmlUtil.matchesTagNS(e, SchemaConstants.QNAME_IMPORT)) {
1026                 errReceiver.warning(forest.locatorTable.getStartLocation(e), WsdlMessages.WARNING_WSI_R_2003());
1027             }else{
1028                 checkNotWsdlElement(e);
1029 //                if (XmlUtil.matchesTagNS(e, SchemaConstants.QNAME_SCHEMA)) {
1030 //                    forest.getInlinedSchemaElement().add(e);
1031 //                }
1032 
1033             }
1034         }
1035     }
1036 
1037 
1038     private boolean handleExtension(
1039         TWSDLParserContextImpl context,
1040         TWSDLExtensible entity,
1041         Element e) {
1042         TWSDLExtensionHandler h =
1043              (TWSDLExtensionHandler) extensionHandlers.get(e.getNamespaceURI());
1044         if (h == null) {
1045             context.fireIgnoringExtension(e, (Entity) entity);
1046             errReceiver.warning(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_UNKNOWN_EXTENSIBILITY_ELEMENT_OR_ATTRIBUTE(e.getLocalName(), e.getNamespaceURI()));
1047             return false;
1048         } else {
1049             return h.doHandleExtension(context, entity, e);
1050         }
1051     }
1052 
1053     private boolean handleExtension(
1054         TWSDLParserContextImpl context,
1055         TWSDLExtensible entity,
1056         Node n,
1057         Element e) {
1058         TWSDLExtensionHandler h =
1059             (TWSDLExtensionHandler) extensionHandlers.get(n.getNamespaceURI());
1060         if (h == null) {
1061             context.fireIgnoringExtension(e, (Entity) entity);
1062             errReceiver.warning(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_UNKNOWN_EXTENSIBILITY_ELEMENT_OR_ATTRIBUTE(n.getLocalName(), n.getNamespaceURI()));
1063             return false;
1064         } else {
1065             return h.doHandleExtension(context, entity, e);
1066         }
1067     }
1068 
1069     private void checkNotWsdlElement(Element e) {
1070         // possible extensibility element -- must live outside the WSDL namespace
1071         if (e.getNamespaceURI() != null && e.getNamespaceURI().equals(Constants.NS_WSDL)) {
1072             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_INVALID_WSDL_ELEMENT(e.getTagName()));
1073     }
1074     }
1075 
1076     private void checkNotWsdlAttribute(Attr a) {
1077         // possible extensibility element -- must live outside the WSDL namespace
1078         if (Constants.NS_WSDL.equals(a.getNamespaceURI())) {
1079             errReceiver.error(forest.locatorTable.getStartLocation(a.getOwnerElement()), WsdlMessages.PARSING_INVALID_WSDL_ELEMENT(a.getLocalName()));
1080     }
1081     }
1082 
1083     private void checkNotWsdlRequired(Element e) {
1084         // check the wsdl:required attribute, fail if set to "true"
1085         String required =
1086             XmlUtil.getAttributeNSOrNull(
1087                 e,
1088                 Constants.ATTR_REQUIRED,
1089                 Constants.NS_WSDL);
1090         if (required != null && required.equals(Constants.TRUE) && !options.isExtensionMode()) {
1091             errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_REQUIRED_EXTENSIBILITY_ELEMENT(e.getTagName(),
1092                 e.getNamespaceURI()));
1093         }
1094     }
1095 
1096     private Documentation getDocumentationFor(Element e) {
1097         String s = XmlUtil.getTextForNode(e);
1098         if (s == null) {
1099             return null;
1100         } else {
1101             return new Documentation(s);
1102         }
1103     }
1104 }