aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.tools.internal.ws.wsdl.parser; aoqi@0: aoqi@0: import com.sun.tools.internal.ws.api.wsdl.TWSDLExtensible; aoqi@0: import com.sun.tools.internal.ws.api.wsdl.TWSDLExtensionHandler; aoqi@0: import com.sun.tools.internal.ws.resources.WsdlMessages; aoqi@0: import com.sun.tools.internal.ws.util.xml.XmlUtil; aoqi@0: import com.sun.tools.internal.ws.wscompile.ErrorReceiverFilter; aoqi@0: import com.sun.tools.internal.ws.wscompile.WsimportOptions; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Binding; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.BindingFault; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.BindingInput; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.BindingOperation; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.BindingOutput; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Definitions; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Documentation; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Fault; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Import; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Input; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Message; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.MessagePart; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Operation; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.OperationStyle; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Output; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Port; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.PortType; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.Service; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.WSDLConstants; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.WSDLDocument; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.jaxws.JAXWSBindingsConstants; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.schema.SchemaConstants; aoqi@0: import com.sun.tools.internal.ws.wsdl.document.schema.SchemaKinds; aoqi@0: import com.sun.tools.internal.ws.wsdl.framework.Entity; aoqi@0: import com.sun.tools.internal.ws.wsdl.framework.ParserListener; aoqi@0: import com.sun.tools.internal.ws.wsdl.framework.TWSDLParserContextImpl; aoqi@0: import com.sun.xml.internal.ws.util.ServiceFinder; aoqi@0: import org.w3c.dom.Attr; aoqi@0: import org.w3c.dom.Document; aoqi@0: import org.w3c.dom.Element; aoqi@0: import org.w3c.dom.NodeList; aoqi@0: import org.xml.sax.InputSource; aoqi@0: import org.xml.sax.Locator; aoqi@0: import org.xml.sax.SAXException; aoqi@0: aoqi@0: import java.io.IOException; aoqi@0: import java.util.ArrayList; aoqi@0: import java.util.HashMap; aoqi@0: import java.util.Iterator; aoqi@0: import java.util.Map; aoqi@0: import org.w3c.dom.Node; aoqi@0: aoqi@0: /** aoqi@0: * A parser for WSDL documents. This parser is used only at the tool time. aoqi@0: * Extensions should extend TWSDLExtensionHandler, so that it will be called during aoqi@0: * parsing wsdl to handle wsdl extenisbility elements. Generally these extensions aoqi@0: * will effect the artifacts generated during WSDL processing. aoqi@0: * aoqi@0: * @see com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser which will be used for WSDL parsing aoqi@0: * at runtime. aoqi@0: * aoqi@0: * @author WS Development Team aoqi@0: */ aoqi@0: public class WSDLParser { aoqi@0: private final ErrorReceiverFilter errReceiver; aoqi@0: private WsimportOptions options; aoqi@0: aoqi@0: //wsdl extension handlers aoqi@0: private final Map extensionHandlers; aoqi@0: private MetadataFinder forest; aoqi@0: private ArrayList listeners; aoqi@0: aoqi@0: public WSDLParser(WsimportOptions options, ErrorReceiverFilter errReceiver, MetadataFinder forest) { aoqi@0: this.extensionHandlers = new HashMap(); aoqi@0: this.options = options; aoqi@0: this.errReceiver = errReceiver; aoqi@0: if (forest == null) { aoqi@0: forest = new MetadataFinder(new WSDLInternalizationLogic(), options, errReceiver); aoqi@0: forest.parseWSDL(); aoqi@0: if (forest.isMexMetadata) { aoqi@0: errReceiver.reset(); aoqi@0: } aoqi@0: } aoqi@0: this.forest = forest; aoqi@0: // register handlers for default extensions aoqi@0: register(new SOAPExtensionHandler(extensionHandlers)); aoqi@0: register(new HTTPExtensionHandler(extensionHandlers)); aoqi@0: register(new MIMEExtensionHandler(extensionHandlers)); aoqi@0: register(new JAXWSBindingExtensionHandler(extensionHandlers)); aoqi@0: register(new SOAP12ExtensionHandler(extensionHandlers)); aoqi@0: aoqi@0: // MemberSubmission Addressing not supported by WsImport anymore see JAX_WS-1040 for details aoqi@0: //register(new MemberSubmissionAddressingExtensionHandler(extensionHandlers, errReceiver, options.isExtensionMode())); aoqi@0: aoqi@0: register(new W3CAddressingExtensionHandler(extensionHandlers, errReceiver)); aoqi@0: register(new W3CAddressingMetadataExtensionHandler(extensionHandlers, errReceiver)); aoqi@0: register(new Policy12ExtensionHandler()); aoqi@0: register(new Policy15ExtensionHandler()); aoqi@0: for (TWSDLExtensionHandler te : ServiceFinder.find(TWSDLExtensionHandler.class)) { aoqi@0: register(te); aoqi@0: } aoqi@0: aoqi@0: } aoqi@0: aoqi@0: //TODO RK remove this after tests are fixed. aoqi@0: WSDLParser(WsimportOptions options, ErrorReceiverFilter errReceiver) { aoqi@0: this(options,errReceiver,null); aoqi@0: } aoqi@0: private void register(TWSDLExtensionHandler h) { aoqi@0: extensionHandlers.put(h.getNamespaceURI(), h); aoqi@0: } aoqi@0: aoqi@0: public void addParserListener(ParserListener l) { aoqi@0: if (listeners == null) { aoqi@0: listeners = new ArrayList(); aoqi@0: } aoqi@0: listeners.add(l); aoqi@0: } aoqi@0: aoqi@0: public WSDLDocument parse() throws SAXException, IOException { aoqi@0: // parse external binding files aoqi@0: for (InputSource value : options.getWSDLBindings()) { aoqi@0: errReceiver.pollAbort(); aoqi@0: Document root = forest.parse(value, false); aoqi@0: if(root==null) continue; // error must have been reported aoqi@0: Element binding = root.getDocumentElement(); aoqi@0: if (!Internalizer.fixNull(binding.getNamespaceURI()).equals(JAXWSBindingsConstants.NS_JAXWS_BINDINGS) aoqi@0: || !binding.getLocalName().equals("bindings")){ aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(binding), WsdlMessages.PARSER_NOT_A_BINDING_FILE( aoqi@0: binding.getNamespaceURI(), aoqi@0: binding.getLocalName())); aoqi@0: continue; aoqi@0: } aoqi@0: aoqi@0: NodeList nl = binding.getElementsByTagNameNS( aoqi@0: "http://java.sun.com/xml/ns/javaee", "handler-chains"); aoqi@0: for(int i = 0; i < nl.getLength(); i++){ aoqi@0: options.addHandlerChainConfiguration((Element) nl.item(i)); aoqi@0: } aoqi@0: aoqi@0: } aoqi@0: return buildWSDLDocument(); aoqi@0: } aoqi@0: aoqi@0: public MetadataFinder getDOMForest() { aoqi@0: return forest; aoqi@0: } aoqi@0: aoqi@0: private WSDLDocument buildWSDLDocument(){ aoqi@0: /** aoqi@0: * Currently we are working off first WSDL document aoqi@0: * TODO: add support of creating WSDLDocument from fromjava.collection of WSDL documents aoqi@0: */ aoqi@0: aoqi@0: String location = forest.getRootWSDL(); aoqi@0: aoqi@0: //It means that WSDL is not found, an error might have been reported, lets try to recover aoqi@0: if(location == null) aoqi@0: return null; aoqi@0: aoqi@0: Document root = forest.get(location); aoqi@0: aoqi@0: if(root == null) aoqi@0: return null; aoqi@0: aoqi@0: WSDLDocument document = new WSDLDocument(forest, errReceiver); aoqi@0: document.setSystemId(location); aoqi@0: TWSDLParserContextImpl context = new TWSDLParserContextImpl(forest, document, listeners, errReceiver); aoqi@0: aoqi@0: Definitions definitions = parseDefinitions(context, root); aoqi@0: document.setDefinitions(definitions); aoqi@0: return document; aoqi@0: } aoqi@0: aoqi@0: private Definitions parseDefinitions(TWSDLParserContextImpl context, Document root) { aoqi@0: context.pushWSDLLocation(); aoqi@0: context.setWSDLLocation(context.getDocument().getSystemId()); aoqi@0: aoqi@0: new Internalizer(forest, options, errReceiver).transform(); aoqi@0: aoqi@0: Definitions definitions = parseDefinitionsNoImport(context, root); aoqi@0: if(definitions == null){ aoqi@0: Locator locator = forest.locatorTable.getStartLocation(root.getDocumentElement()); aoqi@0: errReceiver.error(locator, WsdlMessages.PARSING_NOT_AWSDL(locator.getSystemId())); aoqi@0: aoqi@0: } aoqi@0: processImports(context); aoqi@0: context.popWSDLLocation(); aoqi@0: return definitions; aoqi@0: } aoqi@0: aoqi@0: private void processImports(TWSDLParserContextImpl context) { aoqi@0: for(String location : forest.getExternalReferences()){ aoqi@0: if (!context.getDocument().isImportedDocument(location)){ aoqi@0: Document doc = forest.get(location); aoqi@0: if(doc == null) aoqi@0: continue; aoqi@0: Definitions importedDefinitions = parseDefinitionsNoImport(context, doc); aoqi@0: if(importedDefinitions == null) aoqi@0: continue; aoqi@0: context.getDocument().addImportedEntity(importedDefinitions); aoqi@0: context.getDocument().addImportedDocument(location); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private Definitions parseDefinitionsNoImport( aoqi@0: TWSDLParserContextImpl context, aoqi@0: Document doc) { aoqi@0: Element e = doc.getDocumentElement(); aoqi@0: //at this poinjt we expect a wsdl or schema document to be fully qualified aoqi@0: if(e.getNamespaceURI() == null || (!e.getNamespaceURI().equals(WSDLConstants.NS_WSDL) || !e.getLocalName().equals("definitions"))){ aoqi@0: return null; aoqi@0: } aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: aoqi@0: Definitions definitions = new Definitions(context.getDocument(), forest.locatorTable.getStartLocation(e)); aoqi@0: String name = XmlUtil.getAttributeOrNull(e, Constants.ATTR_NAME); aoqi@0: definitions.setName(name); aoqi@0: aoqi@0: String targetNamespaceURI = aoqi@0: XmlUtil.getAttributeOrNull(e, Constants.ATTR_TARGET_NAMESPACE); aoqi@0: aoqi@0: definitions.setTargetNamespaceURI(targetNamespaceURI); aoqi@0: aoqi@0: boolean gotDocumentation = false; aoqi@0: boolean gotTypes = false; aoqi@0: aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { aoqi@0: Element e2 = Util.nextElement(iter); aoqi@0: if (e2 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e2), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: return null; aoqi@0: } aoqi@0: gotDocumentation = true; aoqi@0: if(definitions.getDocumentation() == null) aoqi@0: definitions.setDocumentation(getDocumentationFor(e2)); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_TYPES)) { aoqi@0: if (gotTypes && !options.isExtensionMode()) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e2), WsdlMessages.PARSING_ONLY_ONE_TYPES_ALLOWED(Constants.TAG_DEFINITIONS)); aoqi@0: return null; aoqi@0: } aoqi@0: gotTypes = true; aoqi@0: //add all the wsdl:type elements to latter make a list of all the schema elements aoqi@0: // that will be needed to create jaxb model aoqi@0: if(!options.isExtensionMode()) aoqi@0: validateSchemaImports(e2); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_MESSAGE)) { aoqi@0: Message message = parseMessage(context, definitions, e2); aoqi@0: definitions.add(message); aoqi@0: } else if ( aoqi@0: XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_PORT_TYPE)) { aoqi@0: PortType portType = parsePortType(context, definitions, e2); aoqi@0: definitions.add(portType); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_BINDING)) { aoqi@0: Binding binding = parseBinding(context, definitions, e2); aoqi@0: definitions.add(binding); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_SERVICE)) { aoqi@0: Service service = parseService(context, definitions, e2); aoqi@0: definitions.add(service); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_IMPORT)) { aoqi@0: definitions.add(parseImport(context, definitions, e2)); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, SchemaConstants.QNAME_IMPORT)) { aoqi@0: errReceiver.warning(forest.locatorTable.getStartLocation(e2), WsdlMessages.WARNING_WSI_R_2003()); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e2); aoqi@0: if (!handleExtension(context, definitions, e2)) { aoqi@0: checkNotWsdlRequired(e2); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity( aoqi@0: WSDLConstants.QNAME_DEFINITIONS, aoqi@0: definitions); aoqi@0: return definitions; aoqi@0: } aoqi@0: aoqi@0: private Message parseMessage( aoqi@0: TWSDLParserContextImpl context, aoqi@0: Definitions definitions, aoqi@0: Element e) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: Message message = new Message(definitions, forest.locatorTable.getStartLocation(e), errReceiver); aoqi@0: String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME); aoqi@0: message.setName(name); aoqi@0: aoqi@0: boolean gotDocumentation = false; aoqi@0: aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { aoqi@0: Element e2 = Util.nextElement(iter); aoqi@0: if (e2 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation) { aoqi@0: Util.fail( aoqi@0: "parsing.onlyOneDocumentationAllowed", aoqi@0: e.getLocalName()); aoqi@0: } aoqi@0: gotDocumentation = true; aoqi@0: message.setDocumentation(getDocumentationFor(e2)); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_PART)) { aoqi@0: MessagePart part = parseMessagePart(context, e2); aoqi@0: message.add(part); aoqi@0: } else { aoqi@0: //Ignore any extensibility elements, WS-I BP 1.1 Profiled WSDL 1.1 schema allows extension elements here. aoqi@0: /*Util.fail( aoqi@0: "parsing.invalidElement", aoqi@0: e2.getTagName(), aoqi@0: e2.getNamespaceURI()); aoqi@0: */ aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity(WSDLConstants.QNAME_MESSAGE, message); aoqi@0: return message; aoqi@0: } aoqi@0: aoqi@0: private MessagePart parseMessagePart(TWSDLParserContextImpl context, Element e) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: MessagePart part = new MessagePart(forest.locatorTable.getStartLocation(e)); aoqi@0: String partName = Util.getRequiredAttribute(e, Constants.ATTR_NAME); aoqi@0: part.setName(partName); aoqi@0: aoqi@0: String elementAttr = aoqi@0: XmlUtil.getAttributeOrNull(e, Constants.ATTR_ELEMENT); aoqi@0: String typeAttr = XmlUtil.getAttributeOrNull(e, Constants.ATTR_TYPE); aoqi@0: aoqi@0: if (elementAttr != null) { aoqi@0: if (typeAttr != null) { aoqi@0: errReceiver.error(context.getLocation(e), WsdlMessages.PARSING_ONLY_ONE_OF_ELEMENT_OR_TYPE_REQUIRED(partName)); aoqi@0: aoqi@0: } aoqi@0: aoqi@0: part.setDescriptor(context.translateQualifiedName(context.getLocation(e), elementAttr)); aoqi@0: part.setDescriptorKind(SchemaKinds.XSD_ELEMENT); aoqi@0: } else if (typeAttr != null) { aoqi@0: part.setDescriptor(context.translateQualifiedName(context.getLocation(e), typeAttr)); aoqi@0: part.setDescriptorKind(SchemaKinds.XSD_TYPE); aoqi@0: } else { aoqi@0: // XXX-NOTE - this is wrong; for extensibility purposes, aoqi@0: // any attribute can be specified on a element, so aoqi@0: // we need to put an extensibility hook here aoqi@0: errReceiver.warning(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ELEMENT_OR_TYPE_REQUIRED(partName)); aoqi@0: } aoqi@0: aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity(WSDLConstants.QNAME_PART, part); aoqi@0: return part; aoqi@0: } aoqi@0: aoqi@0: private PortType parsePortType( aoqi@0: TWSDLParserContextImpl context, aoqi@0: Definitions definitions, aoqi@0: Element e) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: PortType portType = new PortType(definitions, forest.locatorTable.getStartLocation(e), errReceiver); aoqi@0: String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME); aoqi@0: portType.setName(name); aoqi@0: aoqi@0: boolean gotDocumentation = false; aoqi@0: aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { aoqi@0: Element e2 = Util.nextElement(iter); aoqi@0: if (e2 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation = true; aoqi@0: if(portType.getDocumentation() == null) aoqi@0: portType.setDocumentation(getDocumentationFor(e2)); aoqi@0: } else if ( aoqi@0: XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_OPERATION)) { aoqi@0: Operation op = parsePortTypeOperation(context, e2); aoqi@0: op.setParent(portType); aoqi@0: portType.add(op); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e2); aoqi@0: if (!handleExtension(context, portType, e2)) { aoqi@0: checkNotWsdlRequired(e2); aoqi@0: } aoqi@0: }/*else { aoqi@0: Util.fail( aoqi@0: "parsing.invalidElement", aoqi@0: e2.getTagName(), aoqi@0: e2.getNamespaceURI()); aoqi@0: }*/ aoqi@0: } aoqi@0: aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity(WSDLConstants.QNAME_PORT_TYPE, portType); aoqi@0: return portType; aoqi@0: } aoqi@0: aoqi@0: private Operation parsePortTypeOperation( aoqi@0: TWSDLParserContextImpl context, aoqi@0: Element e) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: aoqi@0: Operation operation = new Operation(forest.locatorTable.getStartLocation(e)); aoqi@0: String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME); aoqi@0: operation.setName(name); aoqi@0: String parameterOrderAttr = aoqi@0: XmlUtil.getAttributeOrNull(e, Constants.ATTR_PARAMETER_ORDER); aoqi@0: operation.setParameterOrder(parameterOrderAttr); aoqi@0: aoqi@0: boolean gotDocumentation = false; aoqi@0: aoqi@0: boolean gotInput = false; aoqi@0: boolean gotOutput = false; aoqi@0: boolean gotFault = false; aoqi@0: boolean inputBeforeOutput = false; aoqi@0: aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { aoqi@0: Element e2 = Util.nextElement(iter); aoqi@0: if (e2 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e2), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e2.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation = true; aoqi@0: if(operation.getDocumentation() == null) aoqi@0: operation.setDocumentation(getDocumentationFor(e2)); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_INPUT)) { aoqi@0: if (gotInput) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_TOO_MANY_ELEMENTS(Constants.TAG_INPUT, aoqi@0: Constants.TAG_OPERATION, aoqi@0: name)); aoqi@0: } aoqi@0: aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e2); aoqi@0: Input input = new Input(forest.locatorTable.getStartLocation(e2), errReceiver); aoqi@0: input.setParent(operation); aoqi@0: String messageAttr = aoqi@0: Util.getRequiredAttribute(e2, Constants.ATTR_MESSAGE); aoqi@0: input.setMessage(context.translateQualifiedName(context.getLocation(e2), messageAttr)); aoqi@0: String nameAttr = aoqi@0: XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME); aoqi@0: input.setName(nameAttr); aoqi@0: operation.setInput(input); aoqi@0: gotInput = true; aoqi@0: if (gotOutput) { aoqi@0: inputBeforeOutput = false; aoqi@0: } aoqi@0: aoqi@0: // check for extensiblity attributes aoqi@0: for (Iterator iter2 = XmlUtil.getAllAttributes(e2); aoqi@0: iter2.hasNext(); aoqi@0: ) { aoqi@0: Attr e3 = (Attr)iter2.next(); aoqi@0: if (e3.getLocalName().equals(Constants.ATTR_MESSAGE) || aoqi@0: e3.getLocalName().equals(Constants.ATTR_NAME)) aoqi@0: continue; aoqi@0: aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlAttribute(e3); aoqi@0: handleExtension(context, input, e3, e2); aoqi@0: } aoqi@0: aoqi@0: // verify that there is at most one child element and it is a documentation element aoqi@0: boolean gotDocumentation2 = false; aoqi@0: for (Iterator iter2 = XmlUtil.getAllChildren(e2); aoqi@0: iter2.hasNext(); aoqi@0: ) { aoqi@0: Element e3 = Util.nextElement(iter2); aoqi@0: if (e3 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil aoqi@0: .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation2) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation2 = true; aoqi@0: input.setDocumentation(getDocumentationFor(e3)); aoqi@0: } else { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e3), WsdlMessages.PARSING_INVALID_ELEMENT(e3.getTagName(), aoqi@0: e3.getNamespaceURI())); aoqi@0: } aoqi@0: } aoqi@0: context.pop(); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_OUTPUT)) { aoqi@0: if (gotOutput) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_TOO_MANY_ELEMENTS(Constants.TAG_INPUT, aoqi@0: Constants.TAG_OPERATION, aoqi@0: name)); aoqi@0: } aoqi@0: aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e2); aoqi@0: Output output = new Output(forest.locatorTable.getStartLocation(e2), errReceiver); aoqi@0: output.setParent(operation); aoqi@0: String messageAttr = aoqi@0: Util.getRequiredAttribute(e2, Constants.ATTR_MESSAGE); aoqi@0: output.setMessage(context.translateQualifiedName(context.getLocation(e2), messageAttr)); aoqi@0: String nameAttr = aoqi@0: XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME); aoqi@0: output.setName(nameAttr); aoqi@0: operation.setOutput(output); aoqi@0: gotOutput = true; aoqi@0: if (gotInput) { aoqi@0: inputBeforeOutput = true; aoqi@0: } aoqi@0: aoqi@0: // check for extensiblity attributes aoqi@0: for (Iterator iter2 = XmlUtil.getAllAttributes(e2); aoqi@0: iter2.hasNext(); aoqi@0: ) { aoqi@0: Attr e3 = (Attr)iter2.next(); aoqi@0: if (e3.getLocalName().equals(Constants.ATTR_MESSAGE) || aoqi@0: e3.getLocalName().equals(Constants.ATTR_NAME)) aoqi@0: continue; aoqi@0: aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlAttribute(e3); aoqi@0: handleExtension(context, output, e3, e2); aoqi@0: } aoqi@0: aoqi@0: // verify that there is at most one child element and it is a documentation element aoqi@0: boolean gotDocumentation2 = false; aoqi@0: for (Iterator iter2 = XmlUtil.getAllChildren(e2); aoqi@0: iter2.hasNext(); aoqi@0: ) { aoqi@0: Element e3 = Util.nextElement(iter2); aoqi@0: if (e3 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil aoqi@0: .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation2) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation2 = true; aoqi@0: output.setDocumentation(getDocumentationFor(e3)); aoqi@0: } else { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e3), WsdlMessages.PARSING_INVALID_ELEMENT(e3.getTagName(), aoqi@0: e3.getNamespaceURI())); aoqi@0: } aoqi@0: } aoqi@0: context.pop(); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_FAULT)) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e2); aoqi@0: Fault fault = new Fault(forest.locatorTable.getStartLocation(e2)); aoqi@0: fault.setParent(operation); aoqi@0: String messageAttr = aoqi@0: Util.getRequiredAttribute(e2, Constants.ATTR_MESSAGE); aoqi@0: fault.setMessage(context.translateQualifiedName(context.getLocation(e2), messageAttr)); aoqi@0: String nameAttr = aoqi@0: XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME); aoqi@0: fault.setName(nameAttr); aoqi@0: operation.addFault(fault); aoqi@0: gotFault = true; aoqi@0: aoqi@0: // check for extensiblity attributes aoqi@0: for (Iterator iter2 = XmlUtil.getAllAttributes(e2); aoqi@0: iter2.hasNext(); aoqi@0: ) { aoqi@0: Attr e3 = (Attr)iter2.next(); aoqi@0: if (e3.getLocalName().equals(Constants.ATTR_MESSAGE) || aoqi@0: e3.getLocalName().equals(Constants.ATTR_NAME)) aoqi@0: continue; aoqi@0: aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlAttribute(e3); aoqi@0: handleExtension(context, fault, e3, e2); aoqi@0: } aoqi@0: aoqi@0: // verify that there is at most one child element and it is a documentation element aoqi@0: boolean gotDocumentation2 = false; aoqi@0: for (Iterator iter2 = XmlUtil.getAllChildren(e2); aoqi@0: iter2.hasNext(); aoqi@0: ) { aoqi@0: Element e3 = Util.nextElement(iter2); aoqi@0: if (e3 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil aoqi@0: .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation2) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation2 = true; aoqi@0: if(fault.getDocumentation() == null) aoqi@0: fault.setDocumentation(getDocumentationFor(e3)); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e3); aoqi@0: if (!handleExtension(context, fault, e3)) { aoqi@0: checkNotWsdlRequired(e3); aoqi@0: } aoqi@0: }/*else { aoqi@0: Util.fail( aoqi@0: "parsing.invalidElement", aoqi@0: e3.getTagName(), aoqi@0: e3.getNamespaceURI()); aoqi@0: }*/ aoqi@0: } aoqi@0: context.pop(); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e2); aoqi@0: if (!handleExtension(context, operation, e2)) { aoqi@0: checkNotWsdlRequired(e2); aoqi@0: } aoqi@0: }/*else { aoqi@0: Util.fail( aoqi@0: "parsing.invalidElement", aoqi@0: e2.getTagName(), aoqi@0: e2.getNamespaceURI()); aoqi@0: }*/ aoqi@0: } aoqi@0: aoqi@0: if (gotInput && !gotOutput && !gotFault) { aoqi@0: operation.setStyle(OperationStyle.ONE_WAY); aoqi@0: } else if (gotInput && gotOutput && inputBeforeOutput) { aoqi@0: operation.setStyle(OperationStyle.REQUEST_RESPONSE); aoqi@0: } else if (gotInput && gotOutput && !inputBeforeOutput) { aoqi@0: operation.setStyle(OperationStyle.SOLICIT_RESPONSE); aoqi@0: } else if (gotOutput && !gotInput && !gotFault) { aoqi@0: operation.setStyle(OperationStyle.NOTIFICATION); aoqi@0: } else { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_INVALID_OPERATION_STYLE(name)); aoqi@0: } aoqi@0: aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity(WSDLConstants.QNAME_OPERATION, operation); aoqi@0: return operation; aoqi@0: } aoqi@0: aoqi@0: private Binding parseBinding( aoqi@0: TWSDLParserContextImpl context, aoqi@0: Definitions definitions, aoqi@0: Element e) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: Binding binding = new Binding(definitions, forest.locatorTable.getStartLocation(e), errReceiver); aoqi@0: String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME); aoqi@0: binding.setName(name); aoqi@0: String typeAttr = Util.getRequiredAttribute(e, Constants.ATTR_TYPE); aoqi@0: binding.setPortType(context.translateQualifiedName(context.getLocation(e), typeAttr)); aoqi@0: aoqi@0: boolean gotDocumentation = false; aoqi@0: aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { aoqi@0: Element e2 = Util.nextElement(iter); aoqi@0: if (e2 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation = true; aoqi@0: binding.setDocumentation(getDocumentationFor(e2)); aoqi@0: } else if ( aoqi@0: XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_OPERATION)) { aoqi@0: BindingOperation op = parseBindingOperation(context, e2); aoqi@0: binding.add(op); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e2); aoqi@0: if (!handleExtension(context, binding, e2)) { aoqi@0: checkNotWsdlRequired(e2); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity(WSDLConstants.QNAME_BINDING, binding); aoqi@0: return binding; aoqi@0: } aoqi@0: aoqi@0: private BindingOperation parseBindingOperation( aoqi@0: TWSDLParserContextImpl context, aoqi@0: Element e) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: BindingOperation operation = new BindingOperation(forest.locatorTable.getStartLocation(e)); aoqi@0: String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME); aoqi@0: operation.setName(name); aoqi@0: aoqi@0: boolean gotDocumentation = false; aoqi@0: aoqi@0: boolean gotInput = false; aoqi@0: boolean gotOutput = false; aoqi@0: boolean gotFault = false; aoqi@0: boolean inputBeforeOutput = false; aoqi@0: aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { aoqi@0: Element e2 = Util.nextElement(iter); aoqi@0: if (e2 == null) aoqi@0: break; aoqi@0: if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation = true; aoqi@0: operation.setDocumentation(getDocumentationFor(e2)); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_INPUT)) { aoqi@0: if (gotInput) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_TOO_MANY_ELEMENTS(Constants.TAG_INPUT, aoqi@0: Constants.TAG_OPERATION, aoqi@0: name)); aoqi@0: } aoqi@0: aoqi@0: /* Here we check for the use scenario */ aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e2); aoqi@0: BindingInput input = new BindingInput(forest.locatorTable.getStartLocation(e2)); aoqi@0: String nameAttr = aoqi@0: XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME); aoqi@0: input.setName(nameAttr); aoqi@0: operation.setInput(input); aoqi@0: gotInput = true; aoqi@0: if (gotOutput) { aoqi@0: inputBeforeOutput = false; aoqi@0: } aoqi@0: aoqi@0: // verify that there is at most one child element and it is a documentation element aoqi@0: boolean gotDocumentation2 = false; aoqi@0: for (Iterator iter2 = XmlUtil.getAllChildren(e2); aoqi@0: iter2.hasNext(); aoqi@0: ) { aoqi@0: Element e3 = Util.nextElement(iter2); aoqi@0: if (e3 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil aoqi@0: .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation2) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation2 = true; aoqi@0: input.setDocumentation(getDocumentationFor(e3)); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e3); aoqi@0: if (!handleExtension(context, input, e3)) { aoqi@0: checkNotWsdlRequired(e3); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: context.pop(); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_OUTPUT)) { aoqi@0: if (gotOutput) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_TOO_MANY_ELEMENTS(Constants.TAG_INPUT, aoqi@0: Constants.TAG_OPERATION, aoqi@0: name)); aoqi@0: } aoqi@0: aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e2); aoqi@0: BindingOutput output = new BindingOutput(forest.locatorTable.getStartLocation(e2)); aoqi@0: String nameAttr = aoqi@0: XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME); aoqi@0: output.setName(nameAttr); aoqi@0: operation.setOutput(output); aoqi@0: gotOutput = true; aoqi@0: if (gotInput) { aoqi@0: inputBeforeOutput = true; aoqi@0: } aoqi@0: aoqi@0: // verify that there is at most one child element and it is a documentation element aoqi@0: boolean gotDocumentation2 = false; aoqi@0: for (Iterator iter2 = XmlUtil.getAllChildren(e2); aoqi@0: iter2.hasNext(); aoqi@0: ) { aoqi@0: aoqi@0: Element e3 = Util.nextElement(iter2); aoqi@0: if (e3 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil aoqi@0: .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation2) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation2 = true; aoqi@0: output.setDocumentation(getDocumentationFor(e3)); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e3); aoqi@0: if (!handleExtension(context, output, e3)) { aoqi@0: checkNotWsdlRequired(e3); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: context.pop(); aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_FAULT)) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e2); aoqi@0: BindingFault fault = new BindingFault(forest.locatorTable.getStartLocation(e2)); aoqi@0: String nameAttr = aoqi@0: Util.getRequiredAttribute(e2, Constants.ATTR_NAME); aoqi@0: fault.setName(nameAttr); aoqi@0: operation.addFault(fault); aoqi@0: gotFault = true; aoqi@0: aoqi@0: // verify that there is at most one child element and it is a documentation element aoqi@0: boolean gotDocumentation2 = false; aoqi@0: for (Iterator iter2 = XmlUtil.getAllChildren(e2); aoqi@0: iter2.hasNext(); aoqi@0: ) { aoqi@0: Element e3 = Util.nextElement(iter2); aoqi@0: if (e3 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil aoqi@0: .matchesTagNS(e3, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation2) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation2 = true; aoqi@0: if(fault.getDocumentation() == null) aoqi@0: fault.setDocumentation(getDocumentationFor(e3)); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e3); aoqi@0: if (!handleExtension(context, fault, e3)) { aoqi@0: checkNotWsdlRequired(e3); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: context.pop(); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e2); aoqi@0: if (!handleExtension(context, operation, e2)) { aoqi@0: checkNotWsdlRequired(e2); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: if (gotInput && !gotOutput && !gotFault) { aoqi@0: operation.setStyle(OperationStyle.ONE_WAY); aoqi@0: } else if (gotInput && gotOutput && inputBeforeOutput) { aoqi@0: operation.setStyle(OperationStyle.REQUEST_RESPONSE); aoqi@0: } else if (gotInput && gotOutput && !inputBeforeOutput) { aoqi@0: operation.setStyle(OperationStyle.SOLICIT_RESPONSE); aoqi@0: } else if (gotOutput && !gotInput && !gotFault) { aoqi@0: operation.setStyle(OperationStyle.NOTIFICATION); aoqi@0: } else { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_INVALID_OPERATION_STYLE(name)); aoqi@0: } aoqi@0: aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity(WSDLConstants.QNAME_OPERATION, operation); aoqi@0: return operation; aoqi@0: } aoqi@0: aoqi@0: private Import parseImport( aoqi@0: TWSDLParserContextImpl context, aoqi@0: Definitions definitions, aoqi@0: Element e) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: Import anImport = new Import(forest.locatorTable.getStartLocation(e)); aoqi@0: String namespace = aoqi@0: Util.getRequiredAttribute(e, Constants.ATTR_NAMESPACE); aoqi@0: anImport.setNamespace(namespace); aoqi@0: String location = Util.getRequiredAttribute(e, Constants.ATTR_LOCATION); aoqi@0: anImport.setLocation(location); aoqi@0: aoqi@0: // according to the schema in the WSDL 1.1 spec, an import can have a documentation element aoqi@0: boolean gotDocumentation = false; aoqi@0: aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { aoqi@0: Element e2 = Util.nextElement(iter); aoqi@0: if (e2 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation = true; aoqi@0: anImport.setDocumentation(getDocumentationFor(e2)); aoqi@0: } else { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e2), WsdlMessages.PARSING_INVALID_ELEMENT(e2.getTagName(), aoqi@0: e2.getNamespaceURI())); aoqi@0: } aoqi@0: } aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity(WSDLConstants.QNAME_IMPORT, anImport); aoqi@0: return anImport; aoqi@0: } aoqi@0: aoqi@0: private Service parseService( aoqi@0: TWSDLParserContextImpl context, aoqi@0: Definitions definitions, aoqi@0: Element e) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: Service service = new Service(definitions, forest.locatorTable.getStartLocation(e), errReceiver); aoqi@0: String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME); aoqi@0: service.setName(name); aoqi@0: aoqi@0: boolean gotDocumentation = false; aoqi@0: aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { aoqi@0: Element e2 = Util.nextElement(iter); aoqi@0: if (e2 == null) aoqi@0: break; aoqi@0: aoqi@0: if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation = true; aoqi@0: if (service.getDocumentation() == null) { aoqi@0: service.setDocumentation(getDocumentationFor(e2)); aoqi@0: } aoqi@0: } else if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_PORT)) { aoqi@0: Port port = parsePort(context, definitions, e2); aoqi@0: service.add(port); aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e2); aoqi@0: if (!handleExtension(context, service, e2)) { aoqi@0: checkNotWsdlRequired(e2); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity(WSDLConstants.QNAME_SERVICE, service); aoqi@0: return service; aoqi@0: } aoqi@0: aoqi@0: private Port parsePort( aoqi@0: TWSDLParserContextImpl context, aoqi@0: Definitions definitions, aoqi@0: Element e) { aoqi@0: context.push(); aoqi@0: context.registerNamespaces(e); aoqi@0: aoqi@0: Port port = new Port(definitions, forest.locatorTable.getStartLocation(e), errReceiver); aoqi@0: String name = Util.getRequiredAttribute(e, Constants.ATTR_NAME); aoqi@0: port.setName(name); aoqi@0: aoqi@0: String bindingAttr = aoqi@0: Util.getRequiredAttribute(e, Constants.ATTR_BINDING); aoqi@0: port.setBinding(context.translateQualifiedName(context.getLocation(e), bindingAttr)); aoqi@0: aoqi@0: boolean gotDocumentation = false; aoqi@0: aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { aoqi@0: Element e2 = Util.nextElement(iter); aoqi@0: if (e2 == null) { aoqi@0: break; aoqi@0: } aoqi@0: aoqi@0: if (XmlUtil.matchesTagNS(e2, WSDLConstants.QNAME_DOCUMENTATION)) { aoqi@0: if (gotDocumentation) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_ONLY_ONE_DOCUMENTATION_ALLOWED(e.getLocalName())); aoqi@0: } aoqi@0: gotDocumentation = true; aoqi@0: if (port.getDocumentation() == null) { aoqi@0: port.setDocumentation(getDocumentationFor(e2)); aoqi@0: } aoqi@0: } else { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: checkNotWsdlElement(e2); aoqi@0: if (!handleExtension(context, port, e2)) { aoqi@0: checkNotWsdlRequired(e2); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: context.pop(); aoqi@0: context.fireDoneParsingEntity(WSDLConstants.QNAME_PORT, port); aoqi@0: return port; aoqi@0: } aoqi@0: aoqi@0: private void validateSchemaImports(Element typesElement){ aoqi@0: for (Iterator iter = XmlUtil.getAllChildren(typesElement); iter.hasNext();) { aoqi@0: Element e = Util.nextElement(iter); aoqi@0: if (e == null) { aoqi@0: break; aoqi@0: } aoqi@0: if (XmlUtil.matchesTagNS(e, SchemaConstants.QNAME_IMPORT)) { aoqi@0: errReceiver.warning(forest.locatorTable.getStartLocation(e), WsdlMessages.WARNING_WSI_R_2003()); aoqi@0: }else{ aoqi@0: checkNotWsdlElement(e); aoqi@0: // if (XmlUtil.matchesTagNS(e, SchemaConstants.QNAME_SCHEMA)) { aoqi@0: // forest.getInlinedSchemaElement().add(e); aoqi@0: // } aoqi@0: aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: aoqi@0: private boolean handleExtension( aoqi@0: TWSDLParserContextImpl context, aoqi@0: TWSDLExtensible entity, aoqi@0: Element e) { aoqi@0: TWSDLExtensionHandler h = aoqi@0: (TWSDLExtensionHandler) extensionHandlers.get(e.getNamespaceURI()); aoqi@0: if (h == null) { aoqi@0: context.fireIgnoringExtension(e, (Entity) entity); aoqi@0: errReceiver.warning(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_UNKNOWN_EXTENSIBILITY_ELEMENT_OR_ATTRIBUTE(e.getLocalName(), e.getNamespaceURI())); aoqi@0: return false; aoqi@0: } else { aoqi@0: return h.doHandleExtension(context, entity, e); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private boolean handleExtension( aoqi@0: TWSDLParserContextImpl context, aoqi@0: TWSDLExtensible entity, aoqi@0: Node n, aoqi@0: Element e) { aoqi@0: TWSDLExtensionHandler h = aoqi@0: (TWSDLExtensionHandler) extensionHandlers.get(n.getNamespaceURI()); aoqi@0: if (h == null) { aoqi@0: context.fireIgnoringExtension(e, (Entity) entity); aoqi@0: errReceiver.warning(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_UNKNOWN_EXTENSIBILITY_ELEMENT_OR_ATTRIBUTE(n.getLocalName(), n.getNamespaceURI())); aoqi@0: return false; aoqi@0: } else { aoqi@0: return h.doHandleExtension(context, entity, e); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private void checkNotWsdlElement(Element e) { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: if (e.getNamespaceURI() != null && e.getNamespaceURI().equals(Constants.NS_WSDL)) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_INVALID_WSDL_ELEMENT(e.getTagName())); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private void checkNotWsdlAttribute(Attr a) { aoqi@0: // possible extensibility element -- must live outside the WSDL namespace aoqi@0: if (Constants.NS_WSDL.equals(a.getNamespaceURI())) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(a.getOwnerElement()), WsdlMessages.PARSING_INVALID_WSDL_ELEMENT(a.getLocalName())); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private void checkNotWsdlRequired(Element e) { aoqi@0: // check the wsdl:required attribute, fail if set to "true" aoqi@0: String required = aoqi@0: XmlUtil.getAttributeNSOrNull( aoqi@0: e, aoqi@0: Constants.ATTR_REQUIRED, aoqi@0: Constants.NS_WSDL); aoqi@0: if (required != null && required.equals(Constants.TRUE) && !options.isExtensionMode()) { aoqi@0: errReceiver.error(forest.locatorTable.getStartLocation(e), WsdlMessages.PARSING_REQUIRED_EXTENSIBILITY_ELEMENT(e.getTagName(), aoqi@0: e.getNamespaceURI())); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private Documentation getDocumentationFor(Element e) { aoqi@0: String s = XmlUtil.getTextForNode(e); aoqi@0: if (s == null) { aoqi@0: return null; aoqi@0: } else { aoqi@0: return new Documentation(s); aoqi@0: } aoqi@0: } aoqi@0: }