soap4r 1.5.7 → 1.5.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. data/bin/wsdl2ruby.rb +8 -2
  2. data/lib/soap/baseData.rb +93 -43
  3. data/lib/soap/element.rb +11 -8
  4. data/lib/soap/encodingstyle/handler.rb +15 -4
  5. data/lib/soap/encodingstyle/literalHandler.rb +18 -24
  6. data/lib/soap/encodingstyle/soapHandler.rb +34 -77
  7. data/lib/soap/generator.rb +74 -48
  8. data/lib/soap/header/handler.rb +1 -1
  9. data/lib/soap/header/mappinghandler.rb +47 -0
  10. data/lib/soap/mapping/encodedregistry.rb +19 -13
  11. data/lib/soap/mapping/factory.rb +19 -3
  12. data/lib/soap/mapping/literalregistry.rb +47 -35
  13. data/lib/soap/mapping/mapping.rb +92 -24
  14. data/lib/soap/mapping/registry.rb +34 -18
  15. data/lib/soap/mapping/schemadefinition.rb +8 -1
  16. data/lib/soap/mapping/typeMap.rb +18 -0
  17. data/lib/soap/mapping/wsdlencodedregistry.rb +8 -50
  18. data/lib/soap/mapping/wsdlliteralregistry.rb +45 -39
  19. data/lib/soap/nestedexception.rb +42 -0
  20. data/lib/soap/netHttpClient.rb +1 -0
  21. data/lib/soap/ns.rb +34 -0
  22. data/lib/soap/parser.rb +32 -29
  23. data/lib/soap/processor.rb +1 -1
  24. data/lib/soap/rpc/driver.rb +1 -0
  25. data/lib/soap/rpc/element.rb +18 -6
  26. data/lib/soap/rpc/httpserver.rb +38 -24
  27. data/lib/soap/rpc/proxy.rb +14 -11
  28. data/lib/soap/rpc/router.rb +4 -1
  29. data/lib/soap/soap.rb +7 -6
  30. data/lib/soap/wsdlDriver.rb +29 -8
  31. data/lib/tags +5690 -0
  32. data/lib/wsdl/definitions.rb +26 -40
  33. data/lib/wsdl/info.rb +11 -0
  34. data/lib/wsdl/parser.rb +2 -2
  35. data/lib/wsdl/soap/cgiStubCreator.rb +10 -5
  36. data/lib/wsdl/soap/classDefCreator.rb +140 -113
  37. data/lib/wsdl/soap/classDefCreatorSupport.rb +94 -12
  38. data/lib/wsdl/soap/classNameCreator.rb +54 -0
  39. data/lib/wsdl/soap/clientSkeltonCreator.rb +6 -5
  40. data/lib/wsdl/soap/complexType.rb +10 -1
  41. data/lib/wsdl/soap/definitions.rb +4 -0
  42. data/lib/wsdl/soap/driverCreator.rb +14 -6
  43. data/lib/wsdl/soap/element.rb +4 -0
  44. data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +11 -55
  45. data/lib/wsdl/soap/literalMappingRegistryCreator.rb +28 -126
  46. data/lib/wsdl/soap/mappingRegistryCreator.rb +9 -3
  47. data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +209 -94
  48. data/lib/wsdl/soap/methodDefCreator.rb +12 -16
  49. data/lib/wsdl/soap/servantSkeltonCreator.rb +3 -2
  50. data/lib/wsdl/soap/servletStubCreator.rb +107 -0
  51. data/lib/wsdl/soap/standaloneServerStubCreator.rb +10 -5
  52. data/lib/wsdl/soap/wsdl2ruby.rb +28 -13
  53. data/lib/wsdl/wsdl.rb +2 -1
  54. data/lib/wsdl/xmlSchema/anyAttribute.rb +48 -0
  55. data/lib/wsdl/xmlSchema/attributeGroup.rb +86 -0
  56. data/lib/wsdl/xmlSchema/choice.rb +4 -1
  57. data/lib/wsdl/xmlSchema/complexContent.rb +1 -1
  58. data/lib/wsdl/xmlSchema/complexExtension.rb +9 -1
  59. data/lib/wsdl/xmlSchema/complexRestriction.rb +8 -0
  60. data/lib/wsdl/xmlSchema/complexType.rb +38 -5
  61. data/lib/wsdl/xmlSchema/data.rb +30 -7
  62. data/lib/wsdl/xmlSchema/element.rb +10 -2
  63. data/lib/wsdl/xmlSchema/fractiondigits.rb +37 -0
  64. data/lib/wsdl/xmlSchema/group.rb +118 -0
  65. data/lib/wsdl/xmlSchema/import.rb +11 -23
  66. data/lib/wsdl/xmlSchema/importHandler.rb +45 -0
  67. data/lib/wsdl/xmlSchema/include.rb +11 -17
  68. data/lib/wsdl/xmlSchema/length.rb +3 -1
  69. data/lib/wsdl/xmlSchema/maxexclusive.rb +37 -0
  70. data/lib/wsdl/xmlSchema/maxinclusive.rb +37 -0
  71. data/lib/wsdl/xmlSchema/maxlength.rb +3 -1
  72. data/lib/wsdl/xmlSchema/minexclusive.rb +37 -0
  73. data/lib/wsdl/xmlSchema/mininclusive.rb +37 -0
  74. data/lib/wsdl/xmlSchema/minlength.rb +3 -1
  75. data/lib/wsdl/xmlSchema/schema.rb +34 -0
  76. data/lib/wsdl/xmlSchema/sequence.rb +4 -1
  77. data/lib/wsdl/xmlSchema/simpleExtension.rb +8 -0
  78. data/lib/wsdl/xmlSchema/simpleRestriction.rb +49 -8
  79. data/lib/wsdl/xmlSchema/totaldigits.rb +37 -0
  80. data/lib/wsdl/xmlSchema/whitespace.rb +37 -0
  81. data/lib/wsdl/xmlSchema/xsd2ruby.rb +13 -4
  82. data/lib/xsd/charset.rb +8 -6
  83. data/lib/xsd/codegen/classdef.rb +5 -0
  84. data/lib/xsd/codegen/moduledef.rb +17 -0
  85. data/lib/xsd/datatypes.rb +165 -20
  86. data/lib/xsd/mapping.rb +13 -5
  87. data/lib/xsd/namedelements.rb +8 -0
  88. data/lib/xsd/ns.rb +50 -14
  89. data/lib/xsd/qname.rb +3 -2
  90. data/lib/xsd/xmlparser.rb +4 -3
  91. data/test/soap/asp.net/test_aspdotnet.rb +1 -1
  92. data/test/soap/auth/test_basic.rb +4 -3
  93. data/test/soap/auth/test_digest.rb +4 -3
  94. data/test/soap/calc/test_calc.rb +6 -4
  95. data/test/soap/calc/test_calc2.rb +6 -4
  96. data/test/soap/calc/test_calc_cgi.rb +6 -4
  97. data/test/soap/fault/test_customfault.rb +6 -4
  98. data/test/soap/fault/test_soaparray.rb +35 -0
  99. data/test/soap/filter/test_filter.rb +2 -2
  100. data/test/soap/header/test_authheader.rb +2 -2
  101. data/test/soap/header/test_authheader_cgi.rb +3 -3
  102. data/test/soap/header/test_simplehandler.rb +2 -2
  103. data/test/soap/helloworld/test_helloworld.rb +6 -4
  104. data/test/soap/ssl/test_ssl.rb +1 -1
  105. data/test/soap/struct/test_struct.rb +2 -2
  106. data/test/soap/swa/test_file.rb +6 -4
  107. data/test/soap/test_basetype.rb +4 -4
  108. data/test/soap/test_cookie.rb +2 -2
  109. data/test/soap/test_custom_ns.rb +50 -8
  110. data/test/soap/test_custommap.rb +6 -4
  111. data/test/soap/test_empty.rb +6 -4
  112. data/test/soap/test_envelopenamespace.rb +2 -2
  113. data/test/soap/test_extraattr.rb +6 -7
  114. data/test/soap/test_generator.rb +27 -0
  115. data/test/soap/test_mapping.rb +10 -0
  116. data/test/soap/test_nestedexception.rb +56 -0
  117. data/test/soap/test_nil.rb +6 -4
  118. data/test/soap/test_no_indent.rb +6 -4
  119. data/test/soap/test_response_as_xml.rb +2 -2
  120. data/test/soap/test_streamhandler.rb +6 -3
  121. data/test/soap/test_styleuse.rb +2 -2
  122. data/test/soap/wsdlDriver/test_calc.rb +2 -2
  123. data/test/soap/wsdlDriver/test_document.rb +2 -2
  124. data/test/soap/wsdlDriver/test_simpletype.rb +2 -2
  125. data/test/wsdl/abstract/test_abstract.rb +1 -1
  126. data/test/wsdl/anonymous/expectedClassDef.rb +128 -0
  127. data/test/wsdl/anonymous/expectedDriver.rb +59 -0
  128. data/test/wsdl/anonymous/expectedMappingRegistry.rb +176 -0
  129. data/test/wsdl/anonymous/lp.wsdl +147 -0
  130. data/test/wsdl/anonymous/test_anonymous.rb +130 -0
  131. data/test/wsdl/any/expectedDriver.rb +3 -2
  132. data/test/wsdl/any/expectedEcho.rb +22 -2
  133. data/test/wsdl/any/expectedMappingRegistry.rb +63 -0
  134. data/test/wsdl/any/expectedService.rb +3 -1
  135. data/test/wsdl/any/test_any.rb +2 -7
  136. data/test/wsdl/axisArray/axisArray.wsdl +31 -4
  137. data/test/wsdl/axisArray/test_axisarray.rb +58 -3
  138. data/test/wsdl/choice/choice.wsdl +39 -0
  139. data/test/wsdl/choice/test_choice.rb +134 -7
  140. data/test/wsdl/complexcontent/test_echo.rb +1 -1
  141. data/test/wsdl/datetime/test_datetime.rb +2 -2
  142. data/test/wsdl/document/array/double.wsdl +45 -6
  143. data/test/wsdl/document/array/test_array.rb +68 -1
  144. data/test/wsdl/document/document.wsdl +2 -0
  145. data/test/wsdl/document/test_nosoapaction.rb +1 -1
  146. data/test/wsdl/document/test_number.rb +1 -1
  147. data/test/wsdl/document/test_rpc.rb +78 -9
  148. data/test/wsdl/fault/test_fault.rb +1 -1
  149. data/test/wsdl/fault/test_multifault.rb +1 -1
  150. data/test/wsdl/group/expectedClassdef.rb +58 -0
  151. data/test/wsdl/group/expectedDriver.rb +51 -0
  152. data/test/wsdl/group/expectedMappingRegistry.rb +67 -0
  153. data/test/wsdl/group/group.wsdl +88 -0
  154. data/test/wsdl/group/test_rpc.rb +145 -0
  155. data/test/wsdl/list/test_list.rb +1 -1
  156. data/test/wsdl/map/test_map.rb +2 -2
  157. data/test/wsdl/marshal/person_org.rb +5 -0
  158. data/test/wsdl/multiplefault.wsdl +11 -4
  159. data/test/wsdl/oneway/test_oneway.rb +1 -1
  160. data/test/wsdl/overload/test_overload.rb +1 -1
  161. data/test/wsdl/qualified/test_qualified.rb +1 -1
  162. data/test/wsdl/qualified/test_unqualified.rb +1 -1
  163. data/test/wsdl/raa/RAAService.rb +62 -57
  164. data/test/wsdl/raa/expectedClassDef.rb +100 -0
  165. data/test/wsdl/raa/expectedDriver.rb +96 -0
  166. data/test/wsdl/raa/expectedMappingRegistry.rb +121 -0
  167. data/test/wsdl/raa/test_raa.rb +54 -19
  168. data/test/wsdl/ref/expectedDriver.rb +1 -1
  169. data/test/wsdl/ref/expectedProduct.rb +101 -16
  170. data/test/wsdl/ref/test_ref.rb +2 -1
  171. data/test/wsdl/rpc/test_rpc.rb +1 -2
  172. data/test/wsdl/rpc/test_rpc_lit.rb +13 -13
  173. data/test/wsdl/simplecontent/test_simplecontent.rb +5 -5
  174. data/test/wsdl/simpletype/rpc/expectedDriver.rb +3 -2
  175. data/test/wsdl/simpletype/rpc/expectedEchoVersion.rb +2 -0
  176. data/test/wsdl/simpletype/rpc/expectedMappingRegistry.rb +10 -17
  177. data/test/wsdl/simpletype/rpc/expectedService.rb +4 -2
  178. data/test/wsdl/simpletype/test_simpletype.rb +2 -2
  179. data/test/wsdl/soap/test_soapbodyparts.rb +2 -2
  180. data/test/wsdl/soap/wsdl2ruby/expectedClassdef.rb +2 -0
  181. data/test/wsdl/soap/wsdl2ruby/expectedDriver.rb +3 -2
  182. data/test/wsdl/soap/wsdl2ruby/expectedMappingRegistry.rb +5 -9
  183. data/test/wsdl/soap/wsdl2ruby/expectedService.cgi +4 -2
  184. data/test/wsdl/soap/wsdl2ruby/expectedService.rb +4 -2
  185. data/test/wsdl/soap/wsdl2ruby/section/expectedClassdef.rb +6 -0
  186. data/test/wsdl/soap/wsdl2ruby/soapenc/test_soapenc.rb +1 -1
  187. data/test/wsdl/soaptype/test_soaptype.rb +1 -1
  188. data/test/wsdl/test_multiplefault.rb +3 -1
  189. data/test/xsd/codegen/test_classdef.rb +30 -0
  190. data/test/xsd/test_ns.rb +21 -0
  191. data/test/xsd/test_xsd.rb +5 -4
  192. data/test/xsd/xsd2ruby/expected_mysample.rb +13 -2
  193. data/test/xsd/xsd2ruby/expected_mysample_mapping_registry.rb +5 -11
  194. data/test/xsd/xsd2ruby/section.xsd +8 -0
  195. metadata +40 -8
  196. data/test/wsdl/axisArray/itemList.rb +0 -14
  197. data/test/wsdl/raa/RAA.rb +0 -120
  198. data/test/wsdl/raa/RAAServant.rb +0 -107
  199. data/test/wsdl/raa/server.rb +0 -103
@@ -51,55 +51,28 @@ class Definitions < Info
51
51
  end
52
52
 
53
53
  def collect_attributes
54
- result = XSD::NamedElements.new
55
- if @types
56
- @types.schemas.each do |schema|
57
- result.concat(schema.collect_attributes)
58
- end
59
- end
60
- @imports.each do |import|
61
- result.concat(import.content.collect_attributes)
62
- end
63
- result
54
+ collect_imports(:collect_attributes)
55
+ end
56
+
57
+ def collect_modelgroups
58
+ collect_imports(:collect_modelgroups)
59
+ end
60
+
61
+ def collect_attributegroups
62
+ collect_imports(:collect_attributegroups)
64
63
  end
65
64
 
66
65
  def collect_elements
67
- result = XSD::NamedElements.new
68
- if @types
69
- @types.schemas.each do |schema|
70
- result.concat(schema.collect_elements)
71
- end
72
- end
73
- @imports.each do |import|
74
- result.concat(import.content.collect_elements)
75
- end
76
- result
66
+ collect_imports(:collect_elements)
77
67
  end
78
68
 
79
69
  def collect_complextypes
80
- result = @anontypes.dup
81
- if @types
82
- @types.schemas.each do |schema|
83
- result.concat(schema.collect_complextypes)
84
- end
85
- end
86
- @imports.each do |import|
87
- result.concat(import.content.collect_complextypes)
88
- end
89
- result
70
+ result = collect_imports(:collect_complextypes)
71
+ @anontypes.dup.concat(result)
90
72
  end
91
73
 
92
74
  def collect_simpletypes
93
- result = XSD::NamedElements.new
94
- if @types
95
- @types.schemas.each do |schema|
96
- result.concat(schema.collect_simpletypes)
97
- end
98
- end
99
- @imports.each do |import|
100
- result.concat(import.content.collect_simpletypes)
101
- end
102
- result
75
+ collect_imports(:collect_simpletypes)
103
76
  end
104
77
 
105
78
  # ToDo: simpletype must be accepted...
@@ -244,6 +217,19 @@ class Definitions < Info
244
217
 
245
218
  private
246
219
 
220
+ def collect_imports(method)
221
+ result = XSD::NamedElements.new
222
+ if @types
223
+ @types.schemas.each do |schema|
224
+ result.concat(schema.send(method))
225
+ end
226
+ end
227
+ @imports.each do |import|
228
+ result.concat(import.content.send(method))
229
+ end
230
+ result
231
+ end
232
+
247
233
  end
248
234
 
249
235
 
@@ -33,6 +33,17 @@ class Info
33
33
  def parse_attr(attr, value); end # abstract
34
34
 
35
35
  def parse_epilogue; end # abstract
36
+
37
+ private
38
+
39
+ def to_int(value)
40
+ Integer(value.source)
41
+ end
42
+
43
+ def to_boolean(value)
44
+ s = value.source
45
+ s == "true" or s == "1"
46
+ end
36
47
  end
37
48
 
38
49
 
@@ -7,10 +7,10 @@
7
7
 
8
8
 
9
9
  require 'xsd/qname'
10
- require 'xsd/ns'
11
10
  require 'xsd/charset'
12
11
  require 'xsd/datatypes'
13
12
  require 'xsd/xmlparser'
13
+ require 'soap/ns'
14
14
  require 'wsdl/wsdl'
15
15
  require 'wsdl/data'
16
16
  require 'wsdl/xmlSchema/data'
@@ -77,7 +77,7 @@ public
77
77
  ns = lastframe.ns
78
78
  parent = lastframe.node
79
79
  else
80
- ns = XSD::NS.new
80
+ ns = ::SOAP::NS.new
81
81
  parent = nil
82
82
  end
83
83
  # ns might be the same
@@ -21,8 +21,9 @@ class CGIStubCreator
21
21
 
22
22
  attr_reader :definitions
23
23
 
24
- def initialize(definitions, modulepath = nil)
24
+ def initialize(definitions, name_creator, modulepath = nil)
25
25
  @definitions = definitions
26
+ @name_creator = name_creator
26
27
  @modulepath = modulepath
27
28
  end
28
29
 
@@ -40,14 +41,15 @@ class CGIStubCreator
40
41
  if port.porttype.nil?
41
42
  raise RuntimeError.new("porttype not found for #{port}")
42
43
  end
43
- dump_porttype(port.porttype.name)
44
+ dump_porttype(port.porttype)
44
45
  end
45
46
 
46
47
  private
47
48
 
48
- def dump_porttype(name)
49
- class_name = create_class_name(name, @modulepath)
50
- result = MethodDefCreator.new(@definitions, @modulepath).dump(name)
49
+ def dump_porttype(porttype)
50
+ class_name = mapped_class_name(porttype.name, @modulepath)
51
+ defined_const = {}
52
+ result = MethodDefCreator.new(@definitions, @name_creator, @modulepath, defined_const).dump(porttype.name)
51
53
  methoddef = result[:methoddef]
52
54
  wsdl_name = @definitions.name ? @definitions.name.name : 'default'
53
55
  mrname = safeconstname(wsdl_name + 'MappingRegistry')
@@ -58,6 +60,9 @@ Methods = [
58
60
  #{methoddef.gsub(/^/, " ")}
59
61
  ]
60
62
  EOD
63
+ defined_const.each do |ns, tag|
64
+ c1.def_const(tag, dq(ns))
65
+ end
61
66
  c2 = XSD::CodeGen::ClassDef.new(class_name + "App",
62
67
  "::SOAP::RPC::CGIStub")
63
68
  c2.def_method("initialize", "*arg") do
@@ -9,6 +9,7 @@
9
9
  require 'wsdl/data'
10
10
  require 'wsdl/soap/classDefCreatorSupport'
11
11
  require 'xsd/codegen'
12
+ require 'set'
12
13
 
13
14
 
14
15
  module WSDL
@@ -19,8 +20,9 @@ class ClassDefCreator
19
20
  include ClassDefCreatorSupport
20
21
  include XSD::CodeGen
21
22
 
22
- def initialize(definitions, modulepath = nil)
23
+ def initialize(definitions, name_creator, modulepath = nil)
23
24
  @definitions = definitions
25
+ @name_creator = name_creator
24
26
  @modulepath = modulepath
25
27
  @elements = definitions.collect_elements
26
28
  @elements.uniq!
@@ -30,22 +32,31 @@ class ClassDefCreator
30
32
  @simpletypes.uniq!
31
33
  @complextypes = definitions.collect_complextypes
32
34
  @complextypes.uniq!
35
+ @modelgroups = definitions.collect_modelgroups
36
+ @modelgroups.uniq!
33
37
  @faulttypes = nil
34
38
  if definitions.respond_to?(:collect_faulttypes)
35
39
  @faulttypes = definitions.collect_faulttypes
36
40
  end
41
+ @defined_const = {}
37
42
  end
38
43
 
39
44
  def dump(type = nil)
40
45
  result = "require 'xsd/qname'\n"
46
+ # cannot use @modulepath because of multiple classes
41
47
  if @modulepath
42
48
  result << "\n"
43
- result << @modulepath.collect { |ele| "module #{ele}" }.join("; ")
49
+ result << modulepath_split(@modulepath).collect { |ele| "module #{ele}" }.join("; ")
44
50
  result << "\n\n"
45
51
  end
46
52
  if type
47
53
  result << dump_classdef(type.name, type)
48
54
  else
55
+ str = dump_group
56
+ unless str.empty?
57
+ result << "\n" unless result.empty?
58
+ result << str
59
+ end
49
60
  str = dump_complextype
50
61
  unless str.empty?
51
62
  result << "\n" unless result.empty?
@@ -69,7 +80,7 @@ class ClassDefCreator
69
80
  end
70
81
  if @modulepath
71
82
  result << "\n\n"
72
- result << @modulepath.collect { |ele| "end" }.join("; ")
83
+ result << modulepath_split(@modulepath).collect { |ele| "end" }.join("; ")
73
84
  result << "\n"
74
85
  end
75
86
  result
@@ -79,69 +90,83 @@ private
79
90
 
80
91
  def dump_element
81
92
  @elements.collect { |ele|
82
- qualified = (ele.elementform == 'qualified')
83
- if ele.local_complextype
84
- dump_complextypedef(ele.name, ele.local_complextype, qualified)
85
- elsif ele.local_simpletype
86
- dump_simpletypedef(ele.name, ele.local_simpletype, qualified)
87
- elsif ele.empty?
88
- dump_simpleclassdef(ele.name, nil)
89
- else
90
- nil
91
- end
93
+ next if @complextypes[ele.name]
94
+ c = create_elementdef(@modulepath, ele)
95
+ c ? c.dump : nil
92
96
  }.compact.join("\n")
93
97
  end
94
98
 
95
99
  def dump_attribute
96
- @attributes.collect { |attr|
97
- if attr.local_simpletype
98
- dump_simpletypedef(attr.name, attr.local_simpletype)
100
+ @attributes.collect { |attribute|
101
+ if attribute.local_simpletype
102
+ c = create_simpletypedef(@modulepath, attribute.name, attribute.local_simpletype)
99
103
  end
104
+ c ? c.dump : nil
100
105
  }.compact.join("\n")
101
106
  end
102
107
 
103
108
  def dump_simpletype
104
109
  @simpletypes.collect { |type|
105
- dump_simpletypedef(type.name, type)
110
+ c = create_simpletypedef(@modulepath, type.name, type)
111
+ c ? c.dump : nil
106
112
  }.compact.join("\n")
107
113
  end
108
114
 
109
115
  def dump_complextype
110
116
  definitions = sort_dependency(@complextypes).collect { |type|
111
- dump_complextypedef(type.name, type)
117
+ c = create_complextypedef(@modulepath, type.name, type)
118
+ c ? c.dump : nil
119
+ }.compact.join("\n")
120
+ end
121
+
122
+ def dump_group
123
+ definitions = @modelgroups.collect { |group|
124
+ # TODO: not dumped for now but may be useful in the future
112
125
  }.compact.join("\n")
113
126
  end
114
127
 
115
- def dump_simpletypedef(qname, simpletype, qualified = false)
128
+ def create_elementdef(mpath, ele)
129
+ qualified = (ele.elementform == 'qualified')
130
+ if ele.local_complextype
131
+ create_complextypedef(mpath, ele.name, ele.local_complextype, qualified)
132
+ elsif ele.local_simpletype
133
+ create_simpletypedef(mpath, ele.name, ele.local_simpletype, qualified)
134
+ elsif ele.empty?
135
+ create_simpleclassdef(mpath, ele.name, nil)
136
+ else
137
+ # ignores type only element
138
+ nil
139
+ end
140
+ end
141
+
142
+ def create_simpletypedef(mpath, qname, simpletype, qualified = false)
116
143
  if simpletype.restriction
117
- dump_simpletypedef_restriction(qname, simpletype, qualified)
144
+ create_simpletypedef_restriction(mpath, qname, simpletype, qualified)
118
145
  elsif simpletype.list
119
- dump_simpletypedef_list(qname, simpletype, qualified)
146
+ create_simpletypedef_list(mpath, qname, simpletype, qualified)
120
147
  elsif simpletype.union
121
- dump_simpletypedef_union(qname, simpletype, qualified)
148
+ create_simpletypedef_union(mpath, qname, simpletype, qualified)
122
149
  else
123
150
  raise RuntimeError.new("unknown kind of simpletype: #{simpletype}")
124
151
  end
125
152
  end
126
153
 
127
- def dump_simpletypedef_restriction(qname, typedef, qualified)
154
+ def create_simpletypedef_restriction(mpath, qname, typedef, qualified)
128
155
  restriction = typedef.restriction
129
- if restriction.enumeration.empty?
156
+ unless restriction.enumeration?
130
157
  # not supported. minlength?
131
158
  return nil
132
159
  end
133
- classname = create_class_name(qname)
134
- check_classname(classname)
160
+ classname = mapped_class_basename(qname, mpath)
135
161
  c = ClassDef.new(classname, '::String')
136
162
  c.comment = "#{qname}"
137
163
  define_classenum_restriction(c, classname, restriction.enumeration)
138
- c.dump
164
+ c
139
165
  end
140
166
 
141
- def dump_simpletypedef_list(qname, typedef, qualified)
167
+ def create_simpletypedef_list(mpath, qname, typedef, qualified)
142
168
  list = typedef.list
143
- classname = create_class_name(qname)
144
- check_classname(classname)
169
+ classname = mapped_class_basename(qname, mpath)
145
170
  c = ClassDef.new(classname, '::Array')
146
171
  c.comment = "#{qname}"
147
172
  if simpletype = list.local_simpletype
@@ -152,22 +177,23 @@ private
152
177
  define_stringenum_restriction(c, simpletype.restriction.enumeration)
153
178
  c.comment << "\n contains list of #{classname}::*"
154
179
  elsif list.itemtype
155
- c.comment << "\n contains list of #{create_class_name(list.itemtype)}::*"
180
+ c.comment << "\n contains list of #{mapped_class_basename(list.itemtype, mpath)}::*"
156
181
  else
157
182
  raise RuntimeError.new("unknown kind of list: #{list}")
158
183
  end
159
- c.dump
184
+ c
160
185
  end
161
186
 
162
- def dump_simpletypedef_union(qname, typedef, qualified)
187
+ def create_simpletypedef_union(mpath, qname, typedef, qualified)
163
188
  union = typedef.union
164
- c = ClassDef.new(create_class_name(qname), '::String')
189
+ classname = mapped_class_basename(qname, mpath)
190
+ c = ClassDef.new(classname, '::String')
165
191
  c.comment = "#{qname}"
166
192
  if union.member_types
167
193
  # fixme
168
194
  c.comment << "\n any of #{union.member_types}"
169
195
  end
170
- c.dump
196
+ c
171
197
  end
172
198
 
173
199
  def define_stringenum_restriction(c, enumeration)
@@ -194,9 +220,8 @@ private
194
220
  end
195
221
  end
196
222
 
197
- def dump_simpleclassdef(qname, type_or_element)
198
- classname = create_class_name(qname)
199
- check_classname(classname)
223
+ def create_simpleclassdef(mpath, qname, type_or_element)
224
+ classname = mapped_class_basename(qname, mpath)
200
225
  c = ClassDef.new(classname, '::String')
201
226
  c.comment = "#{qname}"
202
227
  init_lines = []
@@ -207,17 +232,17 @@ private
207
232
  c.def_method('initialize', '*arg') do
208
233
  "super\n" + init_lines.join("\n")
209
234
  end
210
- c.dump
235
+ c
211
236
  end
212
237
 
213
- def dump_complextypedef(qname, type, qualified = false)
238
+ def create_complextypedef(mpath, qname, type, qualified = false)
214
239
  case type.compoundtype
215
240
  when :TYPE_STRUCT, :TYPE_EMPTY
216
- dump_classdef(qname, type, qualified)
241
+ create_structdef(mpath, qname, type, qualified)
217
242
  when :TYPE_ARRAY
218
- dump_arraydef(qname, type)
243
+ create_arraydef(mpath, qname, type)
219
244
  when :TYPE_SIMPLE
220
- dump_simpleclassdef(qname, type)
245
+ create_simpleclassdef(mpath, qname, type)
221
246
  when :TYPE_MAP
222
247
  # mapped as a general Hash
223
248
  nil
@@ -227,13 +252,17 @@ private
227
252
  end
228
253
  end
229
254
 
230
- def dump_classdef(qname, typedef, qualified = false)
231
- classname = create_class_name(qname)
232
- check_classname(classname)
255
+ def create_structdef(mpath, qname, typedef, qualified = false)
256
+ classname = mapped_class_basename(qname, mpath)
233
257
  baseclassname = nil
234
258
  if typedef.complexcontent
235
259
  if base = typedef.complexcontent.base
236
- baseclassname = create_class_name(base)
260
+ # :TYPE_ARRAY must not be derived (#424)
261
+ basedef = @complextypes[base]
262
+ if basedef and basedef.compoundtype != :TYPE_ARRAY
263
+ # baseclass should be a toplevel complexType
264
+ baseclassname = mapped_class_basename(base, @modulepath)
265
+ end
237
266
  end
238
267
  end
239
268
  if @faulttypes and @faulttypes.index(qname)
@@ -243,8 +272,9 @@ private
243
272
  end
244
273
  c.comment = "#{qname}"
245
274
  c.comment << "\nabstract" if typedef.abstract
275
+ parentmodule = mapped_class_name(qname, mpath)
246
276
  init_lines, init_params =
247
- parse_elements(c, typedef.elements, qname.namespace)
277
+ parse_elements(c, typedef.elements, qname.namespace, parentmodule)
248
278
  unless typedef.attributes.empty?
249
279
  define_attribute(c, typedef.attributes)
250
280
  init_lines << "@__xmlattr = {}"
@@ -252,10 +282,10 @@ private
252
282
  c.def_method('initialize', *init_params) do
253
283
  init_lines.join("\n")
254
284
  end
255
- c.dump
285
+ c
256
286
  end
257
287
 
258
- def parse_elements(c, elements, base_namespace)
288
+ def parse_elements(c, elements, base_namespace, mpath, as_array = false)
259
289
  init_lines = []
260
290
  init_params = []
261
291
  any = false
@@ -274,23 +304,44 @@ private
274
304
  when XMLSchema::Element
275
305
  next if element.ref == SchemaName
276
306
  name = name_element(element).name
277
- attrname = safemethodname(name)
278
- varname = safevarname(name)
279
- c.def_attr(attrname, true, varname)
280
- init_lines << "@#{varname} = #{varname}"
281
- if element.map_as_array?
282
- init_params << "#{varname} = []"
283
- else
284
- init_params << "#{varname} = nil"
307
+ typebase = @modulepath
308
+ if element.anonymous_type?
309
+ inner = create_elementdef(mpath, element)
310
+ unless as_array
311
+ inner.comment = "inner class for member: #{name}\n" + inner.comment
312
+ end
313
+ c.innermodule << inner
314
+ typebase = mpath
315
+ end
316
+ unless as_array
317
+ attrname = safemethodname(name)
318
+ varname = safevarname(name)
319
+ c.def_attr(attrname, true, varname)
320
+ init_lines << "@#{varname} = #{varname}"
321
+ if element.map_as_array?
322
+ init_params << "#{varname} = []"
323
+ else
324
+ init_params << "#{varname} = nil"
325
+ end
326
+ c.comment << "\n #{attrname} - #{create_type_name(typebase, element) || '(any)'}"
285
327
  end
286
328
  when WSDL::XMLSchema::Sequence
287
329
  child_init_lines, child_init_params =
288
- parse_elements(c, element.elements, base_namespace)
330
+ parse_elements(c, element.elements, base_namespace, mpath, as_array)
289
331
  init_lines.concat(child_init_lines)
290
332
  init_params.concat(child_init_params)
291
333
  when WSDL::XMLSchema::Choice
292
334
  child_init_lines, child_init_params =
293
- parse_elements(c, element.elements, base_namespace)
335
+ parse_elements(c, element.elements, base_namespace, mpath, as_array)
336
+ init_lines.concat(child_init_lines)
337
+ init_params.concat(child_init_params)
338
+ when WSDL::XMLSchema::Group
339
+ if element.content.nil?
340
+ warn("no group definition found: #{element}")
341
+ next
342
+ end
343
+ child_init_lines, child_init_params =
344
+ parse_elements(c, element.content.elements, base_namespace, mpath, as_array)
294
345
  init_lines.concat(child_init_lines)
295
346
  init_params.concat(child_init_params)
296
347
  else
@@ -300,74 +351,42 @@ private
300
351
  [init_lines, init_params]
301
352
  end
302
353
 
303
- def element_basetype(ele)
304
- if klass = basetype_class(ele.type)
305
- klass
306
- elsif ele.local_simpletype
307
- basetype_class(ele.local_simpletype.base)
308
- else
309
- nil
310
- end
311
- end
312
-
313
- def attribute_basetype(attr)
314
- if klass = basetype_class(attr.type)
315
- klass
316
- elsif attr.local_simpletype
317
- basetype_class(attr.local_simpletype.base)
318
- else
319
- nil
320
- end
321
- end
322
-
323
- def basetype_class(type)
324
- return nil if type.nil?
325
- if simpletype = @simpletypes[type]
326
- basetype_mapped_class(simpletype.base)
327
- else
328
- basetype_mapped_class(type)
329
- end
330
- end
331
-
332
354
  def define_attribute(c, attributes)
355
+ const = {}
356
+ unless attributes.empty?
357
+ c.def_method("__xmlattr") do <<-__EOD__
358
+ @__xmlattr ||= {}
359
+ __EOD__
360
+ end
361
+ end
333
362
  attributes.each do |attribute|
334
363
  name = name_attribute(attribute)
335
364
  methodname = safemethodname('xmlattr_' + name.name)
365
+ constname = 'Attr' + safeconstname(name.name)
366
+ const[constname] ||= 0
367
+ if (const[constname] += 1) > 1
368
+ constname += "_#{const[constname]}"
369
+ end
370
+ c.def_const(constname, dqname(name))
336
371
  c.def_method(methodname) do <<-__EOD__
337
- (@__xmlattr ||= {})[#{dqname(name)}]
372
+ __xmlattr[#{constname}]
338
373
  __EOD__
339
374
  end
340
375
  c.def_method(methodname + '=', 'value') do <<-__EOD__
341
- (@__xmlattr ||= {})[#{dqname(name)}] = value
376
+ __xmlattr[#{constname}] = value
342
377
  __EOD__
343
378
  end
379
+ c.comment << "\n #{methodname} - #{attribute_basetype(attribute) || '(any)'}"
344
380
  end
345
381
  end
346
382
 
347
- def name_element(element)
348
- return element.name if element.name
349
- return element.ref if element.ref
350
- raise RuntimeError.new("cannot define name of #{element}")
351
- end
352
-
353
- def name_attribute(attribute)
354
- return attribute.name if attribute.name
355
- return attribute.ref if attribute.ref
356
- raise RuntimeError.new("cannot define name of #{attribute}")
357
- end
358
-
359
- def dump_arraydef(qname, complextype)
360
- classname = create_class_name(qname)
361
- check_classname(classname)
383
+ def create_arraydef(mpath, qname, typedef)
384
+ classname = mapped_class_basename(qname, mpath)
362
385
  c = ClassDef.new(classname, '::Array')
363
386
  c.comment = "#{qname}"
364
- c.dump
365
- end
366
-
367
- def check_classname(classname)
368
- if @modulepath.nil? and Object.constants.include?(classname)
369
- warn("created definition re-opens an existing toplevel class: #{classname}")
370
- end
387
+ parentmodule = mapped_class_name(qname, mpath)
388
+ parse_elements(c, typedef.elements, qname.namespace, parentmodule, true)
389
+ c
371
390
  end
372
391
 
373
392
  def sort_dependency(types)
@@ -399,6 +418,14 @@ private
399
418
  dep.delete(type.name)
400
419
  result
401
420
  end
421
+
422
+ def modulepath_split(modulepath)
423
+ if modulepath.is_a?(::Array)
424
+ modulepath
425
+ else
426
+ modulepath.to_s.split('::')
427
+ end
428
+ end
402
429
  end
403
430
 
404
431