Class: WsdlMapper::DomParsing::ComplexTypeParser

Inherits:
ParserBase show all
Defined in:
lib/wsdl_mapper/dom_parsing/complex_type_parser.rb

Constant Summary

Constants included from Xsd

Xsd::ALL, Xsd::ANNOTATION, Xsd::ANY_ATTRIBUTE, Xsd::APPINFO, Xsd::ATTRIBUTE, Xsd::ATTRIBUTE_FORM_DEFAULT, Xsd::CHOICE, Xsd::COMPLEX_CONTENT, Xsd::COMPLEX_TYPE, Xsd::DEFAULT_BOUNDS, Xsd::DOCUMENTATION, Xsd::ELEMENT, Xsd::ELEMENT_FORM_DEFAULT, Xsd::ENUMERATION, Xsd::EXTENSION, Xsd::FRACTION_DIGITS, Xsd::IMPORT, Xsd::MAX_INCLUSIVE, Xsd::MAX_LENGTH, Xsd::MIN_INCLUSIVE, Xsd::MIN_LENGTH, Xsd::NS, Xsd::PATTERN, Xsd::RESTRICTION, Xsd::SCHEMA, Xsd::SEQUENCE, Xsd::SIMPLE_CONTENT, Xsd::SIMPLE_TYPE, Xsd::TOTAL_DIGITS, Xsd::UNIQUE

Constants inherited from Parsing::Base

Parsing::Base::NS_DECL_PREFIX, Parsing::Base::TARGET_NS

Instance Attribute Summary

Attributes included from Parsing::Logging

#log_msgs

Instance Method Summary collapse

Methods inherited from Parsing::Base

get_name, #initialize

Methods included from Parsing::Logging

#log_msg

Constructor Details

This class inherits a constructor from WsdlMapper::Parsing::Base

Instance Method Details

#parse(node) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
# 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) ⇒ Object



67
68
69
# 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) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
# 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) ⇒ Object



103
104
105
106
107
108
109
110
111
112
# 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) ⇒ Object



71
72
73
74
75
# 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) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 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) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 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) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# 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) ⇒ Object



156
157
158
159
160
161
162
163
164
165
# 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) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
150
# 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) ⇒ Object



152
153
154
# 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) ⇒ Object



195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# 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) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
# 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) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
# 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) ⇒ Object



126
127
128
129
130
131
132
133
134
135
# 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