com.centeractive.ws.builder.soap.WsdlUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.centeractive.ws.builder.soap.WsdlUtils.java

Source

/**
 * Copyright (c) 2012 centeractive ag. All Rights Reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301  USA
 */
package com.centeractive.ws.builder.soap;

import com.ibm.wsdl.util.xml.QNameUtils;
import com.ibm.wsdl.xml.WSDLReaderImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.w3c.dom.Element;

import javax.wsdl.*;
import javax.wsdl.extensions.*;
import javax.wsdl.extensions.mime.MIMEContent;
import javax.wsdl.extensions.mime.MIMEMultipartRelated;
import javax.wsdl.extensions.mime.MIMEPart;
import javax.wsdl.extensions.soap.*;
import javax.wsdl.extensions.soap12.*;
import javax.wsdl.xml.WSDLReader;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * This class was extracted from the soapUI code base by centeractive ag in October 2011.
 * The main reason behind the extraction was to separate the code that is responsible
 * for the generation of the SOAP messages from the rest of the soapUI's code that is
 * tightly coupled with other modules, such as soapUI's graphical user interface, etc.
 * The goal was to create an open-source java project whose main responsibility is to
 * handle SOAP message generation and SOAP transmission purely on an XML level.
 * <br/>
 * centeractive ag would like to express strong appreciation to SmartBear Software and
 * to the whole team of soapUI's developers for creating soapUI and for releasing its
 * source code under a free and open-source licence. centeractive ag extracted and
 * modifies some parts of the soapUI's code in good faith, making every effort not
 * to impair any existing functionality and to supplement it according to our
 * requirements, applying best practices of software design.
 *
 * Changes done:
 * - changing location in the package structure
 * - removal of dependencies and code parts that are out of scope of SOAP message generation
 * - minor fixes to make the class compile out of soapUI's code base
 */

/**
 * Wsdl-related tools
 * 
 * @author Ole.Matzura
 */
public class WsdlUtils {
    private final static Logger log = Logger.getLogger(WsdlUtils.class);
    private static WSDLReader wsdlReader;
    private final static String WSDL_NAMESPACE = "http://schemas.xmlsoap.org/wsdl/";

    public static <T extends ExtensibilityElement> T getExtensiblityElement(List<?> list, Class<T> clazz) {
        List<T> elements = getExtensiblityElements(list, clazz);
        return elements.isEmpty() ? null : elements.get(0);
    }

    public static <T extends ExtensibilityElement> List<T> getExtensiblityElements(List list, Class<T> clazz) {
        List<T> result = new ArrayList<T>();

        for (Iterator<T> i = list.iterator(); i.hasNext();) {
            T elm = i.next();
            if (clazz.isAssignableFrom(elm.getClass())) {
                result.add(elm);
            }
        }

        return result;
    }

    public static Element[] getExentsibilityElements(ElementExtensible item, QName qname) {
        if (item == null)
            return new Element[0];

        List<Element> result = new ArrayList<Element>();

        List<?> list = item.getExtensibilityElements();
        for (Iterator<?> i = list.iterator(); i.hasNext();) {
            ExtensibilityElement elm = (ExtensibilityElement) i.next();
            if (elm.getElementType().equals(qname) && elm instanceof UnknownExtensibilityElement) {
                result.add(((UnknownExtensibilityElement) elm).getElement());
            }
        }

        return result.toArray(new Element[result.size()]);
    }

    public static String[] getExentsibilityAttributes(AttributeExtensible item, QName qname) {
        if (item == null)
            return new String[0];

        StringList result = new StringList();

        Map map = item.getExtensionAttributes();

        for (Iterator<?> i = map.keySet().iterator(); i.hasNext();) {
            QName name = (QName) i.next();
            if (name.equals(qname)) {
                result.add(map.get(name).toString());
            }
        }

        return result.toStringArray();
    }

    public static String getSoapAction(BindingOperation operation) {
        List list = operation.getExtensibilityElements();
        SOAPOperation soapOperation = WsdlUtils.getExtensiblityElement(list, SOAPOperation.class);
        if (soapOperation != null)
            return soapOperation.getSoapActionURI();

        SOAP12Operation soap12Operation = WsdlUtils.getExtensiblityElement(list, SOAP12Operation.class);
        if (soap12Operation != null)
            return soap12Operation.getSoapActionURI();

        return null;
    }

    public static String[] getEndpointsForBinding(Definition definition, Binding binding) {
        List<String> result = new ArrayList<String>();
        Map map = definition.getAllServices();
        for (Iterator i = map.values().iterator(); i.hasNext();) {
            Service service = (Service) i.next();
            Map portMap = service.getPorts();
            for (Iterator i2 = portMap.values().iterator(); i2.hasNext();) {
                Port port = (Port) i2.next();
                if (port.getBinding() == binding) {
                    String endpoint = WsdlUtils.getSoapEndpoint(port);
                    if (endpoint != null)
                        result.add(endpoint);
                }
            }
        }

        return result.toArray(new String[result.size()]);
    }

    public static Binding findBindingForOperation(Definition definition, BindingOperation bindingOperation) {
        Map services = definition.getAllServices();
        Iterator<Service> s = services.values().iterator();

        while (s.hasNext()) {
            Map ports = s.next().getPorts();
            Iterator<Port> p = ports.values().iterator();
            while (p.hasNext()) {
                Binding binding = p.next().getBinding();
                List bindingOperations = binding.getBindingOperations();
                for (Iterator iter = bindingOperations.iterator(); iter.hasNext();) {
                    BindingOperation op = (BindingOperation) iter.next();
                    if (op.getName().equals(bindingOperation.getName()))
                        return binding;
                }
            }
        }

        Map bindings = definition.getAllBindings();
        Iterator<QName> names = bindings.keySet().iterator();
        while (names.hasNext()) {
            Binding binding = definition.getBinding(names.next());
            List bindingOperations = binding.getBindingOperations();
            for (Iterator iter = bindingOperations.iterator(); iter.hasNext();) {
                BindingOperation op = (BindingOperation) iter.next();
                if (op.getName().equals(bindingOperation.getName()))
                    return binding;
            }
        }

        return null;
    }

    public static BindingOperation findBindingOperation(Definition definition, String operationName) {
        Map services = definition.getAllServices();
        for (Iterator i = services.keySet().iterator(); i.hasNext();) {
            QName qName = (QName) i.next();
            Service service = definition.getService(qName);
            Map ports = service.getPorts();

            for (Iterator iterator = ports.keySet().iterator(); iterator.hasNext();) {
                String key = (String) iterator.next();
                Port port = service.getPort(key);
                BindingOperation bindingOperation = port.getBinding().getBindingOperation(operationName, null,
                        null);
                if (bindingOperation != null)
                    return bindingOperation;
            }
        }

        Map bindings = definition.getAllBindings();
        for (Iterator i = bindings.keySet().iterator(); i.hasNext();) {
            Object key = i.next();
            Binding binding = (Binding) bindings.get(key);
            BindingOperation bindingOperation = binding.getBindingOperation(operationName, null, null);
            if (bindingOperation != null)
                return bindingOperation;
        }

        return null;
    }

    public static boolean isInputSoapEncoded(BindingOperation bindingOperation) {
        if (bindingOperation == null)
            return false;

        BindingInput bindingInput = bindingOperation.getBindingInput();
        if (bindingInput == null)
            return false;

        SOAPBody soapBody = WsdlUtils.getExtensiblityElement(bindingInput.getExtensibilityElements(),
                SOAPBody.class);

        if (soapBody != null) {
            return soapBody.getUse() != null && soapBody.getUse().equalsIgnoreCase("encoded")
                    && (soapBody.getEncodingStyles() == null
                            || soapBody.getEncodingStyles().contains("http://schemas.xmlsoap.org/soap/encoding/"));
        }

        SOAP12Body soap12Body = WsdlUtils.getExtensiblityElement(bindingInput.getExtensibilityElements(),
                SOAP12Body.class);

        if (soap12Body != null) {
            return soap12Body.getUse() != null && soap12Body.getUse().equalsIgnoreCase("encoded")
                    && (soap12Body.getEncodingStyle() == null
                            || soap12Body.getEncodingStyle().equals("http://schemas.xmlsoap.org/soap/encoding/"));
        }

        return false;
    }

    public static boolean isOutputSoapEncoded(BindingOperation bindingOperation) {
        if (bindingOperation == null)
            return false;

        BindingOutput bindingOutput = bindingOperation.getBindingOutput();
        if (bindingOutput == null)
            return false;

        SOAPBody soapBody = WsdlUtils.getExtensiblityElement(bindingOutput.getExtensibilityElements(),
                SOAPBody.class);

        if (soapBody != null) {
            return soapBody.getUse() != null && soapBody.getUse().equalsIgnoreCase("encoded")
                    && (soapBody.getEncodingStyles() == null
                            || soapBody.getEncodingStyles().contains("http://schemas.xmlsoap.org/soap/encoding/"));
        }

        SOAP12Body soap12Body = WsdlUtils.getExtensiblityElement(bindingOutput.getExtensibilityElements(),
                SOAP12Body.class);

        if (soap12Body != null) {
            return soap12Body.getUse() != null && soap12Body.getUse().equalsIgnoreCase("encoded")
                    && (soap12Body.getEncodingStyle() == null
                            || soap12Body.getEncodingStyle().equals("http://schemas.xmlsoap.org/soap/encoding/"));
        }

        return false;
    }

    public static boolean isRpc(Definition definition, BindingOperation bindingOperation) {
        SOAPOperation soapOperation = WsdlUtils.getExtensiblityElement(bindingOperation.getExtensibilityElements(),
                SOAPOperation.class);

        if (soapOperation != null && soapOperation.getStyle() != null)
            return soapOperation.getStyle().equalsIgnoreCase("rpc");

        SOAP12Operation soap12Operation = WsdlUtils
                .getExtensiblityElement(bindingOperation.getExtensibilityElements(), SOAP12Operation.class);

        if (soap12Operation != null && soap12Operation.getStyle() != null)
            return soap12Operation.getStyle().equalsIgnoreCase("rpc");

        Binding binding = findBindingForOperation(definition, bindingOperation);
        if (binding == null) {
            log.error("Failed to find binding for operation [" + bindingOperation.getName() + "] in definition ["
                    + definition.getDocumentBaseURI() + "]");
            return false;
        }

        return isRpc(binding);
    }

    public static boolean isRpc(Binding binding) {
        SOAPBinding soapBinding = WsdlUtils.getExtensiblityElement(binding.getExtensibilityElements(),
                SOAPBinding.class);

        if (soapBinding != null)
            return "rpc".equalsIgnoreCase(soapBinding.getStyle());

        SOAP12Binding soap12Binding = WsdlUtils.getExtensiblityElement(binding.getExtensibilityElements(),
                SOAP12Binding.class);

        if (soap12Binding != null)
            return "rpc".equalsIgnoreCase(soap12Binding.getStyle());

        return false;
    }

    /**
     * Returns a list of parts for the specifed operation, either as specified in
     * body or all
     */

    public static Part[] getInputParts(BindingOperation operation) {
        List<Part> result = new ArrayList<Part>();
        Input input = operation.getOperation().getInput();
        if (input == null || operation.getBindingInput() == null)
            return new Part[0];

        Message msg = input.getMessage();

        if (msg != null) {
            SOAPBody soapBody = WsdlUtils
                    .getExtensiblityElement(operation.getBindingInput().getExtensibilityElements(), SOAPBody.class);

            if (soapBody == null || soapBody.getParts() == null) {
                SOAP12Body soap12Body = WsdlUtils.getExtensiblityElement(
                        operation.getBindingInput().getExtensibilityElements(), SOAP12Body.class);

                if (soap12Body == null || soap12Body.getParts() == null) {
                    if (msg != null)
                        result.addAll(msg.getOrderedParts(null));
                } else {
                    Iterator i = soap12Body.getParts().iterator();
                    while (i.hasNext()) {
                        String partName = (String) i.next();
                        Part part = msg.getPart(partName);

                        result.add(part);
                    }
                }
            } else {
                Iterator i = soapBody.getParts().iterator();
                while (i.hasNext()) {
                    String partName = (String) i.next();
                    Part part = msg.getPart(partName);

                    result.add(part);
                }
            }
        } else {
        }

        return result.toArray(new Part[result.size()]);
    }

    public static boolean isAttachmentInputPart(Part part, BindingOperation operation) {
        return getInputMultipartContent(part, operation).length > 0;
    }

    public static boolean isAttachmentOutputPart(Part part, BindingOperation operation) {
        return getOutputMultipartContent(part, operation).length > 0;
    }

    public static MIMEContent[] getOutputMultipartContent(Part part, BindingOperation operation) {
        BindingOutput output = operation.getBindingOutput();
        if (output == null)
            return new MIMEContent[0];

        MIMEMultipartRelated multipartOutput = WsdlUtils.getExtensiblityElement(output.getExtensibilityElements(),
                MIMEMultipartRelated.class);

        return getContentParts(part, multipartOutput);
    }

    public static MIMEContent[] getInputMultipartContent(Part part, BindingOperation operation) {
        BindingInput bindingInput = operation.getBindingInput();
        if (bindingInput == null)
            return new MIMEContent[0];

        MIMEMultipartRelated multipartInput = WsdlUtils
                .getExtensiblityElement(bindingInput.getExtensibilityElements(), MIMEMultipartRelated.class);

        return getContentParts(part, multipartInput);
    }

    public static MIMEContent[] getContentParts(Part part, MIMEMultipartRelated multipart) {
        List<MIMEContent> result = new ArrayList<MIMEContent>();

        if (multipart != null) {
            List<MIMEPart> parts = multipart.getMIMEParts();

            for (int c = 0; c < parts.size(); c++) {
                List<MIMEContent> contentParts = WsdlUtils
                        .getExtensiblityElements(parts.get(c).getExtensibilityElements(), MIMEContent.class);

                for (MIMEContent content : contentParts) {
                    if (content.getPart().equals(part.getName()))
                        result.add(content);
                }
            }
        }

        return result.toArray(new MIMEContent[result.size()]);
    }

    public static Part[] getFaultParts(BindingOperation bindingOperation, String faultName) throws Exception {
        List<Part> result = new ArrayList<Part>();

        BindingFault bindingFault = bindingOperation.getBindingFault(faultName);
        SOAPFault soapFault = WsdlUtils.getExtensiblityElement(bindingFault.getExtensibilityElements(),
                SOAPFault.class);

        Operation operation = bindingOperation.getOperation();
        if (soapFault != null && soapFault.getName() != null) {
            Fault fault = operation.getFault(soapFault.getName());
            if (fault == null)
                throw new Exception(
                        "Missing Fault [" + soapFault.getName() + "] in operation [" + operation.getName() + "]");
            result.addAll(fault.getMessage().getOrderedParts(null));
        } else {
            SOAP12Fault soap12Fault = WsdlUtils.getExtensiblityElement(bindingFault.getExtensibilityElements(),
                    SOAP12Fault.class);

            if (soap12Fault != null && soap12Fault.getName() != null) {
                Fault fault = operation.getFault(soap12Fault.getName());
                if (fault != null && fault.getMessage() != null)
                    result.addAll(fault.getMessage().getOrderedParts(null));
            } else {
                Fault fault = operation.getFault(faultName);
                if (fault != null && fault.getMessage() != null)
                    result.addAll(fault.getMessage().getOrderedParts(null));
            }
        }

        return result.toArray(new Part[result.size()]);
    }

    //   public static String findSoapFaultPartName( SoapVersion soapVersion, BindingOperation bindingOperation,
    //         String message ) throws Exception
    //   {
    //      if( WsdlUtils.isOutputSoapEncoded( bindingOperation ) )
    //         throw new Exception( "SOAP-Encoded operations not supported" );
    //
    //      // XmlObject xml = XmlObject.Factory.parse( message );
    //      XmlObject xml = XmlUtils.createXmlObject( message );
    //      XmlObject[] msgPaths = xml.selectPath( "declare namespace env='" + soapVersion.getEnvelopeNamespace() + "';"
    //            + "$this/env:Envelope/env:Body/env:Fault" );
    //      if( msgPaths.length == 0 )
    //         return null;
    //
    //      XmlObject msgXml = msgPaths[0];
    //
    //      Map faults = bindingOperation.getBindingFaults();
    //      for( Iterator<BindingFault> i = faults.values().iterator(); i.hasNext(); )
    //      {
    //         BindingFault bindingFault = i.next();
    //         String faultName = bindingFault.getName();
    //         Part[] faultParts = WsdlUtils.getFaultParts( bindingOperation, faultName );
    //         Part part = faultParts[0];
    //
    //         QName elementName = part.getElementName();
    //         if( elementName != null )
    //         {
    //            XmlObject[] faultPaths = msgXml.selectPath( "declare namespace env='" + soapVersion.getEnvelopeNamespace()
    //                  + "';" + "declare namespace ns='" + elementName.getNamespaceURI() + "';" + "//env:Fault/detail/ns:"
    //                  + elementName.getLocalPart() );
    //
    //            if( faultPaths.length == 1 )
    //               return faultName;
    //         }
    //         // this is not allowed by Basic Profile.. remove?
    //         else if( part.getTypeName() != null )
    //         {
    //            QName typeName = part.getTypeName();
    //            XmlObject[] faultPaths = msgXml.selectPath( "declare namespace env='" + soapVersion.getEnvelopeNamespace()
    //                  + "';" + "declare namespace ns='" + typeName.getNamespaceURI() + "';" + "//env:Fault/detail/ns:"
    //                  + part.getName() );
    //
    //            if( faultPaths.length == 1 )
    //               return faultName;
    //         }
    //      }
    //
    //      return null;
    //   }

    public static Part[] getOutputParts(BindingOperation operation) {
        BindingOutput bindingOutput = operation.getBindingOutput();
        if (bindingOutput == null)
            return new Part[0];

        List<Part> result = new ArrayList<Part>();
        Output output = operation.getOperation().getOutput();
        if (output == null)
            return new Part[0];

        Message msg = output.getMessage();
        if (msg != null) {
            SOAPBody soapBody = WsdlUtils.getExtensiblityElement(bindingOutput.getExtensibilityElements(),
                    SOAPBody.class);

            if (soapBody == null || soapBody.getParts() == null) {
                SOAP12Body soap12Body = WsdlUtils.getExtensiblityElement(bindingOutput.getExtensibilityElements(),
                        SOAP12Body.class);

                if (soap12Body == null || soap12Body.getParts() == null) {
                    result.addAll(msg.getOrderedParts(null));
                } else {
                    Iterator i = soap12Body.getParts().iterator();
                    while (i.hasNext()) {
                        String partName = (String) i.next();
                        Part part = msg.getPart(partName);

                        result.add(part);
                    }
                }
            } else {
                Iterator i = soapBody.getParts().iterator();
                while (i.hasNext()) {
                    String partName = (String) i.next();
                    Part part = msg.getPart(partName);

                    result.add(part);
                }
            }
        } else {
            log.warn("Missing output message for binding operation [" + operation.getName() + "]");
        }

        return result.toArray(new Part[result.size()]);
    }

    public static boolean isMultipartRequest(Definition definition, BindingOperation bindingOperation) {
        return WsdlUtils.getExtensiblityElement(bindingOperation.getBindingInput().getExtensibilityElements(),
                MIMEMultipartRelated.class) != null;
    }

    //   public static String getUsingAddressing( ElementExtensible item )
    //   {
    //      String version = WsaVersionTypeConfig.NONE.toString();
    //
    //      Element[] usingAddressingElements = WsdlUtils.getExentsibilityElements( item, new QName(
    //            "http://www.w3.org/2006/05/addressing/wsdl", "UsingAddressing" ) );
    //      if( usingAddressingElements.length == 0 )
    //      {
    //         usingAddressingElements = WsdlUtils.getExentsibilityElements( item, new QName(
    //               "http://www.w3.org/2006/02/addressing/wsdl", "UsingAddressing" ) );
    //      }
    //
    //      if( usingAddressingElements.length != 0 )
    //      {
    //         // this should resolve wsdl version, not addressing version??? what is
    //         // the connection?
    //         String addressingVersion = usingAddressingElements[0].getAttributeNS( WSDL_NAMESPACE, "required" );
    //         if( addressingVersion != null && addressingVersion.equals( "true" ) )
    //         {
    //            version = WsaVersionTypeConfig.X_200508.toString();
    //         }
    //
    //      }
    //      return version;
    //   }

    private static String checkIfWsaPolicy(String version, Element policy) {
        // Policy builtPolicy = new
        // WsaPolicy().buildPolicy(policy.getTextContent());
        // policy = WsaPolicy.normalize(policy);

        // check if found reference is addressing policy
        // Element wsAddressing = XmlUtils.getFirstChildElementNS(policy,
        // WsaUtils.WSAM_NAMESPACE, "Addressing");
        // Element addressingPolicy = null;
        // if (wsAddressing != null)
        // {
        // String optional =
        // wsAddressing.getAttributeNS(WsaPolicy.WS_POLICY_NAMESPACE, "Optional");
        // addressingPolicy = XmlUtils.getFirstChildElementNS(wsAddressing,
        // WsaPolicy.WS_POLICY_NAMESPACE, "Policy");
        // if (addressingPolicy != null)
        // {
        // if (StringUtils.isNullOrEmpty(optional) || optional.equals("false") ||
        // (optional.equals("true") &&
        // SoapUI.getSettings().getBoolean(WsaSettings.ENABLE_FOR_OPTIONAL)) )
        // {
        // version = WsaVersionTypeConfig.X_200508.toString();
        // }
        // //check if policy has Anonymous
        // Element anonymousElm =
        // XmlUtils.getFirstChildElementNS(addressingPolicy, new
        // QName(WsaPolicy.WSAM_NAMESPACE,"AnonymousResponses"));
        // if (anonymousElm != null)
        // {
        // //TODO anonymous = required
        // } else {
        // Element nonAnonymousElement =
        // XmlUtils.getFirstChildElementNS(addressingPolicy, new
        // QName(WsaPolicy.WSAM_NAMESPACE,"NonAnonymousResponses"));
        // if (nonAnonymousElement != null)
        // {
        // //TODO anonymous = prohibited
        // }
        // }
        // }
        // }
        return version;
    }

    //   public static String getWsaPolicyAnonymous( Element policy )
    //   {
    //      String version = WsaVersionTypeConfig.NONE.toString();
    //      String anonymous = AnonymousTypeConfig.OPTIONAL.toString();
    //      // check if found reference is addressing policy
    //      Element wsAddressing = XmlUtils.getFirstChildElementNS( policy, WsaUtils.WS_A_NAMESPACE_200705, "Addressing" );
    //      Element addressingPolicy = null;
    //      if( wsAddressing != null )
    //      {
    //         String optional = wsAddressing.getAttributeNS( PolicyUtils.WS_W3_POLICY_NAMESPACE, "Optional" );
    //         addressingPolicy = XmlUtils
    //               .getFirstChildElementNS( wsAddressing, PolicyUtils.WS_W3_POLICY_NAMESPACE, "Policy" );
    //         if( addressingPolicy != null )
    //         {
    //            if( StringUtils.isBlank( optional ) || optional.equals( "false" )
    //                  || ( optional.equals( "true" ) && SoapUI.getSettings().getBoolean( WsaSettings.ENABLE_FOR_OPTIONAL ) ) )
    //            {
    //               version = WsaVersionTypeConfig.X_200508.toString();
    //            }
    //            // check if policy has Anonymous
    //            Element anonymousElm = XmlUtils.getFirstChildElementNS( addressingPolicy, new QName(
    //                  WsaUtils.WS_A_NAMESPACE_200705, "AnonymousResponses" ) );
    //            if( anonymousElm != null )
    //            {
    //               anonymous = AnonymousTypeConfig.REQUIRED.toString();
    //            }
    //            else
    //            {
    //               Element nonAnonymousElement = XmlUtils.getFirstChildElementNS( addressingPolicy, new QName(
    //                     WsaUtils.WS_A_NAMESPACE_200705, "NonAnonymousResponses" ) );
    //               if( nonAnonymousElement != null )
    //               {
    //                  anonymous = AnonymousTypeConfig.PROHIBITED.toString();
    //               }
    //            }
    //         }
    //      }
    //      return anonymous;
    //   }

    public static String getSoapEndpoint(Port port) {
        SOAPAddress soapAddress = WsdlUtils.getExtensiblityElement(port.getExtensibilityElements(),
                SOAPAddress.class);
        if (soapAddress != null && StringUtils.isNotBlank(soapAddress.getLocationURI())) {
            try {
                return URLDecoder.decode(soapAddress.getLocationURI(), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return soapAddress.getLocationURI();
            }
        }

        SOAP12Address soap12Address = WsdlUtils.getExtensiblityElement(port.getExtensibilityElements(),
                SOAP12Address.class);
        if (soap12Address != null && StringUtils.isNotBlank(soap12Address.getLocationURI())) {
            try {
                return URLDecoder.decode(soap12Address.getLocationURI(), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return soap12Address.getLocationURI();
            }
        }

        return null;
    }

    public static boolean replaceSoapEndpoint(Port port, String endpoint) {
        SOAPAddress soapAddress = WsdlUtils.getExtensiblityElement(port.getExtensibilityElements(),
                SOAPAddress.class);
        if (soapAddress != null) {
            soapAddress.setLocationURI(endpoint);
            return true;
        }

        SOAP12Address soap12Address = WsdlUtils.getExtensiblityElement(port.getExtensibilityElements(),
                SOAP12Address.class);
        if (soap12Address != null) {
            soap12Address.setLocationURI(endpoint);
            return true;
        }

        return false;
    }

    public static String getSoapBodyNamespace(List<?> list) {
        SOAPBody soapBody = WsdlUtils.getExtensiblityElement(list, SOAPBody.class);
        if (soapBody != null)
            return soapBody.getNamespaceURI();

        SOAP12Body soap12Body = WsdlUtils.getExtensiblityElement(list, SOAP12Body.class);
        if (soap12Body != null)
            return soap12Body.getNamespaceURI();

        return null;
    }

    public static final class NonSchemaImportingWsdlReaderImpl extends WSDLReaderImpl {
        @SuppressWarnings("unchecked")
        @Override
        protected ExtensibilityElement parseSchema(Class parentType, Element el, Definition def,
                ExtensionRegistry extReg) throws WSDLException {
            QName elementType = QNameUtils.newQName(el);

            ExtensionDeserializer exDS = extReg.queryDeserializer(parentType, elementType);

            // Now unmarshall the DOM element.
            ExtensibilityElement ee = exDS.unmarshall(parentType, elementType, el, def, extReg);

            return ee;
        }

    }

    /**
     * A SOAP-Header wrapper
     * 
     * @author ole.matzura
     */

    public interface SoapHeader {
        public QName getMessage();

        public String getPart();
    }

    /**
     * SOAP 1.1 Header implementation
     * 
     * @author ole.matzura
     */

    public static class Soap11Header implements SoapHeader {
        private final SOAPHeader soapHeader;

        public Soap11Header(SOAPHeader soapHeader) {
            this.soapHeader = soapHeader;
        }

        public QName getMessage() {
            return soapHeader.getMessage();
        }

        public String getPart() {
            return soapHeader.getPart();
        }
    }

    /**
     * SOAP 1.2 Header implementation
     * 
     * @author ole.matzura
     */

    public static class Soap12Header implements SoapHeader {
        private final SOAP12Header soapHeader;

        public Soap12Header(SOAP12Header soapHeader) {
            this.soapHeader = soapHeader;
        }

        public QName getMessage() {
            return soapHeader.getMessage();
        }

        public String getPart() {
            return soapHeader.getPart();
        }
    }

    public static List<SoapHeader> getSoapHeaders(List list) {
        List<SoapHeader> result = new ArrayList<SoapHeader>();

        List<SOAPHeader> soapHeaders = WsdlUtils.getExtensiblityElements(list, SOAPHeader.class);
        if (soapHeaders != null && !soapHeaders.isEmpty()) {
            for (SOAPHeader header : soapHeaders)
                result.add(new Soap11Header(header));
        } else {
            List<SOAP12Header> soap12Headers = WsdlUtils.getExtensiblityElements(list, SOAP12Header.class);
            if (soap12Headers != null && !soap12Headers.isEmpty()) {
                for (SOAP12Header header : soap12Headers)
                    result.add(new Soap12Header(header));
            }
        }

        return result;
    }

    //   public static synchronized Definition readDefinition( String wsdlUrl ) throws Exception
    //   {
    //      if( wsdlReader == null )
    //      {
    //         WSDLFactory factory = WSDLFactory.newInstance();
    //         wsdlReader = factory.newWSDLReader();
    //         wsdlReader.setFeature( "javax.wsdl.verbose", true );
    //         wsdlReader.setFeature( "javax.wsdl.importDocuments", true );
    //      }
    //
    //      return wsdlReader.readWSDL( new UrlWsdlLoader( wsdlUrl ) );
    //   }

    //   public static SchemaType getSchemaTypeForPart( WsdlContext wsdlContext, javax.wsdl.Part part ) throws Exception
    //   {
    //      SchemaType schemaType = null;
    //      QName elementName = part.getElementName();
    //
    //      if( elementName != null )
    //      {
    //         SchemaGlobalElement elm = wsdlContext.getSchemaTypeLoader().findElement( elementName );
    //         if( elm != null )
    //         {
    //            schemaType = elm.getType();
    //         }
    //         else
    //            WsdlRequest.log.error( "Could not find element [" + elementName + "] specified in part [" + part.getName()
    //                  + "]" );
    //      }
    //      else
    //      {
    //         QName typeName = part.getTypeName();
    //
    //         if( typeName != null )
    //         {
    //            schemaType = wsdlContext.getSchemaTypeLoader().findType( typeName );
    //
    //            if( schemaType == null )
    //            {
    //               WsdlRequest.log.error( "Could not find type [" + typeName + "] specified in part [" + part.getName()
    //                     + "]" );
    //            }
    //         }
    //      }
    //      return schemaType;
    //   }

    //   public static SchemaGlobalElement getSchemaElementForPart( WsdlContext wsdlContext, javax.wsdl.Part part )
    //         throws Exception
    //   {
    //      QName elementName = part.getElementName();
    //
    //      if( elementName != null )
    //      {
    //         return wsdlContext.getSchemaTypeLoader().findElement( elementName );
    //      }
    //
    //      return null;
    //   }

    //   public static String replacePortEndpoint( WsdlInterface iface, InputSource inputSource, String endpoint )
    //         throws WSDLException
    //   {
    //      WSDLReader wsdlReader = new NonSchemaImportingWsdlReaderImpl();
    //
    //      wsdlReader.setFeature( "javax.wsdl.verbose", true );
    //      wsdlReader.setFeature( "javax.wsdl.importDocuments", false );
    //
    //      Definition definition = wsdlReader.readWSDL( null, inputSource );
    //
    //      boolean updated = false;
    //      Map map = definition.getServices();
    //      for( Iterator i = map.values().iterator(); i.hasNext(); )
    //      {
    //         Service service = (Service)i.next();
    //         Map portMap = service.getPorts();
    //         for( Iterator i2 = portMap.values().iterator(); i2.hasNext(); )
    //         {
    //            Port port = (Port)i2.next();
    //            if( port.getBinding().getQName().equals( iface.getBindingName() ) )
    //            {
    //               if( replaceSoapEndpoint( port, endpoint ) )
    //                  updated = true;
    //            }
    //         }
    //      }
    //
    //      if( updated )
    //      {
    //         StringWriter writer = new StringWriter();
    //
    //         Map nsMap = definition.getNamespaces();
    //         if( !nsMap.values().contains( Constants.SOAP_HTTP_BINDING_NS ) )
    //            definition.addNamespace( "soaphttp", Constants.SOAP_HTTP_BINDING_NS );
    //
    //         new WSDLWriterImpl().writeWSDL( definition, writer );
    //         return writer.toString();
    //      }
    //
    //      return null;
    //   }

    public static BindingOperation findBindingOperation(Binding binding, String bindingOperationName,
            String inputName, String outputName) {
        if (binding == null)
            return null;

        if (inputName == null)
            inputName = ":none";

        if (outputName == null)
            outputName = ":none";

        BindingOperation result = binding.getBindingOperation(bindingOperationName, inputName, outputName);

        if (result == null && (inputName.equals(":none") || outputName.equals(":none"))) {
            // fall back to this behaviour for WSDL4j 1.5.0 compatibility
            result = binding.getBindingOperation(bindingOperationName, inputName.equals(":none") ? null : inputName,
                    outputName.equals(":none") ? null : outputName);
        }
        return result;
    }

    public static boolean isHeaderInputPart(Part part, Message message, BindingOperation bindingOperation) {
        List<SOAPHeader> headers = WsdlUtils.getExtensiblityElements(
                bindingOperation.getBindingInput().getExtensibilityElements(), SOAPHeader.class);

        if (headers == null || headers.isEmpty())
            return false;

        for (SOAPHeader header : headers) {
            if (message.getQName().equals(header.getMessage()) && part.getName().equals(header.getPart()))
                return true;
        }

        return false;
    }

    public static boolean isHeaderOutputPart(Part part, Message message, BindingOperation bindingOperation) {
        BindingOutput bindingOutput = bindingOperation.getBindingOutput();
        List<SOAPHeader> headers = bindingOutput == null ? null
                : WsdlUtils.getExtensiblityElements(bindingOutput.getExtensibilityElements(), SOAPHeader.class);

        if (headers == null || headers.isEmpty())
            return false;

        for (SOAPHeader header : headers) {
            if (message.getQName().equals(header.getMessage()) && part.getName().equals(header.getPart()))
                return true;
        }

        return false;
    }

    //   public static DefinitionCacheConfig cacheWsdl( DefinitionLoader loader ) throws Exception
    //   {
    //      DefinitionCacheConfig definitionCache = DefinitionCacheConfig.Factory.newInstance();
    //      definitionCache.setRootPart( loader.getBaseURI() );
    //      definitionCache.setType( DefinitionCacheTypeConfig.TEXT );
    //
    //      Map<String, XmlObject> urls = SchemaUtils.getDefinitionParts( loader );
    //
    //      for( Iterator<String> i = urls.keySet().iterator(); i.hasNext(); )
    //      {
    //         DefintionPartConfig definitionPart = definitionCache.addNewPart();
    //         String url = i.next();
    //         definitionPart.setUrl( url );
    //         XmlObject xmlObject = urls.get( url );
    //         Node domNode = xmlObject.getDomNode();
    //
    //         if( domNode.getNodeType() == Node.DOCUMENT_FRAGMENT_NODE )
    //         {
    //            Node node = ( ( DocumentFragment )domNode ).getFirstChild();
    //            if( node.getNodeType() == Node.TEXT_NODE )
    //            {
    //               domNode = XmlUtils.parseXml( node.getNodeValue() );
    //               // xmlObject = XmlObject.Factory.parse( domNode );
    //               xmlObject = XmlUtils.createXmlObject( domNode );
    //            }
    //         }
    //
    //         Element contentElement = ( ( Document )domNode ).getDocumentElement();
    //
    //         Node newDomNode = definitionPart.addNewContent().getDomNode();
    //         newDomNode.appendChild( newDomNode.getOwnerDocument().createTextNode( xmlObject.toString() ) );
    //         definitionPart.setType( contentElement.getNamespaceURI() );
    //      }
    //
    //      return definitionCache;
    //   }

    //   public static void getAnonymous( WsdlOperation wsdlOperation )
    //   {
    //      String anonymous = "";
    //
    //      Element[] anonymousElements = WsdlUtils.getExentsibilityElements( wsdlOperation.getBindingOperation(), new QName(
    //            "http://www.w3.org/2006/05/addressing/wsdl", "Anonymous" ) );
    //      if( anonymousElements.length == 0 )
    //      {
    //         anonymousElements = WsdlUtils.getExentsibilityElements( wsdlOperation.getBindingOperation(), new QName(
    //               "http://www.w3.org/2006/02/addressing/wsdl", "Anonymous" ) );
    //      }
    //
    //      if( anonymousElements != null && anonymousElements.length > 0 )
    //      {
    //         anonymous = XmlUtils.getElementText( anonymousElements[0] );
    //      }
    //      wsdlOperation.setAnonymous( anonymous );
    //   }

    //   public static String getDefaultWsaAction( WsdlOperation operation, boolean output )
    //   {
    //      // SOAP 1.1 specific handling
    //      if( operation.getInterface().getSoapVersion() == SoapVersion.Soap11
    //            && StringUtils.hasContent( operation.getAction() )
    //            && SoapUI.getSettings().getBoolean( WsaSettings.SOAP_ACTION_OVERRIDES_WSA_ACTION ) )
    //         return operation.getAction();
    //
    //      try
    //      {
    //         if( operation.getBindingOperation() == null || operation.getBindingOperation().getOperation() == null )
    //            return null;
    //
    //         AttributeExtensible attributeExtensible = output ? operation.getBindingOperation().getOperation().getOutput()
    //               : operation.getBindingOperation().getOperation().getInput();
    //
    //         if( attributeExtensible == null )
    //            return null;
    //
    //         // String[] attrs =
    //         // WsdlUtils.getExentsibilityAttributes(attributeExtensible, new QName(
    //         // WsaUtils.WS_A_NAMESPACE_200408, "Action"));
    //         // if (attrs == null || attrs.length == 0)
    //         // attrs = WsdlUtils.getExentsibilityAttributes(attributeExtensible,
    //         // new QName(WsaUtils.WS_A_NAMESPACE_200508,
    //         // "Action"));
    //         // if (attrs != null && attrs.length > 0)
    //         // {
    //         // return attrs[0];
    //         // }
    //         String[] attrs;
    //         for( String namespace : WsaUtils.wsaNamespaces )
    //         {
    //            attrs = WsdlUtils.getExentsibilityAttributes( attributeExtensible, new QName( namespace, "Action" ) );
    //            if( attrs != null && attrs.length > 0 )
    //            {
    //               return attrs[0];
    //            }
    //         }
    //
    //         WsdlInterface iface = operation.getInterface();
    //
    //         Definition definition = iface.getWsdlContext().getDefinition();
    //         String targetNamespace = WsdlUtils.getTargetNamespace( definition );
    //         String portTypeName = iface.getBinding().getPortType().getQName().getLocalPart();
    //         String operationName = operation.getName();
    //         if( !StringUtils.isNullOrEmpty( operationName ) )
    //         {
    //            Operation op = iface.getBinding().getPortType().getOperation( operationName, null, null );
    //            if( op != null )
    //            {
    //               attributeExtensible = output ? op.getOutput() : op.getInput();
    //               attrs = WsdlUtils.getExentsibilityAttributes( attributeExtensible, new QName(
    //                     WsaUtils.WS_A_NAMESPACE_200705, "Action" ) );
    //               if( attrs != null && attrs.length > 0 )
    //               {
    //                  return attrs[0];
    //               }
    //            }
    //         }
    //         String operationInOutName = output ? operation.getOutputName() : operation.getInputName();
    //         if( operationInOutName == null )
    //            operationInOutName = operation.getName() + ( output ? "Response" : "Request" );
    //
    //         StringBuffer result = new StringBuffer( targetNamespace );
    //         if( targetNamespace.length() > 0 && targetNamespace.charAt( targetNamespace.length() - 1 ) != '/'
    //               && portTypeName.charAt( 0 ) != '/' )
    //            result.append( '/' );
    //         result.append( portTypeName );
    //         if( portTypeName.charAt( portTypeName.length() - 1 ) != '/' && operationInOutName.charAt( 0 ) != '/' )
    //            result.append( '/' );
    //         result.append( operationInOutName );
    //
    //         return result.toString();
    //      }
    //      catch( Exception e )
    //      {
    //         e.printStackTrace();
    //         log.warn( e.toString() );
    //         return null;
    //      }
    //   }
    //
    //   public static void setDefaultWsaAction( WsaConfig wsaConfig, boolean b )
    //   {
    //      String defaultAction = getDefaultWsaAction( wsaConfig.getWsaContainer().getOperation(), b );
    //      if( StringUtils.hasContent( defaultAction ) )
    //         wsaConfig.setAction( defaultAction );
    //   }
    //
    //   public static String getRequestWsaMessageId( WsdlMessageExchange messageExchange, String wsaVersionNameSpace )
    //   {
    //      String requestMessageId = null;
    //      try
    //      {
    //         // XmlObject xmlObject = XmlObject.Factory.parse(
    //         // messageExchange.getRequestContent() );
    //         XmlObject xmlObject = XmlUtils.createXmlObject( messageExchange.getRequestContent() );
    //         SoapVersion soapVersion = messageExchange.getOperation().getInterface().getSoapVersion();
    //
    //         Element header = ( Element )SoapUtils.getHeaderElement( xmlObject, soapVersion, true ).getDomNode();
    //         Element msgNode = XmlUtils.getFirstChildElementNS( header, wsaVersionNameSpace, "MessageID" );
    //         if( msgNode != null )
    //         {
    //            requestMessageId = XmlUtils.getElementText( msgNode );
    //         }
    //      }
    //      catch( XmlException e )
    //      {
    //         e.printStackTrace();
    //         log.warn( e.toString() );
    //         return null;
    //      }
    //      return requestMessageId;
    //   }

    //   public static NodeList getRequestReplyToRefProps( WsdlMessageExchange messageExchange, String wsaVersionNameSpace )
    //   {
    //      try
    //      {
    //         // XmlObject xmlObject = XmlObject.Factory.parse(
    //         // messageExchange.getRequestContent() );
    //         XmlObject xmlObject = XmlUtils.createXmlObject( messageExchange.getRequestContent() );
    //         SoapVersion soapVersion = messageExchange.getOperation().getInterface().getSoapVersion();
    //
    //         Element header = ( Element )SoapUtils.getHeaderElement( xmlObject, soapVersion, true ).getDomNode();
    //         Element replyToNode = XmlUtils.getFirstChildElementNS( header, wsaVersionNameSpace, "ReplyTo" );
    //         Element replyRefParamsNode = XmlUtils.getFirstChildElementNS( replyToNode, wsaVersionNameSpace,
    //               "ReferenceParameters" );
    //         if( replyRefParamsNode != null )
    //         {
    //            return XmlUtils.getChildElements( replyRefParamsNode );
    //         }
    //      }
    //      catch( XmlException e )
    //      {
    //         e.printStackTrace();
    //         log.warn( e.toString() );
    //      }
    //      return null;
    //   }

    //   public static NodeList getRequestFaultToRefProps( WsdlMessageExchange messageExchange, String wsaVersionNameSpace )
    //   {
    //      try
    //      {
    //         // XmlObject xmlObject = XmlObject.Factory.parse(
    //         // messageExchange.getRequestContent() );
    //         XmlObject xmlObject = XmlUtils.createXmlObject( messageExchange.getRequestContent() );
    //         SoapVersion soapVersion = messageExchange.getOperation().getInterface().getSoapVersion();
    //
    //         Element header = ( Element )SoapUtils.getHeaderElement( xmlObject, soapVersion, true ).getDomNode();
    //         Element faultToNode = XmlUtils.getFirstChildElementNS( header, wsaVersionNameSpace, "FaultTo" );
    //         Element faultRefParamsNode = XmlUtils.getFirstChildElementNS( faultToNode, wsaVersionNameSpace,
    //               "ReferenceParameters" );
    //         if( faultRefParamsNode != null )
    //         {
    //            return XmlUtils.getChildElements( faultRefParamsNode );
    //         }
    //      }
    //      catch( XmlException e )
    //      {
    //         e.printStackTrace();
    //         log.warn( e.toString() );
    //      }
    //      return null;
    //   }

    //   public static String getFaultCode( WsdlMessageExchange messageExchange )
    //   {
    //      try
    //      {
    //         // XmlObject xmlObject = XmlObject.Factory.parse(
    //         // messageExchange.getResponseContent() );
    //         XmlObject xmlObject = XmlUtils.createXmlObject( messageExchange.getResponseContent() );
    //         SoapVersion soapVersion = messageExchange.getOperation().getInterface().getSoapVersion();
    //
    //         Element body = ( Element )SoapUtils.getBodyElement( xmlObject, soapVersion ).getDomNode();
    //         Element soapenvFault = XmlUtils.getFirstChildElementNS( body, "http://schemas.xmlsoap.org/soap/envelope/",
    //               "Fault" );
    //         Element faultCode = XmlUtils.getFirstChildElement( soapenvFault, "faultcode" );
    //         if( faultCode != null )
    //         {
    //            return XmlUtils.getElementText( faultCode );
    //         }
    //      }
    //      catch( XmlException e )
    //      {
    //         e.printStackTrace();
    //         log.warn( e.toString() );
    //      }
    //      return null;
    //   }

    public static String getTargetNamespace(Definition definition) {
        return definition.getTargetNamespace() == null ? XMLConstants.NULL_NS_URI : definition.getTargetNamespace();
    }

    //   public static SchemaType generateRpcBodyType( WsdlOperation operation )
    //   {
    //      return XmlString.type;
    //   }
}