1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
# WSDL4R - SOAP complexType definition for WSDL.
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
# redistribute it and/or modify it under the same terms of Ruby's license;
# either the dual license version in 2003, or any later version.
require 'wsdl/xmlSchema/complexType'
require 'soap/mapping'
module WSDL
module XMLSchema
class ComplexType < Info
def compoundtype
@compoundtype ||= check_type
end
def check_type
if have_any?
:TYPE_STRUCT
elsif content
if attributes.empty? and map_as_array?
if name == ::SOAP::Mapping::MapQName
:TYPE_MAP
else
:TYPE_ARRAY
end
else
:TYPE_STRUCT
end
elsif complexcontent
complexcontent.check_type
elsif simplecontent
:TYPE_SIMPLE
elsif !attributes.empty?
:TYPE_STRUCT
else # empty complexType definition (seen in partner.wsdl of salesforce)
:TYPE_EMPTY
end
end
def child_type(name = nil)
case compoundtype
when :TYPE_STRUCT
if ele = find_element(name)
ele.type
elsif ele = find_element_by_name(name.name)
ele.type
end
when :TYPE_ARRAY
@contenttype ||= content_arytype
when :TYPE_MAP
item_ele = find_element_by_name("item") or
raise RuntimeError.new("'item' element not found in Map definition.")
content = item_ele.local_complextype or
raise RuntimeError.new("No complexType definition for 'item'.")
if ele = content.find_element(name)
ele.type
elsif ele = content.find_element_by_name(name.name)
ele.type
end
else
raise NotImplementedError.new("Unknown kind of complexType.")
end
end
def child_defined_complextype(name)
ele = nil
case compoundtype
when :TYPE_STRUCT, :TYPE_MAP
unless ele = find_element(name)
if name.namespace.nil?
ele = find_element_by_name(name.name)
end
end
when :TYPE_ARRAY
e = elements
if e.size == 1
ele = e[0]
else
raise RuntimeError.new("Assert: must not reach.")
end
else
raise RuntimeError.new("Assert: Not implemented.")
end
unless ele
raise RuntimeError.new("Cannot find #{name} as a children of #{@name}.")
end
ele.local_complextype
end
def find_soapenc_arytype
unless compoundtype == :TYPE_ARRAY
raise RuntimeError.new("Assert: not for array")
end
if complexcontent
if complexcontent.restriction
complexcontent.restriction.attributes.each do |attribute|
if attribute.ref == ::SOAP::AttrArrayTypeName
return attribute.arytype
end
end
end
end
nil
end
def find_arytype
unless compoundtype == :TYPE_ARRAY
raise RuntimeError.new("Assert: not for array")
end
if arytype = find_soapenc_arytype
return arytype
end
if map_as_array?
return element_simpletype(elements[0])
end
raise RuntimeError.new("Assert: Unknown array definition.")
end
def find_aryelement
unless compoundtype == :TYPE_ARRAY
raise RuntimeError.new("Assert: not for array")
end
if map_as_array?
return nested_elements[0]
end
nil # use default item name
end
private
def element_simpletype(element)
case element
when XMLSchema::Element
if element.type
element.type
elsif element.local_simpletype
element.local_simpletype.base
else
# element definition
nil
end
when XMLSchema::Any
XSD::AnyTypeName
else
nil
end
end
def map_as_array?
e = nested_elements
e.size == 1 and e[0].map_as_array?
end
def content_arytype
if arytype = find_arytype
ns = arytype.namespace
name = arytype.name.sub(/\[(?:,)*\]$/, '')
XSD::QName.new(ns, name)
else
nil
end
end
end
end
end
|