soap4r-ng 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. checksums.yaml +15 -0
  2. data/bin/wsdl2ruby.rb +140 -0
  3. data/bin/xsd2ruby.rb +92 -0
  4. data/lib/soap/attachment.rb +109 -0
  5. data/lib/soap/attrproxy.rb +35 -0
  6. data/lib/soap/baseData.rb +1095 -0
  7. data/lib/soap/element.rb +278 -0
  8. data/lib/soap/encodingstyle/aspDotNetHandler.rb +208 -0
  9. data/lib/soap/encodingstyle/handler.rb +121 -0
  10. data/lib/soap/encodingstyle/literalHandler.rb +196 -0
  11. data/lib/soap/encodingstyle/soapHandler.rb +560 -0
  12. data/lib/soap/filter.rb +14 -0
  13. data/lib/soap/filter/filterchain.rb +52 -0
  14. data/lib/soap/filter/handler.rb +32 -0
  15. data/lib/soap/filter/streamhandler.rb +30 -0
  16. data/lib/soap/generator.rb +299 -0
  17. data/lib/soap/header/handler.rb +62 -0
  18. data/lib/soap/header/handlerset.rb +71 -0
  19. data/lib/soap/header/mappinghandler.rb +48 -0
  20. data/lib/soap/header/simplehandler.rb +45 -0
  21. data/lib/soap/httpconfigloader.rb +140 -0
  22. data/lib/soap/mapping.rb +13 -0
  23. data/lib/soap/mapping/encodedregistry.rb +541 -0
  24. data/lib/soap/mapping/factory.rb +389 -0
  25. data/lib/soap/mapping/literalregistry.rb +392 -0
  26. data/lib/soap/mapping/mapping.rb +577 -0
  27. data/lib/soap/mapping/registry.rb +296 -0
  28. data/lib/soap/mapping/rubytypeFactory.rb +446 -0
  29. data/lib/soap/mapping/schemadefinition.rb +171 -0
  30. data/lib/soap/mapping/typeMap.rb +107 -0
  31. data/lib/soap/mapping/wsdlencodedregistry.rb +212 -0
  32. data/lib/soap/mapping/wsdlliteralregistry.rb +249 -0
  33. data/lib/soap/marshal.rb +60 -0
  34. data/lib/soap/mimemessage.rb +243 -0
  35. data/lib/soap/nestedexception.rb +43 -0
  36. data/lib/soap/netHttpClient.rb +242 -0
  37. data/lib/soap/ns.rb +39 -0
  38. data/lib/soap/parser.rb +253 -0
  39. data/lib/soap/processor.rb +67 -0
  40. data/lib/soap/property.rb +330 -0
  41. data/lib/soap/proxy.rb +15 -0
  42. data/lib/soap/rpc/cgistub.rb +249 -0
  43. data/lib/soap/rpc/driver.rb +222 -0
  44. data/lib/soap/rpc/element.rb +375 -0
  45. data/lib/soap/rpc/httpserver.rb +144 -0
  46. data/lib/soap/rpc/methodDef.rb +69 -0
  47. data/lib/soap/rpc/proxy.rb +573 -0
  48. data/lib/soap/rpc/router.rb +663 -0
  49. data/lib/soap/rpc/rpc.rb +26 -0
  50. data/lib/soap/rpc/soaplet.rb +201 -0
  51. data/lib/soap/rpc/standaloneServer.rb +44 -0
  52. data/lib/soap/soap.rb +154 -0
  53. data/lib/soap/streamHandler.rb +302 -0
  54. data/lib/soap/version.rb +9 -0
  55. data/lib/soap/wsdlDriver.rb +165 -0
  56. data/lib/wsdl/binding.rb +66 -0
  57. data/lib/wsdl/data.rb +65 -0
  58. data/lib/wsdl/definitions.rb +237 -0
  59. data/lib/wsdl/documentation.rb +33 -0
  60. data/lib/wsdl/import.rb +81 -0
  61. data/lib/wsdl/importer.rb +39 -0
  62. data/lib/wsdl/info.rb +51 -0
  63. data/lib/wsdl/message.rb +55 -0
  64. data/lib/wsdl/operation.rb +152 -0
  65. data/lib/wsdl/operationBinding.rb +241 -0
  66. data/lib/wsdl/param.rb +94 -0
  67. data/lib/wsdl/parser.rb +180 -0
  68. data/lib/wsdl/part.rb +53 -0
  69. data/lib/wsdl/port.rb +67 -0
  70. data/lib/wsdl/portType.rb +76 -0
  71. data/lib/wsdl/service.rb +62 -0
  72. data/lib/wsdl/soap/address.rb +41 -0
  73. data/lib/wsdl/soap/binding.rb +50 -0
  74. data/lib/wsdl/soap/body.rb +59 -0
  75. data/lib/wsdl/soap/cgiStubCreator.rb +93 -0
  76. data/lib/wsdl/soap/classDefCreator.rb +434 -0
  77. data/lib/wsdl/soap/classDefCreatorSupport.rb +241 -0
  78. data/lib/wsdl/soap/classNameCreator.rb +55 -0
  79. data/lib/wsdl/soap/clientSkeltonCreator.rb +107 -0
  80. data/lib/wsdl/soap/complexType.rb +174 -0
  81. data/lib/wsdl/soap/data.rb +43 -0
  82. data/lib/wsdl/soap/definitions.rb +201 -0
  83. data/lib/wsdl/soap/driverCreator.rb +121 -0
  84. data/lib/wsdl/soap/element.rb +34 -0
  85. data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +74 -0
  86. data/lib/wsdl/soap/fault.rb +57 -0
  87. data/lib/wsdl/soap/header.rb +87 -0
  88. data/lib/wsdl/soap/headerfault.rb +57 -0
  89. data/lib/wsdl/soap/literalMappingRegistryCreator.rb +116 -0
  90. data/lib/wsdl/soap/mappingRegistryCreator.rb +59 -0
  91. data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +377 -0
  92. data/lib/wsdl/soap/methodDefCreator.rb +200 -0
  93. data/lib/wsdl/soap/operation.rb +113 -0
  94. data/lib/wsdl/soap/servantSkeltonCreator.rb +92 -0
  95. data/lib/wsdl/soap/servletStubCreator.rb +105 -0
  96. data/lib/wsdl/soap/standaloneServerStubCreator.rb +101 -0
  97. data/lib/wsdl/soap/wsdl2ruby.rb +227 -0
  98. data/lib/wsdl/types.rb +45 -0
  99. data/lib/wsdl/wsdl.rb +25 -0
  100. data/lib/wsdl/xmlSchema/all.rb +25 -0
  101. data/lib/wsdl/xmlSchema/annotation.rb +35 -0
  102. data/lib/wsdl/xmlSchema/any.rb +62 -0
  103. data/lib/wsdl/xmlSchema/anyAttribute.rb +49 -0
  104. data/lib/wsdl/xmlSchema/attribute.rb +105 -0
  105. data/lib/wsdl/xmlSchema/attributeGroup.rb +69 -0
  106. data/lib/wsdl/xmlSchema/choice.rb +59 -0
  107. data/lib/wsdl/xmlSchema/complexContent.rb +98 -0
  108. data/lib/wsdl/xmlSchema/complexExtension.rb +120 -0
  109. data/lib/wsdl/xmlSchema/complexRestriction.rb +105 -0
  110. data/lib/wsdl/xmlSchema/complexType.rb +194 -0
  111. data/lib/wsdl/xmlSchema/content.rb +96 -0
  112. data/lib/wsdl/xmlSchema/data.rb +117 -0
  113. data/lib/wsdl/xmlSchema/element.rb +154 -0
  114. data/lib/wsdl/xmlSchema/enumeration.rb +37 -0
  115. data/lib/wsdl/xmlSchema/fractiondigits.rb +38 -0
  116. data/lib/wsdl/xmlSchema/group.rb +101 -0
  117. data/lib/wsdl/xmlSchema/import.rb +53 -0
  118. data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
  119. data/lib/wsdl/xmlSchema/importer.rb +103 -0
  120. data/lib/wsdl/xmlSchema/include.rb +48 -0
  121. data/lib/wsdl/xmlSchema/length.rb +38 -0
  122. data/lib/wsdl/xmlSchema/list.rb +49 -0
  123. data/lib/wsdl/xmlSchema/maxexclusive.rb +38 -0
  124. data/lib/wsdl/xmlSchema/maxinclusive.rb +38 -0
  125. data/lib/wsdl/xmlSchema/maxlength.rb +38 -0
  126. data/lib/wsdl/xmlSchema/minexclusive.rb +38 -0
  127. data/lib/wsdl/xmlSchema/mininclusive.rb +38 -0
  128. data/lib/wsdl/xmlSchema/minlength.rb +38 -0
  129. data/lib/wsdl/xmlSchema/parser.rb +168 -0
  130. data/lib/wsdl/xmlSchema/pattern.rb +37 -0
  131. data/lib/wsdl/xmlSchema/ref.rb +34 -0
  132. data/lib/wsdl/xmlSchema/schema.rb +179 -0
  133. data/lib/wsdl/xmlSchema/sequence.rb +55 -0
  134. data/lib/wsdl/xmlSchema/simpleContent.rb +70 -0
  135. data/lib/wsdl/xmlSchema/simpleExtension.rb +63 -0
  136. data/lib/wsdl/xmlSchema/simpleRestriction.rb +133 -0
  137. data/lib/wsdl/xmlSchema/simpleType.rb +88 -0
  138. data/lib/wsdl/xmlSchema/totaldigits.rb +38 -0
  139. data/lib/wsdl/xmlSchema/union.rb +36 -0
  140. data/lib/wsdl/xmlSchema/unique.rb +35 -0
  141. data/lib/wsdl/xmlSchema/whitespace.rb +38 -0
  142. data/lib/wsdl/xmlSchema/xsd2ruby.rb +177 -0
  143. data/lib/xsd/charset.rb +190 -0
  144. data/lib/xsd/codegen.rb +13 -0
  145. data/lib/xsd/codegen/classdef.rb +209 -0
  146. data/lib/xsd/codegen/commentdef.rb +35 -0
  147. data/lib/xsd/codegen/gensupport.rb +277 -0
  148. data/lib/xsd/codegen/methoddef.rb +71 -0
  149. data/lib/xsd/codegen/moduledef.rb +209 -0
  150. data/lib/xsd/datatypes.rb +1465 -0
  151. data/lib/xsd/datatypes1999.rb +21 -0
  152. data/lib/xsd/iconvcharset.rb +33 -0
  153. data/lib/xsd/mapping.rb +69 -0
  154. data/lib/xsd/namedelements.rb +133 -0
  155. data/lib/xsd/ns.rb +183 -0
  156. data/lib/xsd/qname.rb +80 -0
  157. data/lib/xsd/xmlparser.rb +81 -0
  158. data/lib/xsd/xmlparser/libxmlparser.rb +135 -0
  159. data/lib/xsd/xmlparser/nokogiriparser.rb +58 -0
  160. data/lib/xsd/xmlparser/ogaparser.rb +63 -0
  161. data/lib/xsd/xmlparser/oxparser.rb +101 -0
  162. data/lib/xsd/xmlparser/parser.rb +101 -0
  163. data/lib/xsd/xmlparser/rexmlparser.rb +58 -0
  164. metadata +236 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YzRmNTVhNzIzYjdhZjBkYjRlYmJhMjBhMDA4OTVmZjJlN2FhZGU1Mw==
5
+ data.tar.gz: !binary |-
6
+ MzY0MzhiOGY0NzhlYmU2NDcxNmRjMjczNjgzODk5NDU5NjgyMmRjYg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MjhlODg2MzI2MzRiODJmNWY1ZDQxNjdhMWU1NDY1M2EyMmVlZTg5MDk0OWFm
10
+ ODI1ODU5MTNjYzIwMGM5ZmU0NmM1ZTQ2NTEzYzhmNjlmNzlhYjQ4MTcwMmM4
11
+ YzE4M2ZiZWEyYjNmYjczMjQ2OGZhMjBkNzcyY2NiYjg5MmEzNTU=
12
+ data.tar.gz: !binary |-
13
+ NTU2NmIwZTkyM2VhNWI1MWIxNWQ3MzBjOTVjM2FkODY5MzIxMDgzNDY5MzRi
14
+ MzBkY2RmYzIyNDU4ODJkNjNmOThkYjJmNjU2YjUyYTg4ZjYyOWUyZjM1NDU0
15
+ ZDFmMTIzZDYxMTgzMWJmYjIwYTY2ZjYyNWYxOTM1M2I2NmYyMDk=
data/bin/wsdl2ruby.rb ADDED
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ $:.unshift File.join(File.dirname(__FILE__),'../lib') if ENV['DEBUG_SOAP4R']
4
+
5
+ require 'getoptlong'
6
+ require 'logger'
7
+ require 'logger-application' unless defined?(Logger::Application)
8
+ require 'wsdl/soap/wsdl2ruby'
9
+
10
+
11
+ class WSDL2RubyApp < Logger::Application
12
+ private
13
+
14
+ OptSet = [
15
+ ['--wsdl','-w', GetoptLong::REQUIRED_ARGUMENT],
16
+ ['--module_path','-m', GetoptLong::REQUIRED_ARGUMENT],
17
+ ['--type','-t', GetoptLong::REQUIRED_ARGUMENT],
18
+ ['--classdef','-e', GetoptLong::OPTIONAL_ARGUMENT],
19
+ ['--mapping_registry','-r', GetoptLong::NO_ARGUMENT],
20
+ ['--client_skelton','-c', GetoptLong::OPTIONAL_ARGUMENT],
21
+ ['--servant_skelton','-s', GetoptLong::OPTIONAL_ARGUMENT],
22
+ ['--cgi_stub','-g', GetoptLong::OPTIONAL_ARGUMENT],
23
+ ['--servlet_stub','-l', GetoptLong::OPTIONAL_ARGUMENT],
24
+ ['--standalone_server_stub','-a', GetoptLong::OPTIONAL_ARGUMENT],
25
+ ['--driver','-d', GetoptLong::OPTIONAL_ARGUMENT],
26
+ ['--drivername_postfix','-n', GetoptLong::REQUIRED_ARGUMENT],
27
+ ['--force','-f', GetoptLong::NO_ARGUMENT],
28
+ ['--quiet','-q', GetoptLong::NO_ARGUMENT],
29
+ ]
30
+
31
+ def initialize
32
+ super('app')
33
+ STDERR.sync = true
34
+ self.level = Logger::FATAL
35
+ end
36
+
37
+ def run
38
+ @worker = WSDL::SOAP::WSDL2Ruby.new
39
+ @worker.logger = @log
40
+ location, opt = parse_opt(GetoptLong.new(*OptSet))
41
+ usage_exit unless location
42
+ @worker.location = location
43
+ if opt['quiet']
44
+ self.level = Logger::FATAL
45
+ else
46
+ self.level = Logger::INFO
47
+ end
48
+ @worker.opt.update(opt)
49
+ @worker.run
50
+ 0
51
+ end
52
+
53
+ def usage_exit
54
+ puts <<__EOU__
55
+ Usage: #{ $0 } --wsdl wsdl_location [options]
56
+ wsdl_location: filename or URL
57
+
58
+ Example:
59
+ For server side:
60
+ #{ $0 } --wsdl myapp.wsdl --type server
61
+ For client side:
62
+ #{ $0 } --wsdl myapp.wsdl --type client
63
+
64
+ Options:
65
+ --wsdl wsdl_location
66
+ --type server|client
67
+ --type server implies;
68
+ --classdef --mapping_registry --servant_skelton --standalone_server_stub
69
+ --type client implies;
70
+ --classdef --mapping_registry --client_skelton --driver
71
+ --classdef [filenameprefix]
72
+ --mapping_registry
73
+ --client_skelton [servicename]
74
+ --servant_skelton [porttypename]
75
+ --cgi_stub [servicename]
76
+ --servlet_stub [servicename]
77
+ --standalone_server_stub [servicename]
78
+ --driver [porttypename]
79
+ --drivername_postfix driver_classname_postfix
80
+ --module_path Module::Path::Name
81
+ --force
82
+ --quiet
83
+
84
+ Terminology:
85
+ Client <-> Driver <-(SOAP)-> Stub <-> Servant
86
+
87
+ Driver and Stub: Automatically generated
88
+ Client and Servant: Skelton generated (you should change)
89
+ __EOU__
90
+ exit 1
91
+ end
92
+
93
+ def parse_opt(getoptlong)
94
+ opt = {}
95
+ wsdl = nil
96
+ begin
97
+ getoptlong.each do |name, arg|
98
+ case name
99
+ when "--wsdl"
100
+ wsdl = arg
101
+ when "--module_path"
102
+ opt['module_path'] = arg
103
+ when "--type"
104
+ case arg
105
+ when "server"
106
+ opt['classdef'] ||= nil
107
+ opt['mapping_registry'] ||= nil
108
+ opt['servant_skelton'] ||= nil
109
+ opt['standalone_server_stub'] ||= nil
110
+ when "client"
111
+ opt['classdef'] ||= nil
112
+ opt['mapping_registry'] ||= nil
113
+ opt['driver'] ||= nil
114
+ opt['client_skelton'] ||= nil
115
+ else
116
+ raise ArgumentError.new("Unknown type #{ arg }")
117
+ end
118
+ when "--classdef", "--mapping_registry",
119
+ "--client_skelton", "--servant_skelton",
120
+ "--cgi_stub", "--servlet_stub", "--standalone_server_stub",
121
+ "--driver"
122
+ opt[name.sub(/^--/, '')] = arg.empty? ? nil : arg
123
+ when "--drivername_postfix"
124
+ opt['drivername_postfix'] = arg
125
+ when "--force"
126
+ opt['force'] = true
127
+ when "--quiet"
128
+ opt['quiet'] = true
129
+ else
130
+ raise ArgumentError.new("Unknown type #{ arg }")
131
+ end
132
+ end
133
+ rescue
134
+ usage_exit
135
+ end
136
+ return wsdl, opt
137
+ end
138
+ end
139
+
140
+ WSDL2RubyApp.new.start
data/bin/xsd2ruby.rb ADDED
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ $:.unshift File.join(File.dirname(__FILE__),'../lib') if ENV['DEBUG_SOAP4R']
4
+
5
+ require 'getoptlong'
6
+ require 'logger'
7
+ require 'logger-application' unless defined?(Logger::Application)
8
+ require 'wsdl/xmlSchema/xsd2ruby'
9
+
10
+ class XSD2RubyApp < Logger::Application
11
+ private
12
+
13
+ OptSet = [
14
+ ['--xsd','-x', GetoptLong::REQUIRED_ARGUMENT],
15
+ ['--module_path','-m', GetoptLong::REQUIRED_ARGUMENT],
16
+ ['--classdef','-e', GetoptLong::OPTIONAL_ARGUMENT],
17
+ ['--mapping_registry','-r', GetoptLong::NO_ARGUMENT],
18
+ ['--mapper','-p', GetoptLong::NO_ARGUMENT],
19
+ ['--force','-f', GetoptLong::NO_ARGUMENT],
20
+ ['--quiet','-q', GetoptLong::NO_ARGUMENT],
21
+ ]
22
+
23
+ def initialize
24
+ super('app')
25
+ STDERR.sync = true
26
+ self.level = Logger::FATAL
27
+ end
28
+
29
+ def run
30
+ @worker = WSDL::XMLSchema::XSD2Ruby.new
31
+ @worker.logger = @log
32
+ location, opt = parse_opt(GetoptLong.new(*OptSet))
33
+ usage_exit unless location
34
+ @worker.location = location
35
+ if opt['quiet']
36
+ self.level = Logger::FATAL
37
+ else
38
+ self.level = Logger::INFO
39
+ end
40
+ @worker.opt.update(opt)
41
+ @worker.run
42
+ 0
43
+ end
44
+
45
+ def usage_exit
46
+ puts <<__EOU__
47
+ Usage: #{ $0 } --xsd xsd_location [options]
48
+ xsd_location: filename or URL
49
+
50
+ Example:
51
+ #{ $0 } --xsd myapp.xsd --classdef foo
52
+
53
+ Options:
54
+ --xsd xsd_location
55
+ --classdef [filenameprefix]
56
+ --mapping_registry
57
+ --mapper
58
+ --module_path [Module::Path::Name]
59
+ --force
60
+ --quiet
61
+ __EOU__
62
+ exit 1
63
+ end
64
+
65
+ def parse_opt(getoptlong)
66
+ opt = {}
67
+ xsd = nil
68
+ begin
69
+ getoptlong.each do |name, arg|
70
+ case name
71
+ when "--xsd"
72
+ xsd = arg
73
+ when "--module_path"
74
+ opt['module_path'] = arg
75
+ when "--classdef", "--mapping_registry", "--mapper"
76
+ opt[name.sub(/^--/, '')] = arg.empty? ? nil : arg
77
+ when "--force"
78
+ opt['force'] = true
79
+ when "--quiet"
80
+ opt['quiet'] = true
81
+ else
82
+ raise ArgumentError.new("Unknown type #{ arg }")
83
+ end
84
+ end
85
+ rescue
86
+ usage_exit
87
+ end
88
+ return xsd, opt
89
+ end
90
+ end
91
+
92
+ XSD2RubyApp.new.start
@@ -0,0 +1,109 @@
1
+ # encoding: UTF-8
2
+ # soap/attachment.rb: SOAP4R - SwA implementation.
3
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
4
+
5
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
6
+ # redistribute it and/or modify it under the same terms of Ruby's license;
7
+ # either the dual license version in 2003, or any later version.
8
+
9
+
10
+ require 'soap/baseData'
11
+ require 'soap/mapping'
12
+
13
+
14
+ module SOAP
15
+
16
+
17
+ class SOAPAttachment < SOAPExternalReference
18
+ attr_reader :data
19
+
20
+ def initialize(value)
21
+ super()
22
+ @data = value
23
+ end
24
+
25
+ private
26
+
27
+ def external_contentid
28
+ @data.contentid
29
+ end
30
+ end
31
+
32
+
33
+ class Attachment
34
+ attr_reader :io
35
+ attr_accessor :contenttype
36
+
37
+ def initialize(string_or_readable = nil)
38
+ @string_or_readable = string_or_readable
39
+ @contenttype = "application/octet-stream"
40
+ @contentid = nil
41
+ @content = nil
42
+ end
43
+
44
+ def contentid
45
+ @contentid ||= Attachment.contentid(self)
46
+ end
47
+
48
+ def contentid=(contentid)
49
+ @contentid = contentid
50
+ end
51
+
52
+ def mime_contentid
53
+ '<' + contentid + '>'
54
+ end
55
+
56
+ def content
57
+ if @content == nil and @string_or_readable != nil
58
+ @content = @string_or_readable.respond_to?(:read) ?
59
+ @string_or_readable.read : @string_or_readable
60
+ end
61
+ @content
62
+ end
63
+
64
+ def to_s
65
+ content
66
+ end
67
+
68
+ def write(out)
69
+ out.write(content)
70
+ end
71
+
72
+ def save(filename)
73
+ File.open(filename, "wb") do |f|
74
+ write(f)
75
+ end
76
+ end
77
+
78
+ def self.contentid(obj)
79
+ # this needs to be fixed
80
+ [obj.__id__.to_s, Process.pid.to_s].join('.')
81
+ end
82
+
83
+ def self.mime_contentid(obj)
84
+ '<' + contentid(obj) + '>'
85
+ end
86
+ end
87
+
88
+
89
+ module Mapping
90
+ class AttachmentFactory < SOAP::Mapping::Factory
91
+ def obj2soap(soap_class, obj, info, map)
92
+ soap_obj = soap_class.new(obj)
93
+ mark_marshalled_obj(obj, soap_obj)
94
+ soap_obj
95
+ end
96
+
97
+ def soap2obj(obj_class, node, info, map)
98
+ obj = node.data
99
+ mark_unmarshalled_obj(node, obj)
100
+ return true, obj
101
+ end
102
+ end
103
+
104
+ DefaultRegistry.add(::SOAP::Attachment, ::SOAP::SOAPAttachment,
105
+ AttachmentFactory.new, nil)
106
+ end
107
+
108
+
109
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: UTF-8
2
+ # SOAP4R - attribute proxy interface.
3
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
4
+
5
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
6
+ # redistribute it and/or modify it under the same terms of Ruby's license;
7
+ # either the dual license version in 2003, or any later version.
8
+
9
+
10
+ module SOAP
11
+
12
+
13
+ module AttrProxy
14
+ def self.included(klass)
15
+ klass.extend(AttrProxyClassSupport)
16
+ end
17
+
18
+ module AttrProxyClassSupport
19
+ def attr_proxy(symbol, assignable = false)
20
+ name = symbol.to_s
21
+ define_method(name) {
22
+ attrproxy.__send__(name)
23
+ }
24
+ if assignable
25
+ aname = name + '='
26
+ define_method(aname) { |rhs|
27
+ attrproxy.__send__(aname, rhs)
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+
35
+ end
@@ -0,0 +1,1095 @@
1
+ # encoding: UTF-8
2
+ # soap/baseData.rb: SOAP4R - Base type library
3
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
4
+
5
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
6
+ # redistribute it and/or modify it under the same terms of Ruby's license;
7
+ # either the dual license version in 2003, or any later version.
8
+
9
+
10
+ require 'xsd/datatypes'
11
+ require 'soap/soap'
12
+ require 'xsd/codegen/gensupport'
13
+ require 'soap/mapping/mapping'
14
+
15
+
16
+ module SOAP
17
+
18
+
19
+ ###
20
+ ## Mix-in module for SOAP base type classes.
21
+ #
22
+ module SOAPModuleUtils
23
+ include SOAP
24
+
25
+ public
26
+
27
+ def decode(elename)
28
+ d = self.new
29
+ d.elename = elename
30
+ d
31
+ end
32
+
33
+ def to_data(str)
34
+ new(str).data
35
+ end
36
+ end
37
+
38
+
39
+ ###
40
+ ## for SOAP type(base and compound)
41
+ #
42
+ module SOAPType
43
+ attr_accessor :encodingstyle
44
+ attr_accessor :elename
45
+ attr_accessor :id
46
+ attr_reader :precedents
47
+ attr_accessor :root
48
+ attr_accessor :parent
49
+ attr_accessor :position
50
+ attr_reader :extraattr
51
+ attr_accessor :definedtype
52
+ attr_accessor :force_typed
53
+
54
+ def initialize(*arg)
55
+ super
56
+ @encodingstyle = nil
57
+ @elename = XSD::QName::EMPTY
58
+ @id = nil
59
+ @precedents = []
60
+ @root = false
61
+ @parent = nil
62
+ @position = nil
63
+ @definedtype = nil
64
+ @extraattr = {}
65
+ @force_typed = false
66
+ end
67
+
68
+ def inspect
69
+ if self.is_a?(XSD::NSDBase)
70
+ sprintf("#<%s:0x%x %s %s>", self.class.name, __id__, self.elename, self.type)
71
+ else
72
+ sprintf("#<%s:0x%x %s>", self.class.name, __id__, self.elename)
73
+ end
74
+ end
75
+
76
+ def rootnode
77
+ node = self
78
+ while node = node.parent
79
+ break if SOAPEnvelope === node
80
+ end
81
+ node
82
+ end
83
+ end
84
+
85
+
86
+ ###
87
+ ## for SOAP base type
88
+ #
89
+ module SOAPBasetype
90
+ include SOAPType
91
+ include SOAP
92
+
93
+ attr_accessor :qualified
94
+
95
+ def initialize(*arg)
96
+ super
97
+ @qualified = nil
98
+ end
99
+ end
100
+
101
+
102
+ ###
103
+ ## for SOAP compound type
104
+ #
105
+ module SOAPCompoundtype
106
+ include SOAPType
107
+ include SOAP
108
+
109
+ attr_accessor :qualified
110
+
111
+ def initialize(*arg)
112
+ super
113
+ @qualified = nil
114
+ end
115
+ end
116
+
117
+ # marker for compound types which have named accessor
118
+ module SOAPNameAccessible
119
+ end
120
+
121
+
122
+ ###
123
+ ## Convenience datatypes.
124
+ #
125
+ class SOAPReference < XSD::NSDBase
126
+ include SOAPBasetype
127
+ extend SOAPModuleUtils
128
+
129
+ public
130
+
131
+ attr_accessor :refid
132
+
133
+ # Override the definition in SOAPBasetype.
134
+ def initialize(obj = nil)
135
+ super()
136
+ @type = XSD::QName::EMPTY
137
+ @refid = nil
138
+ @obj = nil
139
+ __setobj__(obj) if obj
140
+ end
141
+
142
+ def __getobj__
143
+ @obj
144
+ end
145
+
146
+ def __setobj__(obj)
147
+ @obj = obj
148
+ @refid = @obj.id || SOAPReference.create_refid(@obj)
149
+ @obj.id = @refid unless @obj.id
150
+ @obj.precedents << self
151
+ # Copies NSDBase information
152
+ @obj.type = @type unless @obj.type
153
+ end
154
+
155
+ # Why don't I use delegate.rb?
156
+ # -> delegate requires target object type at initialize time.
157
+ # Why don't I use forwardable.rb?
158
+ # -> forwardable requires a list of forwarding methods.
159
+ #
160
+ # ToDo: Maybe I should use forwardable.rb and give it a methods list like
161
+ # delegate.rb...
162
+ #
163
+ def method_missing(msg_id, *params)
164
+ if @obj
165
+ @obj.send(msg_id, *params)
166
+ else
167
+ nil
168
+ end
169
+ end
170
+
171
+ # for referenced base type such as a long value from Axis.
172
+ # base2obj requires a node to respond to :data
173
+ def data
174
+ if @obj.respond_to?(:data)
175
+ @obj.data
176
+ end
177
+ end
178
+
179
+ def refidstr
180
+ '#' + @refid
181
+ end
182
+
183
+ def self.create_refid(obj)
184
+ 'id' + obj.__id__.to_s
185
+ end
186
+
187
+ def self.decode(elename, refidstr)
188
+ if /\A#(.*)\z/ =~ refidstr
189
+ refid = $1
190
+ elsif /\Acid:(.*)\z/ =~ refidstr
191
+ refid = $1
192
+ else
193
+ raise ArgumentError.new("illegal refid #{refidstr}")
194
+ end
195
+ d = super(elename)
196
+ d.refid = refid
197
+ d
198
+ end
199
+ end
200
+
201
+
202
+ class SOAPExternalReference < XSD::NSDBase
203
+ include SOAPBasetype
204
+ extend SOAPModuleUtils
205
+
206
+ def initialize
207
+ super()
208
+ @type = XSD::QName::EMPTY
209
+ end
210
+
211
+ def referred
212
+ rootnode.external_content[external_contentid] = self
213
+ end
214
+
215
+ def refidstr
216
+ 'cid:' + external_contentid
217
+ end
218
+
219
+ private
220
+
221
+ def external_contentid
222
+ raise NotImplementedError.new
223
+ end
224
+ end
225
+
226
+
227
+ class SOAPNil < XSD::XSDNil
228
+ include SOAPBasetype
229
+ extend SOAPModuleUtils
230
+
231
+ public
232
+
233
+ def initialize(value = nil)
234
+ super(value)
235
+ @extraattr[XSD::AttrNilName] = 'true'
236
+ end
237
+ end
238
+
239
+ # SOAPRawString is for sending raw string. In contrast to SOAPString,
240
+ # SOAP4R does not do XML encoding and does not convert its CES. The string it
241
+ # holds is embedded to XML instance directly as a 'xsd:string'.
242
+ class SOAPRawString < XSD::XSDString
243
+ include SOAPBasetype
244
+ extend SOAPModuleUtils
245
+ end
246
+
247
+
248
+ ###
249
+ ## Basic datatypes.
250
+ #
251
+ class SOAPAnySimpleType < XSD::XSDAnySimpleType
252
+ include SOAPBasetype
253
+ extend SOAPModuleUtils
254
+ end
255
+
256
+ class SOAPString < XSD::XSDString
257
+ include SOAPBasetype
258
+ extend SOAPModuleUtils
259
+ SOAPENCType = QName.new(EncodingNamespace, StringLiteral)
260
+ end
261
+
262
+ class SOAPNormalizedString < XSD::XSDNormalizedString
263
+ include SOAPBasetype
264
+ extend SOAPModuleUtils
265
+ SOAPENCType = QName.new(EncodingNamespace, NormalizedStringLiteral)
266
+ end
267
+
268
+ class SOAPToken < XSD::XSDToken
269
+ include SOAPBasetype
270
+ extend SOAPModuleUtils
271
+ SOAPENCType = QName.new(EncodingNamespace, TokenLiteral)
272
+ end
273
+
274
+ class SOAPLanguage < XSD::XSDLanguage
275
+ include SOAPBasetype
276
+ extend SOAPModuleUtils
277
+ SOAPENCType = QName.new(EncodingNamespace, LanguageLiteral)
278
+ end
279
+
280
+ class SOAPNMTOKEN < XSD::XSDNMTOKEN
281
+ include SOAPBasetype
282
+ extend SOAPModuleUtils
283
+ SOAPENCType = QName.new(EncodingNamespace, NMTOKENLiteral)
284
+ end
285
+
286
+ class SOAPNMTOKENS < XSD::XSDNMTOKENS
287
+ include SOAPBasetype
288
+ extend SOAPModuleUtils
289
+ SOAPENCType = QName.new(EncodingNamespace, NMTOKENSLiteral)
290
+ end
291
+
292
+ class SOAPName < XSD::XSDName
293
+ include SOAPBasetype
294
+ extend SOAPModuleUtils
295
+ SOAPENCType = QName.new(EncodingNamespace, NameLiteral)
296
+ end
297
+
298
+ class SOAPNCName < XSD::XSDNCName
299
+ include SOAPBasetype
300
+ extend SOAPModuleUtils
301
+ SOAPENCType = QName.new(EncodingNamespace, NCNameLiteral)
302
+ end
303
+
304
+ class SOAPID < XSD::XSDID
305
+ include SOAPBasetype
306
+ extend SOAPModuleUtils
307
+ SOAPENCType = QName.new(EncodingNamespace, IDLiteral)
308
+ end
309
+
310
+ class SOAPIDREF < XSD::XSDIDREF
311
+ include SOAPBasetype
312
+ extend SOAPModuleUtils
313
+ SOAPENCType = QName.new(EncodingNamespace, IDREFLiteral)
314
+ end
315
+
316
+ class SOAPIDREFS < XSD::XSDIDREFS
317
+ include SOAPBasetype
318
+ extend SOAPModuleUtils
319
+ SOAPENCType = QName.new(EncodingNamespace, IDREFSLiteral)
320
+ end
321
+
322
+ class SOAPENTITY < XSD::XSDENTITY
323
+ include SOAPBasetype
324
+ extend SOAPModuleUtils
325
+ SOAPENCType = QName.new(EncodingNamespace, ENTITYLiteral)
326
+ end
327
+
328
+ class SOAPENTITIES < XSD::XSDENTITIES
329
+ include SOAPBasetype
330
+ extend SOAPModuleUtils
331
+ SOAPENCType = QName.new(EncodingNamespace, ENTITIESLiteral)
332
+ end
333
+
334
+ class SOAPBoolean < XSD::XSDBoolean
335
+ include SOAPBasetype
336
+ extend SOAPModuleUtils
337
+ SOAPENCType = QName.new(EncodingNamespace, BooleanLiteral)
338
+ end
339
+
340
+ class SOAPDecimal < XSD::XSDDecimal
341
+ include SOAPBasetype
342
+ extend SOAPModuleUtils
343
+ SOAPENCType = QName.new(EncodingNamespace, DecimalLiteral)
344
+ end
345
+
346
+ class SOAPFloat < XSD::XSDFloat
347
+ include SOAPBasetype
348
+ extend SOAPModuleUtils
349
+ SOAPENCType = QName.new(EncodingNamespace, FloatLiteral)
350
+ end
351
+
352
+ class SOAPDouble < XSD::XSDDouble
353
+ include SOAPBasetype
354
+ extend SOAPModuleUtils
355
+ SOAPENCType = QName.new(EncodingNamespace, DoubleLiteral)
356
+ end
357
+
358
+ class SOAPDuration < XSD::XSDDuration
359
+ include SOAPBasetype
360
+ extend SOAPModuleUtils
361
+ SOAPENCType = QName.new(EncodingNamespace, DurationLiteral)
362
+ end
363
+
364
+ class SOAPDateTime < XSD::XSDDateTime
365
+ include SOAPBasetype
366
+ extend SOAPModuleUtils
367
+ SOAPENCType = QName.new(EncodingNamespace, DateTimeLiteral)
368
+ end
369
+
370
+ class SOAPTime < XSD::XSDTime
371
+ include SOAPBasetype
372
+ extend SOAPModuleUtils
373
+ SOAPENCType = QName.new(EncodingNamespace, TimeLiteral)
374
+ end
375
+
376
+ class SOAPDate < XSD::XSDDate
377
+ include SOAPBasetype
378
+ extend SOAPModuleUtils
379
+ SOAPENCType = QName.new(EncodingNamespace, DateLiteral)
380
+ end
381
+
382
+ class SOAPGYearMonth < XSD::XSDGYearMonth
383
+ include SOAPBasetype
384
+ extend SOAPModuleUtils
385
+ SOAPENCType = QName.new(EncodingNamespace, GYearMonthLiteral)
386
+ end
387
+
388
+ class SOAPGYear < XSD::XSDGYear
389
+ include SOAPBasetype
390
+ extend SOAPModuleUtils
391
+ SOAPENCType = QName.new(EncodingNamespace, GYearLiteral)
392
+ end
393
+
394
+ class SOAPGMonthDay < XSD::XSDGMonthDay
395
+ include SOAPBasetype
396
+ extend SOAPModuleUtils
397
+ SOAPENCType = QName.new(EncodingNamespace, GMonthDayLiteral)
398
+ end
399
+
400
+ class SOAPGDay < XSD::XSDGDay
401
+ include SOAPBasetype
402
+ extend SOAPModuleUtils
403
+ SOAPENCType = QName.new(EncodingNamespace, GDayLiteral)
404
+ end
405
+
406
+ class SOAPGMonth < XSD::XSDGMonth
407
+ include SOAPBasetype
408
+ extend SOAPModuleUtils
409
+ SOAPENCType = QName.new(EncodingNamespace, GMonthLiteral)
410
+ end
411
+
412
+ class SOAPHexBinary < XSD::XSDHexBinary
413
+ include SOAPBasetype
414
+ extend SOAPModuleUtils
415
+ SOAPENCType = QName.new(EncodingNamespace, HexBinaryLiteral)
416
+ end
417
+
418
+ class SOAPBase64 < XSD::XSDBase64Binary
419
+ include SOAPBasetype
420
+ extend SOAPModuleUtils
421
+ Type = SOAPENCType = QName.new(EncodingNamespace, Base64Literal)
422
+
423
+ public
424
+
425
+ def initialize(value = nil)
426
+ super(value)
427
+ @type = Type
428
+ end
429
+
430
+ def as_xsd
431
+ @type = XSD::XSDBase64Binary::Type
432
+ end
433
+ end
434
+
435
+ class SOAPAnyURI < XSD::XSDAnyURI
436
+ include SOAPBasetype
437
+ extend SOAPModuleUtils
438
+ SOAPENCType = QName.new(EncodingNamespace, AnyURILiteral)
439
+ end
440
+
441
+ class SOAPQName < XSD::XSDQName
442
+ include SOAPBasetype
443
+ extend SOAPModuleUtils
444
+ SOAPENCType = QName.new(EncodingNamespace, QNameLiteral)
445
+ end
446
+
447
+
448
+ class SOAPInteger < XSD::XSDInteger
449
+ include SOAPBasetype
450
+ extend SOAPModuleUtils
451
+ SOAPENCType = QName.new(EncodingNamespace, IntegerLiteral)
452
+ end
453
+
454
+ class SOAPNonPositiveInteger < XSD::XSDNonPositiveInteger
455
+ include SOAPBasetype
456
+ extend SOAPModuleUtils
457
+ SOAPENCType = QName.new(EncodingNamespace, NonPositiveIntegerLiteral)
458
+ end
459
+
460
+ class SOAPNegativeInteger < XSD::XSDNegativeInteger
461
+ include SOAPBasetype
462
+ extend SOAPModuleUtils
463
+ SOAPENCType = QName.new(EncodingNamespace, NegativeIntegerLiteral)
464
+ end
465
+
466
+ class SOAPLong < XSD::XSDLong
467
+ include SOAPBasetype
468
+ extend SOAPModuleUtils
469
+ SOAPENCType = QName.new(EncodingNamespace, LongLiteral)
470
+ end
471
+
472
+ class SOAPInt < XSD::XSDInt
473
+ include SOAPBasetype
474
+ extend SOAPModuleUtils
475
+ SOAPENCType = QName.new(EncodingNamespace, IntLiteral)
476
+ end
477
+
478
+ class SOAPShort < XSD::XSDShort
479
+ include SOAPBasetype
480
+ extend SOAPModuleUtils
481
+ SOAPENCType = QName.new(EncodingNamespace, ShortLiteral)
482
+ end
483
+
484
+ class SOAPByte < XSD::XSDByte
485
+ include SOAPBasetype
486
+ extend SOAPModuleUtils
487
+ SOAPENCType = QName.new(EncodingNamespace, ByteLiteral)
488
+ end
489
+
490
+ class SOAPNonNegativeInteger < XSD::XSDNonNegativeInteger
491
+ include SOAPBasetype
492
+ extend SOAPModuleUtils
493
+ SOAPENCType = QName.new(EncodingNamespace, NonNegativeIntegerLiteral)
494
+ end
495
+
496
+ class SOAPUnsignedLong < XSD::XSDUnsignedLong
497
+ include SOAPBasetype
498
+ extend SOAPModuleUtils
499
+ SOAPENCType = QName.new(EncodingNamespace, UnsignedLongLiteral)
500
+ end
501
+
502
+ class SOAPUnsignedInt < XSD::XSDUnsignedInt
503
+ include SOAPBasetype
504
+ extend SOAPModuleUtils
505
+ SOAPENCType = QName.new(EncodingNamespace, UnsignedIntLiteral)
506
+ end
507
+
508
+ class SOAPUnsignedShort < XSD::XSDUnsignedShort
509
+ include SOAPBasetype
510
+ extend SOAPModuleUtils
511
+ SOAPENCType = QName.new(EncodingNamespace, UnsignedShortLiteral)
512
+ end
513
+
514
+ class SOAPUnsignedByte < XSD::XSDUnsignedByte
515
+ include SOAPBasetype
516
+ extend SOAPModuleUtils
517
+ SOAPENCType = QName.new(EncodingNamespace, UnsignedByteLiteral)
518
+ end
519
+
520
+ class SOAPPositiveInteger < XSD::XSDPositiveInteger
521
+ include SOAPBasetype
522
+ extend SOAPModuleUtils
523
+ SOAPENCType = QName.new(EncodingNamespace, PositiveIntegerLiteral)
524
+ end
525
+
526
+
527
+ ###
528
+ ## Compound datatypes.
529
+ #
530
+ class SOAPStruct < XSD::NSDBase
531
+ include Enumerable
532
+ include SOAPCompoundtype
533
+ include SOAPNameAccessible
534
+
535
+ public
536
+
537
+ def initialize(type = nil)
538
+ super()
539
+ @type = type || XSD::QName::EMPTY
540
+ @array = []
541
+ @data = []
542
+ end
543
+
544
+ def to_s
545
+ str = ''
546
+ self.each do |key, data|
547
+ str << "#{key}: #{data}\n"
548
+ end
549
+ str
550
+ end
551
+
552
+ def add(name, value)
553
+ value = SOAPNil.new if value.nil?
554
+ @array.push(name)
555
+ value.elename = value.elename.dup_name(name)
556
+ @data.push(value)
557
+ value.parent = self if value.respond_to?(:parent=)
558
+ value
559
+ end
560
+
561
+ def [](idx)
562
+ if idx.is_a?(Range)
563
+ @data[idx]
564
+ elsif idx.is_a?(Integer)
565
+ if (idx > @array.size)
566
+ raise ArrayIndexOutOfBoundsError.new('In ' << @type.name)
567
+ end
568
+ @data[idx]
569
+ else
570
+ if @array.include?(idx)
571
+ @data[@array.index(idx)]
572
+ else
573
+ nil
574
+ end
575
+ end
576
+ end
577
+
578
+ def []=(idx, data)
579
+ if @array.include?(idx)
580
+ data.parent = self if data.respond_to?(:parent=)
581
+ @data[@array.index(idx)] = data
582
+ else
583
+ add(idx, data)
584
+ end
585
+ end
586
+
587
+ def key?(name)
588
+ @array.include?(name)
589
+ end
590
+
591
+ def members
592
+ @array
593
+ end
594
+
595
+ def have_member
596
+ !@array.empty?
597
+ end
598
+
599
+ def to_obj
600
+ hash = {}
601
+ proptype = {}
602
+ each do |k, v|
603
+ value = v.respond_to?(:to_obj) ? v.to_obj : v.to_s
604
+ case proptype[k]
605
+ when :single
606
+ hash[k] = [hash[k], value]
607
+ proptype[k] = :multi
608
+ when :multi
609
+ hash[k] << value
610
+ else
611
+ hash[k] = value
612
+ proptype[k] = :single
613
+ end
614
+ end
615
+ hash
616
+ end
617
+
618
+ def each
619
+ idx = 0
620
+ while idx < @array.length
621
+ yield(@array[idx], @data[idx])
622
+ idx += 1
623
+ end
624
+ end
625
+
626
+ def replace
627
+ members.each do |member|
628
+ self[member] = yield(self[member])
629
+ end
630
+ end
631
+
632
+ def self.decode(elename, type)
633
+ s = SOAPStruct.new(type)
634
+ s.elename = elename
635
+ s
636
+ end
637
+ end
638
+
639
+
640
+ # SOAPElement is not typed so it is not derived from NSDBase.
641
+ class SOAPElement
642
+ include Enumerable
643
+ include SOAPCompoundtype
644
+ include SOAPNameAccessible
645
+
646
+ attr_accessor :type
647
+ # Text interface.
648
+ attr_accessor :text
649
+ alias data text
650
+
651
+ def initialize(elename, text = nil)
652
+ super()
653
+ if elename.nil?
654
+ elename = XSD::QName::EMPTY
655
+ else
656
+ elename = Mapping.to_qname(elename)
657
+ end
658
+ @encodingstyle = LiteralNamespace
659
+ @elename = elename
660
+ @type = nil
661
+
662
+ @array = []
663
+ @data = []
664
+ @text = text
665
+ end
666
+
667
+ def inspect
668
+ sprintf("#<%s:0x%x %s>", self.class.name, __id__, self.elename) +
669
+ (@text ? " #{@text.inspect}" : '') +
670
+ @data.collect { |ele| "\n#{ele.inspect}" }.join.gsub(/^/, ' ')
671
+ end
672
+
673
+ def set(value)
674
+ @text = value
675
+ end
676
+
677
+ # Element interfaces.
678
+ def add(value)
679
+ name = value.elename.name
680
+ @array.push(name)
681
+ @data.push(value)
682
+ value.parent = self if value.respond_to?(:parent=)
683
+ value
684
+ end
685
+
686
+ def [](idx)
687
+ if @array.include?(idx)
688
+ @data[@array.index(idx)]
689
+ else
690
+ nil
691
+ end
692
+ end
693
+
694
+ def []=(idx, data)
695
+ if @array.include?(idx)
696
+ data.parent = self if data.respond_to?(:parent=)
697
+ @data[@array.index(idx)] = data
698
+ else
699
+ add(data)
700
+ end
701
+ end
702
+
703
+ def key?(name)
704
+ @array.include?(name)
705
+ end
706
+
707
+ def members
708
+ @array
709
+ end
710
+
711
+ def have_member
712
+ !@array.empty?
713
+ end
714
+
715
+ def to_obj
716
+ if !have_member
717
+ @text
718
+ else
719
+ hash = {}
720
+ proptype = {}
721
+ each do |k, v|
722
+ value = v.respond_to?(:to_obj) ? v.to_obj : v.to_s
723
+ case proptype[k]
724
+ when :single
725
+ hash[k] = [hash[k], value]
726
+ proptype[k] = :multi
727
+ when :multi
728
+ hash[k] << value
729
+ else
730
+ hash[k] = value
731
+ proptype[k] = :single
732
+ end
733
+ end
734
+ hash
735
+ end
736
+ end
737
+
738
+ def each
739
+ idx = 0
740
+ while idx < @array.length
741
+ yield(@array[idx], @data[idx])
742
+ idx += 1
743
+ end
744
+ end
745
+
746
+ def self.decode(elename)
747
+ o = SOAPElement.new(elename)
748
+ o
749
+ end
750
+
751
+ def self.from_objs(objs)
752
+ objs.collect { |value|
753
+ if value.is_a?(SOAPElement)
754
+ value
755
+ else
756
+ k, v = value
757
+ ele = from_obj(v)
758
+ ele.elename = XSD::QName.new(nil, k)
759
+ ele
760
+ end
761
+ }
762
+ end
763
+
764
+ # when obj is a Hash or an Array:
765
+ # when key starts with "xmlattr_":
766
+ # value is added as an XML attribute with the key name however the
767
+ # "xmlattr_" is dropped from the name.
768
+ # when key starts with "xmlele_":
769
+ # value is added as an XML element with the key name however the
770
+ # "xmlele_" is dropped from the name.
771
+ # if else:
772
+ # value is added as an XML element with the key name.
773
+ def self.from_obj(obj, namespace = nil)
774
+ return obj if obj.is_a?(SOAPElement)
775
+ o = SOAPElement.new(nil)
776
+ case obj
777
+ when nil
778
+ o.text = nil
779
+ when Hash, Array
780
+ obj.each do |name, value|
781
+ addname, is_attr = parse_name(name, namespace)
782
+ if value.is_a?(Array)
783
+ value.each do |subvalue|
784
+ if is_attr
785
+ o.extraattr[addname] = subvalue
786
+ else
787
+ child = from_obj(subvalue, namespace)
788
+ child.elename = addname
789
+ o.add(child)
790
+ end
791
+ end
792
+ else
793
+ if is_attr
794
+ o.extraattr[addname] = value
795
+ else
796
+ child = from_obj(value, namespace)
797
+ child.elename = addname
798
+ o.add(child)
799
+ end
800
+ end
801
+ end
802
+ else
803
+ o.text = obj.to_s
804
+ end
805
+ o
806
+ end
807
+
808
+ def self.parse_name(obj, namespace = nil)
809
+ qname = to_qname(obj, namespace)
810
+ if /\Axmlele_/ =~ qname.name
811
+ qname = XSD::QName.new(qname.namespace, qname.name.sub(/\Axmlele_/, ''))
812
+ return qname, false
813
+ elsif /\Axmlattr_/ =~ qname.name
814
+ qname = XSD::QName.new(qname.namespace, qname.name.sub(/\Axmlattr_/, ''))
815
+ return qname, true
816
+ else
817
+ return qname, false
818
+ end
819
+ end
820
+
821
+ def self.to_qname(obj, namespace = nil)
822
+ if obj.is_a?(XSD::QName)
823
+ obj
824
+ elsif /\A(.+):([^:]+)\z/ =~ obj.to_s
825
+ XSD::QName.new($1, $2)
826
+ else
827
+ XSD::QName.new(namespace, obj.to_s)
828
+ end
829
+ end
830
+ end
831
+
832
+
833
+ class SOAPRawData < SOAPElement
834
+ def initialize(obj)
835
+ super(XSD::QName::EMPTY)
836
+ @obj = obj
837
+ end
838
+
839
+ def to_xmlpart
840
+ @obj.to_xmlpart
841
+ end
842
+ end
843
+
844
+
845
+ class SOAPREXMLElementWrap
846
+ def initialize(ele)
847
+ @ele = ele
848
+ end
849
+
850
+ def to_xmlpart
851
+ @ele.to_s
852
+ end
853
+ end
854
+
855
+
856
+ class SOAPArray < XSD::NSDBase
857
+ include SOAPCompoundtype
858
+ include Enumerable
859
+
860
+ public
861
+
862
+ attr_accessor :sparse
863
+
864
+ attr_reader :offset, :rank
865
+ attr_accessor :size, :size_fixed
866
+ attr_reader :arytype
867
+
868
+ def initialize(type = nil, rank = 1, arytype = nil)
869
+ super()
870
+ @type = type || ValueArrayName
871
+ @rank = rank
872
+ @data = Array.new
873
+ @sparse = false
874
+ @offset = Array.new(rank, 0)
875
+ @size = Array.new(rank, 0)
876
+ @size_fixed = false
877
+ @position = nil
878
+ @arytype = arytype
879
+ end
880
+
881
+ def offset=(var)
882
+ @offset = var
883
+ @sparse = true
884
+ end
885
+
886
+ def add(value)
887
+ self[*(@offset)] = value
888
+ end
889
+
890
+ def have_member
891
+ !@data.empty?
892
+ end
893
+
894
+ def [](*idxary)
895
+ if idxary.size != @rank
896
+ raise ArgumentError.new("given #{idxary.size} params does not match rank: #{@rank}")
897
+ end
898
+ retrieve(idxary)
899
+ end
900
+
901
+ def []=(*idxary)
902
+ value = idxary.slice!(-1)
903
+ if idxary.size != @rank
904
+ raise ArgumentError.new("given #{idxary.size} params(#{idxary}) does not match rank: #{@rank}")
905
+ end
906
+ idx = 0
907
+ while idx < idxary.size
908
+ if idxary[idx] + 1 > @size[idx]
909
+ @size[idx] = idxary[idx] + 1
910
+ end
911
+ idx += 1
912
+ end
913
+ data = retrieve(idxary[0, idxary.size - 1])
914
+ data[idxary.last] = value
915
+ if value.is_a?(SOAPType)
916
+ value.elename = ITEM_NAME
917
+ # Sync type
918
+ unless @type.name
919
+ @type = XSD::QName.new(value.type.namespace,
920
+ SOAPArray.create_arytype(value.type.name, @rank))
921
+ end
922
+ value.type ||= @type
923
+ end
924
+ @offset = idxary
925
+ value.parent = self if value.respond_to?(:parent=)
926
+ offsetnext
927
+ end
928
+
929
+ def each
930
+ @data.each do |data|
931
+ yield(data)
932
+ end
933
+ end
934
+
935
+ def to_a
936
+ @data.dup
937
+ end
938
+
939
+ def replace
940
+ @data = deep_map(@data) do |ele|
941
+ yield(ele)
942
+ end
943
+ end
944
+
945
+ def deep_map(ary, &block)
946
+ ary.collect do |ele|
947
+ if ele.is_a?(Array)
948
+ deep_map(ele, &block)
949
+ else
950
+ new_obj = block.call(ele)
951
+ new_obj.elename = ITEM_NAME
952
+ new_obj
953
+ end
954
+ end
955
+ end
956
+
957
+ def include?(var)
958
+ traverse_data(@data) do |v, *rank|
959
+ if v.is_a?(SOAPBasetype) && v.data == var
960
+ return true
961
+ end
962
+ end
963
+ false
964
+ end
965
+
966
+ def traverse
967
+ traverse_data(@data) do |v, *rank|
968
+ unless @sparse
969
+ yield(v)
970
+ else
971
+ yield(v, *rank) if v && !v.is_a?(SOAPNil)
972
+ end
973
+ end
974
+ end
975
+
976
+ def soap2array(ary)
977
+ traverse_data(@data) do |v, *position|
978
+ iteary = ary
979
+ rank = 1
980
+ while rank < position.size
981
+ idx = position[rank - 1]
982
+ if iteary[idx].nil?
983
+ iteary = iteary[idx] = Array.new
984
+ else
985
+ iteary = iteary[idx]
986
+ end
987
+ rank += 1
988
+ end
989
+ if block_given?
990
+ iteary[position.last] = yield(v)
991
+ else
992
+ iteary[position.last] = v
993
+ end
994
+ end
995
+ end
996
+
997
+ def position
998
+ @position
999
+ end
1000
+
1001
+ private
1002
+
1003
+ ITEM_NAME = XSD::QName.new(nil, 'item')
1004
+
1005
+ def retrieve(idxary)
1006
+ data = @data
1007
+ rank = 1
1008
+ while rank <= idxary.size
1009
+ idx = idxary[rank - 1]
1010
+ if data[idx].nil?
1011
+ data = data[idx] = Array.new
1012
+ else
1013
+ data = data[idx]
1014
+ end
1015
+ rank += 1
1016
+ end
1017
+ data
1018
+ end
1019
+
1020
+ def traverse_data(data, rank = 1)
1021
+ idx = 0
1022
+ while idx < ranksize(rank)
1023
+ if rank < @rank and data[idx]
1024
+ traverse_data(data[idx], rank + 1) do |*v|
1025
+ v[1, 0] = idx
1026
+ yield(*v)
1027
+ end
1028
+ else
1029
+ yield(data[idx], idx)
1030
+ end
1031
+ idx += 1
1032
+ end
1033
+ end
1034
+
1035
+ def ranksize(rank)
1036
+ @size[rank - 1]
1037
+ end
1038
+
1039
+ def offsetnext
1040
+ move = false
1041
+ idx = @offset.size - 1
1042
+ while !move && idx >= 0
1043
+ @offset[idx] += 1
1044
+ if @size_fixed
1045
+ if @offset[idx] < @size[idx]
1046
+ move = true
1047
+ else
1048
+ @offset[idx] = 0
1049
+ idx -= 1
1050
+ end
1051
+ else
1052
+ move = true
1053
+ end
1054
+ end
1055
+ end
1056
+
1057
+ def self.decode(elename, type, arytype)
1058
+ typestr, nofary = parse_type(arytype.name)
1059
+ rank = nofary.count(',') + 1
1060
+ plain_arytype = XSD::QName.new(arytype.namespace, typestr)
1061
+ o = SOAPArray.new(type, rank, plain_arytype)
1062
+ size = []
1063
+ nofary.split(',').each do |s|
1064
+ if s.empty?
1065
+ size.clear
1066
+ break
1067
+ else
1068
+ size << s.to_i
1069
+ end
1070
+ end
1071
+ unless size.empty?
1072
+ o.size = size
1073
+ o.size_fixed = true
1074
+ end
1075
+ o.elename = elename
1076
+ o
1077
+ end
1078
+
1079
+ def self.create_arytype(typename, rank)
1080
+ "#{typename}[" << ',' * (rank - 1) << ']'
1081
+ end
1082
+
1083
+ TypeParseRegexp = Regexp.new('^(.+)\[([\d,]*)\]$', nil, 'n')
1084
+
1085
+ def self.parse_type(string)
1086
+ TypeParseRegexp =~ string
1087
+ return $1, $2
1088
+ end
1089
+ end
1090
+
1091
+
1092
+ require 'soap/mapping/typeMap'
1093
+
1094
+
1095
+ end