class GxG::Networking::SoapDriver

SOAP Classes:

Public Class Methods

new(the_url=nil) click to toggle source

Example sites to test with: www.restfulwebservices.net/rest/WeatherForecastService.svc?wsdl www.restfulwebservices.net/wcf/WeatherForecastService.svc?wsdl graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl www.webservicex.com/CurrencyConvertor.asmx?wsdl

Calls superclass method
# File lib/gxg/net_clients.rb, line 2062
def initialize(the_url=nil)
  unless the_url.is_a?(::URI::Generic)
    raise ArgumentError, "You MUST provide a valid URI."
  end
  super()
  @user = nil
  @password = nil
  @interface = []
  @tns_url = nil
  ::Handsoap::http_driver = :net_http
  ::Handsoap::xml_query_driver = :rexml
  if the_url.query.to_s.downcase.include?("wsdl") || (the_url.path.to_s.downcase.include?("wsdl"))
    point = (the_url.scheme.to_s + "://")
    if the_url.user
      point << the_url.user
      @user = the_url.user
    end
    if the_url.password
      point << (":" << the_url.password)
      @password = the_url.password
    end
    if the_url.hostname
      if the_url.user
        point << ("@" << the_url.hostname)
      else
        point << the_url.hostname
      end
    end
    if the_url.path
      point << the_url.path
    end
    # Process WSDL, determine actual version number from that.
    http_tool = ::GxG::Networking::HttpClient.new
    response = http_tool.get(the_url, {:raw_response => true})
    if response
      wsdl_data = response.body.transcode({:replace => "."},::Encoding::UTF_8)
      if wsdl_data.include?("http://schemas.xmlsoap.org/soap/envelope/")
        wsdl_version = 1
      else
        wsdl_version = 2
      end
      ::GxG::Networking::SoapDriver::endpoint({:uri => (point), :version => (wsdl_version)})
      # Build Interface Data:
      document = ::Oga.parse_xml(wsdl_data)
      nodes = document.css("definitions")
      nodes.each do |node|
        next unless node.is_a?(Oga::XML::Element)
        node.attributes.each do |attribute|
          if ["tns", "targetNamespace"].include?(attribute.name)
            @tns_url = attribute.value
            break
          end
        end
        if @tns_url
          break
        end
      end
      unless @tns_url
        raise Exception, "Failed to load namespace (required)."
      end
      nodes = document.css("portType")
      base_names = []
      nodes.each do |node|
        next unless node.is_a?(::Oga::XML::Element)
        node.children.each do |the_operation|
          next unless the_operation.is_a?(::Oga::XML::Element)
          basename = nil
          the_operation.attributes.each do |attribute|
            if attribute.name == "name"
              basename = attribute.value
              break
            end
          end
          if basename
            record = {:base => (basename), :message => (("tns:" << basename).to_sym), :input => nil, :output => nil}
            the_operation.children.each do |the_io|
              next unless the_io.is_a?(::Oga::XML::Element)
              if ["input", "output"].include?(the_io.name)
                the_io.attributes.each do |the_message|
                  if the_message.name == "message"
                    record[(the_io.name.to_sym)] = the_message.value
                  end
                end
              end
            end
            if record[:input] || record[:output]
              base_names << record
            end
          end
        end
      end
      messages = document.css("message")
      base_names.each do |the_method|
        record = {:method => (the_method[:message]), :input => nil, :output => nil}
        messages.each do |the_message|
          next unless the_message.is_a?(::Oga::XML::Element)
          the_message.attributes.each do |the_attribute|
            direction_key = nil
            if the_method[:input].gsub(/^.+:/, "") == the_attribute.value
              direction_key = :input
            end
            if the_method[:output].gsub(/^.+:/, "") == the_attribute.value
              direction_key = :output
            end
            if direction_key
              parameters = {}
              the_message.children.each do |the_part|
                next unless the_part.is_a?(::Oga::XML::Element)
                if the_part.name == "part"
                  the_name = nil
                  the_type = nil
                  the_part.attributes.each do |the_parameter|
                    if the_parameter.name == "name"
                      the_name = the_parameter.value
                    end
                    if the_parameter.name == "type"
                      the_type = the_parameter.value
                    end
                    if the_parameter.name == "element"
                      the_type = the_parameter.value
                    end
                    if (the_name && the_type)
                      parameters[(the_name.to_sym)] = the_type
                      the_name = nil
                      the_type = nil
                    end
                  end
                end
              end
              if parameters.keys.size > 0
                record[(direction_key)] = parameters
              end
            end
          end
        end
        if record[:input] || record[:output]
          @interface << record
        end
      end
      #
    else
      raise Exception, "Failed to retrieve WSDL data."
    end
  else
    raise ArgumentError, "No WSDL endpoint detected (required)."
  end
  #
  self
end

Public Instance Methods

interface() click to toggle source
# File lib/gxg/net_clients.rb, line 2228
def interface()
  @interface
end
on_before_dispatch(the_document=nil) click to toggle source
# File lib/gxg/net_clients.rb, line 2218
def on_before_dispatch(the_document=nil)
  #
end
on_create_document(the_document=nil) click to toggle source

Handsoap support hooks:

# File lib/gxg/net_clients.rb, line 2212
def on_create_document(the_document=nil)
  if @tns_url
    the_document.alias('tns', @tns_url)
  end
end
on_response_document(the_document=nil) click to toggle source
# File lib/gxg/net_clients.rb, line 2222
def on_response_document(the_document=nil)
  if @tns_url
    the_document.add_namespace('ns', @tns_url)
  end
end