Parent

Included Modules

Files

Class Index [+]

Quicksearch

SOAP::Generator

CAUTION: MT-unsafe

Constants

ENCODE_CHAR_REGEXP
EncodeMap

Attributes

charset[RW]
default_encodingstyle[RW]
generate_explicit_type[RW]
use_numeric_character_reference[RW]
use_default_namespace[RW]

Public Class Methods

assign_ns(attrs, ns, namespace, tag = nil) click to toggle source
     # File lib/soap/generator.rb, line 220
220:   def self.assign_ns(attrs, ns, namespace, tag = nil)
221:     if namespace.nil?
222:       raise FormatEncodeError.new("empty namespace")
223:     end
224:     override_default_ns = (tag == '' and namespace != ns.default_namespace)
225:     if override_default_ns or !ns.assigned?(namespace)
226:       assign_ns!(attrs, ns, namespace, tag)
227:     end
228:   end
assign_ns!(attrs, ns, namespace, tag = nil) click to toggle source
     # File lib/soap/generator.rb, line 230
230:   def self.assign_ns!(attrs, ns, namespace, tag = nil)
231:     tag = ns.assign(namespace, tag)
232:     if tag == ''
233:       attr = 'xmlns'
234:     else
235:       attr = "xmlns:#{tag}"
236:     end
237:     attrs[attr] = namespace
238:   end
new(opt = {}) click to toggle source
    # File lib/soap/generator.rb, line 36
36:   def initialize(opt = {})
37:     @reftarget = nil
38:     @handlers = {}
39:     @charset = opt[:charset] || XSD::Charset.xml_encoding_label
40:     @default_encodingstyle = opt[:default_encodingstyle] || EncodingNamespace
41:     @generate_explicit_type =
42:       opt.key?(:generate_explicit_type) ? opt[:generate_explicit_type] : true
43:     @use_default_namespace = opt[:use_default_namespace]
44:     @attributeformdefault = opt[:attributeformdefault]
45:     @use_numeric_character_reference = opt[:use_numeric_character_reference]
46:     @indentstr = opt[:no_indent] ? '' : '  '
47:     @buf = @indent = @curr = nil
48:     @default_ns = opt[:default_ns]
49:     @default_ns_tag = opt[:default_ns_tag]
50:   end

Public Instance Methods

add_reftarget(name, node) click to toggle source
     # File lib/soap/generator.rb, line 119
119:   def add_reftarget(name, node)
120:     unless @reftarget
121:       raise FormatEncodeError.new("Reftarget is not defined.")
122:     end
123:     @reftarget.add(name, node)
124:   end
element_local?(element) click to toggle source
     # File lib/soap/generator.rb, line 216
216:   def element_local?(element)
217:     element.elename.namespace.nil?
218:   end
encode_child(ns, child, parent) click to toggle source
     # File lib/soap/generator.rb, line 126
126:   def encode_child(ns, child, parent)
127:     indent_backup, @indent = @indent, @indent + @indentstr
128:     encode_data(ns.clone_ns, child, parent)
129:     @indent = indent_backup
130:   end
encode_data(ns, obj, parent) click to toggle source
     # File lib/soap/generator.rb, line 84
 84:   def encode_data(ns, obj, parent)
 85:     if obj.respond_to?(:to_xmlpart)
 86:       formatted = trim_eol(obj.to_xmlpart)
 87:       formatted = trim_indent(formatted)
 88:       formatted = formatted.gsub(/^/, @indent).sub(/\n+\z/, '')
 89:       @buf << "\n#{formatted}"
 90:       return
 91:     elsif obj.is_a?(SOAPEnvelopeElement)
 92:       encode_element(ns, obj, parent)
 93:       return
 94:     end
 95:     if @reftarget && !obj.precedents.empty?
 96:       add_reftarget(obj.elename.name, obj)
 97:       ref = SOAPReference.new(obj)
 98:       ref.elename = ref.elename.dup_name(obj.elename.name)
 99:       obj.precedents.clear      # Avoid cyclic delay.
100:       obj.encodingstyle = parent.encodingstyle
101:       # SOAPReference is encoded here.
102:       obj = ref
103:     end
104:     encodingstyle = obj.encodingstyle
105:     # Children's encodingstyle is derived from its parent.
106:     encodingstyle ||= parent.encodingstyle if parent
107:     obj.encodingstyle = encodingstyle
108:     handler = find_handler(encodingstyle || @default_encodingstyle)
109:     unless handler
110:       raise FormatEncodeError.new("Unknown encodingStyle: #{ encodingstyle }.")
111:     end
112:     if !obj.elename.name
113:       raise FormatEncodeError.new("Element name not defined: #{ obj }.")
114:     end
115:     handler.encode_data(self, ns, obj, parent)
116:     handler.encode_data_end(self, ns, obj, parent)
117:   end
encode_element(ns, obj, parent) click to toggle source
     # File lib/soap/generator.rb, line 132
132:   def encode_element(ns, obj, parent)
133:     attrs = obj.extraattr
134:     if obj.is_a?(SOAPBody)
135:       @reftarget = obj
136:       obj.encode(self, ns, attrs) do |child|
137:         indent_backup, @indent = @indent, @indent + @indentstr
138:         encode_data(ns.clone_ns, child, obj)
139:         @indent = indent_backup
140:       end
141:       @reftarget = nil
142:     else
143:       if obj.is_a?(SOAPEnvelope)
144:         # xsi:nil="true" can appear even if dumping without explicit type.
145:         Generator.assign_ns(attrs, ns, XSD::InstanceNamespace)
146:         if @generate_explicit_type
147:           Generator.assign_ns(attrs, ns, XSD::Namespace)
148:         end
149:       end
150:       obj.encode(self, ns, attrs) do |child|
151:         indent_backup, @indent = @indent, @indent + @indentstr
152:         encode_data(ns.clone_ns, child, obj)
153:         @indent = indent_backup
154:       end
155:     end
156:   end
encode_name(ns, data, attrs) click to toggle source
     # File lib/soap/generator.rb, line 158
158:   def encode_name(ns, data, attrs)
159:     if element_local?(data)
160:       data.elename.name
161:     else
162:       if @use_default_namespace
163:         Generator.assign_ns(attrs, ns, data.elename.namespace, '')
164:       else
165:         Generator.assign_ns(attrs, ns, data.elename.namespace)
166:       end
167:       ns.name(data.elename)
168:     end
169:   end
encode_name_end(ns, data) click to toggle source
     # File lib/soap/generator.rb, line 171
171:   def encode_name_end(ns, data)
172:     if element_local?(data)
173:       data.elename.name
174:     else
175:       ns.name(data.elename)
176:     end
177:   end
encode_rawstring(str) click to toggle source
     # File lib/soap/generator.rb, line 208
208:   def encode_rawstring(str)
209:     @buf << str
210:   end
encode_string(str) click to toggle source
     # File lib/soap/generator.rb, line 212
212:   def encode_string(str)
213:     @buf << get_encoded(str)
214:   end
encode_tag(elename, attrs = nil) click to toggle source
     # File lib/soap/generator.rb, line 179
179:   def encode_tag(elename, attrs = nil)
180:     if attrs.nil? or attrs.empty?
181:       @buf << "\n#{ @indent }<#{ elename }>"
182:       return 
183:     end
184:     ary = []
185:     attrs.each do |key, value|
186:       ary << %[#{ key }="#{ get_encoded(value.to_s) }"]
187:     end
188:     case ary.size
189:     when 0
190:       @buf << "\n#{ @indent }<#{ elename }>"
191:     when 1
192:       @buf << %[\n#{ @indent }<#{ elename } #{ ary[0] }>]
193:     else
194:       @buf << "\n#{ @indent }<#{ elename } " <<
195:         ary.join("\n#{ @indent }#{ @indentstr * 2 }") <<
196:         '>'
197:     end
198:   end
encode_tag_end(elename, cr = nil) click to toggle source
     # File lib/soap/generator.rb, line 200
200:   def encode_tag_end(elename, cr = nil)
201:     if cr
202:       @buf << "\n#{ @indent }</#{ elename }>"
203:     else
204:       @buf << "</#{ elename }>"
205:     end
206:   end
generate(obj, io = nil) click to toggle source
    # File lib/soap/generator.rb, line 52
52:   def generate(obj, io = nil)
53:     @buf = io || ''
54:     @indent = ''
55:     @encode_char_regexp = get_encode_char_regexp()
56: 
57:     prologue
58:     @handlers.each do |uri, handler|
59:       handler.encode_prologue
60:     end
61: 
62:     ns = SOAP::NS.new
63:     if @default_ns
64:       @default_ns.each_ns do |default_ns, default_tag|
65:         Generator.assign_ns(obj.extraattr, ns, default_ns, default_tag)
66:       end
67:     end
68:     if @default_ns_tag
69:       @default_ns_tag.each_ns do |default_ns, default_tag|
70:         ns.known_tag[default_ns] = default_tag
71:       end
72:     end
73:     @buf << xmldecl
74:     encode_data(ns, obj, nil)
75: 
76:     @handlers.each do |uri, handler|
77:       handler.encode_epilogue
78:     end
79:     epilogue
80: 
81:     @buf
82:   end

Private Instance Methods

epilogue() click to toggle source
     # File lib/soap/generator.rb, line 245
245:   def epilogue
246:   end
find_handler(encodingstyle) click to toggle source
     # File lib/soap/generator.rb, line 279
279:   def find_handler(encodingstyle)
280:     unless @handlers.key?(encodingstyle)
281:       factory = SOAP::EncodingStyle::Handler.handler(encodingstyle)
282:       if factory
283:         handler = factory.new(@charset)
284:         handler.generate_explicit_type = @generate_explicit_type
285:         handler.encode_prologue
286:         @handlers[encodingstyle] = handler
287:       end
288:     end
289:     @handlers[encodingstyle]
290:   end
get_encode_char_regexp() click to toggle source
     # File lib/soap/generator.rb, line 274
274:   def get_encode_char_regexp
275:     ENCODE_CHAR_REGEXP[XSD::Charset.encoding] ||=
276:       Regexp.new("[#{EncodeMap.keys.join}]", nil, XSD::Charset.encoding)
277:   end
get_encoded(str) click to toggle source
     # File lib/soap/generator.rb, line 259
259:   def get_encoded(str)
260:     if @use_numeric_character_reference and !XSD::Charset.is_us_ascii(str)
261:       str.gsub!(@encode_char_regexp) { |c| EncodeMap[c] }
262:       str.unpack("U*").collect { |c|
263:         if c == 0x9 or c == 0xa or c == 0xd or (c >= 0x20 and c <= 0x7f)
264:           c.chr
265:         else
266:           sprintf("&#x%x;", c)
267:         end
268:       }.join
269:     else
270:       str.gsub(@encode_char_regexp) { |c| EncodeMap[c] }
271:     end
272:   end
prologue() click to toggle source
     # File lib/soap/generator.rb, line 242
242:   def prologue
243:   end
xmldecl() click to toggle source
     # File lib/soap/generator.rb, line 292
292:   def xmldecl
293:     if @charset
294:       %[<?xml version="1.0" encoding="#{ @charset }" ?>]
295:     else
296:       %[<?xml version="1.0" ?>]
297:     end
298:   end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.