/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.ode.bpel.compiler.wsdl; import java.io.PrintWriter; import java.net.URI; import java.net.URISyntaxException; import org.apache.ode.bpel.compiler.bom.BpelObject4WSDL; import org.apache.ode.bpel.compiler.bom.BpelObjectFactory; import org.apache.ode.utils.DOMUtils; import org.apache.ode.utils.msg.MessageBundle; import com.ibm.wsdl.util.xml.XPathUtils; import javax.wsdl.Definition; import javax.wsdl.WSDLException; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.ExtensionDeserializer; import javax.wsdl.extensions.ExtensionRegistry; import javax.wsdl.extensions.ExtensionSerializer; import javax.xml.namespace.QName; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * BPEL extension (partnerLinkType/propertyAlias) serializer for WSDL4J. */ public class BpelExtensionSerializer implements ExtensionDeserializer, ExtensionSerializer { protected static final Messages __msgs = MessageBundle.getMessages(Messages.class); private BpelObjectFactory _factory; public BpelExtensionSerializer(BpelObjectFactory factory) { _factory = factory; } /** * @see javax.wsdl.extensions.ExtensionSerializer#marshall(java.lang.Class, * javax.xml.namespace.QName, * javax.wsdl.extensions.ExtensibilityElement, java.io.PrintWriter, * javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry) */ public void marshall(Class arg0, QName arg1, ExtensibilityElement arg2, PrintWriter arg3, Definition arg4, ExtensionRegistry arg5) throws WSDLException { throw new UnsupportedOperationException(); } /** * @see javax.wsdl.extensions.ExtensionDeserializer#unmarshall(java.lang.Class, * javax.xml.namespace.QName, org.w3c.dom.Element, * javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry) */ public ExtensibilityElement unmarshall(Class clsType, QName eltype, Element el, Definition def, ExtensionRegistry extReg) throws WSDLException { validateExtensibilityElementContext(el); BpelObject4WSDL obj; try { obj = (BpelObject4WSDL) _factory.createBpelObject(el,new URI(def.getDocumentBaseURI())); } catch (URISyntaxException e) { throw new RuntimeException(e); } obj.setElementType(eltype); obj.setRequired(false); // ? what does this do obj.setTargetNamespace(def.getTargetNamespace()); return obj; } /** * Dereference a qualified name given in the "ns:name" form using the namespace * context of a given element. * * @param prefixedQNameStr qualified name, represented as a prefixed string * @param context context element * @return a resolved {@link QName} * @throws javax.wsdl.WSDLException in case of resolution error (e.g. undefined prefix) */ protected static QName derefQName(String prefixedQNameStr, Element context) throws WSDLException { int idx = prefixedQNameStr.indexOf(":"); String uri; if (idx == -1) { uri = DOMUtils.getNamespaceURIFromPrefix(context, null); } else { if (idx >= prefixedQNameStr.length() || idx == 0) { String msg = __msgs.msgMalformedQName(prefixedQNameStr); throw new WSDLException(WSDLException.INVALID_WSDL, msg); } // Look up the prefix from the namespaces defined *at the element*. String prefix = prefixedQNameStr.substring(0, idx); uri = DOMUtils.getMyNSContext(context).getNamespaceURI(prefix); if (uri == null) { String msg = __msgs.msgInvalidNamespacePrefix(prefix); throw new WSDLException(WSDLException.INVALID_WSDL, msg); } } return new QName(uri, prefixedQNameStr.substring(idx + 1, prefixedQNameStr.length())); } /** * Ensure that a top-level extensibility element does not occur before other WSDL * declarations (messages, port types, etc.). * * @param el the extensibility element * @throws javax.wsdl.WSDLException if the requirements of the WSDL schema are violated. */ static void validateExtensibilityElementContext(Element el) throws WSDLException { Node n = el.getParentNode(); if (n == null || n.getNodeType() != Node.ELEMENT_NODE) { WSDLException we = new WSDLException(WSDLException.OTHER_ERROR, __msgs.msgCannotBeDocumentRootElement(DOMUtils.getElementQName(el).toString())); we.setLocation(XPathUtils.getXPathExprFromNode(el)); throw we; } Element def = (Element) n; if (def.getNamespaceURI() == null || !def.getNamespaceURI().equals(DOMUtils.WSDL_NS) || !def.getLocalName().equals(DOMUtils.WSDL_ROOT_ELEMENT)) { WSDLException we = new WSDLException(WSDLException.OTHER_ERROR, __msgs.msgMustBeChildOfDef(DOMUtils.getElementQName(el).toString())); we.setLocation(XPathUtils.getXPathExprFromNode(el)); throw we; } /* * NOTE: * This check was originally put in to match the W3C version of the WSDL * schema, but the WS-I version is more permissive. Leaving this check out * complies with the WS-I version, which is preferable. */ // n = el.getNextSibling(); // while (n != null) { // if (n.getNamespaceURI() != null && n.getNamespaceURI().equals(DOMUtils.WSDL_NS)) { // WSDLException we = new WSDLException(WSDLException.INVALID_WSDL, // MSGS.msgExtensibilityElementsMustBeLast(DOMUtils.getElementQName(el).toString())); // we.setLocation(XPathUtils.getXPathExprFromNode(el)); // throw we; // } // n = n.getNextSibling(); // } } protected String getAttribute(Element element, String attributeName) { Attr attribute = element.getAttributeNode(attributeName); if (attribute == null) return null; return attribute.getValue(); } }