class WsdlMapper::DomParsing::ComplexTypeParser

Public Instance Methods

parse(node) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 12
def parse(node)
  name = parse_name_in_attribute 'name', node

  type = ComplexType.new name

  each_element node do |child|
    parse_complex_type_child child, type
  end

  @base.schema.add_type type
end
parse_attribute(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 67
def parse_attribute(node, type)
  @base.parsers[ATTRIBUTE].parse_attribute node, type
end
parse_complex_content(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 89
def parse_complex_content(node, type)
  child = first_element node

  case get_name child
  when EXTENSION
    parse_extension child, type
  when ANNOTATION
  when RESTRICTION
    parse_complex_content_restriction child, type
  else
    log_msg child, :unknown
  end
end
parse_complex_content_restriction(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 103
def parse_complex_content_restriction(node, type)
  parse_base node, type

  case type.base_type_name
  when SoapEncodingType['Array'].name
    parse_soap_array node, type
  else
    log_msg node, :unknown
  end
end
parse_complex_type_all(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 71
def parse_complex_type_all(node, type)
  each_element node do |child|
    parse_complex_type_property child, type, -1, ALL
  end
end
parse_complex_type_child(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 24
def parse_complex_type_child(node, type)
  case get_name node
  when SEQUENCE
    parse_complex_type_sequence node, type
  when CHOICE
    parse_complex_type_choice node, type
  when ALL
    parse_complex_type_all node, type
  when COMPLEX_CONTENT
    parse_complex_content node, type
  when SIMPLE_CONTENT
    parse_simple_content node, type
  when ANNOTATION
    parse_annotation node, type
  when ATTRIBUTE
    parse_attribute node, type
  when ANY_ATTRIBUTE
    # ignore
  else
    log_msg node, :unknown
  end
end
parse_complex_type_choice(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 47
def parse_complex_type_choice(node, type)
  # TODO: test
  each_element node do |child|
    case get_name child
    when SEQUENCE
      # Just include all sequences. Setting the appropriate properties to nil
      # to fulfill the choice requirements is the users responsibility.
      # Known issue: Sequence of generated elements can not be guaranteed, if the
      # same elements occur in different choices with different ordering.
      parse_complex_type_sequence child, type
    when ALL
      parse_complex_type_all child, type
    when ELEMENT
      parse_complex_type_property child, type, 0, ALL
    else
      log_msg child, :unknown
    end
  end
end
parse_complex_type_property(node, type, i, container) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 167
def parse_complex_type_property(node, type, i, container)
  name = parse_name_in_attribute 'name', node
  type_name = parse_name_in_attribute 'type', node
  ref = parse_name_in_attribute 'ref', node

  bounds = parse_bounds node, container

  options = {
    sequence: i,
    bounds: bounds,
    default: fetch_attribute_value('default', node),
    fixed: fetch_attribute_value('fixed', node),
    form: fetch_attribute_value('form', node)
  }

  prop = if ref
    Property::Ref.new ref, **options
  else
    Property.new name, type_name, **options
  end

  type.add_property prop

  each_element node do |child|
    parse_property_child child, prop
  end
end
parse_complex_type_sequence(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 156
def parse_complex_type_sequence(node, type)
  i = 0

  each_element node do |elm|
    next unless name_matches? elm, ELEMENT

    parse_complex_type_property elm, type, i, SEQUENCE
    i += 1
  end
end
parse_extension(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 137
def parse_extension(node, type)
  parse_base node, type

  each_element node do |child|
    case get_name child
    when SEQUENCE
      parse_extension_sequence child, type
    when ATTRIBUTE
      parse_attribute child, type
    else
      log_msg child, :unknown
    end
  end
end
parse_extension_sequence(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 152
def parse_extension_sequence(node, type)
  parse_complex_type_sequence node, type
end
parse_property_child(child, prop) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 195
def parse_property_child(child, prop)
  case get_name child
  when ANNOTATION
    parse_annotation child, prop
  when COMPLEX_TYPE
    prop.type = parse child
    prop.type.containing_property = prop
  when SIMPLE_TYPE
    prop.type = @base.parsers[SIMPLE_TYPE].parse child
    prop.type.containing_property = prop
  when UNIQUE
    # ignore
  else
    log_msg child, :unknown
  end
end
parse_simple_content(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 77
def parse_simple_content(node, type)
  type.simple_content = true
  each_element node do |child|
    case get_name child
    when EXTENSION
      parse_extension child, type
    else
      log_msg node, :unknown
    end
  end
end
parse_soap_array(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 114
def parse_soap_array(node, type)
  type.soap_array = true
  each_element node do |child|
    case get_name child
    when ATTRIBUTE
      parse_soap_array_attribute child, type
    else
      log_msg child, :unknown
    end
  end
end
parse_soap_array_attribute(node, type) click to toggle source
# File lib/wsdl_mapper/dom_parsing/complex_type_parser.rb, line 126
def parse_soap_array_attribute(node, type)
  ref = parse_name_in_attribute 'ref', node

  if ref != SoapEncodingType['arrayType'].name
    raise StandardError.new("Invalid ref attribute for SOAP array node: #{ref}")
  end

  type_name = parse_name node.attribute_with_ns(WsdlMapper::SvcDescParsing::Wsdl11::ARRAY_TYPE.name, WsdlMapper::SvcDescParsing::Wsdl11::ARRAY_TYPE.ns).value, node
  type.soap_array_type_name = Name.get type_name.ns, type_name.name[0..-3]
end