/**
  * Execute this configuration handler.
  *
  * @param      AgaviXmlConfigDomDocument The document to parse.
  *
  * @return     string Data to be written to a cache file.
  *
  * @throws     <b>AgaviParseException</b> If a requested configuration file is
  *                                        improperly formatted.
  *
  * @author     David Zülke <*****@*****.**>
  * @since      0.11.0
  */
 public function execute(AgaviXmlConfigDomDocument $doc)
 {
     $ro = $this->context->getRouting();
     $cleanAppName = preg_replace('/\\W/', '', AgaviConfig::get('core.app_name'));
     $xpath = new DOMXPath($doc);
     $xpath->registerNamespace('soap', 'http://schemas.xmlsoap.org/wsdl/soap/');
     $xpath->registerNamespace('wsdl', 'http://schemas.xmlsoap.org/wsdl/');
     $paramWsdlDefinitionsName = $ro->getParameter('wsdl_generator[wsdl][definitions][name]', $cleanAppName);
     $paramSoapAddressLocation = $ro->getParameter('wsdl_generator[soap][address][location]');
     $paramSoapBindingStyle = $ro->getParameter('wsdl_generator[soap][binding][style]', 'rpc');
     $paramSoapBindingTransport = $ro->getParameter('wsdl_generator[soap][binding][transport]', 'http://schemas.xmlsoap.org/soap/http');
     $paramSoapBodyUse = $ro->getParameter('wsdl_generator[soap][body][use]', 'literal');
     $paramSoapBodyNamespace = $ro->getParameter('wsdl_generator[soap][body][namespace]', null);
     $paramSoapBodyEncodingStyle = $ro->getParameter('wsdl_generator[soap][body][encoding_style]', 'http://schemas.xmlsoap.org/soap/encoding/');
     $paramSoapHeaderUse = $ro->getParameter('wsdl_generator[soap][header][use]', 'literal');
     $paramSoapHeaderNamespace = $ro->getParameter('wsdl_generator[soap][header][namespace]', null);
     $paramSoapHeaderEncodingStyle = $ro->getParameter('wsdl_generator[soap][header][encoding_style]', 'http://schemas.xmlsoap.org/soap/encoding/');
     $paramSoapFaultUse = $ro->getParameter('wsdl_generator[soap][fault][use]', 'encoded');
     $paramSoapFaultNamespace = $ro->getParameter('wsdl_generator[soap][fault][namespace]', null);
     $paramSoapFaultEncodingStyle = $ro->getParameter('wsdl_generator[soap][fault][encoding_style]', 'http://schemas.xmlsoap.org/soap/encoding/');
     $paramGlobalRequestHeaders = $ro->getParameter('wsdl_generator[global_headers][request]', array());
     $paramGlobalResponseHeaders = $ro->getParameter('wsdl_generator[global_headers][response]', array());
     $wsdlDefinitions = $xpath->query('/wsdl:definitions');
     foreach ($wsdlDefinitions as $wsdlDefinition) {
         $targetNamespaceUri = $wsdlDefinition->getAttribute('targetNamespace');
         $targetNamespacePrefix = $wsdlDefinition->lookupPrefix($targetNamespaceUri);
         $wsdlDefinition->setAttribute('name', $paramWsdlDefinitionsName);
         $wsdlBindings = $xpath->query('wsdl:binding', $wsdlDefinition);
         foreach ($wsdlBindings as $wsdlBinding) {
             $wsdlBinding->setAttribute('name', $paramWsdlDefinitionsName . 'Binding');
             $wsdlBinding->setAttribute('type', $targetNamespacePrefix . ':' . $paramWsdlDefinitionsName . 'PortType');
             $soapBindings = $xpath->query('soap:binding', $wsdlBinding);
             foreach ($soapBindings as $soapBinding) {
                 $soapBinding->setAttribute('style', $paramSoapBindingStyle);
                 $soapBinding->setAttribute('transport', $paramSoapBindingTransport);
             }
             $wsdlOperations = $xpath->query('wsdl:operation', $wsdlBinding);
             foreach ($wsdlOperations as $wsdlOperation) {
                 foreach (array('input' => $paramGlobalRequestHeaders, 'output' => $paramGlobalResponseHeaders) as $target => $headers) {
                     foreach ($headers as $header) {
                         if (!isset($header['namespace'])) {
                             $header['namespace'] = $targetNamespaceUri;
                         }
                         $element = $doc->createElementNS('http://schemas.xmlsoap.org/wsdl/soap/', 'soap:header');
                         foreach (array('encodingStyle', 'message', 'namespace', 'part', 'use') as $key) {
                             if (isset($header[$key])) {
                                 $element->setAttribute($key, $header[$key]);
                             }
                         }
                         $wsdlOperation->getElementsByTagNameNS('http://schemas.xmlsoap.org/wsdl/', $target)->item(0)->appendChild($element);
                     }
                 }
                 if ($paramSoapBodyNamespace !== null) {
                     $soapOperations = $xpath->query('soap:operation', $wsdlOperation);
                     foreach ($soapOperations as $soapOperation) {
                         $soapOperation->setAttribute('soapAction', $paramSoapBodyNamespace . '#' . $wsdlOperation->getAttribute('name'));
                     }
                 }
                 $soapBodies = $xpath->query('.//soap:body', $wsdlOperation);
                 foreach ($soapBodies as $soapBody) {
                     if (!$soapBody->hasAttribute('use')) {
                         $soapBody->setAttribute('use', $paramSoapBodyUse);
                     }
                     if ($paramSoapBodyNamespace !== null) {
                         $soapBody->setAttribute('namespace', $paramSoapBodyNamespace);
                     } elseif ($soapBody->getAttribute('use') == 'literal' && $paramSoapBindingStyle == 'document') {
                         $soapBody->removeAttribute('namespace');
                     }
                     if ($soapBody->getAttribute('use') == 'encoded') {
                         $soapBody->setAttribute('encodingStyle', $paramSoapBodyEncodingStyle);
                     }
                 }
                 $soapHeaders = $xpath->query('.//soap:header', $wsdlOperation);
                 foreach ($soapHeaders as $soapHeader) {
                     if (!$soapHeader->hasAttribute('use')) {
                         $soapHeader->setAttribute('use', $paramSoapHeaderUse);
                     }
                     if ($paramSoapHeaderNamespace !== null) {
                         $soapHeader->setAttribute('namespace', $paramSoapHeaderNamespace);
                     } elseif ($soapHeader->getAttribute('use') == 'literal' && $paramSoapBindingStyle == 'document') {
                         $soapHeader->removeAttribute('namespace');
                     }
                     if ($soapHeader->getAttribute('use') == 'encoded') {
                         $soapHeader->setAttribute('encodingStyle', $paramSoapHeaderEncodingStyle);
                     }
                 }
                 $soapFaults = $xpath->query('.//soap:fault', $wsdlOperation);
                 foreach ($soapFaults as $soapFault) {
                     if (!$soapFault->hasAttribute('use')) {
                         $soapFault->setAttribute('use', $paramSoapFaultUse);
                     }
                     if ($paramSoapFaultNamespace !== null) {
                         $soapFault->setAttribute('namespace', $paramSoapFaultNamespace);
                     } elseif ($soapFault->getAttribute('use') == 'literal' && $paramSoapBindingStyle == 'document') {
                         $soapFault->removeAttribute('namespace');
                     }
                     if ($soapFault->getAttribute('use') == 'encoded') {
                         $soapFault->setAttribute('encodingStyle', $paramSoapFaultEncodingStyle);
                     }
                 }
             }
         }
         $wsdlPortTypes = $xpath->query('wsdl:portType', $wsdlDefinition);
         foreach ($wsdlPortTypes as $wsdlPortType) {
             $wsdlPortType->setAttribute('name', $paramWsdlDefinitionsName . 'PortType');
         }
         $wsdlServices = $xpath->query('wsdl:service', $wsdlDefinition);
         foreach ($wsdlServices as $wsdlService) {
             $wsdlService->setAttribute('name', $paramWsdlDefinitionsName . 'Service');
             $wsdlPorts = $xpath->query('wsdl:port', $wsdlService);
             foreach ($wsdlPorts as $wsdlPort) {
                 $wsdlPort->setAttribute('name', $paramWsdlDefinitionsName . 'Port');
                 $wsdlPort->setAttribute('binding', $targetNamespacePrefix . ':' . $paramWsdlDefinitionsName . 'Binding');
                 $soapAddresses = $xpath->query('soap:address', $wsdlPort);
                 foreach ($soapAddresses as $soapAddress) {
                     $soapAddress->setAttribute('location', $paramSoapAddressLocation);
                 }
             }
         }
     }
     return $doc->saveXML();
 }