Esempio n. 1
0
function ws_convert_to_wsdl20($wsdl_out)
{
    $wsdl_dom = new DomDocument();
    $xslt_wsdl_20_dom = new DOMDocument();
    $xslt_11_to_20_dom = new DOMDocument();
    $xslt_11_to_20_dom->preserveWhiteSpace = false;
    $xslt = new XSLTProcessor();
    $xslt_str = file_get_contents(WS_WSDL_Const::WSF_WSDL_WSDL11_2_2_CONVERTORS, TRUE);
    if (!$xslt_wsdl_20_dom->loadXML($xslt_str)) {
        ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "Error loading the wsdl11towsdl2 convertor script");
        echo "Error in generating the WSDL\n";
        exit(0);
    }
    $xslt->importStyleSheet($xslt_wsdl_20_dom);
    $wsdl_dom->loadXML($wsdl_out);
    $xslt_11_to_20_dom->loadXML($xslt->transformToXML($wsdl_dom));
    $doc_ele = $xslt_11_to_20_dom->documentElement;
    foreach ($doc_ele->childNodes as $child) {
        if ($child->nodeType == XML_COMMENT_NODE) {
            $old_child = $doc_ele->removeChild($child);
        }
    }
    return $xslt_11_to_20_dom->saveXML();
}
Esempio n. 2
0
function wsf_attach_xsd_imports($wsdl_types_node, $wsdl_dom, $schema_node, $relative_url, &$already_added_xsds, $stream_ctx)
{
    $schema_childs = $schema_node->childNodes;
    /* extracting out relative url details */
    $path_parts = pathinfo($relative_url);
    $relative_dir = $path_parts["dirname"] . "/";
    $import_node_array = array();
    foreach ($schema_childs as $schema_child) {
        if ($schema_child->nodeType != XML_ELEMENT_NODE) {
            continue;
        }
        if ($schema_child->localName == "import" || $schema_child->localName == "include") {
            $import_node = $schema_child;
            if ($import_node->attributes && $import_node->attributes->getNamedItem("schemaLocation")) {
                $imported_location = $import_node->attributes->getNamedItem("schemaLocation")->value;
                if (strncmp($imported_location, "http://", 7) == 0 || strncmp($imported_location, "https://", 8) == 0) {
                    // then this is a absolute URL and doesn't need to derive again..
                } else {
                    // derive the absolute url from relative url
                    $tmp_relative_url = $relative_dir . $imported_location;
                    $imported_location = wsf_normalize_url($tmp_relative_url);
                }
                if (!array_key_exists($imported_location, $already_added_xsds) || $already_added_xsds[$imported_location] == NULL) {
                    $already_added_xsds[$imported_location] = TRUE;
                    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "importing xsd: {$imported_location} from: {$relative_url}");
                    $imported_dom = new DOMDocument();
                    $imported_content = file_get_contents($imported_location, 0, $stream_ctx);
                    if ($imported_dom->loadXML($imported_content)) {
                        $imported_root = $imported_dom->documentElement;
                        if ($imported_root && $imported_root->nodeType == XML_ELEMENT_NODE && $imported_root->localName == "schema") {
                            // do the same thing for the imported_schema
                            wsf_attach_xsd_imports($wsdl_types_node, $wsdl_dom, $imported_root, $imported_location, $already_added_xsds, $stream_ctx);
                            // append the schema to the first wsdl
                            wsf_wsdl_append_node($wsdl_types_node, $imported_root, $wsdl_dom);
                            // and remove the old node..
                            $import_node_array[] = $import_node;
                        }
                    }
                } else {
                    // still we remove the already imported node
                    $import_node_array[] = $import_node;
                    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "xsd: {$imported_location} redeclared to import from: {$relative_url}");
                }
            }
        }
    }
    foreach ($import_node_array as $import_node) {
        $schema_node->removeChild($import_node);
    }
}
Esempio n. 3
0
function wsf_wsdl_process_in_msg($wsdata)
{
    require_once 'dynamic_invocation/wsf_wsdl_consts.php';
    require_once 'dynamic_invocation/wsf_wsdl_util.php';
    require_once 'dynamic_invocation/wsf_wsdl_service.php';
    $parameters = $wsdata->WSDL_ParamArray;
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "wsf_wsdl_process_in_msg is called");
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, print_r($parameters, TRUE));
    $payload_dom = new DomDocument();
    $sig_model_dom = new DomDocument();
    $payload_dom->preserveWhiteSpace = FALSE;
    $sig_model_dom->preserveWhiteSpace = FALSE;
    $service_name = NULL;
    $port_name = NULL;
    $is_multiple_interfaces = FALSE;
    $sig_model_string = NULL;
    $payload_string = NULL;
    $operation_name = NULL;
    $function_name = NULL;
    $class_name = NULL;
    $class_map = NULL;
    $class_args = NULL;
    $header_string = NULL;
    // this is about the respnse message
    $mtom_on = TRUE;
    $cid2cont_type = array();
    $cid2attachments = array();
    if (array_key_exists(WSF_SERVICE_NAME, $parameters)) {
        $service_name = $parameters[WSF_SERVICE_NAME];
    }
    if (array_key_exists(WSF_PORT_NAME, $parameters)) {
        $port_name = $parameters[WSF_PORT_NAME];
    }
    if (array_key_exists(WSF_SIG_MODEL_STRING, $parameters)) {
        $sig_model_string = $parameters[WSF_SIG_MODEL_STRING];
    }
    if (array_key_exists(WSF_PAYLOAD_STRING, $parameters)) {
        $payload_string = $parameters[WSF_PAYLOAD_STRING];
    }
    if (array_key_exists(WSF_OPERATION_NAME, $parameters)) {
        $operation_name = $parameters[WSF_OPERATION_NAME];
    }
    if (array_key_exists(WSF_FUNCTION_NAME, $parameters)) {
        $function_name = $parameters[WSF_FUNCTION_NAME];
    }
    if (array_key_exists(WSF_CLASS_NAME, $parameters)) {
        $class_name = $parameters[WSF_CLASS_NAME];
    }
    if (array_key_exists(WSF_CLASSMAP, $parameters)) {
        $class_map = $parameters[WSF_CLASSMAP];
    }
    if (array_key_exists(WSF_CLASS_ARGS, $parameters)) {
        $class_args = $parameters[WSF_CLASS_ARGS];
    }
    if (array_key_exists(WSF_ATTACHMENTS, $parameters)) {
        $cid2attachments = $parameters[WSF_ATTACHMENTS];
    }
    if (array_key_exists(WSF_CID2CONTENT_TYPE, $parameters)) {
        $cid2cont_type = $parameters[WSF_CID2CONTENT_TYPE];
    }
    if (array_key_exists(WSF_USE_MTOM, $parameters)) {
        $mtom_on = $parameters[WSF_USE_MTOM];
    }
    $header_element = NULL;
    if (array_key_exists(WSF_HEADER_STRING, $parameters)) {
        $header_string = $parameters[WSF_HEADER_STRING];
        if ($header_string && !empty($header_string)) {
            $header_dom = new DomDocument();
            $header_dom->preserveWhiteSpace = FALSE;
            $header_dom->loadXML($header_string);
            $header_element = $header_dom->documentElement;
        }
    }
    // payload can be NULL
    if (!empty($payload_string)) {
        $payload_dom->loadXML($payload_string);
        $payload_element = $payload_dom->documentElement;
    } else {
        $payload_dom = NULL;
        $payload_element = NULL;
    }
    $sig_model_dom->loadXML($sig_model_string);
    $endpoint_address = wsf_get_endpoint_address($sig_model_dom);
    $operation_node = wsf_find_operation($sig_model_dom, $operation_name, $service_name, $endpoint_address, $port_name, $is_multiple_interfaces);
    if (!$operation_node) {
        ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "{$operation_name} operaiton not found");
        throw new WSFault("Sender", "{$operation_name} operation not found");
    }
    $return_payload_info = wsf_serivce_invoke_function($operation_node, $function_name, $class_name, $class_args, $payload_element, $header_element, $class_map, $mtom_on, $cid2cont_type, $cid2attachments);
    return $return_payload_info;
}
Esempio n. 4
0
function wsf_set_nil_element($value, $parent_node, $root_node, &$prefix_i, array &$namespace_map)
{
    if ($value !== NULL) {
        ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, $parent_node->localName . " is not nil\n value is: " . print_r($value, TRUE));
        return FALSE;
    }
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, $parent_node->localName . " is nil\n");
    if (array_key_exists(WSF_XSI_NAMESPACE, $namespace_map)) {
        $prefix = $namespace_map[WSF_XSI_NAMESPACE];
    } else {
        $prefix = "xsi";
        $root_node->setAttribute("xmlns:" . $prefix, WSF_XSI_NAMESPACE);
        $namespace_map[WSF_XSI_NAMESPACE] = $prefix;
    }
    $attribute_name = $prefix . ":" . "nil";
    $attribute_value = "1";
    $parent_node->setAttribute($attribute_name, $attribute_value);
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, $parent_node->localName . " is nil");
    return TRUE;
}
Esempio n. 5
0
/**
 * service invoke function
 */
function wsf_serivce_invoke_function($operation_node, $function_name, $class_name, $class_args, $soap_body_node, $header_node, $classmap, $mtom_on, $cid2cont_type, $cid2attachments)
{
    require_once 'wsf_wsdl_consts.php';
    require_once 'wsf_wsdl_util.php';
    require_once 'wsf_wsdl_deserialization.php';
    $sig_node = NULL;
    $binding_details_node = NULL;
    if ($operation_node) {
        foreach ($operation_node->childNodes as $operation_child) {
            if ($operation_child->tagName == WSF_SIGNATURE) {
                $sig_node = $operation_child;
            }
            if ($operation_child->tagName == WSF_BINDINDG_DETAILS) {
                $binding_details_node = $operation_child;
            }
        }
    }
    $is_doc = TRUE;
    //currently we only support doc-lit style parsing..
    $is_wrapper = FALSE;
    $params_node = NULL;
    $is_direct_list = FALSE;
    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;
                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 ($sig_attrs->getNamedItem(WSF_LIST)) {
                    $is_direct_list = $sig_attrs->getNamedItem(WSF_LIST)->value;
                }
            }
        }
    }
    if (!$soap_body_node) {
        ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "soap_body not found");
    }
    // parsing input headers
    $header_params = array();
    $output_headers = array();
    if ($header_node) {
        $header_first_child = $header_node->firstChild;
        $output_index = 0;
        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)) {
                    if ($binding_details_child->attributes->getNamedItem(WSF_HEADER_FOR_ATTRIBUTE)->value == WSF_WSDL_INPUT) {
                        //so this is the next input element..
                        $sig_attrs = $binding_details_child->attributes;
                        if ($sig_attrs->getNamedItem(WSF_TYPE)) {
                            $ele_name = $sig_attrs->getNamedItem(WSF_TYPE)->value;
                        }
                        if ($sig_attrs->getNamedItem(WSF_TYPE_NAMESPACE)) {
                            $ele_ns = $sig_attrs->getNamedItem(WSF_TYPE_NAMESPACE)->value;
                        }
                        // for the starting sig we have to go for the header node name we want
                        //go to the next header
                        if ($header_first_child) {
                            $header_child = $header_first_child;
                            while ($header_child && ($header_child->nodeType == XML_TEXT_NODE || !($header_child->localName == $ele_name && $header_child->namespaceURI == $ele_ns))) {
                                $header_child = $header_child->nextSibling;
                            }
                        }
                        if ($header_child) {
                            $header_sig = $binding_details_child->firstChild;
                            if ($classmap != NULL && !empty($classmap)) {
                                ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "starting to parse header {$ele_name} as a classmap");
                                $new_param = wsf_parse_payload_for_class_map($header_child, $header_sig, $ele_name, $classmap, $cid2cont_type, $cid2attachments);
                                ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "parsed_pram " . print_r($new_param, TRUE) . " as a classmap");
                            } else {
                                ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "starting to parse header {$ele_name} as an array");
                                $new_param = wsf_parse_payload_for_array($header_child, $header_sig, $cid2cont_type, $cid2attachments);
                            }
                            $header_params[] = $new_param;
                        } else {
                            //if header child doesn't exist better check whether it is an requeired header
                            if ($sig_attrs && $sig_attrs->getNamedItem(WSF_REQUIRED) && $sig_attrs->getNamedItem(WSF_REQUIRED)->value == "true") {
                                //throwing faults saying it is required
                                throw new WSFault("Sender", "Requried header {$ele_name}|{$ele_ns} missing");
                            }
                        }
                    } else {
                        if ($binding_details_child->attributes->getNamedItem(WSF_HEADER_FOR_ATTRIBUTE)->value == WSF_WSDL_OUTPUT) {
                            $output_headers[$output_index] = array();
                            //to retrive later
                            $header_params[] =& $output_headers[$output_index];
                            //to feed to the user operation
                            $output_index++;
                        }
                    }
                }
            }
        }
    }
    //parsing the pyalod
    $op_param_values = array();
    if ($classmap != NULL && !empty($classmap)) {
        if ($soap_body_node) {
            ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "starting to parse payload as a classmap");
            $op_param_values = wsf_parse_payload_for_class_map($soap_body_node, $params_node, $ele_name, $classmap, $cid2cont_type, $cid2attachments);
        }
        $arg_array = array_merge(array($op_param_values), $header_params);
    } else {
        if ($soap_body_node) {
            ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "starting to parse payload as an array");
            $op_param_values = wsf_parse_payload_for_array($soap_body_node, $params_node, $cid2cont_type, $cid2attachments);
            if (!is_array($op_param_values) || $is_direct_list) {
                // this can happens when returning simple types
                $op_param_values = array($op_param_values);
            }
        }
        $arg_array = array_merge($op_param_values, $header_params);
    }
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, print_r($arg_array, TRUE));
    if ($class_name != NULL) {
        // First call the constructor
        $class = new ReflectionClass($class_name);
        if ($class) {
            if ($class_args && is_array($class_args)) {
                $class_inst = $class->newInstanceArgs($class_args);
            } else {
                $class_inst = $class->newInstanceArgs(array());
            }
            // Then the user method
            $method = $class->getMethod($function_name);
            if ($classmap != NULL && !empty($classmap) || $is_direct_list) {
                // for direct lists we follow same api as classmap
                $response_value = $method->invokeArgs($class_inst, $arg_array);
            } else {
                $response_value = $method->invokeArgs($class_inst, $arg_array);
            }
        } else {
            ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "class : {$class_name} doesn't exists");
        }
    } else {
        if ($classmap != NULL && !empty($classmap) || $is_direct_list) {
            // for direct lists we follow same api as classmap
            $response_value = call_user_func_array($function_name, $arg_array);
        } else {
            $response_value = call_user_func_array($function_name, $arg_array);
        }
    }
    $attachment_map = array();
    $response_payload_string = wsf_wsdl_create_response_payload($response_value, $sig_node, $mtom_on, $attachment_map, $classmap);
    $output_header_string = wsf_wsdl_create_response_headers($binding_details_node, $output_headers, $mtom_on, $attachment_map, $classmap);
    return array(WSF_RESPONSE_PAYLOAD => $response_payload_string, WSF_OUTPUT_HEADERS => $output_header_string, WSF_ATTACHMENT_MAP => $attachment_map);
}
Esempio n. 6
0
/**
 * Extract the sig node looking at the incomming xml type
 * @param array $sig_model as a DomNode
 * @param DomNode $parent_node - The parent node to check for the content 
 * @param $object mixed relevent object instance(passed by reference)
 * @param $original_type the type in the first place
 * @param $classmap - the type name to class map
 */
function wsf_infer_sig_node_from_xml($sig_node, $parent_node, &$object, $original_type, $classmap)
{
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "Calling infer sig mode from xml");
    // first it is to be safte to keep the element type as the original type and the sig node too
    $the_element_type = $original_type;
    $the_sig_node = $sig_node;
    // second we have to find whether there is xsi:type in the xml.
    $xml_type = NULL;
    $xsi_type_attri_node = $parent_node->getAttributeNodeNS(WSF_XSI_NAMESPACE, "type");
    if ($xsi_type_attri_node) {
        $xml_type = $xsi_type_attri_node->value;
    }
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "xml type {$xml_type}");
    if ($xml_type) {
        //looks like there is a type declared in the xml, so find possible types..
        $inheriting_type_found = FALSE;
        $xml_type_local_value = $xml_type;
        $pos = strpos($xml_type, ":");
        if ($pos !== FALSE) {
            $xml_type_local_value = substr($xml_type, $pos + 1);
        }
        $sig_child_nodes = $sig_node->childNodes;
        foreach ($sig_child_nodes as $sig_child_node) {
            if ($sig_child_node->localName == WSF_INHERITING_TYPE) {
                $sig_child_attris = $sig_child_node->attributes;
                $type_name = $type_ns = "";
                if ($sig_child_attris->getNamedItem(WSF_XSI_TYPE)) {
                    $type_name = $sig_child_attris->getNamedItem(WSF_XSI_TYPE)->value;
                }
                if ($xml_type_local_value == $type_name) {
                    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "type name {$type_name} found ");
                    $the_element_type = $type_name;
                    $the_sig_node = $sig_child_node;
                    $inheriting_type_found = TRUE;
                    break;
                }
            }
        }
    }
    if (is_array($classmap) && array_key_exists($the_element_type, $classmap)) {
        $class_name = $classmap[$the_element_type];
    }
    if (!isset($class_name) || $class_name == NULL) {
        $class_name = $the_element_type;
    }
    try {
        $ref_class = new ReflectionClass($class_name);
        if ($ref_class->isInstantiable()) {
            $object = $ref_class->newInstance();
        }
    } catch (Exception $e) {
        $object = new WSFUnknownSchemaConstruct();
    }
    return $the_sig_node;
}
Esempio n. 7
0
 /**
  * Function that creates types elements(schema) for WSDL1.1 in
  * doc-lit style 
  * @param DomDocument $wsdl_doc DomDocument element of the wsdl document
  * @param DomElement $wsdl_root service dom element
  * @param array $schemaTypes array of schema types
  */
 public function createDocLitType(DomDocument $wsdl_doc, DomElement $wsdl_root, $schemaTypes)
 {
     $return_array = array();
     $types_ele = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SCHEMA_WSDL_NAMESPACE, WS_WSDL_Const::WS_WSDL_TYPES_ATTR_NAME);
     $wsdl_root->appendChild($types_ele);
     $schema_ele = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_SCHEMA_ATTR_NAME);
     $schema_ele->setAttribute(WS_WSDL_Const::WS_WSDL_ELEMENTFORMDEFAULT_ATTR_NAME, WS_WSDL_Const::WS_WSDL_QUALIFIED_ATTR_NAME);
     $schema_ele->setAttribute(WS_WSDL_Const::WS_WSDL_DEF_TARGET_NS, $this->ns);
     $schema_root = $schema_ele;
     $types_ele->appendChild($schema_ele);
     /* here the structure of the param is
               Array
               (
                   [In] => Array
                       (
                           [matrix_add] => Array
                               (
                                   [type] => MatrixAdd
                                   [array] =>
                                   [object] => object
                                   [min] => 1
                                   [max] => 3
                               )
                       )
                   [Out] => Array
                       (
                           [matrix_add_response] => Array
                               (
                                   [type] => MatrixAddResponse
                                   [array] =>
                                   [object] => object
                                   [min] => 1
                                   [max] => 3
                               )
                       )
               )
        */
     foreach ($schemaTypes as $function_name => $params) {
         $return_array[$function_name] = array();
         if (array_key_exists(WS_WSDL_Const::WS_WSDL_INPUT_ATTR_NAME, $params)) {
             $params_in_out = $params[WS_WSDL_Const::WS_WSDL_INPUT_ATTR_NAME];
             if ($this->classmap) {
                 if ($params_in_out == NULL || !is_array($params_in_out)) {
                     ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "with classmap provided, you should have the input param for the {$function_name}");
                     echo "Error in generating the WSDL\n";
                     exit(0);
                 }
                 foreach ($params_in_out as $paramName => $paramValue) {
                     $xsd_type = $paramValue["type"];
                     $element_ele = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_ELEMENT_ATTR_NAME);
                     $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_NAME_ATTR_NAME, $paramName);
                     if ($paramValue["object"] == "object") {
                         $object_return = $this->createSchemaType($wsdl_doc, $types_ele, $xsd_type);
                         if ($this->rev_classmap && is_array($this->rev_classmap) && array_key_exists($xsd_type, $this->rev_classmap)) {
                             $xsd_type = $this->rev_classmap[$xsd_type];
                         }
                         $object_prefix = $object_return["prefix"];
                         $object_namespace = $object_return["namespace"];
                         $schema_root->setAttribute("xmlns:" . $object_prefix, $object_namespace);
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_TYPE_ATTR_NAME, $object_prefix . ":" . $xsd_type);
                         $this->delcare_namespace_import($wsdl_doc, $schema_root, $object_namespace);
                     } else {
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_TYPE_ATTR_NAME, WS_WSDL_Const::WS_WSDL_XSD_ATTR_NAME . $xsd_type);
                     }
                     $schema_ele->appendChild($element_ele);
                     $return_array[$function_name][WS_WSDL_Const::WS_WSDL_INPUT_ATTR_NAME] = WS_WSDL_Const::WS_WSDL_DEFAULT_SCHEMA_ATTR_NAME . ":" . $paramName;
                 }
             } else {
                 $ct = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_ELEMENT_ATTR_NAME);
                 foreach ($this->fun_mapping as $key => $value) {
                     if ($value == $function_name) {
                         $ct->setAttribute(WS_WSDL_Const::WS_WSDL_NAME_ATTR_NAME, $key);
                     }
                 }
                 $schema_ele->appendChild($ct);
                 $comtype = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_COMPLXTYPE_ATTR_NAME);
                 $ct->appendChild($comtype);
                 $seq = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_SEQUENCE_ATTR_NAME);
                 $comtype->appendChild($seq);
                 foreach ($params_in_out as $paramName => $paramValue) {
                     $xsd_type = $paramValue["type"];
                     $element_ele = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_ELEMENT_ATTR_NAME);
                     $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_NAME_ATTR_NAME, $paramName);
                     // listen to the min and max settings
                     if (array_key_exists("min", $paramValue) && isset($paramValue["min"]) && is_numeric($paramValue["min"]) && $paramValue["min"] != 1) {
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_ATTR_MIN_OCCURS, $paramValue["min"]);
                     }
                     if (array_key_exists("max", $paramValue) && $paramValue["max"]) {
                         // listen to the min and max settings
                         if (is_numeric($paramValue["max"]) && $paramValue["max"] != 1) {
                             $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_ATTR_MAX_OCCURS, $paramValue["max"]);
                         } else {
                             if ($paramValue["max"] == WS_WSDL_Const::WS_WSDL_ATTR_VALUE_UNBOUNDED) {
                                 $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_ATTR_MAX_OCCURS, WS_WSDL_Const::WS_WSDL_ATTR_VALUE_UNBOUNDED);
                             }
                         }
                     } else {
                         if ($paramValue["array"] == "array") {
                             $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_ATTR_MAX_OCCURS, WS_WSDL_Const::WS_WSDL_ATTR_VALUE_UNBOUNDED);
                         }
                     }
                     if ($paramValue["object"] == "object") {
                         $object_return = $this->createSchemaType($wsdl_doc, $types_ele, $xsd_type);
                         if ($this->rev_classmap && is_array($this->rev_classmap) && array_key_exists($xsd_type, $this->rev_classmap)) {
                             $xsd_type = $this->rev_classmap[$xsd_type];
                         }
                         $object_prefix = $object_return["prefix"];
                         $object_namespace = $object_return["namespace"];
                         $schema_root->setAttribute("xmlns:" . $object_prefix, $object_namespace);
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_TYPE_ATTR_NAME, $object_prefix . ":" . $xsd_type);
                         $this->delcare_namespace_import($wsdl_doc, $schema_root, $object_namespace);
                     } else {
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_TYPE_ATTR_NAME, WS_WSDL_Const::WS_WSDL_XSD_ATTR_NAME . $xsd_type);
                     }
                     $seq->appendChild($element_ele);
                 }
                 $return_array[$function_name][WS_WSDL_Const::WS_WSDL_INPUT_ATTR_NAME] = TRUE;
             }
         } else {
             //just create an empty schema type
             if ($this->classmap) {
                 ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "with classmap provided, you should have the input param for the {$function_name}");
                 echo "Error in generating the WSDL\n";
                 exit(0);
             }
             $ct = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_ELEMENT_ATTR_NAME);
             $ct->setAttribute(WS_WSDL_Const::WS_WSDL_NAME_ATTR_NAME, $function_name);
             $schema_ele->appendChild($ct);
             $comtype = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_COMPLXTYPE_ATTR_NAME);
             $ct->appendChild($comtype);
             $seq = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_SEQUENCE_ATTR_NAME);
             $comtype->appendChild($seq);
         }
         if (array_key_exists(WS_WSDL_Const::WS_WSDL_OUTPUT_ATTR_NAME, $params)) {
             $params_in_out = $params[WS_WSDL_Const::WS_WSDL_OUTPUT_ATTR_NAME];
             if ($this->classmap) {
                 foreach ($params_in_out as $paramName => $paramValue) {
                     $xsd_type = $paramValue["type"];
                     $element_ele = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_ELEMENT_ATTR_NAME);
                     $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_NAME_ATTR_NAME, $paramName);
                     if ($paramValue["object"] == "object") {
                         $object_return = $this->createSchemaType($wsdl_doc, $types_ele, $xsd_type);
                         if ($this->rev_classmap && is_array($this->rev_classmap) && array_key_exists($xsd_type, $this->rev_classmap)) {
                             $xsd_type = $this->rev_classmap[$xsd_type];
                         }
                         $object_prefix = $object_return["prefix"];
                         $object_namespace = $object_return["namespace"];
                         $schema_root->setAttribute("xmlns:" . $object_prefix, $object_namespace);
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_TYPE_ATTR_NAME, $object_prefix . ":" . $xsd_type);
                         $this->delcare_namespace_import($wsdl_doc, $schema_root, $object_namespace);
                     } else {
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_TYPE_ATTR_NAME, WS_WSDL_Const::WS_WSDL_XSD_ATTR_NAME . $xsd_type);
                     }
                     $schema_ele->appendChild($element_ele);
                     $return_array[$function_name][WS_WSDL_Const::WS_WSDL_OUTPUT_ATTR_NAME] = WS_WSDL_Const::WS_WSDL_DEFAULT_SCHEMA_ATTR_NAME . ":" . $paramName;
                 }
             } else {
                 $ct = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_ELEMENT_ATTR_NAME);
                 foreach ($this->fun_mapping as $key => $value) {
                     if ($value == $function_name) {
                         $ct->setAttribute(WS_WSDL_Const::WS_WSDL_NAME_ATTR_NAME, $key . WS_WSDL_Const::WS_WSDL_RESPONSE_ATTR_NAME);
                     }
                 }
                 $schema_ele->appendChild($ct);
                 $comtype = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_COMPLXTYPE_ATTR_NAME);
                 $ct->appendChild($comtype);
                 $seq = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_SEQUENCE_ATTR_NAME);
                 $comtype->appendChild($seq);
                 foreach ($params_in_out as $paramName => $paramValue) {
                     $xsd_type = $paramValue["type"];
                     $element_ele = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_ELEMENT_ATTR_NAME);
                     $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_NAME_ATTR_NAME, $paramName);
                     // listen to the min and max settings
                     if (array_key_exists("min", $paramValue) && isset($paramValue["min"]) && is_numeric($paramValue["min"]) && $paramValue["min"] != 1) {
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_ATTR_MIN_OCCURS, $paramValue["min"]);
                     }
                     if (array_key_exists("max", $paramValue) && $paramValue["max"]) {
                         // listen to the min and max settings
                         if (is_numeric($paramValue["max"]) && $paramValue["max"] != 1) {
                             $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_ATTR_MAX_OCCURS, $paramValue["max"]);
                         } else {
                             if ($paramValue["max"] == WS_WSDL_Const::WS_WSDL_ATTR_VALUE_UNBOUNDED) {
                                 $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_ATTR_MAX_OCCURS, WS_WSDL_Const::WS_WSDL_ATTR_VALUE_UNBOUNDED);
                             }
                         }
                     } else {
                         if ($paramValue["array"] == "array") {
                             $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_ATTR_MAX_OCCURS, WS_WSDL_Const::WS_WSDL_ATTR_VALUE_UNBOUNDED);
                         }
                     }
                     if ($paramValue["object"] == "object") {
                         $object_return = $this->createSchemaType($wsdl_doc, $types_ele, $xsd_type);
                         if ($this->rev_classmap && is_array($this->rev_classmap) && array_key_exists($xsd_type, $this->rev_classmap)) {
                             $xsd_type = $this->rev_classmap[$xsd_type];
                         }
                         $object_prefix = $object_return["prefix"];
                         $object_namespace = $object_return["namespace"];
                         $schema_root->setAttribute("xmlns:" . $object_prefix, $object_namespace);
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_TYPE_ATTR_NAME, $object_prefix . ":" . $xsd_type);
                         $this->delcare_namespace_import($wsdl_doc, $schema_root, $object_namespace);
                     } else {
                         $element_ele->setAttribute(WS_WSDL_Const::WS_WSDL_TYPE_ATTR_NAME, WS_WSDL_Const::WS_WSDL_XSD_ATTR_NAME . $xsd_type);
                     }
                     $seq->appendChild($element_ele);
                 }
                 $return_array[$function_name][WS_WSDL_Const::WS_WSDL_OUTPUT_ATTR_NAME] = TRUE;
             }
         } else {
             //just create an empty schema type
             $ct = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_ELEMENT_ATTR_NAME);
             $ct->setAttribute(WS_WSDL_Const::WS_WSDL_NAME_ATTR_NAME, $function_name . "Response");
             $schema_ele->appendChild($ct);
             $comtype = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_COMPLXTYPE_ATTR_NAME);
             $ct->appendChild($comtype);
             $seq = $wsdl_doc->createElementNS(WS_WSDL_Const::WS_SOAP_XML_SCHEMA_NAMESPACE, WS_WSDL_Const::WS_WSDL_SEQUENCE_ATTR_NAME);
             $comtype->appendChild($seq);
         }
     }
     return $return_array;
 }
Esempio n. 8
0
 /**
  * check if the xsd type and php types are mathched if not a log
  *is written
  *@param string $keyIndex 
  */
 function checkValidTypes($keyIndex, $keyXsdIndex)
 {
     $keyPHPArray = NULL;
     if (array_key_exists($keyXsdIndex, $this->xsdMapArry[$this->operationName])) {
         $keyPHPArray = $this->xsdMapArry[$this->operationName][$keyXsdIndex];
     }
     $PHPType = NULL;
     if (array_key_exists($keyIndex, $this->phpMapArry)) {
         $PHPType = $this->phpMapArry[$keyIndex];
     }
     require_once 'dynamic_invocation/wsf_wsdl_consts.php';
     ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "mapping :" . $keyPHPArray . " to " . $PHPType);
     if ($keyPHPArray && array_key_exists($keyPHPArray, self::$mappingTable) && $PHPType == self::$mappingTable[$keyPHPArray]) {
         return $keyPHPArray;
     } else {
         error_log("type missmatched", 0);
         return $PHPType;
     }
 }
Esempio n. 9
0
/**
 * Processes and validate response message and assign values to class map.
 * @param DomDocument $payload_dom response payload
 * @param DomDocument $header_dom response header, can be NULL
 * @param DomDocument $operation_sig_dom operation sig model
 * @param array $response_parameters array of response parameters
 * @return mixed an object, an array or a simple type in line with the 
 * expected format of the response
 */
function wsf_client_response_and_validate(DomDocument $payload_dom, $header_dom, DomDocument $operation_sig_dom, $response_parameters, $mtom_on = FALSE)
{
    require_once 'wsf_wsdl_consts.php';
    require_once 'wsf_wsdl_util.php';
    require_once 'wsf_wsdl_deserialization.php';
    $payload_node = $payload_dom->documentElement;
    $operation_sig_node = $operation_sig_dom->documentElement;
    $binding_details_node = NULL;
    $sig_method = NULL;
    //extracting out the sig_method from the operation sig node
    if ($operation_sig_node) {
        foreach ($operation_sig_node->childNodes as $operation_sig_child) {
            if ($operation_sig_child->tagName == WSF_SIGNATURE) {
                $sig_method = $operation_sig_child;
            }
            if ($operation_sig_child->tagName == WSF_BINDINDG_DETAILS) {
                $binding_details_node = $operation_sig_child;
            }
        }
    }
    $ele_ns = NULL;
    $is_wrapper = FALSE;
    if ($sig_method) {
        $returns_node = $sig_method->firstChild;
        while ($returns_node && $returns_node->localName != WSF_RETURNS) {
            $returns_node = $returns_node->nextSibling;
        }
        if ($returns_node) {
            if ($returns_node->hasAttributes()) {
                /* Wrapper element of the request operation */
                $sig_attrs = $returns_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 = $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;
                }
            }
        }
    }
    /** get SOAP body DOM tree to compare with Sig model */
    if (!$payload_node) {
        error_log("soap_body not found", 0);
    }
    $classmap = NULL;
    $cid2cont_type = array();
    $cid2attachments = array();
    if (array_key_exists(WSF_CLASSMAP, $response_parameters)) {
        $classmap = $response_parameters[WSF_CLASSMAP];
    }
    if (array_key_exists("attachments", $response_parameters)) {
        $cid2attachments = $response_parameters["attachments"];
    }
    if (array_key_exists("cid2contentType", $response_parameters)) {
        $cid2cont_type = $response_parameters["cid2contentType"];
    }
    $op_param_values = array();
    if ($classmap !== NULL) {
        $op_param_values = wsf_parse_payload_for_class_map($payload_node, $returns_node, $ele_name, $classmap, $cid2cont_type, $cid2attachments);
    } else {
        $op_param_values = wsf_parse_payload_for_array($payload_node, $returns_node, $cid2cont_type, $cid2attachments);
    }
    $header_node = NULL;
    if ($header_dom) {
        $header_node = $header_dom->documentElement;
    }
    $header_params = array();
    if ($header_node) {
        $header_first_child = $header_node->firstChild;
        $output_index = 0;
        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)) {
                    if ($binding_details_child->attributes->getNamedItem(WSF_HEADER_FOR_ATTRIBUTE)->value == WSF_WSDL_OUTPUT) {
                        //so this is the next input element..
                        $sig_attrs = $binding_details_child->attributes;
                        if ($sig_attrs->getNamedItem(WSF_TYPE)) {
                            $ele_name = $sig_attrs->getNamedItem(WSF_TYPE)->value;
                        }
                        if ($sig_attrs->getNamedItem(WSF_TYPE_NAMESPACE)) {
                            $ele_ns = $sig_attrs->getNamedItem(WSF_TYPE_NAMESPACE)->value;
                        }
                        //go to the next header
                        if ($header_first_child) {
                            $header_child = $header_first_child;
                            while ($header_child && ($header_child->nodeType == XML_TEXT_NODE || !($header_child->localName == $ele_name && $header_child->namespaceURI == $ele_ns))) {
                                $header_child = $header_child->nextSibling;
                            }
                        }
                        if ($header_child) {
                            $header_sig = $binding_details_child->firstChild;
                            if ($classmap != NULL && !empty($classmap)) {
                                ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "starting to parse header {$ele_name} as a classmap");
                                $new_param = wsf_parse_payload_for_class_map($header_child, $header_sig, $ele_name, $classmap, $cid2cont_type, $cid2attachments);
                            } else {
                                ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "starting to parse header {$ele_name} as an array");
                                $new_param = wsf_parse_payload_for_array($header_child, $header_sig, $cid2cont_type, $cid2attachments);
                            }
                            $header_params[] = $new_param;
                        }
                    }
                }
            }
        }
    }
    return array(WSF_RESPONSE_PAYLOAD_PARAM => $op_param_values, WSF_RESPONSE_HEADER_PARAM => $header_params);
}