Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

root/trunk/lib/soap/encodingstyle/literalHandler.rb

Revision 2011, 4.7 kB (checked in by nahi, 1 year ago)
  • merged from 1_5 branch.
    • enabled Sriver#generate_explicit_type for literal services.
    • test added.
    • removed generated files.
  • Property svn:eol-style set to native
  • Property svn:keywords set to author date id revision
Line 
1 # SOAP4R - XML Literal EncodingStyle handler 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 'soap/encodingstyle/handler'
10
11
12 module SOAP
13 module EncodingStyle
14
15
16 class LiteralHandler < Handler
17   Namespace = SOAP::LiteralNamespace
18   add_handler
19
20   def initialize(charset = nil)
21     super(charset)
22     @textbuf = []
23   end
24
25
26   ###
27   ## encode interface.
28   #
29   def encode_data(generator, ns, data, parent)
30     attrs = {}
31     name = generator.encode_name(ns, data, attrs)
32     if data.type and data.type.name and
33         (@generate_explicit_type or data.force_typed)
34       data.extraattr[XSD::AttrTypeName] = data.type
35     end
36     data.extraattr.each do |key, value|
37       keytag = key
38       if key.is_a?(XSD::QName)
39         keytag = encode_attr_key(attrs, ns, key)
40       end
41       if value.is_a?(XSD::QName)
42         value = encode_qname(attrs, ns, value)
43       end
44       attrs[keytag] = value
45     end
46     case data
47     when SOAPExternalReference
48       # do not encode SOAPExternalReference in
49       # literalHandler (which is used for literal service)
50       data.referred
51     when SOAPRawString
52       generator.encode_tag(name, attrs)
53       generator.encode_rawstring(data.to_s)
54     when XSD::XSDString
55       generator.encode_tag(name, attrs)
56       str = decode_str(data.to_s)
57       generator.encode_string(str)
58     when XSD::XSDAnySimpleType
59       generator.encode_tag(name, attrs)
60       generator.encode_string(data.to_s)
61     when SOAPStruct
62       generator.encode_tag(name, attrs)
63       data.each do |key, value|
64         generator.encode_child(ns, value, data)
65       end
66     when SOAPArray
67       generator.encode_tag(name, attrs)
68       data.traverse do |child, *rank|
69         data.position = nil
70         generator.encode_child(ns, child, data)
71       end
72     when SOAPElement
73       unless generator.use_default_namespace
74         # passes 2 times for simplifying namespace definition
75         data.each do |key, value|
76           if value.elename.namespace
77             Generator.assign_ns(attrs, ns, value.elename.namespace)
78           end
79         end
80       end
81       if data.text and data.text.is_a?(XSD::QName)
82         Generator.assign_ns(attrs, ns, data.text.namespace)
83       end
84       generator.encode_tag(name, attrs)
85       if data.text
86         if data.text.is_a?(XSD::QName)
87           text = ns.name(data.text)
88         else
89           text = data.text
90         end
91         generator.encode_string(text)
92       end
93       data.each do |key, value|
94         generator.encode_child(ns, value, data)
95       end
96     else
97       raise EncodingStyleError.new(
98         "unknown object:#{data} in this encodingStyle")
99     end
100   end
101
102   def encode_data_end(generator, ns, data, parent)
103     # do not encode SOAPExternalReference in
104     # literalHandler (which is used for literal service)
105     return nil if data.is_a?(SOAPExternalReference)
106     name = generator.encode_name_end(ns, data)
107     cr = (data.is_a?(SOAPCompoundtype) and data.have_member)
108     generator.encode_tag_end(name, cr)
109   end
110
111
112   ###
113   ## decode interface.
114   #
115   def decode_tag(ns, elename, attrs, parent)
116     @textbuf.clear
117     if attrs[XSD::AttrNilName] == 'true'
118       o = SOAPNil.decode(elename)
119     else
120       o = SOAPElement.decode(elename)
121     end
122     if definedtype = attrs[XSD::AttrTypeName]
123       o.type = ns.parse(definedtype)
124     end
125     o.parent = parent
126     o.extraattr.update(attrs)
127     decode_parent(parent, o)
128     o
129   end
130
131   def decode_tag_end(ns, node)
132     textbufstr = @textbuf.join
133     @textbuf.clear
134     o = node.node
135     decode_textbuf(o, textbufstr)
136   end
137
138   def decode_text(ns, text)
139     # @textbuf is set at decode_tag_end.
140     @textbuf << text
141   end
142
143   def decode_prologue
144   end
145
146   def decode_epilogue
147   end
148
149   def decode_parent(parent, node)
150     return unless parent.node
151     case parent.node
152     when SOAPElement
153       parent.node.add(node)
154       node.parent = parent.node
155     when SOAPStruct
156       parent.node.add(node.elename.name, node)
157       node.parent = parent.node
158     when SOAPArray
159       if node.position
160         parent.node[*(decode_arypos(node.position))] = node
161         parent.node.sparse = true
162       else
163         parent.node.add(node)
164       end
165       node.parent = parent.node
166     else
167       raise EncodingStyleError.new("illegal parent: #{parent.node}")
168     end
169   end
170
171 private
172
173   def decode_textbuf(node, textbufstr)
174     case node
175     when XSD::XSDString, SOAPElement
176       if @charset
177         node.set(decode_str(textbufstr))
178       else
179         node.set(textbufstr)
180       end
181     else
182       # Nothing to do...
183     end
184   end
185
186   def decode_str(str)
187     @charset ? XSD::Charset.encoding_from_xml(str, @charset) : str
188   end
189 end
190
191 LiteralHandler.new
192
193
194 end
195 end
Note: See TracBrowser for help on using the browser.