Check-in [ffda452ea6]
Not logged in
Bounty program for improvements to Tcl and certain Tcl packages.

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Corrected handling of arrays elements.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: ffda452ea606c49c72382eaef0588c97a7e1f7dd
User & Date: gerald 2012-09-07 05:41:48
Context
2012-09-08 15:37
Enhanced processing of array elements. check-in: b83f5b24e3 user: gerald tags: trunk
2012-09-07 05:41
Corrected handling of arrays elements. check-in: ffda452ea6 user: gerald tags: trunk
2012-09-05 03:50
Correct handling of soap encoded arrays from complex type definition that is only a restriction making something an array. check-in: 69ecf185ee user: gerald tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to Utilities.tcl.

1266
1267
1268
1269
1270
1271
1272

1273
1274
1275
1276
1277
1278
1279
....
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
....
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
#
# Arguments :
#    mode        - The mode, Client or Server
#    serviceName - The service name the type is defined in
#    node        - The base node for the type.
#    type        - The name of the type
#    root        - The root node of the document

#
# Returns : A dictionary object for a given type.
#
# Side-Effects : None
#
# Exception Conditions : None
#
................................................................................
#
###########################################################################
proc ::WS::Utils::convertTypeToDict {mode serviceName node type root {isArray 0}} {
    variable typeInfo
    variable mutableTypeInfo
    variable options

    ::log::log debug [list ::WS::Utils::convertTypeToDict $mode $serviceName $node $type $root]
    if {[dict exists $typeInfo $mode $serviceName $type]} {
        set typeName $type
    } else {
        set typeName $serviceName:$type
    }
    set typeDefInfo [dict get $typeInfo $mode $serviceName $typeName]
    ::log::log debug "\t type def = {$typeDefInfo}"
................................................................................
                ##
                ::log::log debug "Trying #3 [list $node selectNodes $partName]"
                if {[catch {llength [set item [$node selectNodes $partName]]} len] || ($len == 0)} {
                    ::log::log debug "Trying #4 -- search of children"
                    set item {}
                    set matchList [list $partXns:$partName  $xns:$partName $partName]
                    foreach childNode [$node childNodes] {
                        ::log::log debug "\t\t Looking at [$childNode localName] "
                        # From SOAP1.1 Spec:
                        #    Within an array value, element names are not significant
                        # for distinguishing accessors. Elements may have any name.
                        # Here we don't need check the element name, just simple check
                        # it's a element node
                        if {!$allowAny && (
                             [$childNode nodeType] != "ELEMENT_NODE" ||
                             (!$isArray && ![string equal [$childNode localName] $partName]))} {
                            continue
                        }
                        ::log::log debug "\t\t Found $partName [$childNode asXML]"
                        lappend item $childNode
                    }
                    if {![string length $item]} {
                        ::log::log debug "\tSkipping"






>







 







|







 







|





|
<
<







1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
....
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
....
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376


1377
1378
1379
1380
1381
1382
1383
#
# Arguments :
#    mode        - The mode, Client or Server
#    serviceName - The service name the type is defined in
#    node        - The base node for the type.
#    type        - The name of the type
#    root        - The root node of the document
#    isArray     - We are looking for array elements
#
# Returns : A dictionary object for a given type.
#
# Side-Effects : None
#
# Exception Conditions : None
#
................................................................................
#
###########################################################################
proc ::WS::Utils::convertTypeToDict {mode serviceName node type root {isArray 0}} {
    variable typeInfo
    variable mutableTypeInfo
    variable options

    ::log::log debug [list ::WS::Utils::convertTypeToDict $mode $serviceName $node $type $root $isArray]
    if {[dict exists $typeInfo $mode $serviceName $type]} {
        set typeName $type
    } else {
        set typeName $serviceName:$type
    }
    set typeDefInfo [dict get $typeInfo $mode $serviceName $typeName]
    ::log::log debug "\t type def = {$typeDefInfo}"
................................................................................
                ##
                ::log::log debug "Trying #3 [list $node selectNodes $partName]"
                if {[catch {llength [set item [$node selectNodes $partName]]} len] || ($len == 0)} {
                    ::log::log debug "Trying #4 -- search of children"
                    set item {}
                    set matchList [list $partXns:$partName  $xns:$partName $partName]
                    foreach childNode [$node childNodes] {
                        ::log::log debug "\t\t Looking at [$childNode localName] ($allowAny,$isArray,[$childNode nodeType],$partName)"
                        # From SOAP1.1 Spec:
                        #    Within an array value, element names are not significant
                        # for distinguishing accessors. Elements may have any name.
                        # Here we don't need check the element name, just simple check
                        # it's a element node
                        if {!$allowAny} {


                            continue
                        }
                        ::log::log debug "\t\t Found $partName [$childNode asXML]"
                        lappend item $childNode
                    }
                    if {![string length $item]} {
                        ::log::log debug "\tSkipping"