Ejemplo n.º 1
0
/** create payload for arrays
 * @param $payload_dom - DomDocument for the payload building
 * @param $parent_node - The parent node to add the content
 * @param $user_arguments - The user given argument array 
 * @param $ns_prefix
 */
function wsf_create_payload_for_unknown_array(DomDocument $payload_dom, DomNode $parent_node, $user_arguments, $ns_prefix)
{
    if (is_array($user_arguments)) {
        foreach ($user_arguments as $key => $value) {
            if ($ns_prefix != NULL && !empty($ns_prefix)) {
                $node_name = $ns_prefix . ":" . $key;
            } else {
                $node_name = $key;
            }
            if (is_object($value)) {
                $current_node = $payload_dom->createElement($node_name);
                wsf_create_payload_for_unknown_class_map($payload_dom, $current_node, $value, $ns_prefix);
                $parent_node->appendChild($current_node);
            } else {
                if (wsf_is_map($value)) {
                    $current_node = $payload_dom->createElement($node_name);
                    wsf_create_payload_for_unknown_array($payload_dom, $current_node, $value, $ns_prefix);
                    $parent_node->appendChild($current_node);
                } else {
                    if (is_array($value)) {
                        foreach ($value as $child_value) {
                            if (is_object($child_value)) {
                                $current_node = $payload_dom->createElement($node_name);
                                wsf_create_payload_for_unknown_class_map($payload_dom, $current_node, $child_value, $ns_prefix);
                                $parent_node->appendChild($current_node);
                            } else {
                                if (wsf_is_map($child_value)) {
                                    $current_node = $payload_dom->createElement($node_name);
                                    wsf_create_payload_for_unknown_array($payload_dom, $current_node, $child_value, $ns_prefix);
                                    $parent_node->appendChild($current_node);
                                } else {
                                    if (is_array($child_value)) {
                                        error_log("Invalid array (inside an array) supplied around " . print_r($child_value, TRUE) . " \n");
                                    } else {
                                        $current_node = $payload_dom->createElement($node_name, $child_value);
                                        $parent_node->appendChild($current_node);
                                    }
                                }
                            }
                        }
                    } else {
                        $current_node = $payload_dom->createElement($node_name, $value);
                        $parent_node->appendChild($current_node);
                    }
                }
            }
        }
    } else {
        // just return the current value;
        $ele = $payload_dom->createTextNode($user_arguments);
        $parent_node->appendChild($ele);
    }
}
Ejemplo n.º 2
0
/**
 * wsf_parse_payload_for_unknown_class_map
 * @param $current_node node to parse
 * @returns array of parsed data
 */
function wsf_parse_payload_for_unknown_class_map(DomNode $current_node, $element_type, $classmap)
{
    $class_name = NULL;
    if (is_array($classmap) && array_key_exists($element_type, $classmap)) {
        $class_name = $classmap[$element_type];
    }
    if (!isset($class_name) || $class_name == NULL) {
        $class_name = $element_type;
    }
    try {
        $ref_class = new ReflectionClass($class_name);
        if ($ref_class->isInstantiable()) {
            $object = $ref_class->newInstance();
        }
    } catch (Exception $e) {
        $object = new WSFUnknownSchemaConstruct();
    }
    if ($object == NULL) {
        return NULL;
    }
    while ($current_node != NULL && $current_node->nodeType != XML_ELEMENT_NODE) {
        $current_node = $current_node->nextSibling;
    }
    foreach ($current_node->childNodes as $child) {
        if ($child->nodeType == XML_TEXT_NODE) {
            $node_value = $child->nodeValue;
            return $node_value;
        }
        $name = $child->tagName;
        $needle = strpos($name, ':');
        if ($needle !== FALSE) {
            $name = substr($name, $needle + 1);
        }
        if ($child->nodeType == XML_ELEMENT_NODE) {
            $node_value = wsf_parse_payload_for_unknown_class_map($child, $name, $classmap);
        } else {
            $node_value = NULL;
        }
        if ($node_value !== NULL) {
            if ($object->{$name} === NULL) {
                $object->{$name} = $node_value;
            } else {
                if (is_array($object->{$name}) && !wsf_is_map($object->{$name})) {
                    $i = count($object->{$name});
                    $tmp = $object->{$name};
                    $tmp[$i] = $node_value;
                    $object->{$name} = $tmp;
                } else {
                    $tmp = $object->{$name};
                    $object->{$name} = array($tmp, $node_value);
                }
            }
        }
    }
    return $object;
}