mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
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
This commit is contained in:
parent
d712310518
commit
d4b27a0b36
6 changed files with 46 additions and 21 deletions
|
@ -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).
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -34,6 +34,10 @@ module ClientTest
|
|||
member :user, User
|
||||
member :users, [User]
|
||||
end
|
||||
|
||||
class WithMultiDimArray < ActionWebService::Struct
|
||||
member :pref, [[:string]]
|
||||
end
|
||||
|
||||
class API < ActionWebService::API::Base
|
||||
api_method :void
|
||||
|
@ -48,6 +52,7 @@ module ClientTest
|
|||
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
|
||||
|
@ -124,6 +129,10 @@ module ClientTest
|
|||
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
|
||||
|
|
|
@ -29,3 +29,10 @@ ActiveRecord::Base.establish_connection(
|
|||
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
|
|
@ -142,4 +142,11 @@ class TC_ClientSoap < Test::Unit::TestCase
|
|||
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
|
||||
|
|
|
@ -141,4 +141,11 @@ class TC_ClientXmlRpc < Test::Unit::TestCase
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue