Subversion-Projekte lars-tiefland.prado

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

<?php
/**
 * WsdlOperation file.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the BSD License.
 *
 * Copyright(c) 2005 by Marcus Nyeholt. All rights reserved.
 *
 * To contact the author write to {@link mailto:tanus@users.sourceforge.net Marcus Nyeholt}
 * This file is part of the PRADO framework from {@link http://www.xisc.com}
 *
 * @author Marcus Nyeholt               <tanus@users.sourceforge.net>
 * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 * @version $Id: WsdlOperation.php 1689 2007-02-12 12:46:11Z wei $
 * @package System.Web.Services.SOAP
 */

/**
 * Represents a WSDL Operation. This is exported for the portTypes and bindings
 * section of the soap service
 * @author              Marcus Nyeholt          <tanus@users.sourceforge.net>
 * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 * @version     $Revision$
 */
class WsdlOperation
{
        /**
         * The name of the operation
         */
        private $operationName;

        /**
         * Documentation for the operation
         */
        private $documentation;

        /**
         * The input wsdl message
         */
        private $inputMessage;

        /**
         * The output wsdl message
         */
        private $outputMessage;

        public function __construct($name, $doc='')
        {
                $this->operationName = $name;
                $this->documentation = $doc;
        }

        public function setInputMessage(WsdlMessage $msg)
        {
                $this->inputMessage = $msg;
        }

        public function setOutputMessage(WsdlMessage $msg)
        {
                $this->outputMessage = $msg;
        }

        /**
         * Sets the message elements for this operation into the wsdl document
         * @param       DOMElement              $wsdl           The parent domelement for the messages
         * @param       DomDocument             $dom            The dom document to create the messages as children of
         */
        public function setMessageElements(DOMElement $wsdl, DOMDocument $dom)
        {

                $input = $this->inputMessage->getMessageElement($dom);
                $output = $this->outputMessage->getMessageElement($dom);

                $wsdl->appendChild($input);
                $wsdl->appendChild($output);
        }

        /**
         * Get the port operations for this operation
         * @param       DomDocument             $dom            The dom document to create the messages as children of
         * @return      DomElement                                      The dom element representing this port.
         */
        public function getPortOperation(DomDocument $dom)
        {
                $operation = $dom->createElementNS('http://schemas.xmlsoap.org/wsdl/', 'wsdl:operation');
                $operation->setAttribute('name', $this->operationName);

                $documentation = $dom->createElementNS('http://schemas.xmlsoap.org/wsdl/', 'wsdl:documentation', htmlentities($this->documentation));
                $input = $dom->createElementNS('http://schemas.xmlsoap.org/wsdl/', 'wsdl:input');
                $input->setAttribute('message', 'tns:'.$this->inputMessage->getName());
                $output = $dom->createElementNS('http://schemas.xmlsoap.org/wsdl/', 'wsdl:output');
                $output->setAttribute('message', 'tns:'.$this->outputMessage->getName());

                $operation->appendChild($documentation);
                $operation->appendChild($input);
                $operation->appendChild($output);

                return $operation;
        }

        /**
         * Build the binding operations.
         * TODO: Still quite incomplete with all the things being stuck in, I don't understand
         * a lot of it, and it's mostly copied from the output of nusoap's wsdl output.
         * @param       DomDocument             $dom            The dom document to create the binding as children of
         * @param       string                  $namespace      The namespace this binding is in.
         * @return      DomElement                                      The dom element representing this binding.
         */
        public function getBindingOperation(DomDocument $dom, $namespace, $style='rpc')
        {
                $operation = $dom->createElementNS('http://schemas.xmlsoap.org/wsdl/', 'wsdl:operation');
                $operation->setAttribute('name', $this->operationName);

                $soapOperation = $dom->createElementNS('http://schemas.xmlsoap.org/wsdl/soap/', 'soap:operation');
                $method = $this->operationName;
                $soapOperation->setAttribute('soapAction', $namespace.'#'.$method);
                $soapOperation->setAttribute('style', $style);

                $input = $dom->createElementNS('http://schemas.xmlsoap.org/wsdl/', 'wsdl:input');
                $output = $dom->createElementNS('http://schemas.xmlsoap.org/wsdl/', 'wsdl:output');

                $soapBody = $dom->createElementNS('http://schemas.xmlsoap.org/wsdl/soap/', 'soap:body');
                $soapBody->setAttribute('use', 'encoded');
                $soapBody->setAttribute('namespace', $namespace);
                $soapBody->setAttribute('encodingStyle', 'http://schemas.xmlsoap.org/soap/encoding/');
                $input->appendChild($soapBody);
                $output->appendChild(clone $soapBody);

                $operation->appendChild($soapOperation);
                $operation->appendChild($input);
                $operation->appendChild($output);

                return $operation;
        }
}
?>