Class: WsdlMapper::Deserializers::ClassMapping

Inherits:
Object
  • Object
show all
Includes:
WsdlMapper::Dom
Defined in:
lib/wsdl_mapper/deserializers/class_mapping.rb

Defined Under Namespace

Classes: Delegate

Constant Summary collapse

XSI_NS =
'http://www.w3.org/2001/XMLSchema-instance'
XSI_NIL =
WsdlMapper::Dom::Name.get XSI_NS, 'nil'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cls, simple: false, &block) ⇒ ClassMapping

Returns a new instance of ClassMapping.



20
21
22
23
24
25
26
27
28
29
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 20

def initialize(cls, simple: false, &block)
  @cls = cls
  @attributes = Directory.new #on_nil: Errors::UnknownAttributeError
  @properties = Directory.new on_nil: Errors::UnknownElementError
  @simple = simple
  @wrappers = Directory.new
  @delegate = nil

  instance_exec(&block)
end

Instance Attribute Details

#attributesObject (readonly)

Returns the value of attribute attributes.



18
19
20
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 18

def attributes
  @attributes
end

#propertiesObject (readonly)

Returns the value of attribute properties.



18
19
20
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 18

def properties
  @properties
end

Instance Method Details

#build_object(base, frame) ⇒ Object



81
82
83
84
85
86
87
88
89
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 81

def build_object(base, frame)
  if @simple
    type_name = WsdlMapper::Dom::Name.get(*@simple)
    content = base.to_ruby type_name, frame.text
    @cls.new content
  else
    @cls.new
  end
end

#end(base, frame) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 57

def end(base, frame)
  return if nil_attr?(frame.attrs)

  frame.object = build_object base, frame

  if @delegate
    mapping = base.get_type_mapping @delegate.type_name
    delegate = mapping.build_object base, frame
    mapping.set_properties base, frame, delegate
    mapping.set_attributes base, frame, delegate
    frame.object.send "#{@delegate.accessor}=", delegate
  else
    set_attributes base, frame, frame.object
    set_properties base, frame, frame.object
  end
end

#get_type_name_for_prop(prop_name) ⇒ Object



91
92
93
94
95
96
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 91

def get_type_name_for_prop(prop_name)
  @properties[prop_name].type_name
rescue Errors::UnknownElementError => e
  e.parent = @cls
  raise e
end

#nil_attr?(attrs) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
77
78
79
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 74

def nil_attr? attrs
  # TODO: test
  !!attrs.find do |(name, _)|
    name == XSI_NIL
  end
end

#register_attr(accessor, attr_name, type_name) ⇒ Object



31
32
33
34
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 31

def register_attr(accessor, attr_name, type_name)
  attr_name = Name.get(*attr_name)
  @attributes[attr_name] = AttrMapping.new(accessor, attr_name, Name.get(*type_name))
end

#register_delegate(accessor, type_name) ⇒ Object



41
42
43
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 41

def register_delegate(accessor, type_name)
  @delegate = Delegate.new accessor, Name.get(*type_name)
end

#register_prop(accessor, prop_name, type_name, array: false) ⇒ Object



36
37
38
39
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 36

def register_prop(accessor, prop_name, type_name, array: false)
  prop_name = Name.get(*prop_name)
  @properties[prop_name] = PropMapping.new(accessor, prop_name, Name.get(*type_name), array: array)
end

#register_wrapper(name) ⇒ Object



45
46
47
48
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 45

def register_wrapper(name)
  name = Name.get(*name)
  @wrappers[name] = true
end

#set_attributes(base, frame, object) ⇒ Object



112
113
114
115
116
117
118
119
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 112

def set_attributes(base, frame, object)
  frame.attrs.each do |(name, value)|
    attr_mapping = attributes[name]
    next unless attr_mapping
    ruby_value = base.to_ruby attr_mapping.type_name, value
    attr_mapping.set object, ruby_value
  end
end

#set_properties(base, frame, object) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 98

def set_properties(base, frame, object)
  frame.children.each do |child|
    name = child.name
    prop_mapping = properties[name]

    if BuiltinType.builtin? prop_mapping.type_name
      ruby_value = base.to_ruby prop_mapping.type_name, child.text
      prop_mapping.set object, ruby_value
    else
      prop_mapping.set object, child.object
    end
  end
end

#start(_base, _frame) ⇒ Object



54
55
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 54

def start(_base, _frame)
end

#wrapper?(name) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/wsdl_mapper/deserializers/class_mapping.rb', line 50

def wrapper?(name)
  @wrappers[name]
end