railsware-soap4r 1.5.8.1

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