class WsdlMapper::Deserializers::SaxDocument

Constants

XSI_NS
XSI_TYPE

Attributes

object[R]

Public Class Methods

new(base) click to toggle source

@param [WsdlMapper::Deserializers::Deserializer] base

# File lib/wsdl_mapper/deserializers/sax_document.rb, line 14
def initialize(base)
  @base = base
  @namespaces_stack = []
  @buffer = ''
  @wrapper = nil
  @skipping = nil
  @current_frame = nil
end

Public Instance Methods

cdata_block(text) click to toggle source
# File lib/wsdl_mapper/deserializers/sax_document.rb, line 95
def cdata_block(text)
  @buffer << text
end
characters(text) click to toggle source
# File lib/wsdl_mapper/deserializers/sax_document.rb, line 91
def characters(text)
  @buffer << text
end
end_document() click to toggle source
# File lib/wsdl_mapper/deserializers/sax_document.rb, line 87
def end_document
  @object = @last_frame.object
end
end_element_namespace(name, _prefix = nil, uri = nil) click to toggle source

@param [String] name @param [String] _prefix @param [String] uri

# File lib/wsdl_mapper/deserializers/sax_document.rb, line 61
def end_element_namespace(name, _prefix = nil, uri = nil)
  @namespaces_stack.pop
  if @wrapper == Name.get(uri, name)
    @wrapper = nil
    return
  end
  if @skipping
    # Check if the sub-tree-to-skip is at its end
    # TODO: edge case of nested same-element
    if @skipping == Name.get(uri, name)
      @skipping = nil
      return
    end
    # If we are skipping this sub-tree, just return
    return
  end
  @current_frame.text = @buffer
  @buffer = ''
  @last_frame = @current_frame
  @current_frame = @current_frame.parent
  if @current_frame
    @current_frame.children << @last_frame
  end
  @last_frame.end
end
start_element_namespace(name, attrs = [], _prefix = nil, uri = nil, ns = []) click to toggle source

@param [String] name @param [Array<Nokogiri::XML::Attr>] attrs @param [String] _prefix @param [String] uri @param [Array<Array<String, String>>] ns

# File lib/wsdl_mapper/deserializers/sax_document.rb, line 28
def start_element_namespace(name, attrs = [], _prefix = nil, uri = nil, ns = [])
  @buffer = ''
  if @skipping
    return
  end
  uri = inherit_element_namespace uri
  name = Name.get uri, name
  namespaces = Namespaces.for Hash[ns]
  @namespaces_stack << namespaces
  if @current_frame && @current_frame.mapping.wrapper?(name)
    @wrapper = name
    return
  end
  begin
    type_name = get_type_name name, attrs
    attrs = get_attributes type_name, attrs
    parent = @current_frame
    mapping = @base.get_type_mapping type_name
    @current_frame = Frame.new name, type_name, attrs, parent, namespaces, @base, mapping
    @current_frame.start
  rescue WsdlMapper::Deserializers::Errors::UnknownElementError => e
    if @base.skip_unknown_elements?
      @skipping = name
      return
    else
      raise e
    end
  end
end

Protected Instance Methods

get_attributes(type_name, attrs) click to toggle source
# File lib/wsdl_mapper/deserializers/sax_document.rb, line 147
def get_attributes(type_name, attrs)
  attrs.map do |attr|
    uri = inherit_attr_namespace type_name, attr.uri
    name = Name.get uri, attr.localname
    [name, attr.value]
  end
end
get_type_attr(attrs) click to toggle source
# File lib/wsdl_mapper/deserializers/sax_document.rb, line 123
def get_type_attr(attrs)
  attrs.find do |attr|
    attr.uri == XSI_TYPE.ns && attr.localname == XSI_TYPE.name
  end
end
get_type_name(element_name, attrs) click to toggle source

@param [WsdlMapper::Dom::Name] element_name @return [WsdlMapper::Dom::Name]

# File lib/wsdl_mapper/deserializers/sax_document.rb, line 102
def get_type_name(element_name, attrs)
  if @current_frame
    type_attr = get_type_attr attrs
    if type_attr
      # TODO: test
      parse_name type_attr.value
    else
      @current_frame.mapping.get_type_name_for_prop element_name
    end
  else
    @base.get_element_type element_name
  end
end
inherit_attr_namespace(type_name, ns) click to toggle source
# File lib/wsdl_mapper/deserializers/sax_document.rb, line 138
def inherit_attr_namespace(type_name, ns)
  # TODO: test
  if ns.nil? && !@base.qualified_attributes? && @current_frame
    type_name.ns
  else
    ns
  end
end
inherit_element_namespace(ns) click to toggle source
# File lib/wsdl_mapper/deserializers/sax_document.rb, line 129
def inherit_element_namespace(ns)
  # TODO: test
  if ns.nil? && !@base.qualified_elements? && @current_frame
    @wrapper ? @wrapper.ns : @current_frame.type_name.ns
  else
    ns
  end
end
parse_name(name_str) click to toggle source
# File lib/wsdl_mapper/deserializers/sax_document.rb, line 116
def parse_name(name_str)
  name, ns_code = name_str.split(':').reverse
  ns = @namespaces_stack.reverse_each.map { |namespaces| namespaces[ns_code] }.find { |uri| !uri.nil? }

  Name.get ns, name
end