SOAP::SOAPGenerator (Class)

In: soap/generator.rb
Parent: Object

CAUTION: MT-unsafe

Constants

EncodeMap = { '&' => '&amp;', '<' => '&lt;', '>' => '&gt;', '"' => '&quot;', '\'' => '&apos;', "\r" => '&#xd;'
EncodeCharRegexp = Regexp.new("[#{EncodeMap.keys.join}]")

Attributes

charset  [RW] 
default_encodingstyle  [RW] 
generate_explicit_type  [RW] 

Classes and Modules

Class SOAP::SOAPGenerator::FormatEncodeError

Included Modules

Public Class methods

[Source]

# File soap/generator.rb, line 176
  def self.assign_ns(attrs, ns, namespace, tag = nil)
    if namespace and !ns.assigned?(namespace)
      tag = ns.assign(namespace, tag)
      attrs['xmlns:' << tag] = namespace
    end
  end

[Source]

# File soap/generator.rb, line 32
  def initialize(opt = {})
    @reftarget = nil
    @handlers = {}
    @charset = opt[:charset] || XSD::Charset.encoding_label
    @default_encodingstyle = opt[:default_encodingstyle] || EncodingNamespace
    @generate_explicit_type =
      opt.key?(:generate_explicit_type) ? opt[:generate_explicit_type] : true
    @buf = @indent = @curr = nil
  end

Public Instance methods

[Source]

# File soap/generator.rb, line 102
  def add_reftarget(name, node)
    unless @reftarget
      raise FormatEncodeError.new("Reftarget is not defined.")
    end
    @reftarget.add(name, node)
  end

[Source]

# File soap/generator.rb, line 63
  def encode_data(ns, qualified, obj, parent)
    if obj.is_a?(SOAPEnvelopeElement)
      encode_element(ns, qualified, obj, parent)
      return
    end

    if @reftarget && !obj.precedents.empty?
      add_reftarget(obj.elename.name, obj)
      ref = SOAPReference.new
      ref.elename.name = obj.elename.name
      ref.__setobj__(obj)
      obj.precedents.clear      # Avoid cyclic delay.

      obj.encodingstyle = parent.encodingstyle
      # SOAPReference is encoded here.

      obj = ref
    end

    encodingstyle = obj.encodingstyle
    # Children's encodingstyle is derived from its parent.

    encodingstyle ||= parent.encodingstyle if parent
    obj.encodingstyle = encodingstyle

    handler = find_handler(encodingstyle || @default_encodingstyle)
    unless handler
      raise FormatEncodeError.new("Unknown encodingStyle: #{ encodingstyle }.")
    end

    if !obj.elename.name
      raise FormatEncodeError.new("Element name not defined: #{ obj }.")
    end

    handler.encode_data(self, ns, qualified, obj, parent) do |child, child_q|
      indent_backup, @indent = @indent, @indent + '  '
      encode_data(ns.clone_ns, child_q, child, obj)
      @indent = indent_backup
    end
    handler.encode_data_end(self, ns, qualified, obj, parent)
  end

[Source]

# File soap/generator.rb, line 109
  def encode_element(ns, qualified, obj, parent)
    attrs = {}
    if obj.is_a?(SOAPBody)
      @reftarget = obj
      obj.encode(self, ns, attrs) do |child, child_q|
        indent_backup, @indent = @indent, @indent + '  '
        encode_data(ns.clone_ns, child_q, child, obj)
        @indent = indent_backup
      end
      @reftarget = nil
    else
      if obj.is_a?(SOAPEnvelope)
        # xsi:nil="true" can appear even if dumping without explicit type.

        SOAPGenerator.assign_ns(attrs, ns,
          XSD::InstanceNamespace, XSINamespaceTag)
        if @generate_explicit_type
          SOAPGenerator.assign_ns(attrs, ns, XSD::Namespace, XSDNamespaceTag)
        end
      end
      obj.encode(self, ns, attrs) do |child, child_q|
        indent_backup, @indent = @indent, @indent + '  '
        encode_data(ns.clone_ns, child_q, child, obj)
        @indent = indent_backup
      end
    end
  end

[Source]

# File soap/generator.rb, line 159
  def encode_rawstring(str)
    @buf << str
  end

[Source]

# File soap/generator.rb, line 172
  def encode_string(str)
    @buf << str.gsub(EncodeCharRegexp) { |c| EncodeMap[c] }
  end

[Source]

# File soap/generator.rb, line 136
  def encode_tag(elename, attrs = nil)
    if !attrs or attrs.empty?
      @buf << "\n#{ @indent }<#{ elename }>"
    elsif attrs.size == 1
      key, value = attrs.shift
      @buf << %[\n#{ @indent }<#{ elename } #{ key }="#{ value }">]
    else
      @buf << "\n#{ @indent }<#{ elename } " <<
        attrs.collect { |key, value|
          %[#{ key }="#{ value }"]
        }.join("\n#{ @indent }    ") <<
        '>'
    end
  end

[Source]

# File soap/generator.rb, line 151
  def encode_tag_end(elename, cr = nil)
    if cr
      @buf << "\n#{ @indent }</#{ elename }>"
    else
      @buf << "</#{ elename }>"
    end
  end

[Source]

# File soap/generator.rb, line 42
  def generate(obj, io = nil)
    @buf = io || ''
    @indent = ''

    prologue
    @handlers.each do |uri, handler|
      handler.encode_prologue
    end

    ns = XSD::NS.new
    @buf << xmldecl
    encode_data(ns, true, obj, nil)

    @handlers.each do |uri, handler|
      handler.encode_epilogue
    end
    epilogue

    @buf
  end

[Validate]