Skip to content

Commit

Permalink
Fix soap type registration of multidimensional arrays (closes #4232) …
Browse files Browse the repository at this point in the history
…[Kent]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3903 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
dhh committed Mar 17, 2006
1 parent d712310 commit d4b27a0
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 21 deletions.
2 changes: 2 additions & 0 deletions actionwebservice/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*

* Fix soap type registration of multidimensional arrays (#4232)

* Fix that marshaler couldn't handle ActiveRecord models defined in a different namespace (#2392).

* Fix that marshaler couldn't handle structs with members of ActiveRecord type (#1889).
Expand Down
Expand Up @@ -40,32 +40,25 @@ def ruby_to_soap(obj)
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)
Expand Down
9 changes: 9 additions & 0 deletions actionwebservice/test/abstract_client.rb
Expand Up @@ -34,6 +34,10 @@ class WithModel < ActionWebService::Struct
member :user, User
member :users, [User]
end

class WithMultiDimArray < ActionWebService::Struct
member :pref, [[:string]]
end

class API < ActionWebService::API::Base
api_method :void
Expand All @@ -48,6 +52,7 @@ class API < ActionWebService::API::Base
api_method :user_return, :returns => [User]
api_method :with_model_return, :returns => [WithModel]
api_method :scoped_model_return, :returns => [Accounting::User]
api_method :multi_dim_return, :returns => [WithMultiDimArray]
end

class NullLogOut
Expand Down Expand Up @@ -124,6 +129,10 @@ def with_model_return
def scoped_model_return
Accounting::User.find(1)
end

def multi_dim_return
WithMultiDimArray.new :pref => [%w{pref1 value1}, %w{pref2 value2}]
end
end

class AbstractClientLet < WEBrick::HTTPServlet::AbstractServlet
Expand Down
7 changes: 7 additions & 0 deletions actionwebservice/test/abstract_unit.rb
Expand Up @@ -29,3 +29,10 @@
ActiveRecord::Base.connection

Test::Unit::TestCase.fixture_path = "#{File.dirname(__FILE__)}/fixtures/"

# restore default raw_post functionality
class ActionController::TestRequest
def raw_post
super
end
end
7 changes: 7 additions & 0 deletions actionwebservice/test/client_soap_test.rb
Expand Up @@ -142,4 +142,11 @@ def test_scoped_model_return
assert_kind_of Accounting::User, scoped_model
assert_equal 'Kent', scoped_model.name
end

def test_multi_dim_return
md_struct = @client.multi_dim_return
assert_kind_of Array, md_struct.pref
assert_equal 2, md_struct.pref.size
assert_kind_of Array, md_struct.pref[0]
end
end
7 changes: 7 additions & 0 deletions actionwebservice/test/client_xmlrpc_test.rb
Expand Up @@ -141,4 +141,11 @@ def test_scoped_model_return
assert_kind_of Accounting::User, scoped_model
assert_equal 'Kent', scoped_model.name
end

def test_multi_dim_return
md_struct = @client.multi_dim_return
assert_kind_of Array, md_struct.pref
assert_equal 2, md_struct.pref.size
assert_kind_of Array, md_struct.pref[0]
end
end

0 comments on commit d4b27a0

Please sign in to comment.