Browse Source

Support for element's form and schema's elementFormDefault attributes (qualified/unqualified)

PHP-5.1
Dmitry Stogov 21 years ago
parent
commit
7288226dba
  1. 9
      ext/soap/php_encoding.c
  2. 46
      ext/soap/php_schema.c
  3. 4
      ext/soap/php_sdl.c
  4. 27
      ext/soap/php_sdl.h
  5. 2
      ext/soap/tests/interop/Round3/GroupD/round3_groupD_doclitparams.wsdl
  6. 2
      ext/soap/tests/interop/Round3/GroupD/round3_groupD_rpcenc.wsdl
  7. 6
      ext/soap/tests/interop/Round4/GroupH/round4_groupH_complex_doclit.wsdl
  8. 2
      ext/soap/tests/interop/Round4/GroupH/round4_groupH_complex_rpcenc.wsdl
  9. 6
      ext/soap/tests/interop/Round4/GroupH/round4_groupH_simple_doclit.wsdl
  10. 2
      ext/soap/tests/interop/Round4/GroupH/round4_groupH_simple_rpcenc.wsdl
  11. 30
      ext/soap/tests/schema/schema075.phpt
  12. 30
      ext/soap/tests/schema/schema076.phpt
  13. 30
      ext/soap/tests/schema/schema077.phpt
  14. 32
      ext/soap/tests/schema/schema078.phpt
  15. 32
      ext/soap/tests/schema/schema079.phpt
  16. 32
      ext/soap/tests/schema/schema080.phpt

9
ext/soap/php_encoding.c

@ -1234,7 +1234,9 @@ static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, zval *
}
}
xmlNodeSetName(property, model->u.element->name);
if (style == SOAP_LITERAL && model->u.element->namens) {
if (style == SOAP_LITERAL &&
model->u.element->namens &&
model->u.element->form == XSD_FORM_QUALIFIED) {
xmlNsPtr nsp = encode_add_ns(property, model->u.element->namens);
xmlSetNs(property, nsp);
}
@ -1482,8 +1484,9 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
/* we need to handle xml: namespace specially, since it is
an implicit schema. Otherwise, use form.
*/
if ((!strncmp((*attr)->namens, XML_NAMESPACE, sizeof(XML_NAMESPACE)) ||
((*attr)->form == XSD_FORM_QUALIFIED)) && (*attr)->namens) {
if ((*attr)->namens &&
(!strncmp((*attr)->namens, XML_NAMESPACE, sizeof(XML_NAMESPACE)) ||
(*attr)->form == XSD_FORM_QUALIFIED)) {
xmlNsPtr nsp = encode_add_ns(xmlParam, (*attr)->namens);
xmlSetNsProp(xmlParam, nsp, (*attr)->name, dummy->children->content);

46
ext/soap/php_schema.c

@ -1664,6 +1664,39 @@ static int schema_element(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr element, sdlTyp
cur_type->def = estrdup(attr->children->content);
}
/* form */
attr = get_attribute(attrs, "form");
if (attr) {
if (strncmp(attr->children->content,"qualified",sizeof("qualified")) == 0) {
cur_type->form = XSD_FORM_QUALIFIED;
} else if (strncmp(attr->children->content,"unqualified",sizeof("unqualified")) == 0) {
cur_type->form = XSD_FORM_UNQUALIFIED;
} else {
cur_type->form = XSD_FORM_DEFAULT;
}
} else {
cur_type->form = XSD_FORM_DEFAULT;
}
if (cur_type->form == XSD_FORM_DEFAULT) {
xmlNodePtr parent = element->parent;
while (parent) {
if (node_is_equal_ex(parent, "schema", SCHEMA_NAMESPACE)) {
xmlAttrPtr def;
def = get_attribute(parent->properties, "elementFormDefault");
if(def == NULL || strncmp(def->children->content, "qualified", sizeof("qualified"))) {
cur_type->form = XSD_FORM_UNQUALIFIED;
} else {
cur_type->form = XSD_FORM_QUALIFIED;
}
break;
}
parent = parent->parent;
}
if (parent == NULL) {
cur_type->form = XSD_FORM_UNQUALIFIED;
}
}
/* type = QName */
type = get_attribute(attrs, "type");
if (type) {
@ -1890,10 +1923,10 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
}
attr = attr->next;
}
if(newAttr->form == XSD_FORM_DEFAULT) {
xmlNodePtr parent = attrType->parent;
while(parent) {
if(node_is_equal_ex(parent, "schema", SCHEMA_NAMESPACE)) {
if (newAttr->form == XSD_FORM_DEFAULT) {
xmlNodePtr parent = attrType->parent;
while (parent) {
if (node_is_equal_ex(parent, "schema", SCHEMA_NAMESPACE)) {
xmlAttrPtr def;
def = get_attribute(parent->properties, "attributeFormDefault");
if(def == NULL || strncmp(def->children->content, "qualified", sizeof("qualified"))) {
@ -1904,8 +1937,8 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
break;
}
parent = parent->parent;
}
if(parent == NULL) {
}
if (parent == NULL) {
newAttr->form = XSD_FORM_UNQUALIFIED;
}
}
@ -2209,6 +2242,7 @@ static void schema_type_fixup(sdlCtx *ctx, sdlTypePtr type)
if ((*tmp)->def) {
type->def = estrdup((*tmp)->def);
}
type->form = (*tmp)->form;
} else if (strcmp(type->ref, SCHEMA_NAMESPACE ":schema") == 0) {
type->encode = get_conversion(XSD_ANYXML);
} else {

4
ext/soap/php_sdl.c

@ -1065,7 +1065,7 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri TSRMLS_DC)
return ctx.sdl;
}
#define WSDL_CACHE_VERSION 0x0c
#define WSDL_CACHE_VERSION 0x0d
#define WSDL_CACHE_GET(ret,type,buf) memcpy(&ret,*buf,sizeof(type)); *buf += sizeof(type);
#define WSDL_CACHE_GET_INT(ret,buf) ret = ((unsigned char)(*buf)[0])|((unsigned char)(*buf)[1]<<8)|((unsigned char)(*buf)[2]<<16)|((int)(*buf)[3]<<24); *buf += 4;
@ -1214,6 +1214,7 @@ static void sdl_deserialize_type(sdlTypePtr type, sdlTypePtr *types, encodePtr *
type->fixed = sdl_deserialize_string(in);
type->ref = sdl_deserialize_string(in);
WSDL_CACHE_GET_1(type->nillable, char, in);
WSDL_CACHE_GET_1(type->form, sdlForm, in);
WSDL_CACHE_GET_INT(i, in);
type->encode = encoders[i];
@ -1788,6 +1789,7 @@ static void sdl_serialize_type(sdlTypePtr type, HashTable *tmp_encoders, HashTab
sdl_serialize_string(type->fixed, out);
sdl_serialize_string(type->ref, out);
WSDL_CACHE_PUT_1(type->nillable, out);
WSDL_CACHE_PUT_1(type->form, out);
sdl_serialize_encoder_ref(type->encode, tmp_encoders, out);
if (type->restrictions) {

27
ext/soap/php_sdl.h

@ -180,6 +180,19 @@ typedef enum _sdlTypeKind {
XSD_TYPEKIND_EXTENSION
} sdlTypeKind;
typedef enum _sdlUse {
XSD_USE_DEFAULT,
XSD_USE_OPTIONAL,
XSD_USE_PROHIBITED,
XSD_USE_REQUIRED
} sdlUse;
typedef enum _sdlForm {
XSD_FORM_DEFAULT,
XSD_FORM_QUALIFIED,
XSD_FORM_UNQUALIFIED
} sdlForm;
struct _sdlType {
sdlTypeKind kind;
char *name;
@ -193,6 +206,7 @@ struct _sdlType {
char *def;
char *fixed;
char *ref;
sdlForm form;
};
struct _sdlParam {
@ -219,19 +233,6 @@ struct _sdlFunction {
HashTable *faults; /* array of sdlFaultPtr */
};
typedef enum _sdlUse {
XSD_USE_DEFAULT,
XSD_USE_OPTIONAL,
XSD_USE_PROHIBITED,
XSD_USE_REQUIRED
} sdlUse;
typedef enum _sdlForm {
XSD_FORM_DEFAULT,
XSD_FORM_QUALIFIED,
XSD_FORM_UNQUALIFIED
} sdlForm;
typedef struct _sdlExtraAttribute {
char *ns;
char *val;

2
ext/soap/tests/interop/Round3/GroupD/round3_groupD_doclitparams.wsdl

@ -11,7 +11,7 @@
<types>
<schema targetNamespace="http://soapinterop.org/xsd"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" elementFormDefault="qualified">
<complexType name="ArrayOfstring_literal">
<sequence>
<element maxOccurs="unbounded" minOccurs="1" name="string" type="xsd:string"/>

2
ext/soap/tests/interop/Round3/GroupD/round3_groupD_rpcenc.wsdl

@ -11,7 +11,7 @@
<types>
<schema targetNamespace="http://soapinterop.org/xsd"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" elementFormDefault="qualified">
<import namespace = "http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="ArrayOfstring">
<complexContent>

6
ext/soap/tests/interop/Round4/GroupH/round4_groupH_complex_doclit.wsdl

@ -10,7 +10,7 @@
targetNamespace="http://soapinterop.org/wsdl">
<types>
<schema
<schema elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://soapinterop.org/types"
targetNamespace="http://soapinterop.org/types">
@ -62,7 +62,7 @@
</schema>
<schema
<schema elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://soapinterop.org/types/part"
targetNamespace="http://soapinterop.org/types/part">
@ -74,7 +74,7 @@
</schema>
<schema
<schema elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://soapinterop.org/types/requestresponse"
targetNamespace="http://soapinterop.org/types/requestresponse">

2
ext/soap/tests/interop/Round4/GroupH/round4_groupH_complex_rpcenc.wsdl

@ -8,7 +8,7 @@
targetNamespace="http://soapinterop.org/wsdl">
<types>
<schema
<schema elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://soapinterop.org/types"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

6
ext/soap/tests/interop/Round4/GroupH/round4_groupH_simple_doclit.wsdl

@ -9,7 +9,7 @@
xmlns:ns4="http://soapinterop.org/types/requestresponse"
targetNamespace="http://soapinterop.org/wsdl">
<types>
<schema
<schema elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://soapinterop.org/types"
targetNamespace="http://soapinterop.org/types">
@ -41,7 +41,7 @@
</schema>
<schema
<schema elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://soapinterop.org/types/part"
targetNamespace="http://soapinterop.org/types/part">
@ -61,7 +61,7 @@
</schema>
<schema
<schema elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://soapinterop.org/types/requestresponse"
targetNamespace="http://soapinterop.org/types/requestresponse">

2
ext/soap/tests/interop/Round4/GroupH/round4_groupH_simple_rpcenc.wsdl

@ -7,7 +7,7 @@
xmlns:ns2="http://soapinterop.org/types"
targetNamespace="http://soapinterop.org/wsdl">
<types>
<schema
<schema elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://soapinterop.org/types"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

30
ext/soap/tests/schema/schema075.phpt

@ -0,0 +1,30 @@
--TEST--
SOAP XML Schema 75: Attributes form qualified/unqualified (attributeFormDefault="qualified")
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
include "test_schema.inc";
$schema = <<<EOF
<complexType name="testType">
<attribute name="int1" type="int"/>
<attribute name="int2" type="int" form="qualified"/>
<attribute name="int3" type="int" form="unqualified"/>
</complexType>
EOF;
test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "encoded", 'attributeFormDefault="qualified"');
echo "ok";
?>
--EXPECTF--
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:test><testParam ns1:int1="1" ns1:int2="2" int3="3" xsi:type="ns1:testType"/></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
object(stdClass)#5 (3) {
["int1"]=>
int(1)
["int2"]=>
int(2)
["int3"]=>
int(3)
}
ok

30
ext/soap/tests/schema/schema076.phpt

@ -0,0 +1,30 @@
--TEST--
SOAP XML Schema 76: Attributes form qualified/unqualified (attributeFormDefault="unqualified")
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
include "test_schema.inc";
$schema = <<<EOF
<complexType name="testType">
<attribute name="int1" type="int"/>
<attribute name="int2" type="int" form="qualified"/>
<attribute name="int3" type="int" form="unqualified"/>
</complexType>
EOF;
test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "encoded", 'attributeFormDefault="unqualified"');
echo "ok";
?>
--EXPECTF--
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:test><testParam int1="1" ns1:int2="2" int3="3" xsi:type="ns1:testType"/></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
object(stdClass)#5 (3) {
["int1"]=>
int(1)
["int2"]=>
int(2)
["int3"]=>
int(3)
}
ok

30
ext/soap/tests/schema/schema077.phpt

@ -0,0 +1,30 @@
--TEST--
SOAP XML Schema 77: Attributes form qualified/unqualified (attributeFormDefault - default)
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
include "test_schema.inc";
$schema = <<<EOF
<complexType name="testType">
<attribute name="int1" type="int"/>
<attribute name="int2" type="int" form="qualified"/>
<attribute name="int3" type="int" form="unqualified"/>
</complexType>
EOF;
test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "encoded");
echo "ok";
?>
--EXPECTF--
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:test><testParam int1="1" ns1:int2="2" int3="3" xsi:type="ns1:testType"/></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
object(stdClass)#5 (3) {
["int1"]=>
int(1)
["int2"]=>
int(2)
["int3"]=>
int(3)
}
ok

32
ext/soap/tests/schema/schema078.phpt

@ -0,0 +1,32 @@
--TEST--
SOAP XML Schema 78: Element form qualified/unqualified (elementFormDefault="qualified")
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
include "test_schema.inc";
$schema = <<<EOF
<complexType name="testType">
<sequence>
<element name="int1" type="int"/>
<element name="int2" type="int" form="qualified"/>
<element name="int3" type="int" form="unqualified"/>
</sequence>
</complexType>
EOF;
test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "literal", 'elementFormDefault="qualified"');
echo "ok";
?>
--EXPECTF--
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/"><SOAP-ENV:Body><ns1:test><testParam><ns1:int1>1</ns1:int1><ns1:int2>2</ns1:int2><int3>3</int3></testParam></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
object(stdClass)#5 (3) {
["int1"]=>
int(1)
["int2"]=>
int(2)
["int3"]=>
int(3)
}
ok

32
ext/soap/tests/schema/schema079.phpt

@ -0,0 +1,32 @@
--TEST--
SOAP XML Schema 79: Element form qualified/unqualified (elementFormDefault="unqualified")
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
include "test_schema.inc";
$schema = <<<EOF
<complexType name="testType">
<sequence>
<element name="int1" type="int"/>
<element name="int2" type="int" form="qualified"/>
<element name="int3" type="int" form="unqualified"/>
</sequence>
</complexType>
EOF;
test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "literal", 'elementFormDefault="unqualified"');
echo "ok";
?>
--EXPECTF--
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/"><SOAP-ENV:Body><ns1:test><testParam><int1>1</int1><ns1:int2>2</ns1:int2><int3>3</int3></testParam></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
object(stdClass)#5 (3) {
["int1"]=>
int(1)
["int2"]=>
int(2)
["int3"]=>
int(3)
}
ok

32
ext/soap/tests/schema/schema080.phpt

@ -0,0 +1,32 @@
--TEST--
SOAP XML Schema 80: Element form qualified/unqualified (elementFormDefault - default)
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
include "test_schema.inc";
$schema = <<<EOF
<complexType name="testType">
<sequence>
<element name="int1" type="int"/>
<element name="int2" type="int" form="qualified"/>
<element name="int3" type="int" form="unqualified"/>
</sequence>
</complexType>
EOF;
test_schema($schema,'type="tns:testType"',(object)array("int1"=>1.1,"int2"=>2.2,"int3"=>3.3), "rpc", "literal");
echo "ok";
?>
--EXPECTF--
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/"><SOAP-ENV:Body><ns1:test><testParam><int1>1</int1><ns1:int2>2</ns1:int2><int3>3</int3></testParam></ns1:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
object(stdClass)#5 (3) {
["int1"]=>
int(1)
["int2"]=>
int(2)
["int3"]=>
int(3)
}
ok
Loading…
Cancel
Save