Artifact [556be2b6cd]
Not logged in

Artifact 556be2b6cd3a935de5a3d7345325642e35d0dafa5fd117d35d6b3ec4e32c593c:

Attachment "Utilities.patch" to ticket [6fbee3208e] added by chw 2018-09-21 06:26:33.
Index: Utilities.tcl
==================================================================
--- Utilities.tcl
+++ Utilities.tcl
@@ -3390,11 +3390,11 @@
                             set partType $tns:$partType
                         }
                         ##
                         ## Convert the reference to the local tns space
                         ##
-                        set partType  [getQualifiedType $results $partType $tns]
+                        set partType [getQualifiedType $results $partType $tns $middleNode]
                         set refTypeInfo [GetServiceTypeDef $mode $serviceName $partType]
                         set refTypeInfo [dict get $refTypeInfo definition]
                         set tmpList [dict keys $refTypeInfo]
                         if {[llength $tmpList] == 1} {
                             ##
@@ -3404,11 +3404,11 @@
                                 ##
                                 ## To at type, so redefine the name
                                 ##
                                 set partName [lindex [dict keys $refTypeInfo] 0]
                             }
-                            set partType [getQualifiedType $results [dict get $refTypeInfo $partName type] $tns]
+                            set partType [getQualifiedType $results [dict get $refTypeInfo $partName type] $tns $middleNode]
                         }
                         lappend partList $partName [list type $partType]
                     }]} {
                         lappend unknownRef($partType) $typeName
                         return \
@@ -3416,11 +3416,12 @@
                             -errorcode [list WS $mode UNKREF [list $typeName $partType]] \
                             "Unknown forward type reference {$partType} in {$typeName}"
                     }
                 } else {
                     set partName [$middleNode getAttribute name]
-                    set partType [string trimright [getQualifiedType $results [$middleNode getAttribute type string:string] $tns] {?}]
+                    set partType [string trimright \
+                        [getQualifiedType $results [$middleNode getAttribute type string:string] $tns $middleNode] {?}]
                     set partMax [$middleNode getAttribute maxOccurs 1]
                     if {$partMax <= 1} {
                         lappend partList $partName [list type $partType comment $comment]
                     } else {
                         lappend partList $partName [list type [string trimright ${partType} {()}]() comment $comment]
@@ -3643,21 +3644,21 @@
             ##
         }
         element {
             catch {
                 set partName [$node getAttribute name]
-                set partType [string trimright [getQualifiedType $results [$node getAttribute type string] $tns] {?}]
+                set partType [string trimright [getQualifiedType $results [$node getAttribute type string] $tns $node] {?}]
                 set partMax [$node getAttribute maxOccurs 1]
                 if {$partMax <= 1} {
                     set partList [list $partName [list type $partType comment {}]]
                 } else {
                     set partList [list $partName [list type [string trimright ${partType} {()}]() comment {}]]
                 }
             }
         }
         extension {
-            set baseName [getQualifiedType $results [$node getAttribute base string] $tns]
+            set baseName [getQualifiedType $results [$node getAttribute base string] $tns $node]
             set baseTypeInfo [TypeInfo Client $serviceName $baseName]
             ::log::logsubst debug {\t base name of extension is {$baseName} with typeinfo {$baseTypeInfo}}
             if {[lindex $baseTypeInfo 0]} {
                 if {[catch {::WS::Utils::GetServiceTypeDef Client $serviceName $baseName}]} {
                     set baseQuery [format {child::*[attribute::name='%s']} $baseName]
@@ -3751,14 +3752,14 @@
                                 if {[info exists simpleTypes($mode,$serviceName,$tns:$partName)]} {
                                   set additional_defininition_elements $simpleTypes($mode,$serviceName,$tns:$partName)
                                   set partType [dict get $additional_defininition_elements baseType]
                                 }
                             } else {
-                                set partType [getQualifiedType $results [$element getAttribute type string] $tns]
+                                set partType [getQualifiedType $results [$element getAttribute type string] $tns $element]
                             }
                         } else {
-                            set partType [getQualifiedType $results [$element getAttribute type string] $tns]
+                            set partType [getQualifiedType $results [$element getAttribute type string] $tns $element]
                         }
                     }
                     if {[string length $occurs]} {
                         set partMax [$element getAttribute maxOccurs 1]
                         if {$partMax < $occurs} {
@@ -3900,11 +3901,11 @@
         ::log::logsubst debug {\t Type $tns:$typeName is already defined -- leaving}
         return
     }
     set typeType ""
     if {[$node hasAttribute type]} {
-        set typeType [getQualifiedType $results [$node getAttribute type string] $tns]
+        set typeType [getQualifiedType $results [$node getAttribute type string] $tns $node]
     }
     ::log::logsubst debug {Elemental Type is $typeName}
     set partList {}
     set partType {}
     set isAbstractType false
@@ -3976,16 +3977,16 @@
             if {[llength $childList]} {
                 ##
                 ## Element defines another element layer
                 ##
                 set partName [$element getAttribute name]
-                set partType [getQualifiedType $results $partName $tns]
+                set partType [getQualifiedType $results $partName $tns $element]
                 parseElementalType $mode results $serviceName $element $tns
             } else {
                 set partName [$element getAttribute name]
                 if {[$element hasAttribute type]} {
-                    set partType [getQualifiedType $results [$element getAttribute type] $tns]
+                    set partType [getQualifiedType $results [$element getAttribute type] $tns $element]
                 } else {
                     set partType xs:string
                 }
 
             }
@@ -4032,13 +4033,13 @@
                 }
             }
         }
         # have an element with a type only, so do the work here
         if {[$node hasAttribute type]} {
-            set partType [getQualifiedType $results [$node getAttribute type] $tns]
+            set partType [getQualifiedType $results [$node getAttribute type] $tns $node]
         } elseif {[$node hasAttribute base]}  {
-            set partType [getQualifiedType $results [$node getAttribute base] $tns]
+            set partType [getQualifiedType $results [$node getAttribute base] $tns $node]
         } else {
             set partType xs:string
         }
         set partMax [$node getAttribute maxOccurs 1]
         if {$partMax <= 1} {
@@ -4533,10 +4534,11 @@
 #
 # Arguments :
 #       serviceInfo - service information dictionary
 #       type        - type to get local qualified type on
 #       tns         - current namespace
+#       node        - optional XML item to search for xmlns:* attribute
 #
 # Returns :     nothing
 #
 # Side-Effects :        None
 #
@@ -4555,17 +4557,28 @@
 # Version     Date     Programmer   Comments / Changes / Reasons
 # -------  ----------  ----------   -------------------------------------------
 #       1  02/24/2011  G. Lester    Initial version
 #
 ###########################################################################
-proc ::WS::Utils::getQualifiedType {serviceInfo type tns} {
+proc ::WS::Utils::getQualifiedType {serviceInfo type tns {node {}}} {
 
     set typePartsList [split $type {:}]
     if {[llength $typePartsList] == 1} {
         set result $tns:$type
     } else {
         lassign $typePartsList tmpTns tmpType
+        if {$node ne {}} {
+            set attr xmlns:$tmpTns
+            if {[$node hasAttribute $attr]} {
+                set xmlns [$node getAttribute $attr]
+                if {[dict exists $serviceInfo tnsList url $xmlns]} {
+                    set result [dict get $serviceInfo tnsList url $xmlns]:$tmpType
+                    return $result
+                }
+                # fail later if namespace not found
+            }
+        }
         if {[dict exists $serviceInfo tnsList tns $tmpTns]} {
             set result [dict get $serviceInfo tnsList tns $tmpTns]:$tmpType
         } elseif {[dict exists $serviceInfo types $type]} {
             set result $type
         } else {
@@ -4572,12 +4585,12 @@
             ::log::log error $serviceInfo
             ::log::logsubst error {Could not find tns '$tmpTns' in '[dict get $serviceInfo tnsList tns]' for type {$type}}
             set result $tns:$type
             return -code error
         }
+    }
 
-    }
     return $result
 }
 
 ###########################################################################
 #