aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog90
-rw-r--r--lib/soap/baseData.rb91
-rw-r--r--lib/soap/element.rb45
-rw-r--r--lib/soap/encodingstyle/handler.rb4
-rw-r--r--lib/soap/encodingstyle/literalHandler.rb50
-rw-r--r--lib/soap/encodingstyle/soapHandler.rb63
-rw-r--r--lib/soap/generator.rb12
-rw-r--r--lib/soap/header/handler.rb57
-rw-r--r--lib/soap/header/handlerset.rb58
-rw-r--r--lib/soap/header/simplehandler.rb44
-rw-r--r--lib/soap/mapping/factory.rb1
-rw-r--r--lib/soap/mapping/mapping.rb20
-rw-r--r--lib/soap/mapping/registry.rb99
-rw-r--r--lib/soap/mapping/rubytypeFactory.rb73
-rw-r--r--lib/soap/mapping/wsdlRegistry.rb48
-rw-r--r--lib/soap/netHttpClient.rb14
-rw-r--r--lib/soap/parser.rb8
-rw-r--r--lib/soap/property.rb88
-rw-r--r--lib/soap/rpc/cgistub.rb12
-rw-r--r--lib/soap/rpc/driver.rb49
-rw-r--r--lib/soap/rpc/httpserver.rb105
-rw-r--r--lib/soap/rpc/proxy.rb6
-rw-r--r--lib/soap/rpc/router.rb32
-rw-r--r--lib/soap/rpc/soaplet.rb102
-rw-r--r--lib/soap/rpc/standaloneServer.rb102
-rw-r--r--lib/soap/soap.rb5
-rw-r--r--lib/soap/streamHandler.rb75
-rw-r--r--lib/soap/wsdlDriver.rb107
-rw-r--r--lib/wsdl/data.rb1
-rw-r--r--lib/wsdl/definitions.rb21
-rw-r--r--lib/wsdl/operation.rb2
-rw-r--r--lib/wsdl/parser.rb3
-rw-r--r--lib/wsdl/soap/cgiStubCreator.rb73
-rw-r--r--lib/wsdl/soap/classDefCreator.rb112
-rw-r--r--lib/wsdl/soap/classDefCreatorSupport.rb106
-rw-r--r--lib/wsdl/soap/clientSkeltonCreator.rb78
-rw-r--r--lib/wsdl/soap/definitions.rb28
-rw-r--r--lib/wsdl/soap/driverCreator.rb84
-rw-r--r--lib/wsdl/soap/mappingRegistryCreator.rb90
-rw-r--r--lib/wsdl/soap/methodDefCreator.rb148
-rw-r--r--lib/wsdl/soap/servantSkeltonCreator.rb65
-rw-r--r--lib/wsdl/soap/standaloneServerStubCreator.rb79
-rw-r--r--lib/wsdl/xmlSchema/complexContent.rb4
-rw-r--r--lib/wsdl/xmlSchema/complexType.rb22
-rw-r--r--lib/wsdl/xmlSchema/data.rb7
-rw-r--r--lib/wsdl/xmlSchema/enumeration.rb36
-rw-r--r--lib/wsdl/xmlSchema/parser.rb3
-rw-r--r--lib/wsdl/xmlSchema/schema.rb13
-rw-r--r--lib/wsdl/xmlSchema/simpleRestriction.rb48
-rw-r--r--lib/wsdl/xmlSchema/simpleType.rb81
-rw-r--r--lib/xsd/codegen.rb12
-rw-r--r--lib/xsd/codegen/classdef.rb203
-rw-r--r--lib/xsd/codegen/commentdef.rb34
-rw-r--r--lib/xsd/codegen/gensupport.rb112
-rw-r--r--lib/xsd/codegen/methoddef.rb63
-rw-r--r--lib/xsd/codegen/moduledef.rb191
-rw-r--r--lib/xsd/datatypes.rb296
-rw-r--r--lib/xsd/qname.rb9
-rw-r--r--sample/soap/authheader/authmgr.rb41
-rw-r--r--sample/soap/authheader/client.rb40
-rw-r--r--sample/soap/authheader/client2.rb39
-rw-r--r--sample/soap/authheader/server.rb72
-rw-r--r--sample/soap/authheader/server2.rb77
-rw-r--r--sample/soap/raa2.4/raa.rb332
-rw-r--r--sample/soap/raa2.4/raaDriver.rb255
-rw-r--r--sample/soap/raa2.4/raaServiceClient.rb354
-rw-r--r--sample/soap/raa2.4/sample.rb115
-rw-r--r--sample/soap/sampleStruct/server.rb6
-rw-r--r--sample/soap/ssl/files/README1
-rw-r--r--sample/soap/ssl/files/ca.cert23
-rw-r--r--sample/soap/ssl/files/client.cert19
-rw-r--r--sample/soap/ssl/files/client.key15
-rw-r--r--sample/soap/ssl/files/server.cert19
-rw-r--r--sample/soap/ssl/files/server.key15
-rw-r--r--sample/soap/ssl/files/sslclient.properties5
-rw-r--r--sample/soap/ssl/files/sslclient_require_noserverauth.properties2
-rw-r--r--sample/soap/ssl/files/sslclient_with_clientauth.properties9
-rw-r--r--sample/soap/ssl/files/subca.cert21
-rw-r--r--sample/soap/ssl/sslclient.rb12
-rw-r--r--sample/soap/ssl/sslclient_require_noserverauth.rb12
-rw-r--r--sample/soap/ssl/sslclient_with_clientauth.rb12
-rw-r--r--sample/soap/ssl/sslserver.rb49
-rw-r--r--sample/soap/ssl/sslserver_noauth.rb45
-rw-r--r--sample/soap/ssl/sslserver_require_clientauth.rb50
-rw-r--r--sample/soap/swa/client.rb13
-rw-r--r--sample/soap/swa/server.rb23
-rw-r--r--sample/soap/whois.rb14
-rw-r--r--sample/wsdl/amazon/AmazonSearch.rb2686
-rw-r--r--sample/wsdl/amazon/AmazonSearchDriver.rb345
-rw-r--r--sample/wsdl/raa2.4/raa.rb332
-rw-r--r--sample/wsdl/raa2.4/wsdlDriver.rb117
-rw-r--r--test/soap/calc/test_calc_cgi.rb14
-rw-r--r--test/soap/header/server.cgi119
-rw-r--r--test/soap/header/test_authheader.rb247
-rw-r--r--test/soap/header/test_authheader_cgi.rb128
-rw-r--r--test/soap/ssl/README1
-rw-r--r--test/soap/ssl/ca.cert23
-rw-r--r--test/soap/ssl/client.cert19
-rw-r--r--test/soap/ssl/client.key15
-rw-r--r--test/soap/ssl/server.cert19
-rw-r--r--test/soap/ssl/server.key15
-rw-r--r--test/soap/ssl/sslsvr.rb56
-rw-r--r--test/soap/ssl/subca.cert21
-rw-r--r--test/soap/ssl/test_ssl.rb212
-rw-r--r--test/soap/struct/test_struct.rb83
-rw-r--r--test/soap/swa/test_file.rb77
-rw-r--r--test/soap/test_property.rb70
-rw-r--r--test/soap/wsdlDriver/README.txt2
-rw-r--r--test/soap/wsdlDriver/echo_version.rb20
-rw-r--r--test/soap/wsdlDriver/simpletype.wsdl63
-rw-r--r--test/soap/wsdlDriver/test_simpletype.rb92
-rw-r--r--test/wsdl/multiplefault.wsdl68
-rw-r--r--test/wsdl/simpletype/simpletype.wsdl67
-rw-r--r--test/wsdl/simpletype/test_simpletype.rb81
-rw-r--r--test/wsdl/test_emptycomplextype.rb2
-rw-r--r--test/wsdl/test_multiplefault.rb39
116 files changed, 7262 insertions, 2945 deletions
diff --git a/ChangeLog b/ChangeLog
index ab8bfc62f6..5b9c6a0300 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,93 @@
+Sat Jul 3 22:25:27 2004 NAKAMURA, Hiroshi <nakahiro@sarion.co.jp>
+
+ * added files:
+ * lib/soap/header/*
+ * 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/wsdl/raa2.4/*
+ * 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/netHttpClient.rb
+ * lib/soap/parser.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/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/sampleStruct/server.rb
+ * sample/wsdl/amazon/AmazonSearch.rb
+ * sample/wsdl/amazon/AmazonSearchDriver.rb
+ * test/soap/test_property.rb
+ * test/soap/calc/test_calc_cgi.rb
+ * test/wsdl/test_emptycomplextype.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.
+
Sat Jul 3 17:19:44 2004 WATANABE Hirofumi <eban@ruby-lang.org>
* ext/tk/lib/tkextlib/tkDND.rb: fix syntax error.
diff --git a/lib/soap/baseData.rb b/lib/soap/baseData.rb
index 30963f1d64..49c1d2d1f4 100644
--- a/lib/soap/baseData.rb
+++ b/lib/soap/baseData.rb
@@ -1,5 +1,5 @@
# soap/baseData.rb: SOAP4R - Base type library
-# Copyright (C) 2000, 2001, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2000, 2001, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# 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;
@@ -30,20 +30,10 @@ end
###
-## Marker of SOAP/DM types.
+## for SOAP type(base and compound)
#
-module SOAPType; end
-
-
-###
-## Mix-in module for SOAP base type instances.
-#
-module SOAPBasetype
- include SOAPType
- include SOAP
-
+module SOAPType
attr_accessor :encodingstyle
-
attr_accessor :elename
attr_accessor :id
attr_reader :precedents
@@ -51,17 +41,18 @@ module SOAPBasetype
attr_accessor :parent
attr_accessor :position
attr_reader :extraattr
+ attr_accessor :definedtype
-public
-
- def initialize(*vars)
- super(*vars)
+ def initialize(*arg)
+ super(*arg)
@encodingstyle = nil
@elename = XSD::QName.new
@id = nil
@precedents = []
+ @root = false
@parent = nil
@position = nil
+ @definedtype = nil
@extraattr = {}
end
@@ -76,38 +67,27 @@ end
###
-## Mix-in module for SOAP compound type instances.
+## for SOAP base type
#
-module SOAPCompoundtype
+module SOAPBasetype
include SOAPType
include SOAP
- attr_accessor :encodingstyle
-
- attr_accessor :elename
- attr_accessor :id
- attr_reader :precedents
- attr_accessor :root
- attr_accessor :parent
- attr_accessor :position
- attr_reader :extraattr
+ def initialize(*arg)
+ super(*arg)
+ end
+end
- attr_accessor :definedtype
-public
+###
+## for SOAP compound type
+#
+module SOAPCompoundtype
+ include SOAPType
+ include SOAP
- def initialize(type)
- super()
- @type = type
- @encodingstyle = nil
- @elename = XSD::QName.new
- @id = nil
- @precedents = []
- @root = false
- @parent = nil
- @position = nil
- @definedtype = nil
- @extraattr = {}
+ def initialize(*arg)
+ super(*arg)
end
end
@@ -122,18 +102,11 @@ class SOAPReference < XSD::NSDBase
public
attr_accessor :refid
- attr_accessor :elename
# Override the definition in SOAPBasetype.
def initialize(obj = nil)
super()
@type = XSD::QName.new
- @encodingstyle = nil
- @elename = XSD::QName.new
- @id = nil
- @precedents = []
- @root = false
- @parent = nil
@refid = nil
@obj = nil
__setobj__(obj) if obj
@@ -198,11 +171,6 @@ class SOAPExternalReference < XSD::NSDBase
def initialize
super()
@type = XSD::QName.new
- @encodingstyle = nil
- @elename = XSD::QName.new
- @precedents = []
- @root = false
- @parent = nil
end
def referred
@@ -377,7 +345,8 @@ class SOAPStruct < XSD::NSDBase
public
def initialize(type = nil)
- super(type || XSD::QName.new)
+ super()
+ @type = type || XSD::QName.new
@array = []
@data = []
end
@@ -459,7 +428,7 @@ private
end
-# SOAPElement is not typed so it does not derive NSDBase.
+# SOAPElement is not typed so it is not derived from NSDBase.
class SOAPElement
include Enumerable
@@ -534,7 +503,7 @@ class SOAPElement
else
hash = {}
each do |k, v|
- hash[k] = v.to_obj
+ hash[k] = v.is_a?(SOAPElement) ? v.to_obj : v.to_s
end
hash
end
@@ -547,8 +516,7 @@ class SOAPElement
end
def self.decode(elename)
- o = SOAPElement.new
- o.elename = elename
+ o = SOAPElement.new(elename)
o
end
@@ -557,7 +525,7 @@ class SOAPElement
if hash_or_string.is_a?(Hash)
hash_or_string.each do |k, v|
child = self.from_obj(v)
- child.elename = XSD::QName.new(nil, k)
+ child.elename = k.is_a?(XSD::QName) ? k : XSD::QName.new(nil, k.to_s)
o.add(child)
end
else
@@ -616,7 +584,8 @@ public
attr_reader :arytype
def initialize(type = nil, rank = 1, arytype = nil)
- super(type || XSD::QName.new)
+ super()
+ @type = type || XSD::QName.new
@rank = rank
@data = Array.new
@sparse = false
diff --git a/lib/soap/element.rb b/lib/soap/element.rb
index 29a075825a..1494cd61dd 100644
--- a/lib/soap/element.rb
+++ b/lib/soap/element.rb
@@ -1,5 +1,5 @@
# SOAP4R - SOAP elements library
-# Copyright (C) 2000, 2001, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2000, 2001, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# 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;
@@ -95,8 +95,6 @@ end
class SOAPBody < SOAPStruct
include SOAPEnvelopeElement
-public
-
def initialize(data = nil, is_fault = false)
super(nil)
@elename = EleBodyName
@@ -142,39 +140,39 @@ class SOAPHeaderItem < XSD::NSDBase
public
- attr_accessor :content
+ attr_accessor :element
attr_accessor :mustunderstand
attr_accessor :encodingstyle
- def initialize(content, mustunderstand = true, encodingstyle = nil)
- super(nil)
- @content = content
+ def initialize(element, mustunderstand = true, encodingstyle = nil)
+ super()
+ @type = nil
+ @element = element
@mustunderstand = mustunderstand
- @encodingstyle = encodingstyle || LiteralNamespace
- content.parent = self if content
+ @encodingstyle = encodingstyle
+ element.parent = self if element
end
def encode(generator, ns, attrs = {})
attrs.each do |key, value|
- @content.attr[key] = value
+ @element.extraattr[key] = value
end
- @content.attr[ns.name(EnvelopeNamespace, AttrMustUnderstand)] =
+ @element.extraattr[ns.name(AttrMustUnderstandName)] =
(@mustunderstand ? '1' : '0')
if @encodingstyle
- @content.attr[ns.name(EnvelopeNamespace, AttrEncodingStyle)] =
- @encodingstyle
+ @element.extraattr[ns.name(AttrEncodingStyleName)] = @encodingstyle
end
- @content.encodingstyle = @encodingstyle if !@content.encodingstyle
- yield(@content, true)
+ @element.encodingstyle = @encodingstyle if !@element.encodingstyle
+ yield(@element, true)
end
end
-class SOAPHeader < SOAPArray
+class SOAPHeader < SOAPStruct
include SOAPEnvelopeElement
- def initialize()
- super(nil, 1) # rank == 1
+ def initialize
+ super(nil)
@elename = EleHeaderName
@encodingstyle = nil
end
@@ -188,9 +186,17 @@ class SOAPHeader < SOAPArray
generator.encode_tag_end(name, true)
end
+ def add(name, value)
+ mu = (value.extraattr[AttrMustUnderstandName] == '1')
+ encstyle = value.extraattr[AttrEncodingStyleName]
+ item = SOAPHeaderItem.new(value, mu, encstyle)
+ super(name, item)
+ end
+
def length
@data.length
end
+ alias size length
end
@@ -203,7 +209,8 @@ class SOAPEnvelope < XSD::NSDBase
attr_reader :external_content
def initialize(header = nil, body = nil)
- super(nil)
+ super()
+ @type = nil
@elename = EleEnvelopeName
@encodingstyle = nil
@header = header
diff --git a/lib/soap/encodingstyle/handler.rb b/lib/soap/encodingstyle/handler.rb
index 8ea23ef146..7bf65a2fd5 100644
--- a/lib/soap/encodingstyle/handler.rb
+++ b/lib/soap/encodingstyle/handler.rb
@@ -44,8 +44,8 @@ class Handler
attr_reader :charset
attr_accessor :generate_explicit_type
- def decode_typemap=(complextypes)
- @decode_typemap = complextypes
+ def decode_typemap=(definedtypes)
+ @decode_typemap = definedtypes
end
def initialize(charset)
diff --git a/lib/soap/encodingstyle/literalHandler.rb b/lib/soap/encodingstyle/literalHandler.rb
index 995e1a5361..72a10b2daa 100644
--- a/lib/soap/encodingstyle/literalHandler.rb
+++ b/lib/soap/encodingstyle/literalHandler.rb
@@ -1,5 +1,5 @@
# SOAP4R - XML Literal EncodingStyle handler library
-# Copyright (C) 2001, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2001, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# 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;
@@ -41,14 +41,18 @@ class LiteralHandler < Handler
generator.encode_rawstring(data.to_s)
when XSD::XSDString
generator.encode_tag(name, attrs)
- generator.encode_string(@charset ? XSD::Charset.encoding_to_xml(data.to_s, @charset) : data.to_s)
+ str = data.to_s
+ str = XSD::Charset.encoding_to_xml(str, @charset) if @charset
+ generator.encode_string(str)
when XSD::XSDAnySimpleType
generator.encode_tag(name, attrs)
generator.encode_string(data.to_s)
when SOAPStruct
generator.encode_tag(name, attrs)
data.each do |key, value|
- value.elename.namespace = data.elename.namespace if !value.elename.namespace
+ if !value.elename.namespace
+ value.elename.namespace = data.elename.namespace
+ end
yield(value, true)
end
when SOAPArray
@@ -61,8 +65,6 @@ class LiteralHandler < Handler
generator.encode_tag(name, attrs.update(data.extraattr))
generator.encode_rawstring(data.text) if data.text
data.each do |key, value|
- value.elename.namespace = data.elename.namespace if !value.elename.namespace
- #yield(value, data.qualified)
yield(value, qualified)
end
else
@@ -76,7 +78,8 @@ class LiteralHandler < Handler
else
data.elename.name
end
- generator.encode_tag_end(name)
+ cr = data.is_a?(SOAPElement) && !data.text
+ generator.encode_tag_end(name, cr)
end
@@ -92,15 +95,17 @@ class LiteralHandler < Handler
end
class SOAPUnknown < SOAPTemporalObject
- def initialize(handler, elename)
+ def initialize(handler, elename, extraattr)
super()
@handler = handler
@elename = elename
+ @extraattr = extraattr
end
- def as_struct
- o = SOAPStruct.decode(@elename, XSD::AnyTypeName)
+ def as_element
+ o = SOAPElement.decode(@elename)
o.parent = @parent
+ o.extraattr.update(@extraattr)
@handler.decode_parent(@parent, o)
o
end
@@ -108,6 +113,7 @@ class LiteralHandler < Handler
def as_string
o = SOAPString.decode(@elename)
o.parent = @parent
+ o.extraattr.update(@extraattr)
@handler.decode_parent(@parent, o)
o
end
@@ -115,6 +121,7 @@ class LiteralHandler < Handler
def as_nil
o = SOAPNil.decode(@elename)
o.parent = @parent
+ o.extraattr.update(@extraattr)
@handler.decode_parent(@parent, o)
o
end
@@ -123,7 +130,7 @@ class LiteralHandler < Handler
def decode_tag(ns, elename, attrs, parent)
# ToDo: check if @textbuf is empty...
@textbuf = ''
- o = SOAPUnknown.new(self, elename)
+ o = SOAPUnknown.new(self, elename, decode_attrs(ns, attrs))
o.parent = parent
o
end
@@ -132,7 +139,7 @@ class LiteralHandler < Handler
o = node.node
if o.is_a?(SOAPUnknown)
newnode = if /\A\s*\z/ =~ @textbuf
- o.as_struct
+ o.as_element
else
o.as_string
end
@@ -149,6 +156,15 @@ class LiteralHandler < Handler
@textbuf << text
end
+ def decode_attrs(ns, attrs)
+ extraattr = {}
+ attrs.each do |key, value|
+ qname = ns.parse(key)
+ extraattr[qname] = value
+ end
+ extraattr
+ end
+
def decode_prologue
end
@@ -158,13 +174,18 @@ class LiteralHandler < Handler
def decode_parent(parent, node)
case parent.node
when SOAPUnknown
- newparent = parent.node.as_struct
+ newparent = parent.node.as_element
node.parent = newparent
parent.replace_node(newparent)
decode_parent(parent, node)
+ when SOAPElement
+ parent.node.add(node)
+ node.parent = parent.node
+
when SOAPStruct
- parent.node.add(node.name, node)
+ parent.node.add(node.elename.name, node)
+ node.parent = parent.node
when SOAPArray
if node.position
@@ -173,13 +194,14 @@ class LiteralHandler < Handler
else
parent.node.add(node)
end
+ node.parent = parent.node
when SOAPBasetype
raise EncodingStyleError.new("SOAP base type must not have a child.")
else
# SOAPUnknown does not have parent.
- # raise EncodingStyleError.new("Illegal parent: #{ parent }.")
+ raise EncodingStyleError.new("Illegal parent: #{ parent }.")
end
end
diff --git a/lib/soap/encodingstyle/soapHandler.rb b/lib/soap/encodingstyle/soapHandler.rb
index d755d7b952..114060bd02 100644
--- a/lib/soap/encodingstyle/soapHandler.rb
+++ b/lib/soap/encodingstyle/soapHandler.rb
@@ -33,7 +33,7 @@ class SOAPHandler < Handler
attrs = encode_attrs(generator, ns, data, parent)
if parent && parent.is_a?(SOAPArray) && parent.position
- attrs[ns.name(AttrPositionName)] = '[' << parent.position.join(',') << ']'
+ attrs[ns.name(AttrPositionName)] = "[#{ parent.position.join(',') }]"
end
name = nil
@@ -207,16 +207,12 @@ class SOAPHandler < Handler
node.replace_node(newnode)
o = node.node
end
- if o.is_a?(SOAPCompoundtype)
- o.definedtype = nil
- end
-
decode_textbuf(o)
- @textbuf = ''
+ # unlink definedtype
+ o.definedtype = nil
end
def decode_text(ns, text)
- # @textbuf is set at decode_tag_end.
@textbuf << text
end
@@ -240,11 +236,9 @@ class SOAPHandler < Handler
end
parent.replace_node(newparent)
decode_parent(parent, node)
-
when SOAPStruct
parent.node.add(node.elename.name, node)
node.parent = parent.node
-
when SOAPArray
if node.position
parent.node[*(decode_arypos(node.position))] = node
@@ -253,10 +247,8 @@ class SOAPHandler < Handler
parent.node.add(node)
end
node.parent = parent.node
-
when SOAPBasetype
raise EncodingStyleError.new("SOAP base type must not have a child.")
-
else
raise EncodingStyleError.new("Illegal parent: #{ parent.node }.")
end
@@ -274,7 +266,7 @@ private
def create_arytype(ns, data)
XSD::QName.new(data.arytype.namespace,
- content_typename(data.arytype.name) << '[' << data.size.join(',') << ']')
+ content_typename(data.arytype.name) + "[#{ data.size.join(',') }]")
end
def encode_attrs(generator, ns, data, parent)
@@ -353,8 +345,7 @@ private
typename = ns.parse(typestr)
typedef = @decode_typemap[typename]
if typedef
- return decode_defined_compoundtype(elename, typename, typedef,
- arytypestr)
+ return decode_definedtype(elename, typename, typedef, arytypestr)
end
end
return decode_tag_by_type(ns, elename, typestr, parent, arytypestr,
@@ -376,21 +367,42 @@ private
definedtype_name = parenttype.child_type(elename)
if definedtype_name and (klass = TypeMap[definedtype_name])
- return klass.decode(elename)
+ return decode_basetype(klass, elename)
elsif definedtype_name == XSD::AnyTypeName
return decode_tag_by_type(ns, elename, typestr, parent, arytypestr,
extraattr)
end
- typedef = definedtype_name ? @decode_typemap[definedtype_name] :
- parenttype.child_defined_complextype(elename)
- decode_defined_compoundtype(elename, definedtype_name, typedef, arytypestr)
+ if definedtype_name
+ typedef = @decode_typemap[definedtype_name]
+ else
+ typedef = parenttype.child_defined_complextype(elename)
+ end
+ decode_definedtype(elename, definedtype_name, typedef, arytypestr)
end
- def decode_defined_compoundtype(elename, typename, typedef, arytypestr)
+ def decode_definedtype(elename, typename, typedef, arytypestr)
unless typedef
raise EncodingStyleError.new("Unknown type '#{ typename }'.")
end
+ if typedef.is_a?(::WSDL::XMLSchema::SimpleType)
+ decode_defined_simpletype(elename, typename, typedef, arytypestr)
+ else
+ decode_defined_complextype(elename, typename, typedef, arytypestr)
+ end
+ end
+
+ def decode_basetype(klass, elename)
+ klass.decode(elename)
+ end
+
+ def decode_defined_simpletype(elename, typename, typedef, arytypestr)
+ o = decode_basetype(TypeMap[typedef.base], elename)
+ o.definedtype = typedef
+ o
+ end
+
+ def decode_defined_complextype(elename, typename, typedef, arytypestr)
case typedef.compoundtype
when :TYPE_STRUCT
o = SOAPStruct.decode(elename, typename)
@@ -410,7 +422,7 @@ private
o.definedtype = typedef
return o
end
- return nil
+ nil
end
def decode_tag_by_type(ns, elename, typestr, parent, arytypestr, extraattr)
@@ -435,7 +447,7 @@ private
end
if (klass = TypeMap[type])
- node = klass.decode(elename)
+ node = decode_basetype(klass, elename)
node.extraattr.update(extraattr)
return node
end
@@ -450,10 +462,12 @@ private
node.set_encoded(@textbuf)
when XSD::XSDString
if @charset
- node.set(XSD::Charset.encoding_from_xml(@textbuf, @charset))
- else
- node.set(@textbuf)
+ @textbuf = XSD::Charset.encoding_from_xml(@textbuf, @charset)
+ end
+ if node.definedtype
+ node.definedtype.check_lexical_format(@textbuf)
end
+ node.set(@textbuf)
when SOAPNil
# Nothing to do.
when SOAPBasetype
@@ -461,6 +475,7 @@ private
else
# Nothing to do...
end
+ @textbuf = ''
end
NilLiteralMap = {
diff --git a/lib/soap/generator.rb b/lib/soap/generator.rb
index 5da6b8f26e..edd90492c6 100644
--- a/lib/soap/generator.rb
+++ b/lib/soap/generator.rb
@@ -90,9 +90,9 @@ public
raise FormatEncodeError.new("Element name not defined: #{ obj }.")
end
- handler.encode_data(self, ns, qualified, obj, parent) do |child, child_q|
+ handler.encode_data(self, ns, qualified, obj, parent) do |child, nextq|
indent_backup, @indent = @indent, @indent + ' '
- encode_data(ns.clone_ns, child_q, child, obj)
+ encode_data(ns.clone_ns, nextq, child, obj)
@indent = indent_backup
end
handler.encode_data_end(self, ns, qualified, obj, parent)
@@ -109,9 +109,9 @@ public
attrs = {}
if obj.is_a?(SOAPBody)
@reftarget = obj
- obj.encode(self, ns, attrs) do |child, child_q|
+ obj.encode(self, ns, attrs) do |child, nextq|
indent_backup, @indent = @indent, @indent + ' '
- encode_data(ns.clone_ns, child_q, child, obj)
+ encode_data(ns.clone_ns, nextq, child, obj)
@indent = indent_backup
end
@reftarget = nil
@@ -124,9 +124,9 @@ public
SOAPGenerator.assign_ns(attrs, ns, XSD::Namespace, XSDNamespaceTag)
end
end
- obj.encode(self, ns, attrs) do |child, child_q|
+ obj.encode(self, ns, attrs) do |child, nextq|
indent_backup, @indent = @indent, @indent + ' '
- encode_data(ns.clone_ns, child_q, child, obj)
+ encode_data(ns.clone_ns, nextq, child, obj)
@indent = indent_backup
end
end
diff --git a/lib/soap/header/handler.rb b/lib/soap/header/handler.rb
new file mode 100644
index 0000000000..7da2836e24
--- /dev/null
+++ b/lib/soap/header/handler.rb
@@ -0,0 +1,57 @@
+# SOAP4R - SOAP Header handler item
+# Copyright (C) 2003, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'soap/element'
+
+
+module SOAP
+module Header
+
+
+class Handler
+ attr_reader :elename
+ attr_reader :mustunderstand
+ attr_reader :encodingstyle
+
+ def initialize(elename)
+ @elename = elename
+ @mustunderstand = false
+ @encodingstyle = nil
+ end
+
+ # Should return a SOAP/OM, a SOAPHeaderItem or nil.
+ def on_outbound
+ nil
+ end
+
+ # Given header is a SOAPHeaderItem or nil.
+ def on_inbound(header, mustunderstand = false)
+ # do something.
+ end
+
+ def on_outbound_headeritem
+ item = on_outbound
+ if item.nil?
+ nil
+ elsif item.is_a?(::SOAP::SOAPHeaderItem)
+ item.elename = @elename
+ item
+ else
+ item.elename = @elename
+ ::SOAP::SOAPHeaderItem.new(item, @mustunderstand, @encodingstyle)
+ end
+ end
+
+ def on_inbound_headeritem(header)
+ on_inbound(header.element, header.mustunderstand)
+ end
+end
+
+
+end
+end
diff --git a/lib/soap/header/handlerset.rb b/lib/soap/header/handlerset.rb
new file mode 100644
index 0000000000..499d6bb8a1
--- /dev/null
+++ b/lib/soap/header/handlerset.rb
@@ -0,0 +1,58 @@
+# SOAP4R - SOAP Header handler set
+# Copyright (C) 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'xsd/namedelements'
+
+
+module SOAP
+module Header
+
+
+class HandlerSet
+ def initialize
+ @store = XSD::NamedElements.new
+ end
+
+ def add(handler)
+ @store << handler
+ end
+ alias << add
+
+ def delete(handler)
+ @store.delete(handler)
+ end
+
+ def include?(handler)
+ @store.include?(handler)
+ end
+
+ # returns: Array of SOAPHeaderItem
+ def on_outbound
+ @store.collect { |handler|
+ handler.on_outbound_headeritem
+ }.compact
+ end
+
+ # headers: SOAPHeaderItem enumerable object
+ def on_inbound(headers)
+ headers.each do |name, item|
+ handler = @store.find { |handler|
+ handler.elename == item.element.elename
+ }
+ if handler
+ handler.on_inbound_headeritem(item)
+ elsif item.mustunderstand
+ raise UnhandledMustUnderstandHeaderError.new(item.element.elename.to_s)
+ end
+ end
+ end
+end
+
+
+end
+end
diff --git a/lib/soap/header/simplehandler.rb b/lib/soap/header/simplehandler.rb
new file mode 100644
index 0000000000..e7268e04a3
--- /dev/null
+++ b/lib/soap/header/simplehandler.rb
@@ -0,0 +1,44 @@
+# SOAP4R - SOAP Simple header item handler
+# Copyright (C) 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'soap/header/handler'
+require 'soap/baseData'
+
+
+module SOAP
+module Header
+
+
+class SimpleHandler < SOAP::Header::Handler
+ def initialize(elename)
+ super(elename)
+ end
+
+ # Should return a Hash or nil.
+ def on_simple_outbound
+ nil
+ end
+
+ # Given header is a Hash or nil.
+ def on_simple_inbound(header, mustunderstand)
+ end
+
+ def on_outbound
+ h = on_simple_outbound
+ h ? SOAPElement.from_obj(h) : nil
+ end
+
+ def on_inbound(header, mustunderstand)
+ h = header.to_obj
+ on_simple_inbound(h, mustunderstand)
+ end
+end
+
+
+end
+end
diff --git a/lib/soap/mapping/factory.rb b/lib/soap/mapping/factory.rb
index fe6a6de7ae..6b9ac1eeaa 100644
--- a/lib/soap/mapping/factory.rb
+++ b/lib/soap/mapping/factory.rb
@@ -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),
diff --git a/lib/soap/mapping/mapping.rb b/lib/soap/mapping/mapping.rb
index 38a01bac07..db7ea607fd 100644
--- a/lib/soap/mapping/mapping.rb
+++ b/lib/soap/mapping/mapping.rb
@@ -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
diff --git a/lib/soap/mapping/registry.rb b/lib/soap/mapping/registry.rb
index 8142047724..1317d40cd6 100644
--- a/lib/soap/mapping/registry.rb
+++ b/lib/soap/mapping/registry.rb
@@ -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 initialize
+ @__members = []
+ @__value_type = {}
+ end
- def #{ var_name }=(value)
- @#{ var_name } = value
- end
- EOS
- self.send(var_name + '=', value)
- rescue SyntaxError
- var_name = safe_name(var_name)
- retry
+ def [](name)
+ if @__members.include?(name)
+ self.__send__(name)
+ else
+ self.__send__(Object.safe_name(name))
end
+ end
+
+ def []=(name, value)
+ if @__members.include?(name)
+ self.__send__(name + '=', value)
+ else
+ 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
- instance_variables.collect { |str| str[1..-1] }
+ def __members
+ @__members
end
- def [](name)
- if self.respond_to?(name)
- self.send(name)
+private
+
+ 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(safe_name(name))
+ self.__send__(name + '=', value)
+ @__value_type[name] = :single
end
+ value
end
- def []=(name, value)
- if self.respond_to?(name)
- self.send(name + '=', value)
- else
- self.send(safe_name(name) + '=', value)
+ 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
-private
-
- def safe_name(name)
+ 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)
diff --git a/lib/soap/mapping/rubytypeFactory.rb b/lib/soap/mapping/rubytypeFactory.rb
index f79bc78cc7..a46d93275f 100644
--- a/lib/soap/mapping/rubytypeFactory.rb
+++ b/lib/soap/mapping/rubytypeFactory.rb
@@ -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
- 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))
+ # 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.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
diff --git a/lib/soap/mapping/wsdlRegistry.rb b/lib/soap/mapping/wsdlRegistry.rb
index 66d16c6f90..64f49f2265 100644
--- a/lib/soap/mapping/wsdlRegistry.rb
+++ b/lib/soap/mapping/wsdlRegistry.rb
@@ -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
diff --git a/lib/soap/netHttpClient.rb b/lib/soap/netHttpClient.rb
index 4505de815e..1e9d71c5a3 100644
--- a/lib/soap/netHttpClient.rb
+++ b/lib/soap/netHttpClient.rb
@@ -34,6 +34,10 @@ class NetHttpClient
@session_manager = SessionManager.new
@no_proxy = nil
end
+
+ def test_loopback_response
+ raise NotImplementedError.new("not supported for now")
+ end
def proxy=(proxy_str)
if proxy_str.nil?
@@ -54,7 +58,11 @@ class NetHttpClient
end
def set_cookie_store(filename)
- # ignored.
+ raise NotImplementedError.new
+ end
+
+ def save_cookie_store(filename)
+ raise NotImplementedError.new
end
def reset(url)
@@ -70,8 +78,8 @@ class NetHttpClient
extra = header.dup
extra['User-Agent'] = @agent if @agent
res = start(url) { |http|
- http.post(url.request_uri, req_body, extra)
- }
+ http.post(url.request_uri, req_body, extra)
+ }
Response.new(res)
end
diff --git a/lib/soap/parser.rb b/lib/soap/parser.rb
index 457d681d30..14704a6d9b 100644
--- a/lib/soap/parser.rb
+++ b/lib/soap/parser.rb
@@ -117,7 +117,13 @@ public
encodingstyle = find_encodingstyle(ns, attrs)
# Children's encodingstyle is derived from its parent.
- encodingstyle ||= parent_encodingstyle || @default_encodingstyle
+ if encodingstyle.nil?
+ if parent.node.is_a?(SOAPHeader)
+ encodingstyle = LiteralNamespace
+ else
+ encodingstyle = parent_encodingstyle || @default_encodingstyle
+ end
+ end
node = decode_tag(ns, name, attrs, parent, encodingstyle)
diff --git a/lib/soap/property.rb b/lib/soap/property.rb
index 079c294a77..113cc64f3c 100644
--- a/lib/soap/property.rb
+++ b/lib/soap/property.rb
@@ -34,22 +34,24 @@ module SOAP
class Property
include Enumerable
- def self.load(stream)
- new.load(stream)
+ module Util
+ def const_from_name(fqname)
+ fqname.split("::").inject(Kernel) { |klass, name| klass.const_get(name) }
+ end
+ module_function :const_from_name
+
+ def require_from_name(fqname)
+ require File.join(fqname.split("::").collect { |ele| ele.downcase })
+ end
+ module_function :require_from_name
end
- def self.open(filename)
- File.open(filename) { |f| load(f) }
+ def self.load(stream)
+ new.load(stream)
end
- # find property from $:.
def self.loadproperty(propname)
- $:.each do |path|
- if File.file?(file = File.join(path, propname))
- return open(file)
- end
- end
- nil
+ new.loadproperty(propname)
end
def initialize
@@ -87,6 +89,17 @@ class Property
self
end
+ # find property from $:.
+ def loadproperty(propname)
+ return loadpropertyfile(propname) if File.file?(propname)
+ $:.each do |path|
+ if File.file?(file = File.join(path, propname))
+ return loadpropertyfile(file)
+ end
+ end
+ nil
+ end
+
# name: a Symbol, String or an Array
def [](name)
referent(name_to_a(name))
@@ -95,10 +108,10 @@ class Property
# name: a Symbol, String or an Array
# value: an Object
def []=(name, value)
- hooks = assign(name_to_a(name), value)
- normalized_name = normalize_name(name)
+ name_pair = name_to_a(name).freeze
+ hooks = assign(name_pair, value)
hooks.each do |hook|
- hook.call(normalized_name, value)
+ hook.call(name_pair, value)
end
value
end
@@ -109,13 +122,15 @@ class Property
self[generate_new_key] = value
end
- # name: a Symbol, String or an Array. nil means hook to the root
+ # name: a Symbol, String or an Array; nil means hook to the root
+ # cascade: true/false; for cascading hook of sub key
# hook: block which will be called with 2 args, name and value
- def add_hook(name = nil, &hook)
- if name.nil?
- assign_self_hook(&hook)
+ def add_hook(name = nil, cascade = false, &hook)
+ if name == nil or name == true or name == false
+ cascade = name
+ assign_self_hook(cascade, &hook)
else
- assign_hook(name_to_a(name), &hook)
+ assign_hook(name_to_a(name), cascade, &hook)
end
end
@@ -192,14 +207,18 @@ protected
@store[key] = value
end
- def local_hook(key)
- @self_hook + (@hook[key] || NO_HOOK)
+ def local_hook(key, direct)
+ hooks = []
+ (@self_hook + (@hook[key] || NO_HOOK)).each do |hook, cascade|
+ hooks << hook if direct or cascade
+ end
+ hooks
end
- def local_assign_hook(key, &hook)
+ def local_assign_hook(key, cascade, &hook)
check_lock(key)
@store[key] ||= nil
- (@hook[key] ||= []) << hook
+ (@hook[key] ||= []) << [hook, cascade]
end
private
@@ -217,23 +236,23 @@ private
hook = NO_HOOK
ary[0..-2].each do |name|
key = to_key(name)
- hook += ref.local_hook(key)
+ hook += ref.local_hook(key, false)
ref = ref.deref_key(key)
end
last_key = to_key(ary.last)
ref.local_assign(last_key, value)
- hook + ref.local_hook(last_key)
+ hook + ref.local_hook(last_key, true)
end
- def assign_hook(ary, &hook)
+ def assign_hook(ary, cascade, &hook)
ary[0..-2].inject(self) { |ref, name|
ref.deref_key(to_key(name))
- }.local_assign_hook(to_key(ary.last), &hook)
+ }.local_assign_hook(to_key(ary.last), cascade, &hook)
end
- def assign_self_hook(&hook)
+ def assign_self_hook(cascade, &hook)
check_lock(nil)
- @self_hook << hook
+ @self_hook << [hook, cascade]
end
def each_key
@@ -267,10 +286,6 @@ private
end
end
- def normalize_name(name)
- name_to_a(name).collect { |key| to_key(key) }.join('.')
- end
-
def to_key(name)
name.to_s.downcase
end
@@ -286,6 +301,13 @@ private
def key_max
(@store.keys.max { |l, r| l.to_s.to_i <=> r.to_s.to_i }).to_s.to_i
end
+
+ def loadpropertyfile(file)
+ puts "find property at #{file}" if $DEBUG
+ File.open(file) do |f|
+ load(f)
+ end
+ end
end
diff --git a/lib/soap/rpc/cgistub.rb b/lib/soap/rpc/cgistub.rb
index 4fc8b98cee..55437bac59 100644
--- a/lib/soap/rpc/cgistub.rb
+++ b/lib/soap/rpc/cgistub.rb
@@ -1,5 +1,5 @@
# SOAP4R - CGI stub library
-# Copyright (C) 2001, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2001, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# 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;
@@ -94,15 +94,21 @@ class CGIStub < Logger::Application
on_init
end
- def add_servant(obj, namespace = @default_namespace, soapaction = nil)
+ def add_rpc_servant(obj, namespace = @default_namespace, soapaction = nil)
RPC.defined_methods(obj).each do |name|
qname = XSD::QName.new(namespace, name)
param_size = obj.method(name).arity.abs
- params = (1..param_size).collect { |i| "p#{ i }" }
+ params = (1..param_size).collect { |i| "p#{i}" }
param_def = SOAP::RPC::SOAPMethod.create_param_def(params)
@router.add_method(obj, qname, soapaction, name, param_def)
end
end
+ alias add_servant add_rpc_servant
+
+ def add_rpc_headerhandler(obj)
+ @router.headerhandler << obj
+ end
+ alias add_headerhandler add_rpc_headerhandler
def on_init
# Override this method in derived class to call 'add_method' to add methods.
diff --git a/lib/soap/rpc/driver.rb b/lib/soap/rpc/driver.rb
index 655174cf33..0e59dde9be 100644
--- a/lib/soap/rpc/driver.rb
+++ b/lib/soap/rpc/driver.rb
@@ -1,5 +1,5 @@
# SOAP4R - SOAP RPC driver
-# Copyright (C) 2000, 2001, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2000, 2001, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# 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;
@@ -13,6 +13,7 @@ require 'soap/rpc/proxy'
require 'soap/rpc/element'
require 'soap/streamHandler'
require 'soap/property'
+require 'soap/header/handlerset'
module SOAP
@@ -41,6 +42,8 @@ class Driver
end
__attr_proxy :options
+ __attr_proxy :headerhandler
+ __attr_proxy :test_loopback_response
__attr_proxy :endpoint_url, true
__attr_proxy :mapping_registry, true
__attr_proxy :soapaction, true
@@ -84,6 +87,12 @@ class Driver
@proxy = @servant.proxy
end
+ def loadproperty(propertyname)
+ unless options.loadproperty(propertyname)
+ raise LoadError.new("No such property to load -- #{propertyname}")
+ end
+ end
+
def inspect
"#<#{self.class}:#{@servant.streamhandler.inspect}>"
end
@@ -130,6 +139,7 @@ private
class Servant__
attr_reader :options
attr_reader :streamhandler
+ attr_reader :headerhandler
attr_reader :proxy
def initialize(host, endpoint_url, namespace)
@@ -141,6 +151,7 @@ private
@options = setup_options
@streamhandler = HTTPPostStreamHandler.new(endpoint_url,
@options["protocol.http"] ||= ::SOAP::Property.new)
+ @headerhandler = Header::HandlerSet.new
@proxy = Proxy.new(@streamhandler, @soapaction)
@proxy.allow_unqualified_element = true
end
@@ -178,6 +189,10 @@ private
@proxy.default_encodingstyle = encodingstyle
end
+ def test_loopback_response
+ @streamhandler.test_loopback_response
+ end
+
def invoke(headers, body)
set_wiredump_file_base(body.elename.name)
env = @proxy.invoke(headers, body)
@@ -192,19 +207,19 @@ private
set_wiredump_file_base(name)
# Convert parameters: params array => SOAPArray => members array
params = Mapping.obj2soap(params, @mapping_registry).to_a
- env = @proxy.call(nil, name, *params)
+ env = @proxy.call(call_headers, name, *params)
raise EmptyResponseError.new("Empty response.") unless env
- header, body = env.header, env.body
+ receive_headers(env.header)
begin
- @proxy.check_fault(body)
+ @proxy.check_fault(env.body)
rescue SOAP::FaultError => e
Mapping.fault2exception(e)
end
- ret = body.response ?
- Mapping.soap2obj(body.response, @mapping_registry) : nil
- if body.outparams
- outparams = body.outparams.collect { |outparam|
+ ret = env.body.response ?
+ Mapping.soap2obj(env.body.response, @mapping_registry) : nil
+ if env.body.outparams
+ outparams = env.body.outparams.collect { |outparam|
Mapping.soap2obj(outparam)
}
return [ret].concat(outparams)
@@ -233,10 +248,28 @@ private
@servant.call(#{ name.dump }#{ callparam })
end
EOS
+ @host.method(name)
end
private
+ def call_headers
+ headers = @headerhandler.on_outbound
+ if headers.empty?
+ nil
+ else
+ h = ::SOAP::SOAPHeader.new
+ headers.each do |header|
+ h.add(header.elename.name, header)
+ end
+ h
+ end
+ end
+
+ def receive_headers(headers)
+ @headerhandler.on_inbound(headers) if headers
+ end
+
def set_wiredump_file_base(name)
if @wiredump_file_base
@streamhandler.wiredump_file_base = @wiredump_file_base + "_#{ name }"
diff --git a/lib/soap/rpc/httpserver.rb b/lib/soap/rpc/httpserver.rb
new file mode 100644
index 0000000000..7b1f961d9e
--- /dev/null
+++ b/lib/soap/rpc/httpserver.rb
@@ -0,0 +1,105 @@
+# SOAP4R - WEBrick HTTP Server
+# Copyright (C) 2003, 2004 by NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'logger'
+require 'soap/rpc/soaplet'
+require 'soap/streamHandler'
+require 'webrick'
+
+
+module SOAP
+module RPC
+
+
+class HTTPServer < Logger::Application
+ attr_reader :server
+ attr_accessor :default_namespace
+
+ def initialize(config)
+ super(config[:SOAPHTTPServerApplicationName] || self.class.name)
+ @default_namespace = config[:SOAPDefaultNamespace]
+ @webrick_config = config.dup
+ @webrick_config[:Logger] ||= @log
+ @server = nil
+ @soaplet = ::SOAP::RPC::SOAPlet.new
+ self.level = Logger::Severity::INFO
+ on_init
+ end
+
+ def on_init
+ # define extra methods in derived class.
+ end
+
+ def status
+ if @server
+ @server.status
+ else
+ nil
+ end
+ end
+
+ def shutdown
+ @server.shutdown if @server
+ end
+
+ def mapping_registry
+ @soaplet.app_scope_router.mapping_registry
+ end
+
+ def mapping_registry=(mapping_registry)
+ @soaplet.app_scope_router.mapping_registry = mapping_registry
+ end
+
+ def add_rpc_request_servant(factory, namespace = @default_namespace,
+ mapping_registry = nil)
+ @soaplet.add_rpc_request_servant(factory, namespace, mapping_registry)
+ end
+
+ def add_rpc_servant(obj, namespace = @default_namespace)
+ @soaplet.add_rpc_servant(obj, namespace)
+ end
+
+ def add_rpc_request_headerhandler(factory)
+ @soaplet.add_rpc_request_headerhandler(factory)
+ end
+
+ def add_rpc_headerhandler(obj)
+ @soaplet.add_rpc_headerhandler(obj)
+ end
+
+ def add_method(obj, name, *param)
+ add_method_as(obj, name, name, *param)
+ end
+
+ def add_method_as(obj, name, name_as, *param)
+ qname = XSD::QName.new(@default_namespace, name_as)
+ soapaction = nil
+ method = obj.method(name)
+ param_def = if param.size == 1 and param[0].is_a?(Array)
+ param[0]
+ elsif param.empty?
+ ::SOAP::RPC::SOAPMethod.create_param_def(
+ (1..method.arity.abs).collect { |i| "p#{ i }" })
+ else
+ SOAP::RPC::SOAPMethod.create_param_def(param)
+ end
+ @soaplet.app_scope_router.add_method(obj, qname, soapaction, name, param_def)
+ end
+
+private
+
+ def run
+ @server = WEBrick::HTTPServer.new(@webrick_config)
+ @server.mount('/', @soaplet)
+ @server.start
+ end
+end
+
+
+end
+end
diff --git a/lib/soap/rpc/proxy.rb b/lib/soap/rpc/proxy.rb
index 7d9dbe519e..355bf2e81a 100644
--- a/lib/soap/rpc/proxy.rb
+++ b/lib/soap/rpc/proxy.rb
@@ -1,5 +1,5 @@
# SOAP4R - RPC Proxy library.
-# Copyright (C) 2000, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2000, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# 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;
@@ -112,9 +112,9 @@ public
unmarshal(conn_data, opt)
end
- def call(headers, name, *values)
+ def call(req_header, name, *values)
req = create_request(name, *values)
- invoke(headers, req.method, req.method.soapaction || @soapaction)
+ invoke(req_header, req.method, req.method.soapaction || @soapaction)
end
def check_fault(body)
diff --git a/lib/soap/rpc/router.rb b/lib/soap/rpc/router.rb
index 12622c72b1..9d8d1c8da6 100644
--- a/lib/soap/rpc/router.rb
+++ b/lib/soap/rpc/router.rb
@@ -13,6 +13,7 @@ require 'soap/rpc/rpc'
require 'soap/rpc/element'
require 'soap/streamHandler'
require 'soap/mimemessage'
+require 'soap/header/handlerset'
module SOAP
@@ -26,6 +27,7 @@ class Router
attr_accessor :allow_unqualified_element
attr_accessor :default_encodingstyle
attr_accessor :mapping_registry
+ attr_reader :headerhandler
def initialize(actor)
@actor = actor
@@ -35,6 +37,7 @@ class Router
@allow_unqualified_element = false
@default_encodingstyle = nil
@mapping_registry = nil
+ @headerhandler = Header::HandlerSet.new
end
def add_method(receiver, qname, soapaction, name, param_def)
@@ -44,12 +47,6 @@ class Router
@method[fqname] = RPC::SOAPMethodRequest.new(qname, param_def, soapaction)
end
- def add_header_handler
- raise NotImplementedError.new
- end
-
- # Routing...
- #def route(soap_string, charset = nil)
def route(conn_data)
soap_response = nil
begin
@@ -57,7 +54,7 @@ class Router
if env.nil?
raise ArgumentError.new("Illegal SOAP marshal format.")
end
- # So far, header is omitted...
+ receive_headers(env.header)
soap_request = env.body.request
unless soap_request.is_a?(SOAPStruct)
raise RPCRoutingError.new("Not an RPC style.")
@@ -70,7 +67,7 @@ class Router
opt = options
opt[:external_content] = nil
- header = SOAPHeader.new
+ header = call_headers
body = SOAPBody.new(soap_response)
env = SOAPEnvelope.new(header, body)
response_string = Processor.marshal(env, opt)
@@ -114,13 +111,30 @@ class Router
private
+ def call_headers
+ headers = @headerhandler.on_outbound
+ if headers.empty?
+ nil
+ else
+ h = ::SOAP::SOAPHeader.new
+ headers.each do |header|
+ h.add(header.elename.name, header)
+ end
+ h
+ end
+ end
+
+ def receive_headers(headers)
+ @headerhandler.on_inbound(headers) if headers
+ end
+
def unmarshal(conn_data)
opt = options
contenttype = conn_data.receive_contenttype
if /#{MIMEMessage::MultipartContentType}/i =~ contenttype
opt[:external_content] = {}
mime = MIMEMessage.parse("Content-Type: " + contenttype,
- conn_data.receive_string)
+ conn_data.receive_string)
mime.parts.each do |part|
value = Attachment.new(part.content)
value.contentid = part.contentid
diff --git a/lib/soap/rpc/soaplet.rb b/lib/soap/rpc/soaplet.rb
index 7cb5e32375..0c1427acf5 100644
--- a/lib/soap/rpc/soaplet.rb
+++ b/lib/soap/rpc/soaplet.rb
@@ -1,5 +1,5 @@
# SOAP4R - SOAP handler servlet for WEBrick
-# Copyright (C) 2001, 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2001, 2002, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# 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;
@@ -22,20 +22,28 @@ public
def initialize
@router_map = {}
@app_scope_router = ::SOAP::RPC::Router.new(self.class.name)
+ @headerhandlerfactory = []
+ @app_scope_headerhandler = nil
end
- # Add servant klass whose object has request scope. A servant object is
- # instantiated for each request.
+ # Add servant factory whose object has request scope. A servant object is
+ # instanciated for each request.
#
- # Bare in mind that servant klasses are distinguished by HTTP SOAPAction
+ # Bear in mind that servant factories are distinguished by HTTP SOAPAction
# header in request. Client which calls request-scoped servant must have a
- # SOAPAction header which is a namespace of the servant klass.
+ # SOAPAction header which is a namespace of the servant factory.
# I mean, use Driver#add_method_with_soapaction instead of Driver#add_method
# at client side.
#
- def add_rpc_request_servant(klass, namespace, mapping_registry = nil)
- router = RequestRouter.new(klass, namespace, mapping_registry)
- add_router(namespace, router)
+ # A factory must respond to :create.
+ #
+ def add_rpc_request_servant(factory, namespace, mapping_registry = nil)
+ unless factory.respond_to?(:create)
+ raise TypeError.new("factory must respond to 'create'")
+ end
+ router = setup_request_router(namespace)
+ router.factory = factory
+ router.mapping_registry = mapping_registry
end
# Add servant object which has application scope.
@@ -46,6 +54,17 @@ public
end
alias add_servant add_rpc_servant
+ def add_rpc_request_headerhandler(factory)
+ unless factory.respond_to?(:create)
+ raise TypeError.new("factory must respond to 'create'")
+ end
+ @headerhandlerfactory << factory
+ end
+
+ def add_rpc_headerhandler(obj)
+ @app_scope_headerhandler = obj
+ end
+ alias add_headerhandler add_rpc_headerhandler
###
## Servlet interfaces for WEBrick.
@@ -67,21 +86,23 @@ public
def do_POST(req, res)
namespace = parse_soapaction(req.meta_vars['HTTP_SOAPACTION'])
router = lookup_router(namespace)
- begin
- conn_data = ::SOAP::StreamHandler::ConnectionData.new
- conn_data.receive_string = req.body
- conn_data.receive_contenttype = req['content-type']
- conn_data = router.route(conn_data)
- if conn_data.is_fault
+ with_headerhandler(router) do |router|
+ begin
+ conn_data = ::SOAP::StreamHandler::ConnectionData.new
+ conn_data.receive_string = req.body
+ conn_data.receive_contenttype = req['content-type']
+ conn_data = router.route(conn_data)
+ if conn_data.is_fault
+ res.status = WEBrick::HTTPStatus::RC_INTERNAL_SERVER_ERROR
+ end
+ res.body = conn_data.send_string
+ res['content-type'] = conn_data.send_contenttype
+ rescue Exception => e
+ conn_data = router.create_fault_response(e)
res.status = WEBrick::HTTPStatus::RC_INTERNAL_SERVER_ERROR
+ res.body = conn_data.send_string
+ res['content-type'] = conn_data.send_contenttype || "text/xml"
end
- res.body = conn_data.send_string
- res['content-type'] = conn_data.send_contenttype
- rescue Exception => e
- conn_data = router.create_fault_response(e)
- res.status = WEBrick::HTTPStatus::RC_INTERNAL_SERVER_ERROR
- res.body = conn_data.send_string
- res['content-type'] = conn_data.send_contenttype || "text/xml"
end
if res.body.is_a?(IO)
@@ -92,17 +113,16 @@ public
private
class RequestRouter < ::SOAP::RPC::Router
- def initialize(klass, namespace, mapping_registry = nil)
+ attr_accessor :factory
+
+ def initialize(namespace = nil)
super(namespace)
- if mapping_registry
- self.mapping_registry = mapping_registry
- end
- @klass = klass
@namespace = namespace
+ @factory = nil
end
def route(soap_string)
- obj = @klass.new
+ obj = @factory.create
namespace = self.actor
router = ::SOAP::RPC::Router.new(@namespace)
SOAPlet.add_servant_to_router(router, obj, namespace)
@@ -110,6 +130,12 @@ private
end
end
+ def setup_request_router(namespace)
+ router = @router_map[namespace] || RequestRouter.new(namespace)
+ add_router(namespace, router)
+ router
+ end
+
def add_router(namespace, router)
@router_map[namespace] = router
end
@@ -132,11 +158,29 @@ private
end
end
+ def with_headerhandler(router)
+ if @app_scope_headerhandler and
+ !router.headerhandler.include?(@app_scope_headerhandler)
+ router.headerhandler.add(@app_scope_headerhandler)
+ end
+ handlers = @headerhandlerfactory.collect { |f| f.create }
+ begin
+ handlers.each { |h| router.headerhandler.add(h) }
+ yield(router)
+ ensure
+ handlers.each { |h| router.headerhandler.delete(h) }
+ end
+ end
+
class << self
public
def add_servant_to_router(router, obj, namespace)
::SOAP::RPC.defined_methods(obj).each do |name|
- add_servant_method_to_router(router, obj, namespace, name)
+ begin
+ add_servant_method_to_router(router, obj, namespace, name)
+ rescue SOAP::RPC::MethodDefinitionError => e
+ p e if $DEBUG
+ end
end
end
@@ -145,7 +189,7 @@ private
soapaction = nil
method = obj.method(name)
param_def = ::SOAP::RPC::SOAPMethod.create_param_def(
- (1..method.arity.abs).collect { |i| "p#{ i }" })
+ (1..method.arity.abs).collect { |i| "p#{ i }" })
router.add_method(obj, qname, soapaction, name, param_def)
end
end
diff --git a/lib/soap/rpc/standaloneServer.rb b/lib/soap/rpc/standaloneServer.rb
index 42a566e088..080343ba33 100644
--- a/lib/soap/rpc/standaloneServer.rb
+++ b/lib/soap/rpc/standaloneServer.rb
@@ -6,111 +6,35 @@
# either the dual license version in 2003, or any later version.
-require 'logger'
-require 'soap/rpc/soaplet'
-require 'soap/streamHandler'
-
-# require 'webrick'
-require 'webrick/compat.rb'
-require 'webrick/version.rb'
-require 'webrick/config.rb'
-require 'webrick/log.rb'
-require 'webrick/server.rb'
-require 'webrick/utils.rb'
-require 'webrick/accesslog'
-# require 'webrick/htmlutils.rb'
-require 'webrick/httputils.rb'
-# require 'webrick/cookie.rb'
-require 'webrick/httpversion.rb'
-require 'webrick/httpstatus.rb'
-require 'webrick/httprequest.rb'
-require 'webrick/httpresponse.rb'
-require 'webrick/httpserver.rb'
-# require 'webrick/httpservlet.rb'
-# require 'webrick/httpauth.rb'
+require 'soap/rpc/httpserver'
module SOAP
module RPC
-class StandaloneServer < Logger::Application
- attr_reader :server
-
- def initialize(app_name, namespace, host = "0.0.0.0", port = 8080)
- super(app_name)
- self.level = Logger::Severity::INFO
- @namespace = namespace
+class StandaloneServer < HTTPServer
+ def initialize(appname, default_namespace, host = "0.0.0.0", port = 8080)
+ @appname = appname
+ @default_namespace = default_namespace
@host = host
@port = port
- @server = nil
- @soaplet = ::SOAP::RPC::SOAPlet.new
- on_init
- end
-
- def on_init
- # define extra methods in derived class.
- end
-
- def status
- if @server
- @server.status
- else
- nil
- end
- end
-
- def shutdown
- @server.shutdown
- end
-
- def add_rpc_request_servant(klass, namespace = @namespace, mapping_registry = nil)
- @soaplet.add_rpc_request_servant(klass, namespace, mapping_registry)
+ super(create_config)
end
- def add_rpc_servant(obj, namespace = @namespace)
- @soaplet.add_rpc_servant(obj, namespace)
- end
alias add_servant add_rpc_servant
-
- def mapping_registry
- @soaplet.app_scope_router.mapping_registry
- end
-
- def mapping_registry=(mapping_registry)
- @soaplet.app_scope_router.mapping_registry = mapping_registry
- end
-
- def add_method(obj, name, *param)
- add_method_as(obj, name, name, *param)
- end
-
- def add_method_as(obj, name, name_as, *param)
- qname = XSD::QName.new(@namespace, name_as)
- soapaction = nil
- method = obj.method(name)
- param_def = if param.size == 1 and param[0].is_a?(Array)
- param[0]
- elsif param.empty?
- ::SOAP::RPC::SOAPMethod.create_param_def(
- (1..method.arity.abs).collect { |i| "p#{ i }" })
- else
- SOAP::RPC::SOAPMethod.create_param_def(param)
- end
- @soaplet.app_scope_router.add_method(obj, qname, soapaction, name, param_def)
- end
+ alias add_headerhandler add_rpc_headerhandler
private
- def run
- @server = WEBrick::HTTPServer.new(
+ def create_config
+ {
:BindAddress => @host,
- :Logger => @log,
+ :Port => @port,
:AccessLog => [],
- :Port => @port
- )
- @server.mount('/', @soaplet)
- @server.start
+ :SOAPDefaultNamespace => @default_namespace,
+ :SOAPHTTPServerApplicationName => @appname,
+ }
end
end
diff --git a/lib/soap/soap.rb b/lib/soap/soap.rb
index d00d89b05b..02b26e4246 100644
--- a/lib/soap/soap.rb
+++ b/lib/soap/soap.rb
@@ -1,5 +1,5 @@
# soap/soap.rb: SOAP4R - Base definitions.
-# Copyright (C) 2000, 2001, 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2000-2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# 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;
@@ -48,6 +48,7 @@ EleFaultStringName = XSD::QName.new(nil, EleFaultString)
EleFaultActorName = XSD::QName.new(nil, EleFaultActor)
EleFaultCodeName = XSD::QName.new(nil, EleFaultCode)
EleFaultDetailName = XSD::QName.new(nil, EleFaultDetail)
+AttrMustUnderstandName = XSD::QName.new(EnvelopeNamespace, AttrMustUnderstand)
AttrEncodingStyleName = XSD::QName.new(EnvelopeNamespace, AttrEncodingStyle)
AttrRootName = XSD::QName.new(EncodingNamespace, AttrRoot)
AttrArrayTypeName = XSD::QName.new(EncodingNamespace, AttrArrayType)
@@ -75,6 +76,8 @@ class ArrayStoreError < Error; end
class RPCRoutingError < Error; end
+class UnhandledMustUnderstandHeaderError < Error; end
+
class FaultError < Error
attr_reader :faultcode
attr_reader :faultstring
diff --git a/lib/soap/streamHandler.rb b/lib/soap/streamHandler.rb
index 0d08a00bd8..efadf21e07 100644
--- a/lib/soap/streamHandler.rb
+++ b/lib/soap/streamHandler.rb
@@ -83,6 +83,11 @@ public
@options = options
set_options
@client.debug_dev = @wiredump_dev
+ @cookie_store = nil
+ end
+
+ def test_loopback_response
+ @client.test_loopback_response
end
def inspect
@@ -95,6 +100,7 @@ public
def reset
@client.reset(@endpoint_url)
+ @client.save_cookie_store if @cookie_store
end
private
@@ -118,10 +124,6 @@ private
@options.add_hook("cookie_store_file") do |key, value|
set_cookie_store_file(value)
end
- set_ssl_config(@options["ssl_config"])
- @options.add_hook("ssl_config") do |key, value|
- set_ssl_config(@options["ssl_config"])
- end
@charset = @options["charset"] || XSD::Charset.charset_label($KCODE)
@options.add_hook("charset") do |key, value|
@charset = value
@@ -131,12 +133,18 @@ private
@wiredump_dev = value
@client.debug_dev = @wiredump_dev
end
+ ssl_config = @options["ssl_config"] ||= ::SOAP::Property.new
+ set_ssl_config(ssl_config)
+ ssl_config.add_hook(true) do |key, value|
+ set_ssl_config(ssl_config)
+ end
basic_auth = @options["basic_auth"] ||= ::SOAP::Property.new
set_basic_auth(basic_auth)
basic_auth.add_hook do |key, value|
set_basic_auth(basic_auth)
end
@options.lock(true)
+ ssl_config.unlock
basic_auth.unlock
end
@@ -147,13 +155,62 @@ private
end
def set_cookie_store_file(value)
- return unless value
- raise NotImplementedError.new
+ @cookie_store = value
+ @client.set_cookie_store(@cookie_store) if @cookie_store
+ end
+
+ def set_ssl_config(ssl_config)
+ ssl_config.each do |key, value|
+ cfg = @client.ssl_config
+ case key
+ when 'client_cert'
+ cfg.client_cert = cert_from_file(value)
+ when 'client_key'
+ cfg.client_key = key_from_file(value)
+ when 'client_ca'
+ cfg.client_ca = value
+ when 'ca_path'
+ cfg.set_trust_ca(value)
+ when 'ca_file'
+ cfg.set_trust_ca(value)
+ when 'crl'
+ cfg.set_crl(value)
+ when 'verify_mode'
+ cfg.verify_mode = ssl_config_int(value)
+ when 'verify_depth'
+ cfg.verify_depth = ssl_config_int(value)
+ when 'options'
+ cfg.options = value
+ when 'ciphers'
+ cfg.ciphers = value
+ when 'verify_callback'
+ cfg.verify_callback = value
+ when 'cert_store'
+ cfg.cert_store = value
+ else
+ raise ArgumentError.new("unknown ssl_config property #{key}")
+ end
+ end
+ end
+
+ def ssl_config_int(value)
+ if value.nil? or value.empty?
+ nil
+ else
+ begin
+ Integer(value)
+ rescue ArgumentError
+ ::SOAP::Property::Util.const_from_name(value)
+ end
+ end
+ end
+
+ def cert_from_file(filename)
+ OpenSSL::X509::Certificate.new(File.open(filename) { |f| f.read })
end
- def set_ssl_config(value)
- return unless value
- raise NotImplementedError.new
+ def key_from_file(filename)
+ OpenSSL::PKey::RSA.new(File.open(filename) { |f| f.read })
end
def send_post(conn_data, soapaction, charset)
diff --git a/lib/soap/wsdlDriver.rb b/lib/soap/wsdlDriver.rb
index 4b36bd08b8..af868ea886 100644
--- a/lib/soap/wsdlDriver.rb
+++ b/lib/soap/wsdlDriver.rb
@@ -18,6 +18,7 @@ require 'soap/mapping/wsdlRegistry'
require 'soap/rpc/rpc'
require 'soap/rpc/element'
require 'soap/processor'
+require 'soap/header/handlerset'
require 'logger'
@@ -92,6 +93,8 @@ class WSDLDriver
end
__attr_proxy :options
+ __attr_proxy :headerhandler
+ __attr_proxy :test_loopback_response
__attr_proxy :endpoint_url, true
__attr_proxy :mapping_registry, true # for RPC unmarshal
__attr_proxy :wsdl_mapping_registry, true # for RPC marshal
@@ -152,6 +155,7 @@ class WSDLDriver
attr_reader :options
attr_reader :streamhandler
+ attr_reader :headerhandler
attr_reader :port
attr_accessor :mapping_registry
@@ -176,7 +180,7 @@ class WSDLDriver
@mandatorycharset = nil
@wsdl_elements = @wsdl.collect_elements
- @wsdl_types = @wsdl.collect_complextypes
+ @wsdl_types = @wsdl.collect_complextypes + @wsdl.collect_simpletypes
@rpc_decode_typemap = @wsdl_types +
@wsdl.soap_rpc_complextypes(port.find_binding)
@wsdl_mapping_registry = Mapping::WSDLRegistry.new(@rpc_decode_typemap)
@@ -184,6 +188,7 @@ class WSDLDriver
endpoint_url = @port.soap_address.location
@streamhandler = HTTPPostStreamHandler.new(endpoint_url,
@options["protocol.http"] ||= Property.new)
+ @headerhandler = Header::HandlerSet.new
# Convert a map which key is QName, to a Hash which key is String.
@operations = {}
@port.inputoperation_map.each do |op_name, op_info|
@@ -201,13 +206,17 @@ class WSDLDriver
@streamhandler.reset
end
+ def test_loopback_response
+ @streamhandler.test_loopback_response
+ end
+
def rpc_send(method_name, *params)
log(INFO) { "call: calling method '#{ method_name }'." }
log(DEBUG) { "call: parameters '#{ params.inspect }'." }
op_info = @operations[method_name]
method = create_method_struct(op_info, params)
- req_header = nil
+ req_header = call_headers
req_body = SOAPBody.new(method)
req_env = SOAPEnvelope.new(req_header, req_body)
@@ -220,10 +229,11 @@ class WSDLDriver
opt = create_options
opt[:decode_typemap] = @rpc_decode_typemap
res_env = invoke(req_env, op_info, opt)
+ receive_headers(res_env.header)
if res_env.body.fault
- raise SOAP::FaultError.new(res_env.body.fault)
+ raise ::SOAP::FaultError.new(res_env.body.fault)
end
- rescue SOAP::FaultError => e
+ rescue ::SOAP::FaultError => e
Mapping.fault2exception(e)
end
@@ -251,7 +261,7 @@ class WSDLDriver
opt = create_options
res_env = invoke(req_env, op_info, opt)
if res_env.body.fault
- raise SOAP::FaultError.new(res_env.body.fault)
+ raise ::SOAP::FaultError.new(res_env.body.fault)
end
res_body_obj = res_env.body.response ?
Mapping.soap2obj(res_env.body.response, @mapping_registry) : nil
@@ -260,6 +270,23 @@ class WSDLDriver
private
+ def call_headers
+ headers = @headerhandler.on_outbound
+ if headers.empty?
+ nil
+ else
+ h = ::SOAP::SOAPHeader.new
+ headers.each do |header|
+ h.add(header.elename.name, header)
+ end
+ h
+ end
+ end
+
+ def receive_headers(headers)
+ @headerhandler.on_inbound(headers) if headers
+ end
+
def create_method_struct(op_info, params)
parts_names = op_info.bodyparts.collect { |part| part.name }
obj = create_method_obj(parts_names, params)
@@ -349,9 +376,9 @@ class WSDLDriver
else
header = SOAPHeader.new()
op_info.headerparts.each do |part|
- child = obj[part.elename.name]
+ child = Mapper.find_attribute(obj, part.name)
ele = headeritem_from_obj(child, part.element || part.eletype)
- header.add(ele)
+ header.add(part.name, ele)
end
header
end
@@ -383,7 +410,7 @@ class WSDLDriver
else
body = SOAPBody.new
op_info.bodyparts.each do |part|
- child = obj[part.elename.name]
+ child = Mapper.find_attribute(obj, part.name)
ele = bodyitem_from_obj(child, part.element || part.type)
body.add(ele.elename.name, ele)
end
@@ -461,6 +488,7 @@ class WSDLDriver
opt
end
+ class MappingError < StandardError; end
class Mapper
def initialize(elements, types)
@elements = elements
@@ -473,7 +501,7 @@ class WSDLDriver
elsif type = @types[name]
obj2type(obj, type)
else
- raise RuntimeError.new("Cannot find name #{name} in schema.")
+ raise MappingError.new("Cannot find name #{name} in schema.")
end
end
@@ -481,6 +509,16 @@ class WSDLDriver
raise NotImplementedError.new
end
+ def Mapper.find_attribute(obj, attr_name)
+ if obj.respond_to?(attr_name)
+ obj.__send__(attr_name)
+ elsif obj.is_a?(Hash)
+ obj[attr_name] || obj[attr_name.intern]
+ else
+ obj.instance_eval("@#{ attr_name }")
+ end
+ end
+
private
def _obj2ele(obj, ele)
@@ -491,25 +529,47 @@ class WSDLDriver
elsif type = TypeMap[ele.type]
o = base2soap(obj, type)
else
- raise RuntimeError.new("Cannot find type #{ele.type}.")
+ raise MappingError.new("Cannot find type #{ele.type}.")
end
o.elename = ele.name
elsif ele.local_complextype
o = SOAPElement.new(ele.name)
- ele.local_complextype.each_element do |child_name, child_ele|
- o.add(_obj2ele(find_attribute(obj, child_name.name), child_ele))
+ ele.local_complextype.each_element do |child_ele|
+ o.add(_obj2ele(Mapper.find_attribute(obj, child_ele.name.name),
+ child_ele))
end
else
- raise RuntimeError.new("Illegal schema?")
+ raise MappingError.new("Illegal schema?")
end
o
end
def obj2type(obj, type)
- o = SOAPElement.new(type.name)
- type.each_element do |child_name, child_ele|
- o.add(_obj2ele(find_attribute(obj, child_name.name), child_ele))
- end
+ 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
+ if type.restriction.enumeration.include?(o)
+ raise MappingError.new("#{o} is not allowed for #{type.name}")
+ end
+ o
+ end
+
+ def complex2soap(obj, type)
+ o = SOAPElement.new(type.name)
+ type.each_element do |child_ele|
+ o.add(_obj2ele(Mapper.find_attribute(obj, child_ele.name.name),
+ child_ele))
+ end
o
end
@@ -521,22 +581,13 @@ class WSDLDriver
soap_obj = nil
if type <= XSD::XSDString
soap_obj = type.new(XSD::Charset.is_ces(obj, $KCODE) ?
- XSD::Charset.encoding_conv(obj, $KCODE, XSD::Charset.encoding) : obj)
+ XSD::Charset.encoding_conv(obj, $KCODE, XSD::Charset.encoding) :
+ obj)
else
soap_obj = type.new(obj)
end
soap_obj
end
-
- def find_attribute(obj, attr_name)
- if obj.respond_to?(attr_name)
- obj.__send__(attr_name)
- elsif obj.is_a?(Hash)
- obj[attr_name] || obj[attr_name.intern]
- else
- obj.instance_eval("@#{ attr_name }")
- end
- end
end
end
end
diff --git a/lib/wsdl/data.rb b/lib/wsdl/data.rb
index 8a14dd14d7..45eaad8526 100644
--- a/lib/wsdl/data.rb
+++ b/lib/wsdl/data.rb
@@ -6,6 +6,7 @@
# either the dual license version in 2003, or any later version.
+require 'xsd/qname'
require 'wsdl/documentation'
require 'wsdl/definitions'
require 'wsdl/types'
diff --git a/lib/wsdl/definitions.rb b/lib/wsdl/definitions.rb
index 561a335744..c530220fde 100644
--- a/lib/wsdl/definitions.rb
+++ b/lib/wsdl/definitions.rb
@@ -43,8 +43,7 @@ class Definitions < Info
end
def inspect
- name = @name || '(unnamed)'
- "#<#{self.class}:#{name}>"
+ sprintf("#<%s:0x%x %s>", self.class.name, __id__, @name || '(unnamed)')
end
def targetnamespace=(targetnamespace)
@@ -58,7 +57,7 @@ class Definitions < Info
result = XSD::NamedElements.new
if @types
@types.schemas.each do |schema|
- result.concat(schema.elements)
+ result.concat(schema.collect_elements)
end
end
@imports.each do |import|
@@ -71,7 +70,7 @@ class Definitions < Info
result = @anontypes.dup
if @types
@types.schemas.each do |schema|
- result.concat(schema.complextypes)
+ result.concat(schema.collect_complextypes)
end
end
@imports.each do |import|
@@ -80,6 +79,20 @@ class Definitions < Info
result
end
+ def collect_simpletypes
+ result = XSD::NamedElements.new
+ if @types
+ @types.schemas.each do |schema|
+ result.concat(schema.collect_simpletypes)
+ end
+ end
+ @imports.each do |import|
+ result.concat(import.content.collect_simpletypes)
+ end
+ result
+ end
+
+ # ToDo: simpletype must be accepted...
def add_type(complextype)
@anontypes << complextype
end
diff --git a/lib/wsdl/operation.rb b/lib/wsdl/operation.rb
index 228dc85b05..be28446d34 100644
--- a/lib/wsdl/operation.rb
+++ b/lib/wsdl/operation.rb
@@ -119,7 +119,7 @@ private
return parts.dup
end
if parts.length != result.length
- raise RuntimeError.new("Incomplete parameter order list.")
+ raise RuntimeError.new("Incomplete prarmeterOrder list.")
end
result
end
diff --git a/lib/wsdl/parser.rb b/lib/wsdl/parser.rb
index 7e7a4d8bce..6387911f79 100644
--- a/lib/wsdl/parser.rb
+++ b/lib/wsdl/parser.rb
@@ -119,7 +119,8 @@ private
STDERR.puts("Unknown element #{ element }.")
o = Documentation.new # which accepts any element.
end
- o.parent = parent
+ # node could be a pseudo element. pseudo element has its own parent.
+ o.parent = parent if o.parent.nil?
end
attrs.each do |key, value|
attr = unless /:/ =~ key
diff --git a/lib/wsdl/soap/cgiStubCreator.rb b/lib/wsdl/soap/cgiStubCreator.rb
new file mode 100644
index 0000000000..e5b64336e7
--- /dev/null
+++ b/lib/wsdl/soap/cgiStubCreator.rb
@@ -0,0 +1,73 @@
+# WSDL4R - Creating CGI stub code from WSDL.
+# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'wsdl/soap/mappingRegistryCreator'
+require 'wsdl/soap/methodDefCreator'
+require 'wsdl/soap/classDefCreatorSupport'
+
+
+module WSDL
+module SOAP
+
+
+class CGIStubCreator
+ include ClassDefCreatorSupport
+
+ attr_reader :definitions
+
+ def initialize(definitions)
+ @definitions = definitions
+ end
+
+ def dump(service_name)
+ STDERR.puts "!!! IMPORTANT !!!"
+ STDERR.puts "- CGI stub can only 1 port. Creating stub for the first port... Rests are ignored."
+ STDERR.puts "!!! IMPORTANT !!!"
+ port = @definitions.service(service_name).ports[0]
+ dump_porttype(port.porttype.name)
+ end
+
+private
+
+ def dump_porttype(name)
+ class_name = create_class_name(name)
+ methoddef, types = MethodDefCreator.new(@definitions).dump(name)
+ mr_creator = MappingRegistryCreator.new(@definitions)
+ c1 = ::XSD::CodeGen::ClassDef.new(class_name)
+ c1.def_require("soap/rpc/cgistub")
+ c1.def_require("soap/mapping/registry")
+ c1.def_const("MappingRegistry", "::SOAP::Mapping::Registry.new")
+ c1.def_code(mr_creator.dump(types))
+ c1.def_code <<-EOD
+Methods = [
+#{ methoddef.gsub(/^/, " ") }
+]
+ EOD
+ c2 = ::XSD::CodeGen::ClassDef.new(class_name + "App",
+ "::SOAP::RPC::CGIStub")
+ c2.def_method("initialize", "*arg") do
+ <<-EOD
+ super(*arg)
+ servant = #{class_name}.new
+ #{class_name}::Methods.each do |name_as, name, params, soapaction, ns|
+ add_method_with_namespace_as(ns, servant, name, name_as, params, soapaction)
+ end
+ self.mapping_registry = #{class_name}::MappingRegistry
+ self.level = Logger::Severity::ERROR
+ EOD
+ end
+ c1.dump + "\n" + c2.dump + format(<<-EOD)
+ #{class_name}App.new('app', nil).start
+ EOD
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/soap/classDefCreator.rb b/lib/wsdl/soap/classDefCreator.rb
new file mode 100644
index 0000000000..6c7d381932
--- /dev/null
+++ b/lib/wsdl/soap/classDefCreator.rb
@@ -0,0 +1,112 @@
+# WSDL4R - Creating class definition from WSDL
+# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/data'
+require 'wsdl/soap/classDefCreatorSupport'
+require 'xsd/codegen'
+
+
+module WSDL
+module SOAP
+
+
+class ClassDefCreator
+ include ClassDefCreatorSupport
+
+ def initialize(definitions)
+ @simpletypes = definitions.collect_simpletypes
+ @complextypes = definitions.collect_complextypes
+ @faulttypes = definitions.collect_faulttypes
+ end
+
+ def dump(class_name = nil)
+ result = ""
+ if class_name
+ result = dump_classdef(class_name)
+ else
+ @complextypes.each do |type|
+ case type.compoundtype
+ when :TYPE_STRUCT
+ result << dump_classdef(type)
+ when :TYPE_ARRAY
+ result << dump_arraydef(type)
+ else
+ raise RuntimeError.new("Unknown complexContent definition...")
+ end
+ result << "\n"
+ end
+
+ result << @simpletypes.collect { |type|
+ dump_simpletypedef(type)
+ }.join("\n")
+ end
+ result
+ end
+
+private
+
+ def dump_simpletypedef(simpletype)
+ qname = simpletype.name
+ if simpletype.restriction.enumeration.empty?
+ STDERR.puts("#{qname}: simpleType which is not enum type not supported.")
+ return ""
+ end
+ c = XSD::CodeGen::ModuleDef.new(create_class_name(qname))
+ c.comment = "#{ qname.namespace }"
+ simpletype.restriction.enumeration.each do |value|
+ c.def_const(safeconstname(value), value.dump)
+ end
+ c.dump
+ end
+
+ def dump_classdef(complextype)
+ qname = complextype.name
+ if @faulttypes.index(qname)
+ c = XSD::CodeGen::ClassDef.new(create_class_name(qname),
+ "::StandardError")
+ else
+ c = XSD::CodeGen::ClassDef.new(create_class_name(qname))
+ end
+ c.comment = "#{ qname.namespace }"
+ c.def_classvar("schema_type", qname.name.dump)
+ c.def_classvar("schema_ns", qname.namespace.dump)
+ init_lines = ""
+ params = []
+ complextype.each_element do |element|
+ name = element.name.name
+ varname = safevarname(name)
+ c.def_attr(name, true, varname)
+ init_lines << "@#{ varname } = #{ varname }\n"
+ params << "#{ varname } = nil"
+ end
+ complextype.attributes.each do |attribute|
+ name = "attr_" + attribute.name
+ varname = safevarname(name)
+ c.def_attr(name, true, varname)
+ init_lines << "@#{ varname } = #{ varname }\n"
+ params << "#{ varname } = nil"
+ end
+ c.def_method("initialize", *params) do
+ init_lines
+ end
+ c.dump
+ end
+
+ def dump_arraydef(complextype)
+ qname = complextype.name
+ c = XSD::CodeGen::ClassDef.new(create_class_name(qname), "::Array")
+ c.comment = "#{ qname.namespace }"
+ c.def_classvar("schema_type", qname.name.dump)
+ c.def_classvar("schema_ns", qname.namespace.dump)
+ c.dump
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/soap/classDefCreatorSupport.rb b/lib/wsdl/soap/classDefCreatorSupport.rb
new file mode 100644
index 0000000000..dbcc55f7b9
--- /dev/null
+++ b/lib/wsdl/soap/classDefCreatorSupport.rb
@@ -0,0 +1,106 @@
+# WSDL4R - Creating class code support from WSDL.
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'soap/mapping'
+require 'soap/mapping/typeMap'
+require 'xsd/codegen/gensupport'
+
+
+module WSDL
+module SOAP
+
+
+module ClassDefCreatorSupport
+ include XSD::CodeGen::GenSupport
+
+ def create_class_name(qname)
+ if klass = basetype_mapped_class(qname)
+ ::SOAP::Mapping::DefaultRegistry.find_mapped_obj_class(klass.name)
+ else
+ safeconstname(qname.name)
+ end
+ end
+
+ def basetype_mapped_class(name)
+ ::SOAP::TypeMap[name]
+ end
+
+ def dump_method_signature(operation)
+ name = operation.name.name
+ input = operation.input
+ output = operation.output
+ fault = operation.fault
+ signature = "#{ name }#{ dump_inputparam(input) }"
+ str = <<__EOD__
+# SYNOPSIS
+# #{name}#{dump_inputparam(input)}
+#
+# ARGS
+#{dump_inout_type(input).chomp}
+#
+# RETURNS
+#{dump_inout_type(output).chomp}
+#
+__EOD__
+ unless fault.empty?
+ faultstr = (fault.collect { |f| dump_inout_type(f).chomp }).join(', ')
+ str <<<<__EOD__
+# RAISES
+# #{faultstr}
+#
+__EOD__
+ end
+ str
+ end
+
+private
+
+ def dump_inout_type(param)
+ if param
+ message = param.find_message
+ params = ""
+ message.parts.each do |part|
+ next unless part.type
+ name = safevarname(part.name)
+ typename = safeconstname(part.type.name)
+ params << add_at("# #{name}", "#{typename} - #{part.type}\n", 20)
+ end
+ unless params.empty?
+ return params
+ end
+ end
+ "# N/A\n"
+ end
+
+ def dump_inputparam(input)
+ message = input.find_message
+ params = ""
+ message.parts.each do |part|
+ params << ", " unless params.empty?
+ params << safevarname(part.name)
+ end
+ if params.empty?
+ ""
+ else
+ "(#{ params })"
+ end
+ end
+
+ def add_at(base, str, pos)
+ if base.size >= pos
+ base + ' ' + str
+ else
+ base + ' ' * (pos - base.size) + str
+ end
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/soap/clientSkeltonCreator.rb b/lib/wsdl/soap/clientSkeltonCreator.rb
new file mode 100644
index 0000000000..9c538dd612
--- /dev/null
+++ b/lib/wsdl/soap/clientSkeltonCreator.rb
@@ -0,0 +1,78 @@
+# WSDL4R - Creating client skelton code from WSDL.
+# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'wsdl/soap/classDefCreatorSupport'
+
+
+module WSDL
+module SOAP
+
+
+class ClientSkeltonCreator
+ include ClassDefCreatorSupport
+
+ attr_reader :definitions
+
+ def initialize(definitions)
+ @definitions = definitions
+ end
+
+ def dump(service_name)
+ result = ""
+ @definitions.service(service_name).ports.each do |port|
+ result << dump_porttype(port.porttype.name)
+ result << "\n"
+ end
+ result
+ end
+
+private
+
+ def dump_porttype(name)
+ drv_name = create_class_name(name)
+
+ result = ""
+ result << <<__EOD__
+endpoint_url = ARGV.shift
+obj = #{ drv_name }.new(endpoint_url)
+
+# Uncomment the below line to see SOAP wiredumps.
+# obj.wiredump_dev = STDERR
+
+__EOD__
+ @definitions.porttype(name).operations.each do |operation|
+ result << dump_method_signature(operation)
+ result << dump_input_init(operation.input) << "\n"
+ result << dump_operation(operation) << "\n\n"
+ end
+ result
+ end
+
+ def dump_operation(operation)
+ name = operation.name
+ input = operation.input
+ "puts obj.#{ safemethodname(name.name) }#{ dump_inputparam(input) }"
+ end
+
+ def dump_input_init(input)
+ result = input.find_message.parts.collect { |part|
+ "#{ uncapitalize(part.name) }"
+ }.join(" = ")
+ if result.empty?
+ ""
+ else
+ result << " = nil"
+ end
+ result
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/soap/definitions.rb b/lib/wsdl/soap/definitions.rb
index 7a62242204..2f6e7e19f0 100644
--- a/lib/wsdl/soap/definitions.rb
+++ b/lib/wsdl/soap/definitions.rb
@@ -75,8 +75,36 @@ class Definitions < Info
types + self.class.soap_rpc_complextypes
end
+ def collect_faulttypes
+ result = []
+ collect_fault_messages.each do |message|
+ parts = message(message).parts
+ if parts.size != 1
+ raise RuntimeError.new("Expecting fault message to have only 1 part.")
+ end
+ if result.index(parts[0].type).nil?
+ result << parts[0].type
+ end
+ end
+ result
+ end
+
private
+ def collect_fault_messages
+ result = []
+ porttypes.each do |porttype|
+ porttype.operations.each do |operation|
+ operation.fault.each do |fault|
+ if result.index(fault.message).nil?
+ result << fault.message
+ end
+ end
+ end
+ end
+ result
+ end
+
def rpc_operation_complextypes(binding)
types = XSD::NamedElements.new
binding.operations.each do |op_bind|
diff --git a/lib/wsdl/soap/driverCreator.rb b/lib/wsdl/soap/driverCreator.rb
new file mode 100644
index 0000000000..50be8ed1dc
--- /dev/null
+++ b/lib/wsdl/soap/driverCreator.rb
@@ -0,0 +1,84 @@
+# WSDL4R - Creating driver code from WSDL.
+# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'wsdl/soap/mappingRegistryCreator'
+require 'wsdl/soap/methodDefCreator'
+require 'wsdl/soap/classDefCreatorSupport'
+require 'xsd/codegen'
+
+
+module WSDL
+module SOAP
+
+
+class DriverCreator
+ include ClassDefCreatorSupport
+
+ attr_reader :definitions
+
+ def initialize(definitions)
+ @definitions = definitions
+ end
+
+ def dump(porttype = nil)
+ if porttype.nil?
+ result = ""
+ @definitions.porttypes.each do |type|
+ result << dump_porttype(type.name)
+ result << "\n"
+ end
+ else
+ result = dump_porttype(porttype)
+ end
+ result
+ end
+
+private
+
+ def dump_porttype(name)
+ class_name = create_class_name(name)
+ methoddef, types = MethodDefCreator.new(@definitions).dump(name)
+ mr_creator = MappingRegistryCreator.new(@definitions)
+ binding = @definitions.bindings.find { |item| item.type == name }
+ addresses = @definitions.porttype(name).locations
+
+ c = ::XSD::CodeGen::ClassDef.new(class_name, "::SOAP::RPC::Driver")
+ c.def_require("soap/rpc/driver")
+ c.def_const("MappingRegistry", "::SOAP::Mapping::Registry.new")
+ c.def_const("DefaultEndpointUrl", addresses[0].dump)
+ c.def_code(mr_creator.dump(types))
+ c.def_code <<-EOD
+Methods = [
+#{ methoddef.gsub(/^/, " ") }
+]
+ EOD
+ c.def_method("initialize", "endpoint_url = nil") do
+ <<-EOD
+ endpoint_url ||= DefaultEndpointUrl
+ super(endpoint_url, nil)
+ self.mapping_registry = MappingRegistry
+ init_methods
+ EOD
+ end
+ c.def_privatemethod("init_methods") do
+ <<-EOD
+ Methods.each do |name_as, name, params, soapaction, namespace|
+ qname = ::XSD::QName.new(namespace, name_as)
+ @proxy.add_method(qname, soapaction, name, params)
+ add_rpc_method_interface(name, params)
+ end
+ EOD
+ end
+ c.dump
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/soap/mappingRegistryCreator.rb b/lib/wsdl/soap/mappingRegistryCreator.rb
new file mode 100644
index 0000000000..d3b28f47e0
--- /dev/null
+++ b/lib/wsdl/soap/mappingRegistryCreator.rb
@@ -0,0 +1,90 @@
+# WSDL4R - Creating MappingRegistry code from WSDL.
+# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'wsdl/soap/classDefCreatorSupport'
+
+
+module WSDL
+module SOAP
+
+
+class MappingRegistryCreator
+ include ClassDefCreatorSupport
+
+ attr_reader :definitions
+
+ def initialize(definitions)
+ @definitions = definitions
+ @complextypes = @definitions.collect_complextypes
+ @types = nil
+ end
+
+ def dump(types)
+ @types = types
+ map_cache = []
+ map = ""
+ @types.each do |type|
+ if map_cache.index(type).nil?
+ map_cache << type
+ if type.namespace != XSD::Namespace
+ if typemap = dump_typemap(type)
+ map << typemap
+ end
+ end
+ end
+ end
+ return map
+ end
+
+private
+
+ def dump_typemap(type)
+ if definedtype = @complextypes[type]
+ case definedtype.compoundtype
+ when :TYPE_STRUCT
+ dump_struct_typemap(definedtype)
+ when :TYPE_ARRAY
+ dump_array_typemap(definedtype)
+ else
+ raise NotImplementedError.new("Must not reach here.")
+ end
+ end
+ end
+
+ def dump_struct_typemap(definedtype)
+ ele = definedtype.name
+ return <<__EOD__
+MappingRegistry.set(
+ #{ create_class_name(ele) },
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => ::XSD::QName.new("#{ ele.namespace }", "#{ ele.name }") }
+)
+__EOD__
+ end
+
+ def dump_array_typemap(definedtype)
+ ele = definedtype.name
+ arytype = definedtype.find_arytype || XSD::AnyTypeName
+ type = XSD::QName.new(arytype.namespace, arytype.name.sub(/\[(?:,)*\]$/, ''))
+ @types << type
+ return <<__EOD__
+MappingRegistry.set(
+ #{ create_class_name(ele) },
+ ::SOAP::SOAPArray,
+ ::SOAP::Mapping::Registry::TypedArrayFactory,
+ { :type => ::XSD::QName.new("#{ type.namespace }", "#{ type.name }") }
+)
+__EOD__
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/soap/methodDefCreator.rb b/lib/wsdl/soap/methodDefCreator.rb
new file mode 100644
index 0000000000..eded972cdc
--- /dev/null
+++ b/lib/wsdl/soap/methodDefCreator.rb
@@ -0,0 +1,148 @@
+# WSDL4R - Creating driver code from WSDL.
+# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'wsdl/soap/classDefCreatorSupport'
+
+
+module WSDL
+module SOAP
+
+
+class MethodDefCreator
+ include ClassDefCreatorSupport
+
+ attr_reader :definitions
+
+ def initialize(definitions)
+ @definitions = definitions
+ @simpletypes = @definitions.collect_simpletypes
+ @complextypes = @definitions.collect_complextypes
+ @elements = @definitions.collect_elements
+ @types = nil
+ end
+
+ def dump(porttype)
+ @types = []
+ result = ""
+ operations = @definitions.porttype(porttype).operations
+ binding = @definitions.porttype_binding(porttype)
+ operations.each do |operation|
+ op_bind = binding.operations[operation.name]
+ result << ",\n" unless result.empty?
+ result << dump_method(operation, op_bind).chomp
+ end
+ return result, @types
+ end
+
+private
+
+ def dump_method(operation, binding)
+ name = safemethodname(operation.name.name)
+ name_as = operation.name.name
+ params = collect_parameter(operation)
+ soapaction = binding.soapoperation.soapaction
+ namespace = binding.input.soapbody.namespace
+ paramstr = param2str(params)
+ if paramstr.empty?
+ paramstr = '[]'
+ else
+ paramstr = "[\n" << paramstr.gsub(/^/, ' ') << "\n ]"
+ end
+ return <<__EOD__
+[#{ dq(name_as) }, #{ dq(name) },
+ #{ paramstr },
+ #{ soapaction ? dq(soapaction) : "nil" }, #{ dq(namespace) }
+]
+__EOD__
+ end
+
+ def collect_parameter(operation)
+ result = operation.inputparts.collect { |part|
+ collect_type(part.type)
+ param_set('in', definedtype(part), part.name)
+ }
+ outparts = operation.outputparts
+ if outparts.size > 0
+ retval = outparts[0]
+ collect_type(retval.type)
+ result << param_set('retval', definedtype(retval), retval.name)
+ cdr(outparts).each { |part|
+ collect_type(part.type)
+ result << param_set('out', definedtype(part), part.name)
+ }
+ end
+ result
+ end
+
+ def definedtype(part)
+ if mapped = basetype_mapped_class(part.type)
+ ['::' + mapped.name]
+ elsif definedelement = @elements[part.element]
+ raise RuntimeError.new("Part: #{part.name} should be typed for RPC service for now.")
+ elsif definedtype = @simpletypes[part.type]
+ ['::' + basetype_mapped_class(definedtype.base).name]
+ elsif definedtype = @complextypes[part.type]
+ case definedtype.compoundtype
+ when :TYPE_STRUCT
+ ['::SOAP::SOAPStruct', part.type.namespace, part.type.name]
+ when :TYPE_ARRAY
+ arytype = definedtype.find_arytype || XSD::AnyTypeName
+ ns = arytype.namespace
+ name = arytype.name.sub(/\[(?:,)*\]$/, '')
+ ['::SOAP::SOAPArray', ns, name]
+ else
+ raise NotImplementedError.new("Must not reach here.")
+ end
+ else
+ raise RuntimeError.new("Part: #{part.name} cannot be resolved.")
+ end
+ end
+
+ def param_set(io_type, type, name)
+ [io_type, type, name]
+ end
+
+ def collect_type(type)
+ # ignore inline type definition.
+ return if type.nil?
+ @types << type
+ return unless @complextypes[type]
+ @complextypes[type].each_element do |element|
+ collect_type(element.type)
+ end
+ end
+
+ def param2str(params)
+ params.collect { |param|
+ "[#{ dq(param[0]) }, #{ dq(param[2]) }, #{ type2str(param[1]) }]"
+ }.join(",\n")
+ end
+
+ def type2str(type)
+ if type.size == 1
+ "[#{ type[0] }]"
+ else
+ "[#{ type[0] }, #{ dq(type[1]) }, #{ dq(type[2]) }]"
+ end
+ end
+
+ def dq(ele)
+ "\"" << ele << "\""
+ end
+
+ def cdr(ary)
+ result = ary.dup
+ result.shift
+ result
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/soap/servantSkeltonCreator.rb b/lib/wsdl/soap/servantSkeltonCreator.rb
new file mode 100644
index 0000000000..bf293949b8
--- /dev/null
+++ b/lib/wsdl/soap/servantSkeltonCreator.rb
@@ -0,0 +1,65 @@
+# WSDL4R - Creating servant skelton code from WSDL.
+# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'wsdl/soap/classDefCreatorSupport'
+require 'xsd/codegen'
+
+
+module WSDL
+module SOAP
+
+
+class ServantSkeltonCreator
+ include ClassDefCreatorSupport
+ include ::XSD::CodeGen::GenSupport
+
+ attr_reader :definitions
+
+ def initialize(definitions)
+ @definitions = definitions
+ end
+
+ def dump(porttype = nil)
+ if porttype.nil?
+ result = ""
+ @definitions.porttypes.each do |type|
+ result << dump_porttype(type.name)
+ result << "\n"
+ end
+ else
+ result = dump_porttype(porttype)
+ end
+ result
+ end
+
+private
+
+ def dump_porttype(name)
+ class_name = create_class_name(name)
+ c = ::XSD::CodeGen::ClassDef.new(class_name)
+ operations = @definitions.porttype(name).operations
+ operations.each do |operation|
+ name = operation.name.name
+ input = operation.input
+ m = ::XSD::CodeGen::MethodDef.new(name,
+ input.find_message.parts.collect { |part| safevarname(part.name) }) do
+ <<-EOD
+ raise NotImplementedError.new
+ EOD
+ end
+ m.comment = dump_method_signature(operation)
+ c.add_method(m)
+ end
+ c.dump
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/soap/standaloneServerStubCreator.rb b/lib/wsdl/soap/standaloneServerStubCreator.rb
new file mode 100644
index 0000000000..34bcfdbba9
--- /dev/null
+++ b/lib/wsdl/soap/standaloneServerStubCreator.rb
@@ -0,0 +1,79 @@
+# WSDL4R - Creating standalone server stub code from WSDL.
+# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'wsdl/soap/mappingRegistryCreator'
+require 'wsdl/soap/methodDefCreator'
+require 'wsdl/soap/classDefCreatorSupport'
+
+
+module WSDL
+module SOAP
+
+
+class StandaloneServerStubCreator
+ include ClassDefCreatorSupport
+
+ attr_reader :definitions
+
+ def initialize(definitions)
+ @definitions = definitions
+ end
+
+ def dump(service_name)
+ STDERR.puts "!!! IMPORTANT !!!"
+ STDERR.puts "- Standalone stub can have only 1 port for now. So creating stub for the first port and rests are ignored."
+ STDERR.puts "- Standalone server stub ignores port location defined in WSDL. Location is http://localhost:10080/ by default. Generated client from WSDL must be configured to point this endpoint by hand."
+ STDERR.puts "!!! IMPORTANT !!!"
+ port = @definitions.service(service_name).ports[0]
+ dump_porttype(port.porttype.name)
+ end
+
+private
+
+ def dump_porttype(name)
+ class_name = create_class_name(name)
+ methoddef, types = MethodDefCreator.new(@definitions).dump(name)
+ mr_creator = MappingRegistryCreator.new(@definitions)
+
+ c1 = ::XSD::CodeGen::ClassDef.new(class_name)
+ c1.def_require("soap/rpc/standaloneServer")
+ c1.def_require("soap/mapping/registry")
+ c1.def_const("MappingRegistry", "::SOAP::Mapping::Registry.new")
+ c1.def_code(mr_creator.dump(types))
+ c1.def_code <<-EOD
+Methods = [
+#{ methoddef.gsub(/^/, " ") }
+]
+ EOD
+ c2 = ::XSD::CodeGen::ClassDef.new(class_name + "App",
+ "::SOAP::RPC::StandaloneServer")
+ c2.def_method("initialize", "*arg") do
+ <<-EOD
+ super(*arg)
+ servant = #{class_name}.new
+ #{class_name}::Methods.each do |name_as, name, params, soapaction, ns|
+ qname = XSD::QName.new(ns, name_as)
+ @soaplet.app_scope_router.add_method(servant, qname, soapaction, name, params)
+ end
+ self.mapping_registry = #{class_name}::MappingRegistry
+ EOD
+ end
+ c1.dump + "\n" + c2.dump + format(<<-EOD)
+
+ if $0 == __FILE__
+ # Change listen port.
+ #{class_name}App.new('app', nil, '0.0.0.0', 10080).start
+ end
+ EOD
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/xmlSchema/complexContent.rb b/lib/wsdl/xmlSchema/complexContent.rb
index 22f6851864..66ad9e251d 100644
--- a/lib/wsdl/xmlSchema/complexContent.rb
+++ b/lib/wsdl/xmlSchema/complexContent.rb
@@ -28,6 +28,10 @@ class ComplexContent < Info
@attributes = XSD::NamedElements.new
end
+ def targetnamespace
+ parent.targetnamespace
+ end
+
def parse_element(element)
case element
when RestrictionName, ExtensionName
diff --git a/lib/wsdl/xmlSchema/complexType.rb b/lib/wsdl/xmlSchema/complexType.rb
index e889482d09..056a806dc5 100644
--- a/lib/wsdl/xmlSchema/complexType.rb
+++ b/lib/wsdl/xmlSchema/complexType.rb
@@ -8,6 +8,7 @@
require 'wsdl/info'
require 'wsdl/xmlSchema/content'
+require 'wsdl/xmlSchema/element'
require 'xsd/namedelements'
@@ -36,11 +37,16 @@ class ComplexType < Info
def targetnamespace
parent.targetnamespace
end
-
+
+ AnyAsElement = Element.new(XSD::QName.new(nil, 'any'), XSD::AnyTypeName)
def each_element
if @content
@content.elements.each do |element|
- yield(element.name, element)
+ if element.is_a?(Any)
+ yield(AnyAsElement)
+ else
+ yield(element)
+ end
end
end
end
@@ -48,7 +54,11 @@ class ComplexType < Info
def find_element(name)
if @content
@content.elements.each do |element|
- return element if name == element.name
+ if element.is_a?(Any)
+ return AnyAsElement if name == AnyAsElement.name
+ else
+ return element if name == element.name
+ end
end
end
nil
@@ -57,7 +67,11 @@ class ComplexType < Info
def find_element_by_name(name)
if @content
@content.elements.each do |element|
- return element if name == element.name.name
+ if element.is_a?(Any)
+ return AnyAsElement if name == AnyAsElement.name.name
+ else
+ return element if name == element.name.name
+ end
end
end
nil
diff --git a/lib/wsdl/xmlSchema/data.rb b/lib/wsdl/xmlSchema/data.rb
index 2fa8ad6a91..1283ac2a1d 100644
--- a/lib/wsdl/xmlSchema/data.rb
+++ b/lib/wsdl/xmlSchema/data.rb
@@ -6,8 +6,11 @@
# either the dual license version in 2003, or any later version.
+require 'xsd/datatypes'
require 'wsdl/xmlSchema/schema'
require 'wsdl/xmlSchema/import'
+require 'wsdl/xmlSchema/simpleType'
+require 'wsdl/xmlSchema/simpleRestriction'
require 'wsdl/xmlSchema/complexType'
require 'wsdl/xmlSchema/complexContent'
require 'wsdl/xmlSchema/any'
@@ -17,7 +20,7 @@ require 'wsdl/xmlSchema/choice'
require 'wsdl/xmlSchema/sequence'
require 'wsdl/xmlSchema/attribute'
require 'wsdl/xmlSchema/unique'
-
+require 'wsdl/xmlSchema/enumeration'
module WSDL
module XMLSchema
@@ -30,6 +33,7 @@ ChoiceName = XSD::QName.new(XSD::Namespace, 'choice')
ComplexContentName = XSD::QName.new(XSD::Namespace, 'complexContent')
ComplexTypeName = XSD::QName.new(XSD::Namespace, 'complexType')
ElementName = XSD::QName.new(XSD::Namespace, 'element')
+EnumerationName = XSD::QName.new(XSD::Namespace, 'enumeration')
ExtensionName = XSD::QName.new(XSD::Namespace, 'extension')
ImportName = XSD::QName.new(XSD::Namespace, 'import')
RestrictionName = XSD::QName.new(XSD::Namespace, 'restriction')
@@ -57,6 +61,7 @@ SchemaLocationAttrName = XSD::QName.new(nil, 'schemaLocation')
TargetNamespaceAttrName = XSD::QName.new(nil, 'targetNamespace')
TypeAttrName = XSD::QName.new(nil, 'type')
UseAttrName = XSD::QName.new(nil, 'use')
+ValueAttrName = XSD::QName.new(nil, 'value')
end
diff --git a/lib/wsdl/xmlSchema/enumeration.rb b/lib/wsdl/xmlSchema/enumeration.rb
new file mode 100644
index 0000000000..cd61572d07
--- /dev/null
+++ b/lib/wsdl/xmlSchema/enumeration.rb
@@ -0,0 +1,36 @@
+# WSDL4R - XMLSchema enumeration definition for WSDL.
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+
+
+module WSDL
+module XMLSchema
+
+
+class Enumeration < Info
+ def initialize
+ super
+ end
+
+ def parse_element(element)
+ nil
+ end
+
+ def parse_attr(attr, value)
+ case attr
+ when ValueAttrName
+ parent.enumeration << value
+ value
+ end
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/xmlSchema/parser.rb b/lib/wsdl/xmlSchema/parser.rb
index 688af27c8c..5401c5f729 100644
--- a/lib/wsdl/xmlSchema/parser.rb
+++ b/lib/wsdl/xmlSchema/parser.rb
@@ -116,7 +116,8 @@ private
unless o
raise UnknownElementError.new("Unknown element #{ element }.")
end
- o.parent = parent
+ # node could be a pseudo element. pseudo element has its own parent.
+ o.parent = parent if o.parent.nil?
end
attrs.each do |key, value|
attr = unless /:/ =~ key
diff --git a/lib/wsdl/xmlSchema/schema.rb b/lib/wsdl/xmlSchema/schema.rb
index b2a195d41f..b530a92556 100644
--- a/lib/wsdl/xmlSchema/schema.rb
+++ b/lib/wsdl/xmlSchema/schema.rb
@@ -17,6 +17,7 @@ module XMLSchema
class Schema < Info
attr_reader :targetnamespace # required
attr_reader :complextypes
+ attr_reader :simpletypes
attr_reader :elements
attr_reader :attributes
attr_reader :imports
@@ -27,6 +28,7 @@ class Schema < Info
super
@targetnamespace = nil
@complextypes = XSD::NamedElements.new
+ @simpletypes = XSD::NamedElements.new
@elements = XSD::NamedElements.new
@attributes = XSD::NamedElements.new
@imports = []
@@ -44,8 +46,9 @@ class Schema < Info
@complextypes << o
o
when SimpleTypeName
- STDERR.puts("Restriction of basetype with simpleType definition is ignored for now.")
- nil
+ o = SimpleType.new
+ @simpletypes << o
+ o
when ElementName
o = Element.new
@elements << o
@@ -83,6 +86,12 @@ class Schema < Info
result
end
+ def collect_simpletypes
+ result = XSD::NamedElements.new
+ result.concat(@simpletypes)
+ result
+ end
+
def self.parse_element(element)
if element == SchemaName
Schema.new
diff --git a/lib/wsdl/xmlSchema/simpleRestriction.rb b/lib/wsdl/xmlSchema/simpleRestriction.rb
new file mode 100644
index 0000000000..6986e74423
--- /dev/null
+++ b/lib/wsdl/xmlSchema/simpleRestriction.rb
@@ -0,0 +1,48 @@
+# WSDL4R - XMLSchema simpleType definition for WSDL.
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'xsd/namedelements'
+
+
+module WSDL
+module XMLSchema
+
+
+class SimpleRestriction < Info
+ attr_reader :base
+ attr_reader :enumeration
+
+ def initialize
+ super
+ @base = nil
+ @enumeration = [] # NamedElements?
+ end
+
+ def valid?(value)
+ @enumeration.include?(value)
+ end
+
+ def parse_element(element)
+ case element
+ when EnumerationName
+ Enumeration.new # just a parsing handler
+ end
+ end
+
+ def parse_attr(attr, value)
+ case attr
+ when BaseAttrName
+ @base = value
+ end
+ end
+end
+
+
+end
+end
diff --git a/lib/wsdl/xmlSchema/simpleType.rb b/lib/wsdl/xmlSchema/simpleType.rb
new file mode 100644
index 0000000000..830086f99e
--- /dev/null
+++ b/lib/wsdl/xmlSchema/simpleType.rb
@@ -0,0 +1,81 @@
+# WSDL4R - XMLSchema simpleType definition for WSDL.
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'wsdl/info'
+require 'xsd/namedelements'
+
+
+module WSDL
+module XMLSchema
+
+
+class SimpleType < Info
+ attr_accessor :name
+ attr_reader :derivetype
+ attr_reader :restriction
+
+ def check_lexical_format(value)
+ if @restriction
+ check_restriction(value)
+ elsif @extension
+ raise NotImplementedError
+ # ToDo
+ else
+ raise ArgumentError.new("incomplete simpleType")
+ end
+ end
+
+ def base
+ if @restriction
+ @restriction.base
+ elsif @extension
+ @extension.base
+ else
+ raise ArgumentError.new("incomplete simpleType")
+ end
+ end
+
+ def initialize(name = nil)
+ super()
+ @name = name
+ @derivetype = nil
+ @restriction = nil
+ end
+
+ def targetnamespace
+ parent.targetnamespace
+ end
+
+ def parse_element(element)
+ case element
+ when RestrictionName
+ @restriction = SimpleRestriction.new
+ @derivetype = element.name
+ @restriction
+ end
+ end
+
+ def parse_attr(attr, value)
+ case attr
+ when NameAttrName
+ @name = XSD::QName.new(targetnamespace, value)
+ end
+ end
+
+private
+
+ def check_restriction(value)
+ unless @restriction.valid?(value)
+ raise ::XSD::ValueSpaceError.new("#{@name}: cannot accept '#{value}'.")
+ end
+ end
+end
+
+
+end
+end
diff --git a/lib/xsd/codegen.rb b/lib/xsd/codegen.rb
new file mode 100644
index 0000000000..d820ebf1f2
--- /dev/null
+++ b/lib/xsd/codegen.rb
@@ -0,0 +1,12 @@
+# XSD4R - Generating code library
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'xsd/codegen/gensupport'
+require 'xsd/codegen/moduledef'
+require 'xsd/codegen/classdef'
+require 'xsd/codegen/methoddef'
diff --git a/lib/xsd/codegen/classdef.rb b/lib/xsd/codegen/classdef.rb
new file mode 100644
index 0000000000..8f72e95efd
--- /dev/null
+++ b/lib/xsd/codegen/classdef.rb
@@ -0,0 +1,203 @@
+# XSD4R - Generating class definition code
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'xsd/codegen/gensupport'
+require 'xsd/codegen/moduledef'
+require 'xsd/codegen/methoddef'
+
+
+module XSD
+module CodeGen
+
+
+class ClassDef < ModuleDef
+ include GenSupport
+
+ def initialize(name, baseclass = nil)
+ super(name)
+ @baseclass = baseclass
+ @classvar = []
+ @attrdef = []
+ end
+
+ def def_classvar(var, value)
+ var = var.sub(/\A@@/, "")
+ unless safevarname?(var)
+ raise ArgumentError.new("#{var} seems to be unsafe")
+ end
+ @classvar << [var, value]
+ end
+
+ def def_attr(attrname, writable = true, varname = nil)
+ unless safevarname?(varname || attrname)
+ raise ArgumentError.new("#{varname || attrname} seems to be unsafe")
+ end
+ @attrdef << [attrname, writable, varname]
+ end
+
+ def dump
+ buf = ""
+ unless @requirepath.empty?
+ buf << dump_requirepath
+ end
+ buf << dump_emptyline unless buf.empty?
+ package = @name.split(/::/)[0..-2]
+ buf << dump_package_def(package) unless package.empty?
+ buf << dump_comment if @comment
+ buf << dump_class_def
+ spacer = false
+ unless @classvar.empty?
+ spacer = true
+ buf << dump_classvar
+ end
+ unless @const.empty?
+ buf << dump_emptyline if spacer
+ spacer = true
+ buf << dump_const
+ end
+ unless @code.empty?
+ buf << dump_emptyline if spacer
+ spacer = true
+ buf << dump_code
+ end
+ unless @attrdef.empty?
+ buf << dump_emptyline if spacer
+ spacer = true
+ buf << dump_attributes
+ end
+ unless @methoddef.empty?
+ buf << dump_emptyline if spacer
+ spacer = true
+ buf << dump_methods
+ end
+ buf << dump_class_def_end
+ buf << dump_package_def_end(package) unless package.empty?
+ buf
+ end
+
+private
+
+ def dump_class_def
+ name = @name.to_s.split(/::/)
+ if @baseclass
+ format("class #{name.last} < #{@baseclass}")
+ else
+ format("class #{name.last}")
+ end
+ end
+
+ def dump_class_def_end
+ str = format("end")
+ end
+
+ def dump_classvar
+ dump_static(
+ @classvar.collect { |var, value|
+ %Q(@@#{var.sub(/^@@/, "")} = #{dump_value(value)})
+ }.join("\n")
+ )
+ end
+
+ def dump_attributes
+ str = ""
+ @attrdef.each do |attrname, writable, varname|
+ varname ||= attrname
+ if attrname == varname
+ str << format(dump_accessor(attrname, writable), 2)
+ end
+ end
+ @attrdef.each do |attrname, writable, varname|
+ varname ||= attrname
+ if attrname != varname
+ str << "\n" unless str.empty?
+ str << format(dump_attribute(attrname, writable, varname), 2)
+ end
+ end
+ str
+ end
+
+ def dump_accessor(attrname, writable)
+ if writable
+ "attr_accessor :#{attrname}"
+ else
+ "attr_reader :#{attrname}"
+ end
+ end
+
+ def dump_attribute(attrname, writable, varname)
+ str = nil
+ mr = MethodDef.new(attrname)
+ mr.definition = "@#{varname}"
+ str = mr.dump
+ if writable
+ mw = MethodDef.new(attrname + "=", 'value')
+ mw.definition = "@#{varname} = value"
+ str << "\n" + mw.dump
+ end
+ str
+ end
+end
+
+
+end
+end
+
+
+if __FILE__ == $0
+ require 'xsd/codegen/classdef'
+ include XSD::CodeGen
+ c = ClassDef.new("Foo::Bar::HobbitName", String)
+ c.def_require("foo/bar")
+ c.comment = <<-EOD
+ foo
+ bar
+ baz
+ EOD
+ c.def_const("FOO", 1)
+ c.def_classvar("@@foo", "var".dump)
+ c.def_classvar("baz", "1".dump)
+ c.def_attr("Foo", true, "foo")
+ c.def_attr("bar")
+ c.def_attr("baz", true)
+ c.def_attr("Foo2", true, "foo2")
+ c.def_attr("foo3", false, "foo3")
+ c.def_method("foo") do
+ <<-EOD
+ foo.bar = 1
+\tbaz.each do |ele|
+\t ele
+ end
+ EOD
+ end
+ c.def_method("baz", "qux") do
+ <<-EOD
+ [1, 2, 3].each do |i|
+ p i
+ end
+ EOD
+ end
+
+ m = MethodDef.new("qux", "quxx", "quxxx") do
+ <<-EOD
+ p quxx + quxxx
+ EOD
+ end
+ m.comment = "hello world\n123"
+ c.add_method(m)
+ c.def_code <<-EOD
+ Foo.new
+ Bar.z
+ EOD
+ c.def_code <<-EOD
+ Foo.new
+ Bar.z
+ EOD
+ c.def_privatemethod("foo", "baz", "*arg", "&block")
+
+ puts c.dump
+end
diff --git a/lib/xsd/codegen/commentdef.rb b/lib/xsd/codegen/commentdef.rb
new file mode 100644
index 0000000000..f98fade57d
--- /dev/null
+++ b/lib/xsd/codegen/commentdef.rb
@@ -0,0 +1,34 @@
+# XSD4R - Generating comment definition code
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'xsd/codegen/gensupport'
+
+
+module XSD
+module CodeGen
+
+
+module CommentDef
+ include GenSupport
+
+ attr_accessor :comment
+
+private
+
+ def dump_comment
+ if /^#/ =~ @comment
+ format(@comment)
+ else
+ format(@comment).gsub(/^/, "# ")
+ end
+ end
+end
+
+
+end
+end
diff --git a/lib/xsd/codegen/gensupport.rb b/lib/xsd/codegen/gensupport.rb
new file mode 100644
index 0000000000..df90550fa0
--- /dev/null
+++ b/lib/xsd/codegen/gensupport.rb
@@ -0,0 +1,112 @@
+# XSD4R - Code generation support
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+module XSD
+module CodeGen
+
+
+module GenSupport
+ def capitalize(target)
+ target.sub(/^([a-z])/) { $1.tr!('[a-z]', '[A-Z]') }
+ end
+ module_function :capitalize
+
+ def uncapitalize(target)
+ target.sub(/^([A-Z])/) { $1.tr!('[A-Z]', '[a-z]') }
+ end
+ module_function :uncapitalize
+
+ def safeconstname(name)
+ safename = name.scan(/[a-zA-Z0-9_]+/).collect { |ele|
+ GenSupport.capitalize(ele)
+ }.join
+ unless /^[A-Z]/ =~ safename
+ safename = "C_#{safename}"
+ end
+ safename
+ end
+ module_function :safeconstname
+
+ def safeconstname?(name)
+ /\A[A-Z][a-zA-Z0-9_]*\z/ =~ name
+ end
+ module_function :safeconstname?
+
+ def safemethodname(name)
+ safevarname(name)
+ end
+ module_function :safemethodname
+
+ def safemethodname?(name)
+ /\A[a-zA-Z_][a-zA-Z0-9_]*[=!?]?\z/ =~ name
+ end
+ module_function :safemethodname?
+
+ def safevarname(name)
+ safename = name.scan(/[a-zA-Z0-9_]+/).join('_')
+ safename = uncapitalize(safename)
+ unless /^[a-z]/ =~ safename
+ safename = "m_#{safename}"
+ end
+ safename
+ end
+ module_function :safevarname
+
+ def safevarname?(name)
+ /\A[a-z_][a-zA-Z0-9_]*\z/ =~ name
+ end
+ module_function :safevarname?
+
+ def format(str, indent = nil)
+ str = trim_eol(str)
+ str = trim_indent(str)
+ if indent
+ str.gsub(/^/, " " * indent)
+ else
+ str
+ end
+ end
+
+private
+
+ def trim_eol(str)
+ str.collect { |line|
+ line.sub(/\r?\n$/, "") + "\n"
+ }.join
+ end
+
+ def trim_indent(str)
+ indent = nil
+ str = str.collect { |line| untab(line) }.join
+ str.each do |line|
+ head = line.index(/\S/)
+ if !head.nil? and (indent.nil? or head < indent)
+ indent = head
+ end
+ end
+ return str unless indent
+ str.collect { |line|
+ line.sub(/^ {0,#{indent}}/, "")
+ }.join
+ end
+
+ def untab(line, ts = 8)
+ while pos = line.index(/\t/)
+ line = line.sub(/\t/, " " * (ts - (pos % ts)))
+ end
+ line
+ end
+
+ def dump_emptyline
+ "\n"
+ end
+end
+
+
+end
+end
diff --git a/lib/xsd/codegen/methoddef.rb b/lib/xsd/codegen/methoddef.rb
new file mode 100644
index 0000000000..797a4f024e
--- /dev/null
+++ b/lib/xsd/codegen/methoddef.rb
@@ -0,0 +1,63 @@
+# XSD4R - Generating method definition code
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'xsd/codegen/gensupport'
+require 'xsd/codegen/commentdef'
+
+
+module XSD
+module CodeGen
+
+
+class MethodDef
+ include GenSupport
+ include CommentDef
+
+ attr_accessor :definition
+
+ def initialize(name, *params)
+ unless safemethodname?(name)
+ raise ArgumentError.new("#{name} seems to be unsafe")
+ end
+ @name = name
+ @params = params
+ @comment = nil
+ @definition = yield if block_given?
+ end
+
+ def dump
+ buf = ""
+ buf << dump_comment if @comment
+ buf << dump_method_def
+ buf << dump_definition if @definition
+ buf << dump_method_def_end
+ buf
+ end
+
+private
+
+ def dump_method_def
+ if @params.empty?
+ format("def #{@name}")
+ else
+ format("def #{@name}(#{@params.join(", ")})")
+ end
+ end
+
+ def dump_method_def_end
+ format("end")
+ end
+
+ def dump_definition
+ format(@definition, 2)
+ end
+end
+
+
+end
+end
diff --git a/lib/xsd/codegen/moduledef.rb b/lib/xsd/codegen/moduledef.rb
new file mode 100644
index 0000000000..dc2746b2ee
--- /dev/null
+++ b/lib/xsd/codegen/moduledef.rb
@@ -0,0 +1,191 @@
+# XSD4R - Generating module definition code
+# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+
+# 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.
+
+
+require 'xsd/codegen/gensupport'
+require 'xsd/codegen/methoddef'
+require 'xsd/codegen/commentdef'
+
+
+module XSD
+module CodeGen
+
+
+class ModuleDef
+ include GenSupport
+ include CommentDef
+
+ def initialize(name)
+ @name = name
+ @comment = nil
+ @const = []
+ @code = []
+ @requirepath = []
+ @methoddef = []
+ end
+
+ def def_require(path)
+ @requirepath << path
+ end
+
+ def def_const(const, value)
+ unless safeconstname?(const)
+ raise ArgumentError.new("#{const} seems to be unsafe")
+ end
+ @const << [const, value]
+ end
+
+ def def_code(code)
+ @code << code
+ end
+
+ def def_method(name, *params)
+ add_method(MethodDef.new(name, *params) { yield if block_given? }, :public)
+ end
+ alias def_publicmethod def_method
+
+ def def_protectedmethod(name, *params)
+ add_method(MethodDef.new(name, *params) { yield if block_given? },
+ :protected)
+ end
+
+ def def_privatemethod(name, *params)
+ add_method(MethodDef.new(name, *params) { yield if block_given? }, :private)
+ end
+
+ def add_method(m, visibility = :public)
+ @methoddef << [visibility, m]
+ end
+
+ def dump
+ buf = ""
+ unless @requirepath.empty?
+ buf << dump_requirepath
+ end
+ buf << dump_emptyline unless buf.empty?
+ package = @name.split(/::/)[0..-2]
+ buf << dump_package_def(package) unless package.empty?
+ buf << dump_comment if @comment
+ buf << dump_module_def
+ spacer = false
+ unless @const.empty?
+ buf << dump_emptyline if spacer
+ spacer = true
+ buf << dump_const
+ end
+ unless @code.empty?
+ buf << dump_emptyline if spacer
+ spacer = true
+ buf << dump_code
+ end
+ unless @methoddef.empty?
+ buf << dump_emptyline if spacer
+ spacer = true
+ buf << dump_methods
+ end
+ buf << dump_module_def_end
+ buf << dump_package_def_end(package) unless package.empty?
+ buf
+ end
+
+private
+
+ def dump_requirepath
+ format(
+ @requirepath.collect { |path|
+ %Q(require '#{path}')
+ }.join("\n")
+ )
+ end
+
+ def dump_const
+ dump_static(
+ @const.sort.collect { |var, value|
+ %Q(#{var} = #{dump_value(value)})
+ }.join("\n")
+ )
+ end
+
+ def dump_code
+ dump_static(@code.join("\n"))
+ end
+
+ def dump_static(str)
+ format(str, 2)
+ end
+
+ def dump_methods
+ methods = {}
+ @methoddef.each do |visibility, method|
+ (methods[visibility] ||= []) << method
+ end
+ str = ""
+ [:public, :protected, :private].each do |visibility|
+ if methods[visibility]
+ str << "\n" unless str.empty?
+ str << visibility.to_s << "\n\n" unless visibility == :public
+ str << methods[visibility].collect { |m| format(m.dump, 2) }.join("\n")
+ end
+ end
+ str
+ end
+
+ def dump_value(value)
+ if value.respond_to?(:to_src)
+ value.to_src
+ else
+ value
+ end
+ end
+
+ def dump_package_def(package)
+ format(package.collect { |ele| "module #{ele}" }.join("; ")) + "\n\n"
+ end
+
+ def dump_package_def_end(package)
+ "\n\n" + format(package.collect { |ele| "end" }.join("; "))
+ end
+
+ def dump_module_def
+ name = @name.to_s.split(/::/)
+ format("module #{name.last}")
+ end
+
+ def dump_module_def_end
+ format("end")
+ end
+end
+
+
+end
+end
+
+
+if __FILE__ == $0
+ require 'xsd/codegen/moduledef'
+ include XSD::CodeGen
+ m = ModuleDef.new("Foo::Bar::HobbitName")
+ m.def_require("foo/bar")
+ m.def_require("baz")
+ m.comment = <<-EOD
+ foo
+ bar
+ baz
+ EOD
+ m.def_method("foo") do
+ <<-EOD
+ foo.bar = 1
+ baz.each do |ele|
+ ele + 1
+ end
+ EOD
+ end
+ m.def_method("baz", "qux")
+ #m.def_protectedmethod("aaa")
+ m.def_privatemethod("bbb")
+ puts m.dump
+end
diff --git a/lib/xsd/datatypes.rb b/lib/xsd/datatypes.rb
index 7223632b04..7173f52d65 100644
--- a/lib/xsd/datatypes.rb
+++ b/lib/xsd/datatypes.rb
@@ -103,6 +103,12 @@ class XSDAnySimpleType < NSDBase
set(value) if value
end
+ # true or raise
+ def check_lexical_format(value)
+ screen_data(value)
+ true
+ end
+
# set accepts a string which follows lexical space (ex. String: "+123"), or
# an object which follows canonical space (ex. Integer: 123).
def set(value)
@@ -111,7 +117,7 @@ class XSDAnySimpleType < NSDBase
@data = nil
else
@is_nil = false
- _set(value)
+ _set(screen_data(value))
end
end
@@ -126,6 +132,11 @@ class XSDAnySimpleType < NSDBase
private
+ # raises ValueSpaceError if check failed
+ def screen_data(value)
+ value
+ end
+
def _set(value)
@data = value
end
@@ -144,12 +155,6 @@ class XSDNil < XSDAnySimpleType
@type = Type
set(value)
end
-
-private
-
- def _set(value)
- @data = value
- end
end
@@ -167,11 +172,11 @@ class XSDString < XSDAnySimpleType
private
- def _set(value)
+ def screen_data(value)
unless XSD::Charset.is_ces(value, XSD::Charset.encoding)
raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.")
end
- @data = value
+ value
end
end
@@ -186,18 +191,18 @@ class XSDBoolean < XSDAnySimpleType
private
- def _set(value)
+ def screen_data(value)
if value.is_a?(String)
str = value.strip
if str == 'true' || str == '1'
- @data = true
+ true
elsif str == 'false' || str == '0'
- @data = false
+ false
else
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
else
- @data = value ? true : false
+ value ? true : false
end
end
end
@@ -220,38 +225,39 @@ class XSDDecimal < XSDAnySimpleType
private
- def _set(d)
+ def screen_data(d)
if d.is_a?(String)
# Integer("00012") => 10 in Ruby.
d.sub!(/^([+\-]?)0*(?=\d)/, "\\1")
end
- set_str(d)
+ screen_data_str(d)
end
- def set_str(str)
+ def screen_data_str(str)
/^([+\-]?)(\d*)(?:\.(\d*)?)?$/ =~ str.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
-
- @sign = $1 || '+'
+ sign = $1 || '+'
int_part = $2
frac_part = $3
-
int_part = '0' if int_part.empty?
frac_part = frac_part ? frac_part.sub(/0+$/, '') : ''
- @point = - frac_part.size
- @number = int_part + frac_part
-
+ point = - frac_part.size
+ number = int_part + frac_part
# normalize
- if @sign == '+'
- @sign = ''
- elsif @sign == '-'
- if @number == '0'
- @sign = ''
+ if sign == '+'
+ sign = ''
+ elsif sign == '-'
+ if number == '0'
+ sign = ''
end
end
+ [sign, point, number]
+ end
+ def _set(pair)
+ @sign, @point, @number = pair
@data = _to_s
@data.freeze
end
@@ -272,7 +278,7 @@ module FloatConstants
NEGATIVE_INF = -1.0/0.0
POSITIVE_ZERO = +1.0/POSITIVE_INF
NEGATIVE_ZERO = -1.0/POSITIVE_INF
- MIN_POSITIVE_SINGLE = 2 ** -149
+ MIN_POSITIVE_SINGLE = 2.0 ** -149
end
class XSDFloat < XSDAnySimpleType
@@ -287,20 +293,18 @@ class XSDFloat < XSDAnySimpleType
private
- def _set(value)
+ def screen_data(value)
# "NaN".to_f => 0 in some environment. libc?
if value.is_a?(Float)
- @data = narrow32bit(value)
- return
+ return narrow32bit(value)
end
-
str = value.to_s.strip
if str == 'NaN'
- @data = NaN
+ NaN
elsif str == 'INF'
- @data = POSITIVE_INF
+ POSITIVE_INF
elsif str == '-INF'
- @data = NEGATIVE_INF
+ NEGATIVE_INF
else
if /^[+\-\.\deE]+$/ !~ str
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
@@ -308,7 +312,7 @@ private
# Float("-1.4E") might fail on some system.
str << '0' if /e$/i =~ str
begin
- @data = narrow32bit(Float(str))
+ return narrow32bit(Float(str))
rescue ArgumentError
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
@@ -357,28 +361,26 @@ class XSDDouble < XSDAnySimpleType
private
- def _set(value)
+ def screen_data(value)
# "NaN".to_f => 0 in some environment. libc?
if value.is_a?(Float)
- @data = value
- return
+ return value
end
-
str = value.to_s.strip
if str == 'NaN'
- @data = NaN
+ NaN
elsif str == 'INF'
- @data = POSITIVE_INF
+ POSITIVE_INF
elsif str == '-INF'
- @data = NEGATIVE_INF
+ NEGATIVE_INF
else
begin
- @data = Float(str)
+ return Float(str)
rescue ArgumentError
# '1.4e' cannot be parsed on some architecture.
if /e\z/i =~ str
begin
- @data = Float(str + '0')
+ return Float(str + '0')
rescue ArgumentError
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
@@ -429,24 +431,27 @@ class XSDDuration < XSDAnySimpleType
private
- def _set(value)
+ def screen_data(value)
/^([+\-]?)P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$/ =~ value.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.")
end
-
if ($5 and ((!$2 and !$3 and !$4) or (!$6 and !$7 and !$8)))
# Should we allow 'PT5S' here?
raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.")
end
+ sign = $1
+ year = $2.to_i
+ month = $3.to_i
+ day = $4.to_i
+ hour = $6.to_i
+ min = $7.to_i
+ sec = $8 ? XSDDecimal.new($8) : 0
+ [sign, year, month, day, hour, min, sec]
+ end
- @sign = $1
- @year = $2.to_i
- @month = $3.to_i
- @day = $4.to_i
- @hour = $6.to_i
- @min = $7.to_i
- @sec = $8 ? XSDDecimal.new($8) : 0
+ def _set(ary)
+ @sign, @year, @month, @day, @hour, @min, @sec = ary
@data = _to_s
@data.freeze
end
@@ -524,18 +529,18 @@ module XSDDateTimeImpl
end
end
- def _set(t)
- set_datetime_init(t)
+ def screen_data(t)
if (t.is_a?(Date))
- @data = t
+ t
elsif (t.is_a?(Time))
sec, min, hour, mday, month, year = t.to_a[0..5]
diffday = t.usec.to_r / 1000000 / SecInDay
of = t.utc_offset.to_r / SecInDay
- @data = DateTime.civil(year, month, mday, hour, min, sec, of)
- @data += diffday
+ data = DateTime.civil(year, month, mday, hour, min, sec, of)
+ data += diffday
+ data
else
- set_str(t)
+ screen_data_str(t)
end
end
@@ -557,11 +562,7 @@ class XSDDateTime < XSDAnySimpleType
private
- def set_datetime_init(t)
- @secfrac = nil
- end
-
- def set_str(t)
+ def screen_data_str(t)
/^([+\-]?\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
@@ -569,7 +570,6 @@ private
if $1 == '0000'
raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
end
-
year = $1.to_i
if year < 0
year += 1
@@ -581,22 +581,18 @@ private
sec = $6.to_i
secfrac = $7
zonestr = $8
-
- @data = DateTime.civil(year, mon, mday, hour, min, sec, tz2of(zonestr))
- @secfrac = secfrac
-
+ data = DateTime.civil(year, mon, mday, hour, min, sec, tz2of(zonestr))
if secfrac
diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay
- # jd = @data.jd
- # day_fraction = @data.day_fraction + diffday
- # @data = DateTime.new0(DateTime.jd_to_rjd(jd, day_fraction,
- # @data.offset), @data.offset)
- #
- # Thanks to Funaba-san, above code can be simply written as below.
- @data += diffday
+ data += diffday
# FYI: new0 and jd_to_rjd are not necessary to use if you don't have
# exceptional reason.
end
+ [data, secfrac]
+ end
+
+ def _set(pair)
+ @data, @secfrac = pair
end
def _to_s
@@ -607,7 +603,8 @@ private
if @secfrac
s << ".#{ @secfrac }"
else
- s << sprintf("%.16f", (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '')
+ s << sprintf("%.16f",
+ (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '')
end
end
add_tz(s)
@@ -627,29 +624,26 @@ class XSDTime < XSDAnySimpleType
private
- def set_datetime_init(t)
- @secfrac = nil
- end
-
- def set_str(t)
+ def screen_data_str(t)
/^(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
end
-
hour = $1.to_i
min = $2.to_i
sec = $3.to_i
secfrac = $4
zonestr = $5
-
- @data = DateTime.civil(1, 1, 1, hour, min, sec, tz2of(zonestr))
- @secfrac = secfrac
-
+ data = DateTime.civil(1, 1, 1, hour, min, sec, tz2of(zonestr))
if secfrac
diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay
- @data += diffday
+ data += diffday
end
+ [data, secfrac]
+ end
+
+ def _set(pair)
+ @data, @secfrac = pair
end
def _to_s
@@ -658,7 +652,8 @@ private
if @secfrac
s << ".#{ @secfrac }"
else
- s << sprintf("%.16f", (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '')
+ s << sprintf("%.16f",
+ (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '')
end
end
add_tz(s)
@@ -677,15 +672,11 @@ class XSDDate < XSDAnySimpleType
private
- def set_datetime_init(t)
- end
-
- def set_str(t)
+ def screen_data_str(t)
/^([+\-]?\d{4,})-(\d\d)-(\d\d)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
end
-
year = $1.to_i
if year < 0
year += 1
@@ -693,8 +684,7 @@ private
mon = $2.to_i
mday = $3.to_i
zonestr = $4
-
- @data = DateTime.civil(year, mon, mday, 0, 0, 0, tz2of(zonestr))
+ DateTime.civil(year, mon, mday, 0, 0, 0, tz2of(zonestr))
end
def _to_s
@@ -716,23 +706,18 @@ class XSDGYearMonth < XSDAnySimpleType
private
- def set_datetime_init(t)
- end
-
- def set_str(t)
+ def screen_data_str(t)
/^([+\-]?\d{4,})-(\d\d)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
end
-
year = $1.to_i
if year < 0
year += 1
end
mon = $2.to_i
zonestr = $3
-
- @data = DateTime.civil(year, mon, 1, 0, 0, 0, tz2of(zonestr))
+ DateTime.civil(year, mon, 1, 0, 0, 0, tz2of(zonestr))
end
def _to_s
@@ -754,22 +739,17 @@ class XSDGYear < XSDAnySimpleType
private
- def set_datetime_init(t)
- end
-
- def set_str(t)
+ def screen_data_str(t)
/^([+\-]?\d{4,})(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
end
-
year = $1.to_i
if year < 0
year += 1
end
zonestr = $2
-
- @data = DateTime.civil(year, 1, 1, 0, 0, 0, tz2of(zonestr))
+ DateTime.civil(year, 1, 1, 0, 0, 0, tz2of(zonestr))
end
def _to_s
@@ -791,20 +771,15 @@ class XSDGMonthDay < XSDAnySimpleType
private
- def set_datetime_init(t)
- end
-
- def set_str(t)
+ def screen_data_str(t)
/^(\d\d)-(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
end
-
mon = $1.to_i
mday = $2.to_i
zonestr = $3
-
- @data = DateTime.civil(1, mon, mday, 0, 0, 0, tz2of(zonestr))
+ DateTime.civil(1, mon, mday, 0, 0, 0, tz2of(zonestr))
end
def _to_s
@@ -825,19 +800,14 @@ class XSDGDay < XSDAnySimpleType
private
- def set_datetime_init(t)
- end
-
- def set_str(t)
+ def screen_data_str(t)
/^(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
end
-
mday = $1.to_i
zonestr = $2
-
- @data = DateTime.civil(1, 1, mday, 0, 0, 0, tz2of(zonestr))
+ DateTime.civil(1, 1, mday, 0, 0, 0, tz2of(zonestr))
end
def _to_s
@@ -858,19 +828,14 @@ class XSDGMonth < XSDAnySimpleType
private
- def set_datetime_init(t)
- end
-
- def set_str(t)
+ def screen_data_str(t)
/^(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ t }'.")
end
-
mon = $1.to_i
zonestr = $2
-
- @data = DateTime.civil(1, mon, 1, 0, 0, 0, tz2of(zonestr))
+ DateTime.civil(1, mon, 1, 0, 0, 0, tz2of(zonestr))
end
def _to_s
@@ -903,9 +868,8 @@ class XSDHexBinary < XSDAnySimpleType
private
- def _set(value)
- @data = value.unpack("H*")[0]
- @data.tr!('a-f', 'A-F')
+ def screen_data(value)
+ value.unpack("H*")[0].tr('a-f', 'A-F')
end
end
@@ -933,8 +897,8 @@ class XSDBase64Binary < XSDAnySimpleType
private
- def _set(value)
- @data = [value].pack("m").strip
+ def screen_data(value)
+ [value].pack("m").strip
end
end
@@ -949,9 +913,9 @@ class XSDAnyURI < XSDAnySimpleType
private
- def _set(value)
+ def screen_data(value)
begin
- @data = URI.parse(value.to_s.strip)
+ URI.parse(value.to_s.strip)
rescue URI::InvalidURIError
raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.")
end
@@ -969,14 +933,18 @@ class XSDQName < XSDAnySimpleType
private
- def _set(value)
+ def screen_data(value)
/^(?:([^:]+):)?([^:]+)$/ =~ value.to_s.strip
unless Regexp.last_match
raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.")
end
+ prefix = $1
+ localpart = $2
+ [prefix, localpart]
+ end
- @prefix = $1
- @localpart = $2
+ def _set(pair)
+ @prefix, @localpart = pair
@data = _to_s
@data.freeze
end
@@ -1005,7 +973,7 @@ class XSDNormalizedString < XSDString
private
- def _set(value)
+ def screen_data(value)
if /[\t\r\n]/ =~ value
raise ValueSpaceError.new("#{ type }: cannot accept '#{ value }'.")
end
@@ -1024,12 +992,17 @@ class XSDInteger < XSDDecimal
private
- def set_str(str)
+ def screen_data_str(str)
begin
- @data = Integer(str)
+ data = Integer(str)
rescue ArgumentError
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
+ data
+ end
+
+ def _set(value)
+ @data = value
end
def _to_s()
@@ -1048,15 +1021,20 @@ class XSDLong < XSDInteger
private
- def set_str(str)
+ def screen_data_str(str)
begin
- @data = Integer(str)
+ data = Integer(str)
rescue ArgumentError
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
- unless validate(@data)
+ unless validate(data)
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
+ data
+ end
+
+ def _set(value)
+ @data = value
end
MaxInclusive = +9223372036854775807
@@ -1077,15 +1055,20 @@ class XSDInt < XSDLong
private
- def set_str(str)
+ def screen_data_str(str)
begin
- @data = Integer(str)
+ data = Integer(str)
rescue ArgumentError
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
- unless validate(@data)
+ unless validate(data)
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
+ data
+ end
+
+ def _set(value)
+ @data = value
end
MaxInclusive = +2147483647
@@ -1106,15 +1089,20 @@ class XSDShort < XSDInt
private
- def set_str(str)
+ def screen_data_str(str)
begin
- @data = Integer(str)
+ data = Integer(str)
rescue ArgumentError
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
- unless validate(@data)
+ unless validate(data)
raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
end
+ data
+ end
+
+ def _set(value)
+ @data = value
end
MaxInclusive = +32767
diff --git a/lib/xsd/qname.rb b/lib/xsd/qname.rb
index 9dce1340f8..7185fedf2d 100644
--- a/lib/xsd/qname.rb
+++ b/lib/xsd/qname.rb
@@ -1,5 +1,5 @@
# XSD4R - XML QName definition.
-# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
+# Copyright (C) 2002, 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# 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;
@@ -19,7 +19,7 @@ class QName
end
def dup_name(name)
- self.class.new(@namespace, name)
+ ::XSD::QName.new(@namespace, name)
end
def match(rhs)
@@ -55,6 +55,11 @@ class QName
"{#{ namespace }}#{ name }"
end
+ def inspect
+ sprintf("#<%s:0x%x %s>", self.class.name, __id__,
+ "{#{ namespace }}#{ name }")
+ end
+
NormalizedNameRegexp = /^\{([^}]*)\}(.*)$/
def parse(str)
NormalizedNameRegexp =~ str
diff --git a/sample/soap/authheader/authmgr.rb b/sample/soap/authheader/authmgr.rb
new file mode 100644
index 0000000000..a4d3b66c0d
--- /dev/null
+++ b/sample/soap/authheader/authmgr.rb
@@ -0,0 +1,41 @@
+class Authmgr
+ def initialize
+ @users = {
+ 'NaHi' => 'passwd',
+ 'HiNa' => 'wspass'
+ }
+ @sessions = {}
+ end
+
+ def login(userid, passwd)
+ userid and passwd and @users[userid] == passwd
+ end
+
+ # returns userid
+ def auth(sessionid)
+ @sessions[sessionid]
+ end
+
+ def create_session(userid)
+ while true
+ key = create_sessionkey
+ break unless @sessions[key]
+ end
+ @sessions[key] = userid
+ key
+ end
+
+ def get_session(userid)
+ @sessions.index(userid)
+ end
+
+ def destroy_session(sessionkey)
+ @sessions.delete(sessionkey)
+ end
+
+private
+
+ def create_sessionkey
+ Time.now.usec.to_s
+ end
+end
diff --git a/sample/soap/authheader/client.rb b/sample/soap/authheader/client.rb
new file mode 100644
index 0000000000..4055fe63fe
--- /dev/null
+++ b/sample/soap/authheader/client.rb
@@ -0,0 +1,40 @@
+require 'soap/rpc/driver'
+require 'soap/header/simplehandler'
+
+server = ARGV.shift || 'http://localhost:7000/'
+
+class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
+ MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
+
+ def initialize(userid, passwd)
+ super(MyHeaderName)
+ @sessionid = nil
+ @userid = userid
+ @passwd = passwd
+ @mustunderstand = true
+ end
+
+ def on_simple_outbound
+ if @sessionid
+ { "sessionid" => @sessionid }
+ else
+ { "userid" => @userid, "passwd" => @passwd }
+ end
+ end
+
+ def on_simple_inbound(my_header, mustunderstand)
+ @sessionid = my_header["sessionid"]
+ end
+end
+
+ns = 'http://tempuri.org/authHeaderPort'
+serv = SOAP::RPC::Driver.new(server, ns)
+serv.add_method('deposit', 'amt')
+serv.add_method('withdrawal', 'amt')
+
+serv.headerhandler << ClientAuthHeaderHandler.new('NaHi', 'passwd')
+
+serv.wiredump_dev = STDOUT
+
+p serv.deposit(150)
+p serv.withdrawal(120)
diff --git a/sample/soap/authheader/client2.rb b/sample/soap/authheader/client2.rb
new file mode 100644
index 0000000000..58a7da45ae
--- /dev/null
+++ b/sample/soap/authheader/client2.rb
@@ -0,0 +1,39 @@
+require 'soap/rpc/driver'
+require 'soap/header/simplehandler'
+
+server = ARGV.shift || 'http://localhost:7000/'
+
+class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
+ MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
+
+ def initialize(userid, passwd)
+ super(MyHeaderName)
+ @sessionid = nil
+ @userid = userid
+ @passwd = passwd
+ end
+
+ def on_simple_outbound
+ if @sessionid
+ { "sessionid" => @sessionid }
+ else
+ { "userid" => @userid, "passwd" => @passwd }
+ end
+ end
+
+ def on_simple_inbound(my_header, mustunderstand)
+ @sessionid = my_header["sessionid"]
+ end
+end
+
+ns = 'http://tempuri.org/authHeaderPort'
+serv = SOAP::RPC::Driver.new(server, ns)
+serv.add_method('deposit', 'amt')
+serv.add_method('withdrawal', 'amt')
+
+serv.headerhandler << ClientAuthHeaderHandler.new('NaHi', 'passwd')
+
+serv.wiredump_dev = STDOUT
+
+p serv.deposit(150)
+p serv.withdrawal(120)
diff --git a/sample/soap/authheader/server.rb b/sample/soap/authheader/server.rb
new file mode 100644
index 0000000000..6b562d02f3
--- /dev/null
+++ b/sample/soap/authheader/server.rb
@@ -0,0 +1,72 @@
+#!/usr/bin/env ruby
+
+require 'soap/rpc/standaloneServer'
+require 'soap/header/simplehandler'
+require 'authmgr'
+
+class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
+ class AuthHeaderService
+ def self.create
+ new
+ end
+
+ def deposit(amt)
+ "deposit #{amt} OK"
+ end
+
+ def withdrawal(amt)
+ "withdrawal #{amt} OK"
+ end
+ end
+
+ Name = 'http://tempuri.org/authHeaderPort'
+ def initialize(*arg)
+ super
+ add_rpc_servant(AuthHeaderService.new, Name)
+ add_rpc_request_headerhandler(ServerAuthHeaderHandler)
+ end
+
+ class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
+ MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
+
+ @authmgr = Authmgr.new
+ def self.create
+ new(@authmgr)
+ end
+
+ def initialize(authmgr)
+ super(MyHeaderName)
+ @authmgr = authmgr
+ @userid = @sessionid = nil
+ end
+
+ def on_simple_outbound
+ { "sessionid" => @sessionid }
+ end
+
+ def on_simple_inbound(my_header, mu)
+ auth = false
+ userid = my_header["userid"]
+ passwd = my_header["passwd"]
+ if @authmgr.login(userid, passwd)
+ auth = true
+ elsif sessionid = my_header["sessionid"]
+ if userid = @authmgr.auth(sessionid)
+ @authmgr.destroy_session(sessionid)
+ auth = true
+ end
+ end
+ raise RuntimeError.new("authentication failed") unless auth
+ @userid = userid
+ @sessionid = @authmgr.create_session(userid)
+ end
+ end
+end
+
+if $0 == __FILE__
+ svr = AuthHeaderPortServer.new('AuthHeaderPortServer', nil, '0.0.0.0', 7000)
+ trap(:INT) do
+ svr.shutdown
+ end
+ status = svr.start
+end
diff --git a/sample/soap/authheader/server2.rb b/sample/soap/authheader/server2.rb
new file mode 100644
index 0000000000..b0065e3140
--- /dev/null
+++ b/sample/soap/authheader/server2.rb
@@ -0,0 +1,77 @@
+#!/usr/bin/env ruby
+
+require 'soap/rpc/standaloneServer'
+require 'soap/header/simplehandler'
+require 'authmgr'
+
+class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
+ class AuthHeaderService
+ def self.create
+ new
+ end
+
+ def initialize(authmgr)
+ @authmgr = authmgr
+ end
+
+ def login(userid, passwd)
+ if @authmgr.login(userid, passwd)
+ @authmgr.create_session(userid)
+ else
+ raise RuntimeError.new("authentication failed")
+ end
+ end
+
+ def deposit(amt)
+ "deposit #{amt} OK"
+ end
+
+ def withdrawal(amt)
+ "withdrawal #{amt} OK"
+ end
+ end
+
+ Name = 'http://tempuri.org/authHeaderPort'
+ def initialize(*arg)
+ super
+ add_rpc_servant(AuthHeaderService.new, Name)
+ ServerAuthHeaderHandler.init
+ add_rpc_request_headerhandler(ServerAuthHeaderHandler)
+ end
+
+ class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
+ MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
+
+ def self.create
+ new(@authmgr)
+ end
+
+ def initialize(authmgr)
+ super(MyHeaderName)
+ @authmgr = authmgr
+ @sessionid = nil
+ end
+
+ def on_simple_outbound
+ if @sessionid
+ { "sessionid" => @sessionid }
+ end
+ end
+
+ def on_simple_inbound(my_header, mu)
+ auth = false
+ if sessionid = my_header["sessionid"]
+ if userid = @authmgr.auth(sessionid)
+ @authmgr.destroy_session(sessionid)
+ @session_id = @authmgr.create_session(userid)
+ auth = true
+ end
+ end
+ raise RuntimeError.new("authentication failed") unless auth
+ end
+ end
+end
+
+if $0 == __FILE__
+ status = AuthHeaderPortServer.new('AuthHeaderPortServer', nil, '0.0.0.0', 7000).start
+end
diff --git a/sample/soap/raa2.4/raa.rb b/sample/soap/raa2.4/raa.rb
new file mode 100644
index 0000000000..9b4c4e41aa
--- /dev/null
+++ b/sample/soap/raa2.4/raa.rb
@@ -0,0 +1,332 @@
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class Gem
+ @@schema_type = "Gem"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def id
+ @id
+ end
+
+ def id=(value)
+ @id = value
+ end
+
+ def category
+ @category
+ end
+
+ def category=(value)
+ @category = value
+ end
+
+ def owner
+ @owner
+ end
+
+ def owner=(value)
+ @owner = value
+ end
+
+ def project
+ @project
+ end
+
+ def project=(value)
+ @project = value
+ end
+
+ def updated
+ @updated
+ end
+
+ def updated=(value)
+ @updated = value
+ end
+
+ def created
+ @created
+ end
+
+ def created=(value)
+ @created = value
+ end
+
+ def initialize(id = nil,
+ category = nil,
+ owner = nil,
+ project = nil,
+ updated = nil,
+ created = nil)
+ @id = id
+ @category = category
+ @owner = owner
+ @project = project
+ @updated = updated
+ @created = created
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class Category
+ @@schema_type = "Category"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def major
+ @major
+ end
+
+ def major=(value)
+ @major = value
+ end
+
+ def minor
+ @minor
+ end
+
+ def minor=(value)
+ @minor = value
+ end
+
+ def initialize(major = nil,
+ minor = nil)
+ @major = major
+ @minor = minor
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class Owner
+ @@schema_type = "Owner"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def id
+ @id
+ end
+
+ def id=(value)
+ @id = value
+ end
+
+ def email
+ @email
+ end
+
+ def email=(value)
+ @email = value
+ end
+
+ def name
+ @name
+ end
+
+ def name=(value)
+ @name = value
+ end
+
+ def initialize(id = nil,
+ email = nil,
+ name = nil)
+ @id = id
+ @email = email
+ @name = name
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class Project
+ @@schema_type = "Project"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def name
+ @name
+ end
+
+ def name=(value)
+ @name = value
+ end
+
+ def short_description
+ @short_description
+ end
+
+ def short_description=(value)
+ @short_description = value
+ end
+
+ def version
+ @version
+ end
+
+ def version=(value)
+ @version = value
+ end
+
+ def status
+ @status
+ end
+
+ def status=(value)
+ @status = value
+ end
+
+ def url
+ @url
+ end
+
+ def url=(value)
+ @url = value
+ end
+
+ def download
+ @download
+ end
+
+ def download=(value)
+ @download = value
+ end
+
+ def license
+ @license
+ end
+
+ def license=(value)
+ @license = value
+ end
+
+ def description
+ @description
+ end
+
+ def description=(value)
+ @description = value
+ end
+
+ def updated
+ @updated
+ end
+
+ def updated=(value)
+ @updated = value
+ end
+
+ def history
+ @history
+ end
+
+ def history=(value)
+ @history = value
+ end
+
+ def dependency
+ @dependency
+ end
+
+ def dependency=(value)
+ @dependency = value
+ end
+
+ def initialize(name = nil,
+ short_description = nil,
+ version = nil,
+ status = nil,
+ url = nil,
+ download = nil,
+ license = nil,
+ description = nil,
+ updated = nil,
+ history = nil,
+ dependency = nil)
+ @name = name
+ @short_description = short_description
+ @version = version
+ @status = status
+ @url = url
+ @download = download
+ @license = license
+ @description = description
+ @updated = updated
+ @history = history
+ @dependency = dependency
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class ProjectDependency
+ @@schema_type = "ProjectDependency"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def project
+ @project
+ end
+
+ def project=(value)
+ @project = value
+ end
+
+ def version
+ @version
+ end
+
+ def version=(value)
+ @version = value
+ end
+
+ def description
+ @description
+ end
+
+ def description=(value)
+ @description = value
+ end
+
+ def initialize(project = nil,
+ version = nil,
+ description = nil)
+ @project = project
+ @version = version
+ @description = description
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class GemArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "GemArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class OwnerArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "OwnerArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class ProjectArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "ProjectArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class ProjectDependencyArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "ProjectDependencyArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class StringArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "StringArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://xml.apache.org/xml-soap
+class Map < Array
+ # Contents type should be dumped here...
+ @@schema_type = "Map"
+ @@schema_ns = "http://xml.apache.org/xml-soap"
+end
+
diff --git a/sample/soap/raa2.4/raaDriver.rb b/sample/soap/raa2.4/raaDriver.rb
new file mode 100644
index 0000000000..10d0ba257e
--- /dev/null
+++ b/sample/soap/raa2.4/raaDriver.rb
@@ -0,0 +1,255 @@
+require 'raa.rb'
+
+require 'soap/rpc/driver'
+
+class RaaServicePortType < SOAP::RPC::Driver
+ TargetNamespace = "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ MappingRegistry = ::SOAP::Mapping::Registry.new
+
+ MappingRegistry.set(
+ Gem,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Gem") }
+ )
+ MappingRegistry.set(
+ Category,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Category") }
+ )
+ MappingRegistry.set(
+ Owner,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Owner") }
+ )
+ MappingRegistry.set(
+ Project,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Project") }
+ )
+ MappingRegistry.set(
+ ProjectArray,
+ ::SOAP::SOAPArray,
+ ::SOAP::Mapping::Registry::TypedArrayFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Project") }
+ )
+ MappingRegistry.set(
+ ProjectDependencyArray,
+ ::SOAP::SOAPArray,
+ ::SOAP::Mapping::Registry::TypedArrayFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "ProjectDependency") }
+ )
+ MappingRegistry.set(
+ StringArray,
+ ::SOAP::SOAPArray,
+ ::SOAP::Mapping::Registry::TypedArrayFactory,
+ { :type => XSD::QName.new("http://www.w3.org/2001/XMLSchema", "string") }
+ )
+ MappingRegistry.set(
+ Map,
+ ::SOAP::SOAPArray,
+ ::SOAP::Mapping::Registry::TypedArrayFactory,
+ { :type => XSD::QName.new("http://www.w3.org/2001/XMLSchema", "anyType") }
+ )
+ MappingRegistry.set(
+ OwnerArray,
+ ::SOAP::SOAPArray,
+ ::SOAP::Mapping::Registry::TypedArrayFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Owner") }
+ )
+ MappingRegistry.set(
+ ProjectDependency,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "ProjectDependency") }
+ )
+ Methods = [
+ ["gem", "gem",
+ [
+ ["in", "name", [SOAP::SOAPString]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Gem"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["dependents", "dependents",
+ [
+ ["in", "name", [SOAP::SOAPString]],
+ ["in", "version", [SOAP::SOAPString]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "ProjectDependency"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["names", "names",
+ [
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["size", "size",
+ [
+ ["retval", "return", [SOAP::SOAPInt]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["list_by_category", "list_by_category",
+ [
+ ["in", "major", [SOAP::SOAPString]],
+ ["in", "minor", [SOAP::SOAPString]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["tree_by_category", "tree_by_category",
+ [
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "anyType"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["list_recent_updated", "list_recent_updated",
+ [
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["list_recent_created", "list_recent_created",
+ [
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["list_updated_since", "list_updated_since",
+ [
+ ["in", "date", [SOAP::SOAPDateTime]],
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["list_created_since", "list_created_since",
+ [
+ ["in", "date", [SOAP::SOAPDateTime]],
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["list_by_owner", "list_by_owner",
+ [
+ ["in", "owner_id", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["search_name", "search_name",
+ [
+ ["in", "substring", [SOAP::SOAPString]],
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["search_short_description", "search_short_description",
+ [
+ ["in", "substring", [SOAP::SOAPString]],
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["search_owner", "search_owner",
+ [
+ ["in", "substring", [SOAP::SOAPString]],
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["search_version", "search_version",
+ [
+ ["in", "substring", [SOAP::SOAPString]],
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["search_status", "search_status",
+ [
+ ["in", "substring", [SOAP::SOAPString]],
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["search_description", "search_description",
+ [
+ ["in", "substring", [SOAP::SOAPString]],
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["search", "search",
+ [
+ ["in", "substring", [SOAP::SOAPString]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "anyType"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["owner", "owner",
+ [
+ ["in", "owner_id", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Owner"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["list_owner", "list_owner",
+ [
+ ["in", "idx", [SOAP::SOAPInt]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Owner"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["update", "update",
+ [
+ ["in", "name", [SOAP::SOAPString]],
+ ["in", "pass", [SOAP::SOAPString]],
+ ["in", "gem", [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Gem"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Gem"]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ],
+ ["update_pass", "update_pass",
+ [
+ ["in", "name", [SOAP::SOAPString]],
+ ["in", "oldpass", [SOAP::SOAPString]],
+ ["in", "newpass", [SOAP::SOAPString]]
+ ],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
+ ]
+ ]
+
+ DefaultEndpointUrl = "http://raa.ruby-lang.org/soapsrv"
+
+ def initialize(endpoint_url = nil)
+ endpoint_url ||= DefaultEndpointUrl
+ super(endpoint_url, nil)
+ self.mapping_registry = MappingRegistry
+ init_methods
+ end
+
+private
+
+ def init_methods
+ Methods.each do |name_as, name, params, soapaction, namespace|
+ qname = XSD::QName.new(namespace, name_as)
+ @proxy.add_method(qname, soapaction, name, params)
+ add_rpc_method_interface(name, params)
+ end
+ end
+end
+
diff --git a/sample/soap/raa2.4/raaServiceClient.rb b/sample/soap/raa2.4/raaServiceClient.rb
new file mode 100644
index 0000000000..a59815ba72
--- /dev/null
+++ b/sample/soap/raa2.4/raaServiceClient.rb
@@ -0,0 +1,354 @@
+#!/usr/bin/env ruby
+require 'raaDriver.rb'
+
+endpoint_url = ARGV.shift
+obj = RaaServicePortType.new(endpoint_url)
+
+# Uncomment the below line to see SOAP wiredumps.
+# obj.wiredump_dev = STDERR
+
+# SYNOPSIS
+# gem(name)
+#
+# ARGS
+# name - {http://www.w3.org/2001/XMLSchema}string
+#
+# RETURNS
+# return Gem - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}Gem
+#
+# RAISES
+# (undefined)
+#
+name = nil
+puts obj.gem(name)
+
+# SYNOPSIS
+# dependents(name, version)
+#
+# ARGS
+# name - {http://www.w3.org/2001/XMLSchema}string
+# version - {http://www.w3.org/2001/XMLSchema}string
+#
+# RETURNS
+# return ProjectDependencyArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}ProjectDependencyArray
+#
+# RAISES
+# (undefined)
+#
+name = version = nil
+puts obj.dependents(name, version)
+
+# SYNOPSIS
+# names
+#
+# ARGS
+# N/A
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+
+puts obj.names
+
+# SYNOPSIS
+# size
+#
+# ARGS
+# N/A
+#
+# RETURNS
+# return - {http://www.w3.org/2001/XMLSchema}int
+#
+# RAISES
+# (undefined)
+#
+
+puts obj.size
+
+# SYNOPSIS
+# list_by_category(major, minor)
+#
+# ARGS
+# major - {http://www.w3.org/2001/XMLSchema}string
+# minor - {http://www.w3.org/2001/XMLSchema}string
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+major = minor = nil
+puts obj.list_by_category(major, minor)
+
+# SYNOPSIS
+# tree_by_category
+#
+# ARGS
+# N/A
+#
+# RETURNS
+# return Map - {http://xml.apache.org/xml-soap}Map
+#
+# RAISES
+# (undefined)
+#
+
+puts obj.tree_by_category
+
+# SYNOPSIS
+# list_recent_updated(idx)
+#
+# ARGS
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+idx = nil
+puts obj.list_recent_updated(idx)
+
+# SYNOPSIS
+# list_recent_created(idx)
+#
+# ARGS
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+idx = nil
+puts obj.list_recent_created(idx)
+
+# SYNOPSIS
+# list_updated_since(date, idx)
+#
+# ARGS
+# date - {http://www.w3.org/2001/XMLSchema}dateTime
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+date = idx = nil
+puts obj.list_updated_since(date, idx)
+
+# SYNOPSIS
+# list_created_since(date, idx)
+#
+# ARGS
+# date - {http://www.w3.org/2001/XMLSchema}dateTime
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+date = idx = nil
+puts obj.list_created_since(date, idx)
+
+# SYNOPSIS
+# list_by_owner(owner_id)
+#
+# ARGS
+# owner_id - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+owner_id = nil
+puts obj.list_by_owner(owner_id)
+
+# SYNOPSIS
+# search_name(substring, idx)
+#
+# ARGS
+# substring - {http://www.w3.org/2001/XMLSchema}string
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+substring = idx = nil
+puts obj.search_name(substring, idx)
+
+# SYNOPSIS
+# search_short_description(substring, idx)
+#
+# ARGS
+# substring - {http://www.w3.org/2001/XMLSchema}string
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+substring = idx = nil
+puts obj.search_short_description(substring, idx)
+
+# SYNOPSIS
+# search_owner(substring, idx)
+#
+# ARGS
+# substring - {http://www.w3.org/2001/XMLSchema}string
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+substring = idx = nil
+puts obj.search_owner(substring, idx)
+
+# SYNOPSIS
+# search_version(substring, idx)
+#
+# ARGS
+# substring - {http://www.w3.org/2001/XMLSchema}string
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+substring = idx = nil
+puts obj.search_version(substring, idx)
+
+# SYNOPSIS
+# search_status(substring, idx)
+#
+# ARGS
+# substring - {http://www.w3.org/2001/XMLSchema}string
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+substring = idx = nil
+puts obj.search_status(substring, idx)
+
+# SYNOPSIS
+# search_description(substring, idx)
+#
+# ARGS
+# substring - {http://www.w3.org/2001/XMLSchema}string
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
+#
+# RAISES
+# (undefined)
+#
+substring = idx = nil
+puts obj.search_description(substring, idx)
+
+# SYNOPSIS
+# search(substring)
+#
+# ARGS
+# substring - {http://www.w3.org/2001/XMLSchema}string
+#
+# RETURNS
+# return Map - {http://xml.apache.org/xml-soap}Map
+#
+# RAISES
+# (undefined)
+#
+substring = nil
+puts obj.search(substring)
+
+# SYNOPSIS
+# owner(owner_id)
+#
+# ARGS
+# owner_id - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return Owner - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}Owner
+#
+# RAISES
+# (undefined)
+#
+owner_id = nil
+puts obj.owner(owner_id)
+
+# SYNOPSIS
+# list_owner(idx)
+#
+# ARGS
+# idx - {http://www.w3.org/2001/XMLSchema}int
+#
+# RETURNS
+# return OwnerArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}OwnerArray
+#
+# RAISES
+# (undefined)
+#
+idx = nil
+puts obj.list_owner(idx)
+
+# SYNOPSIS
+# update(name, pass, gem)
+#
+# ARGS
+# name - {http://www.w3.org/2001/XMLSchema}string
+# pass - {http://www.w3.org/2001/XMLSchema}string
+# gem Gem - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}Gem
+#
+# RETURNS
+# return Gem - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}Gem
+#
+# RAISES
+# (undefined)
+#
+name = pass = gem = nil
+puts obj.update(name, pass, gem)
+
+# SYNOPSIS
+# update_pass(name, oldpass, newpass)
+#
+# ARGS
+# name - {http://www.w3.org/2001/XMLSchema}string
+# oldpass - {http://www.w3.org/2001/XMLSchema}string
+# newpass - {http://www.w3.org/2001/XMLSchema}string
+#
+# RETURNS
+# N/A
+#
+# RAISES
+# (undefined)
+#
+name = oldpass = newpass = nil
+puts obj.update_pass(name, oldpass, newpass)
+
+
diff --git a/sample/soap/raa2.4/sample.rb b/sample/soap/raa2.4/sample.rb
new file mode 100644
index 0000000000..e157f8361f
--- /dev/null
+++ b/sample/soap/raa2.4/sample.rb
@@ -0,0 +1,115 @@
+#!/usr/bin/env ruby
+
+# This is a sample client based on raaServiceClient.rb.
+# You can generate raaServiceClient.rb and related files with
+# wsdl2ruby.rb --wsdl http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/ --type client
+
+require 'pp'
+require 'raaDriver.rb'
+
+raa = RaaServicePortType.new
+# raa.wiredump_dev = STDERR
+
+def sec(msg)
+ puts
+ puts "--------"
+ puts "-- " + msg
+ puts
+end
+
+def subsec(msg)
+ puts "-- " + msg
+end
+
+sec("retrieve a gem (RAA Information) which has specified name")
+name = 'soap4r'
+pp raa.gem(name)
+
+sec("retrieve dependents of the project")
+name = 'http-access2'; version = nil
+pp raa.dependents(name, version)
+
+sec("number of registered gems")
+puts raa.size
+
+sec("retrieve all registered gem names")
+p raa.names
+
+sec("retrieve gems of specified category")
+major = 'Library'; minor = 'XML'
+p raa.list_by_category(major, minor)
+
+sec("retrieve category tree")
+pp raa.tree_by_category
+
+sec("retrieve gems which is updated recently")
+idx = 0
+p raa.list_recent_updated(idx)
+subsec("next 10 gems")
+idx += 1
+p raa.list_recent_updated(idx)
+subsec("next 10 gems")
+idx += 1
+p raa.list_recent_updated(idx)
+
+sec("retrieve gems which is created recently")
+p raa.list_recent_created(idx)
+
+sec("retrieve gems which is updated in 7 days")
+date = Time.now - 7 * 24 * 60 * 60; idx = 0
+p raa.list_updated_since(date, idx)
+
+sec("retrieve gems which is created in 7 days")
+p raa.list_created_since(date, idx)
+
+sec("retrieve gems of specified owner")
+owner_id = 8 # NaHi
+p raa.list_by_owner(owner_id)
+
+sec("search gems with keyword")
+substring = 'soap'
+pp raa.search(substring)
+
+# There are several search interface to search a field explicitly.
+# puts raa.search_name(substring, idx)
+# puts raa.search_short_description(substring, idx)
+# puts raa.search_owner(substring, idx)
+# puts raa.search_version(substring, idx)
+# puts raa.search_status(substring, idx)
+# puts raa.search_description(substring, idx)
+
+sec("retrieve owner info")
+owner_id = 8
+pp raa.owner(owner_id)
+
+sec("retrieve owners")
+idx = 0
+p raa.list_owner(idx)
+
+sec("update 'sampleproject'")
+name = 'sampleproject'
+pass = 'sampleproject'
+gem = raa.gem(name)
+p gem.project.version
+gem.project.version.succ!
+gem.updated = Time.now
+raa.update(name, pass, gem)
+p raa.gem(name).project.version
+
+sec("update pass phrase")
+raa.update_pass(name, 'sampleproject', 'foo')
+subsec("update check")
+gem = raa.gem(name)
+gem.project.description = 'Current pass phrase is "foo"'
+gem.updated = Time.now
+raa.update(name, 'foo', gem)
+#
+subsec("recover pass phrase")
+raa.update_pass(name, 'foo', 'sampleproject')
+subsec("update check")
+gem = raa.gem(name)
+gem.project.description = 'Current pass phrase is "sampleproject"'
+gem.updated = Time.now
+raa.update(name, 'sampleproject', gem)
+
+sec("done")
diff --git a/sample/soap/sampleStruct/server.rb b/sample/soap/sampleStruct/server.rb
index 3caa31a052..ea1a2ef1d4 100644
--- a/sample/soap/sampleStruct/server.rb
+++ b/sample/soap/sampleStruct/server.rb
@@ -12,5 +12,9 @@ class SampleStructServer < SOAP::RPC::StandaloneServer
end
if $0 == __FILE__
- status = SampleStructServer.new('SampleStructServer', SampleStructServiceNamespace, '0.0.0.0', 7000).start
+ server = SampleStructServer.new('SampleStructServer', SampleStructServiceNamespace, '0.0.0.0', 7000)
+ trap(:INT) do
+ server.shutdown
+ end
+ server.start
end
diff --git a/sample/soap/ssl/files/README b/sample/soap/ssl/files/README
new file mode 100644
index 0000000000..98ebcf7c23
--- /dev/null
+++ b/sample/soap/ssl/files/README
@@ -0,0 +1 @@
+* certificates and keys in this directory is copied from http-access2 test.
diff --git a/sample/soap/ssl/files/ca.cert b/sample/soap/ssl/files/ca.cert
new file mode 100644
index 0000000000..bcabbee4ad
--- /dev/null
+++ b/sample/soap/ssl/files/ca.cert
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID0DCCArigAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
+MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
+DTA0MDEzMDAwNDIzMloXDTM2MDEyMjAwNDIzMlowPDELMAkGA1UEBgwCSlAxEjAQ
+BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQswCQYDVQQDDAJDQTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANbv0x42BTKFEQOE+KJ2XmiSdZpR
+wjzQLAkPLRnLB98tlzs4xo+y4RyY/rd5TT9UzBJTIhP8CJi5GbS1oXEerQXB3P0d
+L5oSSMwGGyuIzgZe5+vZ1kgzQxMEKMMKlzA73rbMd4Jx3u5+jdbP0EDrPYfXSvLY
+bS04n2aX7zrN3x5KdDrNBfwBio2/qeaaj4+9OxnwRvYP3WOvqdW0h329eMfHw0pi
+JI0drIVdsEqClUV4pebT/F+CPUPkEh/weySgo9wANockkYu5ujw2GbLFcO5LXxxm
+dEfcVr3r6t6zOA4bJwL0W/e6LBcrwiG/qPDFErhwtgTLYf6Er67SzLyA66UCAwEA
+AaOB3DCB2TAPBgNVHRMBAf8EBTADAQH/MDEGCWCGSAGG+EIBDQQkFiJSdWJ5L09w
+ZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRJ7Xd380KzBV7f
+USKIQ+O/vKbhDzAOBgNVHQ8BAf8EBAMCAQYwZAYDVR0jBF0wW4AUSe13d/NCswVe
+31EiiEPjv7ym4Q+hQKQ+MDwxCzAJBgNVBAYMAkpQMRIwEAYDVQQKDAlKSU4uR1Iu
+SlAxDDAKBgNVBAsMA1JSUjELMAkGA1UEAwwCQ0GCAQAwDQYJKoZIhvcNAQEFBQAD
+ggEBAIu/mfiez5XN5tn2jScgShPgHEFJBR0BTJBZF6xCk0jyqNx/g9HMj2ELCuK+
+r/Y7KFW5c5M3AQ+xWW0ZSc4kvzyTcV7yTVIwj2jZ9ddYMN3nupZFgBK1GB4Y05GY
+MJJFRkSu6d/Ph5ypzBVw2YMT/nsOo5VwMUGLgS7YVjU+u/HNWz80J3oO17mNZllj
+PvORJcnjwlroDnS58KoJ7GDgejv3ESWADvX1OHLE4cRkiQGeLoEU4pxdCxXRqX0U
+PbwIkZN9mXVcrmPHq8MWi4eC/V7hnbZETMHuWhUoiNdOEfsAXr3iP4KjyyRdwc7a
+d/xgcK06UVQRL/HbEYGiQL056mc=
+-----END CERTIFICATE-----
diff --git a/sample/soap/ssl/files/client.cert b/sample/soap/ssl/files/client.cert
new file mode 100644
index 0000000000..ad13c4b735
--- /dev/null
+++ b/sample/soap/ssl/files/client.cert
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDKDCCAhCgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
+MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
+DTA0MDEzMTAzMTQ1OFoXDTM1MDEyMzAzMTQ1OFowZTELMAkGA1UEBgwCSlAxEjAQ
+BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRAwDgYDVQQDDAdleGFtcGxl
+MSIwIAYJKoZIhvcNAQkBDBNleGFtcGxlQGV4YW1wbGUub3JnMIGfMA0GCSqGSIb3
+DQEBAQUAA4GNADCBiQKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLW
+jTkvsgOwbYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQ
+gNS6ew7/Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2Xf
+ewIDAQABo4GPMIGMMAwGA1UdEwEB/wQCMAAwMQYJYIZIAYb4QgENBCQWIlJ1Ynkv
+T3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFOFvay0H7lr2
+xUx6waYEV2bVDYQhMAsGA1UdDwQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYI
+KwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBABd2dYWqbDIWf5sWFvslezxJv8gI
+w64KCJBuyJAiDuf+oazr3016kMzAlt97KecLZDusGNagPrq02UX7YMoQFsWJBans
+cDtHrkM0al5r6/WGexNMgtYbNTYzt/IwodISGBgZ6dsOuhznwms+IBsTNDAvWeLP
+lt2tOqD8kEmjwMgn0GDRuKjs4EoboA3kMULb1p9akDV9ZESU3eOtpS5/G5J5msLI
+9WXbYBjcjvkLuJH9VsJhb+R58Vl0ViemvAHhPilSl1SPWVunGhv6FcIkdBEi1k9F
+e8BNMmsEjFiANiIRvpdLRbiGBt0KrKTndVfsmoKCvY48oCOvnzxtahFxfs8=
+-----END CERTIFICATE-----
diff --git a/sample/soap/ssl/files/client.key b/sample/soap/ssl/files/client.key
new file mode 100644
index 0000000000..37bc62f259
--- /dev/null
+++ b/sample/soap/ssl/files/client.key
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICWwIBAAKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLWjTkvsgOw
+bYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQgNS6ew7/
+Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2XfewIDAQAB
+AoGAZcz8llWErtsV3QB9gNb3S/PNADGjqBFjReva8n3jG2k4sZSibpwWTwUaTNtT
+ZQgjSRKRvH1hk9XwffNAvXAQZNNkuj/16gO2oO45nyLj4dO365ujLptWnVIWDHOE
+uN0GeiZO+VzcCisT0WCq4tvtLeH8svrxzA8cbXIEyOK7NiECQQDwo2zPFyKAZ/Cu
+lDJ6zKT+RjfWwW7DgWzirAlTrt4ViMaW+IaDH29TmQpb4V4NuR3Xi+2Xl4oicu6S
+36TW9+/FAkEA3rgfOQJuLlWSnw1RTGwvnC816a/W7iYYY7B+0U4cDbfWl7IoXT4y
+M8nV/HESooviZLqBwzAYSoj3fFKYBKpGPwJAUO8GN5iWWA2dW3ooiDiv/X1sZmRk
+dojfMFWgRW747tEzya8Ivq0h6kH8w+5GjeMG8Gn1nRiwsulo6Ckj7dEx6QJACyui
+7UIQ8qP6GZ4aYMHgVW4Mvy7Bkeo5OO7GPYs0Xv/EdJFL8vlGnVBXOjUVoS9w6Gpu
+TbLg1QQvnX2rADjmEwJANxZO2GUkaWGsEif8aGW0x5g/IdaMGG27pTWk5zqix7P3
+1UDrdo/JOXhptovhRi06EppIxAxYmbh9vd9VN8Itlw==
+-----END RSA PRIVATE KEY-----
diff --git a/sample/soap/ssl/files/server.cert b/sample/soap/ssl/files/server.cert
new file mode 100644
index 0000000000..998ccc5892
--- /dev/null
+++ b/sample/soap/ssl/files/server.cert
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIC/zCCAeegAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQGDAJKUDES
+MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxDjAMBgNVBAMMBVN1YkNB
+MB4XDTA0MDEzMTAzMTMxNloXDTMzMDEyMzAzMTMxNlowQzELMAkGA1UEBgwCSlAx
+EjAQBgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRIwEAYDVQQDDAlsb2Nh
+bGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANFJTxWqup3nV9dsJAku
+p+WaXnPNIzcpAA3qMGZDJTJsfa8Du7ZxTP0XJK5mETttBrn711cJxAuP3KjqnW9S
+vtZ9lY2sXJ6Zj62sN5LwG3VVe25dI28yR1EsbHjJ5Zjf9tmggMC6am52dxuHbt5/
+vHo4ngJuKE/U+eeGRivMn6gFAgMBAAGjgYUwgYIwDAYDVR0TAQH/BAIwADAxBglg
+hkgBhvhCAQ0EJBYiUnVieS9PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd
+BgNVHQ4EFgQUpZIyygD9JxFYHHOTEuWOLbCKfckwCwYDVR0PBAQDAgWgMBMGA1Ud
+JQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBBQUAA4IBAQBwAIj5SaBHaA5X31IP
+CFCJiep96awfp7RANO0cuUj+ZpGoFn9d6FXY0g+Eg5wAkCNIzZU5NHN9xsdOpnUo
+zIBbyTfQEPrge1CMWMvL6uGaoEXytq84VTitF/xBTky4KtTn6+es4/e7jrrzeUXQ
+RC46gkHObmDT91RkOEGjHLyld2328jo3DIN/VTHIryDeVHDWjY5dENwpwdkhhm60
+DR9IrNBbXWEe9emtguNXeN0iu1ux0lG1Hc6pWGQxMlRKNvGh0yZB9u5EVe38tOV0
+jQaoNyL7qzcQoXD3Dmbi1p0iRmg/+HngISsz8K7k7MBNVsSclztwgCzTZOBiVtkM
+rRlQ
+-----END CERTIFICATE-----
diff --git a/sample/soap/ssl/files/server.key b/sample/soap/ssl/files/server.key
new file mode 100644
index 0000000000..9ba2218a03
--- /dev/null
+++ b/sample/soap/ssl/files/server.key
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQDRSU8Vqrqd51fXbCQJLqflml5zzSM3KQAN6jBmQyUybH2vA7u2
+cUz9FySuZhE7bQa5+9dXCcQLj9yo6p1vUr7WfZWNrFyemY+trDeS8Bt1VXtuXSNv
+MkdRLGx4yeWY3/bZoIDAumpudncbh27ef7x6OJ4CbihP1PnnhkYrzJ+oBQIDAQAB
+AoGBAIf4CstW2ltQO7+XYGoex7Hh8s9lTSW/G2vu5Hbr1LTHy3fzAvdq8MvVR12O
+rk9fa+lU9vhzPc0NMB0GIDZ9GcHuhW5hD1Wg9OSCbTOkZDoH3CAFqonjh4Qfwv5W
+IPAFn9KHukdqGXkwEMdErsUaPTy9A1V/aROVEaAY+HJgq/eZAkEA/BP1QMV04WEZ
+Oynzz7/lLizJGGxp2AOvEVtqMoycA/Qk+zdKP8ufE0wbmCE3Qd6GoynavsHb6aGK
+gQobb8zDZwJBANSK6MrXlrZTtEaeZuyOB4mAmRzGzOUVkUyULUjEx2GDT93ujAma
+qm/2d3E+wXAkNSeRpjUmlQXy/2oSqnGvYbMCQQDRM+cYyEcGPUVpWpnj0shrF/QU
+9vSot/X1G775EMTyaw6+BtbyNxVgOIu2J+rqGbn3c+b85XqTXOPL0A2RLYkFAkAm
+syhSDtE9X55aoWsCNZY/vi+i4rvaFoQ/WleogVQAeGVpdo7/DK9t9YWoFBIqth0L
+mGSYFu9ZhvZkvQNV8eYrAkBJ+rOIaLDsmbrgkeDruH+B/9yrm4McDtQ/rgnOGYnH
+LjLpLLOrgUxqpzLWe++EwSLwK2//dHO+SPsQJ4xsyQJy
+-----END RSA PRIVATE KEY-----
diff --git a/sample/soap/ssl/files/sslclient.properties b/sample/soap/ssl/files/sslclient.properties
new file mode 100644
index 0000000000..547ac7b3fb
--- /dev/null
+++ b/sample/soap/ssl/files/sslclient.properties
@@ -0,0 +1,5 @@
+# verify server's certificate
+protocol.http.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
+# certificates for verification
+protocol.http.ssl_config.ca_file = files/ca.cert
+protocol.http.ssl_config.ca_file = files/subca.cert
diff --git a/sample/soap/ssl/files/sslclient_require_noserverauth.properties b/sample/soap/ssl/files/sslclient_require_noserverauth.properties
new file mode 100644
index 0000000000..5ce5337fbf
--- /dev/null
+++ b/sample/soap/ssl/files/sslclient_require_noserverauth.properties
@@ -0,0 +1,2 @@
+# no verify server's certificate
+protocol.http.ssl_config.verify_mode =
diff --git a/sample/soap/ssl/files/sslclient_with_clientauth.properties b/sample/soap/ssl/files/sslclient_with_clientauth.properties
new file mode 100644
index 0000000000..f1c81ebf46
--- /dev/null
+++ b/sample/soap/ssl/files/sslclient_with_clientauth.properties
@@ -0,0 +1,9 @@
+# verify server's certificate
+protocol.http.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
+# certificates for verification
+protocol.http.ssl_config.ca_file = files/ca.cert
+protocol.http.ssl_config.ca_file = files/subca.cert
+
+# key and certificate for client identity
+protocol.http.ssl_config.client_cert = files/client.cert
+protocol.http.ssl_config.client_key = files/client.key
diff --git a/sample/soap/ssl/files/subca.cert b/sample/soap/ssl/files/subca.cert
new file mode 100644
index 0000000000..1e471851b8
--- /dev/null
+++ b/sample/soap/ssl/files/subca.cert
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
+MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
+DTA0MDEzMDAwNDMyN1oXDTM1MDEyMjAwNDMyN1owPzELMAkGA1UEBgwCSlAxEjAQ
+BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQ4wDAYDVQQDDAVTdWJDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0Ou7AyRcRXnB/kVHv/6kwe
+ANzgg/DyJfsAUqW90m7Lu1nqyug8gK0RBd77yU0w5HOAMHTVSdpjZK0g2sgx4Mb1
+d/213eL9TTl5MRVEChTvQr8q5DVG/8fxPPE7fMI8eOAzd98/NOAChk+80r4Sx7fC
+kGVEE1bKwY1MrUsUNjOY2d6t3M4HHV3HX1V8ShuKfsHxgCmLzdI8U+5CnQedFgkm
+3e+8tr8IX5RR1wA1Ifw9VadF7OdI/bGMzog/Q8XCLf+WPFjnK7Gcx6JFtzF6Gi4x
+4dp1Xl45JYiVvi9zQ132wu8A1pDHhiNgQviyzbP+UjcB/tsOpzBQF8abYzgEkWEC
+AwEAAaNyMHAwDwYDVR0TAQH/BAUwAwEB/zAxBglghkgBhvhCAQ0EJBYiUnVieS9P
+cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUlCjXWLsReYzH
+LzsxwVnCXmKoB/owCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCJ/OyN
+rT8Cq2Y+G2yA/L1EMRvvxwFBqxavqaqHl/6rwsIBFlB3zbqGA/0oec6MAVnYynq4
+c4AcHTjx3bQ/S4r2sNTZq0DH4SYbQzIobx/YW8PjQUJt8KQdKMcwwi7arHP7A/Ha
+LKu8eIC2nsUBnP4NhkYSGhbmpJK+PFD0FVtD0ZIRlY/wsnaZNjWWcnWF1/FNuQ4H
+ySjIblqVQkPuzebv3Ror6ZnVDukn96Mg7kP4u6zgxOeqlJGRe1M949SS9Vudjl8X
+SF4aZUUB9pQGhsqQJVqaz2OlhGOp9D0q54xko/rekjAIcuDjl1mdX4F2WRrzpUmZ
+uY/bPeOBYiVsOYVe
+-----END CERTIFICATE-----
diff --git a/sample/soap/ssl/sslclient.rb b/sample/soap/ssl/sslclient.rb
new file mode 100644
index 0000000000..a055247a4c
--- /dev/null
+++ b/sample/soap/ssl/sslclient.rb
@@ -0,0 +1,12 @@
+require 'http-access2'
+require 'soap/rpc/driver'
+
+# setup driver
+url = "https://localhost:17443/"
+client = SOAP::RPC::Driver.new(url, 'urn:sslhelloworld')
+client.add_method("hello_world", "from")
+# load SSL properties
+client.loadproperty('files/sslclient.properties')
+
+# SOAP over SSL
+p client.hello_world(__FILE__)
diff --git a/sample/soap/ssl/sslclient_require_noserverauth.rb b/sample/soap/ssl/sslclient_require_noserverauth.rb
new file mode 100644
index 0000000000..af121e9a41
--- /dev/null
+++ b/sample/soap/ssl/sslclient_require_noserverauth.rb
@@ -0,0 +1,12 @@
+require 'http-access2'
+require 'soap/rpc/driver'
+
+# setup driver
+url = "https://localhost:17443/"
+client = SOAP::RPC::Driver.new(url, 'urn:sslhelloworld')
+client.add_method("hello_world", "from")
+# load SSL properties
+client.loadproperty('files/sslclient_require_noserverauth.properties')
+
+# SOAP over SSL
+p client.hello_world(__FILE__)
diff --git a/sample/soap/ssl/sslclient_with_clientauth.rb b/sample/soap/ssl/sslclient_with_clientauth.rb
new file mode 100644
index 0000000000..7753d7b807
--- /dev/null
+++ b/sample/soap/ssl/sslclient_with_clientauth.rb
@@ -0,0 +1,12 @@
+require 'http-access2'
+require 'soap/rpc/driver'
+
+# setup driver
+url = "https://localhost:17443/"
+client = SOAP::RPC::Driver.new(url, 'urn:sslhelloworld')
+client.add_method("hello_world", "from")
+# load SSL properties
+client.loadproperty('files/sslclient_with_clientauth.properties')
+
+# SOAP over SSL
+p client.hello_world(__FILE__)
diff --git a/sample/soap/ssl/sslserver.rb b/sample/soap/ssl/sslserver.rb
new file mode 100644
index 0000000000..e65cbacc7f
--- /dev/null
+++ b/sample/soap/ssl/sslserver.rb
@@ -0,0 +1,49 @@
+require 'soap/rpc/httpserver'
+require 'webrick/https'
+require 'logger'
+
+class HelloWorldServer < SOAP::RPC::HTTPServer
+private
+
+ def on_init
+ @default_namespace = 'urn:sslhelloworld'
+ add_method(self, 'hello_world', 'from')
+ end
+
+ def hello_world(from)
+ "Hello World, from #{ from }"
+ end
+end
+
+
+if $0 == __FILE__
+ DIR = File.dirname(File.expand_path(__FILE__))
+
+ def cert(filename)
+ OpenSSL::X509::Certificate.new(File.open(File.join(DIR, filename)) { |f|
+ f.read
+ })
+ end
+
+ def key(filename)
+ OpenSSL::PKey::RSA.new(File.open(File.join(DIR, filename)) { |f|
+ f.read
+ })
+ end
+
+ $server = HelloWorldServer.new(
+ :BindAddress => "0.0.0.0",
+ :Port => 17443,
+ :AccessLog => [],
+ :SSLEnable => true,
+ :SSLCACertificateFile => File.join(DIR, 'files/ca.cert'),
+ :SSLCertificate => cert('files/server.cert'),
+ :SSLPrivateKey => key('files/server.key'),
+ :SSLVerifyClient => nil,
+ :SSLCertName => nil
+ )
+ trap(:INT) do
+ $server.shutdown
+ end
+ $server.start
+end
diff --git a/sample/soap/ssl/sslserver_noauth.rb b/sample/soap/ssl/sslserver_noauth.rb
new file mode 100644
index 0000000000..48f5a68ad0
--- /dev/null
+++ b/sample/soap/ssl/sslserver_noauth.rb
@@ -0,0 +1,45 @@
+require 'soap/rpc/httpserver'
+require 'webrick/https'
+require 'logger'
+
+class HelloWorldServer < SOAP::RPC::HTTPServer
+private
+
+ def on_init
+ @default_namespace = 'urn:sslhelloworld'
+ add_method(self, 'hello_world', 'from')
+ end
+
+ def hello_world(from)
+ "Hello World, from #{ from }"
+ end
+end
+
+
+if $0 == __FILE__
+ DIR = File.dirname(File.expand_path(__FILE__))
+
+ def cert(filename)
+ OpenSSL::X509::Certificate.new(File.open(File.join(DIR, filename)) { |f|
+ f.read
+ })
+ end
+
+ def key(filename)
+ OpenSSL::PKey::RSA.new(File.open(File.join(DIR, filename)) { |f|
+ f.read
+ })
+ end
+
+ $server = HelloWorldServer.new(
+ :BindAddress => "0.0.0.0",
+ :Port => 17443,
+ :AccessLog => [],
+ :SSLEnable => true,
+ :SSLCertName => [['OU', 'example'], ['CN', 'localhost']] # creates dummy certificate
+ )
+ trap(:INT) do
+ $server.shutdown
+ end
+ $server.start
+end
diff --git a/sample/soap/ssl/sslserver_require_clientauth.rb b/sample/soap/ssl/sslserver_require_clientauth.rb
new file mode 100644
index 0000000000..63caf69caf
--- /dev/null
+++ b/sample/soap/ssl/sslserver_require_clientauth.rb
@@ -0,0 +1,50 @@
+require 'soap/rpc/httpserver'
+require 'webrick/https'
+require 'logger'
+
+class HelloWorldServer < SOAP::RPC::HTTPServer
+private
+
+ def on_init
+ @default_namespace = 'urn:sslhelloworld'
+ add_method(self, 'hello_world', 'from')
+ end
+
+ def hello_world(from)
+ "Hello World, from #{ from }"
+ end
+end
+
+
+if $0 == __FILE__
+ DIR = File.dirname(File.expand_path(__FILE__))
+
+ def cert(filename)
+ OpenSSL::X509::Certificate.new(File.open(File.join(DIR, filename)) { |f|
+ f.read
+ })
+ end
+
+ def key(filename)
+ OpenSSL::PKey::RSA.new(File.open(File.join(DIR, filename)) { |f|
+ f.read
+ })
+ end
+
+ $server = HelloWorldServer.new(
+ :BindAddress => "0.0.0.0",
+ :Port => 17443,
+ :AccessLog => [],
+ :SSLEnable => true,
+ :SSLCACertificateFile => File.join(DIR, 'files/ca.cert'),
+ :SSLCertificate => cert('files/server.cert'),
+ :SSLPrivateKey => key('files/server.key'),
+ :SSLVerifyClient =>
+ OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT|OpenSSL::SSL::VERIFY_PEER,
+ :SSLClientCA => cert('files/ca.cert')
+ )
+ trap(:INT) do
+ $server.shutdown
+ end
+ $server.start
+end
diff --git a/sample/soap/swa/client.rb b/sample/soap/swa/client.rb
new file mode 100644
index 0000000000..01c59a3845
--- /dev/null
+++ b/sample/soap/swa/client.rb
@@ -0,0 +1,13 @@
+require 'soap/rpc/driver'
+require 'soap/attachment'
+
+server = 'http://localhost:7000/'
+driver = SOAP::RPC::Driver.new(server, 'http://www.acmetron.com/soap')
+driver.wiredump_dev = STDERR
+driver.add_method('get_file')
+driver.add_method('put_file', 'name', 'file')
+
+p driver.get_file
+file = File.open($0)
+attach = SOAP::Attachment.new(file)
+p driver.put_file($0, attach)
diff --git a/sample/soap/swa/server.rb b/sample/soap/swa/server.rb
new file mode 100644
index 0000000000..0a82fe58bf
--- /dev/null
+++ b/sample/soap/swa/server.rb
@@ -0,0 +1,23 @@
+require 'soap/rpc/standaloneServer'
+require 'soap/attachment'
+
+class SwAService
+ def get_file
+ return {
+ 'name' => $0,
+ 'file' => SOAP::Attachment.new(File.open($0))
+ }
+ end
+
+ def put_file(name, file)
+ "File '#{name}' was received ok."
+ end
+end
+
+server = SOAP::RPC::StandaloneServer.new('SwAServer',
+ 'http://www.acmetron.com/soap', '0.0.0.0', 7000)
+server.add_servant(SwAService.new)
+trap(:INT) do
+ server.shutdown
+end
+server.start
diff --git a/sample/soap/whois.rb b/sample/soap/whois.rb
new file mode 100644
index 0000000000..2737e8085e
--- /dev/null
+++ b/sample/soap/whois.rb
@@ -0,0 +1,14 @@
+#!/usr/bin/env ruby
+
+key = ARGV.shift
+
+require 'soap/rpc/driver'
+
+server = 'http://www.SoapClient.com/xml/SQLDataSoap.WSDL'
+interface = 'http://www.SoapClient.com/xml/SQLDataSoap.xsd'
+
+whois = SOAP::RPC::Driver.new(server, interface)
+whois.wiredump_dev = STDERR
+whois.add_method('ProcessSRL', 'SRLFile', 'RequestName', 'key')
+
+p whois.ProcessSRL('WHOIS.SRI', 'whois', key)
diff --git a/sample/wsdl/amazon/AmazonSearch.rb b/sample/wsdl/amazon/AmazonSearch.rb
index 1027592d85..373c7da29d 100644
--- a/sample/wsdl/amazon/AmazonSearch.rb
+++ b/sample/wsdl/amazon/AmazonSearch.rb
@@ -1,6 +1,5 @@
# http://soap.amazon.com
class ProductLineArray < Array
- # Contents type should be dumped here...
@@schema_type = "ProductLineArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -13,22 +12,30 @@ class ProductLine
def Mode
@mode
end
-
+
def Mode=(value)
@mode = value
end
+ def RelevanceRank
+ @relevanceRank
+ end
+
+ def RelevanceRank=(value)
+ @relevanceRank = value
+ end
+
def ProductInfo
@productInfo
end
-
+
def ProductInfo=(value)
@productInfo = value
end
- def initialize(mode = nil,
- productInfo = nil)
+ def initialize(mode = nil, relevanceRank = nil, productInfo = nil)
@mode = mode
+ @relevanceRank = relevanceRank
@productInfo = productInfo
end
end
@@ -41,7 +48,7 @@ class ProductInfo
def TotalResults
@totalResults
end
-
+
def TotalResults=(value)
@totalResults = value
end
@@ -49,7 +56,7 @@ class ProductInfo
def TotalPages
@totalPages
end
-
+
def TotalPages=(value)
@totalPages = value
end
@@ -57,7 +64,7 @@ class ProductInfo
def ListName
@listName
end
-
+
def ListName=(value)
@listName = value
end
@@ -65,15 +72,12 @@ class ProductInfo
def Details
@details
end
-
+
def Details=(value)
@details = value
end
- def initialize(totalResults = nil,
- totalPages = nil,
- listName = nil,
- details = nil)
+ def initialize(totalResults = nil, totalPages = nil, listName = nil, details = nil)
@totalResults = totalResults
@totalPages = totalPages
@listName = listName
@@ -83,7 +87,6 @@ end
# http://soap.amazon.com
class DetailsArray < Array
- # Contents type should be dumped here...
@@schema_type = "DetailsArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -96,7 +99,7 @@ class Details
def Url
@url
end
-
+
def Url=(value)
@url = value
end
@@ -104,7 +107,7 @@ class Details
def Asin
@asin
end
-
+
def Asin=(value)
@asin = value
end
@@ -112,7 +115,7 @@ class Details
def ProductName
@productName
end
-
+
def ProductName=(value)
@productName = value
end
@@ -120,7 +123,7 @@ class Details
def Catalog
@catalog
end
-
+
def Catalog=(value)
@catalog = value
end
@@ -128,7 +131,7 @@ class Details
def KeyPhrases
@keyPhrases
end
-
+
def KeyPhrases=(value)
@keyPhrases = value
end
@@ -136,7 +139,7 @@ class Details
def Artists
@artists
end
-
+
def Artists=(value)
@artists = value
end
@@ -144,7 +147,7 @@ class Details
def Authors
@authors
end
-
+
def Authors=(value)
@authors = value
end
@@ -152,7 +155,7 @@ class Details
def Mpn
@mpn
end
-
+
def Mpn=(value)
@mpn = value
end
@@ -160,7 +163,7 @@ class Details
def Starring
@starring
end
-
+
def Starring=(value)
@starring = value
end
@@ -168,7 +171,7 @@ class Details
def Directors
@directors
end
-
+
def Directors=(value)
@directors = value
end
@@ -176,7 +179,7 @@ class Details
def TheatricalReleaseDate
@theatricalReleaseDate
end
-
+
def TheatricalReleaseDate=(value)
@theatricalReleaseDate = value
end
@@ -184,7 +187,7 @@ class Details
def ReleaseDate
@releaseDate
end
-
+
def ReleaseDate=(value)
@releaseDate = value
end
@@ -192,7 +195,7 @@ class Details
def Manufacturer
@manufacturer
end
-
+
def Manufacturer=(value)
@manufacturer = value
end
@@ -200,7 +203,7 @@ class Details
def Distributor
@distributor
end
-
+
def Distributor=(value)
@distributor = value
end
@@ -208,7 +211,7 @@ class Details
def ImageUrlSmall
@imageUrlSmall
end
-
+
def ImageUrlSmall=(value)
@imageUrlSmall = value
end
@@ -216,7 +219,7 @@ class Details
def ImageUrlMedium
@imageUrlMedium
end
-
+
def ImageUrlMedium=(value)
@imageUrlMedium = value
end
@@ -224,7 +227,7 @@ class Details
def ImageUrlLarge
@imageUrlLarge
end
-
+
def ImageUrlLarge=(value)
@imageUrlLarge = value
end
@@ -232,7 +235,7 @@ class Details
def MerchantId
@merchantId
end
-
+
def MerchantId=(value)
@merchantId = value
end
@@ -240,7 +243,7 @@ class Details
def MinPrice
@minPrice
end
-
+
def MinPrice=(value)
@minPrice = value
end
@@ -248,7 +251,7 @@ class Details
def MaxPrice
@maxPrice
end
-
+
def MaxPrice=(value)
@maxPrice = value
end
@@ -256,7 +259,7 @@ class Details
def MinSalePrice
@minSalePrice
end
-
+
def MinSalePrice=(value)
@minSalePrice = value
end
@@ -264,7 +267,7 @@ class Details
def MaxSalePrice
@maxSalePrice
end
-
+
def MaxSalePrice=(value)
@maxSalePrice = value
end
@@ -272,7 +275,7 @@ class Details
def MultiMerchant
@multiMerchant
end
-
+
def MultiMerchant=(value)
@multiMerchant = value
end
@@ -280,7 +283,7 @@ class Details
def MerchantSku
@merchantSku
end
-
+
def MerchantSku=(value)
@merchantSku = value
end
@@ -288,7 +291,7 @@ class Details
def ListPrice
@listPrice
end
-
+
def ListPrice=(value)
@listPrice = value
end
@@ -296,7 +299,7 @@ class Details
def OurPrice
@ourPrice
end
-
+
def OurPrice=(value)
@ourPrice = value
end
@@ -304,7 +307,7 @@ class Details
def UsedPrice
@usedPrice
end
-
+
def UsedPrice=(value)
@usedPrice = value
end
@@ -312,7 +315,7 @@ class Details
def RefurbishedPrice
@refurbishedPrice
end
-
+
def RefurbishedPrice=(value)
@refurbishedPrice = value
end
@@ -320,7 +323,7 @@ class Details
def CollectiblePrice
@collectiblePrice
end
-
+
def CollectiblePrice=(value)
@collectiblePrice = value
end
@@ -328,7 +331,7 @@ class Details
def ThirdPartyNewPrice
@thirdPartyNewPrice
end
-
+
def ThirdPartyNewPrice=(value)
@thirdPartyNewPrice = value
end
@@ -336,7 +339,7 @@ class Details
def NumberOfOfferings
@numberOfOfferings
end
-
+
def NumberOfOfferings=(value)
@numberOfOfferings = value
end
@@ -344,7 +347,7 @@ class Details
def ThirdPartyNewCount
@thirdPartyNewCount
end
-
+
def ThirdPartyNewCount=(value)
@thirdPartyNewCount = value
end
@@ -352,7 +355,7 @@ class Details
def UsedCount
@usedCount
end
-
+
def UsedCount=(value)
@usedCount = value
end
@@ -360,7 +363,7 @@ class Details
def CollectibleCount
@collectibleCount
end
-
+
def CollectibleCount=(value)
@collectibleCount = value
end
@@ -368,7 +371,7 @@ class Details
def RefurbishedCount
@refurbishedCount
end
-
+
def RefurbishedCount=(value)
@refurbishedCount = value
end
@@ -376,7 +379,7 @@ class Details
def ThirdPartyProductInfo
@thirdPartyProductInfo
end
-
+
def ThirdPartyProductInfo=(value)
@thirdPartyProductInfo = value
end
@@ -384,7 +387,7 @@ class Details
def SalesRank
@salesRank
end
-
+
def SalesRank=(value)
@salesRank = value
end
@@ -392,7 +395,7 @@ class Details
def BrowseList
@browseList
end
-
+
def BrowseList=(value)
@browseList = value
end
@@ -400,7 +403,7 @@ class Details
def Media
@media
end
-
+
def Media=(value)
@media = value
end
@@ -408,15 +411,63 @@ class Details
def ReadingLevel
@readingLevel
end
-
+
def ReadingLevel=(value)
@readingLevel = value
end
+ def NumberOfPages
+ @numberOfPages
+ end
+
+ def NumberOfPages=(value)
+ @numberOfPages = value
+ end
+
+ def NumberOfIssues
+ @numberOfIssues
+ end
+
+ def NumberOfIssues=(value)
+ @numberOfIssues = value
+ end
+
+ def IssuesPerYear
+ @issuesPerYear
+ end
+
+ def IssuesPerYear=(value)
+ @issuesPerYear = value
+ end
+
+ def SubscriptionLength
+ @subscriptionLength
+ end
+
+ def SubscriptionLength=(value)
+ @subscriptionLength = value
+ end
+
+ def DeweyNumber
+ @deweyNumber
+ end
+
+ def DeweyNumber=(value)
+ @deweyNumber = value
+ end
+
+ def RunningTime
+ @runningTime
+ end
+
+ def RunningTime=(value)
+ @runningTime = value
+ end
+
def Publisher
@publisher
end
-
+
def Publisher=(value)
@publisher = value
end
@@ -424,7 +475,7 @@ class Details
def NumMedia
@numMedia
end
-
+
def NumMedia=(value)
@numMedia = value
end
@@ -432,7 +483,7 @@ class Details
def Isbn
@isbn
end
-
+
def Isbn=(value)
@isbn = value
end
@@ -440,7 +491,7 @@ class Details
def Features
@features
end
-
+
def Features=(value)
@features = value
end
@@ -448,7 +499,7 @@ class Details
def MpaaRating
@mpaaRating
end
-
+
def MpaaRating=(value)
@mpaaRating = value
end
@@ -456,7 +507,7 @@ class Details
def EsrbRating
@esrbRating
end
-
+
def EsrbRating=(value)
@esrbRating = value
end
@@ -464,7 +515,7 @@ class Details
def AgeGroup
@ageGroup
end
-
+
def AgeGroup=(value)
@ageGroup = value
end
@@ -472,7 +523,7 @@ class Details
def Availability
@availability
end
-
+
def Availability=(value)
@availability = value
end
@@ -480,7 +531,7 @@ class Details
def Upc
@upc
end
-
+
def Upc=(value)
@upc = value
end
@@ -488,7 +539,7 @@ class Details
def Tracks
@tracks
end
-
+
def Tracks=(value)
@tracks = value
end
@@ -496,7 +547,7 @@ class Details
def Accessories
@accessories
end
-
+
def Accessories=(value)
@accessories = value
end
@@ -504,7 +555,7 @@ class Details
def Platforms
@platforms
end
-
+
def Platforms=(value)
@platforms = value
end
@@ -512,7 +563,7 @@ class Details
def Encoding
@encoding
end
-
+
def Encoding=(value)
@encoding = value
end
@@ -520,7 +571,7 @@ class Details
def ProductDescription
@productDescription
end
-
+
def ProductDescription=(value)
@productDescription = value
end
@@ -528,7 +579,7 @@ class Details
def Reviews
@reviews
end
-
+
def Reviews=(value)
@reviews = value
end
@@ -536,7 +587,7 @@ class Details
def SimilarProducts
@similarProducts
end
-
+
def SimilarProducts=(value)
@similarProducts = value
end
@@ -544,7 +595,7 @@ class Details
def FeaturedProducts
@featuredProducts
end
-
+
def FeaturedProducts=(value)
@featuredProducts = value
end
@@ -552,7 +603,7 @@ class Details
def Lists
@lists
end
-
+
def Lists=(value)
@lists = value
end
@@ -560,7 +611,7 @@ class Details
def Status
@status
end
-
+
def Status=(value)
@status = value
end
@@ -568,71 +619,12 @@ class Details
def Variations
@variations
end
-
+
def Variations=(value)
@variations = value
end
- def initialize(url = nil,
- asin = nil,
- productName = nil,
- catalog = nil,
- keyPhrases = nil,
- artists = nil,
- authors = nil,
- mpn = nil,
- starring = nil,
- directors = nil,
- theatricalReleaseDate = nil,
- releaseDate = nil,
- manufacturer = nil,
- distributor = nil,
- imageUrlSmall = nil,
- imageUrlMedium = nil,
- imageUrlLarge = nil,
- merchantId = nil,
- minPrice = nil,
- maxPrice = nil,
- minSalePrice = nil,
- maxSalePrice = nil,
- multiMerchant = nil,
- merchantSku = nil,
- listPrice = nil,
- ourPrice = nil,
- usedPrice = nil,
- refurbishedPrice = nil,
- collectiblePrice = nil,
- thirdPartyNewPrice = nil,
- numberOfOfferings = nil,
- thirdPartyNewCount = nil,
- usedCount = nil,
- collectibleCount = nil,
- refurbishedCount = nil,
- thirdPartyProductInfo = nil,
- salesRank = nil,
- browseList = nil,
- media = nil,
- readingLevel = nil,
- publisher = nil,
- numMedia = nil,
- isbn = nil,
- features = nil,
- mpaaRating = nil,
- esrbRating = nil,
- ageGroup = nil,
- availability = nil,
- upc = nil,
- tracks = nil,
- accessories = nil,
- platforms = nil,
- encoding = nil,
- productDescription = nil,
- reviews = nil,
- similarProducts = nil,
- featuredProducts = nil,
- lists = nil,
- status = nil,
- variations = nil)
+ def initialize(url = nil, asin = nil, productName = nil, catalog = nil, keyPhrases = nil, artists = nil, authors = nil, mpn = nil, starring = nil, directors = nil, theatricalReleaseDate = nil, releaseDate = nil, manufacturer = nil, distributor = nil, imageUrlSmall = nil, imageUrlMedium = nil, imageUrlLarge = nil, merchantId = nil, minPrice = nil, maxPrice = nil, minSalePrice = nil, maxSalePrice = nil, multiMerchant = nil, merchantSku = nil, listPrice = nil, ourPrice = nil, usedPrice = nil, refurbishedPrice = nil, collectiblePrice = nil, thirdPartyNewPrice = nil, numberOfOfferings = nil, thirdPartyNewCount = nil, usedCount = nil, collectibleCount = nil, refurbishedCount = nil, thirdPartyProductInfo = nil, salesRank = nil, browseList = nil, media = nil, readingLevel = nil, numberOfPages = nil, numberOfIssues = nil, issuesPerYear = nil, subscriptionLength = nil, deweyNumber = nil, runningTime = nil, publisher = nil, numMedia = nil, isbn = nil, features = nil, mpaaRating = nil, esrbRating = nil, ageGroup = nil, availability = nil, upc = nil, tracks = nil, accessories = nil, platforms = nil, encoding = nil, productDescription = nil, reviews = nil, similarProducts = nil, featuredProducts = nil, lists = nil, status = nil, variations = nil)
@url = url
@asin = asin
@productName = productName
@@ -673,6 +665,12 @@ class Details
@browseList = browseList
@media = media
@readingLevel = readingLevel
+ @numberOfPages = numberOfPages
+ @numberOfIssues = numberOfIssues
+ @issuesPerYear = issuesPerYear
+ @subscriptionLength = subscriptionLength
+ @deweyNumber = deweyNumber
+ @runningTime = runningTime
@publisher = publisher
@numMedia = numMedia
@isbn = isbn
@@ -698,7 +696,6 @@ end
# http://soap.amazon.com
class KeyPhraseArray < Array
- # Contents type should be dumped here...
@@schema_type = "KeyPhraseArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -711,7 +708,7 @@ class KeyPhrase
def KeyPhrase
@keyPhrase
end
-
+
def KeyPhrase=(value)
@keyPhrase = value
end
@@ -719,13 +716,12 @@ class KeyPhrase
def Type
@type
end
-
+
def Type=(value)
@type = value
end
- def initialize(keyPhrase = nil,
- type = nil)
+ def initialize(keyPhrase = nil, type = nil)
@keyPhrase = keyPhrase
@type = type
end
@@ -733,35 +729,30 @@ end
# http://soap.amazon.com
class ArtistArray < Array
- # Contents type should be dumped here...
@@schema_type = "ArtistArray"
@@schema_ns = "http://soap.amazon.com"
end
# http://soap.amazon.com
class AuthorArray < Array
- # Contents type should be dumped here...
@@schema_type = "AuthorArray"
@@schema_ns = "http://soap.amazon.com"
end
# http://soap.amazon.com
class StarringArray < Array
- # Contents type should be dumped here...
@@schema_type = "StarringArray"
@@schema_ns = "http://soap.amazon.com"
end
# http://soap.amazon.com
class DirectorArray < Array
- # Contents type should be dumped here...
@@schema_type = "DirectorArray"
@@schema_ns = "http://soap.amazon.com"
end
# http://soap.amazon.com
class BrowseNodeArray < Array
- # Contents type should be dumped here...
@@schema_type = "BrowseNodeArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -774,7 +765,7 @@ class BrowseNode
def BrowseId
@browseId
end
-
+
def BrowseId=(value)
@browseId = value
end
@@ -782,13 +773,12 @@ class BrowseNode
def BrowseName
@browseName
end
-
+
def BrowseName=(value)
@browseName = value
end
- def initialize(browseId = nil,
- browseName = nil)
+ def initialize(browseId = nil, browseName = nil)
@browseId = browseId
@browseName = browseName
end
@@ -796,14 +786,12 @@ end
# http://soap.amazon.com
class FeaturesArray < Array
- # Contents type should be dumped here...
@@schema_type = "FeaturesArray"
@@schema_ns = "http://soap.amazon.com"
end
# http://soap.amazon.com
class TrackArray < Array
- # Contents type should be dumped here...
@@schema_type = "TrackArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -816,7 +804,7 @@ class Track
def TrackName
@trackName
end
-
+
def TrackName=(value)
@trackName = value
end
@@ -824,13 +812,12 @@ class Track
def ByArtist
@byArtist
end
-
+
def ByArtist=(value)
@byArtist = value
end
- def initialize(trackName = nil,
- byArtist = nil)
+ def initialize(trackName = nil, byArtist = nil)
@trackName = trackName
@byArtist = byArtist
end
@@ -838,14 +825,12 @@ end
# http://soap.amazon.com
class AccessoryArray < Array
- # Contents type should be dumped here...
@@schema_type = "AccessoryArray"
@@schema_ns = "http://soap.amazon.com"
end
# http://soap.amazon.com
class PlatformArray < Array
- # Contents type should be dumped here...
@@schema_type = "PlatformArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -858,7 +843,7 @@ class Reviews
def AvgCustomerRating
@avgCustomerRating
end
-
+
def AvgCustomerRating=(value)
@avgCustomerRating = value
end
@@ -866,7 +851,7 @@ class Reviews
def TotalCustomerReviews
@totalCustomerReviews
end
-
+
def TotalCustomerReviews=(value)
@totalCustomerReviews = value
end
@@ -874,14 +859,12 @@ class Reviews
def CustomerReviews
@customerReviews
end
-
+
def CustomerReviews=(value)
@customerReviews = value
end
- def initialize(avgCustomerRating = nil,
- totalCustomerReviews = nil,
- customerReviews = nil)
+ def initialize(avgCustomerRating = nil, totalCustomerReviews = nil, customerReviews = nil)
@avgCustomerRating = avgCustomerRating
@totalCustomerReviews = totalCustomerReviews
@customerReviews = customerReviews
@@ -890,7 +873,6 @@ end
# http://soap.amazon.com
class CustomerReviewArray < Array
- # Contents type should be dumped here...
@@schema_type = "CustomerReviewArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -903,15 +885,23 @@ class CustomerReview
def Rating
@rating
end
-
+
def Rating=(value)
@rating = value
end
+ def Date
+ @date
+ end
+
+ def Date=(value)
+ @date = value
+ end
+
def Summary
@summary
end
-
+
def Summary=(value)
@summary = value
end
@@ -919,15 +909,14 @@ class CustomerReview
def Comment
@comment
end
-
+
def Comment=(value)
@comment = value
end
- def initialize(rating = nil,
- summary = nil,
- comment = nil)
+ def initialize(rating = nil, date = nil, summary = nil, comment = nil)
@rating = rating
+ @date = date
@summary = summary
@comment = comment
end
@@ -935,14 +924,12 @@ end
# http://soap.amazon.com
class SimilarProductsArray < Array
- # Contents type should be dumped here...
@@schema_type = "SimilarProductsArray"
@@schema_ns = "http://soap.amazon.com"
end
# http://soap.amazon.com
class FeaturedProductsArray < Array
- # Contents type should be dumped here...
@@schema_type = "FeaturedProductsArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -955,7 +942,7 @@ class FeaturedProduct
def Asin
@asin
end
-
+
def Asin=(value)
@asin = value
end
@@ -963,13 +950,12 @@ class FeaturedProduct
def Comment
@comment
end
-
+
def Comment=(value)
@comment = value
end
- def initialize(asin = nil,
- comment = nil)
+ def initialize(asin = nil, comment = nil)
@asin = asin
@comment = comment
end
@@ -977,14 +963,12 @@ end
# http://soap.amazon.com
class ListArray < Array
- # Contents type should be dumped here...
@@schema_type = "ListArray"
@@schema_ns = "http://soap.amazon.com"
end
# http://soap.amazon.com
class VariationArray < Array
- # Contents type should be dumped here...
@@schema_type = "VariationArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -997,7 +981,7 @@ class Variation
def Asin
@asin
end
-
+
def Asin=(value)
@asin = value
end
@@ -1005,7 +989,7 @@ class Variation
def ClothingSize
@clothingSize
end
-
+
def ClothingSize=(value)
@clothingSize = value
end
@@ -1013,7 +997,7 @@ class Variation
def ClothingColor
@clothingColor
end
-
+
def ClothingColor=(value)
@clothingColor = value
end
@@ -1021,7 +1005,7 @@ class Variation
def Price
@price
end
-
+
def Price=(value)
@price = value
end
@@ -1029,7 +1013,7 @@ class Variation
def SalePrice
@salePrice
end
-
+
def SalePrice=(value)
@salePrice = value
end
@@ -1037,7 +1021,7 @@ class Variation
def Availability
@availability
end
-
+
def Availability=(value)
@availability = value
end
@@ -1045,7 +1029,7 @@ class Variation
def MultiMerchant
@multiMerchant
end
-
+
def MultiMerchant=(value)
@multiMerchant = value
end
@@ -1053,19 +1037,12 @@ class Variation
def MerchantSku
@merchantSku
end
-
+
def MerchantSku=(value)
@merchantSku = value
end
- def initialize(asin = nil,
- clothingSize = nil,
- clothingColor = nil,
- price = nil,
- salePrice = nil,
- availability = nil,
- multiMerchant = nil,
- merchantSku = nil)
+ def initialize(asin = nil, clothingSize = nil, clothingColor = nil, price = nil, salePrice = nil, availability = nil, multiMerchant = nil, merchantSku = nil)
@asin = asin
@clothingSize = clothingSize
@clothingColor = clothingColor
@@ -1085,7 +1062,7 @@ class MarketplaceSearch
def MarketplaceSearchDetails
@marketplaceSearchDetails
end
-
+
def MarketplaceSearchDetails=(value)
@marketplaceSearchDetails = value
end
@@ -1103,7 +1080,7 @@ class SellerProfile
def SellerProfileDetails
@sellerProfileDetails
end
-
+
def SellerProfileDetails=(value)
@sellerProfileDetails = value
end
@@ -1121,7 +1098,7 @@ class SellerSearch
def SellerSearchDetails
@sellerSearchDetails
end
-
+
def SellerSearchDetails=(value)
@sellerSearchDetails = value
end
@@ -1139,7 +1116,7 @@ class MarketplaceSearchDetails
def NumberOfOpenListings
@numberOfOpenListings
end
-
+
def NumberOfOpenListings=(value)
@numberOfOpenListings = value
end
@@ -1147,13 +1124,12 @@ class MarketplaceSearchDetails
def ListingProductInfo
@listingProductInfo
end
-
+
def ListingProductInfo=(value)
@listingProductInfo = value
end
- def initialize(numberOfOpenListings = nil,
- listingProductInfo = nil)
+ def initialize(numberOfOpenListings = nil, listingProductInfo = nil)
@numberOfOpenListings = numberOfOpenListings
@listingProductInfo = listingProductInfo
end
@@ -1161,7 +1137,6 @@ end
# http://soap.amazon.com
class MarketplaceSearchDetailsArray < Array
- # Contents type should be dumped here...
@@schema_type = "MarketplaceSearchDetailsArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -1174,7 +1149,7 @@ class SellerProfileDetails
def SellerNickname
@sellerNickname
end
-
+
def SellerNickname=(value)
@sellerNickname = value
end
@@ -1182,7 +1157,7 @@ class SellerProfileDetails
def OverallFeedbackRating
@overallFeedbackRating
end
-
+
def OverallFeedbackRating=(value)
@overallFeedbackRating = value
end
@@ -1190,7 +1165,7 @@ class SellerProfileDetails
def NumberOfFeedback
@numberOfFeedback
end
-
+
def NumberOfFeedback=(value)
@numberOfFeedback = value
end
@@ -1198,7 +1173,7 @@ class SellerProfileDetails
def NumberOfCanceledBids
@numberOfCanceledBids
end
-
+
def NumberOfCanceledBids=(value)
@numberOfCanceledBids = value
end
@@ -1206,7 +1181,7 @@ class SellerProfileDetails
def NumberOfCanceledAuctions
@numberOfCanceledAuctions
end
-
+
def NumberOfCanceledAuctions=(value)
@numberOfCanceledAuctions = value
end
@@ -1214,7 +1189,7 @@ class SellerProfileDetails
def StoreId
@storeId
end
-
+
def StoreId=(value)
@storeId = value
end
@@ -1222,7 +1197,7 @@ class SellerProfileDetails
def StoreName
@storeName
end
-
+
def StoreName=(value)
@storeName = value
end
@@ -1230,19 +1205,12 @@ class SellerProfileDetails
def SellerFeedback
@sellerFeedback
end
-
+
def SellerFeedback=(value)
@sellerFeedback = value
end
- def initialize(sellerNickname = nil,
- overallFeedbackRating = nil,
- numberOfFeedback = nil,
- numberOfCanceledBids = nil,
- numberOfCanceledAuctions = nil,
- storeId = nil,
- storeName = nil,
- sellerFeedback = nil)
+ def initialize(sellerNickname = nil, overallFeedbackRating = nil, numberOfFeedback = nil, numberOfCanceledBids = nil, numberOfCanceledAuctions = nil, storeId = nil, storeName = nil, sellerFeedback = nil)
@sellerNickname = sellerNickname
@overallFeedbackRating = overallFeedbackRating
@numberOfFeedback = numberOfFeedback
@@ -1256,7 +1224,6 @@ end
# http://soap.amazon.com
class SellerProfileDetailsArray < Array
- # Contents type should be dumped here...
@@schema_type = "SellerProfileDetailsArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -1269,7 +1236,7 @@ class SellerSearchDetails
def SellerNickname
@sellerNickname
end
-
+
def SellerNickname=(value)
@sellerNickname = value
end
@@ -1277,7 +1244,7 @@ class SellerSearchDetails
def StoreId
@storeId
end
-
+
def StoreId=(value)
@storeId = value
end
@@ -1285,7 +1252,7 @@ class SellerSearchDetails
def StoreName
@storeName
end
-
+
def StoreName=(value)
@storeName = value
end
@@ -1293,7 +1260,7 @@ class SellerSearchDetails
def NumberOfOpenListings
@numberOfOpenListings
end
-
+
def NumberOfOpenListings=(value)
@numberOfOpenListings = value
end
@@ -1301,16 +1268,12 @@ class SellerSearchDetails
def ListingProductInfo
@listingProductInfo
end
-
+
def ListingProductInfo=(value)
@listingProductInfo = value
end
- def initialize(sellerNickname = nil,
- storeId = nil,
- storeName = nil,
- numberOfOpenListings = nil,
- listingProductInfo = nil)
+ def initialize(sellerNickname = nil, storeId = nil, storeName = nil, numberOfOpenListings = nil, listingProductInfo = nil)
@sellerNickname = sellerNickname
@storeId = storeId
@storeName = storeName
@@ -1321,7 +1284,6 @@ end
# http://soap.amazon.com
class SellerSearchDetailsArray < Array
- # Contents type should be dumped here...
@@schema_type = "SellerSearchDetailsArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -1334,7 +1296,7 @@ class ListingProductInfo
def ListingProductDetails
@listingProductDetails
end
-
+
def ListingProductDetails=(value)
@listingProductDetails = value
end
@@ -1346,7 +1308,6 @@ end
# http://soap.amazon.com
class ListingProductDetailsArray < Array
- # Contents type should be dumped here...
@@schema_type = "ListingProductDetailsArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -1359,7 +1320,7 @@ class ListingProductDetails
def ExchangeId
@exchangeId
end
-
+
def ExchangeId=(value)
@exchangeId = value
end
@@ -1367,7 +1328,7 @@ class ListingProductDetails
def ListingId
@listingId
end
-
+
def ListingId=(value)
@listingId = value
end
@@ -1375,7 +1336,7 @@ class ListingProductDetails
def ExchangeTitle
@exchangeTitle
end
-
+
def ExchangeTitle=(value)
@exchangeTitle = value
end
@@ -1383,7 +1344,7 @@ class ListingProductDetails
def ExchangeDescription
@exchangeDescription
end
-
+
def ExchangeDescription=(value)
@exchangeDescription = value
end
@@ -1391,7 +1352,7 @@ class ListingProductDetails
def ExchangePrice
@exchangePrice
end
-
+
def ExchangePrice=(value)
@exchangePrice = value
end
@@ -1399,7 +1360,7 @@ class ListingProductDetails
def ExchangeAsin
@exchangeAsin
end
-
+
def ExchangeAsin=(value)
@exchangeAsin = value
end
@@ -1407,7 +1368,7 @@ class ListingProductDetails
def ExchangeEndDate
@exchangeEndDate
end
-
+
def ExchangeEndDate=(value)
@exchangeEndDate = value
end
@@ -1415,7 +1376,7 @@ class ListingProductDetails
def ExchangeTinyImage
@exchangeTinyImage
end
-
+
def ExchangeTinyImage=(value)
@exchangeTinyImage = value
end
@@ -1423,7 +1384,7 @@ class ListingProductDetails
def ExchangeSellerId
@exchangeSellerId
end
-
+
def ExchangeSellerId=(value)
@exchangeSellerId = value
end
@@ -1431,7 +1392,7 @@ class ListingProductDetails
def ExchangeSellerNickname
@exchangeSellerNickname
end
-
+
def ExchangeSellerNickname=(value)
@exchangeSellerNickname = value
end
@@ -1439,7 +1400,7 @@ class ListingProductDetails
def ExchangeStartDate
@exchangeStartDate
end
-
+
def ExchangeStartDate=(value)
@exchangeStartDate = value
end
@@ -1447,7 +1408,7 @@ class ListingProductDetails
def ExchangeStatus
@exchangeStatus
end
-
+
def ExchangeStatus=(value)
@exchangeStatus = value
end
@@ -1455,7 +1416,7 @@ class ListingProductDetails
def ExchangeQuantity
@exchangeQuantity
end
-
+
def ExchangeQuantity=(value)
@exchangeQuantity = value
end
@@ -1463,7 +1424,7 @@ class ListingProductDetails
def ExchangeQuantityAllocated
@exchangeQuantityAllocated
end
-
+
def ExchangeQuantityAllocated=(value)
@exchangeQuantityAllocated = value
end
@@ -1471,7 +1432,7 @@ class ListingProductDetails
def ExchangeFeaturedCategory
@exchangeFeaturedCategory
end
-
+
def ExchangeFeaturedCategory=(value)
@exchangeFeaturedCategory = value
end
@@ -1479,7 +1440,7 @@ class ListingProductDetails
def ExchangeCondition
@exchangeCondition
end
-
+
def ExchangeCondition=(value)
@exchangeCondition = value
end
@@ -1487,7 +1448,7 @@ class ListingProductDetails
def ExchangeConditionType
@exchangeConditionType
end
-
+
def ExchangeConditionType=(value)
@exchangeConditionType = value
end
@@ -1495,7 +1456,7 @@ class ListingProductDetails
def ExchangeAvailability
@exchangeAvailability
end
-
+
def ExchangeAvailability=(value)
@exchangeAvailability = value
end
@@ -1503,7 +1464,7 @@ class ListingProductDetails
def ExchangeOfferingType
@exchangeOfferingType
end
-
+
def ExchangeOfferingType=(value)
@exchangeOfferingType = value
end
@@ -1511,7 +1472,7 @@ class ListingProductDetails
def ExchangeSellerState
@exchangeSellerState
end
-
+
def ExchangeSellerState=(value)
@exchangeSellerState = value
end
@@ -1519,7 +1480,7 @@ class ListingProductDetails
def ExchangeSellerCountry
@exchangeSellerCountry
end
-
+
def ExchangeSellerCountry=(value)
@exchangeSellerCountry = value
end
@@ -1527,33 +1488,12 @@ class ListingProductDetails
def ExchangeSellerRating
@exchangeSellerRating
end
-
+
def ExchangeSellerRating=(value)
@exchangeSellerRating = value
end
- def initialize(exchangeId = nil,
- listingId = nil,
- exchangeTitle = nil,
- exchangeDescription = nil,
- exchangePrice = nil,
- exchangeAsin = nil,
- exchangeEndDate = nil,
- exchangeTinyImage = nil,
- exchangeSellerId = nil,
- exchangeSellerNickname = nil,
- exchangeStartDate = nil,
- exchangeStatus = nil,
- exchangeQuantity = nil,
- exchangeQuantityAllocated = nil,
- exchangeFeaturedCategory = nil,
- exchangeCondition = nil,
- exchangeConditionType = nil,
- exchangeAvailability = nil,
- exchangeOfferingType = nil,
- exchangeSellerState = nil,
- exchangeSellerCountry = nil,
- exchangeSellerRating = nil)
+ def initialize(exchangeId = nil, listingId = nil, exchangeTitle = nil, exchangeDescription = nil, exchangePrice = nil, exchangeAsin = nil, exchangeEndDate = nil, exchangeTinyImage = nil, exchangeSellerId = nil, exchangeSellerNickname = nil, exchangeStartDate = nil, exchangeStatus = nil, exchangeQuantity = nil, exchangeQuantityAllocated = nil, exchangeFeaturedCategory = nil, exchangeCondition = nil, exchangeConditionType = nil, exchangeAvailability = nil, exchangeOfferingType = nil, exchangeSellerState = nil, exchangeSellerCountry = nil, exchangeSellerRating = nil)
@exchangeId = exchangeId
@listingId = listingId
@exchangeTitle = exchangeTitle
@@ -1587,7 +1527,7 @@ class SellerFeedback
def Feedback
@feedback
end
-
+
def Feedback=(value)
@feedback = value
end
@@ -1599,7 +1539,6 @@ end
# http://soap.amazon.com
class FeedbackArray < Array
- # Contents type should be dumped here...
@@schema_type = "FeedbackArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -1612,7 +1551,7 @@ class Feedback
def FeedbackRating
@feedbackRating
end
-
+
def FeedbackRating=(value)
@feedbackRating = value
end
@@ -1620,7 +1559,7 @@ class Feedback
def FeedbackComments
@feedbackComments
end
-
+
def FeedbackComments=(value)
@feedbackComments = value
end
@@ -1628,7 +1567,7 @@ class Feedback
def FeedbackDate
@feedbackDate
end
-
+
def FeedbackDate=(value)
@feedbackDate = value
end
@@ -1636,15 +1575,12 @@ class Feedback
def FeedbackRater
@feedbackRater
end
-
+
def FeedbackRater=(value)
@feedbackRater = value
end
- def initialize(feedbackRating = nil,
- feedbackComments = nil,
- feedbackDate = nil,
- feedbackRater = nil)
+ def initialize(feedbackRating = nil, feedbackComments = nil, feedbackDate = nil, feedbackRater = nil)
@feedbackRating = feedbackRating
@feedbackComments = feedbackComments
@feedbackDate = feedbackDate
@@ -1660,7 +1596,7 @@ class ThirdPartyProductInfo
def ThirdPartyProductDetails
@thirdPartyProductDetails
end
-
+
def ThirdPartyProductDetails=(value)
@thirdPartyProductDetails = value
end
@@ -1672,7 +1608,6 @@ end
# http://soap.amazon.com
class ThirdPartyProductDetailsArray < Array
- # Contents type should be dumped here...
@@schema_type = "ThirdPartyProductDetailsArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -1685,7 +1620,7 @@ class ThirdPartyProductDetails
def OfferingType
@offeringType
end
-
+
def OfferingType=(value)
@offeringType = value
end
@@ -1693,7 +1628,7 @@ class ThirdPartyProductDetails
def SellerId
@sellerId
end
-
+
def SellerId=(value)
@sellerId = value
end
@@ -1701,7 +1636,7 @@ class ThirdPartyProductDetails
def SellerNickname
@sellerNickname
end
-
+
def SellerNickname=(value)
@sellerNickname = value
end
@@ -1709,7 +1644,7 @@ class ThirdPartyProductDetails
def ExchangeId
@exchangeId
end
-
+
def ExchangeId=(value)
@exchangeId = value
end
@@ -1717,7 +1652,7 @@ class ThirdPartyProductDetails
def OfferingPrice
@offeringPrice
end
-
+
def OfferingPrice=(value)
@offeringPrice = value
end
@@ -1725,7 +1660,7 @@ class ThirdPartyProductDetails
def Condition
@condition
end
-
+
def Condition=(value)
@condition = value
end
@@ -1733,7 +1668,7 @@ class ThirdPartyProductDetails
def ConditionType
@conditionType
end
-
+
def ConditionType=(value)
@conditionType = value
end
@@ -1741,7 +1676,7 @@ class ThirdPartyProductDetails
def ExchangeAvailability
@exchangeAvailability
end
-
+
def ExchangeAvailability=(value)
@exchangeAvailability = value
end
@@ -1749,7 +1684,7 @@ class ThirdPartyProductDetails
def SellerCountry
@sellerCountry
end
-
+
def SellerCountry=(value)
@sellerCountry = value
end
@@ -1757,7 +1692,7 @@ class ThirdPartyProductDetails
def SellerState
@sellerState
end
-
+
def SellerState=(value)
@sellerState = value
end
@@ -1765,7 +1700,7 @@ class ThirdPartyProductDetails
def ShipComments
@shipComments
end
-
+
def ShipComments=(value)
@shipComments = value
end
@@ -1773,23 +1708,12 @@ class ThirdPartyProductDetails
def SellerRating
@sellerRating
end
-
+
def SellerRating=(value)
@sellerRating = value
end
- def initialize(offeringType = nil,
- sellerId = nil,
- sellerNickname = nil,
- exchangeId = nil,
- offeringPrice = nil,
- condition = nil,
- conditionType = nil,
- exchangeAvailability = nil,
- sellerCountry = nil,
- sellerState = nil,
- shipComments = nil,
- sellerRating = nil)
+ def initialize(offeringType = nil, sellerId = nil, sellerNickname = nil, exchangeId = nil, offeringPrice = nil, condition = nil, conditionType = nil, exchangeAvailability = nil, sellerCountry = nil, sellerState = nil, shipComments = nil, sellerRating = nil)
@offeringType = offeringType
@sellerId = sellerId
@sellerNickname = sellerNickname
@@ -1810,87 +1734,17 @@ class KeywordRequest
@@schema_type = "KeywordRequest"
@@schema_ns = "http://soap.amazon.com"
- def keyword
- @keyword
- end
-
- def keyword=(value)
- @keyword = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
+ attr_accessor :keyword
+ attr_accessor :page
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
+ attr_accessor :price
- def price
- @price
- end
-
- def price=(value)
- @price = value
- end
-
- def initialize(keyword = nil,
- page = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil,
- price = nil)
+ def initialize(keyword = nil, page = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil, price = nil)
@keyword = keyword
@page = page
@mode = mode
@@ -1908,87 +1762,17 @@ class TextStreamRequest
@@schema_type = "TextStreamRequest"
@@schema_ns = "http://soap.amazon.com"
- def textStream
- @textStream
- end
-
- def textStream=(value)
- @textStream = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
+ attr_accessor :textStream
+ attr_accessor :page
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
+ attr_accessor :price
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def price
- @price
- end
-
- def price=(value)
- @price = value
- end
-
- def initialize(textStream = nil,
- page = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil,
- price = nil)
+ def initialize(textStream = nil, page = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil, price = nil)
@textStream = textStream
@page = page
@mode = mode
@@ -2006,78 +1790,16 @@ class PowerRequest
@@schema_type = "PowerRequest"
@@schema_ns = "http://soap.amazon.com"
- def power
- @power
- end
-
- def power=(value)
- @power = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
+ attr_accessor :power
+ attr_accessor :page
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
- def initialize(power = nil,
- page = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil)
+ def initialize(power = nil, page = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil)
@power = power
@page = page
@mode = mode
@@ -2094,96 +1816,18 @@ class BrowseNodeRequest
@@schema_type = "BrowseNodeRequest"
@@schema_ns = "http://soap.amazon.com"
- def browse_node
- @browse_node
- end
+ attr_accessor :browse_node
+ attr_accessor :page
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
+ attr_accessor :keywords
+ attr_accessor :price
- def browse_node=(value)
- @browse_node = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def keywords
- @keywords
- end
-
- def keywords=(value)
- @keywords = value
- end
-
- def price
- @price
- end
-
- def price=(value)
- @price = value
- end
-
- def initialize(browse_node = nil,
- page = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil,
- keywords = nil,
- price = nil)
+ def initialize(browse_node = nil, page = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil, keywords = nil, price = nil)
@browse_node = browse_node
@page = page
@mode = mode
@@ -2202,78 +1846,16 @@ class AsinRequest
@@schema_type = "AsinRequest"
@@schema_ns = "http://soap.amazon.com"
- def asin
- @asin
- end
-
- def asin=(value)
- @asin = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def offer
- @offer
- end
+ attr_accessor :asin
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :offer
+ attr_accessor :offerpage
+ attr_accessor :locale
+ attr_accessor :mode
- def offer=(value)
- @offer = value
- end
-
- def offerpage
- @offerpage
- end
-
- def offerpage=(value)
- @offerpage = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def initialize(asin = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- offer = nil,
- offerpage = nil,
- locale = nil,
- mode = nil)
+ def initialize(asin = nil, tag = nil, type = nil, devtag = nil, offer = nil, offerpage = nil, locale = nil, mode = nil)
@asin = asin
@tag = tag
@type = type
@@ -2290,51 +1872,13 @@ class BlendedRequest
@@schema_type = "BlendedRequest"
@@schema_ns = "http://soap.amazon.com"
- def blended
- @blended
- end
+ attr_accessor :blended
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :locale
- def blended=(value)
- @blended = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def initialize(blended = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- locale = nil)
+ def initialize(blended = nil, tag = nil, type = nil, devtag = nil, locale = nil)
@blended = blended
@tag = tag
@type = type
@@ -2348,69 +1892,15 @@ class UpcRequest
@@schema_type = "UpcRequest"
@@schema_ns = "http://soap.amazon.com"
- def upc
- @upc
- end
-
- def upc=(value)
- @upc = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
+ attr_accessor :upc
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
- def initialize(upc = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil)
+ def initialize(upc = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil)
@upc = upc
@mode = mode
@tag = tag
@@ -2426,87 +1916,17 @@ class SkuRequest
@@schema_type = "SkuRequest"
@@schema_ns = "http://soap.amazon.com"
- def sku
- @sku
- end
-
- def sku=(value)
- @sku = value
- end
+ attr_accessor :sku
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :merchant_id
+ attr_accessor :keywords
+ attr_accessor :sort
+ attr_accessor :locale
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def merchant_id
- @merchant_id
- end
-
- def merchant_id=(value)
- @merchant_id = value
- end
-
- def keywords
- @keywords
- end
-
- def keywords=(value)
- @keywords = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def initialize(sku = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- merchant_id = nil,
- keywords = nil,
- sort = nil,
- locale = nil)
+ def initialize(sku = nil, mode = nil, tag = nil, type = nil, devtag = nil, merchant_id = nil, keywords = nil, sort = nil, locale = nil)
@sku = sku
@mode = mode
@tag = tag
@@ -2524,96 +1944,18 @@ class ArtistRequest
@@schema_type = "ArtistRequest"
@@schema_ns = "http://soap.amazon.com"
- def artist
- @artist
- end
-
- def artist=(value)
- @artist = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
+ attr_accessor :artist
+ attr_accessor :page
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
+ attr_accessor :keywords
+ attr_accessor :price
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def keywords
- @keywords
- end
-
- def keywords=(value)
- @keywords = value
- end
-
- def price
- @price
- end
-
- def price=(value)
- @price = value
- end
-
- def initialize(artist = nil,
- page = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil,
- keywords = nil,
- price = nil)
+ def initialize(artist = nil, page = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil, keywords = nil, price = nil)
@artist = artist
@page = page
@mode = mode
@@ -2632,96 +1974,18 @@ class AuthorRequest
@@schema_type = "AuthorRequest"
@@schema_ns = "http://soap.amazon.com"
- def author
- @author
- end
-
- def author=(value)
- @author = value
- end
+ attr_accessor :author
+ attr_accessor :page
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
+ attr_accessor :keywords
+ attr_accessor :price
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def keywords
- @keywords
- end
-
- def keywords=(value)
- @keywords = value
- end
-
- def price
- @price
- end
-
- def price=(value)
- @price = value
- end
-
- def initialize(author = nil,
- page = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil,
- keywords = nil,
- price = nil)
+ def initialize(author = nil, page = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil, keywords = nil, price = nil)
@author = author
@page = page
@mode = mode
@@ -2740,96 +2004,18 @@ class ActorRequest
@@schema_type = "ActorRequest"
@@schema_ns = "http://soap.amazon.com"
- def actor
- @actor
- end
-
- def actor=(value)
- @actor = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
+ attr_accessor :actor
+ attr_accessor :page
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
+ attr_accessor :keywords
+ attr_accessor :price
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def keywords
- @keywords
- end
-
- def keywords=(value)
- @keywords = value
- end
-
- def price
- @price
- end
-
- def price=(value)
- @price = value
- end
-
- def initialize(actor = nil,
- page = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil,
- keywords = nil,
- price = nil)
+ def initialize(actor = nil, page = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil, keywords = nil, price = nil)
@actor = actor
@page = page
@mode = mode
@@ -2848,96 +2034,18 @@ class DirectorRequest
@@schema_type = "DirectorRequest"
@@schema_ns = "http://soap.amazon.com"
- def director
- @director
- end
-
- def director=(value)
- @director = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def keywords
- @keywords
- end
-
- def keywords=(value)
- @keywords = value
- end
+ attr_accessor :director
+ attr_accessor :page
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
+ attr_accessor :keywords
+ attr_accessor :price
- def price
- @price
- end
-
- def price=(value)
- @price = value
- end
-
- def initialize(director = nil,
- page = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil,
- keywords = nil,
- price = nil)
+ def initialize(director = nil, page = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil, keywords = nil, price = nil)
@director = director
@page = page
@mode = mode
@@ -2956,51 +2064,13 @@ class ExchangeRequest
@@schema_type = "ExchangeRequest"
@@schema_ns = "http://soap.amazon.com"
- def exchange_id
- @exchange_id
- end
-
- def exchange_id=(value)
- @exchange_id = value
- end
+ attr_accessor :exchange_id
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :locale
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def initialize(exchange_id = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- locale = nil)
+ def initialize(exchange_id = nil, tag = nil, type = nil, devtag = nil, locale = nil)
@exchange_id = exchange_id
@tag = tag
@type = type
@@ -3014,96 +2084,18 @@ class ManufacturerRequest
@@schema_type = "ManufacturerRequest"
@@schema_ns = "http://soap.amazon.com"
- def manufacturer
- @manufacturer
- end
-
- def manufacturer=(value)
- @manufacturer = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def mode
- @mode
- end
-
- def mode=(value)
- @mode = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
+ attr_accessor :manufacturer
+ attr_accessor :page
+ attr_accessor :mode
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :sort
+ attr_accessor :locale
+ attr_accessor :keywords
+ attr_accessor :price
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def keywords
- @keywords
- end
-
- def keywords=(value)
- @keywords = value
- end
-
- def price
- @price
- end
-
- def price=(value)
- @price = value
- end
-
- def initialize(manufacturer = nil,
- page = nil,
- mode = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- sort = nil,
- locale = nil,
- keywords = nil,
- price = nil)
+ def initialize(manufacturer = nil, page = nil, mode = nil, tag = nil, type = nil, devtag = nil, sort = nil, locale = nil, keywords = nil, price = nil)
@manufacturer = manufacturer
@page = page
@mode = mode
@@ -3122,60 +2114,14 @@ class ListManiaRequest
@@schema_type = "ListManiaRequest"
@@schema_ns = "http://soap.amazon.com"
- def lm_id
- @lm_id
- end
+ attr_accessor :lm_id
+ attr_accessor :page
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :locale
- def lm_id=(value)
- @lm_id = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def initialize(lm_id = nil,
- page = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- locale = nil)
+ def initialize(lm_id = nil, page = nil, tag = nil, type = nil, devtag = nil, locale = nil)
@lm_id = lm_id
@page = page
@tag = tag
@@ -3190,60 +2136,14 @@ class WishlistRequest
@@schema_type = "WishlistRequest"
@@schema_ns = "http://soap.amazon.com"
- def wishlist_id
- @wishlist_id
- end
-
- def wishlist_id=(value)
- @wishlist_id = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def locale
- @locale
- end
+ attr_accessor :wishlist_id
+ attr_accessor :page
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :locale
- def locale=(value)
- @locale = value
- end
-
- def initialize(wishlist_id = nil,
- page = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- locale = nil)
+ def initialize(wishlist_id = nil, page = nil, tag = nil, type = nil, devtag = nil, locale = nil)
@wishlist_id = wishlist_id
@page = page
@tag = tag
@@ -3258,150 +2158,24 @@ class MarketplaceRequest
@@schema_type = "MarketplaceRequest"
@@schema_ns = "http://soap.amazon.com"
- def marketplace_search
- @marketplace_search
- end
-
- def marketplace_search=(value)
- @marketplace_search = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def keyword
- @keyword
- end
-
- def keyword=(value)
- @keyword = value
- end
-
- def keyword_search
- @keyword_search
- end
-
- def keyword_search=(value)
- @keyword_search = value
- end
-
- def browse_id
- @browse_id
- end
-
- def browse_id=(value)
- @browse_id = value
- end
-
- def zipcode
- @zipcode
- end
-
- def zipcode=(value)
- @zipcode = value
- end
-
- def area_id
- @area_id
- end
-
- def area_id=(value)
- @area_id = value
- end
-
- def geo
- @geo
- end
-
- def geo=(value)
- @geo = value
- end
-
- def sort
- @sort
- end
-
- def sort=(value)
- @sort = value
- end
-
- def listing_id
- @listing_id
- end
-
- def listing_id=(value)
- @listing_id = value
- end
-
- def desc
- @desc
- end
-
- def desc=(value)
- @desc = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def index
- @index
- end
-
- def index=(value)
- @index = value
- end
-
- def initialize(marketplace_search = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- page = nil,
- keyword = nil,
- keyword_search = nil,
- browse_id = nil,
- zipcode = nil,
- area_id = nil,
- geo = nil,
- sort = nil,
- listing_id = nil,
- desc = nil,
- locale = nil,
- index = nil)
+ attr_accessor :marketplace_search
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :page
+ attr_accessor :keyword
+ attr_accessor :keyword_search
+ attr_accessor :browse_id
+ attr_accessor :zipcode
+ attr_accessor :area_id
+ attr_accessor :geo
+ attr_accessor :sort
+ attr_accessor :listing_id
+ attr_accessor :desc
+ attr_accessor :locale
+ attr_accessor :index
+
+ def initialize(marketplace_search = nil, tag = nil, type = nil, devtag = nil, page = nil, keyword = nil, keyword_search = nil, browse_id = nil, zipcode = nil, area_id = nil, geo = nil, sort = nil, listing_id = nil, desc = nil, locale = nil, index = nil)
@marketplace_search = marketplace_search
@tag = tag
@type = type
@@ -3426,69 +2200,15 @@ class SellerProfileRequest
@@schema_type = "SellerProfileRequest"
@@schema_ns = "http://soap.amazon.com"
- def seller_id
- @seller_id
- end
-
- def seller_id=(value)
- @seller_id = value
- end
+ attr_accessor :seller_id
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :page
+ attr_accessor :desc
+ attr_accessor :locale
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def desc
- @desc
- end
-
- def desc=(value)
- @desc = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def initialize(seller_id = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- page = nil,
- desc = nil,
- locale = nil)
+ def initialize(seller_id = nil, tag = nil, type = nil, devtag = nil, page = nil, desc = nil, locale = nil)
@seller_id = seller_id
@tag = tag
@type = type
@@ -3504,105 +2224,19 @@ class SellerRequest
@@schema_type = "SellerRequest"
@@schema_ns = "http://soap.amazon.com"
- def seller_id
- @seller_id
- end
-
- def seller_id=(value)
- @seller_id = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def offerstatus
- @offerstatus
- end
-
- def offerstatus=(value)
- @offerstatus = value
- end
-
- def page
- @page
- end
-
- def page=(value)
- @page = value
- end
-
- def seller_browse_id
- @seller_browse_id
- end
-
- def seller_browse_id=(value)
- @seller_browse_id = value
- end
-
- def keyword
- @keyword
- end
-
- def keyword=(value)
- @keyword = value
- end
-
- def desc
- @desc
- end
-
- def desc=(value)
- @desc = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
+ attr_accessor :seller_id
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :offerstatus
+ attr_accessor :page
+ attr_accessor :seller_browse_id
+ attr_accessor :keyword
+ attr_accessor :desc
+ attr_accessor :locale
+ attr_accessor :index
- def index
- @index
- end
-
- def index=(value)
- @index = value
- end
-
- def initialize(seller_id = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- offerstatus = nil,
- page = nil,
- seller_browse_id = nil,
- keyword = nil,
- desc = nil,
- locale = nil,
- index = nil)
+ def initialize(seller_id = nil, tag = nil, type = nil, devtag = nil, offerstatus = nil, page = nil, seller_browse_id = nil, keyword = nil, desc = nil, locale = nil, index = nil)
@seller_id = seller_id
@tag = tag
@type = type
@@ -3622,51 +2256,13 @@ class SimilarityRequest
@@schema_type = "SimilarityRequest"
@@schema_ns = "http://soap.amazon.com"
- def asin
- @asin
- end
+ attr_accessor :asin
+ attr_accessor :tag
+ attr_accessor :type
+ attr_accessor :devtag
+ attr_accessor :locale
- def asin=(value)
- @asin = value
- end
-
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def type
- @type
- end
-
- def type=(value)
- @type = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def initialize(asin = nil,
- tag = nil,
- type = nil,
- devtag = nil,
- locale = nil)
+ def initialize(asin = nil, tag = nil, type = nil, devtag = nil, locale = nil)
@asin = asin
@tag = tag
@type = type
@@ -3677,14 +2273,12 @@ end
# http://soap.amazon.com
class ItemIdArray < Array
- # Contents type should be dumped here...
@@schema_type = "ItemIdArray"
@@schema_ns = "http://soap.amazon.com"
end
# http://soap.amazon.com
class ItemArray < Array
- # Contents type should be dumped here...
@@schema_type = "ItemArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -3697,7 +2291,7 @@ class Item
def ItemId
@itemId
end
-
+
def ItemId=(value)
@itemId = value
end
@@ -3705,7 +2299,7 @@ class Item
def ProductName
@productName
end
-
+
def ProductName=(value)
@productName = value
end
@@ -3713,7 +2307,7 @@ class Item
def Catalog
@catalog
end
-
+
def Catalog=(value)
@catalog = value
end
@@ -3721,7 +2315,7 @@ class Item
def Asin
@asin
end
-
+
def Asin=(value)
@asin = value
end
@@ -3729,7 +2323,7 @@ class Item
def ExchangeId
@exchangeId
end
-
+
def ExchangeId=(value)
@exchangeId = value
end
@@ -3737,7 +2331,7 @@ class Item
def Quantity
@quantity
end
-
+
def Quantity=(value)
@quantity = value
end
@@ -3745,7 +2339,7 @@ class Item
def ListPrice
@listPrice
end
-
+
def ListPrice=(value)
@listPrice = value
end
@@ -3753,7 +2347,7 @@ class Item
def OurPrice
@ourPrice
end
-
+
def OurPrice=(value)
@ourPrice = value
end
@@ -3761,20 +2355,12 @@ class Item
def MerchantSku
@merchantSku
end
-
+
def MerchantSku=(value)
@merchantSku = value
end
- def initialize(itemId = nil,
- productName = nil,
- catalog = nil,
- asin = nil,
- exchangeId = nil,
- quantity = nil,
- listPrice = nil,
- ourPrice = nil,
- merchantSku = nil)
+ def initialize(itemId = nil, productName = nil, catalog = nil, asin = nil, exchangeId = nil, quantity = nil, listPrice = nil, ourPrice = nil, merchantSku = nil)
@itemId = itemId
@productName = productName
@catalog = catalog
@@ -3789,7 +2375,6 @@ end
# http://soap.amazon.com
class ItemQuantityArray < Array
- # Contents type should be dumped here...
@@schema_type = "ItemQuantityArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -3802,7 +2387,7 @@ class ItemQuantity
def ItemId
@itemId
end
-
+
def ItemId=(value)
@itemId = value
end
@@ -3810,13 +2395,12 @@ class ItemQuantity
def Quantity
@quantity
end
-
+
def Quantity=(value)
@quantity = value
end
- def initialize(itemId = nil,
- quantity = nil)
+ def initialize(itemId = nil, quantity = nil)
@itemId = itemId
@quantity = quantity
end
@@ -3824,7 +2408,6 @@ end
# http://soap.amazon.com
class AddItemArray < Array
- # Contents type should be dumped here...
@@schema_type = "AddItemArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -3837,7 +2420,7 @@ class AddItem
def ParentAsin
@parentAsin
end
-
+
def ParentAsin=(value)
@parentAsin = value
end
@@ -3845,7 +2428,7 @@ class AddItem
def Asin
@asin
end
-
+
def Asin=(value)
@asin = value
end
@@ -3853,7 +2436,7 @@ class AddItem
def MerchantId
@merchantId
end
-
+
def MerchantId=(value)
@merchantId = value
end
@@ -3861,7 +2444,7 @@ class AddItem
def ExchangeId
@exchangeId
end
-
+
def ExchangeId=(value)
@exchangeId = value
end
@@ -3869,16 +2452,12 @@ class AddItem
def Quantity
@quantity
end
-
+
def Quantity=(value)
@quantity = value
end
- def initialize(parentAsin = nil,
- asin = nil,
- merchantId = nil,
- exchangeId = nil,
- quantity = nil)
+ def initialize(parentAsin = nil, asin = nil, merchantId = nil, exchangeId = nil, quantity = nil)
@parentAsin = parentAsin
@asin = asin
@merchantId = merchantId
@@ -3895,7 +2474,7 @@ class ShoppingCart
def CartId
@cartId
end
-
+
def CartId=(value)
@cartId = value
end
@@ -3903,7 +2482,7 @@ class ShoppingCart
def HMAC
@hMAC
end
-
+
def HMAC=(value)
@hMAC = value
end
@@ -3911,7 +2490,7 @@ class ShoppingCart
def PurchaseUrl
@purchaseUrl
end
-
+
def PurchaseUrl=(value)
@purchaseUrl = value
end
@@ -3919,7 +2498,7 @@ class ShoppingCart
def Items
@items
end
-
+
def Items=(value)
@items = value
end
@@ -3927,16 +2506,12 @@ class ShoppingCart
def SimilarProducts
@similarProducts
end
-
+
def SimilarProducts=(value)
@similarProducts = value
end
- def initialize(cartId = nil,
- hMAC = nil,
- purchaseUrl = nil,
- items = nil,
- similarProducts = nil)
+ def initialize(cartId = nil, hMAC = nil, purchaseUrl = nil, items = nil, similarProducts = nil)
@cartId = cartId
@hMAC = hMAC
@purchaseUrl = purchaseUrl
@@ -3950,26 +2525,15 @@ class GetShoppingCartRequest
@@schema_type = "GetShoppingCartRequest"
@@schema_ns = "http://soap.amazon.com"
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
+ attr_accessor :tag
+ attr_accessor :devtag
+ attr_accessor :locale
+ attr_accessor :sims
def CartId
@cartId
end
-
+
def CartId=(value)
@cartId = value
end
@@ -3977,33 +2541,12 @@ class GetShoppingCartRequest
def HMAC
@hMAC
end
-
+
def HMAC=(value)
@hMAC = value
end
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def sims
- @sims
- end
-
- def sims=(value)
- @sims = value
- end
-
- def initialize(tag = nil,
- devtag = nil,
- cartId = nil,
- hMAC = nil,
- locale = nil,
- sims = nil)
+ def initialize(tag = nil, devtag = nil, cartId = nil, hMAC = nil, locale = nil, sims = nil)
@tag = tag
@devtag = devtag
@cartId = cartId
@@ -4018,26 +2561,14 @@ class ClearShoppingCartRequest
@@schema_type = "ClearShoppingCartRequest"
@@schema_ns = "http://soap.amazon.com"
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
+ attr_accessor :tag
+ attr_accessor :devtag
+ attr_accessor :locale
def CartId
@cartId
end
-
+
def CartId=(value)
@cartId = value
end
@@ -4045,24 +2576,12 @@ class ClearShoppingCartRequest
def HMAC
@hMAC
end
-
+
def HMAC=(value)
@hMAC = value
end
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def initialize(tag = nil,
- devtag = nil,
- cartId = nil,
- hMAC = nil,
- locale = nil)
+ def initialize(tag = nil, devtag = nil, cartId = nil, hMAC = nil, locale = nil)
@tag = tag
@devtag = devtag
@cartId = cartId
@@ -4076,26 +2595,15 @@ class AddShoppingCartItemsRequest
@@schema_type = "AddShoppingCartItemsRequest"
@@schema_ns = "http://soap.amazon.com"
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
+ attr_accessor :tag
+ attr_accessor :devtag
+ attr_accessor :locale
+ attr_accessor :sims
def CartId
@cartId
end
-
+
def CartId=(value)
@cartId = value
end
@@ -4103,7 +2611,7 @@ class AddShoppingCartItemsRequest
def HMAC
@hMAC
end
-
+
def HMAC=(value)
@hMAC = value
end
@@ -4111,34 +2619,12 @@ class AddShoppingCartItemsRequest
def Items
@items
end
-
+
def Items=(value)
@items = value
end
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def sims
- @sims
- end
-
- def sims=(value)
- @sims = value
- end
-
- def initialize(tag = nil,
- devtag = nil,
- cartId = nil,
- hMAC = nil,
- items = nil,
- locale = nil,
- sims = nil)
+ def initialize(tag = nil, devtag = nil, cartId = nil, hMAC = nil, items = nil, locale = nil, sims = nil)
@tag = tag
@devtag = devtag
@cartId = cartId
@@ -4154,26 +2640,15 @@ class RemoveShoppingCartItemsRequest
@@schema_type = "RemoveShoppingCartItemsRequest"
@@schema_ns = "http://soap.amazon.com"
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
+ attr_accessor :tag
+ attr_accessor :devtag
+ attr_accessor :locale
+ attr_accessor :sims
def CartId
@cartId
end
-
+
def CartId=(value)
@cartId = value
end
@@ -4181,7 +2656,7 @@ class RemoveShoppingCartItemsRequest
def HMAC
@hMAC
end
-
+
def HMAC=(value)
@hMAC = value
end
@@ -4189,34 +2664,12 @@ class RemoveShoppingCartItemsRequest
def Items
@items
end
-
+
def Items=(value)
@items = value
end
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def sims
- @sims
- end
-
- def sims=(value)
- @sims = value
- end
-
- def initialize(tag = nil,
- devtag = nil,
- cartId = nil,
- hMAC = nil,
- items = nil,
- locale = nil,
- sims = nil)
+ def initialize(tag = nil, devtag = nil, cartId = nil, hMAC = nil, items = nil, locale = nil, sims = nil)
@tag = tag
@devtag = devtag
@cartId = cartId
@@ -4232,26 +2685,15 @@ class ModifyShoppingCartItemsRequest
@@schema_type = "ModifyShoppingCartItemsRequest"
@@schema_ns = "http://soap.amazon.com"
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
+ attr_accessor :tag
+ attr_accessor :devtag
+ attr_accessor :locale
+ attr_accessor :sims
def CartId
@cartId
end
-
+
def CartId=(value)
@cartId = value
end
@@ -4259,7 +2701,7 @@ class ModifyShoppingCartItemsRequest
def HMAC
@hMAC
end
-
+
def HMAC=(value)
@hMAC = value
end
@@ -4267,34 +2709,12 @@ class ModifyShoppingCartItemsRequest
def Items
@items
end
-
+
def Items=(value)
@items = value
end
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def sims
- @sims
- end
-
- def sims=(value)
- @sims = value
- end
-
- def initialize(tag = nil,
- devtag = nil,
- cartId = nil,
- hMAC = nil,
- items = nil,
- locale = nil,
- sims = nil)
+ def initialize(tag = nil, devtag = nil, cartId = nil, hMAC = nil, items = nil, locale = nil, sims = nil)
@tag = tag
@devtag = devtag
@cartId = cartId
@@ -4307,7 +2727,6 @@ end
# http://soap.amazon.com
class OrderIdArray < Array
- # Contents type should be dumped here...
@@schema_type = "OrderIdArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -4320,7 +2739,7 @@ class Price
def Amount
@amount
end
-
+
def Amount=(value)
@amount = value
end
@@ -4328,13 +2747,12 @@ class Price
def CurrencyCode
@currencyCode
end
-
+
def CurrencyCode=(value)
@currencyCode = value
end
- def initialize(amount = nil,
- currencyCode = nil)
+ def initialize(amount = nil, currencyCode = nil)
@amount = amount
@currencyCode = currencyCode
end
@@ -4348,7 +2766,7 @@ class Package
def TrackingNumber
@trackingNumber
end
-
+
def TrackingNumber=(value)
@trackingNumber = value
end
@@ -4356,13 +2774,12 @@ class Package
def CarrierName
@carrierName
end
-
+
def CarrierName=(value)
@carrierName = value
end
- def initialize(trackingNumber = nil,
- carrierName = nil)
+ def initialize(trackingNumber = nil, carrierName = nil)
@trackingNumber = trackingNumber
@carrierName = carrierName
end
@@ -4370,7 +2787,6 @@ end
# http://soap.amazon.com
class PackageArray < Array
- # Contents type should be dumped here...
@@schema_type = "PackageArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -4383,7 +2799,7 @@ class OrderItem
def ItemNumber
@itemNumber
end
-
+
def ItemNumber=(value)
@itemNumber = value
end
@@ -4391,7 +2807,7 @@ class OrderItem
def ASIN
@aSIN
end
-
+
def ASIN=(value)
@aSIN = value
end
@@ -4399,7 +2815,7 @@ class OrderItem
def ExchangeId
@exchangeId
end
-
+
def ExchangeId=(value)
@exchangeId = value
end
@@ -4407,7 +2823,7 @@ class OrderItem
def Quantity
@quantity
end
-
+
def Quantity=(value)
@quantity = value
end
@@ -4415,7 +2831,7 @@ class OrderItem
def UnitPrice
@unitPrice
end
-
+
def UnitPrice=(value)
@unitPrice = value
end
@@ -4423,17 +2839,12 @@ class OrderItem
def TotalPrice
@totalPrice
end
-
+
def TotalPrice=(value)
@totalPrice = value
end
- def initialize(itemNumber = nil,
- aSIN = nil,
- exchangeId = nil,
- quantity = nil,
- unitPrice = nil,
- totalPrice = nil)
+ def initialize(itemNumber = nil, aSIN = nil, exchangeId = nil, quantity = nil, unitPrice = nil, totalPrice = nil)
@itemNumber = itemNumber
@aSIN = aSIN
@exchangeId = exchangeId
@@ -4445,7 +2856,6 @@ end
# http://soap.amazon.com
class OrderItemArray < Array
- # Contents type should be dumped here...
@@schema_type = "OrderItemArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -4458,7 +2868,7 @@ class ShortSummary
def OrderId
@orderId
end
-
+
def OrderId=(value)
@orderId = value
end
@@ -4466,7 +2876,7 @@ class ShortSummary
def SellerId
@sellerId
end
-
+
def SellerId=(value)
@sellerId = value
end
@@ -4474,7 +2884,7 @@ class ShortSummary
def Condition
@condition
end
-
+
def Condition=(value)
@condition = value
end
@@ -4482,7 +2892,7 @@ class ShortSummary
def TransactionDate
@transactionDate
end
-
+
def TransactionDate=(value)
@transactionDate = value
end
@@ -4490,7 +2900,7 @@ class ShortSummary
def TransactionDateEpoch
@transactionDateEpoch
end
-
+
def TransactionDateEpoch=(value)
@transactionDateEpoch = value
end
@@ -4498,7 +2908,7 @@ class ShortSummary
def Total
@total
end
-
+
def Total=(value)
@total = value
end
@@ -4506,7 +2916,7 @@ class ShortSummary
def Subtotal
@subtotal
end
-
+
def Subtotal=(value)
@subtotal = value
end
@@ -4514,7 +2924,7 @@ class ShortSummary
def Shipping
@shipping
end
-
+
def Shipping=(value)
@shipping = value
end
@@ -4522,7 +2932,7 @@ class ShortSummary
def Tax
@tax
end
-
+
def Tax=(value)
@tax = value
end
@@ -4530,7 +2940,7 @@ class ShortSummary
def Promotion
@promotion
end
-
+
def Promotion=(value)
@promotion = value
end
@@ -4538,7 +2948,7 @@ class ShortSummary
def StoreName
@storeName
end
-
+
def StoreName=(value)
@storeName = value
end
@@ -4546,7 +2956,7 @@ class ShortSummary
def Packages
@packages
end
-
+
def Packages=(value)
@packages = value
end
@@ -4554,7 +2964,7 @@ class ShortSummary
def OrderItems
@orderItems
end
-
+
def OrderItems=(value)
@orderItems = value
end
@@ -4562,7 +2972,7 @@ class ShortSummary
def ErrorCode
@errorCode
end
-
+
def ErrorCode=(value)
@errorCode = value
end
@@ -4570,26 +2980,12 @@ class ShortSummary
def ErrorString
@errorString
end
-
+
def ErrorString=(value)
@errorString = value
end
- def initialize(orderId = nil,
- sellerId = nil,
- condition = nil,
- transactionDate = nil,
- transactionDateEpoch = nil,
- total = nil,
- subtotal = nil,
- shipping = nil,
- tax = nil,
- promotion = nil,
- storeName = nil,
- packages = nil,
- orderItems = nil,
- errorCode = nil,
- errorString = nil)
+ def initialize(orderId = nil, sellerId = nil, condition = nil, transactionDate = nil, transactionDateEpoch = nil, total = nil, subtotal = nil, shipping = nil, tax = nil, promotion = nil, storeName = nil, packages = nil, orderItems = nil, errorCode = nil, errorString = nil)
@orderId = orderId
@sellerId = sellerId
@condition = condition
@@ -4610,7 +3006,6 @@ end
# http://soap.amazon.com
class ShortSummaryArray < Array
- # Contents type should be dumped here...
@@schema_type = "ShortSummaryArray"
@@schema_ns = "http://soap.amazon.com"
end
@@ -4620,51 +3015,20 @@ class GetTransactionDetailsRequest
@@schema_type = "GetTransactionDetailsRequest"
@@schema_ns = "http://soap.amazon.com"
- def tag
- @tag
- end
-
- def tag=(value)
- @tag = value
- end
-
- def devtag
- @devtag
- end
-
- def devtag=(value)
- @devtag = value
- end
-
- def key
- @key
- end
-
- def key=(value)
- @key = value
- end
+ attr_accessor :tag
+ attr_accessor :devtag
+ attr_accessor :key
+ attr_accessor :locale
def OrderIds
@orderIds
end
-
+
def OrderIds=(value)
@orderIds = value
end
- def locale
- @locale
- end
-
- def locale=(value)
- @locale = value
- end
-
- def initialize(tag = nil,
- devtag = nil,
- key = nil,
- orderIds = nil,
- locale = nil)
+ def initialize(tag = nil, devtag = nil, key = nil, orderIds = nil, locale = nil)
@tag = tag
@devtag = devtag
@key = key
@@ -4681,7 +3045,7 @@ class GetTransactionDetailsResponse
def ShortSummaries
@shortSummaries
end
-
+
def ShortSummaries=(value)
@shortSummaries = value
end
diff --git a/sample/wsdl/amazon/AmazonSearchDriver.rb b/sample/wsdl/amazon/AmazonSearchDriver.rb
index 01915e2735..60af68887c 100644
--- a/sample/wsdl/amazon/AmazonSearchDriver.rb
+++ b/sample/wsdl/amazon/AmazonSearchDriver.rb
@@ -2,7 +2,8 @@ require 'AmazonSearch.rb'
require 'soap/rpc/driver'
-class AmazonSearchPort < SOAP::RPC::Driver
+class AmazonSearchPort < ::SOAP::RPC::Driver
+ DefaultEndpointUrl = "http://soap.amazon.com/onca/soap3"
MappingRegistry = ::SOAP::Mapping::Registry.new
MappingRegistry.set(
@@ -331,166 +332,190 @@ class AmazonSearchPort < SOAP::RPC::Driver
)
Methods = [
- ["KeywordSearchRequest", "keywordSearchRequest", [
- ["in", "KeywordSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "KeywordRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["TextStreamSearchRequest", "textStreamSearchRequest", [
- ["in", "TextStreamSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "TextStreamRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["PowerSearchRequest", "powerSearchRequest", [
- ["in", "PowerSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "PowerRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["BrowseNodeSearchRequest", "browseNodeSearchRequest", [
- ["in", "BrowseNodeSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "BrowseNodeRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["AsinSearchRequest", "asinSearchRequest", [
- ["in", "AsinSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "AsinRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["BlendedSearchRequest", "blendedSearchRequest", [
- ["in", "BlendedSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "BlendedRequest"]],
- ["retval", "return",
- [::SOAP::SOAPArray, "http://soap.amazon.com", "ProductLine"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["UpcSearchRequest", "upcSearchRequest", [
- ["in", "UpcSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "UpcRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["SkuSearchRequest", "skuSearchRequest", [
- ["in", "SkuSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "SkuRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["AuthorSearchRequest", "authorSearchRequest", [
- ["in", "AuthorSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "AuthorRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["ArtistSearchRequest", "artistSearchRequest", [
- ["in", "ArtistSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ArtistRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["ActorSearchRequest", "actorSearchRequest", [
- ["in", "ActorSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ActorRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["ManufacturerSearchRequest", "manufacturerSearchRequest", [
- ["in", "ManufacturerSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ManufacturerRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["DirectorSearchRequest", "directorSearchRequest", [
- ["in", "DirectorSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "DirectorRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["ListManiaSearchRequest", "listManiaSearchRequest", [
- ["in", "ListManiaSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ListManiaRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["WishlistSearchRequest", "wishlistSearchRequest", [
- ["in", "WishlistSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "WishlistRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["ExchangeSearchRequest", "exchangeSearchRequest", [
- ["in", "ExchangeSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ExchangeRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ListingProductDetails"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["MarketplaceSearchRequest", "marketplaceSearchRequest", [
- ["in", "MarketplaceSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "MarketplaceRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "MarketplaceSearch"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["SellerProfileSearchRequest", "sellerProfileSearchRequest", [
- ["in", "SellerProfileSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "SellerProfileRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "SellerProfile"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["SellerSearchRequest", "sellerSearchRequest", [
- ["in", "SellerSearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "SellerRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "SellerSearch"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["SimilaritySearchRequest", "similaritySearchRequest", [
- ["in", "SimilaritySearchRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "SimilarityRequest"]],
- ["retval", "return",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["GetShoppingCartRequest", "getShoppingCartRequest", [
- ["in", "GetShoppingCartRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "GetShoppingCartRequest"]],
- ["retval", "ShoppingCart",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["ClearShoppingCartRequest", "clearShoppingCartRequest", [
- ["in", "ClearShoppingCartRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ClearShoppingCartRequest"]],
- ["retval", "ShoppingCart",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["AddShoppingCartItemsRequest", "addShoppingCartItemsRequest", [
- ["in", "AddShoppingCartItemsRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "AddShoppingCartItemsRequest"]],
- ["retval", "ShoppingCart",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["RemoveShoppingCartItemsRequest", "removeShoppingCartItemsRequest", [
- ["in", "RemoveShoppingCartItemsRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "RemoveShoppingCartItemsRequest"]],
- ["retval", "ShoppingCart",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["ModifyShoppingCartItemsRequest", "modifyShoppingCartItemsRequest", [
- ["in", "ModifyShoppingCartItemsRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ModifyShoppingCartItemsRequest"]],
- ["retval", "ShoppingCart",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"],
- ["GetTransactionDetailsRequest", "getTransactionDetailsRequest", [
- ["in", "GetTransactionDetailsRequest",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "GetTransactionDetailsRequest"]],
- ["retval", "GetTransactionDetailsResponse",
- [::SOAP::SOAPStruct, "http://soap.amazon.com", "GetTransactionDetailsResponse"]]],
- "http://soap.amazon.com", "http://soap.amazon.com"]
+ ["KeywordSearchRequest", "keywordSearchRequest",
+ [
+ ["in", "KeywordSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "KeywordRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["TextStreamSearchRequest", "textStreamSearchRequest",
+ [
+ ["in", "TextStreamSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "TextStreamRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["PowerSearchRequest", "powerSearchRequest",
+ [
+ ["in", "PowerSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "PowerRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["BrowseNodeSearchRequest", "browseNodeSearchRequest",
+ [
+ ["in", "BrowseNodeSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "BrowseNodeRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["AsinSearchRequest", "asinSearchRequest",
+ [
+ ["in", "AsinSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "AsinRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["BlendedSearchRequest", "blendedSearchRequest",
+ [
+ ["in", "BlendedSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "BlendedRequest"]],
+ ["retval", "return", [::SOAP::SOAPArray, "http://soap.amazon.com", "ProductLine"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["UpcSearchRequest", "upcSearchRequest",
+ [
+ ["in", "UpcSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "UpcRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["SkuSearchRequest", "skuSearchRequest",
+ [
+ ["in", "SkuSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "SkuRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["AuthorSearchRequest", "authorSearchRequest",
+ [
+ ["in", "AuthorSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "AuthorRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["ArtistSearchRequest", "artistSearchRequest",
+ [
+ ["in", "ArtistSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ArtistRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["ActorSearchRequest", "actorSearchRequest",
+ [
+ ["in", "ActorSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ActorRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["ManufacturerSearchRequest", "manufacturerSearchRequest",
+ [
+ ["in", "ManufacturerSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ManufacturerRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["DirectorSearchRequest", "directorSearchRequest",
+ [
+ ["in", "DirectorSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "DirectorRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["ListManiaSearchRequest", "listManiaSearchRequest",
+ [
+ ["in", "ListManiaSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ListManiaRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["WishlistSearchRequest", "wishlistSearchRequest",
+ [
+ ["in", "WishlistSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "WishlistRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["ExchangeSearchRequest", "exchangeSearchRequest",
+ [
+ ["in", "ExchangeSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ExchangeRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ListingProductDetails"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["MarketplaceSearchRequest", "marketplaceSearchRequest",
+ [
+ ["in", "MarketplaceSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "MarketplaceRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "MarketplaceSearch"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["SellerProfileSearchRequest", "sellerProfileSearchRequest",
+ [
+ ["in", "SellerProfileSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "SellerProfileRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "SellerProfile"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["SellerSearchRequest", "sellerSearchRequest",
+ [
+ ["in", "SellerSearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "SellerRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "SellerSearch"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["SimilaritySearchRequest", "similaritySearchRequest",
+ [
+ ["in", "SimilaritySearchRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "SimilarityRequest"]],
+ ["retval", "return", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ProductInfo"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["GetShoppingCartRequest", "getShoppingCartRequest",
+ [
+ ["in", "GetShoppingCartRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "GetShoppingCartRequest"]],
+ ["retval", "ShoppingCart", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["ClearShoppingCartRequest", "clearShoppingCartRequest",
+ [
+ ["in", "ClearShoppingCartRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ClearShoppingCartRequest"]],
+ ["retval", "ShoppingCart", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["AddShoppingCartItemsRequest", "addShoppingCartItemsRequest",
+ [
+ ["in", "AddShoppingCartItemsRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "AddShoppingCartItemsRequest"]],
+ ["retval", "ShoppingCart", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["RemoveShoppingCartItemsRequest", "removeShoppingCartItemsRequest",
+ [
+ ["in", "RemoveShoppingCartItemsRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "RemoveShoppingCartItemsRequest"]],
+ ["retval", "ShoppingCart", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["ModifyShoppingCartItemsRequest", "modifyShoppingCartItemsRequest",
+ [
+ ["in", "ModifyShoppingCartItemsRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ModifyShoppingCartItemsRequest"]],
+ ["retval", "ShoppingCart", [::SOAP::SOAPStruct, "http://soap.amazon.com", "ShoppingCart"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ],
+ ["GetTransactionDetailsRequest", "getTransactionDetailsRequest",
+ [
+ ["in", "GetTransactionDetailsRequest", [::SOAP::SOAPStruct, "http://soap.amazon.com", "GetTransactionDetailsRequest"]],
+ ["retval", "GetTransactionDetailsResponse", [::SOAP::SOAPStruct, "http://soap.amazon.com", "GetTransactionDetailsResponse"]]
+ ],
+ "http://soap.amazon.com", "http://soap.amazon.com"
+ ]
]
- DefaultEndpointUrl = "http://soap.amazon.com/onca/soap3"
-
def initialize(endpoint_url = nil)
endpoint_url ||= DefaultEndpointUrl
super(endpoint_url, nil)
@@ -498,7 +523,7 @@ class AmazonSearchPort < SOAP::RPC::Driver
init_methods
end
-private
+private
def init_methods
Methods.each do |name_as, name, params, soapaction, namespace|
diff --git a/sample/wsdl/raa2.4/raa.rb b/sample/wsdl/raa2.4/raa.rb
new file mode 100644
index 0000000000..9b4c4e41aa
--- /dev/null
+++ b/sample/wsdl/raa2.4/raa.rb
@@ -0,0 +1,332 @@
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class Gem
+ @@schema_type = "Gem"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def id
+ @id
+ end
+
+ def id=(value)
+ @id = value
+ end
+
+ def category
+ @category
+ end
+
+ def category=(value)
+ @category = value
+ end
+
+ def owner
+ @owner
+ end
+
+ def owner=(value)
+ @owner = value
+ end
+
+ def project
+ @project
+ end
+
+ def project=(value)
+ @project = value
+ end
+
+ def updated
+ @updated
+ end
+
+ def updated=(value)
+ @updated = value
+ end
+
+ def created
+ @created
+ end
+
+ def created=(value)
+ @created = value
+ end
+
+ def initialize(id = nil,
+ category = nil,
+ owner = nil,
+ project = nil,
+ updated = nil,
+ created = nil)
+ @id = id
+ @category = category
+ @owner = owner
+ @project = project
+ @updated = updated
+ @created = created
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class Category
+ @@schema_type = "Category"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def major
+ @major
+ end
+
+ def major=(value)
+ @major = value
+ end
+
+ def minor
+ @minor
+ end
+
+ def minor=(value)
+ @minor = value
+ end
+
+ def initialize(major = nil,
+ minor = nil)
+ @major = major
+ @minor = minor
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class Owner
+ @@schema_type = "Owner"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def id
+ @id
+ end
+
+ def id=(value)
+ @id = value
+ end
+
+ def email
+ @email
+ end
+
+ def email=(value)
+ @email = value
+ end
+
+ def name
+ @name
+ end
+
+ def name=(value)
+ @name = value
+ end
+
+ def initialize(id = nil,
+ email = nil,
+ name = nil)
+ @id = id
+ @email = email
+ @name = name
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class Project
+ @@schema_type = "Project"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def name
+ @name
+ end
+
+ def name=(value)
+ @name = value
+ end
+
+ def short_description
+ @short_description
+ end
+
+ def short_description=(value)
+ @short_description = value
+ end
+
+ def version
+ @version
+ end
+
+ def version=(value)
+ @version = value
+ end
+
+ def status
+ @status
+ end
+
+ def status=(value)
+ @status = value
+ end
+
+ def url
+ @url
+ end
+
+ def url=(value)
+ @url = value
+ end
+
+ def download
+ @download
+ end
+
+ def download=(value)
+ @download = value
+ end
+
+ def license
+ @license
+ end
+
+ def license=(value)
+ @license = value
+ end
+
+ def description
+ @description
+ end
+
+ def description=(value)
+ @description = value
+ end
+
+ def updated
+ @updated
+ end
+
+ def updated=(value)
+ @updated = value
+ end
+
+ def history
+ @history
+ end
+
+ def history=(value)
+ @history = value
+ end
+
+ def dependency
+ @dependency
+ end
+
+ def dependency=(value)
+ @dependency = value
+ end
+
+ def initialize(name = nil,
+ short_description = nil,
+ version = nil,
+ status = nil,
+ url = nil,
+ download = nil,
+ license = nil,
+ description = nil,
+ updated = nil,
+ history = nil,
+ dependency = nil)
+ @name = name
+ @short_description = short_description
+ @version = version
+ @status = status
+ @url = url
+ @download = download
+ @license = license
+ @description = description
+ @updated = updated
+ @history = history
+ @dependency = dependency
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class ProjectDependency
+ @@schema_type = "ProjectDependency"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+
+ def project
+ @project
+ end
+
+ def project=(value)
+ @project = value
+ end
+
+ def version
+ @version
+ end
+
+ def version=(value)
+ @version = value
+ end
+
+ def description
+ @description
+ end
+
+ def description=(value)
+ @description = value
+ end
+
+ def initialize(project = nil,
+ version = nil,
+ description = nil)
+ @project = project
+ @version = version
+ @description = description
+ end
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class GemArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "GemArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class OwnerArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "OwnerArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class ProjectArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "ProjectArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class ProjectDependencyArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "ProjectDependencyArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
+class StringArray < Array
+ # Contents type should be dumped here...
+ @@schema_type = "StringArray"
+ @@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
+end
+
+# http://xml.apache.org/xml-soap
+class Map < Array
+ # Contents type should be dumped here...
+ @@schema_type = "Map"
+ @@schema_ns = "http://xml.apache.org/xml-soap"
+end
+
diff --git a/sample/wsdl/raa2.4/wsdlDriver.rb b/sample/wsdl/raa2.4/wsdlDriver.rb
new file mode 100644
index 0000000000..bc5fb19982
--- /dev/null
+++ b/sample/wsdl/raa2.4/wsdlDriver.rb
@@ -0,0 +1,117 @@
+#!/usr/bin/env ruby
+
+# You can generate raa.rb required here with the command;
+# wsdl2ruby.rb --wsdl http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/ --classdef
+require 'raa'
+require 'soap/wsdlDriver'
+require 'pp'
+
+RAA_WSDL = 'http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/'
+
+raa = SOAP::WSDLDriverFactory.new(RAA_WSDL).create_driver
+raa.generate_explicit_type = true
+# raa.wiredump_dev = STDERR
+
+def sec(msg)
+ puts
+ puts "--------"
+ puts "-- " + msg
+ puts
+end
+
+def subsec(msg)
+ puts "-- " + msg
+end
+
+sec("retrieve a gem (RAA Information) which has specified name")
+name = 'soap4r'
+pp raa.gem(name)
+
+sec("retrieve dependents of the project")
+name = 'http-access2'; version = nil
+pp raa.dependents(name, version)
+
+sec("number of registered gems")
+puts raa.size
+
+sec("retrieve all registered gem names")
+p raa.names
+
+sec("retrieve gems of specified category")
+major = 'Library'; minor = 'XML'
+p raa.list_by_category(major, minor)
+
+sec("retrieve category tree")
+pp raa.tree_by_category
+
+sec("retrieve gems which is updated recently")
+idx = 0
+p raa.list_recent_updated(idx)
+subsec("next 10 gems")
+idx += 1
+p raa.list_recent_updated(idx)
+subsec("next 10 gems")
+idx += 1
+p raa.list_recent_updated(idx)
+
+sec("retrieve gems which is created recently")
+p raa.list_recent_created(idx)
+
+sec("retrieve gems which is updated in 7 days")
+date = Time.now - 7 * 24 * 60 * 60; idx = 0
+p raa.list_updated_since(date, idx)
+
+sec("retrieve gems which is created in 7 days")
+p raa.list_created_since(date, idx)
+
+sec("retrieve gems of specified owner")
+owner_id = 8 # NaHi
+p raa.list_by_owner(owner_id)
+
+sec("search gems with keyword")
+substring = 'soap'
+pp raa.search(substring)
+
+# There are several search interface to search a field explicitly.
+# puts raa.search_name(substring, idx)
+# puts raa.search_short_description(substring, idx)
+# puts raa.search_owner(substring, idx)
+# puts raa.search_version(substring, idx)
+# puts raa.search_status(substring, idx)
+# puts raa.search_description(substring, idx)
+
+sec("retrieve owner info")
+owner_id = 8
+pp raa.owner(owner_id)
+
+sec("retrieve owners")
+idx = 0
+p raa.list_owner(idx)
+
+sec("update 'sampleproject'")
+name = 'sampleproject'
+pass = 'sampleproject'
+gem = raa.gem(name)
+p gem.project.version
+gem.project.version.succ!
+gem.updated = Time.now
+raa.update(name, pass, gem)
+p raa.gem(name).project.version
+
+sec("update pass phrase")
+raa.update_pass(name, 'sampleproject', 'foo')
+subsec("update check")
+gem = raa.gem(name)
+gem.project.description = 'Current pass phrase is "foo"'
+gem.updated = Time.now
+raa.update(name, 'foo', gem)
+#
+subsec("recover pass phrase")
+raa.update_pass(name, 'foo', 'sampleproject')
+subsec("update check")
+gem = raa.gem(name)
+gem.project.description = 'Current pass phrase is "sampleproject"'
+gem.updated = Time.now
+raa.update(name, 'sampleproject', gem)
+
+sec("done")
diff --git a/test/soap/calc/test_calc_cgi.rb b/test/soap/calc/test_calc_cgi.rb
index accf7b0ae5..d1655b0b01 100644
--- a/test/soap/calc/test_calc_cgi.rb
+++ b/test/soap/calc/test_calc_cgi.rb
@@ -2,13 +2,7 @@ require 'test/unit'
require 'soap/rpc/driver'
require 'logger'
require 'webrick'
-begin
- loadpath = $:.dup
- $:.replace($: | [File.expand_path("../../ruby", File.dirname(__FILE__))])
- require 'envutil'
-ensure
- $:.replace(loadpath)
-end
+require 'rbconfig'
module SOAP
@@ -16,7 +10,11 @@ module Calc
class TestCalcCGI < Test::Unit::TestCase
- RUBYBIN = EnvUtil.rubybin
+ # This test shuld be run after installing ruby.
+ RUBYBIN = File.join(
+ Config::CONFIG["bindir"],
+ Config::CONFIG["ruby_install_name"] + Config::CONFIG["EXEEXT"]
+ )
RUBYBIN << " -d" if $DEBUG
Port = 17171
diff --git a/test/soap/header/server.cgi b/test/soap/header/server.cgi
new file mode 100644
index 0000000000..f9739d0d15
--- /dev/null
+++ b/test/soap/header/server.cgi
@@ -0,0 +1,119 @@
+require 'pstore'
+require 'soap/rpc/cgistub'
+require 'soap/header/simplehandler'
+
+
+class AuthHeaderPortServer < SOAP::RPC::CGIStub
+ PortName = 'http://tempuri.org/authHeaderPort'
+ SupportPortName = 'http://tempuri.org/authHeaderSupportPort'
+ MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
+ SessionDB = File.join(File.expand_path(File.dirname(__FILE__)), 'session.pstoredb')
+
+ class AuthHeaderService
+ def self.create
+ new
+ end
+
+ def deposit(amt)
+ "deposit #{amt} OK"
+ end
+
+ def withdrawal(amt)
+ "withdrawal #{amt} OK"
+ end
+ end
+
+ class AuthHeaderSupportService
+ def delete_sessiondb
+ File.unlink(SessionDB) if File.file?(SessionDB)
+ backup = SessionDB + "~"
+ File.unlink(backup) if File.file?(backup)
+ end
+ end
+
+ def initialize(*arg)
+ super
+ add_rpc_servant(AuthHeaderService.new, PortName)
+ add_rpc_servant(AuthHeaderSupportService.new, SupportPortName)
+ add_rpc_headerhandler(ServerAuthHeaderHandler.new)
+ end
+
+ class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
+ Users = {
+ 'NaHi' => 'passwd',
+ 'HiNa' => 'wspass'
+ }
+
+ def initialize
+ super(MyHeaderName)
+ @db = PStore.new(SessionDB)
+ @db.transaction do
+ @db["root"] = {} unless @db.root?("root")
+ end
+ @userid = @sessionid = nil
+ end
+
+ def login(userid, passwd)
+ userid and passwd and Users[userid] == passwd
+ end
+
+ def auth(sessionid)
+ in_sessiondb do |root|
+ root[sessionid][0]
+ end
+ end
+
+ def create_session(userid)
+ in_sessiondb do |root|
+ while true
+ key = create_sessionkey
+ break unless root[key]
+ end
+ root[key] = [userid]
+ key
+ end
+ end
+
+ def destroy_session(sessionkey)
+ in_sessiondb do |root|
+ root.delete(sessionkey)
+ end
+ end
+
+ def on_simple_outbound
+ { "sessionid" => @sessionid }
+ end
+
+ def on_simple_inbound(my_header, mu)
+ auth = false
+ userid = my_header["userid"]
+ passwd = my_header["passwd"]
+ if login(userid, passwd)
+ auth = true
+ elsif sessionid = my_header["sessionid"]
+ if userid = auth(sessionid)
+ destroy_session(sessionid)
+ auth = true
+ end
+ end
+ raise RuntimeError.new("authentication failed") unless auth
+ @userid = userid
+ @sessionid = create_session(userid)
+ end
+
+ private
+
+ def create_sessionkey
+ Time.now.usec.to_s
+ end
+
+ def in_sessiondb
+ @db.transaction do
+ yield(@db["root"])
+ end
+ end
+ end
+end
+
+
+status = AuthHeaderPortServer.new('AuthHeaderPortServer', nil).start
diff --git a/test/soap/header/test_authheader.rb b/test/soap/header/test_authheader.rb
new file mode 100644
index 0000000000..2c04769dd6
--- /dev/null
+++ b/test/soap/header/test_authheader.rb
@@ -0,0 +1,247 @@
+require 'test/unit'
+require 'soap/rpc/driver'
+require 'soap/rpc/standaloneServer'
+require 'soap/header/simplehandler'
+
+
+module SOAP
+module Header
+
+
+class TestAuthHeader < Test::Unit::TestCase
+ Port = 17171
+ PortName = 'http://tempuri.org/authHeaderPort'
+ MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
+ DummyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "dummy")
+
+ class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
+ class AuthHeaderService
+ def self.create
+ new
+ end
+
+ def deposit(amt)
+ "deposit #{amt} OK"
+ end
+
+ def withdrawal(amt)
+ "withdrawal #{amt} OK"
+ end
+ end
+
+ def initialize(*arg)
+ super
+ add_rpc_servant(AuthHeaderService.new, PortName)
+ ServerAuthHeaderHandler.init
+ add_rpc_request_headerhandler(ServerAuthHeaderHandler)
+ end
+
+ class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
+ class << self
+ def create
+ new
+ end
+
+ def init
+ @users = {
+ 'NaHi' => 'passwd',
+ 'HiNa' => 'wspass'
+ }
+ @sessions = {}
+ end
+
+ def login(userid, passwd)
+ userid and passwd and @users[userid] == passwd
+ end
+
+ def auth(sessionid)
+ @sessions[sessionid][0]
+ end
+
+ def create_session(userid)
+ while true
+ key = create_sessionkey
+ break unless @sessions[key]
+ end
+ @sessions[key] = [userid]
+ key
+ end
+
+ def destroy_session(sessionkey)
+ @sessions.delete(sessionkey)
+ end
+
+ def sessions
+ @sessions
+ end
+
+ private
+
+ def create_sessionkey
+ Time.now.usec.to_s
+ end
+ end
+
+ def initialize
+ super(MyHeaderName)
+ @userid = @sessionid = nil
+ end
+
+ def on_simple_outbound
+ { "sessionid" => @sessionid }
+ end
+
+ def on_simple_inbound(my_header, mu)
+ auth = false
+ userid = my_header["userid"]
+ passwd = my_header["passwd"]
+ if self.class.login(userid, passwd)
+ auth = true
+ elsif sessionid = my_header["sessionid"]
+ if userid = self.class.auth(sessionid)
+ self.class.destroy_session(sessionid)
+ auth = true
+ end
+ end
+ raise RuntimeError.new("authentication failed") unless auth
+ @userid = userid
+ @sessionid = self.class.create_session(userid)
+ end
+ end
+ end
+
+ class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
+ def initialize(userid, passwd, mustunderstand)
+ super(MyHeaderName)
+ @sessionid = nil
+ @userid = userid
+ @passwd = passwd
+ @mustunderstand = mustunderstand
+ end
+
+ def on_simple_outbound
+ if @sessionid
+ { "sessionid" => @sessionid }
+ else
+ { "userid" => @userid, "passwd" => @passwd }
+ end
+ end
+
+ def on_simple_inbound(my_header, mustunderstand)
+ @sessionid = my_header["sessionid"]
+ end
+
+ def sessionid
+ @sessionid
+ end
+ end
+
+ class DummyHeaderHandler < SOAP::Header::SimpleHandler
+ def initialize(mustunderstand)
+ super(DummyHeaderName)
+ @mustunderstand = mustunderstand
+ end
+
+ def on_simple_outbound
+ { XSD::QName.new("foo", "bar") => nil }
+ end
+
+ def on_simple_inbound(my_header, mustunderstand)
+ end
+ end
+
+ def setup
+ @endpoint = "http://localhost:#{Port}/"
+ setup_server
+ setup_client
+ end
+
+ def setup_server
+ @server = AuthHeaderPortServer.new(self.class.name, nil, '0.0.0.0', Port)
+ @server.level = Logger::Severity::ERROR
+ @t = Thread.new {
+ @server.start
+ }
+ while @server.status != :Running
+ sleep 0.1
+ unless @t.alive?
+ @t.join
+ raise
+ end
+ end
+ end
+
+ def setup_client
+ @client = SOAP::RPC::Driver.new(@endpoint, PortName)
+ @client.wiredump_dev = STDERR if $DEBUG
+ @client.add_method('deposit', 'amt')
+ @client.add_method('withdrawal', 'amt')
+ end
+
+ def teardown
+ teardown_server
+ teardown_client
+ end
+
+ def teardown_server
+ @server.shutdown
+ @t.kill
+ @t.join
+ end
+
+ def teardown_client
+ @client.reset_stream
+ end
+
+ def test_success_no_mu
+ h = ClientAuthHeaderHandler.new('NaHi', 'passwd', false)
+ @client.headerhandler << h
+ do_transaction_check(h)
+ end
+
+ def test_success_mu
+ h = ClientAuthHeaderHandler.new('NaHi', 'passwd', true)
+ @client.headerhandler << h
+ do_transaction_check(h)
+ end
+
+ def test_no_mu
+ h = ClientAuthHeaderHandler.new('NaHi', 'passwd', true)
+ @client.headerhandler << h
+ @client.headerhandler << DummyHeaderHandler.new(false)
+ do_transaction_check(h)
+ end
+
+ def test_mu
+ h = ClientAuthHeaderHandler.new('NaHi', 'passwd', true)
+ @client.headerhandler << h
+ @client.headerhandler << (h2 = DummyHeaderHandler.new(true))
+ assert_raise(SOAP::UnhandledMustUnderstandHeaderError) do
+ assert_equal("deposit 150 OK", @client.deposit(150))
+ end
+ @client.headerhandler.delete(h2)
+ @client.headerhandler << (h2 = DummyHeaderHandler.new(false))
+ do_transaction_check(h)
+ end
+
+ def do_transaction_check(h)
+ assert_equal("deposit 150 OK", @client.deposit(150))
+ serversess = AuthHeaderPortServer::ServerAuthHeaderHandler.sessions[h.sessionid]
+ assert_equal("NaHi", serversess[0])
+ assert_equal("withdrawal 120 OK", @client.withdrawal(120))
+ serversess = AuthHeaderPortServer::ServerAuthHeaderHandler.sessions[h.sessionid]
+ assert_equal("NaHi", serversess[0])
+ end
+
+ def test_authfailure
+ h = ClientAuthHeaderHandler.new('NaHi', 'pa', false)
+ @client.headerhandler << h
+ assert_raises(RuntimeError) do
+ @client.deposit(150)
+ end
+ end
+end
+
+
+end
+end
diff --git a/test/soap/header/test_authheader_cgi.rb b/test/soap/header/test_authheader_cgi.rb
new file mode 100644
index 0000000000..03bd1bb965
--- /dev/null
+++ b/test/soap/header/test_authheader_cgi.rb
@@ -0,0 +1,128 @@
+require 'test/unit'
+require 'soap/rpc/driver'
+require 'soap/rpc/standaloneServer'
+require 'soap/header/simplehandler'
+require 'logger'
+require 'webrick'
+require 'rbconfig'
+
+
+module SOAP
+module Header
+
+
+class TestAuthHeaderCGI < Test::Unit::TestCase
+ # This test shuld be run after installing ruby.
+ RUBYBIN = File.join(
+ Config::CONFIG["bindir"],
+ Config::CONFIG["ruby_install_name"] + Config::CONFIG["EXEEXT"]
+ )
+ RUBYBIN << " -d" if $DEBUG
+
+ Port = 17171
+ PortName = 'http://tempuri.org/authHeaderPort'
+ SupportPortName = 'http://tempuri.org/authHeaderSupportPort'
+ MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
+
+ class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
+ def initialize(userid, passwd)
+ super(MyHeaderName)
+ @sessionid = nil
+ @userid = userid
+ @passwd = passwd
+ end
+
+ def on_simple_outbound
+ if @sessionid
+ { "sessionid" => @sessionid }
+ else
+ { "userid" => @userid, "passwd" => @passwd }
+ end
+ end
+
+ def on_simple_inbound(my_header, mustunderstand)
+ @sessionid = my_header["sessionid"]
+ end
+
+ def sessionid
+ @sessionid
+ end
+ end
+
+ def setup
+ @endpoint = "http://localhost:#{Port}/"
+ setup_server
+ setup_client
+ end
+
+ def setup_server
+ @endpoint = "http://localhost:#{Port}/server.cgi"
+ logger = Logger.new(STDERR)
+ logger.level = Logger::Severity::ERROR
+ @server = WEBrick::HTTPServer.new(
+ :BindAddress => "0.0.0.0",
+ :Logger => logger,
+ :Port => Port,
+ :AccessLog => [],
+ :DocumentRoot => File.dirname(File.expand_path(__FILE__)),
+ :CGIPathEnv => ENV['PATH'],
+ :CGIInterpreter => RUBYBIN
+ )
+ @t = Thread.new {
+ Thread.current.abort_on_exception = true
+ @server.start
+ }
+ while @server.status != :Running
+ sleep 0.1
+ unless @t.alive?
+ @t.join
+ raise
+ end
+ end
+ end
+
+ def setup_client
+ @client = SOAP::RPC::Driver.new(@endpoint, PortName)
+ @client.wiredump_dev = STDERR if $DEBUG
+ @client.add_method('deposit', 'amt')
+ @client.add_method('withdrawal', 'amt')
+ @supportclient = SOAP::RPC::Driver.new(@endpoint, SupportPortName)
+ @supportclient.add_method('delete_sessiondb')
+ end
+
+ def teardown
+ @supportclient.delete_sessiondb
+ teardown_server
+ teardown_client
+ end
+
+ def teardown_server
+ @server.shutdown
+ @t.kill
+ @t.join
+ end
+
+ def teardown_client
+ @client.reset_stream
+ @supportclient.reset_stream
+ end
+
+ def test_success
+ h = ClientAuthHeaderHandler.new('NaHi', 'passwd')
+ @client.headerhandler << h
+ assert_equal("deposit 150 OK", @client.deposit(150))
+ assert_equal("withdrawal 120 OK", @client.withdrawal(120))
+ end
+
+ def test_authfailure
+ h = ClientAuthHeaderHandler.new('NaHi', 'pa')
+ @client.headerhandler << h
+ assert_raises(RuntimeError) do
+ @client.deposit(150)
+ end
+ end
+end
+
+
+end
+end
diff --git a/test/soap/ssl/README b/test/soap/ssl/README
new file mode 100644
index 0000000000..98ebcf7c23
--- /dev/null
+++ b/test/soap/ssl/README
@@ -0,0 +1 @@
+* certificates and keys in this directory is copied from http-access2 test.
diff --git a/test/soap/ssl/ca.cert b/test/soap/ssl/ca.cert
new file mode 100644
index 0000000000..bcabbee4ad
--- /dev/null
+++ b/test/soap/ssl/ca.cert
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID0DCCArigAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
+MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
+DTA0MDEzMDAwNDIzMloXDTM2MDEyMjAwNDIzMlowPDELMAkGA1UEBgwCSlAxEjAQ
+BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQswCQYDVQQDDAJDQTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANbv0x42BTKFEQOE+KJ2XmiSdZpR
+wjzQLAkPLRnLB98tlzs4xo+y4RyY/rd5TT9UzBJTIhP8CJi5GbS1oXEerQXB3P0d
+L5oSSMwGGyuIzgZe5+vZ1kgzQxMEKMMKlzA73rbMd4Jx3u5+jdbP0EDrPYfXSvLY
+bS04n2aX7zrN3x5KdDrNBfwBio2/qeaaj4+9OxnwRvYP3WOvqdW0h329eMfHw0pi
+JI0drIVdsEqClUV4pebT/F+CPUPkEh/weySgo9wANockkYu5ujw2GbLFcO5LXxxm
+dEfcVr3r6t6zOA4bJwL0W/e6LBcrwiG/qPDFErhwtgTLYf6Er67SzLyA66UCAwEA
+AaOB3DCB2TAPBgNVHRMBAf8EBTADAQH/MDEGCWCGSAGG+EIBDQQkFiJSdWJ5L09w
+ZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRJ7Xd380KzBV7f
+USKIQ+O/vKbhDzAOBgNVHQ8BAf8EBAMCAQYwZAYDVR0jBF0wW4AUSe13d/NCswVe
+31EiiEPjv7ym4Q+hQKQ+MDwxCzAJBgNVBAYMAkpQMRIwEAYDVQQKDAlKSU4uR1Iu
+SlAxDDAKBgNVBAsMA1JSUjELMAkGA1UEAwwCQ0GCAQAwDQYJKoZIhvcNAQEFBQAD
+ggEBAIu/mfiez5XN5tn2jScgShPgHEFJBR0BTJBZF6xCk0jyqNx/g9HMj2ELCuK+
+r/Y7KFW5c5M3AQ+xWW0ZSc4kvzyTcV7yTVIwj2jZ9ddYMN3nupZFgBK1GB4Y05GY
+MJJFRkSu6d/Ph5ypzBVw2YMT/nsOo5VwMUGLgS7YVjU+u/HNWz80J3oO17mNZllj
+PvORJcnjwlroDnS58KoJ7GDgejv3ESWADvX1OHLE4cRkiQGeLoEU4pxdCxXRqX0U
+PbwIkZN9mXVcrmPHq8MWi4eC/V7hnbZETMHuWhUoiNdOEfsAXr3iP4KjyyRdwc7a
+d/xgcK06UVQRL/HbEYGiQL056mc=
+-----END CERTIFICATE-----
diff --git a/test/soap/ssl/client.cert b/test/soap/ssl/client.cert
new file mode 100644
index 0000000000..ad13c4b735
--- /dev/null
+++ b/test/soap/ssl/client.cert
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDKDCCAhCgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
+MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
+DTA0MDEzMTAzMTQ1OFoXDTM1MDEyMzAzMTQ1OFowZTELMAkGA1UEBgwCSlAxEjAQ
+BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRAwDgYDVQQDDAdleGFtcGxl
+MSIwIAYJKoZIhvcNAQkBDBNleGFtcGxlQGV4YW1wbGUub3JnMIGfMA0GCSqGSIb3
+DQEBAQUAA4GNADCBiQKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLW
+jTkvsgOwbYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQ
+gNS6ew7/Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2Xf
+ewIDAQABo4GPMIGMMAwGA1UdEwEB/wQCMAAwMQYJYIZIAYb4QgENBCQWIlJ1Ynkv
+T3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFOFvay0H7lr2
+xUx6waYEV2bVDYQhMAsGA1UdDwQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYI
+KwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBABd2dYWqbDIWf5sWFvslezxJv8gI
+w64KCJBuyJAiDuf+oazr3016kMzAlt97KecLZDusGNagPrq02UX7YMoQFsWJBans
+cDtHrkM0al5r6/WGexNMgtYbNTYzt/IwodISGBgZ6dsOuhznwms+IBsTNDAvWeLP
+lt2tOqD8kEmjwMgn0GDRuKjs4EoboA3kMULb1p9akDV9ZESU3eOtpS5/G5J5msLI
+9WXbYBjcjvkLuJH9VsJhb+R58Vl0ViemvAHhPilSl1SPWVunGhv6FcIkdBEi1k9F
+e8BNMmsEjFiANiIRvpdLRbiGBt0KrKTndVfsmoKCvY48oCOvnzxtahFxfs8=
+-----END CERTIFICATE-----
diff --git a/test/soap/ssl/client.key b/test/soap/ssl/client.key
new file mode 100644
index 0000000000..37bc62f259
--- /dev/null
+++ b/test/soap/ssl/client.key
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICWwIBAAKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLWjTkvsgOw
+bYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQgNS6ew7/
+Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2XfewIDAQAB
+AoGAZcz8llWErtsV3QB9gNb3S/PNADGjqBFjReva8n3jG2k4sZSibpwWTwUaTNtT
+ZQgjSRKRvH1hk9XwffNAvXAQZNNkuj/16gO2oO45nyLj4dO365ujLptWnVIWDHOE
+uN0GeiZO+VzcCisT0WCq4tvtLeH8svrxzA8cbXIEyOK7NiECQQDwo2zPFyKAZ/Cu
+lDJ6zKT+RjfWwW7DgWzirAlTrt4ViMaW+IaDH29TmQpb4V4NuR3Xi+2Xl4oicu6S
+36TW9+/FAkEA3rgfOQJuLlWSnw1RTGwvnC816a/W7iYYY7B+0U4cDbfWl7IoXT4y
+M8nV/HESooviZLqBwzAYSoj3fFKYBKpGPwJAUO8GN5iWWA2dW3ooiDiv/X1sZmRk
+dojfMFWgRW747tEzya8Ivq0h6kH8w+5GjeMG8Gn1nRiwsulo6Ckj7dEx6QJACyui
+7UIQ8qP6GZ4aYMHgVW4Mvy7Bkeo5OO7GPYs0Xv/EdJFL8vlGnVBXOjUVoS9w6Gpu
+TbLg1QQvnX2rADjmEwJANxZO2GUkaWGsEif8aGW0x5g/IdaMGG27pTWk5zqix7P3
+1UDrdo/JOXhptovhRi06EppIxAxYmbh9vd9VN8Itlw==
+-----END RSA PRIVATE KEY-----
diff --git a/test/soap/ssl/server.cert b/test/soap/ssl/server.cert
new file mode 100644
index 0000000000..998ccc5892
--- /dev/null
+++ b/test/soap/ssl/server.cert
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIC/zCCAeegAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQGDAJKUDES
+MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxDjAMBgNVBAMMBVN1YkNB
+MB4XDTA0MDEzMTAzMTMxNloXDTMzMDEyMzAzMTMxNlowQzELMAkGA1UEBgwCSlAx
+EjAQBgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRIwEAYDVQQDDAlsb2Nh
+bGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANFJTxWqup3nV9dsJAku
+p+WaXnPNIzcpAA3qMGZDJTJsfa8Du7ZxTP0XJK5mETttBrn711cJxAuP3KjqnW9S
+vtZ9lY2sXJ6Zj62sN5LwG3VVe25dI28yR1EsbHjJ5Zjf9tmggMC6am52dxuHbt5/
+vHo4ngJuKE/U+eeGRivMn6gFAgMBAAGjgYUwgYIwDAYDVR0TAQH/BAIwADAxBglg
+hkgBhvhCAQ0EJBYiUnVieS9PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd
+BgNVHQ4EFgQUpZIyygD9JxFYHHOTEuWOLbCKfckwCwYDVR0PBAQDAgWgMBMGA1Ud
+JQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBBQUAA4IBAQBwAIj5SaBHaA5X31IP
+CFCJiep96awfp7RANO0cuUj+ZpGoFn9d6FXY0g+Eg5wAkCNIzZU5NHN9xsdOpnUo
+zIBbyTfQEPrge1CMWMvL6uGaoEXytq84VTitF/xBTky4KtTn6+es4/e7jrrzeUXQ
+RC46gkHObmDT91RkOEGjHLyld2328jo3DIN/VTHIryDeVHDWjY5dENwpwdkhhm60
+DR9IrNBbXWEe9emtguNXeN0iu1ux0lG1Hc6pWGQxMlRKNvGh0yZB9u5EVe38tOV0
+jQaoNyL7qzcQoXD3Dmbi1p0iRmg/+HngISsz8K7k7MBNVsSclztwgCzTZOBiVtkM
+rRlQ
+-----END CERTIFICATE-----
diff --git a/test/soap/ssl/server.key b/test/soap/ssl/server.key
new file mode 100644
index 0000000000..9ba2218a03
--- /dev/null
+++ b/test/soap/ssl/server.key
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQDRSU8Vqrqd51fXbCQJLqflml5zzSM3KQAN6jBmQyUybH2vA7u2
+cUz9FySuZhE7bQa5+9dXCcQLj9yo6p1vUr7WfZWNrFyemY+trDeS8Bt1VXtuXSNv
+MkdRLGx4yeWY3/bZoIDAumpudncbh27ef7x6OJ4CbihP1PnnhkYrzJ+oBQIDAQAB
+AoGBAIf4CstW2ltQO7+XYGoex7Hh8s9lTSW/G2vu5Hbr1LTHy3fzAvdq8MvVR12O
+rk9fa+lU9vhzPc0NMB0GIDZ9GcHuhW5hD1Wg9OSCbTOkZDoH3CAFqonjh4Qfwv5W
+IPAFn9KHukdqGXkwEMdErsUaPTy9A1V/aROVEaAY+HJgq/eZAkEA/BP1QMV04WEZ
+Oynzz7/lLizJGGxp2AOvEVtqMoycA/Qk+zdKP8ufE0wbmCE3Qd6GoynavsHb6aGK
+gQobb8zDZwJBANSK6MrXlrZTtEaeZuyOB4mAmRzGzOUVkUyULUjEx2GDT93ujAma
+qm/2d3E+wXAkNSeRpjUmlQXy/2oSqnGvYbMCQQDRM+cYyEcGPUVpWpnj0shrF/QU
+9vSot/X1G775EMTyaw6+BtbyNxVgOIu2J+rqGbn3c+b85XqTXOPL0A2RLYkFAkAm
+syhSDtE9X55aoWsCNZY/vi+i4rvaFoQ/WleogVQAeGVpdo7/DK9t9YWoFBIqth0L
+mGSYFu9ZhvZkvQNV8eYrAkBJ+rOIaLDsmbrgkeDruH+B/9yrm4McDtQ/rgnOGYnH
+LjLpLLOrgUxqpzLWe++EwSLwK2//dHO+SPsQJ4xsyQJy
+-----END RSA PRIVATE KEY-----
diff --git a/test/soap/ssl/sslsvr.rb b/test/soap/ssl/sslsvr.rb
new file mode 100644
index 0000000000..281c1a1a51
--- /dev/null
+++ b/test/soap/ssl/sslsvr.rb
@@ -0,0 +1,56 @@
+require 'webrick/https'
+require 'logger'
+require 'rbconfig'
+
+require 'soap/rpc/httpserver'
+
+class HelloWorldServer < SOAP::RPC::HTTPServer
+private
+
+ def on_init
+ self.level = Logger::Severity::FATAL
+ @default_namespace = 'urn:ssltst'
+ add_method(self, 'hello_world', 'from')
+ end
+
+ def hello_world(from)
+ "Hello World, from #{ from }"
+ end
+end
+
+
+if $0 == __FILE__
+ PORT = 17171
+ DIR = File.dirname(File.expand_path(__FILE__))
+
+ def cert(filename)
+ OpenSSL::X509::Certificate.new(File.open(File.join(DIR, filename)) { |f|
+ f.read
+ })
+ end
+
+ def key(filename)
+ OpenSSL::PKey::RSA.new(File.open(File.join(DIR, filename)) { |f|
+ f.read
+ })
+ end
+
+ $server = HelloWorldServer.new(
+ :BindAddress => "0.0.0.0",
+ :Port => PORT,
+ :AccessLog => [],
+ :SSLEnable => true,
+ :SSLCACertificateFile => File.join(DIR, 'ca.cert'),
+ :SSLCertificate => cert('server.cert'),
+ :SSLPrivateKey => key('server.key'),
+ :SSLVerifyClient => nil, #OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT|OpenSSL::SSL::VERIFY_PEER,
+ :SSLClientCA => cert('ca.cert'),
+ :SSLCertName => nil
+ )
+ trap(:INT) do
+ $server.shutdown if $server
+ end
+ STDOUT.sync = true
+ STDOUT.puts $$
+ $server.start
+end
diff --git a/test/soap/ssl/subca.cert b/test/soap/ssl/subca.cert
new file mode 100644
index 0000000000..1e471851b8
--- /dev/null
+++ b/test/soap/ssl/subca.cert
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
+MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
+DTA0MDEzMDAwNDMyN1oXDTM1MDEyMjAwNDMyN1owPzELMAkGA1UEBgwCSlAxEjAQ
+BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQ4wDAYDVQQDDAVTdWJDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0Ou7AyRcRXnB/kVHv/6kwe
+ANzgg/DyJfsAUqW90m7Lu1nqyug8gK0RBd77yU0w5HOAMHTVSdpjZK0g2sgx4Mb1
+d/213eL9TTl5MRVEChTvQr8q5DVG/8fxPPE7fMI8eOAzd98/NOAChk+80r4Sx7fC
+kGVEE1bKwY1MrUsUNjOY2d6t3M4HHV3HX1V8ShuKfsHxgCmLzdI8U+5CnQedFgkm
+3e+8tr8IX5RR1wA1Ifw9VadF7OdI/bGMzog/Q8XCLf+WPFjnK7Gcx6JFtzF6Gi4x
+4dp1Xl45JYiVvi9zQ132wu8A1pDHhiNgQviyzbP+UjcB/tsOpzBQF8abYzgEkWEC
+AwEAAaNyMHAwDwYDVR0TAQH/BAUwAwEB/zAxBglghkgBhvhCAQ0EJBYiUnVieS9P
+cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUlCjXWLsReYzH
+LzsxwVnCXmKoB/owCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCJ/OyN
+rT8Cq2Y+G2yA/L1EMRvvxwFBqxavqaqHl/6rwsIBFlB3zbqGA/0oec6MAVnYynq4
+c4AcHTjx3bQ/S4r2sNTZq0DH4SYbQzIobx/YW8PjQUJt8KQdKMcwwi7arHP7A/Ha
+LKu8eIC2nsUBnP4NhkYSGhbmpJK+PFD0FVtD0ZIRlY/wsnaZNjWWcnWF1/FNuQ4H
+ySjIblqVQkPuzebv3Ror6ZnVDukn96Mg7kP4u6zgxOeqlJGRe1M949SS9Vudjl8X
+SF4aZUUB9pQGhsqQJVqaz2OlhGOp9D0q54xko/rekjAIcuDjl1mdX4F2WRrzpUmZ
+uY/bPeOBYiVsOYVe
+-----END CERTIFICATE-----
diff --git a/test/soap/ssl/test_ssl.rb b/test/soap/ssl/test_ssl.rb
new file mode 100644
index 0000000000..6678c775ac
--- /dev/null
+++ b/test/soap/ssl/test_ssl.rb
@@ -0,0 +1,212 @@
+require 'test/unit'
+begin
+ require 'http-access2'
+rescue LoadError
+end
+require 'soap/rpc/driver'
+
+if defined?(HTTPAccess2)
+
+module SOAP; module SSL
+
+
+class TestSSL < Test::Unit::TestCase
+ PORT = 17171
+
+ DIR = File.dirname(File.expand_path(__FILE__))
+ require 'rbconfig'
+ RUBY = File.join(
+ Config::CONFIG["bindir"],
+ Config::CONFIG["ruby_install_name"] + Config::CONFIG["EXEEXT"]
+ )
+
+ def setup
+ @url = "https://localhost:#{PORT}/hello"
+ @serverpid = @client = nil
+ @verify_callback_called = false
+ setup_server
+ setup_client
+ end
+
+ def teardown
+ teardown_client
+ teardown_server
+ end
+
+ def streamhandler
+ @client.instance_eval("@servant").instance_eval("@streamhandler").client
+ end
+
+ def test_options
+ cfg = streamhandler.ssl_config
+ assert_nil(cfg.client_cert)
+ assert_nil(cfg.client_key)
+ assert_nil(cfg.client_ca)
+ assert_equal(OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT, cfg.verify_mode)
+ assert_nil(cfg.verify_callback)
+ assert_nil(cfg.timeout)
+ assert_equal(OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv2, cfg.options)
+ assert_equal("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH", cfg.ciphers)
+ assert_instance_of(OpenSSL::X509::Store, cfg.cert_store)
+ # dummy call to ensure sslsvr initialization finished.
+ assert_raise(OpenSSL::SSL::SSLError) do
+ @client.hello_world("ssl client")
+ end
+ end
+
+ def test_verification
+ cfg = @client.options
+ cfg["protocol.http.ssl_config.verify_callback"] = method(:verify_callback).to_proc
+ begin
+ @verify_callback_called = false
+ @client.hello_world("ssl client")
+ assert(false)
+ rescue OpenSSL::SSL::SSLError => ssle
+ assert_equal("certificate verify failed", ssle.message)
+ assert(@verify_callback_called)
+ end
+ #
+ cfg["protocol.http.ssl_config.client_cert"] = File.join(DIR, "client.cert")
+ cfg["protocol.http.ssl_config.client_key"] = File.join(DIR, "client.key")
+ @verify_callback_called = false
+ begin
+ @client.hello_world("ssl client")
+ assert(false)
+ rescue OpenSSL::SSL::SSLError => ssle
+ assert_equal("certificate verify failed", ssle.message)
+ assert(@verify_callback_called)
+ end
+ #
+ cfg["protocol.http.ssl_config.ca_file"] = File.join(DIR, "ca.cert")
+ @verify_callback_called = false
+ begin
+ @client.hello_world("ssl client")
+ assert(false)
+ rescue OpenSSL::SSL::SSLError => ssle
+ assert_equal("certificate verify failed", ssle.message)
+ assert(@verify_callback_called)
+ end
+ #
+ cfg["protocol.http.ssl_config.ca_file"] = File.join(DIR, "subca.cert")
+ @verify_callback_called = false
+ assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
+ assert(@verify_callback_called)
+ #
+ cfg["protocol.http.ssl_config.verify_depth"] = "1"
+ @verify_callback_called = false
+ begin
+ @client.hello_world("ssl client")
+ assert(false)
+ rescue OpenSSL::SSL::SSLError => ssle
+ assert_equal("certificate verify failed", ssle.message)
+ assert(@verify_callback_called)
+ end
+ #
+ cfg["protocol.http.ssl_config.verify_depth"] = ""
+ cfg["protocol.http.ssl_config.cert_store"] = OpenSSL::X509::Store.new
+ cfg["protocol.http.ssl_config.verify_mode"] = OpenSSL::SSL::VERIFY_PEER.to_s
+ begin
+ @client.hello_world("ssl client")
+ assert(false)
+ rescue OpenSSL::SSL::SSLError => ssle
+ assert_equal("certificate verify failed", ssle.message)
+ end
+ #
+ cfg["protocol.http.ssl_config.verify_mode"] = ""
+ assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
+ end
+
+ def test_property
+ testpropertyname = File.join(DIR, 'soapclient.properties')
+ File.open(testpropertyname, "w") do |f|
+ f <<<<__EOP__
+protocol.http.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
+# depth: 1 causes an error (intentional)
+protocol.http.ssl_config.verify_depth = 1
+protocol.http.ssl_config.client_cert = #{File.join(DIR, 'client.cert')}
+protocol.http.ssl_config.client_key = #{File.join(DIR, 'client.key')}
+protocol.http.ssl_config.ca_file = #{File.join(DIR, 'ca.cert')}
+protocol.http.ssl_config.ca_file = #{File.join(DIR, 'subca.cert')}
+protocol.http.ssl_config.ciphers = ALL
+__EOP__
+ end
+ begin
+ @client.loadproperty(testpropertyname)
+ @client.options["protocol.http.ssl_config.verify_callback"] = method(:verify_callback).to_proc
+ @verify_callback_called = false
+ begin
+ @client.hello_world("ssl client")
+ assert(false)
+ rescue OpenSSL::SSL::SSLError => ssle
+ assert_equal("certificate verify failed", ssle.message)
+ assert(@verify_callback_called)
+ end
+ #
+ @client.options["protocol.http.ssl_config.verify_depth"] = ""
+ @verify_callback_called = false
+ assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
+ assert(@verify_callback_called)
+ ensure
+ File.unlink(testpropertyname)
+ end
+ end
+
+ def test_ciphers
+ cfg = @client.options
+ cfg["protocol.http.ssl_config.client_cert"] = File.join(DIR, 'client.cert')
+ cfg["protocol.http.ssl_config.client_key"] = File.join(DIR, 'client.key')
+ cfg["protocol.http.ssl_config.ca_file"] = File.join(DIR, "ca.cert")
+ cfg["protocol.http.ssl_config.ca_file"] = File.join(DIR, "subca.cert")
+ #cfg.timeout = 123
+ assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
+ #
+ cfg["protocol.http.ssl_config.ciphers"] = "!ALL"
+ begin
+ @client.hello_world("ssl client")
+ assert(false)
+ rescue OpenSSL::SSL::SSLError => ssle
+ assert_equal("no ciphers available", ssle.message)
+ end
+ #
+ cfg["protocol.http.ssl_config.ciphers"] = "ALL"
+ assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
+ end
+
+private
+
+ def q(str)
+ %Q["#{str}"]
+ end
+
+ def setup_server
+ svrcmd = "#{q(RUBY)} "
+ svrcmd << "-d " if $DEBUG
+ svrcmd << File.join(DIR, "sslsvr.rb")
+ svrout = IO.popen(svrcmd)
+ @serverpid = Integer(svrout.gets.chomp)
+ end
+
+ def setup_client
+ @client = SOAP::RPC::Driver.new(@url, 'urn:ssltst')
+ @client.add_method("hello_world", "from")
+ end
+
+ def teardown_server
+ Process.kill('INT', @serverpid)
+ end
+
+ def teardown_client
+ @client.reset_stream
+ end
+
+ def verify_callback(ok, cert)
+ @verify_callback_called = true
+ p ["client", ok, cert] if $DEBUG
+ ok
+ end
+end
+
+
+end; end
+
+end
diff --git a/test/soap/struct/test_struct.rb b/test/soap/struct/test_struct.rb
new file mode 100644
index 0000000000..71ada31676
--- /dev/null
+++ b/test/soap/struct/test_struct.rb
@@ -0,0 +1,83 @@
+require 'test/unit'
+require 'soap/rpc/httpserver'
+require 'soap/rpc/driver'
+
+
+module SOAP; module Struct
+
+
+class TestStruct < Test::Unit::TestCase
+ Namespace = "urn:example.com:simpletype-rpc"
+ class Server < ::SOAP::RPC::HTTPServer
+ @@test_struct = ::Struct.new(:one, :two)
+
+ def on_init
+ add_method(self, 'a_method')
+ end
+
+ def a_method
+ @@test_struct.new("string", 1)
+ end
+ end
+
+ Port = 17171
+
+ def setup
+ setup_server
+ setup_client
+ end
+
+ def setup_server
+ @server = Server.new(
+ :Port => Port,
+ :AccessLog => [],
+ :SOAPDefaultNamespace => Namespace
+ )
+ @server.level = Logger::Severity::ERROR
+ @server_thread = start_server_thread(@server)
+ end
+
+ def setup_client
+ @client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/", Namespace)
+ @client.wiredump_dev = STDERR if $DEBUG
+ @client.add_method('a_method')
+ end
+
+ def teardown
+ teardown_server
+ teardown_client
+ end
+
+ def teardown_server
+ @server.shutdown
+ @server_thread.kill
+ @server_thread.join
+ end
+
+ def teardown_client
+ @client.reset_stream
+ end
+
+ def start_server_thread(server)
+ t = Thread.new {
+ Thread.current.abort_on_exception = true
+ server.start
+ }
+ while server.status != :Running
+ sleep 0.1
+ unless t.alive?
+ t.join
+ raise
+ end
+ end
+ t
+ end
+
+ def test_struct
+ assert_equal("string", @client.a_method.one)
+ assert_equal(1, @client.a_method.two)
+ end
+end
+
+
+end; end
diff --git a/test/soap/swa/test_file.rb b/test/soap/swa/test_file.rb
new file mode 100644
index 0000000000..29bdf88a3b
--- /dev/null
+++ b/test/soap/swa/test_file.rb
@@ -0,0 +1,77 @@
+require 'test/unit'
+require 'soap/rpc/driver'
+require 'soap/rpc/standaloneServer'
+require 'soap/attachment'
+
+
+module SOAP
+module SWA
+
+
+class TestFile < Test::Unit::TestCase
+ Port = 17171
+ THIS_FILE = File.expand_path(__FILE__)
+
+ class SwAService
+ def get_file
+ return {
+ 'name' => $0,
+ 'file' => SOAP::Attachment.new(File.open(THIS_FILE)) # closed when GCed.
+ }
+ end
+
+ def put_file(name, file)
+ "File '#{name}' was received ok."
+ end
+ end
+
+ def setup
+ @server = SOAP::RPC::StandaloneServer.new('SwAServer',
+ 'http://www.acmetron.com/soap', '0.0.0.0', Port)
+ @server.add_servant(SwAService.new)
+ @server.level = Logger::Severity::ERROR
+ @t = Thread.new {
+ @server.start
+ }
+ while @server.status != :Running
+ sleep 0.1
+ unless @t.alive?
+ @t.join
+ raise
+ end
+ end
+ @endpoint = "http://localhost:#{Port}/"
+ @client = SOAP::RPC::Driver.new(@endpoint, 'http://www.acmetron.com/soap')
+ @client.add_method('get_file')
+ @client.add_method('put_file', 'name', 'file')
+ @client.wiredump_dev = STDERR if $DEBUG
+ end
+
+ def teardown
+ @server.shutdown
+ @t.kill
+ @t.join
+ @client.reset_stream
+ end
+
+ def test_file
+ assert_equal(
+ File.open(THIS_FILE) { |f| f.read },
+ @client.get_file['file'].content
+ )
+ assert_equal(
+ "File 'foo' was received ok.",
+ @client.put_file('foo',
+ SOAP::Attachment.new(File.open(THIS_FILE)))
+ )
+ assert_equal(
+ "File 'bar' was received ok.",
+ @client.put_file('bar',
+ SOAP::Attachment.new(File.open(THIS_FILE) { |f| f.read }))
+ )
+ end
+end
+
+
+end
+end
diff --git a/test/soap/test_property.rb b/test/soap/test_property.rb
index 82363a83db..1cc826695f 100644
--- a/test/soap/test_property.rb
+++ b/test/soap/test_property.rb
@@ -59,7 +59,7 @@ __EOP__
prop = Property.new
hooked = false
prop.add_hook("foo.bar.baz") do |name, value|
- assert_equal("foo.bar.baz", name)
+ assert_equal(["foo", "bar", "baz"], name)
assert_equal("123", value)
hooked = true
end
@@ -126,11 +126,24 @@ __EOP__
end
end
+ def test_hook_name
+ tag = Object.new
+ tested = false
+ @prop.add_hook("foo.bar") do |key, value|
+ assert_raise(TypeError) do
+ key << "baz"
+ end
+ tested = true
+ end
+ @prop["foo.bar"] = tag
+ assert(tested)
+ end
+
def test_value_hook
tag = Object.new
tested = false
@prop.add_hook("FOO.BAR.BAZ") do |key, value|
- assert_equal("foo.bar.baz", key)
+ assert_equal(["Foo", "baR", "baZ"], key)
assert_equal(tag, value)
tested = true
end
@@ -141,32 +154,65 @@ __EOP__
assert_equal(1, @prop["foo.bar"])
end
- def test_key_hook
+ def test_key_hook_no_cascade
tag = Object.new
tested = 0
+ @prop.add_hook do |key, value|
+ assert(false)
+ end
+ @prop.add_hook(false) do |key, value|
+ assert(false)
+ end
@prop.add_hook("foo") do |key, value|
- assert_equal("foo.bar.baz.qux", key)
+ assert(false)
+ end
+ @prop.add_hook("foo.bar", false) do |key, value|
+ assert(false)
+ end
+ @prop.add_hook("foo.bar.baz") do |key, value|
+ assert(false)
+ end
+ @prop.add_hook("foo.bar.baz.qux", false) do |key, value|
+ assert_equal(["foo", "bar", "baz", "qux"], key)
assert_equal(tag, value)
tested += 1
end
- @prop.add_hook("foo.bar") do |key, value|
- assert_equal("foo.bar.baz.qux", key)
+ @prop["foo.bar.baz.qux"] = tag
+ assert_equal(tag, @prop["foo.bar.baz.qux"])
+ assert_equal(1, tested)
+ end
+
+ def test_key_hook_cascade
+ tag = Object.new
+ tested = 0
+ @prop.add_hook(true) do |key, value|
+ assert_equal(["foo", "bar", "baz", "qux"], key)
assert_equal(tag, value)
tested += 1
end
- @prop.add_hook("foo.bar.baz") do |key, value|
- assert_equal("foo.bar.baz.qux", key)
+ @prop.add_hook("foo", true) do |key, value|
+ assert_equal(["foo", "bar", "baz", "qux"], key)
assert_equal(tag, value)
tested += 1
end
- @prop.add_hook("foo.bar.baz.qux") do |key, value|
- assert_equal("foo.bar.baz.qux", key)
+ @prop.add_hook("foo.bar", true) do |key, value|
+ assert_equal(["foo", "bar", "baz", "qux"], key)
+ assert_equal(tag, value)
+ tested += 1
+ end
+ @prop.add_hook("foo.bar.baz", true) do |key, value|
+ assert_equal(["foo", "bar", "baz", "qux"], key)
+ assert_equal(tag, value)
+ tested += 1
+ end
+ @prop.add_hook("foo.bar.baz.qux", true) do |key, value|
+ assert_equal(["foo", "bar", "baz", "qux"], key)
assert_equal(tag, value)
tested += 1
end
@prop["foo.bar.baz.qux"] = tag
assert_equal(tag, @prop["foo.bar.baz.qux"])
- assert_equal(4, tested)
+ assert_equal(5, tested)
end
def test_keys
@@ -310,7 +356,7 @@ __EOP__
def test_hook_then_lock
tested = false
@prop.add_hook("a.b.c") do |name, value|
- assert_equal("a.b.c", name)
+ assert_equal(["a", "b", "c"], name)
tested = true
end
@prop["a.b"].lock
diff --git a/test/soap/wsdlDriver/README.txt b/test/soap/wsdlDriver/README.txt
new file mode 100644
index 0000000000..b4d45a0486
--- /dev/null
+++ b/test/soap/wsdlDriver/README.txt
@@ -0,0 +1,2 @@
+echo_version.rb is generated by wsdl2ruby.rb;
+% wsdl2ruby.rb --wsdl simpletype.wsdl --classdef --force
diff --git a/test/soap/wsdlDriver/echo_version.rb b/test/soap/wsdlDriver/echo_version.rb
new file mode 100644
index 0000000000..7d76fb7587
--- /dev/null
+++ b/test/soap/wsdlDriver/echo_version.rb
@@ -0,0 +1,20 @@
+# urn:example.com:simpletype-rpc-type
+class Version_struct
+ @@schema_type = "version_struct"
+ @@schema_ns = "urn:example.com:simpletype-rpc-type"
+
+ attr_accessor :version
+ attr_accessor :msg
+
+ def initialize(version = nil, msg = nil)
+ @version = version
+ @msg = msg
+ end
+end
+
+# urn:example.com:simpletype-rpc-type
+module Versions
+ C_16 = "1.6"
+ C_18 = "1.8"
+ C_19 = "1.9"
+end
diff --git a/test/soap/wsdlDriver/simpletype.wsdl b/test/soap/wsdlDriver/simpletype.wsdl
new file mode 100644
index 0000000000..7c211a6b2c
--- /dev/null
+++ b/test/soap/wsdlDriver/simpletype.wsdl
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<definitions name="echo_version"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="urn:example.com:simpletype-rpc"
+ xmlns:txd="urn:example.com:simpletype-rpc-type"
+ targetNamespace="urn:example.com:simpletype-rpc"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+ <types>
+ <xsd:schema targetNamespace="urn:example.com:simpletype-rpc-type">
+ <xsd:complexType name="version_struct">
+ <xsd:all>
+ <xsd:element name="version" type="txd:versions" />
+ <xsd:element name="msg" type="xsd:string" />
+ </xsd:all>
+ </xsd:complexType>
+
+ <xsd:simpleType name="versions">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="1.6"/>
+ <xsd:enumeration value="1.8"/>
+ <xsd:enumeration value="1.9"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:schema>
+ </types>
+
+ <message name="msg_version">
+ <part name="version" type="txd:versions"/>
+ </message>
+
+ <message name="msg_version_struct">
+ <part name="return" type="txd:version_struct"/>
+ </message>
+
+ <portType name="echo_version_port_type">
+ <operation name="echo_version">
+ <input message="tns:msg_version"/>
+ <output message="tns:msg_version_struct"/>
+ </operation>
+ </portType>
+
+ <binding name="echo_version_binding" type="tns:echo_version_port_type">
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
+ <operation name="echo_version">
+ <soap:operation soapAction="urn:example.com:simpletype-rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="urn:example.com:simpletype-rpc"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="urn:example.com:simpletype-rpc"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ </binding>
+
+ <service name="echo_version_service">
+ <port name="echo_version_port" binding="tns:echo_version_binding">
+ <soap:address location="http://localhost:10080"/>
+ </port>
+ </service>
+</definitions>
diff --git a/test/soap/wsdlDriver/test_simpletype.rb b/test/soap/wsdlDriver/test_simpletype.rb
new file mode 100644
index 0000000000..ed628927cd
--- /dev/null
+++ b/test/soap/wsdlDriver/test_simpletype.rb
@@ -0,0 +1,92 @@
+require 'test/unit'
+require 'soap/rpc/httpserver'
+require 'soap/wsdlDriver'
+
+
+module SOAP
+
+
+class TestSimpleType < Test::Unit::TestCase
+ class Server < ::SOAP::RPC::HTTPServer
+ def on_init
+ add_method(self, 'echo_version', 'version')
+ end
+
+ def echo_version(version)
+ # "2.0" is out of range.
+ Version_struct.new(version || "2.0", 'checked')
+ end
+ end
+
+ DIR = File.dirname(File.expand_path(__FILE__))
+ require File.join(DIR, 'echo_version')
+
+ Port = 17171
+
+ def setup
+ setup_server
+ setup_client
+ end
+
+ def setup_server
+ @server = Server.new(
+ :Port => Port,
+ :AccessLog => [],
+ :SOAPDefaultNamespace => "urn:example.com:simpletype-rpc"
+ )
+ @server.level = Logger::Severity::ERROR
+ @server_thread = start_server_thread(@server)
+ end
+
+ def setup_client
+ wsdl = File.join(DIR, 'simpletype.wsdl')
+ @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_driver
+ @client.endpoint_url = "http://localhost:#{Port}/"
+ @client.generate_explicit_type = false
+ end
+
+ def teardown
+ teardown_server
+ teardown_client
+ end
+
+ def teardown_server
+ @server.shutdown
+ @server_thread.kill
+ @server_thread.join
+ end
+
+ def teardown_client
+ @client.reset_stream
+ end
+
+ def start_server_thread(server)
+ t = Thread.new {
+ Thread.current.abort_on_exception = true
+ server.start
+ }
+ while server.status != :Running
+ sleep 0.1
+ unless t.alive?
+ t.join
+ raise
+ end
+ end
+ t
+ end
+
+ def test_ping
+ result = @client.echo_version("1.9")
+ assert_equal("1.9", result.version)
+ assert_equal("checked", result.msg)
+ assert_raise(::XSD::ValueSpaceError) do
+ @client.echo_version("2.0")
+ end
+ assert_raise(::XSD::ValueSpaceError) do
+ @client.echo_version(nil) # nil => "2.0" => out of range
+ end
+ end
+end
+
+
+end
diff --git a/test/wsdl/multiplefault.wsdl b/test/wsdl/multiplefault.wsdl
new file mode 100644
index 0000000000..2d928b60b0
--- /dev/null
+++ b/test/wsdl/multiplefault.wsdl
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<definitions name="MultipleFaultTest"
+ targetNamespace="urn:jp.gr.jin.rrr.example.ele"
+ xmlns:tns="urn:jp.gr.jin.rrr.example.ele"
+ xmlns:typens="urn:jp.gr.jin.rrr.example.datatypes"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+
+ <types>
+ <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="urn:jp.gr.jin.rrr.example.datatypes">
+ <xsd:complexType name="AuthenticationError">
+ <all>
+ <element name="message" type="xsd:string" />
+ <element name="backtrace" type="xoapenc:Array" />
+ </all>
+ </xsd:complexType>
+ <xsd:complexType name="AuthorizationError">
+ <all>
+ <element name="message" type="xsd:string" />
+ <element name="backtrace" type="xoapenc:Array" />
+ </all>
+ </xsd:complexType>
+ </xsd:schema>
+ </types>
+
+ <message name="inputmsg"/>
+ <message name="outputmsg"/>
+ <message name="faultmsg1" >
+ <part name="exception" type="typens:AuthenticationError" />
+ </message>
+ <message name="faultmsg2" >
+ <part name="exception" type="typens:AuthorizationError" />
+ </message>
+
+ <portType name="MultipleFaultPortType">
+ <operation name="myoperation">
+ <input message="tns:inputmsg"/>
+ <output message="tns:outputmsg"/>
+ <fault message="tns:faultmsg1"/>
+ <fault message="tns:faultmsg2"/>
+ </operation>
+ </portType>
+
+ <binding name="MultipleFaultBinding" type="tns:MultipleFaultPortType">
+ <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="myoperation">
+ <soap:operation soapAction="urn:jp.gr.jin.rrr.example.ele"/>
+ <input>
+ <soap:body use="encoded" namespace="urn:jp.gr.jin.rrr.example.ele"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="urn:jp.gr.jin.rrr.example.ele"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ </binding>
+
+ <service name="MultipleFaultService">
+ <port name="MultipleFaultPortType" binding="tns:MultipleFaultBinding">
+ <soap:address location="http://localhost:17171/"/>
+ </port>
+ </service>
+</definitions>
diff --git a/test/wsdl/simpletype/simpletype.wsdl b/test/wsdl/simpletype/simpletype.wsdl
new file mode 100644
index 0000000000..ec3266fc14
--- /dev/null
+++ b/test/wsdl/simpletype/simpletype.wsdl
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<definitions name="ping_service"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="urn:example.com:simpletype"
+ targetNamespace="urn:example.com:simpletype"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+ <types>
+ <xsd:schema targetNamespace="urn:example.com:simpletype">
+ <xsd:element name="ruby">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element minOccurs="1" maxOccurs="1" name="version" type="tns:version"/>
+ <xsd:element minOccurs="0" maxOccurs="1" name="date" type="xsd:dateTime"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:simpleType name="version">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="1.6"/>
+ <xsd:enumeration value="1.8"/>
+ <xsd:enumeration value="1.9"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:schema>
+ </types>
+
+ <message name="ping_in">
+ <part name="parameters" element="tns:ruby"/>
+ </message>
+
+ <message name="ping_out">
+ <part name="parameters" element="xsd:string"/>
+ </message>
+
+ <message name="versionmsg">
+ <part name="version" element="tns:version"/>
+ </message>
+
+ <portType name="ping_port_type">
+ <operation name="ping">
+ <input message="tns:ping_in"/>
+ <output message="tns:ping_out"/>
+ </operation>
+
+ <operation name="echo_version">
+ <input message="tns:versionmsg"/>
+ <output message="tns:versionmsg"/>
+ </operation>
+ </portType>
+
+ <binding name="ping_binding" type="tns:ping_port_type">
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+ <operation name="ping">
+ <soap:operation soapAction="urn:example.com:simpletype" style="document"/>
+ <input><soap:body use="literal"/></input>
+ <output><soap:body use="literal"/></output>
+ </operation>
+ </binding>
+
+ <service name="ping_service">
+ <port name="ping_port" binding="tns:ping_binding">
+ <soap:address location="http://localhost:10080"/>
+ </port>
+ </service>
+</definitions>
diff --git a/test/wsdl/simpletype/test_simpletype.rb b/test/wsdl/simpletype/test_simpletype.rb
new file mode 100644
index 0000000000..a46bf5dd78
--- /dev/null
+++ b/test/wsdl/simpletype/test_simpletype.rb
@@ -0,0 +1,81 @@
+require 'test/unit'
+require 'soap/rpc/standaloneServer'
+require 'soap/wsdlDriver'
+
+
+module WSDL
+module SimpleType
+
+
+class TestSimpleType < Test::Unit::TestCase
+ class Server < ::SOAP::RPC::StandaloneServer
+ def on_init
+ add_method(self, 'ruby', 'version', 'date')
+ end
+
+ def ruby(version, date)
+ "#{version} (#{date})"
+ end
+ end
+
+ DIR = File.dirname(File.expand_path(__FILE__))
+
+ Port = 17171
+
+ def setup
+ setup_server
+ setup_client
+ end
+
+ def setup_server
+ @server = Server.new('Test', "urn:example.com:simpletype", '0.0.0.0', Port)
+ @server.level = Logger::Severity::ERROR
+ @server_thread = start_server_thread(@server)
+ end
+
+ def setup_client
+ wsdl = File.join(DIR, 'simpletype.wsdl')
+ @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_driver
+ @client.endpoint_url = "http://localhost:#{Port}/"
+ @client.generate_explicit_type = false
+ end
+
+ def teardown
+ teardown_server
+ teardown_client
+ end
+
+ def teardown_server
+ @server.shutdown
+ @server_thread.kill
+ @server_thread.join
+ end
+
+ def teardown_client
+ @client.reset_stream
+ end
+
+ def start_server_thread(server)
+ t = Thread.new {
+ Thread.current.abort_on_exception = true
+ server.start
+ }
+ while server.status != :Running
+ sleep 0.1
+ unless t.alive?
+ t.join
+ raise
+ end
+ end
+ t
+ end
+
+ def test_ping
+ header, body = @client.ping(nil, {:version => "1.9", :date => "2004-01-01T00:00:00Z"})
+ assert_equal("1.9 (2004-01-01T00:00:00Z)", body)
+ end
+end
+
+
+end
+end
diff --git a/test/wsdl/test_emptycomplextype.rb b/test/wsdl/test_emptycomplextype.rb
index 0c21de8dd2..71d1b8641d 100644
--- a/test/wsdl/test_emptycomplextype.rb
+++ b/test/wsdl/test_emptycomplextype.rb
@@ -12,7 +12,7 @@ class TestWSDL < Test::Unit::TestCase
def test_wsdl
@wsdl = WSDL::Parser.new.parse(File.open(@file) { |f| f.read })
- assert_equal("#<WSDL::Definitions:{urn:jp.gr.jin.rrr.example.emptycomplextype}emptycomplextype>", @wsdl.inspect)
+ assert(/\{urn:jp.gr.jin.rrr.example.emptycomplextype\}emptycomplextype/ =~ @wsdl.inspect)
end
end
diff --git a/test/wsdl/test_multiplefault.rb b/test/wsdl/test_multiplefault.rb
new file mode 100644
index 0000000000..7004297dc9
--- /dev/null
+++ b/test/wsdl/test_multiplefault.rb
@@ -0,0 +1,39 @@
+require 'test/unit'
+require 'wsdl/parser'
+require 'wsdl/soap/classDefCreator'
+
+
+module WSDL
+
+
+class TestMultipleFault < Test::Unit::TestCase
+ def self.setup(filename)
+ @@filename = filename
+ end
+
+ def test_multiplefault
+ @wsdl = WSDL::Parser.new.parse(File.open(@@filename) { |f| f.read })
+ classdefstr = WSDL::SOAP::ClassDefCreator.new(@wsdl).dump
+ yield_eval_binding(classdefstr) do |b|
+ assert_equal(
+ WSDL::TestMultipleFault::AuthenticationError,
+ eval("AuthenticationError", b)
+ )
+ assert_equal(
+ WSDL::TestMultipleFault::AuthorizationError,
+ eval("AuthorizationError", b)
+ )
+ end
+ end
+
+ def yield_eval_binding(evaled)
+ b = binding
+ eval(evaled, b)
+ yield(b)
+ end
+end
+
+TestMultipleFault.setup(File.join(File.dirname(__FILE__), 'multiplefault.wsdl'))
+
+
+end