Пример #1
0
/**
 * Function to write classes. Does the WSDL to PHP conversion using a 'sig model'.  
 * $wsdl_location location of the WSDL
 * returns code segment corresponding to classes as a string
 */
function wsf_wsdl2php($wsdl_location)
{
    require_once 'dynamic_invocation/wsf_wsdl_consts.php';
    require_once 'dynamic_invocation/wsf_wsdl_util.php';
    global $written_classes;
    global $operations;
    global $actions;
    $written_classes[WSF_XSD_ANYTYPE] = TRUE;
    $code = "";
    $wsdl_dom = new DomDocument();
    $sig_model_dom = new DOMDocument();
    $xslt_location = "./xslt/";
    $sig_model_dom->preserveWhiteSpace = false;
    $wsdl_dom->preserveWhiteSpace = false;
    if (!$wsdl_location) {
        echo "WSDL is not found";
        return NULL;
    }
    $is_multiple_interfaces = FALSE;
    // load WSDL as DOM
    if (!$wsdl_dom->load($wsdl_location)) {
        echo "WSDL could not be loaded.";
        return NULL;
    }
    $wsdl_dom->preserveWhiteSpace = false;
    // changing code for processing mutiple port types in wsdl 1.1
    $is_multiple_interfaces = wsf_is_mutiple_port_types($wsdl_dom);
    $is_wsdl_11 = $wsdl_11_dom = NULL;
    if ($is_multiple_interfaces == FALSE) {
        //wsdl1.1 to wsdl2 conversion
        $wsdl_dom = wsf_get_wsdl_dom($wsdl_dom, $wsdl_location, $is_wsdl_11, $wsdl_11_dom);
        if (!$wsdl_dom) {
            echo "Error creating WSDL DOM document";
            return NULL;
        }
        $sig_model_dom = wsf_get_sig_model_dom($wsdl_dom);
    } else {
        //wsdl1.1 to wsdl2 conversion
        $wsdl_dom = wsf_get_wsdl_dom($wsdl_dom, $wsdl_location, $is_wsdl_11, $wsdl_11_dom);
        $sig_model_dom = wsf_process_multiple_interfaces($wsdl_dom, $sig_model_dom);
    }
    if (!$sig_model_dom) {
        echo "Error creating intermediate service operations signature model";
        return NULL;
    }
    // get the list of operations
    $op_nodes = $sig_model_dom->getElementsByTagName(WSF_OPERATION);
    // process each operation
    foreach ($op_nodes as $op_node) {
        // get operation name
        $op_attr = $op_node->attributes;
        if ($op_attr == NULL || $op_attr->getNamedItem(WSF_NAME) == NULL) {
            continue;
        }
        $op_name = $op_attr->getNamedItem(WSF_NAME)->value;
        if (array_key_exists($op_name, $operations) == FALSE || $operations[$op_name] == NULL) {
            // it operation is already found in an earlier parse, should not re-set it
            $operations[$op_name] = array();
            $operations[$op_name][WSF_CLIENT] = "";
            $operations[$op_name][WSF_SERVICE] = "";
        } else {
            continue;
            //no need to record same operation multiple times
        }
        // get the nodes describing operation characteristics
        $op_child_list = $op_node->childNodes;
        //first we have to have a good idea about headers, so processing headers first
        $in_headers = 0;
        $out_headers = 0;
        $in_header_objects = array();
        $in_header_objects[WSF_CLIENT] = "";
        $in_header_objects[WSF_SERVICE] = "";
        $out_header_objects = array();
        $out_header_objects[WSF_CLIENT] = "";
        $out_header_objects[WSF_SERVICE] = "";
        $service_function_doc_comment = "";
        $service_function_doc_comment .= "/**\n";
        $service_function_doc_comment .= " * Service function {$op_name}\n";
        // doc comments for input types
        foreach ($op_child_list as $op_child) {
            // process the signature node
            if ($op_child->nodeName == WSF_SIGNATURE) {
                // get the nodes representing operation parameters and return types within signature
                $param_list = $op_child->childNodes;
                foreach ($param_list as $param_node) {
                    if ($param_node) {
                        // look for params and returns nodes
                        if ($param_node->nodeName == WSF_PARAMS) {
                            if ($param_node->hasAttributes()) {
                                // Wrapper element
                                $params_attr = $param_node->attributes;
                                // get wrapper element name, this is going to be the class name
                                $ele_name = $params_attr->getNamedItem(WSF_WRAPPER_ELEMENT)->value;
                                $service_function_doc_comment .= " * @param object of {$ele_name} \$input \n";
                            } else {
                                // No wrapper element, there won't be any class generated for this
                                $child_array = array();
                                $param_child_list = $param_node->childNodes;
                                foreach ($param_child_list as $param_child) {
                                    $param_attr = $param_child->attributes;
                                    $ele_name = $param_attr->getNamedItem(WSF_NAME)->value;
                                    $content_model = "";
                                    if ($param_attr->getNamedItem(WSF_CONTENT_MODEL)) {
                                        $content_model = $param_attr->getNamedItem(WSF_CONTENT_MODEL)->value;
                                    }
                                    $param_type = $param_attr->getNamedItem(WSF_TYPE)->value;
                                    if ($content_model == WSF_SIMPLE_CONTENT) {
                                        $service_function_doc_comment .= " * @param object of {$ele_name} \$input \n";
                                    } else {
                                        $service_function_doc_comment .= " * @param {$param_type} \$input \n";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        foreach ($op_child_list as $op_child) {
            if ($op_child->nodeName == WSF_W2P_BINDING_DETAILS) {
                $op_binding_childs = $op_child->childNodes;
                foreach ($op_binding_childs as $op_binding_child) {
                    if ($op_binding_child->nodeName == WSF_SOAPHEADER) {
                        if ($op_binding_child->attributes->getNamedItem(WSF_HEADER_FOR_ATTRIBUTE)) {
                            if ($op_binding_child->attributes->getNamedItem(WSF_HEADER_FOR_ATTRIBUTE)->value == WSF_WSDL_OUTPUT) {
                                $direction = WSF_WSDL_OUTPUT;
                            } else {
                                $direction = WSF_WSDL_INPUT;
                            }
                        } else {
                            $direction = WSF_WSDL_INPUT;
                        }
                    }
                    if ($op_binding_child->attributes->getNamedItem(WSF_TYPE)) {
                        $param_node = $op_binding_child->firstChild;
                        if ($param_node && $param_node->attributes->getNamedItem(WSF_TYPE)) {
                            $class_name = $param_node->attributes->getNamedItem(WSF_TYPE)->value;
                            if ($direction == WSF_WSDL_INPUT) {
                                if ($param_node->attributes && $param_node->attributes->getNamedItem(WSF_WSDL_SIMPLE) && $param_node->attributes->getNamedItem(WSF_WSDL_SIMPLE)->value == 'no' || $param_node->attributes->getNamedItem(WSF_CONTENT_MODEL) && $param_node->attributes->getNamedItem(WSF_CONTENT_MODEL)->value == WSF_SIMPLE_CONTENT) {
                                    // for the complex types and simple contnet
                                    $in_header_objects[WSF_CLIENT] .= "    \$header_in{$in_headers} = new {$class_name}();\n    // TODO: fill in the class fields of \$header_in{$in_headers} object which is of type {$class_name} to match your business logic\n\n";
                                    $in_header_objects[WSF_SERVICE] .= "    // NOTE: \$header_in{$in_headers} object is of type {$class_name}\n";
                                    $service_function_doc_comment .= " * @param object of {$class_name} \$header_in{$in_headers} input header\n";
                                } else {
                                    // for the simple types
                                    $in_header_objects[WSF_CLIENT] .= "    // TODO: fill in the \$header_in{$in_headers} which is of type {$class_name} to match your business logic\n\n";
                                    $in_header_objects[WSF_SERVICE] .= "    // NOTE: \$header_in{$in_headers} header is of type {$class_name}\n";
                                    $service_function_doc_comment .= " * @param {$class_name} \$header_in{$in_headers} input header\n";
                                }
                                $in_headers++;
                            } else {
                                if ($param_node->attributes && $param_node->attributes->getNamedItem(WSF_WSDL_SIMPLE) && $param_node->attributes->getNamedItem(WSF_WSDL_SIMPLE)->value == 'no' || $param_node->attributes->getNamedItem(WSF_CONTENT_MODEL) && $param_node->attributes->getNamedItem(WSF_CONTENT_MODEL)->value == WSF_SIMPLE_CONTENT) {
                                    // for the complex types and simple contnet
                                    $out_header_objects[WSF_CLIENT] .= "\n    // TODO: Implement business logic to consume \$header_out{$out_headers} object, which is of type class {$class_name}\n";
                                    $out_header_objects[WSF_SERVICE] .= "    // NOTE: you should assign an object of type {$class_name} to \$header_out{$out_headers}\n";
                                    $service_function_doc_comment .= " * @param reference object of {$class_name} \$header_out{$out_headers} object output header\n";
                                } else {
                                    // for the simple types
                                    $out_header_objects[WSF_CLIENT] .= "\n    // TODO: Implement business logic to consume \$header_out{$out_headers}, which is of type {$class_name}\n";
                                    $out_header_objects[WSF_SERVICE] .= "    // NOTE: you should assign an object of type {$class_name} to \$header_out{$out_headers}\n";
                                    $service_function_doc_comment .= " * @param reference {$class_name} \$header_out{$out_headers} output header\n";
                                }
                                $out_headers++;
                            }
                            if ($param_node->attributes && $param_node->attributes->getNamedItem(WSF_WSDL_SIMPLE) && $param_node->attributes->getNamedItem(WSF_WSDL_SIMPLE)->value == 'no' || $param_node->attributes->getNamedItem(WSF_CONTENT_MODEL) && $param_node->attributes->getNamedItem(WSF_CONTENT_MODEL)->value == WSF_SIMPLE_CONTENT) {
                                $code_for_header = wsf_write_sub_classes($param_node);
                                $code .= $code_for_header;
                            }
                        }
                    }
                }
            }
        }
        // doc comments for the return type
        foreach ($op_child_list as $op_child) {
            // process the signature node
            if ($op_child->nodeName == WSF_SIGNATURE) {
                // get the nodes representing operation parameters and return types within signature
                $param_list = $op_child->childNodes;
                foreach ($param_list as $param_node) {
                    if ($param_node) {
                        // look for params and returns nodes
                        if ($param_node->nodeName == WSF_RETURNS) {
                            if ($param_node->hasAttributes()) {
                                // Wrapper element
                                $params_attr = $param_node->attributes;
                                // get wrapper element name, this is going to be the class name
                                $ele_name = $params_attr->getNamedItem(WSF_WRAPPER_ELEMENT)->value;
                                $service_function_doc_comment .= " * @return object of {$ele_name} \n";
                            } else {
                                // No wrapper element, there won't be any class generated for this
                                $child_array = array();
                                $param_child_list = $param_node->childNodes;
                                foreach ($param_child_list as $param_child) {
                                    $param_attr = $param_child->attributes;
                                    $ele_name = $param_type = "";
                                    if ($param_attr->getNamedItem(WSF_NAME)) {
                                        $ele_name = $param_attr->getNamedItem(WSF_NAME)->value;
                                    }
                                    if ($param_attr->getNamedItem(WSF_TYPE)) {
                                        $param_type = $param_attr->getNamedItem(WSF_TYPE)->value;
                                    }
                                    $content_model = "";
                                    if ($param_attr->getNamedItem(WSF_CONTENT_MODEL)) {
                                        $content_model = $param_attr->getNamedItem(WSF_CONTENT_MODEL)->value;
                                    }
                                    if ($content_model == WSF_SIMPLE_CONTENT) {
                                        $service_function_doc_comment .= " * @return object of {$ele_name} \n";
                                    } else {
                                        $service_function_doc_comment .= " * @return {$param_type} \n";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        $service_function_doc_comment .= " */\n";
        /*
        if($out_headers > 0) {
            $in_header_objects[WSF_CLIENT] .= "    // Declration of variables for the output headers\n"; 
            $in_header_objects[WSF_CLIENT] .= "    // NOTE: don't set any value to these objects, rather the call to proxy will assign values for them\n"; 
            for($i = 0; $i < $out_headers; $i ++) {
                $in_header_objects[WSF_CLIENT] .= "    \$header_out{$i} = NULL;\n";
            }
            $in_header_objects[WSF_CLIENT] .= "\n"; 
            $out_header_objects[WSF_SERVICE] .= "\n";
        }
        */
        if ($in_header_objects[WSF_CLIENT] != "") {
            $in_header_objects[WSF_CLIENT] = substr_replace($in_header_objects[WSF_CLIENT], "", -1);
        }
        if ($in_header_objects[WSF_SERVICE] != "") {
            $in_header_objects[WSF_SERVICE] .= "\n";
        }
        /* function declration variables for headers */
        $header_function_decl = "";
        for ($i = 0; $i < $in_headers; $i++) {
            $header_function_decl .= ", \$header_in" . $i;
        }
        for ($i = 0; $i < $out_headers; $i++) {
            $header_function_decl .= ", &\$header_out" . $i;
        }
        /* function call variables for headers */
        $header_function_call = "";
        for ($i = 0; $i < $in_headers; $i++) {
            $header_function_call .= ", \$header_in" . $i;
        }
        for ($i = 0; $i < $out_headers; $i++) {
            $header_function_call .= ", &\$header_out" . $i;
        }
        //put the doc comment
        //declare the start of service function
        $operations[$op_name][WSF_SERVICE] = $service_function_doc_comment;
        $operations[$op_name][WSF_SERVICE] .= "function " . $op_name . "(\$input{$header_function_decl}) {\n";
        foreach ($op_child_list as $op_child) {
            // process the signature node
            if ($op_child->nodeName == WSF_SIGNATURE) {
                // get the nodes representing operation parameters and return types within signature
                $param_list = $op_child->childNodes;
                foreach ($param_list as $param_node) {
                    if ($param_node) {
                        // look for params and returns nodes
                        if ($param_node->nodeName == WSF_PARAMS || $param_node->nodeName == WSF_RETURNS) {
                            if ($param_node->hasAttributes()) {
                                // Wrapper element
                                $params_attr = $param_node->attributes;
                                // get wrapper element name, this is going to be the class name
                                $ele_name = $params_attr->getNamedItem(WSF_WRAPPER_ELEMENT)->value;
                                // array to hold child elements corresponding to sub classes
                                $child_array = array();
                                // check if the class is already written
                                if (array_key_exists($ele_name, $written_classes) && $written_classes[$ele_name] == TRUE) {
                                    continue;
                                }
                                // write the extension code..
                                $extension_code = wsf_write_extension($param_node, $code);
                                $derives_arr = wsf_write_derives($param_node, $code);
                                // start writing class
                                $code = $code . "class " . $ele_name . $extension_code . " {\n";
                                $written_classes[$ele_name] = TRUE;
                                // prepare the demo code that the user could use for testing client.
                                // shows how to create the input and receive the response
                                if ($param_node->nodeName == WSF_PARAMS) {
                                    $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "    \$input = new {$ele_name}();\n";
                                    if (count($derives_arr) > 0) {
                                        $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "    /**\n     * Here you can replace {$ele_name} with a following class(es)\n";
                                        foreach ($derives_arr as $derive) {
                                            $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "     * {$derive}\n";
                                        }
                                        $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "     */\n";
                                    }
                                    $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "    //TODO: fill in the class fields of \$input to match your business logic\n";
                                    $operations[$op_name][WSF_CLIENT] .= $in_header_objects[WSF_CLIENT];
                                    $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "    // TODO: fill in the business logic\n    // NOTE: \$input is of type {$ele_name}\n";
                                    if (count($derives_arr) > 0) {
                                        $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "    /**\n     * You can expect \$input to be an instance of following class(es) in addition to {$ele_name}\n";
                                        foreach ($derives_arr as $derive) {
                                            $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "     * {$derive}\n";
                                        }
                                        $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "     */\n";
                                    }
                                    $operations[$op_name][WSF_SERVICE] .= $in_header_objects[WSF_SERVICE];
                                }
                                if ($param_node->nodeName == WSF_RETURNS) {
                                    $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "\n    // call the operation\n    \$response = \$proxy->" . $op_node->attributes->getNamedItem('name')->value . "(\$input{$header_function_call});\n    //TODO: Implement business logic to consume \$response, which is of type {$ele_name}\n";
                                    if (count($derives_arr) > 0) {
                                        $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "    /**\n     * You can expect \$response to be an instance of following class(es) in addition to {$ele_name}\n";
                                        foreach ($derives_arr as $derive) {
                                            $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "     * {$derive}\n";
                                        }
                                        $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "     */\n";
                                    }
                                    $operations[$op_name][WSF_CLIENT] .= $out_header_objects[WSF_CLIENT];
                                    $operations[$op_name][WSF_SERVICE] .= $out_header_objects[WSF_SERVICE];
                                    $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "    // NOTE: should return an object of type {$ele_name}\n";
                                    if (count($derives_arr) > 0) {
                                        $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "    /**\n     * Here you can replace {$ele_name} with a following class(es)\n";
                                        foreach ($derives_arr as $derive) {
                                            $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "     * {$derive}\n";
                                        }
                                        $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "     */\n";
                                    }
                                }
                                $child_array = array();
                                $derived_classes_code = "";
                                $code .= wsf_write_content_model($param_node, $child_array, $derived_classes_code);
                                $code = $code . "\n}\n\n";
                                // done writing the current class, now go and write the sub classes
                                foreach ($child_array as $child) {
                                    $code = $code . wsf_write_sub_classes($child);
                                }
                                $code .= $derived_classes_code;
                            } else {
                                // TODO: No wrapper element, there won't be any class generated for this
                                $child_array = array();
                                $param_child_list = $param_node->childNodes;
                                foreach ($param_child_list as $param_child) {
                                    $param_attr = $param_child->attributes;
                                    $ele_name = $param_attr->getNamedItem(WSF_NAME)->value;
                                    $param_type = $param_attr->getNamedItem(WSF_TYPE)->value;
                                    $content_model = "";
                                    if ($param_attr->getNamedItem(WSF_CONTENT_MODEL)) {
                                        $content_model = $param_attr->getNamedItem(WSF_CONTENT_MODEL)->value;
                                    }
                                    //resolving lists
                                    $is_list = FALSE;
                                    if ($param_attr->getNamedItem(WSF_LIST)) {
                                        $is_list = $param_attr->getNamedItem(WSF_LIST)->value;
                                    }
                                    $type_prefix = "";
                                    if ($is_list) {
                                        $type_prefix = "array of ";
                                    }
                                    //resolving unions
                                    $is_union = FALSE;
                                    if ($param_attr->getNamedItem(WSF_UNION)) {
                                        $is_union = $param_attr->getNamedItem(WSF_UNION)->value;
                                    }
                                    if ($is_union) {
                                        $union_type_array = array();
                                        $union_childs = $param_child->childNodes;
                                        foreach ($union_childs as $union_child) {
                                            if ($union_child->nodeName == "union") {
                                                $union_type = $union_child->attributes->getNamedItem(WSF_TYPE)->value;
                                                $union_type_array[] = $union_type;
                                            }
                                        }
                                        $param_type = implode("/", $union_type_array);
                                    }
                                    if ($content_model == WSF_SIMPLE_CONTENT) {
                                        // start writing class
                                        if (!array_key_exists($ele_name, $written_classes) || !$written_classes[$ele_name]) {
                                            $written_classes[$ele_name] = TRUE;
                                            $code = $code . "class " . $ele_name . " {\n";
                                            $derived_classes_code = "";
                                            $code .= wsf_write_content_model($param_child, $child_array, $derived_classes_code);
                                            $code = $code . "\n}\n\n";
                                            $code .= $derived_classes_code;
                                        }
                                        if ($param_node->nodeName == WSF_PARAMS) {
                                            $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "    \$input = new {$ele_name}();\n    //TODO: fill in the class fields of \$input to match your business logic\n";
                                            $operations[$op_name][WSF_CLIENT] .= $in_header_objects[WSF_CLIENT];
                                            $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "    // TODO: fill in the business logic\n    // NOTE: \$input is of type {$ele_name}\n";
                                            $operations[$op_name][WSF_SERVICE] .= $in_header_objects[WSF_SERVICE];
                                        }
                                        if ($param_node->nodeName == WSF_RETURNS) {
                                            $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "\n    // call the operation\n    \$response = \$proxy->" . $op_node->attributes->getNamedItem('name')->value . "(\$input{$header_function_call});\n    //TODO: Implement business logic to consume \$response, which is of type {$ele_name}\n";
                                            $operations[$op_name][WSF_CLIENT] .= $out_header_objects[WSF_CLIENT];
                                            $operations[$op_name][WSF_SERVICE] .= $out_header_objects[WSF_SERVICE];
                                            $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "    // NOTE: should return an object of type {$ele_name}\n";
                                        }
                                    } else {
                                        // prepare the demo code that the user could use for testing client.
                                        // shows how to create the input and receive the response
                                        if ($param_node->nodeName == WSF_PARAMS) {
                                            $simple_type_comment = wsf_comment_on_simple_type_wrapper($param_child, "\$input", $param_type);
                                            $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "    //TODO: fill \$input with (data type: {$type_prefix}{$param_type}) data to match your business logic\n";
                                            if ($param_child->getAttribute("simple") == "yes") {
                                                $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . $simple_type_comment . "\n";
                                            }
                                            $operations[$op_name][WSF_CLIENT] .= $in_header_objects[WSF_CLIENT];
                                            $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "    // TODO: fill in the business logic\n    // NOTE: \$input is of type {$type_prefix}{$param_type}\n";
                                            if ($param_child->getAttribute("simple") == "yes") {
                                                $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . $simple_type_comment . "\n";
                                            }
                                            $operations[$op_name][WSF_SERVICE] .= $in_header_objects[WSF_SERVICE];
                                        }
                                        if ($param_node->nodeName == WSF_RETURNS) {
                                            $simple_type_comment = wsf_comment_on_simple_type_wrapper($param_child, "output ", $param_type);
                                            $operations[$op_name][WSF_CLIENT] = $operations[$op_name][WSF_CLIENT] . "\n    // call the operation\n    \$response = \$proxy->" . $op_node->attributes->getNamedItem('name')->value . "(\$input{$header_function_call});\n    //TODO: Implement business logic to consume \$response, which is of type {$type_prefix}{$param_type}\n";
                                            $operations[$op_name][WSF_CLIENT] .= $out_header_objects[WSF_CLIENT];
                                            $operations[$op_name][WSF_SERVICE] .= $out_header_objects[WSF_SERVICE];
                                            $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "    // NOTE: should return an object of (type: {$type_prefix}{$param_type})\n";
                                            $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . $simple_type_comment . "\n";
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            } else {
                if ($op_child->nodeName == WSF_W2P_BINDING_DETAILS) {
                    /* action is default to wsa waction */
                    $action = $op_child->getAttribute('wsawaction');
                    if ($action == NULL) {
                        $action = $op_child->getAttribute('soapaction');
                    }
                    if ($action != NULL) {
                        /* we feeding the actions to the global variable */
                        if ($actions == NULL) {
                            $actions = array();
                        }
                        $actions[$action] = $op_name;
                    }
                }
            }
        }
        $operations[$op_name][WSF_SERVICE] = $operations[$op_name][WSF_SERVICE] . "\n}\n\n";
    }
    return $code;
}
Пример #2
0
/**
 * Function to write 'sig model' for a given wsdl   
 * $wsdl_location location of the WSDL
 * returns none
 */
function wsf_wsdl2sig($wsdl_location)
{
    require_once 'dynamic_invocation/wsf_wsdl_consts.php';
    require_once 'dynamic_invocation/wsf_wsdl_util.php';
    global $written_classes;
    global $operations;
    $code = "";
    $wsdl_dom = new DomDocument();
    $sig_model_dom = new DOMDocument();
    $xslt_location = "./xslt/";
    $sig_model_dom->preserveWhiteSpace = false;
    $wsdl_dom->preserveWhiteSpace = false;
    if (!$wsdl_location) {
        echo "WSDL is not found";
        return NULL;
    }
    $is_multiple_interfaces = FALSE;
    // load WSDL as DOM
    if (!$wsdl_dom->load($wsdl_location)) {
        echo "WSDL could not be loaded.";
        return NULL;
    }
    $wsdl_dom->preserveWhiteSpace = false;
    // changing code for processing mutiple port types in wsdl 1.1
    $is_multiple_interfaces = wsf_is_mutiple_port_types($wsdl_dom);
    if ($is_multiple_interfaces == FALSE) {
        $wsdl_dom = wsf_get_wsdl_dom($wsdl_dom, $xslt_location);
        if (!$wsdl_dom) {
            echo "Error creating WSDL DOM document";
            return NULL;
        }
        $wsdl_dom = wsf_clear_wsdl_imports($wsdl_dom);
        $sig_model_dom = wsf_get_sig_model_dom($wsdl_dom, $xslt_location);
    } else {
        $wsdl_dom = wsf_clear_wsdl_imports($wsdl_dom);
        $wsdl_dom = wsf_get_wsdl_dom($wsdl_dom, $xslt_location);
        $sig_model_dom = wsf_process_multiple_interfaces($wsdl_dom, $sig_model_dom, $xslt_location);
    }
    if (!$sig_model_dom) {
        echo "Error creating intermediate service operations signature model";
        return NULL;
    }
    echo $sig_model_dom->saveXML();
}
Пример #3
0
function wsf_process_multiple_interfaces($wsdl_dom)
{
    $wsdl_2_0_child_list = $wsdl_dom->firstChild->childNodes;
    /* to store the list of interfaces */
    $interface_array = array();
    $i = 1;
    foreach ($wsdl_2_0_child_list as $interface_child) {
        if ($interface_child->nodeType != XML_ELEMENT_NODE) {
            continue;
        }
        if ($interface_child->localName == 'interface') {
            $interface_array[$i] = $interface_child->attributes->getNamedItem('name')->value;
            $i++;
        }
    }
    $sig_service_array = array();
    $no_of_interfaces = count($interface_array);
    $wsdl_dom2 = new DomDocument();
    $wsdl_dom2->preserveWhiteSpace = false;
    /* copy the wsdl_dom */
    $wsdl_dom2->loadXML($wsdl_dom->saveXML());
    $wsdl_2_0_child_list2 = $wsdl_dom2->firstChild->childNodes;
    for ($j = 1; $j <= $no_of_interfaces; $j++) {
        $wsdl_2_0_child_list1 = $wsdl_dom2->firstChild->childNodes;
        foreach ($wsdl_2_0_child_list1 as $service_child) {
            if ($service_child->nodeType != XML_ELEMENT_NODE) {
                continue;
            }
            if ($service_child->localName == 'service') {
                $old_attr = $service_child->getAttribute('interface');
                $service_child->removeAttribute($old_attr);
                $service_child->setAttribute('interface', "tns:" . $interface_array[$j]);
            }
        }
        $tmp_sig_model = wsf_get_sig_model_dom($wsdl_dom2);
        $services_node = $tmp_sig_model->firstChild;
        $service_child_list = $services_node->childNodes;
        foreach ($service_child_list as $service_child) {
            if ($service_child->nodeType != XML_ELEMENT_NODE) {
                continue;
            }
            if ($service_child->localName == 'service' && $service_child->hasAttributes()) {
                $service_endpoint = $service_child->attributes->getNamedItem('endpoint')->value;
                $operations_child_list = $service_child->childNodes;
                foreach ($operations_child_list as $operations_child) {
                    if ($operations_child->nodeType != XML_ELEMENT_NODE) {
                        continue;
                    }
                    if ($operations_child->localName == 'operations') {
                        $operations_name = $operations_child->attributes->getNamedItem('name')->value;
                        if (strstr($service_endpoint, $operations_name)) {
                            $sig_service_array[strstr($service_endpoint, $operations_name)] = $service_child;
                        }
                    }
                }
            }
        }
    }
    $created_sig_dom = new DOMDocument('1.0', 'iso-8859-1');
    $element = $created_sig_dom->createElement('services');
    $created_sig_dom->appendChild($element);
    foreach ($sig_service_array as $value) {
        wsf_wsdl_append_node($element, $value, $created_sig_dom);
    }
    return $created_sig_dom;
}
Пример #4
0
/**
 * This function is called from call_user_function in C level.
 * Once this function is called, it will fill in the WSDL information, 
 * such as sig model, and the wsdl string
 * into an array and return that array.
 * @param array $user_parameters the details of WSDL endpoint, service address
 * and class map
 * @param array $function_parameters details of the invoked function
 * @return array $return_value array of details to be passed to C level
 */
function wsf_extract_wsdl_info($wsdata)
{
    require_once 'dynamic_invocation/wsf_wsdl_consts.php';
    require_once 'dynamic_invocation/wsf_wsdl_util.php';
    ws_log_write(__FILE__, __LINE__, WSF_LOG_DEBUG, "calling for the wsdl info");
    $user_parameters = $wsdata->WSDL_UserParameters;
    $is_wsdl_11 = TRUE;
    $wsdl_11_dom = NULL;
    /** https client auth */
    $cacert = NULL;
    $clientcert = NULL;
    $passphrase = NULL;
    $stream_ctx = NULL;
    /** wsf_get_wsdl_function using an stream context object */
    if (!is_null($cacert) && !is_null($clientcert)) {
        $stream_ctx = stream_context_create(array("ssl" => array('cafile' => $cacert, 'local_cert' => $clientcert, 'verify_peer' => false)));
    }
    $return_value = array();
    /* retrieving the user parameters */
    $service = NULL;
    $port = NULL;
    if (array_key_exists(WSF_SERVICE_NAME, $user_parameters)) {
        $service = $user_parameters[WSF_SERVICE_NAME];
    }
    if (array_key_exists(WSF_PORT_NAME, $user_parameters)) {
        $port = $user_parameters[WSF_PORT_NAME];
    }
    $wsdl_location = $user_parameters[WSF_WSDL];
    $wsdl_dom = new DomDocument();
    $sig_model_dom = new DOMDocument();
    $sig_model_dom->preserveWhiteSpace = FALSE;
    $wsdl_dom->preserveWhiteSpace = FALSE;
    if (!$wsdl_location) {
        ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "WSDL location uri is not found");
        return "WSDL location uri is not found";
    }
    $is_multiple_interfaces = FALSE;
    // Load WSDL as DOM
    $wsdl_str = wsf_get_wsdl_str_from_url($wsdl_location, $user_parameters);
    if (is_null($wsdl_str)) {
        ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "Reading WSDL from {$wsdl_location} failed ");
        return "Reading WSDL from {$wsdl_location} failed.";
    }
    if (!$wsdl_dom->loadXML($wsdl_str)) {
        ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "WSDL {$wsdl_location} could not be loaded");
        return "WSDL {$wsdl_location} could not be loaded.";
    }
    $wsdl_dom->preserveWhiteSpace = FALSE;
    /* changing code for processing mutiple port types in wsdl 1.1 */
    $is_multiple_interfaces = wsf_is_mutiple_port_types($wsdl_dom);
    if ($is_multiple_interfaces == FALSE) {
        // this will return the wsdl2.0 dom and the information
        // about is_wsdl_11 and wsdl_11_dom + bundles the imports, includes
        $wsdl_dom = wsf_get_wsdl_dom($wsdl_dom, $wsdl_location, $is_wsdl_11, $wsdl_11_dom, $stream_ctx);
        if (!$wsdl_dom) {
            ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "Error creating WSDL Dom Document," . "Please check whether the wsdl is an valid XML");
            return "Error creating WSDL Dom Document" . "Please check whether the wsdl is an valid XML";
        }
        $sig_model_dom = wsf_get_sig_model_dom($wsdl_dom);
    } else {
        // this will return the wsdl2.0 dom and the information
        // about is_wsdl_11 and wsdl_11_dom + bundles the imports, includes
        $wsdl_dom = wsf_get_wsdl_dom($wsdl_dom, $wsdl_location, $is_wsdl_11, $wsdl_11_dom, $stream_ctx);
        $sig_model_dom = wsf_process_multiple_interfaces($wsdl_dom);
    }
    if (!$sig_model_dom) {
        ws_log_write(__FILE__, __LINE__, WSF_LOG_ERROR, "Error creating intermediate sig model");
        return "Error creating intermediate model";
    }
    $sig_model_string = $sig_model_dom->saveXML();
    if ($is_wsdl_11 == TRUE && $wsdl_11_dom) {
        $wsdl_dom = $wsdl_11_dom;
    }
    $wsdl_dom_string = $wsdl_dom->saveXML();
    $return_value = array(WSF_IS_WSDL_11 => $is_wsdl_11, WSF_SIG_MODEL_STRING => $sig_model_string, WSF_WSDL_DOM => $wsdl_dom_string, WSF_IS_MULTI_INTERFACES => $is_multiple_interfaces);
    return $return_value;
}