class WsdlMapper::S8rGeneration::S8rGenerator

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/s8r_generation/s8r_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_s8r_type_directory_name
  @serializer_name = namer.get_global_s8r_name
  @skip_modules = skip_modules
end

Public Instance Methods

generate(schema) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 33
def generate(schema)
  result = Result.new schema: schema

  generate_type_directory schema, result
  generate_serializer_factory 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

  result
end

Protected Instance Methods

collect_attributes(ttg) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 163
def collect_attributes(ttg)
  if ttg.type.soap_array?
    soap_array_attributes(ttg)
  else
    ttg.type.each_attribute.map do |attr|
      attr_name = generate_name attr.name
      accessor_name = @namer.get_attribute_name(attr).attr_name
      type = attr.type.root.name.name.inspect

      "[#{attr_name}, obj.#{accessor_name}, #{type}]"
    end
  end
end
def_build_method(f, ttg) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 263
def def_build_method(f, ttg)
  f.in_def 'build', :x, :obj, :name do
    f.statement 'return if obj.nil?'
    case ttg.type
    when ::WsdlMapper::Dom::ComplexType
      def_complex_build_method_body f, ttg
    when ::WsdlMapper::Dom::SimpleType
      def_simple_build_method_body f, ttg
    end
  end
end
def_complex_build_method_body(f, ttg) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 130
def def_complex_build_method_body(f, ttg)
  f.literal_array 'attributes', collect_attributes(ttg)
  type_name = generate_name ttg.type.name
  f.block "x.complex(#{type_name}, name, attributes)", ['x'] do
    if ttg.type.simple_content?
      write_content_statement f, ttg
    elsif ttg.type.soap_array?
      write_soap_array_statements f, ttg
    else
      write_property_statements f, ttg
    end
  end
end
def_simple_build_method_body(f, ttg) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 122
def def_simple_build_method_body(f, ttg)
  type_name = generate_name ttg.type.name
  f.block "x.simple(#{type_name}, name)", ['x'] do
    root_type = ttg.type.root.name.name
    f.call 'x.text_builtin', 'obj', root_type.inspect
  end
end
generate_element_entry(f, element, _result) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 87
def generate_element_entry(f, element, _result)
  type_name = @namer.get_type_name get_type_name element.type
  type_class_name = type_name.name.inspect

  f.call :register_element, type_class_name, generate_name(element.name)
end
generate_serializer_factory(schema, result) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 53
def generate_serializer_factory(schema, result)
  modules = get_module_names @serializer_name

  file_for @serializer_name, result do |f|
    f.requires 'wsdl_mapper/serializers/serializer_factory',
      @type_directory_name.require_path

    f.in_modules modules do
      args = [@type_directory_name.name]
      args << "default_namespace: #{schema.target_namespace.inspect}" if schema.target_namespace
      f.assignment @serializer_name.class_name, "::WsdlMapper::Serializers::SerializerFactory.new(#{args * ', '})"
    end
  end
end
generate_type(type, result) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 104
def generate_type(type, result)
  name = @namer.get_s8r_name get_type_name type
  modules = get_module_names name

  type_file_for name, result do |f|
    ttg = TypeToGenerate.new type, name
    f.requires @type_directory_name.require_path

    f.in_modules modules do
      f.in_class ttg.name.class_name do
        def_build_method f, ttg
      end
    end

    f.call "#{@type_directory_name.name}.register_serializer", name.name.inspect, "#{name.name}.new"
  end
end
generate_type_directory(schema, result) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 68
def generate_type_directory(schema, result)
  modules = get_module_names @type_directory_name

  file_for @type_directory_name, result do |f|
    f.requires 'wsdl_mapper/serializers/type_directory'

    f.in_modules modules do
      f.block_assignment @type_directory_name.class_name, '::WsdlMapper::Serializers::TypeDirectory.new', [] do
        schema.each_type do |type|
          generate_type_directory_entry f, type, result
        end
        schema.each_element do |element|
          generate_element_entry f, element, result
        end
      end
    end
  end
end
generate_type_directory_entry(f, type, _result) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 94
def generate_type_directory_entry(f, type, _result)
  type_name = @namer.get_type_name get_type_name type
  s8r_name = @namer.get_s8r_name get_type_name type
  type_class_name = type_name.name.inspect
  require_path = s8r_name.require_path.inspect
  s8r_class_name = s8r_name.name.inspect

  f.call :register_type, type_class_name, require_path, s8r_class_name
end
get_s8r_name(prop) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 245
def get_s8r_name(prop)
  if prop.type.name
    @namer.get_s8r_name prop.type
  else
    @namer.get_s8r_name @namer.get_inline_type prop
  end
end
soap_array_attributes(ttg) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 197
def soap_array_attributes(ttg)
  # Use String#inspect to get the proper escaping, but cut off the last quotemark and append the array length
  ns = ttg.type.soap_array_type_name.ns.inspect
  name = ttg.type.soap_array_type_name.name.inspect[0..-2] + "[\#{obj.length}]\""
  # TODO: what about its namespace?
  [
    %<[[x.soap_enc, "arrayType"], [#{ns}, #{name}], "string"]>
  ]
end
write_builtin_property_statement(f, prop, name) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 253
def write_builtin_property_statement(f, prop, name)
  type = prop.type_name.name.inspect
  element_name = generate_name prop.name
  write_value_builtin_statement(f, element_name, name, type)
end
write_complex_property_statement(f, prop, var_name) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 239
def write_complex_property_statement(f, prop, var_name)
  element_name = generate_name prop.name
  type_name = @namer.get_type_name get_type_name prop.type
  f.statement "x.get(#{type_name.name.inspect}).build(x, #{var_name}, #{element_name})"
end
write_content_statement(f, ttg) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 144
def write_content_statement(f, ttg)
  content_name = @namer.get_content_name ttg.type
  type = ttg.type.base.name.name
  f.call 'x.text_builtin', "obj.#{content_name.attr_name}", type.inspect
end
write_property_array_statement(f, prop) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 207
def write_property_array_statement(f, prop)
  name = "obj.#{@namer.get_property_name(prop).attr_name}.each"
  f.block name, ['itm'] do
    case prop.type
    when ::WsdlMapper::Dom::BuiltinType
      write_builtin_property_statement f, prop, 'itm'
    when ::WsdlMapper::Dom::ComplexType
      write_complex_property_statement f, prop, 'itm'
    when ::WsdlMapper::Dom::SimpleType
      write_simple_property_statement f, prop, 'itm'
    end
  end
end
write_property_statement(f, prop) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 221
def write_property_statement(f, prop)
  name = "obj.#{@namer.get_property_name(prop).attr_name}"
  case prop.type
  when ::WsdlMapper::Dom::BuiltinType
    write_builtin_property_statement f, prop, name
  when ::WsdlMapper::Dom::ComplexType
    write_complex_property_statement f, prop, name
  when ::WsdlMapper::Dom::SimpleType
    write_simple_property_statement f, prop, name
  end
end
write_property_statements(f, ttg) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 150
def write_property_statements(f, ttg)
  types = ttg.type.bases << ttg.type
  types.each do |type|
    type.each_property do |prop|
      if prop.array?
        write_property_array_statement f, prop
      else
        write_property_statement f, prop
      end
    end
  end
end
write_simple_property_statement(f, prop, var_name) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 233
def write_simple_property_statement(f, prop, var_name)
  element_name = generate_name prop.name
  type_name = @namer.get_type_name get_type_name prop.type
  f.statement "x.get(#{type_name.name.inspect}).build(x, #{var_name}, #{element_name})"
end
write_soap_array_item_statement(f, type, item_name) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 184
def write_soap_array_item_statement(f, type, item_name)
  case type.soap_array_type
  when ::WsdlMapper::Dom::BuiltinType
    write_value_builtin_statement f, item_name, 'itm', type.soap_array_type_name.name.inspect
  when ::WsdlMapper::Dom::ComplexType
    type_name = @namer.get_type_name type.soap_array_type
    f.statement "x.get(#{type_name.name.inspect}).build(x, itm, #{item_name})"
  when ::WsdlMapper::Dom::SimpleType
    type_name = @namer.get_type_name type.soap_array_type
    f.statement "x.get(#{type_name.name.inspect}).build(x, itm, #{item_name})"
  end
end
write_soap_array_statements(f, ttg) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 177
def write_soap_array_statements(f, ttg)
  item_name = generate_name WsdlMapper::Dom::Name.get(ttg.type.name.ns, @namer.get_soap_array_item_name(ttg.type))
  f.block 'obj.each', ['itm'] do
    write_soap_array_item_statement(f, ttg.type, item_name)
  end
end
write_value_builtin_statement(f, element_name, name, type) click to toggle source
# File lib/wsdl_mapper/s8r_generation/s8r_generator.rb, line 259
def write_value_builtin_statement(f, element_name, name, type)
  f.statement "x.value_builtin(#{element_name}, #{name}, #{type})"
end