1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* added files

* lib/soap/attachment.rb
          * lib/soap/header
          * lib/soap/mimemessage.rb
          * lib/soap/rpc/httpserver.rb
          * lib/wsdl/soap/cgiStubCreator.rb
          * lib/wsdl/soap/classDefCreator.rb
          * lib/wsdl/soap/classDefCreatorSupport.rb
          * lib/wsdl/soap/clientSkeltonCreator.rb
          * lib/wsdl/soap/driverCreator.rb
          * lib/wsdl/soap/mappingRegistryCreator.rb
          * lib/wsdl/soap/methodDefCreator.rb
          * lib/wsdl/soap/servantSkeltonCreator.rb
          * lib/wsdl/soap/standaloneServerStubCreator.rb
          * lib/wsdl/xmlSchema/enumeration.rb
          * lib/wsdl/xmlSchema/simpleRestriction.rb
          * lib/wsdl/xmlSchema/simpleType.rb
          * lib/xsd/codegen
          * lib/xsd/codegen.rb
          * sample/soap/authheader
          * sample/soap/raa2.4
          * sample/soap/ssl
          * sample/soap/swa
          * sample/soap/whois.rb
          * sample/soap/calc/samplehttpd.conf
          * sample/soap/exchange/samplehttpd.conf
          * sample/soap/sampleStruct/samplehttpd.conf
          * sample/wsdl/raa2.4
          * sample/wsdl/googleSearch/samplehttpd.conf
          * test/openssl/_test_ssl.rb
          * test/soap/header
          * test/soap/ssl
          * test/soap/struct
          * test/soap/swa
          * test/soap/wsdlDriver
          * test/wsdl/multiplefault.wsdl
          * test/wsdl/simpletype
          * test/wsdl/test_multiplefault.rb

        * modified files
          * lib/soap/baseData.rb
          * lib/soap/element.rb
          * lib/soap/generator.rb
          * lib/soap/marshal.rb
          * lib/soap/netHttpClient.rb
          * lib/soap/parser.rb
          * lib/soap/processor.rb
          * lib/soap/property.rb
          * lib/soap/soap.rb
          * lib/soap/streamHandler.rb
          * lib/soap/wsdlDriver.rb
          * lib/soap/encodingstyle/handler.rb
          * lib/soap/encodingstyle/literalHandler.rb
          * lib/soap/encodingstyle/soapHandler.rb
          * lib/soap/mapping/factory.rb
          * lib/soap/mapping/mapping.rb
          * lib/soap/mapping/registry.rb
          * lib/soap/mapping/rubytypeFactory.rb
          * lib/soap/mapping/wsdlRegistry.rb
          * lib/soap/rpc/cgistub.rb
          * lib/soap/rpc/driver.rb
          * lib/soap/rpc/element.rb
          * lib/soap/rpc/proxy.rb
          * lib/soap/rpc/router.rb
          * lib/soap/rpc/soaplet.rb
          * lib/soap/rpc/standaloneServer.rb
          * lib/wsdl/data.rb
          * lib/wsdl/definitions.rb
          * lib/wsdl/operation.rb
          * lib/wsdl/parser.rb
          * lib/wsdl/soap/definitions.rb
          * lib/wsdl/xmlSchema/complexContent.rb
          * lib/wsdl/xmlSchema/complexType.rb
          * lib/wsdl/xmlSchema/data.rb
          * lib/wsdl/xmlSchema/parser.rb
          * lib/wsdl/xmlSchema/schema.rb
          * lib/xsd/datatypes.rb
          * lib/xsd/qname.rb
          * sample/soap/calc/httpd.rb
          * sample/soap/exchange/httpd.rb
          * sample/soap/sampleStruct/httpd.rb
          * sample/soap/sampleStruct/server.rb
          * sample/wsdl/amazon/AmazonSearch.rb
          * sample/wsdl/amazon/AmazonSearchDriver.rb
          * sample/wsdl/googleSearch/httpd.rb
          * test/soap/test_basetype.rb
          * test/soap/test_property.rb
          * test/soap/test_streamhandler.rb
          * test/soap/calc/test_calc.rb
          * test/soap/calc/test_calc2.rb
          * test/soap/calc/test_calc_cgi.rb
          * test/soap/helloworld/test_helloworld.rb
          * test/wsdl/test_emptycomplextype.rb
          * test/wsdl/axisArray/test_axisarray.rb
          * test/wsdl/datetime/test_datetime.rb
          * test/wsdl/raa/test_raa.rb
          * test/xsd/test_xmlschemaparser.rb
          * test/xsd/test_xsd.rb

        * summary
          * add SOAP Header mustUnderstand support.

          * add HTTP client SSL configuration and Cookies support (works
            completely with http-access2).

          * add header handler for handling sending/receiving SOAP Header.

          * map Ruby's anonymous Struct to common SOAP Struct in SOAP Object
            Model.  it caused error.

          * add WSDL simpleType support to restrict lexical value space.

          * add SOAP with Attachment support.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6567 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nahi 2004-07-03 15:29:32 +00:00
parent df2066555d
commit ab31bf0d4d
60 changed files with 2262 additions and 3170 deletions

View file

@ -70,6 +70,7 @@ class Factory
end
def setiv2soap(node, obj, map)
# should we sort instance_variables?
obj.instance_variables.each do |var|
name = var.sub(/^@/, '')
node.add(Mapping.name2elename(name),

View file

@ -68,24 +68,26 @@ module Mapping
md_ary
end
def self.fault2exception(e, registry = nil)
def self.fault2exception(fault, registry = nil)
registry ||= Mapping::DefaultRegistry
detail = if e.detail
soap2obj(e.detail, registry) || ""
detail = if fault.detail
soap2obj(fault.detail, registry) || ""
else
""
end
if detail.is_a?(Mapping::SOAPException)
begin
remote_backtrace = detail.to_e.backtrace
raise detail.to_e
rescue Exception => e2
e2.set_backtrace(remote_backtrace + e2.backtrace)
e = detail.to_e
remote_backtrace = e.backtrace
e.set_backtrace(nil)
raise e # ruby sets current caller as local backtrace of e => e2.
rescue Exception => e
e.set_backtrace(remote_backtrace + e.backtrace[1..-1])
raise
end
else
e.detail = detail
e.set_backtrace(
fault.detail = detail
fault.set_backtrace(
if detail.is_a?(Array)
detail
else
@ -98,9 +100,7 @@ module Mapping
def self._obj2soap(obj, registry, type = nil)
if referent = Thread.current[:SOAPMarshalDataKey][obj.__id__]
soap_obj = SOAPReference.new
soap_obj.__setobj__(referent)
soap_obj
SOAPReference.new(referent)
else
registry.obj2soap(obj.class, obj, type)
end

View file

@ -44,14 +44,15 @@ class SOAPException; include Marshallable
if @cause.is_a?(::Exception)
@cause.extend(::SOAP::Mapping::MappedException)
return @cause
elsif @cause.respond_to?(:message) and @cause.respond_to?(:backtrace)
e = RuntimeError.new(@cause.message)
e.set_backtrace(@cause.backtrace)
return e
end
klass = Mapping.class_from_name(
Mapping.elename2name(@excn_type_name.to_s))
if klass.nil?
raise RuntimeError.new(@cause.message)
end
unless klass <= ::Exception
raise NameError.new
if klass.nil? or not klass <= ::Exception
return RuntimeError.new(@cause.inspect)
end
obj = klass.new(@cause.message)
obj.extend(::SOAP::Mapping::MappedException)
@ -62,50 +63,78 @@ 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] }
def initialize
@__members = []
@__value_type = {}
end
def [](name)
if self.respond_to?(name)
self.send(name)
if @__members.include?(name)
self.__send__(name)
else
self.send(safe_name(name))
self.__send__(Object.safe_name(name))
end
end
def []=(name, value)
if self.respond_to?(name)
self.send(name + '=', value)
if @__members.include?(name)
self.__send__(name + '=', value)
else
self.send(safe_name(name) + '=', value)
self.__send__(Object.safe_name(name) + '=', value)
end
end
def __set_property(name, value)
var_name = name
unless @__members.include?(name)
var_name = __define_attr_accessor(var_name)
end
__set_property_value(var_name, value)
var_name
end
def __members
@__members
end
private
def safe_name(name)
def __set_property_value(name, value)
org = self.__send__(name)
case @__value_type[name]
when :single
self.__send__(name + '=', [org, value])
@__value_type[name] = :multi
when :multi
org << value
else
self.__send__(name + '=', value)
@__value_type[name] = :single
end
value
end
def __define_attr_accessor(name)
var_name = name
begin
instance_eval <<-EOS
def #{ var_name }
@#{ var_name }
end
def #{ var_name }=(value)
@#{ var_name } = value
end
EOS
rescue SyntaxError
var_name = Object.safe_name(var_name)
retry
end
@__members << var_name
var_name
end
def Object.safe_name(name)
require 'md5'
"var_" << MD5.new(name).hexdigest
end
@ -309,7 +338,7 @@ class Registry
def add(obj_class, soap_class, factory, info = nil)
@map.add(obj_class, soap_class, factory, info)
end
alias :set :add
alias set add
# This mapping registry ignores type hint.
def obj2soap(klass, obj, type_qname = nil)

View file

@ -38,7 +38,7 @@ class RubytypeFactory < Factory
def obj2soap(soap_class, obj, info, map)
param = nil
case obj
when String
when ::String
unless @allow_original_mapping
return nil
end
@ -47,7 +47,7 @@ class RubytypeFactory < Factory
param.extraattr[RubyTypeName] = obj.class.name
end
addiv2soapattr(param, obj, map)
when Time
when ::Time
unless @allow_original_mapping
return nil
end
@ -56,7 +56,7 @@ class RubytypeFactory < Factory
param.extraattr[RubyTypeName] = obj.class.name
end
addiv2soapattr(param, obj, map)
when Array
when ::Array
unless @allow_original_mapping
return nil
end
@ -65,19 +65,19 @@ class RubytypeFactory < Factory
param.extraattr[RubyTypeName] = obj.class.name
end
addiv2soapattr(param, obj, map)
when NilClass
when ::NilClass
unless @allow_original_mapping
return nil
end
param = @basetype_factory.obj2soap(SOAPNil, obj, info, map)
addiv2soapattr(param, obj, map)
when FalseClass, TrueClass
when ::FalseClass, ::TrueClass
unless @allow_original_mapping
return nil
end
param = @basetype_factory.obj2soap(SOAPBoolean, obj, info, map)
addiv2soapattr(param, obj, map)
when Integer
when ::Integer
unless @allow_original_mapping
return nil
end
@ -85,7 +85,7 @@ class RubytypeFactory < Factory
param ||= @basetype_factory.obj2soap(SOAPInteger, obj, info, map)
param ||= @basetype_factory.obj2soap(SOAPDecimal, obj, info, map)
addiv2soapattr(param, obj, map)
when Float
when ::Float
unless @allow_original_mapping
return nil
end
@ -94,7 +94,7 @@ class RubytypeFactory < Factory
param.extraattr[RubyTypeName] = obj.class.name
end
addiv2soapattr(param, obj, map)
when Hash
when ::Hash
unless @allow_original_mapping
return nil
end
@ -114,7 +114,7 @@ class RubytypeFactory < Factory
end
param.add('default', Mapping._obj2soap(obj.default, map))
addiv2soapattr(param, obj, map)
when Regexp
when ::Regexp
unless @allow_original_mapping
return nil
end
@ -150,7 +150,7 @@ class RubytypeFactory < Factory
end
param.add('options', SOAPInt.new(options))
addiv2soapattr(param, obj, map)
when Range
when ::Range
unless @allow_original_mapping
return nil
end
@ -163,29 +163,29 @@ class RubytypeFactory < Factory
param.add('end', Mapping._obj2soap(obj.end, map))
param.add('exclude_end', SOAP::SOAPBoolean.new(obj.exclude_end?))
addiv2soapattr(param, obj, map)
when Class
when ::Class
unless @allow_original_mapping
return nil
end
if obj.to_s[0] == ?#
raise TypeError.new("Can't dump anonymous class #{ obj }.")
raise TypeError.new("can't dump anonymous class #{ obj }")
end
param = SOAPStruct.new(TYPE_CLASS)
mark_marshalled_obj(obj, param)
param.add('name', SOAPString.new(obj.name))
addiv2soapattr(param, obj, map)
when Module
when ::Module
unless @allow_original_mapping
return nil
end
if obj.to_s[0] == ?#
raise TypeError.new("Can't dump anonymous module #{ obj }.")
raise TypeError.new("can't dump anonymous module #{ obj }")
end
param = SOAPStruct.new(TYPE_MODULE)
mark_marshalled_obj(obj, param)
param.add('name', SOAPString.new(obj.name))
addiv2soapattr(param, obj, map)
when Symbol
when ::Symbol
unless @allow_original_mapping
return nil
end
@ -193,28 +193,37 @@ class RubytypeFactory < Factory
mark_marshalled_obj(obj, param)
param.add('id', SOAPString.new(obj.id2name))
addiv2soapattr(param, obj, map)
when Struct
when ::Struct
unless @allow_original_mapping
return nil
# treat it as an user defined class. [ruby-talk:104980]
#param = unknownobj2soap(soap_class, obj, info, map)
param = SOAPStruct.new(XSD::AnyTypeName)
mark_marshalled_obj(obj, param)
obj.members.each do |member|
param.add(Mapping.name2elename(member),
Mapping._obj2soap(obj[member], map))
end
else
param = SOAPStruct.new(TYPE_STRUCT)
mark_marshalled_obj(obj, param)
param.add('type', ele_type = SOAPString.new(obj.class.to_s))
ele_member = SOAPStruct.new
obj.members.each do |member|
ele_member.add(Mapping.name2elename(member),
Mapping._obj2soap(obj[member], map))
end
param.add('member', ele_member)
addiv2soapattr(param, obj, map)
end
param = SOAPStruct.new(TYPE_STRUCT)
mark_marshalled_obj(obj, param)
param.add('type', ele_type = SOAPString.new(obj.class.to_s))
ele_member = SOAPStruct.new
obj.members.each do |member|
ele_member.add(Mapping.name2elename(member),
Mapping._obj2soap(obj[member], map))
end
param.add('member', ele_member)
addiv2soapattr(param, obj, map)
when IO, Binding, Continuation, Data, Dir, File::Stat, MatchData, Method,
Proc, Thread, ThreadGroup # from 1.8: Process::Status, UnboundMethod
when ::IO, ::Binding, ::Continuation, ::Data, ::Dir, ::File::Stat,
::MatchData, Method, ::Proc, ::Thread, ::ThreadGroup
# from 1.8: Process::Status, UnboundMethod
return nil
when ::SOAP::Mapping::Object
param = SOAPStruct.new(XSD::AnyTypeName)
mark_marshalled_obj(obj, param)
addiv2soapattr(param, obj, map)
when Exception
when ::Exception
typestr = Mapping.name2elename(obj.class.to_s)
param = SOAPStruct.new(XSD::QName.new(RubyTypeNamespace, typestr))
mark_marshalled_obj(obj, param)
@ -249,7 +258,7 @@ private
def unknownobj2soap(soap_class, obj, info, map)
if obj.class.name.empty?
raise TypeError.new("Can't dump anonymous class #{ obj }.")
raise TypeError.new("can't dump anonymous class #{ obj }")
end
singleton_class = class << obj; self; end
if !singleton_methods_true(obj).empty? or
@ -369,7 +378,7 @@ private
obj = klass.new
mark_unmarshalled_obj(node, obj)
node.each do |name, value|
obj.set_property(name, Mapping._soap2obj(value, map))
obj.__set_property(name, Mapping._soap2obj(value, map))
end
return true, obj
else

View file

@ -18,10 +18,10 @@ module Mapping
class WSDLRegistry
include TraverseSupport
attr_reader :complextypes
attr_reader :definedtypes
def initialize(complextypes, config = {})
@complextypes = complextypes
def initialize(definedtypes, config = {})
@definedtypes = definedtypes
@config = config
@excn_handler_obj2soap = nil
# For mapping AnyType element.
@ -37,27 +37,20 @@ class WSDLRegistry
soap_obj = SOAPNil.new
elsif obj.is_a?(XSD::NSDBase)
soap_obj = soap2soap(obj, type_qname)
elsif (type = @complextypes[type_qname])
case type.compoundtype
when :TYPE_STRUCT
soap_obj = struct2soap(obj, type_qname, type)
when :TYPE_ARRAY
soap_obj = array2soap(obj, type_qname, type)
end
elsif type = @definedtypes[type_qname]
soap_obj = obj2type(obj, type)
elsif (type = TypeMap[type_qname])
soap_obj = base2soap(obj, type)
elsif type_qname == XSD::AnyTypeName
soap_obj = @rubytype_factory.obj2soap(nil, obj, nil, nil)
end
return soap_obj if soap_obj
if @excn_handler_obj2soap
soap_obj = @excn_handler_obj2soap.call(obj) { |yield_obj|
Mapping._obj2soap(yield_obj, self)
}
end
return soap_obj if soap_obj
raise MappingError.new("Cannot map #{ klass.name } to SOAP/OM.")
end
@ -74,12 +67,12 @@ private
def soap2soap(obj, type_qname)
if obj.is_a?(SOAPBasetype)
obj
elsif obj.is_a?(SOAPStruct) && (type = @complextypes[type_qname])
elsif obj.is_a?(SOAPStruct) && (type = @definedtypes[type_qname])
soap_obj = obj
mark_marshalled_obj(obj, soap_obj)
elements2soap(obj, soap_obj, type.content.elements)
soap_obj
elsif obj.is_a?(SOAPArray) && (type = @complextypes[type_qname])
elsif obj.is_a?(SOAPArray) && (type = @definedtypes[type_qname])
soap_obj = obj
contenttype = type.child_type
mark_marshalled_obj(obj, soap_obj)
@ -92,6 +85,33 @@ private
end
end
def obj2type(obj, type)
if type.is_a?(::WSDL::XMLSchema::SimpleType)
simple2soap(obj, type)
else
complex2soap(obj, type)
end
end
def simple2soap(obj, type)
o = base2soap(obj, TypeMap[type.base])
if type.restriction.enumeration.empty?
STDERR.puts("#{type.name}: simpleType which is not enum type not supported.")
return o
end
type.check_lexical_format(obj)
o
end
def complex2soap(obj, type)
case type.compoundtype
when :TYPE_STRUCT
struct2soap(obj, type.name, type)
when :TYPE_ARRAY
array2soap(obj, type.name, type)
end
end
def base2soap(obj, type)
soap_obj = nil
if type <= XSD::XSDString