CAUTION: MT-unsafe
# 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
# 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
# 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
# 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
# File lib/soap/generator.rb, line 216 216: def element_local?(element) 217: element.elename.namespace.nil? 218: end
# 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
# 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
# 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
# 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
# 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
# File lib/soap/generator.rb, line 208 208: def encode_rawstring(str) 209: @buf << str 210: end
# File lib/soap/generator.rb, line 212 212: def encode_string(str) 213: @buf << get_encoded(str) 214: end
# 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
# 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
# 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
# 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
# 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
# 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
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.