Exemplo n.º 1
0
/**
 * Generate the payload
 */
function wsf_wsdl_create_response_payload($return_val, $sig_node, $mtom_on, &$attachment_map, $classmap)
{
    require_once 'wsf_wsdl_consts.php';
    require_once 'wsf_wsdl_util.php';
    require_once 'wsf_wsdl_serialization.php';
    $is_doc = TRUE;
    $is_wrapper = FALSE;
    // starting prefix index of the xml to be built
    $prefix_i = 2;
    $res_payload_dom = new DOMDocument('1.0', 'iso-8859-1');
    foreach ($sig_node->childNodes as $signature_child_node) {
        if ($signature_child_node->localName == WSF_RETURNS) {
            $returns_node = $signature_child_node;
            break;
        }
    }
    if (!$returns_node) {
        error_log("Returns node not found", 0);
        return NULL;
    }
    if ($returns_node->hasAttributes()) {
        $ele_name = NULL;
        $ele_ns = NULL;
        if ($returns_node->attributes->getNamedItem(WSF_WRAPPER_ELEMENT)) {
            $ele_name = $returns_node->attributes->getNamedItem(WSF_WRAPPER_ELEMENT)->value;
        }
        if ($returns_node->attributes->getNamedItem(WSF_WRAPPER_ELEMENT_NS)) {
            $ele_ns = $returns_node->attributes->getNamedItem(WSF_WRAPPER_ELEMENT_NS)->value;
        }
        $is_wrapper = TRUE;
    } else {
        /* No wrapper element in the request */
        $ele_ns = NULL;
        $ele_name = NULL;
        /* check for the only param target-namespace */
        $only_param = $returns_node->firstChild;
        $sig_attrs = $only_param->attributes;
        if ($sig_attrs->getNamedItem(WSF_TARGETNAMESPACE)) {
            $ele_ns = $sig_attrs->getNamedItem(WSF_TARGETNAMESPACE)->value;
        }
        if ($sig_attrs->getNamedItem(WSF_NAME)) {
            $ele_name = $sig_attrs->getNamedItem(WSF_NAME)->value;
        }
    }
    $arguments = $return_val;
    /* no wrapper elements most probably getter functions */
    if ($returns_node == NULL) {
        return NULL;
    }
    if ($is_doc == TRUE) {
        $payload_dom = new DOMDocument('1.0', 'iso-8859-1');
        $element = $payload_dom->createElementNS($ele_ns, WSF_STARTING_NS_PREFIX . ":" . $ele_name);
        if (is_object($arguments)) {
            /* this is class map support */
            $new_obj = $arguments;
            $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX);
            wsf_create_payload_for_class_map($payload_dom, $returns_node, $element, $element, $new_obj, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
            $payload_dom->appendChild($element);
            $payload_node = $payload_dom->firstChild;
            $clone_node = $payload_node->cloneNode(TRUE);
            return $payload_dom->saveXML($clone_node);
        } else {
            /* array type implementation */
            $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX);
            wsf_create_payload_for_array($payload_dom, $returns_node, $element, $element, $arguments, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
            $payload_dom->appendChild($element);
            $payload_node = $payload_dom->firstChild;
            $clone_node = $payload_node->cloneNode(TRUE);
            return $payload_dom->saveXML($clone_node);
        }
    } else {
        $payload_dom = new DOMDocument('1.0', 'iso-8859-1');
        $element = $payload_dom->createElementNS($ele_ns, WSF_STARTING_NS_PREFIX . ":" . $ele_name);
        $element->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
        $element->setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
        if (is_object($arguments)) {
            $new_obj = $arguments;
            $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX);
            wsf_create_payload_for_class_map($payload_dom, $returns_node, $element, $element, $new_obj, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
            $payload_dom->appendChild($element);
            $payload_node = $payload_dom->firstChild;
            $clone_node = $payload_node->cloneNode(TRUE);
            return $payload_dom->saveXML($clone_node);
        } else {
            /* array type implementation */
            $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX);
            wsf_create_payload_for_array($payload_dom, $returns_node, $element, $element, $arguments, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
            $payload_dom->appendChild($element);
            $payload_node = $payload_dom->firstChild;
            $clone_node = $payload_node->cloneNode(TRUE);
            return $payload_dom->saveXML($clone_node);
        }
    }
}
Exemplo n.º 2
0
/** 
 * Do serialization over complex schema types
 * @param $sig_param_node sig model for the param
 * @param $user_val the user value given to the type
 * @param $parant_ele just root element of the element
 * @param $payload_dom  payload dom document
 * @param $classmap (array) users classmap
 * @param $root_node root element of the document, in order to add namespace 
 * @param $prefix_i - next available prefix index 
 * @param namespace_map, array, map to the namespace to prefix
 */
function wsf_serialize_complex_types(DomNode $sig_param_node, $user_val, $parent_node, $payload_dom, $root_node, $classmap, &$prefix_i, &$namespace_map, $mtom_on, &$attachment_map)
{
    $target_namespace = NULL;
    $min_occurs = 1;
    $max_occurs = 1;
    $sig_param_attris = $sig_param_node->attributes;
    $param_type = NULL;
    $param_name = NULL;
    if ($sig_param_attris->getNamedItem(WSF_NAME)) {
        $param_name = $sig_param_attris->getNamedItem(WSF_NAME)->value;
    }
    if ($sig_param_attris->getNamedItem(WSF_TARGETNAMESPACE)) {
        $target_namespace = $sig_param_attris->getNamedItem(WSF_TARGETNAMESPACE)->value;
    }
    if ($sig_param_attris->getNamedItem(WSF_MIN_OCCURS)) {
        $min_occurs = $sig_param_attris->getNamedItem(WSF_MIN_OCCURS)->value;
    }
    if ($sig_param_attris->getNamedItem(WSF_MAX_OCCURS)) {
        $max_occurs = $sig_param_attris->getNamedItem(WSF_MAX_OCCURS)->value;
    }
    if ($sig_param_attris->getNamedItem(WSF_TYPE)) {
        $param_type = $sig_param_attris->getNamedItem(WSF_TYPE)->value;
    }
    if ($target_namespace == NULL) {
        $node_name = $param_name;
    } else {
        if (array_key_exists($target_namespace, $namespace_map) && $namespace_map[$target_namespace] != NULL) {
            $prefix = $namespace_map[$target_namespace];
        } else {
            $prefix = "ns" . $prefix_i;
            $prefix_i++;
            $root_node->setAttribute("xmlns:" . $prefix, $target_namespace);
            $namespace_map[$target_namespace] = $prefix;
        }
        $node_name = $prefix . ":" . $param_name;
    }
    if ($max_occurs > 1 || $max_occurs == "unbounded") {
        if ($user_val === NULL) {
            wsf_set_nil_element(NULL, $parent_node, $root_node, $prefix_i, $namespace_map);
        } else {
            if (is_array($user_val)) {
                foreach ($user_val as $user_val_item) {
                    /* type conversion is needed */
                    if ($user_val_item === NULL) {
                        wsf_set_nil_element(NULL, $parent_node, $root_node, $prefix_i, $namespace_map);
                        continue;
                    }
                    $param_node = $payload_dom->createElement($node_name);
                    if (is_object($user_val_item)) {
                        if ($sig_param_node->hasChildNodes()) {
                            wsf_create_payload_for_class_map($payload_dom, $sig_param_node, $param_node, $root_node, $user_val_item, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                        } else {
                            wsf_create_payload_for_unknown_class_map($payload_dom, $param_node, $user_val_item, $prefix);
                        }
                    } else {
                        if ($sig_param_node->hasChildNodes()) {
                            wsf_create_payload_for_array($payload_dom, $sig_param_node, $param_node, $root_node, $user_val_item, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                        } else {
                            wsf_create_payload_for_unknown_array($payload_dom, $param_node, $user_val_item, $prefix);
                        }
                    }
                    $parent_node->appendChild($param_node);
                }
            } else {
                /* in a case this is not an array */
                $param_node = $payload_dom->createElement($node_name);
                if (is_object($user_val)) {
                    if ($sig_param_node->hasChildNodes()) {
                        wsf_create_payload_for_class_map($payload_dom, $sig_param_node, $param_node, $root_node, $user_val, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                    } else {
                        wsf_create_payload_for_unknown_class_map($payload_dom, $param_node, $user_val, $prefix);
                    }
                } else {
                    if ($sig_param_node->hasChildNodes()) {
                        wsf_create_payload_for_array($payload_dom, $sig_param_node, $param_node, $root_node, $user_val, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                    } else {
                        wsf_create_payload_for_unknown_array($payload_dom, $param_node, $user_val, $prefix);
                    }
                }
                $parent_node->appendChild($param_node);
            }
        }
    } else {
        /* in a case this is not an array */
        $param_node = $payload_dom->createElement($node_name);
        if (is_object($user_val)) {
            if ($sig_param_node->hasChildNodes()) {
                wsf_create_payload_for_class_map($payload_dom, $sig_param_node, $param_node, $root_node, $user_val, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
            } else {
                wsf_create_payload_for_unknown_class_map($payload_dom, $param_node, $user_val, $prefix);
            }
        } else {
            if ($sig_param_node->hasChildNodes()) {
                wsf_create_payload_for_array($payload_dom, $sig_param_node, $param_node, $root_node, $user_val, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
            } else {
                wsf_create_payload_for_unknown_array($payload_dom, $param_node, $user_val, $prefix);
            }
        }
        $parent_node->appendChild($param_node);
    }
}
Exemplo n.º 3
0
/**
 * Creates the payload to be passed to C level.
 * @param DomNode $sig_node the sig node of the operation
 * @param Bool $is_doc true if doc-lit or false if rpc style
 * @param string $operation_name Name of the operation to be invoked
 * @param int $arg_count No of arguments in the function
 * @param array $argument array of arguments of the function to be invoked
 * @param array $classmap array of class mappings for complex types 
 * @param DomNode $schema_node schema for the given WSDL
 */
function wsf_create_payload(DomNode $sig_node, $is_doc, $operation_name, $arg_count, $arguments, array $classmap = NULL, $mtom_on, &$attachment_map)
{
    require_once 'wsf_wsdl_consts.php';
    require_once 'wsf_wsdl_util.php';
    require_once 'wsf_wsdl_serialization.php';
    // if the sig is an immediate simple type then
    // it is expected to have is_wrapper = TRUE
    $is_wrapper = FALSE;
    $params_node = NULL;
    // starting prefix index to build the xml
    $prefix_i = 2;
    if ($sig_node) {
        $params_node = $sig_node->firstChild;
        if ($params_node && $params_node->localName == WSF_PARAMS) {
            if ($params_node->hasAttributes()) {
                /* Wrapper element of the request operation */
                $sig_attrs = $params_node->attributes;
                $ele_name = NULL;
                $ele_ns = NULL;
                if ($sig_attrs->getNamedItem(WSF_WRAPPER_ELEMENT)) {
                    $ele_name = $sig_attrs->getNamedItem(WSF_WRAPPER_ELEMENT)->value;
                }
                if ($sig_attrs->getNamedItem(WSF_WRAPPER_ELEMENT_NS)) {
                    $ele_ns = $sig_attrs->getNamedItem(WSF_WRAPPER_ELEMENT_NS)->value;
                }
                $is_wrapper = TRUE;
            } else {
                /* No wrapper element in the request */
                $ele_ns = NULL;
                $ele_name = NULL;
                /* check for the only param target-namespace */
                $only_param = $params_node->firstChild;
                $sig_attrs = $only_param->attributes;
                if ($sig_attrs->getNamedItem(WSF_TARGETNAMESPACE)) {
                    $ele_ns = $sig_attrs->getNamedItem(WSF_TARGETNAMESPACE)->value;
                }
                if ($sig_attrs->getNamedItem(WSF_NAME)) {
                    $ele_name = $sig_attrs->getNamedItem(WSF_NAME)->value;
                }
            }
        }
    }
    if ($params_node == NULL) {
        return NULL;
    }
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "element name: {$ele_name}");
    // the returning payload..
    $payload_str = NULL;
    /*if(array_key_exists(0, $arguments) && $arguments[0] === NULL) {
          $payload_str = NULL;
      }*/
    if ($ele_name == NULL || $ele_name == "#any") {
        $payload_str = NULL;
    } else {
        if ($is_doc == TRUE) {
            $payload_dom = new DOMDocument('1.0', 'iso-8859-1');
            $element = $payload_dom->createElementNS($ele_ns, WSF_STARTING_NS_PREFIX . ":" . $ele_name);
            if (!array_key_exists(0, $arguments)) {
                $payload_dom->appendChild($element);
                $payload_node = $payload_dom->firstChild;
                $clone_node = $payload_node->cloneNode(TRUE);
                $payload_str = $payload_dom->saveXML($clone_node);
            } else {
                if (is_object($arguments[0])) {
                    /* this is class map support */
                    $new_obj = $arguments[0];
                    $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX);
                    wsf_create_payload_for_class_map($payload_dom, $params_node, $element, $element, $new_obj, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                    $payload_dom->appendChild($element);
                    $payload_node = $payload_dom->firstChild;
                    $clone_node = $payload_node->cloneNode(TRUE);
                    $payload_str = $payload_dom->saveXML($clone_node);
                } else {
                    /* array type implementation */
                    $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX);
                    wsf_create_payload_for_array($payload_dom, $params_node, $element, $element, $arguments[0], $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                    $payload_dom->appendChild($element);
                    $payload_node = $payload_dom->firstChild;
                    $clone_node = $payload_node->cloneNode(TRUE);
                    $payload_str = $payload_dom->saveXML($clone_node);
                }
            }
        } else {
            $payload_dom = new DOMDocument('1.0', 'iso-8859-1');
            $element = $payload_dom->createElementNS($ele_ns, WSF_STARTING_NS_PREFIX . ":" . $ele_name);
            $element->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
            $element->setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
            if (is_object($arguments[0])) {
                $new_obj = $arguments[0];
                $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX);
                // currently we handle both rpc and doc lit sameway
                wsf_create_payload_for_class_map($payload_dom, $params_node, $element, $element, $new_obj, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                $payload_dom->appendChild($element);
                $payload_node = $payload_dom->firstChild;
                $clone_node = $payload_node->cloneNode(TRUE);
                $payload_str = $payload_dom->saveXML($clone_node);
            } else {
                /* array type implementation */
                $namespace_map = array($ele_ns => WSF_STARTING_NS_PREFIX);
                wsf_create_payload_for_array($payload_dom, $params_node, $element, $element, $arguments[0], $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                $payload_dom->appendChild($element);
                $payload_node = $payload_dom->firstChild;
                $clone_node = $payload_node->cloneNode(TRUE);
                $payload_str = $payload_dom->saveXML($clone_node);
            }
        }
    }
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "test: " . $payload_str);
    $binding_details_node = NULL;
    $binding_details_node = $sig_node->nextSibling;
    while ($binding_details_node && $binding_details_node->nodeType == XML_ELEMENT_NODE && $binding_details_node->nodeName != WSF_BINDINDG_DETAILS) {
        $binding_details_node = $binding_details_node->nextSibling;
    }
    $input_headers = array();
    $argument_index = 1;
    if ($binding_details_node) {
        $binding_details_childs = $binding_details_node->childNodes;
        foreach ($binding_details_childs as $binding_details_child) {
            if ($binding_details_child->nodeType == XML_ELEMENT_NODE && $binding_details_child->nodeName == WSF_SOAPHEADER && $binding_details_child->attributes->getNamedItem(WSF_HEADER_FOR_ATTRIBUTE) && $binding_details_child->attributes->getNamedItem(WSF_HEADER_FOR_ATTRIBUTE)->value == WSF_WSDL_INPUT) {
                //so this is the next input element..
                $header_name = "";
                $header_ns = "";
                if ($binding_details_child->attributes->getNamedItem(WSF_TYPE)) {
                    $header_name = $binding_details_child->attributes->getNamedItem(WSF_TYPE)->value;
                }
                if ($binding_details_child->attributes->getNamedItem(WSF_TYPE_NAMESPACE)) {
                    $header_ns = $binding_details_child->attributes->getNamedItem(WSF_TYPE_NAMESPACE)->value;
                }
                $header_dom = new DOMDocument('1.0', 'iso-8859-1');
                $element = $header_dom->createElementNS($header_ns, WSF_STARTING_NS_PREFIX . ":" . $header_name);
                if (array_key_exists($argument_index, $arguments)) {
                    $namespace_map = array($header_ns => WSF_STARTING_NS_PREFIX);
                    $argument = $arguments[$argument_index];
                    $header_sig = $binding_details_child->firstChild;
                    if ($argument && is_array($argument)) {
                        wsf_create_payload_for_array($header_dom, $header_sig, $element, $element, $arguments, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                    } else {
                        if ($argument && is_object($argument)) {
                            wsf_create_payload_for_class_map($header_dom, $header_sig, $element, $element, $argument, $classmap, $prefix_i, $namespace_map, $mtom_on, $attachment_map);
                        } else {
                            if ($argument) {
                                // this can be tiny little simple type
                                $text_node = new DOMText($argument);
                                $element->appendChild($text_node);
                            }
                        }
                    }
                    $header_dom->appendChild($element);
                    $header_node = $header_dom->firstChild;
                    $clone_node = $header_node->cloneNode(TRUE);
                    $header_str = $header_dom->saveXML($clone_node);
                    $input_headers[] = $header_str;
                } else {
                    break;
                }
                $argument_index++;
            }
        }
    }
    return array(WSF_REQUEST_PAYLOAD => $payload_str, WSF_INPUT_HEADERS => $input_headers);
}