From d4b27a0b36109c6ded5dba57db63d4ff12ec74d1 Mon Sep 17 00:00:00 2001
From: David Heinemeier Hansson <david@loudthinking.com>
Date: Fri, 17 Mar 2006 22:20:09 +0000
Subject: Fix soap type registration of multidimensional arrays (closes #4232)
 [Kent]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3903 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
---
 .../protocol/soap_protocol/marshaler.rb            | 35 +++++++++-------------
 1 file changed, 14 insertions(+), 21 deletions(-)

(limited to 'actionwebservice/lib/action_web_service/protocol/soap_protocol')

diff --git a/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb b/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb
index fa917ad4a5..351c9da159 100644
--- a/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb
+++ b/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb
@@ -40,32 +40,25 @@ module ActionWebService
         def register_type(type)
           return @type2binding[type] if @type2binding.has_key?(type)
 
-          type_class = type.array?? type.element_type.type_class : type.type_class
-          type_type = type.array?? type.element_type : type
-          type_binding = nil
-          if (mapping = @registry.find_mapped_soap_class(type_class) rescue nil)
-            qname = mapping[2] ? mapping[2][:type] : nil
-            qname ||= soap_base_type_name(mapping[0])
-            type_binding = SoapBinding.new(self, qname, type_type, mapping)
-          else
-            qname = XSD::QName.new(@namespace, soap_type_name(type_class.name))
-            @registry.add(type_class,
-                          SOAP::SOAPStruct,
-                          typed_struct_factory(type_class),
-                          { :type => qname })
-            mapping = @registry.find_mapped_soap_class(type_class)
-            type_binding = SoapBinding.new(self, qname, type_type, mapping)
-          end
-
-          array_binding = nil
           if type.array?
             array_mapping = @registry.find_mapped_soap_class(Array)
             qname = XSD::QName.new(@namespace, soap_type_name(type.element_type.type_class.name) + 'Array')
-            array_binding = SoapBinding.new(self, qname, type, array_mapping, type_binding)
+            element_type_binding = register_type(type.element_type)
+            @type2binding[type] = SoapBinding.new(self, qname, type, array_mapping, element_type_binding)
+          elsif (mapping = @registry.find_mapped_soap_class(type.type_class) rescue nil)
+            qname = mapping[2] ? mapping[2][:type] : nil
+            qname ||= soap_base_type_name(mapping[0])
+            @type2binding[type] = SoapBinding.new(self, qname, type, mapping)
+          else
+            qname = XSD::QName.new(@namespace, soap_type_name(type.type_class.name))
+            @registry.add(type.type_class,
+              SOAP::SOAPStruct,
+              typed_struct_factory(type.type_class),
+              { :type => qname })
+            mapping = @registry.find_mapped_soap_class(type.type_class)
+            @type2binding[type] = SoapBinding.new(self, qname, type, mapping)
           end
 
-          @type2binding[type] = array_binding ? array_binding : type_binding
-          
           if type.structured?
             type.each_member do |m_name, m_type|
               register_type(m_type)
-- 
cgit v1.2.3