/tools/Ruby/lib/ruby/1.8/soap/element.rb

http://github.com/agross/netopenspace · Ruby · 258 lines · 199 code · 50 blank · 9 comment · 24 complexity · 83b790c47eca4c9ed1202a7cf3c66907 MD5 · raw file

  1. # SOAP4R - SOAP elements library
  2. # Copyright (C) 2000, 2001, 2003-2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
  3. # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
  4. # redistribute it and/or modify it under the same terms of Ruby's license;
  5. # either the dual license version in 2003, or any later version.
  6. require 'xsd/qname'
  7. require 'soap/baseData'
  8. module SOAP
  9. ###
  10. ## SOAP elements
  11. #
  12. module SOAPEnvelopeElement; end
  13. class SOAPFault < SOAPStruct
  14. include SOAPEnvelopeElement
  15. include SOAPCompoundtype
  16. public
  17. def faultcode
  18. self['faultcode']
  19. end
  20. def faultstring
  21. self['faultstring']
  22. end
  23. def faultactor
  24. self['faultactor']
  25. end
  26. def detail
  27. self['detail']
  28. end
  29. def faultcode=(rhs)
  30. self['faultcode'] = rhs
  31. end
  32. def faultstring=(rhs)
  33. self['faultstring'] = rhs
  34. end
  35. def faultactor=(rhs)
  36. self['faultactor'] = rhs
  37. end
  38. def detail=(rhs)
  39. self['detail'] = rhs
  40. end
  41. def initialize(faultcode = nil, faultstring = nil, faultactor = nil, detail = nil)
  42. super(EleFaultName)
  43. @elename = EleFaultName
  44. @encodingstyle = EncodingNamespace
  45. if faultcode
  46. self.faultcode = faultcode
  47. self.faultstring = faultstring
  48. self.faultactor = faultactor
  49. self.detail = detail
  50. self.faultcode.elename = EleFaultCodeName if self.faultcode
  51. self.faultstring.elename = EleFaultStringName if self.faultstring
  52. self.faultactor.elename = EleFaultActorName if self.faultactor
  53. self.detail.elename = EleFaultDetailName if self.detail
  54. end
  55. faultcode.parent = self if faultcode
  56. faultstring.parent = self if faultstring
  57. faultactor.parent = self if faultactor
  58. detail.parent = self if detail
  59. end
  60. def encode(generator, ns, attrs = {})
  61. SOAPGenerator.assign_ns(attrs, ns, EnvelopeNamespace)
  62. SOAPGenerator.assign_ns(attrs, ns, EncodingNamespace)
  63. attrs[ns.name(AttrEncodingStyleName)] = EncodingNamespace
  64. name = ns.name(@elename)
  65. generator.encode_tag(name, attrs)
  66. yield(self.faultcode)
  67. yield(self.faultstring)
  68. yield(self.faultactor)
  69. yield(self.detail) if self.detail
  70. generator.encode_tag_end(name, true)
  71. end
  72. end
  73. class SOAPBody < SOAPStruct
  74. include SOAPEnvelopeElement
  75. def initialize(data = nil, is_fault = false)
  76. super(nil)
  77. @elename = EleBodyName
  78. @encodingstyle = nil
  79. if data
  80. if data.respond_to?(:elename)
  81. add(data.elename.name, data)
  82. else
  83. data.to_a.each do |datum|
  84. add(datum.elename.name, datum)
  85. end
  86. end
  87. end
  88. @is_fault = is_fault
  89. end
  90. def encode(generator, ns, attrs = {})
  91. name = ns.name(@elename)
  92. generator.encode_tag(name, attrs)
  93. if @is_fault
  94. yield(@data)
  95. else
  96. @data.each do |data|
  97. yield(data)
  98. end
  99. end
  100. generator.encode_tag_end(name, true)
  101. end
  102. def root_node
  103. @data.each do |node|
  104. if node.root == 1
  105. return node
  106. end
  107. end
  108. # No specified root...
  109. @data.each do |node|
  110. if node.root != 0
  111. return node
  112. end
  113. end
  114. raise Parser::FormatDecodeError.new('no root element')
  115. end
  116. end
  117. class SOAPHeaderItem < XSD::NSDBase
  118. include SOAPEnvelopeElement
  119. include SOAPCompoundtype
  120. public
  121. attr_accessor :element
  122. attr_accessor :mustunderstand
  123. attr_accessor :encodingstyle
  124. def initialize(element, mustunderstand = true, encodingstyle = nil)
  125. super()
  126. @type = nil
  127. @element = element
  128. @mustunderstand = mustunderstand
  129. @encodingstyle = encodingstyle
  130. element.parent = self if element
  131. end
  132. def encode(generator, ns, attrs = {})
  133. attrs.each do |key, value|
  134. @element.extraattr[key] = value
  135. end
  136. @element.extraattr[ns.name(AttrMustUnderstandName)] =
  137. (@mustunderstand ? '1' : '0')
  138. if @encodingstyle
  139. @element.extraattr[ns.name(AttrEncodingStyleName)] = @encodingstyle
  140. end
  141. @element.encodingstyle = @encodingstyle if !@element.encodingstyle
  142. yield(@element)
  143. end
  144. end
  145. class SOAPHeader < SOAPStruct
  146. include SOAPEnvelopeElement
  147. def initialize
  148. super(nil)
  149. @elename = EleHeaderName
  150. @encodingstyle = nil
  151. end
  152. def encode(generator, ns, attrs = {})
  153. name = ns.name(@elename)
  154. generator.encode_tag(name, attrs)
  155. @data.each do |data|
  156. yield(data)
  157. end
  158. generator.encode_tag_end(name, true)
  159. end
  160. def add(name, value)
  161. mu = (value.extraattr[AttrMustUnderstandName] == '1')
  162. encstyle = value.extraattr[AttrEncodingStyleName]
  163. item = SOAPHeaderItem.new(value, mu, encstyle)
  164. super(name, item)
  165. end
  166. def length
  167. @data.length
  168. end
  169. alias size length
  170. end
  171. class SOAPEnvelope < XSD::NSDBase
  172. include SOAPEnvelopeElement
  173. include SOAPCompoundtype
  174. attr_reader :header
  175. attr_reader :body
  176. attr_reader :external_content
  177. def initialize(header = nil, body = nil)
  178. super()
  179. @type = nil
  180. @elename = EleEnvelopeName
  181. @encodingstyle = nil
  182. @header = header
  183. @body = body
  184. @external_content = {}
  185. header.parent = self if header
  186. body.parent = self if body
  187. end
  188. def header=(header)
  189. header.parent = self
  190. @header = header
  191. end
  192. def body=(body)
  193. body.parent = self
  194. @body = body
  195. end
  196. def encode(generator, ns, attrs = {})
  197. SOAPGenerator.assign_ns(attrs, ns, elename.namespace, SOAPNamespaceTag)
  198. name = ns.name(@elename)
  199. generator.encode_tag(name, attrs)
  200. yield(@header) if @header and @header.length > 0
  201. yield(@body)
  202. generator.encode_tag_end(name, true)
  203. end
  204. def to_ary
  205. [header, body]
  206. end
  207. end
  208. end