|
@@ -9,7 +9,7 @@
|
|
|
*
|
|
|
* @author Dietrich Ayala <dietrich@ganx4.com>
|
|
|
* @author Scott Nichol <snichol@users.sourceforge.net>
|
|
|
-* @version $Id: class.wsdl.php,v 1.69 2007/11/06 15:17:46 snichol Exp $
|
|
|
+* @version $Id: class.wsdl.php,v 1.76 2010/04/26 20:15:08 snichol Exp $
|
|
|
* @access public
|
|
|
*/
|
|
|
class wsdl extends nusoap_base {
|
|
@@ -223,7 +223,7 @@ class wsdl extends nusoap_base {
|
|
|
$this->appendDebug($tr->getDebug());
|
|
|
// catch errors
|
|
|
if($err = $tr->getError() ){
|
|
|
- $errstr = 'HTTP ERROR: '.$err;
|
|
|
+ $errstr = 'Getting ' . $wsdl . ' - HTTP ERROR: '.$err;
|
|
|
$this->debug($errstr);
|
|
|
$this->setError($errstr);
|
|
|
unset($tr);
|
|
@@ -302,7 +302,7 @@ class wsdl extends nusoap_base {
|
|
|
$this->currentSchema->schemaStartElement($parser, $name, $attrs);
|
|
|
$this->appendDebug($this->currentSchema->getDebug());
|
|
|
$this->currentSchema->clearDebug();
|
|
|
- } elseif (ereg('schema$', $name)) {
|
|
|
+ } elseif (preg_match('/schema$/', $name)) {
|
|
|
$this->debug('Parsing WSDL schema');
|
|
|
// $this->debug("startElement for $name ($attrs[name]). status = $this->status (".$this->getLocalPart($name).")");
|
|
|
$this->status = 'schema';
|
|
@@ -321,7 +321,7 @@ class wsdl extends nusoap_base {
|
|
|
if (count($attrs) > 0) {
|
|
|
// register namespace declarations
|
|
|
foreach($attrs as $k => $v) {
|
|
|
- if (ereg("^xmlns", $k)) {
|
|
|
+ if (preg_match('/^xmlns/',$k)) {
|
|
|
if ($ns_prefix = substr(strrchr($k, ':'), 1)) {
|
|
|
$this->namespaces[$ns_prefix] = $v;
|
|
|
} else {
|
|
@@ -346,7 +346,7 @@ class wsdl extends nusoap_base {
|
|
|
$attrs = array();
|
|
|
}
|
|
|
// get element prefix, namespace and name
|
|
|
- if (ereg(':', $name)) {
|
|
|
+ if (preg_match('/:/', $name)) {
|
|
|
// get ns prefix
|
|
|
$prefix = substr($name, 0, strpos($name, ':'));
|
|
|
// get ns
|
|
@@ -511,7 +511,7 @@ class wsdl extends nusoap_base {
|
|
|
*/
|
|
|
function end_element($parser, $name){
|
|
|
// unset schema status
|
|
|
- if (/*ereg('types$', $name) ||*/ ereg('schema$', $name)) {
|
|
|
+ if (/*preg_match('/types$/', $name) ||*/ preg_match('/schema$/', $name)) {
|
|
|
$this->status = "";
|
|
|
$this->appendDebug($this->currentSchema->getDebug());
|
|
|
$this->currentSchema->clearDebug();
|
|
@@ -549,7 +549,7 @@ class wsdl extends nusoap_base {
|
|
|
$this->documentation .= $data;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* if authenticating, set user credentials here
|
|
|
*
|
|
@@ -578,30 +578,40 @@ class wsdl extends nusoap_base {
|
|
|
/**
|
|
|
* returns an assoc array of operation names => operation data
|
|
|
*
|
|
|
+ * @param string $portName WSDL port name
|
|
|
* @param string $bindingType eg: soap, smtp, dime (only soap and soap12 are currently supported)
|
|
|
* @return array
|
|
|
* @access public
|
|
|
*/
|
|
|
- function getOperations($bindingType = 'soap') {
|
|
|
+ function getOperations($portName = '', $bindingType = 'soap') {
|
|
|
$ops = array();
|
|
|
if ($bindingType == 'soap') {
|
|
|
$bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/';
|
|
|
} elseif ($bindingType == 'soap12') {
|
|
|
$bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/';
|
|
|
+ } else {
|
|
|
+ $this->debug("getOperations bindingType $bindingType may not be supported");
|
|
|
}
|
|
|
+ $this->debug("getOperations for port '$portName' bindingType $bindingType");
|
|
|
// loop thru ports
|
|
|
foreach($this->ports as $port => $portData) {
|
|
|
- // binding type of port matches parameter
|
|
|
- if ($portData['bindingType'] == $bindingType) {
|
|
|
- //$this->debug("getOperations for port $port");
|
|
|
- //$this->debug("port data: " . $this->varDump($portData));
|
|
|
- //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ]));
|
|
|
- // merge bindings
|
|
|
- if (isset($this->bindings[ $portData['binding'] ]['operations'])) {
|
|
|
- $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']);
|
|
|
+ $this->debug("getOperations checking port $port bindingType " . $portData['bindingType']);
|
|
|
+ if ($portName == '' || $port == $portName) {
|
|
|
+ // binding type of port matches parameter
|
|
|
+ if ($portData['bindingType'] == $bindingType) {
|
|
|
+ $this->debug("getOperations found port $port bindingType $bindingType");
|
|
|
+ //$this->debug("port data: " . $this->varDump($portData));
|
|
|
+ //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ]));
|
|
|
+ // merge bindings
|
|
|
+ if (isset($this->bindings[ $portData['binding'] ]['operations'])) {
|
|
|
+ $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
+ if (count($ops) == 0) {
|
|
|
+ $this->debug("getOperations found no operations for port '$portName' bindingType $bindingType");
|
|
|
+ }
|
|
|
return $ops;
|
|
|
}
|
|
|
|
|
@@ -703,9 +713,10 @@ class wsdl extends nusoap_base {
|
|
|
for ($i = 0; $i < count($this->schemas[$ns]); $i++) {
|
|
|
$xs = &$this->schemas[$ns][$i];
|
|
|
$t = $xs->getTypeDef($type);
|
|
|
- //$this->appendDebug($xs->getDebug());
|
|
|
- //$xs->clearDebug();
|
|
|
+ $this->appendDebug($xs->getDebug());
|
|
|
+ $xs->clearDebug();
|
|
|
if ($t) {
|
|
|
+ $this->debug("in getTypeDef: found type $type");
|
|
|
if (!isset($t['phpType'])) {
|
|
|
// get info for type to tack onto the element
|
|
|
$uqType = substr($t['type'], strrpos($t['type'], ':') + 1);
|
|
@@ -723,11 +734,14 @@ class wsdl extends nusoap_base {
|
|
|
if (isset($etype['attrs'])) {
|
|
|
$t['attrs'] = $etype['attrs'];
|
|
|
}
|
|
|
+ } else {
|
|
|
+ $this->debug("did not find type for [element] $type");
|
|
|
}
|
|
|
}
|
|
|
return $t;
|
|
|
}
|
|
|
}
|
|
|
+ $this->debug("in getTypeDef: did not find type $type");
|
|
|
} else {
|
|
|
$this->debug("in getTypeDef: do not have schema for namespace $ns");
|
|
|
}
|
|
@@ -766,8 +780,9 @@ class wsdl extends nusoap_base {
|
|
|
background-color: #ccccff; width: 20%; margin-left: 20px; margin-top: 20px; }
|
|
|
.title {
|
|
|
font-family: arial; font-size: 26px; color: #ffffff;
|
|
|
- background-color: #999999; width: 105%; margin-left: 0px;
|
|
|
- padding-top: 10px; padding-bottom: 10px; padding-left: 15px;}
|
|
|
+ background-color: #999999; width: 100%;
|
|
|
+ margin-left: 0px; margin-right: 0px;
|
|
|
+ padding-top: 10px; padding-bottom: 10px;}
|
|
|
.hidden {
|
|
|
position: absolute; visibility: hidden; z-index: 200; left: 250px; top: 100px;
|
|
|
font-family: arial; overflow: hidden; width: 600;
|
|
@@ -1056,18 +1071,8 @@ class wsdl extends nusoap_base {
|
|
|
if (isset($typeDef['elements']) && is_array($typeDef['elements'])) {
|
|
|
$elements = 0;
|
|
|
$matches = 0;
|
|
|
- $change = false;
|
|
|
- if ($this->isArraySimpleOrStruct($parameters) == 'arraySimple' && count($parameters) == count($typeDef['elements'])) {
|
|
|
- $this->debug("in parametersMatchWrapped: (wrapped return value kludge) correct number of elements in simple array, so change array and wrap");
|
|
|
- $change = true;
|
|
|
- }
|
|
|
foreach ($typeDef['elements'] as $name => $attrs) {
|
|
|
- if ($change) {
|
|
|
- $this->debug("in parametersMatchWrapped: change parameter $element to name $name");
|
|
|
- $parameters[$name] = $parameters[$elements];
|
|
|
- unset($parameters[$elements]);
|
|
|
- $matches++;
|
|
|
- } elseif (isset($parameters[$name])) {
|
|
|
+ if (isset($parameters[$name])) {
|
|
|
$this->debug("in parametersMatchWrapped: have parameter named $name");
|
|
|
$matches++;
|
|
|
} else {
|
|
@@ -1143,7 +1148,14 @@ class wsdl extends nusoap_base {
|
|
|
// check for Microsoft-style wrapped parameters
|
|
|
if ($style == 'document' && $use == 'literal' && $part_count == 1 && isset($parts['parameters'])) {
|
|
|
$this->debug('check whether the caller has wrapped the parameters');
|
|
|
- if ((($parametersArrayType == 'arrayStruct' || $parameter_count == 0) && !isset($parameters['parameters'])) || ($direction == 'output' && $parametersArrayType == 'arraySimple' && $parameter_count == 1)) {
|
|
|
+ if ($direction == 'output' && $parametersArrayType == 'arraySimple' && $parameter_count == 1) {
|
|
|
+ // TODO: consider checking here for double-wrapping, when
|
|
|
+ // service function wraps, then NuSOAP wraps again
|
|
|
+ $this->debug("change simple array to associative with 'parameters' element");
|
|
|
+ $parameters['parameters'] = $parameters[0];
|
|
|
+ unset($parameters[0]);
|
|
|
+ }
|
|
|
+ if (($parametersArrayType == 'arrayStruct' || $parameter_count == 0) && !isset($parameters['parameters'])) {
|
|
|
$this->debug('check whether caller\'s parameters match the wrapped ones');
|
|
|
if ($this->parametersMatchWrapped($parts['parameters'], $parameters)) {
|
|
|
$this->debug('wrap the parameters for the caller');
|
|
@@ -1428,6 +1440,11 @@ class wsdl extends nusoap_base {
|
|
|
$uqType = substr($uqType, 0, -1);
|
|
|
}
|
|
|
}
|
|
|
+ if (!isset($typeDef['phpType'])) {
|
|
|
+ $this->setError("$type ($uqType) has no phpType.");
|
|
|
+ $this->debug("in serializeType: $type ($uqType) has no phpType.");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
$phpType = $typeDef['phpType'];
|
|
|
$this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') );
|
|
|
// if php type == struct, map value to the <all> element names
|
|
@@ -1449,7 +1466,7 @@ class wsdl extends nusoap_base {
|
|
|
}
|
|
|
if (is_null($value)) {
|
|
|
if ($use == 'literal') {
|
|
|
- // TODO: depends on minOccurs
|
|
|
+ // TODO: depends on minOccurs and nillable
|
|
|
$xml = "<$elementName$elementNS/>";
|
|
|
} else {
|
|
|
$xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>";
|
|
@@ -1471,8 +1488,18 @@ class wsdl extends nusoap_base {
|
|
|
} else {
|
|
|
$xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>";
|
|
|
}
|
|
|
-
|
|
|
- $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle);
|
|
|
+
|
|
|
+ if (isset($typeDef['simpleContent']) && $typeDef['simpleContent'] == 'true') {
|
|
|
+ if (isset($value['!'])) {
|
|
|
+ $xml .= $value['!'];
|
|
|
+ $this->debug("in serializeType: serialized simpleContent for type $type");
|
|
|
+ } else {
|
|
|
+ $this->debug("in serializeType: no simpleContent to serialize for type $type");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // complexContent
|
|
|
+ $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle);
|
|
|
+ }
|
|
|
$xml .= "</$elementName>";
|
|
|
} else {
|
|
|
$this->debug("in serializeType: phpType is struct, but value is not an array");
|
|
@@ -1582,7 +1609,21 @@ class wsdl extends nusoap_base {
|
|
|
* @access private
|
|
|
*/
|
|
|
function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) {
|
|
|
+ $this->debug("serializeComplexTypeAttributes for XML Schema type $ns:$uqType");
|
|
|
$xml = '';
|
|
|
+ if (isset($typeDef['extensionBase'])) {
|
|
|
+ $nsx = $this->getPrefix($typeDef['extensionBase']);
|
|
|
+ $uqTypex = $this->getLocalPart($typeDef['extensionBase']);
|
|
|
+ if ($this->getNamespaceFromPrefix($nsx)) {
|
|
|
+ $nsx = $this->getNamespaceFromPrefix($nsx);
|
|
|
+ }
|
|
|
+ if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) {
|
|
|
+ $this->debug("serialize attributes for extension base $nsx:$uqTypex");
|
|
|
+ $xml .= $this->serializeComplexTypeAttributes($typeDefx, $value, $nsx, $uqTypex);
|
|
|
+ } else {
|
|
|
+ $this->debug("extension base $nsx:$uqTypex is not a supported type");
|
|
|
+ }
|
|
|
+ }
|
|
|
if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) {
|
|
|
$this->debug("serialize attributes for XML Schema type $ns:$uqType");
|
|
|
if (is_array($value)) {
|
|
@@ -1615,19 +1656,6 @@ class wsdl extends nusoap_base {
|
|
|
} else {
|
|
|
$this->debug("no attributes to serialize for XML Schema type $ns:$uqType");
|
|
|
}
|
|
|
- if (isset($typeDef['extensionBase'])) {
|
|
|
- $ns = $this->getPrefix($typeDef['extensionBase']);
|
|
|
- $uqType = $this->getLocalPart($typeDef['extensionBase']);
|
|
|
- if ($this->getNamespaceFromPrefix($ns)) {
|
|
|
- $ns = $this->getNamespaceFromPrefix($ns);
|
|
|
- }
|
|
|
- if ($typeDef = $this->getTypeDef($uqType, $ns)) {
|
|
|
- $this->debug("serialize attributes for extension base $ns:$uqType");
|
|
|
- $xml .= $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType);
|
|
|
- } else {
|
|
|
- $this->debug("extension base $ns:$uqType is not a supported type");
|
|
|
- }
|
|
|
- }
|
|
|
return $xml;
|
|
|
}
|
|
|
|
|
@@ -1644,7 +1672,21 @@ class wsdl extends nusoap_base {
|
|
|
* @access private
|
|
|
*/
|
|
|
function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) {
|
|
|
+ $this->debug("in serializeComplexTypeElements for XML Schema type $ns:$uqType");
|
|
|
$xml = '';
|
|
|
+ if (isset($typeDef['extensionBase'])) {
|
|
|
+ $nsx = $this->getPrefix($typeDef['extensionBase']);
|
|
|
+ $uqTypex = $this->getLocalPart($typeDef['extensionBase']);
|
|
|
+ if ($this->getNamespaceFromPrefix($nsx)) {
|
|
|
+ $nsx = $this->getNamespaceFromPrefix($nsx);
|
|
|
+ }
|
|
|
+ if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) {
|
|
|
+ $this->debug("serialize elements for extension base $nsx:$uqTypex");
|
|
|
+ $xml .= $this->serializeComplexTypeElements($typeDefx, $value, $nsx, $uqTypex, $use, $encodingStyle);
|
|
|
+ } else {
|
|
|
+ $this->debug("extension base $nsx:$uqTypex is not a supported type");
|
|
|
+ }
|
|
|
+ }
|
|
|
if (isset($typeDef['elements']) && is_array($typeDef['elements'])) {
|
|
|
$this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType");
|
|
|
if (is_array($value)) {
|
|
@@ -1701,7 +1743,12 @@ class wsdl extends nusoap_base {
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- if (isset($attrs['type']) || isset($attrs['ref'])) {
|
|
|
+ if (is_null($v) && isset($attrs['minOccurs']) && $attrs['minOccurs'] == '0') {
|
|
|
+ // do nothing
|
|
|
+ } elseif (is_null($v) && isset($attrs['nillable']) && $attrs['nillable'] == 'true') {
|
|
|
+ // TODO: serialize a nil correctly, but for now serialize schema-defined type
|
|
|
+ $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified);
|
|
|
+ } elseif (isset($attrs['type']) || isset($attrs['ref'])) {
|
|
|
// serialize schema-defined type
|
|
|
$xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified);
|
|
|
} else {
|
|
@@ -1715,19 +1762,6 @@ class wsdl extends nusoap_base {
|
|
|
} else {
|
|
|
$this->debug("no elements to serialize for XML Schema type $ns:$uqType");
|
|
|
}
|
|
|
- if (isset($typeDef['extensionBase'])) {
|
|
|
- $ns = $this->getPrefix($typeDef['extensionBase']);
|
|
|
- $uqType = $this->getLocalPart($typeDef['extensionBase']);
|
|
|
- if ($this->getNamespaceFromPrefix($ns)) {
|
|
|
- $ns = $this->getNamespaceFromPrefix($ns);
|
|
|
- }
|
|
|
- if ($typeDef = $this->getTypeDef($uqType, $ns)) {
|
|
|
- $this->debug("serialize elements for extension base $ns:$uqType");
|
|
|
- $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle);
|
|
|
- } else {
|
|
|
- $this->debug("extension base $ns:$uqType is not a supported type");
|
|
|
- }
|
|
|
- }
|
|
|
return $xml;
|
|
|
}
|
|
|
|
|
@@ -1833,7 +1867,7 @@ class wsdl extends nusoap_base {
|
|
|
if ($style == 'document') {
|
|
|
$elements = array();
|
|
|
foreach ($in as $n => $t) {
|
|
|
- $elements[$n] = array('name' => $n, 'type' => $t);
|
|
|
+ $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified');
|
|
|
}
|
|
|
$this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements);
|
|
|
$this->addElement(array('name' => $name, 'type' => $name . 'RequestType'));
|
|
@@ -1841,7 +1875,7 @@ class wsdl extends nusoap_base {
|
|
|
|
|
|
$elements = array();
|
|
|
foreach ($out as $n => $t) {
|
|
|
- $elements[$n] = array('name' => $n, 'type' => $t);
|
|
|
+ $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified');
|
|
|
}
|
|
|
$this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements);
|
|
|
$this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType', 'form' => 'qualified'));
|