class WsdlMapper::D10rGeneration::D10rGenerator

Attributes

context[R]

Public Class Methods

new(context, skip_modules: false, namer: WsdlMapper::Naming::DefaultNamer.new, formatter_factory: DefaultFormatter, module_generator_factory: DefaultModuleGenerator) click to toggle source
Calls superclass method WsdlMapper::Generation::Base::new
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 17
def initialize(context,
  skip_modules: false,
  namer: WsdlMapper::Naming::DefaultNamer.new,
  formatter_factory: DefaultFormatter,
  module_generator_factory: DefaultModuleGenerator)

  super(context)

  @namer = namer
  @formatter_factory = formatter_factory
  @module_generator = module_generator_factory.new self
  @type_directory_name = @namer.get_d10r_type_directory_name
  @element_directory_name = @namer.get_d10r_element_directory_name
  @deserializer_name = @namer.get_global_d10r_name
  @skip_modules = skip_modules
end

Public Instance Methods

generate(schema) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 34
def generate(schema)
  result = Result.new schema: schema

  generate_type_directory schema, result

  schema.each_type do |type|
    generate_type type, result
  end

  unless @skip_modules
    result.module_tree.each do |module_node|
      @module_generator.generate module_node, result
    end
  end

  generate_element_directory schema, result
  generate_deserializer schema, result

  result
end
get_formatter(io) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 55
def get_formatter(io)
  @formatter_factory.new io
end

Protected Instance Methods

collect_property_requires(properties) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 143
def collect_property_requires(properties)
  properties.map do |prop|
    type = get_type_name(prop.type)
    next if WsdlMapper::Dom::BuiltinType.builtin?(type.name) || type.is_a?(WsdlMapper::Dom::SimpleType) || WsdlMapper::Dom::SoapEncodingType.builtin?(type.name)
    @namer.get_d10r_name(type).require_path
  end.compact
end
generate_complex(type, result) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 122
def generate_complex(type, result)
  type_name = @namer.get_type_name get_type_name type
  name = @namer.get_d10r_name get_type_name type
  modules = get_module_names name
  prop_requires = collect_property_requires(type.each_property)
  prop_requires += collect_property_requires(type.base.each_property) if has_base?(type)

  type_file_for name, result do |f|
    f.requires @type_directory_name.require_path, type_name.require_path
    f.requires(*prop_requires.uniq)

    f.in_modules modules do
      if type.soap_array?
        register_soap_array f, name, type, type_name
      else
        register_complex_type f, name, type, type_name
      end
    end
  end
end
generate_deserializer(_schema, result) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 60
def generate_deserializer(_schema, result)
  modules = @deserializer_name.parents.reverse.map(&:module_name)

  type_file_for @deserializer_name, result do |f|
    f.requires 'wsdl_mapper/deserializers/lazy_loading_deserializer',
      @element_directory_name.require_path
    f.in_modules modules do
      f.assignment @deserializer_name.class_name, "::WsdlMapper::Deserializers::LazyLoadingDeserializer.new(#{@element_directory_name.name})"
    end
  end
end
generate_element_directory(schema, result) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 72
def generate_element_directory(schema, result)
  modules = get_module_names @element_directory_name

  type_file_for @element_directory_name, result do |f|
    f.requires @type_directory_name.require_path,
      'wsdl_mapper/deserializers/element_directory'
    f.in_modules modules do
      f.block_assignment @element_directory_name.class_name, "::WsdlMapper::Deserializers::ElementDirectory.new(#{@type_directory_name.name})", [] do
        register_elements f, schema, result
      end
    end
  end
end
generate_type(type, result) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 115
def generate_type(type, result)
  case type
  when WsdlMapper::Dom::ComplexType
    generate_complex type, result
  end
end
generate_type_directory(_schema, result) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 104
def generate_type_directory(_schema, result)
  modules = get_module_names @type_directory_name

  type_file_for @type_directory_name, result do |f|
    f.requires 'wsdl_mapper/deserializers/type_directory'
    f.in_modules modules do
      f.assignment @type_directory_name.class_name, '::WsdlMapper::Deserializers::TypeDirectory.new'
    end
  end
end
has_base?(type) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 165
def has_base?(type)
  WsdlMapper::Dom::ComplexType === type && type.base && WsdlMapper::Dom::ComplexType === type.base
end
register_attributes(f, containing_type) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 169
def register_attributes(f, containing_type)
  if has_base? containing_type
    register_attributes f, containing_type.base
  end
  containing_type.each_attribute do |attr|
    acc_name = @namer.get_attribute_name attr
    type = attr.type.root
    name = attr.name
    f.call :register_attr, ":#{acc_name.attr_name}", generate_name(name), generate_name(type.name)
  end
end
register_complex_type(f, name, type, type_name) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 155
def register_complex_type(f, name, type, type_name)
  simple = ", simple: #{generate_name(type.root.name)}" if type.simple_content?

  type_or_inline = get_type_name(type).name
  f.block_assignment name.class_name, "#{@type_directory_name.name}.register_type(#{generate_name(type_or_inline)}, #{type_name.name}#{simple})", [] do
    register_attributes f, type
    register_properties f, type
  end
end
register_element(f, element, _result) click to toggle source

@param [WsdlMapper::Generation::AbstractFormatter] f @param [WsdlMapper::Dom::Element] element @param [WsdlMapper::Generation::Result] _result

# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 95
def register_element(f, element, _result)
  element_name = generate_name element.name
  type_name = generate_name get_type_name(element.type).name
  d10r_name = @namer.get_d10r_name(element.type.name ? element.type : @namer.get_inline_type(element))
  require_path = d10r_name.require_path.inspect

  f.statement "register_element #{element_name}, #{type_name}, #{require_path}, #{d10r_name.name.inspect}"
end
register_elements(f, schema, result) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 86
def register_elements(f, schema, result)
  schema.each_element do |element|
    register_element f, element, result
  end
end
register_properties(f, containing_type) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 181
def register_properties(f, containing_type)
  if has_base? containing_type
    register_properties f, containing_type.base
  end
  containing_type.each_property do |prop|
    acc_name = @namer.get_property_name prop
    type = prop.type.is_a?(WsdlMapper::Dom::SimpleType) ? prop.type.root : prop.type
    args = [":#{acc_name.attr_name}", generate_name(prop.name), generate_name(type.name)]
    args << 'array: true' if prop.array?
    f.call :register_prop, *args
  end
end
register_soap_array(f, name, type, type_name) click to toggle source
# File lib/wsdl_mapper/d10r_generation/d10r_generator.rb, line 151
def register_soap_array(f, name, type, type_name)
  f.assignment name.class_name, "#{@type_directory_name.name}.register_soap_array(#{generate_name(type.name)}, #{type_name.name}, #{generate_name(type.soap_array_type_name)})"
end