ohair@286: /* alanb@368: * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ohair@286: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ohair@286: * ohair@286: * This code is free software; you can redistribute it and/or modify it ohair@286: * under the terms of the GNU General Public License version 2 only, as ohair@286: * published by the Free Software Foundation. Oracle designates this ohair@286: * particular file as subject to the "Classpath" exception as provided ohair@286: * by Oracle in the LICENSE file that accompanied this code. ohair@286: * ohair@286: * This code is distributed in the hope that it will be useful, but WITHOUT ohair@286: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ohair@286: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ohair@286: * version 2 for more details (a copy is included in the LICENSE file that ohair@286: * accompanied this code). ohair@286: * ohair@286: * You should have received a copy of the GNU General Public License version ohair@286: * 2 along with this work; if not, write to the Free Software Foundation, ohair@286: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ohair@286: * ohair@286: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@286: * or visit www.oracle.com if you need additional information or have any ohair@286: * questions. ohair@286: */ ohair@286: ohair@286: package com.sun.tools.internal.ws.wsdl.parser; ohair@286: ohair@286: import com.sun.tools.internal.ws.api.wsdl.TWSDLExtensible; ohair@286: import com.sun.tools.internal.ws.api.wsdl.TWSDLParserContext; ohair@286: import com.sun.tools.internal.ws.util.xml.XmlUtil; ohair@286: import com.sun.tools.internal.ws.wsdl.document.WSDLConstants; ohair@286: import com.sun.tools.internal.ws.wsdl.document.mime.*; ohair@286: import org.w3c.dom.Element; ohair@286: ohair@286: import java.util.Iterator; ohair@286: import java.util.Map; ohair@286: ohair@286: /** ohair@286: * The MIME extension handler for WSDL. ohair@286: * ohair@286: * @author WS Development Team ohair@286: */ ohair@286: public class MIMEExtensionHandler extends AbstractExtensionHandler { ohair@286: ohair@286: public MIMEExtensionHandler(Map extensionHandlerMap) { ohair@286: super(extensionHandlerMap); ohair@286: } ohair@286: ohair@286: public String getNamespaceURI() { ohair@286: return Constants.NS_WSDL_MIME; ohair@286: } ohair@286: ohair@286: @Override ohair@286: public boolean doHandleExtension( ohair@286: TWSDLParserContext context, ohair@286: TWSDLExtensible parent, ohair@286: Element e) { ohair@286: if (parent.getWSDLElementName().equals(WSDLConstants.QNAME_OUTPUT)) { ohair@286: return handleInputOutputExtension(context, parent, e); ohair@286: } else if (parent.getWSDLElementName().equals(WSDLConstants.QNAME_INPUT)) { ohair@286: return handleInputOutputExtension(context, parent, e); ohair@286: } else if (parent.getWSDLElementName().equals(MIMEConstants.QNAME_PART)) { ohair@286: return handleMIMEPartExtension(context, parent, e); ohair@286: } else { ohair@286: // context.fireIgnoringExtension( ohair@286: // new QName(e.getNamespaceURI(), e.getLocalName()), ohair@286: // parent.getWSDLElementName()); ohair@286: return false; ohair@286: } ohair@286: } ohair@286: ohair@286: protected boolean handleInputOutputExtension( ohair@286: TWSDLParserContext context, ohair@286: TWSDLExtensible parent, ohair@286: Element e) { ohair@286: if (XmlUtil.matchesTagNS(e, MIMEConstants.QNAME_MULTIPART_RELATED)) { ohair@286: context.push(); ohair@286: context.registerNamespaces(e); ohair@286: ohair@286: MIMEMultipartRelated mpr = new MIMEMultipartRelated(context.getLocation(e)); ohair@286: ohair@286: for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext();) { ohair@286: Element e2 = Util.nextElement(iter); ohair@286: if (e2 == null) ohair@286: break; ohair@286: ohair@286: if (XmlUtil.matchesTagNS(e2, MIMEConstants.QNAME_PART)) { ohair@286: context.push(); ohair@286: context.registerNamespaces(e2); ohair@286: ohair@286: MIMEPart part = new MIMEPart(context.getLocation(e2)); ohair@286: ohair@286: String name = ohair@286: XmlUtil.getAttributeOrNull(e2, Constants.ATTR_NAME); ohair@286: if (name != null) { ohair@286: part.setName(name); ohair@286: } ohair@286: ohair@286: for (Iterator iter2 = XmlUtil.getAllChildren(e2); ohair@286: iter2.hasNext(); ohair@286: ) { ohair@286: Element e3 = Util.nextElement(iter2); ohair@286: if (e3 == null) ohair@286: break; ohair@286: ohair@286: AbstractExtensionHandler h = getExtensionHandlers().get(e3.getNamespaceURI()); ohair@286: boolean handled = false; ohair@286: if (h != null) { ohair@286: handled = h.doHandleExtension(context, part, e3); ohair@286: } ohair@286: ohair@286: if (!handled) { ohair@286: String required = ohair@286: XmlUtil.getAttributeNSOrNull( ohair@286: e3, ohair@286: Constants.ATTR_REQUIRED, ohair@286: Constants.NS_WSDL); ohair@286: if (required != null ohair@286: && required.equals(Constants.TRUE)) { ohair@286: Util.fail( ohair@286: "parsing.requiredExtensibilityElement", ohair@286: e3.getTagName(), ohair@286: e3.getNamespaceURI()); ohair@286: } else { ohair@286: // context.fireIgnoringExtension( ohair@286: // new QName( ohair@286: // e3.getNamespaceURI(), ohair@286: // e3.getLocalName()), ohair@286: // part.getElementName()); ohair@286: } ohair@286: } ohair@286: } ohair@286: ohair@286: mpr.add(part); ohair@286: context.pop(); ohair@286: // context.fireDoneParsingEntity( ohair@286: // MIMEConstants.QNAME_PART, ohair@286: // part); ohair@286: } else { ohair@286: Util.fail( ohair@286: "parsing.invalidElement", ohair@286: e2.getTagName(), ohair@286: e2.getNamespaceURI()); ohair@286: } ohair@286: } ohair@286: ohair@286: parent.addExtension(mpr); ohair@286: context.pop(); ohair@286: // context.fireDoneParsingEntity( ohair@286: // MIMEConstants.QNAME_MULTIPART_RELATED, ohair@286: // mpr); ohair@286: return true; ohair@286: } else if (XmlUtil.matchesTagNS(e, MIMEConstants.QNAME_CONTENT)) { ohair@286: MIMEContent content = parseMIMEContent(context, e); ohair@286: parent.addExtension(content); ohair@286: return true; ohair@286: } else if (XmlUtil.matchesTagNS(e, MIMEConstants.QNAME_MIME_XML)) { ohair@286: MIMEXml mimeXml = parseMIMEXml(context, e); ohair@286: parent.addExtension(mimeXml); ohair@286: return true; ohair@286: } else { ohair@286: Util.fail( ohair@286: "parsing.invalidExtensionElement", ohair@286: e.getTagName(), ohair@286: e.getNamespaceURI()); ohair@286: return false; // keep compiler happy ohair@286: } ohair@286: } ohair@286: ohair@286: @Override ohair@286: protected boolean handleMIMEPartExtension( ohair@286: TWSDLParserContext context, ohair@286: TWSDLExtensible parent, ohair@286: Element e) { ohair@286: if (XmlUtil.matchesTagNS(e, MIMEConstants.QNAME_CONTENT)) { ohair@286: MIMEContent content = parseMIMEContent(context, e); ohair@286: parent.addExtension(content); ohair@286: return true; ohair@286: } else if (XmlUtil.matchesTagNS(e, MIMEConstants.QNAME_MIME_XML)) { ohair@286: MIMEXml mimeXml = parseMIMEXml(context, e); ohair@286: parent.addExtension(mimeXml); ohair@286: return true; ohair@286: } else { ohair@286: Util.fail( ohair@286: "parsing.invalidExtensionElement", ohair@286: e.getTagName(), ohair@286: e.getNamespaceURI()); ohair@286: return false; // keep compiler happy ohair@286: } ohair@286: } ohair@286: ohair@286: protected MIMEContent parseMIMEContent(TWSDLParserContext context, Element e) { ohair@286: context.push(); ohair@286: context.registerNamespaces(e); ohair@286: ohair@286: MIMEContent content = new MIMEContent(context.getLocation(e)); ohair@286: ohair@286: String part = XmlUtil.getAttributeOrNull(e, Constants.ATTR_PART); ohair@286: if (part != null) { ohair@286: content.setPart(part); ohair@286: } ohair@286: ohair@286: String type = XmlUtil.getAttributeOrNull(e, Constants.ATTR_TYPE); ohair@286: if (type != null) { ohair@286: content.setType(type); ohair@286: } ohair@286: ohair@286: context.pop(); ohair@286: // context.fireDoneParsingEntity(MIMEConstants.QNAME_CONTENT, content); ohair@286: return content; ohair@286: } ohair@286: ohair@286: protected MIMEXml parseMIMEXml(TWSDLParserContext context, Element e) { ohair@286: context.push(); ohair@286: context.registerNamespaces(e); ohair@286: ohair@286: MIMEXml mimeXml = new MIMEXml(context.getLocation(e)); ohair@286: ohair@286: String part = XmlUtil.getAttributeOrNull(e, Constants.ATTR_PART); ohair@286: if (part != null) { ohair@286: mimeXml.setPart(part); ohair@286: } ohair@286: ohair@286: context.pop(); ohair@286: // context.fireDoneParsingEntity(MIMEConstants.QNAME_MIME_XML, mimeXml); ohair@286: return mimeXml; ohair@286: } ohair@286: }