soap2r 1.5.8

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