require 'sekken/wsdl/operation'
require 'sekken/wsdl/document_collection'
require 'sekken/xs/schema_collection'
require 'sekken/resolver'
require 'sekken/importer'
class Sekken
class WSDL
def initialize(wsdl, http)
@documents = WSDL::DocumentCollection.new
@schemas = XS::SchemaCollection.new
resolver = Resolver.new(http)
importer = Importer.new(resolver, @documents, @schemas)
importer.import(wsdl)
end
attr_reader :documents
attr_reader :schemas
def service_name
@documents.service_name
end
def services
@documents.services.values.inject({}) { |memo, service| memo.merge service.to_hash }
end
def operations(service_name, port_name)
verify_service_and_port_exist! service_name, port_name
port = @documents.service_port(service_name, port_name)
binding = port.fetch_binding(@documents)
binding.operations.keys
end
def operation(service_name, port_name, operation_name)
verify_operation_exists! service_name, port_name, operation_name
port = @documents.service_port(service_name, port_name)
endpoint = port.location
binding = port.fetch_binding(@documents)
binding_operation = binding.operations.fetch(operation_name)
port_type = binding.fetch_port_type(@documents)
port_type_operation = port_type.operations.fetch(operation_name)
Operation.new(operation_name, endpoint, binding_operation, port_type_operation, self)
end
private
def verify_operation_exists!(service_name, port_name, operation_name)
operations = operations(service_name, port_name)
unless operations.include? operation_name
raise ArgumentError, "Unknown operation #{operation_name.inspect} for " \
"service #{service_name.inspect} and port #{port_name.inspect}.\n" \
"You may want to try one of #{operations.inspect}."
end
end
def verify_service_and_port_exist!(service_name, port_name)
service = services[service_name]
port = service[:ports][port_name] if service
unless port
raise ArgumentError, "Unknown service #{service_name.inspect} or port #{port_name.inspect}.\n" \
"Here is a list of known services and port:\n" + services.inspect
end
end
end
end