* lib/soap/**/*.rb, lib/wsdl/**/*.rb, lib/xsd/**/*.rb: changed license; GPL2 -> Ruby's.
* lib/soap/rpc/driver.rb, lib/soap/wsdlDriver.rb, lib/soap/streamHandler.rb: add interface to streamhandler.
* lib/soap/marshal.rb: raise error if parse fails.
* lib/soap/netHttpClient.rb: add https support. Patched by Oliver M. Bolzer.
* lib/soap/netHttpClient.rb: dump HTTP response message body by itself.
* lib/soap/rpc/driver.rb, lib/soap/rpc/proxy.rb, lib/soap/wsdlDriver.rb: add driver#mandatorycharset interface to foce using charset for parsing response from buggy server.
* lib/soap/encodingstyle/soapHandler.rb: support Apache Axis's half typed multi-ref array.
* lib/soap/mapping/factory.rb, lib/soap/mapping/registry.rb: map SOAPStruct which has multi-accessors which name are the same, to an array.
* lib/soap/rpc/element.rb: fixed illegal parameter order.
* lib/soap/rpc/element.rb: element name of response message could have the name other than 'return'.
* lib/wsdl/operation.rb, lib/wsdl/operationBinding.rb, lib/wsdl/soap/classDefCreator.rb, lib/wsdl/soap/methodDefCreator.rb, lib/wsdl/soap/methodDefCreatorSupport.rb: WSDL/1.1 allows plural fault definition in a operation. [ruby-talk:84948]
* test/wsdl/multiplefault.wsdl, test/wsdl/test_multiplefault.rb: add test for above fix.
* lib/wsdl/soap/complexType.rb: support WSDL array definition with maxOccures="unbound".
* lib/xsd/charset.rb: use cp932 under emx. Patched by Siena. / SHINAGAWA, Norihide in [ruby-dev:21972]
* lib/xsd/xmlparser/parser.rb: set @charset nil by default. Nil means 'follow encoding declaration in XML'.
* sample/soap/digraph.rb, sample/wsdl/amazon/wsdlDriver.rb, sample/wsdl/googleSearch/sampleClient.rb, sample/wsdl/googleSearch/wsdlDriver.rb, test/wsdl/test_emptycomplextype.rb, test/wsdl/marshal/test_wsdlmarshal.rb, test/xsd/test_xmlschemaparser.rb: use File.open(...) { |f| f.read } instead of File.open(...).read. [ruby-dev:21964]
* test/wsdl/emptycomplextype.wsdl, test/wsdl/test_emptycomplextype.rb: simplify the test case.
* test/wsdl/axisArray/*: add tests for axis's array encoding.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5022 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-11-25 02:31:33 -05:00
|
|
|
# SOAP4R - Mapping registry.
|
|
|
|
# Copyright (C) 2000, 2001, 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
2003-09-24 11:18:44 -04:00
|
|
|
|
* lib/soap/**/*.rb, lib/wsdl/**/*.rb, lib/xsd/**/*.rb: changed license; GPL2 -> Ruby's.
* lib/soap/rpc/driver.rb, lib/soap/wsdlDriver.rb, lib/soap/streamHandler.rb: add interface to streamhandler.
* lib/soap/marshal.rb: raise error if parse fails.
* lib/soap/netHttpClient.rb: add https support. Patched by Oliver M. Bolzer.
* lib/soap/netHttpClient.rb: dump HTTP response message body by itself.
* lib/soap/rpc/driver.rb, lib/soap/rpc/proxy.rb, lib/soap/wsdlDriver.rb: add driver#mandatorycharset interface to foce using charset for parsing response from buggy server.
* lib/soap/encodingstyle/soapHandler.rb: support Apache Axis's half typed multi-ref array.
* lib/soap/mapping/factory.rb, lib/soap/mapping/registry.rb: map SOAPStruct which has multi-accessors which name are the same, to an array.
* lib/soap/rpc/element.rb: fixed illegal parameter order.
* lib/soap/rpc/element.rb: element name of response message could have the name other than 'return'.
* lib/wsdl/operation.rb, lib/wsdl/operationBinding.rb, lib/wsdl/soap/classDefCreator.rb, lib/wsdl/soap/methodDefCreator.rb, lib/wsdl/soap/methodDefCreatorSupport.rb: WSDL/1.1 allows plural fault definition in a operation. [ruby-talk:84948]
* test/wsdl/multiplefault.wsdl, test/wsdl/test_multiplefault.rb: add test for above fix.
* lib/wsdl/soap/complexType.rb: support WSDL array definition with maxOccures="unbound".
* lib/xsd/charset.rb: use cp932 under emx. Patched by Siena. / SHINAGAWA, Norihide in [ruby-dev:21972]
* lib/xsd/xmlparser/parser.rb: set @charset nil by default. Nil means 'follow encoding declaration in XML'.
* sample/soap/digraph.rb, sample/wsdl/amazon/wsdlDriver.rb, sample/wsdl/googleSearch/sampleClient.rb, sample/wsdl/googleSearch/wsdlDriver.rb, test/wsdl/test_emptycomplextype.rb, test/wsdl/marshal/test_wsdlmarshal.rb, test/xsd/test_xmlschemaparser.rb: use File.open(...) { |f| f.read } instead of File.open(...).read. [ruby-dev:21964]
* test/wsdl/emptycomplextype.wsdl, test/wsdl/test_emptycomplextype.rb: simplify the test case.
* test/wsdl/axisArray/*: add tests for axis's array encoding.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5022 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-11-25 02:31:33 -05:00
|
|
|
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
|
|
|
# redistribute it and/or modify it under the same terms of Ruby's license;
|
|
|
|
# either the dual license version in 2003, or any later version.
|
2003-09-24 11:18:44 -04:00
|
|
|
|
|
|
|
|
|
|
|
require 'soap/baseData'
|
|
|
|
require 'soap/mapping/mapping'
|
|
|
|
require 'soap/mapping/typeMap'
|
|
|
|
require 'soap/mapping/factory'
|
|
|
|
require 'soap/mapping/rubytypeFactory'
|
|
|
|
|
|
|
|
|
|
|
|
module SOAP
|
|
|
|
|
|
|
|
|
|
|
|
module Marshallable
|
|
|
|
# @@type_ns = Mapping::RubyCustomTypeNamespace
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
module Mapping
|
|
|
|
|
|
|
|
|
|
|
|
module MappedException; end
|
|
|
|
|
|
|
|
|
|
|
|
RubyTypeName = XSD::QName.new(RubyTypeInstanceNamespace, 'rubyType')
|
2003-10-14 11:14:02 -04:00
|
|
|
RubyExtendName = XSD::QName.new(RubyTypeInstanceNamespace, 'extends')
|
|
|
|
RubyIVarName = XSD::QName.new(RubyTypeInstanceNamespace, 'ivars')
|
2003-09-24 11:18:44 -04:00
|
|
|
|
|
|
|
|
|
|
|
# Inner class to pass an exception.
|
|
|
|
class SOAPException; include Marshallable
|
2003-11-28 00:53:16 -05:00
|
|
|
attr_reader :excn_type_name, :cause
|
2003-09-24 11:18:44 -04:00
|
|
|
def initialize(e)
|
|
|
|
@excn_type_name = Mapping.name2elename(e.class.to_s)
|
|
|
|
@cause = e
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_e
|
|
|
|
if @cause.is_a?(::Exception)
|
|
|
|
@cause.extend(::SOAP::Mapping::MappedException)
|
|
|
|
return @cause
|
|
|
|
end
|
|
|
|
klass = Mapping.class_from_name(
|
|
|
|
Mapping.elename2name(@excn_type_name.to_s))
|
|
|
|
if klass.nil?
|
2003-11-28 00:53:16 -05:00
|
|
|
raise RuntimeError.new(@cause.message)
|
2003-09-24 11:18:44 -04:00
|
|
|
end
|
|
|
|
unless klass <= ::Exception
|
|
|
|
raise NameError.new
|
|
|
|
end
|
2003-11-28 00:53:16 -05:00
|
|
|
obj = klass.new(@cause.message)
|
2003-09-24 11:18:44 -04:00
|
|
|
obj.extend(::SOAP::Mapping::MappedException)
|
|
|
|
obj
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
# For anyType object: SOAP::Mapping::Object not ::Object
|
|
|
|
class Object; include Marshallable
|
|
|
|
def set_property(name, value)
|
|
|
|
var_name = name
|
|
|
|
begin
|
|
|
|
instance_eval <<-EOS
|
|
|
|
def #{ var_name }
|
|
|
|
@#{ var_name }
|
|
|
|
end
|
|
|
|
|
|
|
|
def #{ var_name }=(value)
|
|
|
|
@#{ var_name } = value
|
|
|
|
end
|
|
|
|
EOS
|
|
|
|
self.send(var_name + '=', value)
|
|
|
|
rescue SyntaxError
|
|
|
|
var_name = safe_name(var_name)
|
|
|
|
retry
|
|
|
|
end
|
|
|
|
|
|
|
|
var_name
|
|
|
|
end
|
|
|
|
|
|
|
|
def members
|
|
|
|
instance_variables.collect { |str| str[1..-1] }
|
|
|
|
end
|
|
|
|
|
|
|
|
def [](name)
|
|
|
|
if self.respond_to?(name)
|
|
|
|
self.send(name)
|
|
|
|
else
|
|
|
|
self.send(safe_name(name))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def []=(name, value)
|
|
|
|
if self.respond_to?(name)
|
|
|
|
self.send(name + '=', value)
|
|
|
|
else
|
|
|
|
self.send(safe_name(name) + '=', value)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def safe_name(name)
|
|
|
|
require 'md5'
|
|
|
|
"var_" << MD5.new(name).hexdigest
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
class MappingError < Error; end
|
|
|
|
|
|
|
|
|
|
|
|
class Registry
|
|
|
|
class Map
|
|
|
|
def initialize(registry)
|
|
|
|
@map = []
|
|
|
|
@registry = registry
|
|
|
|
end
|
|
|
|
|
* lib/soap/**/*.rb, lib/wsdl/**/*.rb, lib/xsd/**/*.rb: changed license; GPL2 -> Ruby's.
* lib/soap/rpc/driver.rb, lib/soap/wsdlDriver.rb, lib/soap/streamHandler.rb: add interface to streamhandler.
* lib/soap/marshal.rb: raise error if parse fails.
* lib/soap/netHttpClient.rb: add https support. Patched by Oliver M. Bolzer.
* lib/soap/netHttpClient.rb: dump HTTP response message body by itself.
* lib/soap/rpc/driver.rb, lib/soap/rpc/proxy.rb, lib/soap/wsdlDriver.rb: add driver#mandatorycharset interface to foce using charset for parsing response from buggy server.
* lib/soap/encodingstyle/soapHandler.rb: support Apache Axis's half typed multi-ref array.
* lib/soap/mapping/factory.rb, lib/soap/mapping/registry.rb: map SOAPStruct which has multi-accessors which name are the same, to an array.
* lib/soap/rpc/element.rb: fixed illegal parameter order.
* lib/soap/rpc/element.rb: element name of response message could have the name other than 'return'.
* lib/wsdl/operation.rb, lib/wsdl/operationBinding.rb, lib/wsdl/soap/classDefCreator.rb, lib/wsdl/soap/methodDefCreator.rb, lib/wsdl/soap/methodDefCreatorSupport.rb: WSDL/1.1 allows plural fault definition in a operation. [ruby-talk:84948]
* test/wsdl/multiplefault.wsdl, test/wsdl/test_multiplefault.rb: add test for above fix.
* lib/wsdl/soap/complexType.rb: support WSDL array definition with maxOccures="unbound".
* lib/xsd/charset.rb: use cp932 under emx. Patched by Siena. / SHINAGAWA, Norihide in [ruby-dev:21972]
* lib/xsd/xmlparser/parser.rb: set @charset nil by default. Nil means 'follow encoding declaration in XML'.
* sample/soap/digraph.rb, sample/wsdl/amazon/wsdlDriver.rb, sample/wsdl/googleSearch/sampleClient.rb, sample/wsdl/googleSearch/wsdlDriver.rb, test/wsdl/test_emptycomplextype.rb, test/wsdl/marshal/test_wsdlmarshal.rb, test/xsd/test_xmlschemaparser.rb: use File.open(...) { |f| f.read } instead of File.open(...).read. [ruby-dev:21964]
* test/wsdl/emptycomplextype.wsdl, test/wsdl/test_emptycomplextype.rb: simplify the test case.
* test/wsdl/axisArray/*: add tests for axis's array encoding.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5022 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-11-25 02:31:33 -05:00
|
|
|
def obj2soap(klass, obj, type_qname = nil)
|
2003-09-24 11:18:44 -04:00
|
|
|
@map.each do |obj_class, soap_class, factory, info|
|
|
|
|
if klass == obj_class or
|
|
|
|
(info[:derived_class] and klass <= obj_class)
|
|
|
|
ret = factory.obj2soap(soap_class, obj, info, @registry)
|
|
|
|
return ret if ret
|
|
|
|
end
|
|
|
|
end
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def soap2obj(klass, node)
|
|
|
|
@map.each do |obj_class, soap_class, factory, info|
|
|
|
|
if klass == soap_class or
|
|
|
|
(info[:derived_class] and klass <= soap_class)
|
|
|
|
conv, obj = factory.soap2obj(obj_class, node, info, @registry)
|
|
|
|
return true, obj if conv
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
# Give priority to former entry.
|
|
|
|
def init(init_map = [])
|
|
|
|
clear
|
|
|
|
init_map.reverse_each do |obj_class, soap_class, factory, info|
|
|
|
|
add(obj_class, soap_class, factory, info)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Give priority to latter entry.
|
|
|
|
def add(obj_class, soap_class, factory, info)
|
|
|
|
info ||= {}
|
|
|
|
@map.unshift([obj_class, soap_class, factory, info])
|
|
|
|
end
|
|
|
|
|
|
|
|
def clear
|
|
|
|
@map.clear
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_mapped_soap_class(target_obj_class)
|
|
|
|
@map.each do |obj_class, soap_class, factory, info|
|
|
|
|
if obj_class == target_obj_class
|
|
|
|
return soap_class
|
|
|
|
end
|
|
|
|
end
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_mapped_obj_class(target_soap_class)
|
|
|
|
@map.each do |obj_class, soap_class, factory, info|
|
|
|
|
if soap_class == target_soap_class
|
|
|
|
return obj_class
|
|
|
|
end
|
|
|
|
end
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
StringFactory = StringFactory_.new
|
|
|
|
BasetypeFactory = BasetypeFactory_.new
|
|
|
|
DateTimeFactory = DateTimeFactory_.new
|
|
|
|
ArrayFactory = ArrayFactory_.new
|
|
|
|
Base64Factory = Base64Factory_.new
|
|
|
|
TypedArrayFactory = TypedArrayFactory_.new
|
|
|
|
TypedStructFactory = TypedStructFactory_.new
|
|
|
|
|
|
|
|
HashFactory = HashFactory_.new
|
|
|
|
|
|
|
|
SOAPBaseMap = [
|
|
|
|
[::NilClass, ::SOAP::SOAPNil, BasetypeFactory],
|
|
|
|
[::TrueClass, ::SOAP::SOAPBoolean, BasetypeFactory],
|
|
|
|
[::FalseClass, ::SOAP::SOAPBoolean, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPString, StringFactory],
|
2003-10-14 11:14:02 -04:00
|
|
|
[::DateTime, ::SOAP::SOAPDateTime, DateTimeFactory],
|
|
|
|
[::Date, ::SOAP::SOAPDateTime, DateTimeFactory],
|
|
|
|
[::Date, ::SOAP::SOAPDate, DateTimeFactory],
|
|
|
|
[::Time, ::SOAP::SOAPDateTime, DateTimeFactory],
|
|
|
|
[::Time, ::SOAP::SOAPTime, DateTimeFactory],
|
2003-09-24 11:18:44 -04:00
|
|
|
[::Float, ::SOAP::SOAPDouble, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Float, ::SOAP::SOAPFloat, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Integer, ::SOAP::SOAPInt, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Integer, ::SOAP::SOAPLong, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Integer, ::SOAP::SOAPInteger, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Integer, ::SOAP::SOAPShort, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::URI::Generic, ::SOAP::SOAPAnyURI, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::String, ::SOAP::SOAPBase64, Base64Factory],
|
|
|
|
[::String, ::SOAP::SOAPHexBinary, Base64Factory],
|
|
|
|
[::String, ::SOAP::SOAPDecimal, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPDuration, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGYearMonth, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGYear, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGMonthDay, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGDay, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGMonth, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPQName, BasetypeFactory],
|
|
|
|
|
2003-11-28 00:53:16 -05:00
|
|
|
[::Hash, ::SOAP::SOAPArray, HashFactory],
|
|
|
|
[::Hash, ::SOAP::SOAPStruct, HashFactory],
|
|
|
|
|
2003-09-24 11:18:44 -04:00
|
|
|
[::Array, ::SOAP::SOAPArray, ArrayFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
|
|
|
|
[::SOAP::Mapping::SOAPException,
|
|
|
|
::SOAP::SOAPStruct, TypedStructFactory,
|
|
|
|
{:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
|
|
|
|
]
|
|
|
|
|
|
|
|
RubyOriginalMap = [
|
|
|
|
[::NilClass, ::SOAP::SOAPNil, BasetypeFactory],
|
|
|
|
[::TrueClass, ::SOAP::SOAPBoolean, BasetypeFactory],
|
|
|
|
[::FalseClass, ::SOAP::SOAPBoolean, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPString, StringFactory],
|
2003-10-14 11:14:02 -04:00
|
|
|
[::DateTime, ::SOAP::SOAPDateTime, DateTimeFactory],
|
|
|
|
[::Date, ::SOAP::SOAPDateTime, DateTimeFactory],
|
|
|
|
[::Date, ::SOAP::SOAPDate, DateTimeFactory],
|
|
|
|
[::Time, ::SOAP::SOAPDateTime, DateTimeFactory],
|
|
|
|
[::Time, ::SOAP::SOAPTime, DateTimeFactory],
|
2003-09-24 11:18:44 -04:00
|
|
|
[::Float, ::SOAP::SOAPDouble, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Float, ::SOAP::SOAPFloat, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Integer, ::SOAP::SOAPInt, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Integer, ::SOAP::SOAPLong, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Integer, ::SOAP::SOAPInteger, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::Integer, ::SOAP::SOAPShort, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::URI::Generic, ::SOAP::SOAPAnyURI, BasetypeFactory,
|
|
|
|
{:derived_class => true}],
|
|
|
|
[::String, ::SOAP::SOAPBase64, Base64Factory],
|
|
|
|
[::String, ::SOAP::SOAPHexBinary, Base64Factory],
|
|
|
|
[::String, ::SOAP::SOAPDecimal, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPDuration, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGYearMonth, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGYear, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGMonthDay, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGDay, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPGMonth, BasetypeFactory],
|
|
|
|
[::String, ::SOAP::SOAPQName, BasetypeFactory],
|
|
|
|
|
2003-11-28 00:53:16 -05:00
|
|
|
[::Hash, ::SOAP::SOAPArray, HashFactory],
|
|
|
|
[::Hash, ::SOAP::SOAPStruct, HashFactory],
|
|
|
|
|
2003-09-24 11:18:44 -04:00
|
|
|
# Does not allow Array's subclass here.
|
|
|
|
[::Array, ::SOAP::SOAPArray, ArrayFactory],
|
|
|
|
|
|
|
|
[::SOAP::Mapping::SOAPException,
|
|
|
|
::SOAP::SOAPStruct, TypedStructFactory,
|
|
|
|
{:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
|
|
|
|
]
|
|
|
|
|
|
|
|
def initialize(config = {})
|
|
|
|
@config = config
|
|
|
|
@map = Map.new(self)
|
|
|
|
if @config[:allow_original_mapping]
|
2003-10-14 11:14:02 -04:00
|
|
|
@allow_original_mapping = true
|
2003-09-24 11:18:44 -04:00
|
|
|
@map.init(RubyOriginalMap)
|
|
|
|
else
|
2003-10-14 11:14:02 -04:00
|
|
|
@allow_original_mapping = false
|
2003-09-24 11:18:44 -04:00
|
|
|
@map.init(SOAPBaseMap)
|
|
|
|
end
|
|
|
|
|
2003-10-14 11:14:02 -04:00
|
|
|
@allow_untyped_struct = @config.key?(:allow_untyped_struct) ?
|
2003-09-24 11:18:44 -04:00
|
|
|
@config[:allow_untyped_struct] : true
|
|
|
|
@rubytype_factory = RubytypeFactory.new(
|
2003-10-14 11:14:02 -04:00
|
|
|
:allow_untyped_struct => @allow_untyped_struct,
|
|
|
|
:allow_original_mapping => @allow_original_mapping
|
2003-09-24 11:18:44 -04:00
|
|
|
)
|
|
|
|
@default_factory = @rubytype_factory
|
|
|
|
@excn_handler_obj2soap = nil
|
|
|
|
@excn_handler_soap2obj = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def add(obj_class, soap_class, factory, info = nil)
|
|
|
|
@map.add(obj_class, soap_class, factory, info)
|
|
|
|
end
|
|
|
|
alias :set :add
|
|
|
|
|
|
|
|
# This mapping registry ignores type hint.
|
* lib/soap/**/*.rb, lib/wsdl/**/*.rb, lib/xsd/**/*.rb: changed license; GPL2 -> Ruby's.
* lib/soap/rpc/driver.rb, lib/soap/wsdlDriver.rb, lib/soap/streamHandler.rb: add interface to streamhandler.
* lib/soap/marshal.rb: raise error if parse fails.
* lib/soap/netHttpClient.rb: add https support. Patched by Oliver M. Bolzer.
* lib/soap/netHttpClient.rb: dump HTTP response message body by itself.
* lib/soap/rpc/driver.rb, lib/soap/rpc/proxy.rb, lib/soap/wsdlDriver.rb: add driver#mandatorycharset interface to foce using charset for parsing response from buggy server.
* lib/soap/encodingstyle/soapHandler.rb: support Apache Axis's half typed multi-ref array.
* lib/soap/mapping/factory.rb, lib/soap/mapping/registry.rb: map SOAPStruct which has multi-accessors which name are the same, to an array.
* lib/soap/rpc/element.rb: fixed illegal parameter order.
* lib/soap/rpc/element.rb: element name of response message could have the name other than 'return'.
* lib/wsdl/operation.rb, lib/wsdl/operationBinding.rb, lib/wsdl/soap/classDefCreator.rb, lib/wsdl/soap/methodDefCreator.rb, lib/wsdl/soap/methodDefCreatorSupport.rb: WSDL/1.1 allows plural fault definition in a operation. [ruby-talk:84948]
* test/wsdl/multiplefault.wsdl, test/wsdl/test_multiplefault.rb: add test for above fix.
* lib/wsdl/soap/complexType.rb: support WSDL array definition with maxOccures="unbound".
* lib/xsd/charset.rb: use cp932 under emx. Patched by Siena. / SHINAGAWA, Norihide in [ruby-dev:21972]
* lib/xsd/xmlparser/parser.rb: set @charset nil by default. Nil means 'follow encoding declaration in XML'.
* sample/soap/digraph.rb, sample/wsdl/amazon/wsdlDriver.rb, sample/wsdl/googleSearch/sampleClient.rb, sample/wsdl/googleSearch/wsdlDriver.rb, test/wsdl/test_emptycomplextype.rb, test/wsdl/marshal/test_wsdlmarshal.rb, test/xsd/test_xmlschemaparser.rb: use File.open(...) { |f| f.read } instead of File.open(...).read. [ruby-dev:21964]
* test/wsdl/emptycomplextype.wsdl, test/wsdl/test_emptycomplextype.rb: simplify the test case.
* test/wsdl/axisArray/*: add tests for axis's array encoding.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5022 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-11-25 02:31:33 -05:00
|
|
|
def obj2soap(klass, obj, type_qname = nil)
|
|
|
|
soap = _obj2soap(klass, obj, type_qname)
|
2003-10-14 11:14:02 -04:00
|
|
|
if @allow_original_mapping
|
|
|
|
addextend2soap(soap, obj)
|
|
|
|
end
|
|
|
|
soap
|
|
|
|
end
|
|
|
|
|
|
|
|
def soap2obj(klass, node)
|
|
|
|
obj = _soap2obj(klass, node)
|
|
|
|
if @allow_original_mapping
|
|
|
|
addextend2obj(obj, node.extraattr[RubyExtendName])
|
|
|
|
addiv2obj(obj, node.extraattr[RubyIVarName])
|
|
|
|
end
|
|
|
|
obj
|
|
|
|
end
|
|
|
|
|
|
|
|
def default_factory=(factory)
|
|
|
|
@default_factory = factory
|
|
|
|
end
|
|
|
|
|
|
|
|
def excn_handler_obj2soap=(handler)
|
|
|
|
@excn_handler_obj2soap = handler
|
|
|
|
end
|
|
|
|
|
|
|
|
def excn_handler_soap2obj=(handler)
|
|
|
|
@excn_handler_soap2obj = handler
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_mapped_soap_class(obj_class)
|
|
|
|
@map.find_mapped_soap_class(obj_class)
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_mapped_obj_class(soap_class)
|
|
|
|
@map.find_mapped_obj_class(soap_class)
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
* lib/soap/**/*.rb, lib/wsdl/**/*.rb, lib/xsd/**/*.rb: changed license; GPL2 -> Ruby's.
* lib/soap/rpc/driver.rb, lib/soap/wsdlDriver.rb, lib/soap/streamHandler.rb: add interface to streamhandler.
* lib/soap/marshal.rb: raise error if parse fails.
* lib/soap/netHttpClient.rb: add https support. Patched by Oliver M. Bolzer.
* lib/soap/netHttpClient.rb: dump HTTP response message body by itself.
* lib/soap/rpc/driver.rb, lib/soap/rpc/proxy.rb, lib/soap/wsdlDriver.rb: add driver#mandatorycharset interface to foce using charset for parsing response from buggy server.
* lib/soap/encodingstyle/soapHandler.rb: support Apache Axis's half typed multi-ref array.
* lib/soap/mapping/factory.rb, lib/soap/mapping/registry.rb: map SOAPStruct which has multi-accessors which name are the same, to an array.
* lib/soap/rpc/element.rb: fixed illegal parameter order.
* lib/soap/rpc/element.rb: element name of response message could have the name other than 'return'.
* lib/wsdl/operation.rb, lib/wsdl/operationBinding.rb, lib/wsdl/soap/classDefCreator.rb, lib/wsdl/soap/methodDefCreator.rb, lib/wsdl/soap/methodDefCreatorSupport.rb: WSDL/1.1 allows plural fault definition in a operation. [ruby-talk:84948]
* test/wsdl/multiplefault.wsdl, test/wsdl/test_multiplefault.rb: add test for above fix.
* lib/wsdl/soap/complexType.rb: support WSDL array definition with maxOccures="unbound".
* lib/xsd/charset.rb: use cp932 under emx. Patched by Siena. / SHINAGAWA, Norihide in [ruby-dev:21972]
* lib/xsd/xmlparser/parser.rb: set @charset nil by default. Nil means 'follow encoding declaration in XML'.
* sample/soap/digraph.rb, sample/wsdl/amazon/wsdlDriver.rb, sample/wsdl/googleSearch/sampleClient.rb, sample/wsdl/googleSearch/wsdlDriver.rb, test/wsdl/test_emptycomplextype.rb, test/wsdl/marshal/test_wsdlmarshal.rb, test/xsd/test_xmlschemaparser.rb: use File.open(...) { |f| f.read } instead of File.open(...).read. [ruby-dev:21964]
* test/wsdl/emptycomplextype.wsdl, test/wsdl/test_emptycomplextype.rb: simplify the test case.
* test/wsdl/axisArray/*: add tests for axis's array encoding.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5022 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-11-25 02:31:33 -05:00
|
|
|
def _obj2soap(klass, obj, type_qname)
|
2003-09-24 11:18:44 -04:00
|
|
|
ret = nil
|
2003-10-14 11:14:02 -04:00
|
|
|
if obj.is_a?(SOAPStruct) or obj.is_a?(SOAPArray)
|
2003-09-24 11:18:44 -04:00
|
|
|
obj.replace do |ele|
|
|
|
|
Mapping._obj2soap(ele, self)
|
|
|
|
end
|
|
|
|
return obj
|
|
|
|
elsif obj.is_a?(SOAPBasetype)
|
|
|
|
return obj
|
|
|
|
end
|
|
|
|
begin
|
* lib/soap/**/*.rb, lib/wsdl/**/*.rb, lib/xsd/**/*.rb: changed license; GPL2 -> Ruby's.
* lib/soap/rpc/driver.rb, lib/soap/wsdlDriver.rb, lib/soap/streamHandler.rb: add interface to streamhandler.
* lib/soap/marshal.rb: raise error if parse fails.
* lib/soap/netHttpClient.rb: add https support. Patched by Oliver M. Bolzer.
* lib/soap/netHttpClient.rb: dump HTTP response message body by itself.
* lib/soap/rpc/driver.rb, lib/soap/rpc/proxy.rb, lib/soap/wsdlDriver.rb: add driver#mandatorycharset interface to foce using charset for parsing response from buggy server.
* lib/soap/encodingstyle/soapHandler.rb: support Apache Axis's half typed multi-ref array.
* lib/soap/mapping/factory.rb, lib/soap/mapping/registry.rb: map SOAPStruct which has multi-accessors which name are the same, to an array.
* lib/soap/rpc/element.rb: fixed illegal parameter order.
* lib/soap/rpc/element.rb: element name of response message could have the name other than 'return'.
* lib/wsdl/operation.rb, lib/wsdl/operationBinding.rb, lib/wsdl/soap/classDefCreator.rb, lib/wsdl/soap/methodDefCreator.rb, lib/wsdl/soap/methodDefCreatorSupport.rb: WSDL/1.1 allows plural fault definition in a operation. [ruby-talk:84948]
* test/wsdl/multiplefault.wsdl, test/wsdl/test_multiplefault.rb: add test for above fix.
* lib/wsdl/soap/complexType.rb: support WSDL array definition with maxOccures="unbound".
* lib/xsd/charset.rb: use cp932 under emx. Patched by Siena. / SHINAGAWA, Norihide in [ruby-dev:21972]
* lib/xsd/xmlparser/parser.rb: set @charset nil by default. Nil means 'follow encoding declaration in XML'.
* sample/soap/digraph.rb, sample/wsdl/amazon/wsdlDriver.rb, sample/wsdl/googleSearch/sampleClient.rb, sample/wsdl/googleSearch/wsdlDriver.rb, test/wsdl/test_emptycomplextype.rb, test/wsdl/marshal/test_wsdlmarshal.rb, test/xsd/test_xmlschemaparser.rb: use File.open(...) { |f| f.read } instead of File.open(...).read. [ruby-dev:21964]
* test/wsdl/emptycomplextype.wsdl, test/wsdl/test_emptycomplextype.rb: simplify the test case.
* test/wsdl/axisArray/*: add tests for axis's array encoding.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5022 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2003-11-25 02:31:33 -05:00
|
|
|
ret = @map.obj2soap(klass, obj, type_qname) ||
|
2003-09-24 11:18:44 -04:00
|
|
|
@default_factory.obj2soap(klass, obj, nil, self)
|
|
|
|
rescue MappingError
|
|
|
|
end
|
|
|
|
return ret if ret
|
|
|
|
if @excn_handler_obj2soap
|
|
|
|
ret = @excn_handler_obj2soap.call(obj) { |yield_obj|
|
|
|
|
Mapping._obj2soap(yield_obj, self)
|
|
|
|
}
|
|
|
|
end
|
|
|
|
return ret if ret
|
|
|
|
raise MappingError.new("Cannot map #{ klass.name } to SOAP/OM.")
|
|
|
|
end
|
|
|
|
|
2003-10-14 11:14:02 -04:00
|
|
|
# Might return nil as a mapping result.
|
|
|
|
def _soap2obj(klass, node)
|
2003-09-24 11:18:44 -04:00
|
|
|
if node.extraattr.key?(RubyTypeName)
|
|
|
|
conv, obj = @rubytype_factory.soap2obj(klass, node, nil, self)
|
|
|
|
return obj if conv
|
|
|
|
else
|
|
|
|
conv, obj = @map.soap2obj(klass, node)
|
|
|
|
return obj if conv
|
|
|
|
conv, obj = @default_factory.soap2obj(klass, node, nil, self)
|
|
|
|
return obj if conv
|
|
|
|
end
|
|
|
|
|
|
|
|
if @excn_handler_soap2obj
|
|
|
|
begin
|
|
|
|
return @excn_handler_soap2obj.call(node) { |yield_node|
|
2003-10-14 11:14:02 -04:00
|
|
|
Mapping._soap2obj(yield_node, self)
|
|
|
|
}
|
2003-09-24 11:18:44 -04:00
|
|
|
rescue Exception
|
|
|
|
end
|
|
|
|
end
|
|
|
|
raise MappingError.new("Cannot map #{ node.type.name } to Ruby object.")
|
|
|
|
end
|
|
|
|
|
2003-10-14 11:14:02 -04:00
|
|
|
def addiv2obj(obj, attr)
|
|
|
|
return unless attr
|
|
|
|
vars = {}
|
|
|
|
attr.__getobj__.each do |name, value|
|
|
|
|
vars[name] = Mapping._soap2obj(value, self)
|
|
|
|
end
|
|
|
|
Mapping.set_instance_vars(obj, vars)
|
2003-09-24 11:18:44 -04:00
|
|
|
end
|
|
|
|
|
2003-11-08 04:52:42 -05:00
|
|
|
if RUBY_VERSION >= '1.8.0'
|
|
|
|
def addextend2obj(obj, attr)
|
|
|
|
return unless attr
|
|
|
|
attr.split(/ /).reverse_each do |mstr|
|
|
|
|
obj.extend(Mapping.class_from_name(mstr))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
# (class < false; self; end).ancestors includes "TrueClass" under 1.6...
|
|
|
|
def addextend2obj(obj, attr)
|
|
|
|
return unless attr
|
|
|
|
attr.split(/ /).reverse_each do |mstr|
|
|
|
|
m = Mapping.class_from_name(mstr)
|
|
|
|
obj.extend(m) if m.class == Module
|
|
|
|
end
|
2003-10-14 11:14:02 -04:00
|
|
|
end
|
2003-09-24 11:18:44 -04:00
|
|
|
end
|
|
|
|
|
2003-10-14 11:14:02 -04:00
|
|
|
def addextend2soap(node, obj)
|
|
|
|
return if obj.is_a?(Symbol) or obj.is_a?(Fixnum)
|
|
|
|
list = (class << obj; self; end).ancestors - obj.class.ancestors
|
|
|
|
unless list.empty?
|
|
|
|
node.extraattr[RubyExtendName] = list.collect { |c|
|
|
|
|
if c.name.empty?
|
|
|
|
raise TypeError.new("singleton can't be dumped #{ obj }")
|
|
|
|
end
|
|
|
|
c.name
|
|
|
|
}.join(" ")
|
|
|
|
end
|
2003-09-24 11:18:44 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
DefaultRegistry = Registry.new
|
|
|
|
RubyOriginalRegistry = Registry.new(:allow_original_mapping => true)
|
|
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|