Class: DataMapper::Adapters::SalesforceAdapter::SoapWrapper

Inherits:
Object
  • Object
show all
Defined in:
lib/dm-salesforce-adapter/soap_wrapper.rb

Defined Under Namespace

Classes: ClassesFailedToGenerate

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(module_name, driver_name, wsdl_path, api_dir) ⇒ SoapWrapper

Returns a new instance of SoapWrapper.



9
10
11
12
13
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 9

def initialize(module_name, driver_name, wsdl_path, api_dir)
  @module_name, @driver_name, @wsdl_path, @api_dir = module_name, driver_name, File.expand_path(wsdl_path), File.expand_path(api_dir)
  generate_soap_classes
  driver
end

Instance Attribute Details

#api_dirObject (readonly)

Returns the value of attribute api_dir.



7
8
9
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 7

def api_dir
  @api_dir
end

#driver_nameObject (readonly)

Returns the value of attribute driver_name.



7
8
9
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 7

def driver_name
  @driver_name
end

#module_nameObject (readonly)

Returns the value of attribute module_name.



7
8
9
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 7

def module_name
  @module_name
end

#wsdl_pathObject (readonly)

Returns the value of attribute wsdl_path.



7
8
9
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 7

def wsdl_path
  @wsdl_path
end

Instance Method Details

#driverObject



15
16
17
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 15

def driver
  @driver ||= Object.const_get(module_name).const_get(driver_name).new
end

#files_exist?Boolean

Returns:

  • (Boolean)


73
74
75
76
77
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 73

def files_exist?
  ["#{module_name}.rb", "#{module_name}MappingRegistry.rb", "#{module_name}Driver.rb"].all? do |name|
    File.exist?("#{wsdl_api_dir}/#{name}")
  end
end

#generate_filesObject

Good candidate for shipping out into a Rakefile.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 52

def generate_files
  require 'wsdl/soap/wsdl2ruby'

  wsdl2ruby          = WSDL::SOAP::WSDL2Ruby.new
  wsdl2ruby.logger   = $LOG if $LOG
  wsdl2ruby.location = wsdl_path
  wsdl2ruby.basedir  = wsdl_api_dir

  wsdl2ruby.opt.merge!({
    'classdef'         => module_name,
    'module_path'      => module_name,
    'mapping_registry' => nil,
    'driver'           => nil,
    'client_skelton'   => nil,
  })

  wsdl2ruby.run

  raise ClassesFailedToGenerate unless files_exist?
end

#generate_soap_classesObject

# Attempt at a run-time equivalent. Works except for the API responses are

# in SOAP objects, not native ruby objects.  Haven't figured that one out..
def driver
  return @driver if @driver

  require 'wsdl/soap/wsdl2ruby'

  factory            = SOAP::WSDLDriverFactory.new(wsdl_path)
  class_name_creator = WSDL::SOAP::ClassNameCreator.new

  eval(WSDL::SOAP::ClassDefCreator.new(factory.wsdl, class_name_creator, @module_name).dump, TOPLEVEL_BINDING)
  eval(WSDL::SOAP::MappingRegistryCreator.new(factory.wsdl, class_name_creator, @module_name).dump, TOPLEVEL_BINDING)

  @driver ||= factory.create_rpc_driver
end


37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 37

def generate_soap_classes
  unless File.file?(wsdl_path)
    raise Errno::ENOENT, "Could not find the WSDL at #{wsdl_path}"
  end

  FileUtils.mkdir_p(wsdl_api_dir)

  generate_files unless files_exist?

  $:.push wsdl_api_dir
  require "#{module_name}Driver"
  $:.delete wsdl_api_dir
end

#wsdl_api_dirObject



79
80
81
# File 'lib/dm-salesforce-adapter/soap_wrapper.rb', line 79

def wsdl_api_dir
  "#{api_dir}/#{File.basename(wsdl_path)}"
end