mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
This commit was manufactured by cvs2svn to create branch 'ruby_1_8'.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8501 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7c95e34533
commit
15b7d43988
31 changed files with 2817 additions and 0 deletions
116
lib/soap/httpconfigloader.rb
Normal file
116
lib/soap/httpconfigloader.rb
Normal file
|
@ -0,0 +1,116 @@
|
|||
# SOAP4R - HTTP config loader.
|
||||
# Copyright (C) 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'soap/property'
|
||||
|
||||
|
||||
module SOAP
|
||||
|
||||
|
||||
module HTTPConfigLoader
|
||||
module_function
|
||||
|
||||
def set_options(client, options)
|
||||
client.proxy = options["proxy"]
|
||||
options.add_hook("proxy") do |key, value|
|
||||
client.proxy = value
|
||||
end
|
||||
client.no_proxy = options["no_proxy"]
|
||||
options.add_hook("no_proxy") do |key, value|
|
||||
client.no_proxy = value
|
||||
end
|
||||
if client.respond_to?(:protocol_version=)
|
||||
client.protocol_version = options["protocol_version"]
|
||||
options.add_hook("protocol_version") do |key, value|
|
||||
client.protocol_version = value
|
||||
end
|
||||
end
|
||||
ssl_config = options["ssl_config"] ||= ::SOAP::Property.new
|
||||
set_ssl_config(client, ssl_config)
|
||||
ssl_config.add_hook(true) do |key, value|
|
||||
set_ssl_config(client, ssl_config)
|
||||
end
|
||||
basic_auth = options["basic_auth"] ||= ::SOAP::Property.new
|
||||
set_basic_auth(client, basic_auth)
|
||||
basic_auth.add_hook do |key, value|
|
||||
set_basic_auth(client, basic_auth)
|
||||
end
|
||||
options.add_hook("connect_timeout") do |key, value|
|
||||
client.connect_timeout = value
|
||||
end
|
||||
options.add_hook("send_timeout") do |key, value|
|
||||
client.send_timeout = value
|
||||
end
|
||||
options.add_hook("receive_timeout") do |key, value|
|
||||
client.receive_timeout = value
|
||||
end
|
||||
end
|
||||
|
||||
def set_basic_auth(client, basic_auth)
|
||||
basic_auth.values.each do |url, userid, passwd|
|
||||
client.set_basic_auth(url, userid, passwd)
|
||||
end
|
||||
end
|
||||
|
||||
def set_ssl_config(client, ssl_config)
|
||||
ssl_config.each do |key, value|
|
||||
cfg = client.ssl_config
|
||||
case key
|
||||
when 'client_cert'
|
||||
cfg.client_cert = cert_from_file(value)
|
||||
when 'client_key'
|
||||
cfg.client_key = key_from_file(value)
|
||||
when 'client_ca'
|
||||
cfg.client_ca = value
|
||||
when 'ca_path'
|
||||
cfg.set_trust_ca(value)
|
||||
when 'ca_file'
|
||||
cfg.set_trust_ca(value)
|
||||
when 'crl'
|
||||
cfg.set_crl(value)
|
||||
when 'verify_mode'
|
||||
cfg.verify_mode = ssl_config_int(value)
|
||||
when 'verify_depth'
|
||||
cfg.verify_depth = ssl_config_int(value)
|
||||
when 'options'
|
||||
cfg.options = value
|
||||
when 'ciphers'
|
||||
cfg.ciphers = value
|
||||
when 'verify_callback'
|
||||
cfg.verify_callback = value
|
||||
when 'cert_store'
|
||||
cfg.cert_store = value
|
||||
else
|
||||
raise ArgumentError.new("unknown ssl_config property #{key}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def ssl_config_int(value)
|
||||
if value.nil? or value.to_s.empty?
|
||||
nil
|
||||
else
|
||||
begin
|
||||
Integer(value)
|
||||
rescue ArgumentError
|
||||
::SOAP::Property::Util.const_from_name(value.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def cert_from_file(filename)
|
||||
OpenSSL::X509::Certificate.new(File.open(filename) { |f| f.read })
|
||||
end
|
||||
|
||||
def key_from_file(filename)
|
||||
OpenSSL::PKey::RSA.new(File.open(filename) { |f| f.read })
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
176
lib/wsdl/soap/wsdl2ruby.rb
Normal file
176
lib/wsdl/soap/wsdl2ruby.rb
Normal file
|
@ -0,0 +1,176 @@
|
|||
# WSDL4R - WSDL to ruby mapping library.
|
||||
# Copyright (C) 2002-2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'logger'
|
||||
require 'xsd/qname'
|
||||
require 'wsdl/importer'
|
||||
require 'wsdl/soap/classDefCreator'
|
||||
require 'wsdl/soap/servantSkeltonCreator'
|
||||
require 'wsdl/soap/driverCreator'
|
||||
require 'wsdl/soap/clientSkeltonCreator'
|
||||
require 'wsdl/soap/standaloneServerStubCreator'
|
||||
require 'wsdl/soap/cgiStubCreator'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
class WSDL2Ruby
|
||||
attr_accessor :location
|
||||
attr_reader :opt
|
||||
attr_accessor :logger
|
||||
attr_accessor :basedir
|
||||
|
||||
def run
|
||||
unless @location
|
||||
raise RuntimeError, "WSDL location not given"
|
||||
end
|
||||
@wsdl = import(@location)
|
||||
@name = @wsdl.name ? @wsdl.name.name : 'default'
|
||||
create_file
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def initialize
|
||||
@location = nil
|
||||
@opt = {}
|
||||
@logger = Logger.new(STDERR)
|
||||
@basedir = nil
|
||||
@wsdl = nil
|
||||
@name = nil
|
||||
end
|
||||
|
||||
def create_file
|
||||
create_classdef if @opt.key?('classdef')
|
||||
create_servant_skelton(@opt['servant_skelton']) if @opt.key?('servant_skelton')
|
||||
create_cgi_stub(@opt['cgi_stub']) if @opt.key?('cgi_stub')
|
||||
create_standalone_server_stub(@opt['standalone_server_stub']) if @opt.key?('standalone_server_stub')
|
||||
create_driver(@opt['driver']) if @opt.key?('driver')
|
||||
create_client_skelton(@opt['client_skelton']) if @opt.key?('client_skelton')
|
||||
end
|
||||
|
||||
def create_classdef
|
||||
@logger.info { "Creating class definition." }
|
||||
@classdef_filename = @name + '.rb'
|
||||
check_file(@classdef_filename) or return
|
||||
write_file(@classdef_filename) do |f|
|
||||
f << WSDL::SOAP::ClassDefCreator.new(@wsdl).dump
|
||||
end
|
||||
end
|
||||
|
||||
def create_client_skelton(servicename)
|
||||
@logger.info { "Creating client skelton." }
|
||||
servicename ||= @wsdl.services[0].name.name
|
||||
@client_skelton_filename = servicename + 'Client.rb'
|
||||
check_file(@client_skelton_filename) or return
|
||||
write_file(@client_skelton_filename) do |f|
|
||||
f << shbang << "\n"
|
||||
f << "require '#{@driver_filename}'\n\n" if @driver_filename
|
||||
f << WSDL::SOAP::ClientSkeltonCreator.new(@wsdl).dump(
|
||||
create_name(servicename))
|
||||
end
|
||||
end
|
||||
|
||||
def create_servant_skelton(porttypename)
|
||||
@logger.info { "Creating servant skelton." }
|
||||
@servant_skelton_filename = (porttypename || @name + 'Servant') + '.rb'
|
||||
check_file(@servant_skelton_filename) or return
|
||||
write_file(@servant_skelton_filename) do |f|
|
||||
f << "require '#{@classdef_filename}'\n\n" if @classdef_filename
|
||||
f << WSDL::SOAP::ServantSkeltonCreator.new(@wsdl).dump(
|
||||
create_name(porttypename))
|
||||
end
|
||||
end
|
||||
|
||||
def create_cgi_stub(servicename)
|
||||
@logger.info { "Creating CGI stub." }
|
||||
servicename ||= @wsdl.services[0].name.name
|
||||
@cgi_stubFilename = servicename + '.cgi'
|
||||
check_file(@cgi_stubFilename) or return
|
||||
write_file(@cgi_stubFilename) do |f|
|
||||
f << shbang << "\n"
|
||||
if @servant_skelton_filename
|
||||
f << "require '#{@servant_skelton_filename}'\n\n"
|
||||
end
|
||||
f << WSDL::SOAP::CGIStubCreator.new(@wsdl).dump(create_name(servicename))
|
||||
end
|
||||
end
|
||||
|
||||
def create_standalone_server_stub(servicename)
|
||||
@logger.info { "Creating standalone stub." }
|
||||
servicename ||= @wsdl.services[0].name.name
|
||||
@standalone_server_stub_filename = servicename + '.rb'
|
||||
check_file(@standalone_server_stub_filename) or return
|
||||
write_file(@standalone_server_stub_filename) do |f|
|
||||
f << shbang << "\n"
|
||||
f << "require '#{@servant_skelton_filename}'\n\n" if @servant_skelton_filename
|
||||
f << WSDL::SOAP::StandaloneServerStubCreator.new(@wsdl).dump(
|
||||
create_name(servicename))
|
||||
end
|
||||
end
|
||||
|
||||
def create_driver(porttypename)
|
||||
@logger.info { "Creating driver." }
|
||||
@driver_filename = (porttypename || @name) + 'Driver.rb'
|
||||
check_file(@driver_filename) or return
|
||||
write_file(@driver_filename) do |f|
|
||||
f << "require '#{@classdef_filename}'\n\n" if @classdef_filename
|
||||
f << WSDL::SOAP::DriverCreator.new(@wsdl).dump(
|
||||
create_name(porttypename))
|
||||
end
|
||||
end
|
||||
|
||||
def write_file(filename)
|
||||
if @basedir
|
||||
filename = File.join(basedir, filename)
|
||||
end
|
||||
File.open(filename, "w") do |f|
|
||||
yield f
|
||||
end
|
||||
end
|
||||
|
||||
def check_file(filename)
|
||||
if @basedir
|
||||
filename = File.join(basedir, filename)
|
||||
end
|
||||
if FileTest.exist?(filename)
|
||||
if @opt.key?('force')
|
||||
@logger.warn {
|
||||
"File '#{filename}' exists but overrides it."
|
||||
}
|
||||
true
|
||||
else
|
||||
@logger.warn {
|
||||
"File '#{filename}' exists. #{$0} did not override it."
|
||||
}
|
||||
false
|
||||
end
|
||||
else
|
||||
@logger.info { "Creates file '#{filename}'." }
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
def shbang
|
||||
"#!/usr/bin/env ruby"
|
||||
end
|
||||
|
||||
def create_name(name)
|
||||
name ? XSD::QName.new(@wsdl.targetnamespace, name) : nil
|
||||
end
|
||||
|
||||
def import(location)
|
||||
WSDL::Importer.import(location)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
34
lib/wsdl/xmlSchema/annotation.rb
Normal file
34
lib/wsdl/xmlSchema/annotation.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
# WSDL4R - WSDL SOAP documentation element.
|
||||
# Copyright (C) 2003, 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class Annotation < Info
|
||||
def initialize
|
||||
super
|
||||
end
|
||||
|
||||
def parse_element(element)
|
||||
# Accepts any element.
|
||||
self
|
||||
end
|
||||
|
||||
def parse_attr(attr, value)
|
||||
# Accepts any attribute.
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
81
lib/wsdl/xmlSchema/importer.rb
Normal file
81
lib/wsdl/xmlSchema/importer.rb
Normal file
|
@ -0,0 +1,81 @@
|
|||
# WSDL4R - XSD importer library.
|
||||
# Copyright (C) 2003, 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'soap/httpconfigloader'
|
||||
require 'wsdl/xmlSchema/parser'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class Importer
|
||||
def self.import(location, originalroot = nil)
|
||||
new.import(location, originalroot)
|
||||
end
|
||||
|
||||
def initialize
|
||||
@web_client = nil
|
||||
end
|
||||
|
||||
def import(location, originalroot = nil)
|
||||
unless location.is_a?(URI)
|
||||
location = URI.parse(location)
|
||||
end
|
||||
content = parse(fetch(location), location, originalroot)
|
||||
content.location = location
|
||||
content
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def parse(content, location, originalroot)
|
||||
opt = {
|
||||
:location => location,
|
||||
:originalroot => originalroot
|
||||
}
|
||||
WSDL::XMLSchema::Parser.new(opt).parse(content)
|
||||
end
|
||||
|
||||
def fetch(location)
|
||||
warn("importing: #{location}") if $DEBUG
|
||||
content = nil
|
||||
if location.scheme == 'file' or
|
||||
(location.relative? and FileTest.exist?(location.path))
|
||||
content = File.open(location.path).read
|
||||
else
|
||||
client = web_client.new(nil, "WSDL4R")
|
||||
client.proxy = ::SOAP::Env::HTTP_PROXY
|
||||
client.no_proxy = ::SOAP::Env::NO_PROXY
|
||||
if opt = ::SOAP::Property.loadproperty(::SOAP::PropertyName)
|
||||
::SOAP::HTTPConfigLoader.set_options(client, opt["client.protocol.http"])
|
||||
end
|
||||
content = client.get_content(location)
|
||||
end
|
||||
content
|
||||
end
|
||||
|
||||
def web_client
|
||||
@web_client ||= begin
|
||||
require 'http-access2'
|
||||
if HTTPAccess2::VERSION < "2.0"
|
||||
raise LoadError.new("http-access/2.0 or later is required.")
|
||||
end
|
||||
HTTPAccess2::Client
|
||||
rescue LoadError
|
||||
warn("Loading http-access2 failed. Net/http is used.") if $DEBUG
|
||||
require 'soap/netHttpClient'
|
||||
::SOAP::NetHttpClient
|
||||
end
|
||||
@web_client
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
54
lib/wsdl/xmlSchema/include.rb
Normal file
54
lib/wsdl/xmlSchema/include.rb
Normal file
|
@ -0,0 +1,54 @@
|
|||
# WSDL4R - XMLSchema include definition.
|
||||
# Copyright (C) 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'wsdl/xmlSchema/importer'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class Include < Info
|
||||
attr_reader :schemalocation
|
||||
attr_reader :content
|
||||
|
||||
def initialize
|
||||
super
|
||||
@schemalocation = nil
|
||||
@content = nil
|
||||
end
|
||||
|
||||
def parse_element(element)
|
||||
nil
|
||||
end
|
||||
|
||||
def parse_attr(attr, value)
|
||||
case attr
|
||||
when SchemaLocationAttrName
|
||||
@schemalocation = URI.parse(value.source)
|
||||
if @schemalocation.relative?
|
||||
@schemalocation = parent.location + @schemalocation
|
||||
end
|
||||
@content = import(@schemalocation)
|
||||
@schemalocation
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def import(location)
|
||||
Importer.import(location)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
35
lib/wsdl/xmlSchema/length.rb
Normal file
35
lib/wsdl/xmlSchema/length.rb
Normal file
|
@ -0,0 +1,35 @@
|
|||
# WSDL4R - XMLSchema length definition for WSDL.
|
||||
# Copyright (C) 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class Length < Info
|
||||
def initialize
|
||||
super
|
||||
end
|
||||
|
||||
def parse_element(element)
|
||||
nil
|
||||
end
|
||||
|
||||
def parse_attr(attr, value)
|
||||
case attr
|
||||
when ValueAttrName
|
||||
value.source
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
36
lib/wsdl/xmlSchema/pattern.rb
Normal file
36
lib/wsdl/xmlSchema/pattern.rb
Normal file
|
@ -0,0 +1,36 @@
|
|||
# WSDL4R - XMLSchema pattern definition for WSDL.
|
||||
# Copyright (C) 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class Pattern < Info
|
||||
def initialize
|
||||
super
|
||||
end
|
||||
|
||||
def parse_element(element)
|
||||
nil
|
||||
end
|
||||
|
||||
def parse_attr(attr, value)
|
||||
case attr
|
||||
when ValueAttrName
|
||||
parent.pattern = /\A#{value.source}\z/n
|
||||
value.source
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
54
lib/wsdl/xmlSchema/simpleExtension.rb
Normal file
54
lib/wsdl/xmlSchema/simpleExtension.rb
Normal file
|
@ -0,0 +1,54 @@
|
|||
# WSDL4R - XMLSchema simpleType extension definition for WSDL.
|
||||
# Copyright (C) 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'xsd/namedelements'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class SimpleExtension < Info
|
||||
attr_reader :base
|
||||
attr_reader :attributes
|
||||
|
||||
def initialize
|
||||
super
|
||||
@base = nil
|
||||
@attributes = XSD::NamedElements.new
|
||||
end
|
||||
|
||||
def targetnamespace
|
||||
parent.targetnamespace
|
||||
end
|
||||
|
||||
def valid?(value)
|
||||
true
|
||||
end
|
||||
|
||||
def parse_element(element)
|
||||
case element
|
||||
when AttributeName
|
||||
o = Attribute.new
|
||||
@attributes << o
|
||||
o
|
||||
end
|
||||
end
|
||||
|
||||
def parse_attr(attr, value)
|
||||
case attr
|
||||
when BaseAttrName
|
||||
@base = value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
107
lib/wsdl/xmlSchema/xsd2ruby.rb
Normal file
107
lib/wsdl/xmlSchema/xsd2ruby.rb
Normal file
|
@ -0,0 +1,107 @@
|
|||
# XSD4R - XSD to ruby mapping library.
|
||||
# Copyright (C) 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'xsd/codegen/gensupport'
|
||||
require 'wsdl/xmlSchema/importer'
|
||||
require 'wsdl/soap/classDefCreator'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class XSD2Ruby
|
||||
attr_accessor :location
|
||||
attr_reader :opt
|
||||
attr_accessor :logger
|
||||
attr_accessor :basedir
|
||||
|
||||
def run
|
||||
unless @location
|
||||
raise RuntimeError, "XML Schema location not given"
|
||||
end
|
||||
@xsd = import(@location)
|
||||
@name = create_classname(@xsd)
|
||||
create_file
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def initialize
|
||||
@location = nil
|
||||
@opt = {}
|
||||
@logger = Logger.new(STDERR)
|
||||
@basedir = nil
|
||||
@xsd = nil
|
||||
@name = nil
|
||||
end
|
||||
|
||||
def create_file
|
||||
create_classdef
|
||||
end
|
||||
|
||||
def create_classdef
|
||||
@logger.info { "Creating class definition." }
|
||||
@classdef_filename = @name + '.rb'
|
||||
check_file(@classdef_filename) or return
|
||||
write_file(@classdef_filename) do |f|
|
||||
f << WSDL::SOAP::ClassDefCreator.new(@xsd).dump
|
||||
end
|
||||
end
|
||||
|
||||
def write_file(filename)
|
||||
if @basedir
|
||||
filename = File.join(basedir, filename)
|
||||
end
|
||||
File.open(filename, "w") do |f|
|
||||
yield f
|
||||
end
|
||||
end
|
||||
|
||||
def check_file(filename)
|
||||
if @basedir
|
||||
filename = File.join(basedir, filename)
|
||||
end
|
||||
if FileTest.exist?(filename)
|
||||
if @opt.key?('force')
|
||||
@logger.warn {
|
||||
"File '#{filename}' exists but overrides it."
|
||||
}
|
||||
true
|
||||
else
|
||||
@logger.warn {
|
||||
"File '#{filename}' exists. #{$0} did not override it."
|
||||
}
|
||||
false
|
||||
end
|
||||
else
|
||||
@logger.info { "Creates file '#{filename}'." }
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
def create_classname(xsd)
|
||||
name = nil
|
||||
if xsd.targetnamespace
|
||||
name = xsd.targetnamespace.scan(/[a-zA-Z0-9]+$/)[0]
|
||||
end
|
||||
if name.nil?
|
||||
'default'
|
||||
else
|
||||
XSD::CodeGen::GenSupport.safevarname(name)
|
||||
end
|
||||
end
|
||||
|
||||
def import(location)
|
||||
WSDL::XMLSchema::Importer.import(location)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
42
lib/xsd/mapping.rb
Normal file
42
lib/xsd/mapping.rb
Normal file
|
@ -0,0 +1,42 @@
|
|||
# XSD4R - XML Mapping for Ruby
|
||||
# Copyright (C) 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require "soap/parser"
|
||||
require 'soap/encodingstyle/literalHandler'
|
||||
require "soap/generator"
|
||||
require "soap/mapping"
|
||||
require "soap/mapping/wsdlliteralregistry"
|
||||
|
||||
|
||||
module XSD
|
||||
|
||||
|
||||
module Mapping
|
||||
MappingRegistry = SOAP::Mapping::WSDLLiteralRegistry.new
|
||||
MappingOpt = {:default_encodingstyle => SOAP::LiteralNamespace}
|
||||
|
||||
def self.obj2xml(obj, elename = nil, io = nil)
|
||||
if !elename.nil? and !elename.is_a?(XSD::QName)
|
||||
elename = XSD::QName.new(nil, elename)
|
||||
end
|
||||
elename ||= XSD::QName.new(nil, SOAP::Mapping.name2elename(obj.class.to_s))
|
||||
soap = SOAP::Mapping.obj2soap(obj, MappingRegistry)
|
||||
soap.elename = elename
|
||||
generator = SOAP::SOAPGenerator.new(MappingOpt)
|
||||
generator.generate(soap, io)
|
||||
end
|
||||
|
||||
def self.xml2obj(stream)
|
||||
parser = SOAP::Parser.new(MappingOpt)
|
||||
soap = parser.parse(stream)
|
||||
SOAP::Mapping.soap2obj(soap, MappingRegistry)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
58
test/soap/fault/test_customfault.rb
Normal file
58
test/soap/fault/test_customfault.rb
Normal file
|
@ -0,0 +1,58 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/driver'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
|
||||
|
||||
module SOAP
|
||||
module Fault
|
||||
|
||||
|
||||
class TestCustomFault < Test::Unit::TestCase
|
||||
Port = 17171
|
||||
|
||||
class CustomFaultServer < SOAP::RPC::StandaloneServer
|
||||
def on_init
|
||||
add_method(self, 'fault', 'msg')
|
||||
end
|
||||
|
||||
def fault(msg)
|
||||
SOAPFault.new(SOAPString.new("mycustom"),
|
||||
SOAPString.new("error: #{msg}"),
|
||||
SOAPString.new(self.class.name))
|
||||
end
|
||||
end
|
||||
|
||||
def setup
|
||||
@server = CustomFaultServer.new('customfault', 'urn:customfault', '0.0.0.0', Port)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
@server.start
|
||||
}
|
||||
@endpoint = "http://localhost:#{Port}/"
|
||||
@client = SOAP::RPC::Driver.new(@endpoint, 'urn:customfault')
|
||||
@client.wiredump_dev = STDERR if $DEBUG
|
||||
@client.add_method("fault", "msg")
|
||||
end
|
||||
|
||||
def teardown
|
||||
@server.shutdown
|
||||
@t.kill
|
||||
@t.join
|
||||
@client.reset_stream
|
||||
end
|
||||
|
||||
def test_custom_fault
|
||||
begin
|
||||
@client.fault("message")
|
||||
assert(false, 'exception not raised')
|
||||
rescue SOAP::FaultError => e
|
||||
assert(true, 'exception raised')
|
||||
assert_equal('error: message', e.message)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
59
test/soap/test_mapping.rb
Normal file
59
test/soap/test_mapping.rb
Normal file
|
@ -0,0 +1,59 @@
|
|||
require 'test/unit'
|
||||
require 'soap/mapping'
|
||||
|
||||
|
||||
module SOAP
|
||||
|
||||
|
||||
class TestMapping < Test::Unit::TestCase
|
||||
def test_date
|
||||
targets = [
|
||||
["2002-12-31",
|
||||
"2002-12-31Z"],
|
||||
["2002-12-31+00:00",
|
||||
"2002-12-31Z"],
|
||||
["2002-12-31-00:00",
|
||||
"2002-12-31Z"],
|
||||
["-2002-12-31",
|
||||
"-2002-12-31Z"],
|
||||
["-2002-12-31+00:00",
|
||||
"-2002-12-31Z"],
|
||||
["-2002-12-31-00:00",
|
||||
"-2002-12-31Z"],
|
||||
]
|
||||
targets.each do |str, expectec|
|
||||
d = Date.parse(str)
|
||||
assert_equal(d.class, convert(d).class)
|
||||
assert_equal(d, convert(d))
|
||||
end
|
||||
end
|
||||
|
||||
def test_datetime
|
||||
targets = [
|
||||
["2002-12-31T23:59:59.00",
|
||||
"2002-12-31T23:59:59Z"],
|
||||
["2002-12-31T23:59:59+00:00",
|
||||
"2002-12-31T23:59:59Z"],
|
||||
["2002-12-31T23:59:59-00:00",
|
||||
"2002-12-31T23:59:59Z"],
|
||||
["-2002-12-31T23:59:59.00",
|
||||
"-2002-12-31T23:59:59Z"],
|
||||
["-2002-12-31T23:59:59+00:00",
|
||||
"-2002-12-31T23:59:59Z"],
|
||||
["-2002-12-31T23:59:59-00:00",
|
||||
"-2002-12-31T23:59:59Z"],
|
||||
]
|
||||
targets.each do |str, expectec|
|
||||
d = DateTime.parse(str)
|
||||
assert_equal(d.class, convert(d).class)
|
||||
assert_equal(d, convert(d))
|
||||
end
|
||||
end
|
||||
|
||||
def convert(obj)
|
||||
SOAP::Mapping.soap2obj(SOAP::Mapping.obj2soap(obj))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
333
test/soap/test_styleuse.rb
Normal file
333
test/soap/test_styleuse.rb
Normal file
|
@ -0,0 +1,333 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/httpserver'
|
||||
require 'soap/rpc/driver'
|
||||
|
||||
|
||||
module SOAP
|
||||
|
||||
|
||||
class TestStyleUse < Test::Unit::TestCase
|
||||
# rpc driver: obj in(Hash allowed for literal), obj out
|
||||
#
|
||||
# style: not visible from user
|
||||
# rpc: wrapped element
|
||||
# document: unwrappted element
|
||||
#
|
||||
# use:
|
||||
# encoding: a graph (SOAP Data Model)
|
||||
# literal: not a graph (SOAPElement)
|
||||
#
|
||||
# rpc stub: obj in, obj out(Hash is allowed for literal)
|
||||
#
|
||||
# style: not visible from user
|
||||
# rpc: wrapped element
|
||||
# document: unwrappted element
|
||||
#
|
||||
# use:
|
||||
# encoding: a graph (SOAP Data Model)
|
||||
# literal: not a graph (SOAPElement)
|
||||
#
|
||||
# document driver: SOAPElement in, SOAPElement out? [not implemented]
|
||||
#
|
||||
# style: ditto
|
||||
# use: ditto
|
||||
#
|
||||
#
|
||||
# document stub: SOAPElement in, SOAPElement out? [not implemented]
|
||||
#
|
||||
# style: ditto
|
||||
# use: ditto
|
||||
#
|
||||
class GenericServant
|
||||
# method name style: requeststyle_requestuse_responsestyle_responseuse
|
||||
|
||||
# 2 params -> array
|
||||
def rpc_enc_rpc_enc(obj1, obj2)
|
||||
[obj1, [obj1, obj2]]
|
||||
end
|
||||
|
||||
# 2 objs -> array
|
||||
def rpc_lit_rpc_enc(obj1, obj2)
|
||||
[obj2, obj1]
|
||||
end
|
||||
|
||||
# 2 params -> 2 params
|
||||
def rpc_enc_rpc_lit(obj1, obj2)
|
||||
klass = [obj1.class.name, obj2.class.name]
|
||||
[obj2, obj1]
|
||||
end
|
||||
|
||||
# 2 objs -> 2 objs
|
||||
def rpc_lit_rpc_lit(obj1, obj2)
|
||||
[obj1, obj2]
|
||||
end
|
||||
|
||||
# 2 params -> array
|
||||
def doc_enc_doc_enc(obj1, obj2)
|
||||
[obj1, [obj1, obj2]]
|
||||
end
|
||||
|
||||
# 2 objs -> array
|
||||
def doc_lit_doc_enc(obj1, obj2)
|
||||
[obj2, obj1]
|
||||
end
|
||||
|
||||
# 2 params -> 2 hashes
|
||||
def doc_enc_doc_lit(obj1, obj2)
|
||||
klass = [obj1.class.name, obj2.class.name]
|
||||
return {'obj1' => {'klass' => klass}, 'misc' => 'hash does not have an order'},
|
||||
{'obj2' => {'klass' => klass}}
|
||||
end
|
||||
|
||||
# 2 objs -> 2 objs
|
||||
def doc_lit_doc_lit(obj1, obj2)
|
||||
return obj1, obj2
|
||||
end
|
||||
end
|
||||
|
||||
Namespace = "urn:styleuse"
|
||||
|
||||
module Op
|
||||
def self.opt(request_style, request_use, response_style, response_use)
|
||||
{
|
||||
:request_style => request_style,
|
||||
:request_use => request_use,
|
||||
:response_style => response_style,
|
||||
:response_use => response_use
|
||||
}
|
||||
end
|
||||
|
||||
Op_rpc_enc_rpc_enc = [
|
||||
XSD::QName.new(Namespace, 'rpc_enc_rpc_enc'),
|
||||
nil,
|
||||
'rpc_enc_rpc_enc', [
|
||||
['in', 'obj1', nil],
|
||||
['in', 'obj2', nil],
|
||||
['retval', 'return', nil]],
|
||||
opt(:rpc, :encoded, :rpc, :encoded)
|
||||
]
|
||||
|
||||
Op_rpc_lit_rpc_enc = [
|
||||
XSD::QName.new(Namespace, 'rpc_lit_rpc_enc'),
|
||||
nil,
|
||||
'rpc_lit_rpc_enc', [
|
||||
['in', 'obj1', nil],
|
||||
['in', 'obj2', nil],
|
||||
['retval', 'return', nil]],
|
||||
opt(:rpc, :literal, :rpc, :encoded)
|
||||
]
|
||||
|
||||
Op_rpc_enc_rpc_lit = [
|
||||
XSD::QName.new(Namespace, 'rpc_enc_rpc_lit'),
|
||||
nil,
|
||||
'rpc_enc_rpc_lit', [
|
||||
['in', 'obj1', nil],
|
||||
['in', 'obj2', nil],
|
||||
['retval', 'ret1', nil],
|
||||
['out', 'ret2', nil]],
|
||||
opt(:rpc, :encoded, :rpc, :literal)
|
||||
]
|
||||
|
||||
Op_rpc_lit_rpc_lit = [
|
||||
XSD::QName.new(Namespace, 'rpc_lit_rpc_lit'),
|
||||
nil,
|
||||
'rpc_lit_rpc_lit', [
|
||||
['in', 'obj1', nil],
|
||||
['in', 'obj2', nil],
|
||||
['retval', 'ret1', nil],
|
||||
['out', 'ret2', nil]],
|
||||
opt(:rpc, :literal, :rpc, :literal)
|
||||
]
|
||||
|
||||
Op_doc_enc_doc_enc = [
|
||||
Namespace + 'doc_enc_doc_enc',
|
||||
'doc_enc_doc_enc', [
|
||||
['in', 'obj1', [nil, Namespace, 'obj1']],
|
||||
['in', 'obj2', [nil, Namespace, 'obj2']],
|
||||
['out', 'ret1', [nil, Namespace, 'ret1']],
|
||||
['out', 'ret2', [nil, Namespace, 'ret2']]],
|
||||
opt(:document, :encoded, :document, :encoded)
|
||||
]
|
||||
|
||||
Op_doc_lit_doc_enc = [
|
||||
Namespace + 'doc_lit_doc_enc',
|
||||
'doc_lit_doc_enc', [
|
||||
['in', 'obj1', [nil, Namespace, 'obj1']],
|
||||
['in', 'obj2', [nil, Namespace, 'obj2']],
|
||||
['out', 'ret1', [nil, Namespace, 'ret1']],
|
||||
['out', 'ret2', [nil, Namespace, 'ret2']]],
|
||||
opt(:document, :literal, :document, :encoded)
|
||||
]
|
||||
|
||||
Op_doc_enc_doc_lit = [
|
||||
Namespace + 'doc_enc_doc_lit',
|
||||
'doc_enc_doc_lit', [
|
||||
['in', 'obj1', [nil, Namespace, 'obj1']],
|
||||
['in', 'obj2', [nil, Namespace, 'obj2']],
|
||||
['out', 'ret1', [nil, Namespace, 'ret1']],
|
||||
['out', 'ret2', [nil, Namespace, 'ret2']]],
|
||||
opt(:document, :encoded, :document, :literal)
|
||||
]
|
||||
|
||||
Op_doc_lit_doc_lit = [
|
||||
Namespace + 'doc_lit_doc_lit',
|
||||
'doc_lit_doc_lit', [
|
||||
['in', 'obj1', [nil, Namespace, 'obj1']],
|
||||
['in', 'obj2', [nil, Namespace, 'obj2']],
|
||||
['out', 'ret1', [nil, Namespace, 'ret1']],
|
||||
['out', 'ret2', [nil, Namespace, 'ret2']]],
|
||||
opt(:document, :literal, :document, :literal)
|
||||
]
|
||||
end
|
||||
|
||||
include Op
|
||||
|
||||
class Server < ::SOAP::RPC::HTTPServer
|
||||
include Op
|
||||
|
||||
def on_init
|
||||
@servant = GenericServant.new
|
||||
add_rpc_operation(@servant, *Op_rpc_enc_rpc_enc)
|
||||
add_rpc_operation(@servant, *Op_rpc_lit_rpc_enc)
|
||||
add_rpc_operation(@servant, *Op_rpc_enc_rpc_lit)
|
||||
add_rpc_operation(@servant, *Op_rpc_lit_rpc_lit)
|
||||
add_document_operation(@servant, *Op_doc_enc_doc_enc)
|
||||
add_document_operation(@servant, *Op_doc_lit_doc_enc)
|
||||
add_document_operation(@servant, *Op_doc_enc_doc_lit)
|
||||
add_document_operation(@servant, *Op_doc_lit_doc_lit)
|
||||
end
|
||||
end
|
||||
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
setup_client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new(
|
||||
:BindAddress => "0.0.0.0",
|
||||
:Port => Port,
|
||||
:AccessLog => [],
|
||||
:SOAPDefaultNamespace => Namespace
|
||||
)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def setup_client
|
||||
@client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/", Namespace)
|
||||
@client.wiredump_dev = STDERR if $DEBUG
|
||||
@client.add_rpc_operation(*Op_rpc_enc_rpc_enc)
|
||||
@client.add_rpc_operation(*Op_rpc_lit_rpc_enc)
|
||||
@client.add_rpc_operation(*Op_rpc_enc_rpc_lit)
|
||||
@client.add_rpc_operation(*Op_rpc_lit_rpc_lit)
|
||||
@client.add_document_operation(*Op_doc_enc_doc_enc)
|
||||
@client.add_document_operation(*Op_doc_lit_doc_enc)
|
||||
@client.add_document_operation(*Op_doc_enc_doc_lit)
|
||||
@client.add_document_operation(*Op_doc_lit_doc_lit)
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
teardown_client
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def teardown_client
|
||||
@client.reset_stream
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
t
|
||||
end
|
||||
|
||||
def test_rpc_enc_rpc_enc
|
||||
o = "hello"
|
||||
obj1 = o
|
||||
obj2 = [1]
|
||||
ret = @client.rpc_enc_rpc_enc(obj1, obj2)
|
||||
# server returns [obj1, [obj1, obj2]]
|
||||
assert_equal([obj1, [obj1, obj2]], ret)
|
||||
assert_same(ret[0], ret[1][0])
|
||||
end
|
||||
|
||||
S1 = ::Struct.new(:a)
|
||||
S2 = ::Struct.new(:c)
|
||||
def test_rpc_lit_rpc_enc
|
||||
ret1, ret2 = @client.rpc_lit_rpc_enc(S1.new('b'), S2.new('d'))
|
||||
assert_equal('d', ret1.c)
|
||||
assert_equal('b', ret2.a)
|
||||
# Hash is allowed for literal
|
||||
ret1, ret2 = @client.rpc_lit_rpc_enc({'a' => 'b'}, {'c' => 'd'})
|
||||
assert_equal('d', ret1.c)
|
||||
assert_equal('b', ret2.a)
|
||||
# simple value
|
||||
assert_equal(
|
||||
['1', 'a'],
|
||||
@client.rpc_lit_rpc_enc('a', 1)
|
||||
)
|
||||
end
|
||||
|
||||
def test_rpc_enc_rpc_lit
|
||||
assert_equal(
|
||||
['1', 'a'],
|
||||
@client.rpc_enc_rpc_lit('a', '1')
|
||||
)
|
||||
end
|
||||
|
||||
def test_rpc_lit_rpc_lit
|
||||
ret1, ret2 = @client.rpc_lit_rpc_lit({'a' => 'b'}, {'c' => 'd'})
|
||||
assert_equal('b', ret1["a"])
|
||||
assert_equal('d', ret2["c"])
|
||||
end
|
||||
|
||||
def test_doc_enc_doc_enc
|
||||
o = "hello"
|
||||
obj1 = o
|
||||
obj2 = [1]
|
||||
ret = @client.rpc_enc_rpc_enc(obj1, obj2)
|
||||
# server returns [obj1, [obj1, obj2]]
|
||||
assert_equal([obj1, [obj1, obj2]], ret)
|
||||
assert_same(ret[0], ret[1][0])
|
||||
end
|
||||
|
||||
def test_doc_lit_doc_enc
|
||||
ret1, ret2 = @client.doc_lit_doc_enc({'a' => 'b'}, {'c' => 'd'})
|
||||
assert_equal('d', ret1.c)
|
||||
assert_equal('b', ret2.a)
|
||||
assert_equal(
|
||||
['a', '1'],
|
||||
@client.doc_lit_doc_enc(1, 'a')
|
||||
)
|
||||
end
|
||||
|
||||
def test_doc_enc_doc_lit
|
||||
ret1, ret2 = @client.doc_enc_doc_lit('a', 1)
|
||||
# literal Array
|
||||
assert_equal(['String', 'Fixnum'], ret1['obj1']['klass'])
|
||||
# same value
|
||||
assert_equal(ret1['obj1']['klass'], ret2['obj2']['klass'])
|
||||
# not the same object (not encoded)
|
||||
assert_not_same(ret1['obj1']['klass'], ret2['obj2']['klass'])
|
||||
end
|
||||
|
||||
def test_doc_lit_doc_lit
|
||||
ret1, ret2 = @client.doc_lit_doc_lit({'a' => 'b'}, {'c' => 'd'})
|
||||
assert_equal('b', ret1["a"])
|
||||
assert_equal('d', ret2["c"])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
126
test/soap/wsdlDriver/calc.wsdl
Normal file
126
test/soap/wsdlDriver/calc.wsdl
Normal file
|
@ -0,0 +1,126 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!--generated by GLUE Standard 4.0.1 on Wed Mar 09 10:20:07 GMT-08:00
|
||||
2005-->
|
||||
<wsdl:definitions name='Calculator'
|
||||
targetNamespace='http://www.themindelectric.com/wsdl/Calculator/'
|
||||
xmlns:tns='http://www.themindelectric.com/wsdl/Calculator/'
|
||||
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
|
||||
xmlns:http='http://schemas.xmlsoap.org/wsdl/http/'
|
||||
xmlns:mime='http://schemas.xmlsoap.org/wsdl/mime/'
|
||||
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
|
||||
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
|
||||
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
|
||||
xmlns:tme='http://www.themindelectric.com/'>
|
||||
<wsdl:message name='add0In'>
|
||||
<wsdl:part name='x' type='xsd:float'/>
|
||||
<wsdl:part name='y' type='xsd:float'/>
|
||||
</wsdl:message>
|
||||
<wsdl:message name='add0Out'>
|
||||
<wsdl:part name='Result' type='xsd:float'/>
|
||||
</wsdl:message>
|
||||
<wsdl:message name='divide1In'>
|
||||
<wsdl:part name='numerator' type='xsd:float'/>
|
||||
<wsdl:part name='denominator' type='xsd:float'/>
|
||||
</wsdl:message>
|
||||
<wsdl:message name='divide1Out'>
|
||||
<wsdl:part name='Result' type='xsd:float'/>
|
||||
</wsdl:message>
|
||||
<wsdl:message name='multiply2In'>
|
||||
<wsdl:part name='x' type='xsd:float'/>
|
||||
<wsdl:part name='y' type='xsd:float'/>
|
||||
</wsdl:message>
|
||||
<wsdl:message name='multiply2Out'>
|
||||
<wsdl:part name='Result' type='xsd:float'/>
|
||||
</wsdl:message>
|
||||
<wsdl:message name='subtract3In'>
|
||||
<wsdl:part name='x' type='xsd:float'/>
|
||||
<wsdl:part name='y' type='xsd:float'/>
|
||||
</wsdl:message>
|
||||
<wsdl:message name='subtract3Out'>
|
||||
<wsdl:part name='Result' type='xsd:float'/>
|
||||
</wsdl:message>
|
||||
<wsdl:portType name='ICalculator'>
|
||||
<wsdl:operation name='add' parameterOrder='x y'>
|
||||
<wsdl:input name='add0In' message='tns:add0In'/>
|
||||
<wsdl:output name='add0Out' message='tns:add0Out'/>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name='divide' parameterOrder='numerator
|
||||
denominator'>
|
||||
<wsdl:input name='divide1In' message='tns:divide1In'/>
|
||||
<wsdl:output name='divide1Out' message='tns:divide1Out'/>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name='multiply' parameterOrder='x y'>
|
||||
<wsdl:input name='multiply2In' message='tns:multiply2In'/>
|
||||
<wsdl:output name='multiply2Out'
|
||||
message='tns:multiply2Out'/>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name='subtract' parameterOrder='x y'>
|
||||
<wsdl:input name='subtract3In' message='tns:subtract3In'/>
|
||||
<wsdl:output name='subtract3Out'
|
||||
message='tns:subtract3Out'/>
|
||||
</wsdl:operation>
|
||||
</wsdl:portType>
|
||||
<wsdl:binding name='ICalculator' type='tns:ICalculator'>
|
||||
<soap:binding style='rpc'
|
||||
transport='http://schemas.xmlsoap.org/soap/http'/>
|
||||
<wsdl:operation name='add'>
|
||||
<soap:operation soapAction='add' style='rpc'/>
|
||||
<wsdl:input name='add0In'>
|
||||
<soap:body use='encoded'
|
||||
namespace='http://www.fred.com'
|
||||
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
|
||||
</wsdl:input>
|
||||
<wsdl:output name='add0Out'>
|
||||
<soap:body use='encoded'
|
||||
namespace='http://www.fred.com'
|
||||
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name='divide'>
|
||||
<soap:operation soapAction='divide' style='rpc'/>
|
||||
<wsdl:input name='divide1In'>
|
||||
<soap:body use='encoded'
|
||||
namespace='http://www.fred.com'
|
||||
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
|
||||
</wsdl:input>
|
||||
<wsdl:output name='divide1Out'>
|
||||
<soap:body use='encoded'
|
||||
namespace='http://www.fred.com'
|
||||
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name='multiply'>
|
||||
<soap:operation soapAction='multiply' style='rpc'/>
|
||||
<wsdl:input name='multiply2In'>
|
||||
<soap:body use='encoded'
|
||||
namespace='http://www.fred.com'
|
||||
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
|
||||
</wsdl:input>
|
||||
<wsdl:output name='multiply2Out'>
|
||||
<soap:body use='encoded'
|
||||
namespace='http://www.fred.com'
|
||||
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
<wsdl:operation name='subtract'>
|
||||
<soap:operation soapAction='subtract' style='rpc'/>
|
||||
<wsdl:input name='subtract3In'>
|
||||
<soap:body use='encoded'
|
||||
namespace='http://www.fred.com'
|
||||
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
|
||||
</wsdl:input>
|
||||
<wsdl:output name='subtract3Out'>
|
||||
<soap:body use='encoded'
|
||||
namespace='http://www.fred.com'
|
||||
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
|
||||
</wsdl:output>
|
||||
</wsdl:operation>
|
||||
</wsdl:binding>
|
||||
<wsdl:service name='Calculator'>
|
||||
<wsdl:documentation>calculator service</wsdl:documentation>
|
||||
<wsdl:port name='ICalculator' binding='tns:ICalculator'>
|
||||
<soap:address
|
||||
location='http://ukulele:8080/calcapp/services/calculator'/>
|
||||
</wsdl:port>
|
||||
</wsdl:service>
|
||||
</wsdl:definitions>
|
54
test/soap/wsdlDriver/document.wsdl
Normal file
54
test/soap/wsdlDriver/document.wsdl
Normal file
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<definitions name="submit_service"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:tns="urn:example.com:document"
|
||||
targetNamespace="urn:example.com:document"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
<types>
|
||||
<xsd:schema targetNamespace="urn:example.com:document">
|
||||
<xsd:element name="ruby">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element minOccurs="1" maxOccurs="1" name="myversion" type="tns:myversion"/>
|
||||
<xsd:element minOccurs="0" maxOccurs="1" name="date" type="xsd:dateTime"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:simpleType name="myversion">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="1.6"/>
|
||||
<xsd:enumeration value="1.8"/>
|
||||
<xsd:enumeration value="1.9"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
|
||||
<message name="submit_msg">
|
||||
<part name="parameters" element="tns:ruby"/>
|
||||
</message>
|
||||
|
||||
<portType name="submit_port_type">
|
||||
<operation name="submit">
|
||||
<input message="tns:submit_msg"/>
|
||||
<output message="tns:submit_msg"/>
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding name="submit_binding" type="tns:submit_port_type">
|
||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
|
||||
<operation name="submit">
|
||||
<soap:operation soapAction="urn:example.com:document#submit" style="document"/>
|
||||
<input><soap:body use="literal"/></input>
|
||||
<output><soap:body use="literal"/></output>
|
||||
</operation>
|
||||
</binding>
|
||||
|
||||
<service name="submit_service">
|
||||
<port name="submit_port" binding="tns:submit_binding">
|
||||
<soap:address location="http://localhost:10080"/>
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
88
test/soap/wsdlDriver/test_calc.rb
Normal file
88
test/soap/wsdlDriver/test_calc.rb
Normal file
|
@ -0,0 +1,88 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/httpserver'
|
||||
require 'soap/wsdlDriver'
|
||||
|
||||
|
||||
module SOAP
|
||||
|
||||
|
||||
class TestCalc < Test::Unit::TestCase
|
||||
class Server < ::SOAP::RPC::HTTPServer
|
||||
def on_init
|
||||
add_method(self, 'add', 'x', 'y')
|
||||
end
|
||||
|
||||
def add(x, y)
|
||||
x.to_f + y.to_f
|
||||
end
|
||||
end
|
||||
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
setup_client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new(
|
||||
:BindAddress => "0.0.0.0",
|
||||
:Port => Port,
|
||||
:AccessLog => [],
|
||||
:SOAPDefaultNamespace => 'http://www.fred.com'
|
||||
)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def setup_client
|
||||
@wsdl = File.join(DIR, 'calc.wsdl')
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
teardown_client
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def teardown_client
|
||||
@client.reset_stream if @client
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
t
|
||||
end
|
||||
|
||||
def test_rpc_driver
|
||||
@client = ::SOAP::WSDLDriverFactory.new(@wsdl).create_rpc_driver
|
||||
@client.wiredump_dev = STDOUT if $DEBUG
|
||||
@client.endpoint_url = "http://localhost:#{Port}/"
|
||||
@client.generate_explicit_type = true
|
||||
assert_equal(0.3, @client.add(0.1, 0.2))
|
||||
@client.generate_explicit_type = false
|
||||
assert_equal(0.3, @client.add(0.1, 0.2))
|
||||
end
|
||||
|
||||
def test_old_driver
|
||||
@client = ::SOAP::WSDLDriverFactory.new(@wsdl).create_driver
|
||||
@client.wiredump_dev = STDOUT if $DEBUG
|
||||
@client.endpoint_url = "http://localhost:#{Port}/"
|
||||
@client.generate_explicit_type = true
|
||||
assert_equal(0.3, @client.add(0.1, 0.2))
|
||||
@client.generate_explicit_type = false
|
||||
assert_equal(0.3, @client.add(0.1, 0.2))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
78
test/soap/wsdlDriver/test_document.rb
Normal file
78
test/soap/wsdlDriver/test_document.rb
Normal file
|
@ -0,0 +1,78 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/wsdlDriver'
|
||||
|
||||
|
||||
module SOAP
|
||||
|
||||
|
||||
class TestDocument < Test::Unit::TestCase
|
||||
Namespace = 'urn:example.com:document'
|
||||
|
||||
class Server < ::SOAP::RPC::StandaloneServer
|
||||
def on_init
|
||||
add_document_method(self, 'urn:example.com:document#submit', 'submit', XSD::QName.new(Namespace, 'ruby'), XSD::QName.new(Namespace, 'ruby'))
|
||||
end
|
||||
|
||||
def submit(ruby)
|
||||
ruby
|
||||
end
|
||||
end
|
||||
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
setup_client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new('Test', Namespace, '0.0.0.0', Port)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def setup_client
|
||||
wsdl = File.join(DIR, 'document.wsdl')
|
||||
@client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
|
||||
@client.endpoint_url = "http://localhost:#{Port}/"
|
||||
@client.wiredump_dev = STDOUT if $DEBUG
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
teardown_client
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def teardown_client
|
||||
@client.reset_stream
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
t
|
||||
end
|
||||
|
||||
def test_document
|
||||
msg = {'myversion' => "1.9", 'date' => "2004-01-01T00:00:00Z"}
|
||||
reply_msg = @client.submit(msg)
|
||||
assert_equal('1.9', reply_msg.myversion)
|
||||
assert_equal('1.9', reply_msg['myversion'])
|
||||
assert_equal('2004-01-01T00:00:00Z', reply_msg.date)
|
||||
assert_equal('2004-01-01T00:00:00Z', reply_msg['date'])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
74
test/wsdl/document/document.wsdl
Normal file
74
test/wsdl/document/document.wsdl
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<definitions
|
||||
name="echo"
|
||||
targetNamespace="urn:docrpc"
|
||||
xmlns:tns="urn:docrpc"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
<types>
|
||||
<xsd:schema elementFormDefault="unqualified" targetNamespace="urn:docrpc">
|
||||
<xsd:complexType name="echo_struct">
|
||||
<xsd:sequence>
|
||||
<xsd:element minOccurs="0" maxOccurs="1" name="m_string" type="xsd:string" />
|
||||
<xsd:element minOccurs="0" maxOccurs="1" name="m_datetime" type="xsd:dateTime" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="m_attr" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:element name="echoele">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element minOccurs="0" maxOccurs="1" name="struct1" type="tns:echo_struct" />
|
||||
<xsd:element minOccurs="0" maxOccurs="1" name="struct-2" type="tns:echo_struct" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="attr_string" type="xsd:string" />
|
||||
<xsd:attribute name="attr-int" type="xsd:int" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="echo_response">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element minOccurs="0" maxOccurs="1" name="struct1" type="tns:echo_struct" />
|
||||
<xsd:element minOccurs="0" maxOccurs="1" name="struct-2" type="tns:echo_struct" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="attr_string" type="xsd:string" />
|
||||
<xsd:attribute name="attr-int" type="xsd:int" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
|
||||
<message name="echo_in">
|
||||
<part name="parameters" element="tns:echoele" />
|
||||
</message>
|
||||
<message name="echo_out">
|
||||
<part name="parameters" element="tns:echo_response" />
|
||||
</message>
|
||||
|
||||
<portType name="docrpc_porttype">
|
||||
<operation name="echo">
|
||||
<input message="tns:echo_in" />
|
||||
<output message="tns:echo_out" />
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding name="docrpc_binding" type="tns:docrpc_porttype">
|
||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
|
||||
<operation name="echo">
|
||||
<soap:operation soapAction="urn:docrpc:echo" style="document" />
|
||||
<input>
|
||||
<soap:body use="literal" />
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal" />
|
||||
</output>
|
||||
</operation>
|
||||
</binding>
|
||||
|
||||
<service name="docrpc_service">
|
||||
<port name="docprc_service_port" binding="tns:docrpc_binding">
|
||||
<soap:address location="http://localhost:17171/" />
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
92
test/wsdl/document/echo.rb
Normal file
92
test/wsdl/document/echo.rb
Normal file
|
@ -0,0 +1,92 @@
|
|||
require 'xsd/qname'
|
||||
|
||||
# {urn:docrpc}echoele
|
||||
class Echoele
|
||||
@@schema_type = "echoele"
|
||||
@@schema_ns = "urn:docrpc"
|
||||
@@schema_attribute = {XSD::QName.new(nil, "attr_string") => "SOAP::SOAPString", XSD::QName.new(nil, "attr-int") => "SOAP::SOAPInt"}
|
||||
@@schema_element = [["struct1", "Echo_struct"], ["struct_2", ["Echo_struct", XSD::QName.new(nil, "struct-2")]]]
|
||||
|
||||
attr_accessor :struct1
|
||||
attr_accessor :struct_2
|
||||
|
||||
def xmlattr_attr_string
|
||||
(@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")]
|
||||
end
|
||||
|
||||
def xmlattr_attr_string=(value)
|
||||
(@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")] = value
|
||||
end
|
||||
|
||||
def xmlattr_attr_int
|
||||
(@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")]
|
||||
end
|
||||
|
||||
def xmlattr_attr_int=(value)
|
||||
(@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")] = value
|
||||
end
|
||||
|
||||
def initialize(struct1 = nil, struct_2 = nil)
|
||||
@struct1 = struct1
|
||||
@struct_2 = struct_2
|
||||
@__xmlattr = {}
|
||||
end
|
||||
end
|
||||
|
||||
# {urn:docrpc}echo_response
|
||||
class Echo_response
|
||||
@@schema_type = "echo_response"
|
||||
@@schema_ns = "urn:docrpc"
|
||||
@@schema_attribute = {XSD::QName.new(nil, "attr_string") => "SOAP::SOAPString", XSD::QName.new(nil, "attr-int") => "SOAP::SOAPInt"}
|
||||
@@schema_element = [["struct1", "Echo_struct"], ["struct_2", ["Echo_struct", XSD::QName.new(nil, "struct-2")]]]
|
||||
|
||||
attr_accessor :struct1
|
||||
attr_accessor :struct_2
|
||||
|
||||
def xmlattr_attr_string
|
||||
(@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")]
|
||||
end
|
||||
|
||||
def xmlattr_attr_string=(value)
|
||||
(@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")] = value
|
||||
end
|
||||
|
||||
def xmlattr_attr_int
|
||||
(@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")]
|
||||
end
|
||||
|
||||
def xmlattr_attr_int=(value)
|
||||
(@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")] = value
|
||||
end
|
||||
|
||||
def initialize(struct1 = nil, struct_2 = nil)
|
||||
@struct1 = struct1
|
||||
@struct_2 = struct_2
|
||||
@__xmlattr = {}
|
||||
end
|
||||
end
|
||||
|
||||
# {urn:docrpc}echo_struct
|
||||
class Echo_struct
|
||||
@@schema_type = "echo_struct"
|
||||
@@schema_ns = "urn:docrpc"
|
||||
@@schema_attribute = {XSD::QName.new("urn:docrpc", "m_attr") => "SOAP::SOAPString"}
|
||||
@@schema_element = [["m_string", "SOAP::SOAPString"], ["m_datetime", "SOAP::SOAPDateTime"]]
|
||||
|
||||
attr_accessor :m_string
|
||||
attr_accessor :m_datetime
|
||||
|
||||
def xmlattr_m_attr
|
||||
(@__xmlattr ||= {})[XSD::QName.new("urn:docrpc", "m_attr")]
|
||||
end
|
||||
|
||||
def xmlattr_m_attr=(value)
|
||||
(@__xmlattr ||= {})[XSD::QName.new("urn:docrpc", "m_attr")] = value
|
||||
end
|
||||
|
||||
def initialize(m_string = nil, m_datetime = nil)
|
||||
@m_string = m_string
|
||||
@m_datetime = m_datetime
|
||||
@__xmlattr = {}
|
||||
end
|
||||
end
|
54
test/wsdl/document/number.wsdl
Normal file
54
test/wsdl/document/number.wsdl
Normal file
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<definitions
|
||||
name="foo"
|
||||
targetNamespace="urn:foo"
|
||||
xmlns:tns="urn:foo"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
<types>
|
||||
<xsd:schema elementFormDefault="unqualified" targetNamespace="urn:foo">
|
||||
<xsd:element name="get_foo">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element minOccurs="0" maxOccurs="1" name="number" type="xsd:string" />
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
|
||||
<message name="get_foo_in">
|
||||
<part name="parameters" element="tns:get_foo" />
|
||||
</message>
|
||||
<message name="get_foo_out">
|
||||
<part name="parameters" type="xsd:string" />
|
||||
</message>
|
||||
|
||||
<portType name="foo_porttype">
|
||||
<operation name="get_foo">
|
||||
<input message="tns:get_foo_in" />
|
||||
<output message="tns:get_foo_out" />
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding name="foo_binding" type="tns:foo_porttype">
|
||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
|
||||
style="document" />
|
||||
<operation name="get_foo">
|
||||
<soap:operation soapAction="urn:foo:get_foo" style="document" />
|
||||
<input>
|
||||
<soap:body use="literal" />
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal" />
|
||||
</output>
|
||||
</operation>
|
||||
</binding>
|
||||
|
||||
<service name="foo_service">
|
||||
<port name="foo_service_port" binding="tns:foo_binding">
|
||||
<soap:address location="http://localhost:17171/" />
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
66
test/wsdl/document/ping_nosoapaction.wsdl
Normal file
66
test/wsdl/document/ping_nosoapaction.wsdl
Normal file
|
@ -0,0 +1,66 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<definitions xmlns:tns="http://xmlsoap.org/Ping"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
targetNamespace="http://xmlsoap.org/Ping" name="Ping">
|
||||
<types>
|
||||
<schema targetNamespace="http://xmlsoap.org/Ping"
|
||||
xmlns="http://www.w3.org/2001/XMLSchema"
|
||||
elementFormDefault="qualified">
|
||||
<complexType name="ping">
|
||||
<sequence>
|
||||
<element name="scenario" type="xsd:string"
|
||||
nillable="true"/>
|
||||
<element name="origin" type="xsd:string"
|
||||
nillable="true"/>
|
||||
<element name="text" type="xsd:string"
|
||||
nillable="true"/>
|
||||
</sequence>
|
||||
</complexType>
|
||||
<complexType name="pingResponse">
|
||||
<sequence>
|
||||
<element name="scenario" type="xsd:string"
|
||||
nillable="true"/>
|
||||
<element name="origin" type="xsd:string"
|
||||
nillable="true"/>
|
||||
<element name="text" type="xsd:string"
|
||||
nillable="true"/>
|
||||
</sequence>
|
||||
</complexType>
|
||||
<element name="Ping" type="tns:ping"/>
|
||||
<element name="PingResponse" type="tns:pingResponse"/>
|
||||
</schema>
|
||||
</types>
|
||||
<message name="PingRequest">
|
||||
<part name="ping" element="tns:Ping"/>
|
||||
</message>
|
||||
<message name="PingResponse">
|
||||
<part name="pingResponse" element="tns:PingResponse"/>
|
||||
</message>
|
||||
<portType name="PingPort">
|
||||
<operation name="Ping">
|
||||
<input message="tns:PingRequest"/>
|
||||
<output message="tns:PingResponse"/>
|
||||
</operation>
|
||||
</portType>
|
||||
<binding name="PingBinding" type="tns:PingPort">
|
||||
<soap:binding style="document"
|
||||
transport="http://schemas.xmlsoap.org/soap/http"/>
|
||||
<operation name="Ping">
|
||||
<soap:operation/>
|
||||
<input>
|
||||
<soap:body use="literal"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="literal"/>
|
||||
</output>
|
||||
</operation>
|
||||
</binding>
|
||||
<service name="PingService">
|
||||
<port name="PingPort" binding="tns:PingBinding">
|
||||
<soap:address
|
||||
location="http://127.0.0.1:8080/axis/services/PingPort"/>
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
109
test/wsdl/document/test_nosoapaction.rb
Normal file
109
test/wsdl/document/test_nosoapaction.rb
Normal file
|
@ -0,0 +1,109 @@
|
|||
require 'test/unit'
|
||||
require 'wsdl/parser'
|
||||
require 'wsdl/soap/wsdl2ruby'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/wsdlDriver'
|
||||
require 'soap/rpc/driver'
|
||||
|
||||
|
||||
module WSDL; module Document
|
||||
|
||||
|
||||
class TestNoSOAPAction < Test::Unit::TestCase
|
||||
class Server < ::SOAP::RPC::StandaloneServer
|
||||
Namespace = 'http://xmlsoap.org/Ping'
|
||||
|
||||
def on_init
|
||||
add_document_method(
|
||||
self,
|
||||
Namespace + '/ping',
|
||||
'ping_with_soapaction',
|
||||
XSD::QName.new(Namespace, 'Ping'),
|
||||
XSD::QName.new(Namespace, 'PingResponse')
|
||||
)
|
||||
|
||||
add_document_method(
|
||||
self,
|
||||
nil,
|
||||
'ping',
|
||||
XSD::QName.new(Namespace, 'Ping'),
|
||||
XSD::QName.new(Namespace, 'PingResponse')
|
||||
)
|
||||
|
||||
# When no SOAPAction given, latter method(ping) is called.
|
||||
end
|
||||
|
||||
def ping(arg)
|
||||
arg.text = 'ping'
|
||||
arg
|
||||
end
|
||||
|
||||
def ping_with_soapaction(arg)
|
||||
arg.text = 'ping_with_soapaction'
|
||||
arg
|
||||
end
|
||||
end
|
||||
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
@client = nil
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
@client.reset_stream if @client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new('Test', Server::Namespace, '0.0.0.0', Port)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
t
|
||||
end
|
||||
|
||||
def test_with_soapaction
|
||||
wsdl = File.join(DIR, 'ping_nosoapaction.wsdl')
|
||||
@client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
|
||||
@client.endpoint_url = "http://localhost:#{Port}/"
|
||||
@client.wiredump_dev = STDOUT if $DEBUG
|
||||
rv = @client.ping(:scenario => 'scenario', :origin => 'origin',
|
||||
:text => 'text')
|
||||
assert_equal('scenario', rv.scenario)
|
||||
assert_equal('origin', rv.origin)
|
||||
assert_equal('ping', rv.text)
|
||||
end
|
||||
|
||||
def test_without_soapaction
|
||||
@client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/",
|
||||
Server::Namespace)
|
||||
@client.add_document_method('ping', Server::Namespace + '/ping',
|
||||
XSD::QName.new(Server::Namespace, 'Ping'),
|
||||
XSD::QName.new(Server::Namespace, 'PingResponse'))
|
||||
@client.wiredump_dev = STDOUT if $DEBUG
|
||||
rv = @client.ping(:scenario => 'scenario', :origin => 'origin',
|
||||
:text => 'text')
|
||||
assert_equal('scenario', rv.scenario)
|
||||
assert_equal('origin', rv.origin)
|
||||
assert_equal('ping_with_soapaction', rv.text)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end; end
|
99
test/wsdl/document/test_number.rb
Normal file
99
test/wsdl/document/test_number.rb
Normal file
|
@ -0,0 +1,99 @@
|
|||
require 'test/unit'
|
||||
require 'wsdl/parser'
|
||||
require 'wsdl/soap/wsdl2ruby'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/wsdlDriver'
|
||||
|
||||
|
||||
module WSDL; module Document
|
||||
|
||||
|
||||
class TestNumber < Test::Unit::TestCase
|
||||
class Server < ::SOAP::RPC::StandaloneServer
|
||||
Namespace = 'urn:foo'
|
||||
|
||||
def on_init
|
||||
add_document_method(
|
||||
self,
|
||||
Namespace + ':get_foo',
|
||||
'get_foo',
|
||||
XSD::QName.new(Namespace, 'get_foo'),
|
||||
XSD::QName.new(Namespace, 'get_foo_response')
|
||||
)
|
||||
end
|
||||
|
||||
def get_foo(arg)
|
||||
arg.number
|
||||
end
|
||||
end
|
||||
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
setup_classdef
|
||||
@client = nil
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
File.unlink(pathname('foo.rb'))
|
||||
@client.reset_stream if @client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new('Test', "urn:rpc", '0.0.0.0', Port)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def setup_classdef
|
||||
gen = WSDL::SOAP::WSDL2Ruby.new
|
||||
gen.location = pathname("number.wsdl")
|
||||
gen.basedir = DIR
|
||||
gen.logger.level = Logger::FATAL
|
||||
gen.opt['classdef'] = nil
|
||||
gen.opt['force'] = true
|
||||
gen.run
|
||||
require pathname('foo')
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
t
|
||||
end
|
||||
|
||||
def pathname(filename)
|
||||
File.join(DIR, filename)
|
||||
end
|
||||
|
||||
def test_wsdl
|
||||
wsdl = File.join(DIR, 'number.wsdl')
|
||||
@client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
|
||||
@client.endpoint_url = "http://localhost:#{Port}/"
|
||||
@client.wiredump_dev = STDOUT if $DEBUG
|
||||
|
||||
# with the Struct defined in foo.rb, which is generated from WSDL
|
||||
assert_equal("12345", @client.get_foo(Get_foo.new("12345")))
|
||||
|
||||
# with Hash
|
||||
assert_equal("12345", @client.get_foo({:number => "12345"}))
|
||||
|
||||
# with Original struct
|
||||
get_foo_struct = Struct.new(:number)
|
||||
assert_equal("12345", @client.get_foo(get_foo_struct.new("12345")))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end; end
|
159
test/wsdl/document/test_rpc.rb
Normal file
159
test/wsdl/document/test_rpc.rb
Normal file
|
@ -0,0 +1,159 @@
|
|||
require 'test/unit'
|
||||
require 'wsdl/parser'
|
||||
require 'wsdl/soap/wsdl2ruby'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/wsdlDriver'
|
||||
|
||||
|
||||
module WSDL; module Document
|
||||
|
||||
|
||||
class TestRPC < Test::Unit::TestCase
|
||||
class Server < ::SOAP::RPC::StandaloneServer
|
||||
Namespace = 'urn:docrpc'
|
||||
|
||||
def on_init
|
||||
add_document_method(
|
||||
self,
|
||||
Namespace + ':echo',
|
||||
'echo',
|
||||
XSD::QName.new(Namespace, 'echo'),
|
||||
XSD::QName.new(Namespace, 'echo_response')
|
||||
)
|
||||
end
|
||||
|
||||
def echo(arg)
|
||||
if arg.is_a?(Echoele)
|
||||
# swap args
|
||||
tmp = arg.struct1
|
||||
arg.struct1 = arg.struct_2
|
||||
arg.struct_2 = tmp
|
||||
arg
|
||||
else
|
||||
# swap args
|
||||
tmp = arg["struct1"]
|
||||
arg["struct1"] = arg["struct-2"]
|
||||
arg["struct-2"] = tmp
|
||||
arg
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
setup_classdef
|
||||
@client = nil
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
#File.unlink(pathname('echo.rb'))
|
||||
@client.reset_stream if @client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new('Test', "urn:rpc", '0.0.0.0', Port)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def setup_classdef
|
||||
gen = WSDL::SOAP::WSDL2Ruby.new
|
||||
gen.location = pathname("document.wsdl")
|
||||
gen.basedir = DIR
|
||||
gen.logger.level = Logger::FATAL
|
||||
gen.opt['classdef'] = nil
|
||||
gen.opt['force'] = true
|
||||
gen.run
|
||||
require pathname('echo')
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
t
|
||||
end
|
||||
|
||||
def pathname(filename)
|
||||
File.join(DIR, filename)
|
||||
end
|
||||
|
||||
def test_wsdl
|
||||
wsdl = File.join(DIR, 'document.wsdl')
|
||||
@client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
|
||||
@client.endpoint_url = "http://localhost:#{Port}/"
|
||||
@client.wiredump_dev = STDOUT if $DEBUG
|
||||
|
||||
struct1 = Echo_struct.new("mystring1", now1 = Time.now)
|
||||
struct1.xmlattr_m_attr = 'myattr1'
|
||||
struct2 = Echo_struct.new("mystring2", now2 = Time.now)
|
||||
struct2.xmlattr_m_attr = 'myattr2'
|
||||
echo = Echoele.new(struct1, struct2)
|
||||
echo.xmlattr_attr_string = 'attr_string'
|
||||
echo.xmlattr_attr_int = 5
|
||||
ret = @client.echo(echo)
|
||||
|
||||
timeformat = "%Y-%m-%dT%H:%M:%S.%s"
|
||||
assert_equal("mystring2", ret.struct1.m_string)
|
||||
assert_equal(now2.strftime(timeformat), ret.struct1.m_datetime.strftime(timeformat))
|
||||
assert_equal("mystring1", ret.struct_2.m_string)
|
||||
assert_equal(now1.strftime(timeformat), ret.struct_2.m_datetime.strftime(timeformat))
|
||||
assert_equal("attr_string", ret.xmlattr_attr_string)
|
||||
assert_equal(5, ret.xmlattr_attr_int)
|
||||
end
|
||||
|
||||
include ::SOAP
|
||||
def test_naive
|
||||
@client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/")
|
||||
@client.add_document_method('echo', 'urn:docrpc:echo',
|
||||
XSD::QName.new('urn:docrpc', 'echoele'),
|
||||
XSD::QName.new('urn:docrpc', 'echo_response'))
|
||||
@client.wiredump_dev = STDOUT if $DEBUG
|
||||
|
||||
echo = SOAPElement.new('foo')
|
||||
echo.extraattr['attr_string'] = 'attr_string'
|
||||
echo.extraattr['attr-int'] = 5
|
||||
echo.add(struct1 = SOAPElement.new('struct1'))
|
||||
struct1.add(SOAPElement.new('m_string', 'mystring1'))
|
||||
struct1.add(SOAPElement.new('m_datetime', '2005-03-17T19:47:31+01:00'))
|
||||
struct1.extraattr['m_attr'] = 'myattr1'
|
||||
echo.add(struct2 = SOAPElement.new('struct-2'))
|
||||
struct2.add(SOAPElement.new('m_string', 'mystring2'))
|
||||
struct2.add(SOAPElement.new('m_datetime', '2005-03-17T19:47:32+02:00'))
|
||||
struct2.extraattr['m_attr'] = 'myattr2'
|
||||
ret = @client.echo(echo)
|
||||
timeformat = "%Y-%m-%dT%H:%M:%S"
|
||||
assert_equal('mystring2', ret.struct1.m_string)
|
||||
assert_equal('2005-03-17T19:47:32', ret.struct1.m_datetime.strftime(timeformat))
|
||||
#p ret.struct1.class
|
||||
#p ret.struct_2.class
|
||||
assert_equal("mystring1", ret.struct_2.m_string)
|
||||
assert_equal('2005-03-17T19:47:31', ret.struct_2.m_datetime.strftime(timeformat))
|
||||
assert_equal('attr_string', ret.xmlattr_attr_string)
|
||||
assert_equal(5, ret.xmlattr_attr_int)
|
||||
|
||||
echo = {'struct1' => {'m_string' => 'mystring1', 'm_datetime' => '2005-03-17T19:47:31+01:00'},
|
||||
'struct-2' => {'m_string' => 'mystring2', 'm_datetime' => '2005-03-17T19:47:32+02:00'}}
|
||||
ret = @client.echo(echo)
|
||||
timeformat = "%Y-%m-%dT%H:%M:%S"
|
||||
assert_equal('mystring2', ret.struct1.m_string)
|
||||
assert_equal('2005-03-17T19:47:32', ret.struct1.m_datetime.strftime(timeformat))
|
||||
assert_equal("mystring1", ret.struct_2.m_string)
|
||||
assert_equal('2005-03-17T19:47:31', ret.struct_2.m_datetime.strftime(timeformat))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end; end
|
21
test/wsdl/marshal/person.wsdl
Normal file
21
test/wsdl/marshal/person.wsdl
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0"?>
|
||||
<definitions name="Person"
|
||||
targetNamespace="http://www.jin.gr.jp/~nahi/xmlns/sample/Person"
|
||||
xmlns:tns="http://www.jin.gr.jp/~nahi/xmlns/sample/Person"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
<types>
|
||||
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
|
||||
targetNamespace="http://www.jin.gr.jp/~nahi/xmlns/sample/Person">
|
||||
<complexType name="Person">
|
||||
<all>
|
||||
<element name="familyname" type="xsd:string"/>
|
||||
<element name="givenname" type="xsd:string"/>
|
||||
<element name="var1" type="xsd:int"/>
|
||||
<element name="var2" type="xsd:double"/>
|
||||
<element name="var3" type="xsd:string"/>
|
||||
</all>
|
||||
</complexType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
</definitions>
|
22
test/wsdl/marshal/person_org.rb
Normal file
22
test/wsdl/marshal/person_org.rb
Normal file
|
@ -0,0 +1,22 @@
|
|||
require 'xsd/qname'
|
||||
|
||||
# {http://www.jin.gr.jp/~nahi/xmlns/sample/Person}Person
|
||||
class Person
|
||||
@@schema_type = "Person"
|
||||
@@schema_ns = "http://www.jin.gr.jp/~nahi/xmlns/sample/Person"
|
||||
@@schema_element = [["familyname", "SOAP::SOAPString"], ["givenname", "SOAP::SOAPString"], ["var1", "SOAP::SOAPInt"], ["var2", "SOAP::SOAPDouble"], ["var3", "SOAP::SOAPString"]]
|
||||
|
||||
attr_accessor :familyname
|
||||
attr_accessor :givenname
|
||||
attr_accessor :var1
|
||||
attr_accessor :var2
|
||||
attr_accessor :var3
|
||||
|
||||
def initialize(familyname = nil, givenname = nil, var1 = nil, var2 = nil, var3 = nil)
|
||||
@familyname = familyname
|
||||
@givenname = givenname
|
||||
@var1 = var1
|
||||
@var2 = var2
|
||||
@var3 = var3
|
||||
end
|
||||
end
|
80
test/wsdl/marshal/test_wsdlmarshal.rb
Normal file
80
test/wsdl/marshal/test_wsdlmarshal.rb
Normal file
|
@ -0,0 +1,80 @@
|
|||
require 'test/unit'
|
||||
require 'wsdl/parser'
|
||||
require 'soap/mapping/wsdlencodedregistry'
|
||||
require 'soap/marshal'
|
||||
require 'wsdl/soap/wsdl2ruby'
|
||||
|
||||
class WSDLMarshaller
|
||||
include SOAP
|
||||
|
||||
def initialize(wsdlfile)
|
||||
wsdl = WSDL::Parser.new.parse(File.open(wsdlfile) { |f| f.read })
|
||||
types = wsdl.collect_complextypes
|
||||
@opt = {
|
||||
:decode_typemap => types,
|
||||
:generate_explicit_type => false,
|
||||
:pretty => true
|
||||
}
|
||||
@mapping_registry = Mapping::WSDLEncodedRegistry.new(types)
|
||||
end
|
||||
|
||||
def dump(obj, io = nil)
|
||||
type = Mapping.class2element(obj.class)
|
||||
ele = Mapping.obj2soap(obj, @mapping_registry, type)
|
||||
ele.elename = ele.type
|
||||
Processor.marshal(SOAPEnvelope.new(nil, SOAPBody.new(ele)), @opt, io)
|
||||
end
|
||||
|
||||
def load(io)
|
||||
header, body = Processor.unmarshal(io, @opt)
|
||||
Mapping.soap2obj(body.root_node)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
require File.join(File.dirname(__FILE__), 'person_org')
|
||||
|
||||
class Person
|
||||
def ==(rhs)
|
||||
@familyname == rhs.familyname and @givenname == rhs.givenname and
|
||||
@var1 == rhs.var1 and @var2 == rhs.var2 and @var3 == rhs.var3
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
class TestWSDLMarshal < Test::Unit::TestCase
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
def test_marshal
|
||||
marshaller = WSDLMarshaller.new(pathname('person.wsdl'))
|
||||
obj = Person.new("NAKAMURA", "Hiroshi", 1, 1.0, "1")
|
||||
str = marshaller.dump(obj)
|
||||
obj2 = marshaller.load(str)
|
||||
assert_equal(obj, obj2)
|
||||
assert_equal(str, marshaller.dump(obj2))
|
||||
end
|
||||
|
||||
def test_classdef
|
||||
gen = WSDL::SOAP::WSDL2Ruby.new
|
||||
gen.location = pathname("person.wsdl")
|
||||
gen.basedir = DIR
|
||||
gen.logger.level = Logger::FATAL
|
||||
gen.opt['classdef'] = nil
|
||||
gen.opt['force'] = true
|
||||
gen.run
|
||||
compare("person_org.rb", "Person.rb")
|
||||
File.unlink(pathname('Person.rb'))
|
||||
end
|
||||
|
||||
def compare(expected, actual)
|
||||
assert_equal(loadfile(expected), loadfile(actual), actual)
|
||||
end
|
||||
|
||||
def loadfile(file)
|
||||
File.open(pathname(file)) { |f| f.read }
|
||||
end
|
||||
|
||||
def pathname(filename)
|
||||
File.join(DIR, filename)
|
||||
end
|
||||
end
|
103
test/wsdl/raa/server.rb
Normal file
103
test/wsdl/raa/server.rb
Normal file
|
@ -0,0 +1,103 @@
|
|||
#!/usr/bin/env ruby
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'RAA.rb'
|
||||
|
||||
class RAABaseServicePortType
|
||||
MappingRegistry = SOAP::Mapping::Registry.new
|
||||
|
||||
MappingRegistry.set(
|
||||
StringArray,
|
||||
::SOAP::SOAPArray,
|
||||
::SOAP::Mapping::Registry::TypedArrayFactory,
|
||||
{ :type => XSD::QName.new("http://www.w3.org/2001/XMLSchema", "string") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
Map,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://xml.apache.org/xml-soap", "Map") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
Category,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Category") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
InfoArray,
|
||||
::SOAP::SOAPArray,
|
||||
::SOAP::Mapping::Registry::TypedArrayFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
Info,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
Product,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Product") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
Owner,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Owner") }
|
||||
)
|
||||
|
||||
Methods = [
|
||||
["getAllListings", "getAllListings", [
|
||||
["retval", "return",
|
||||
[::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||
["getProductTree", "getProductTree", [
|
||||
["retval", "return",
|
||||
[::SOAP::SOAPStruct, "http://xml.apache.org/xml-soap", "Map"]]],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||
["getInfoFromCategory", "getInfoFromCategory", [
|
||||
["in", "category",
|
||||
[::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Category"]],
|
||||
["retval", "return",
|
||||
[::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||
["getModifiedInfoSince", "getModifiedInfoSince", [
|
||||
["in", "timeInstant",
|
||||
[SOAP::SOAPDateTime]],
|
||||
["retval", "return",
|
||||
[::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||
["getInfoFromName", "getInfoFromName", [
|
||||
["in", "productName",
|
||||
[SOAP::SOAPString]],
|
||||
["retval", "return",
|
||||
[::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||
["getInfoFromOwnerId", "getInfoFromOwnerId", [
|
||||
["in", "ownerId",
|
||||
[SOAP::SOAPInt]],
|
||||
["retval", "return",
|
||||
[::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"]
|
||||
]
|
||||
|
||||
def getAllListings
|
||||
["ruby", "soap4r"]
|
||||
end
|
||||
end
|
||||
|
||||
class RAABaseServiceServer < SOAP::RPC::StandaloneServer
|
||||
def initialize(*arg)
|
||||
super
|
||||
|
||||
servant = RAABaseServicePortType.new
|
||||
RAABaseServicePortType::Methods.each do |name_as, name, params, soapaction, namespace|
|
||||
qname = XSD::QName.new(namespace, name_as)
|
||||
@router.add_method(servant, qname, soapaction, name, params)
|
||||
end
|
||||
|
||||
self.mapping_registry = RAABaseServicePortType::MappingRegistry
|
||||
end
|
||||
end
|
75
test/wsdl/rpc/rpc.wsdl
Normal file
75
test/wsdl/rpc/rpc.wsdl
Normal file
|
@ -0,0 +1,75 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<definitions name="echo"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:tns="urn:rpc"
|
||||
xmlns:txd="urn:rpc-type"
|
||||
targetNamespace="urn:rpc"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
<types>
|
||||
<xsd:schema targetNamespace="urn:rpc-type">
|
||||
<xsd:complexType name="person">
|
||||
<xsd:all>
|
||||
<xsd:element name="family-name" type="xsd:string" />
|
||||
<xsd:element name="given_name" type="xsd:string" />
|
||||
<xsd:element name="age" type="xsd:int" />
|
||||
<xsd:element name="link" type="txd:person" />
|
||||
</xsd:all>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
|
||||
<message name="echo_in">
|
||||
<part name="arg1" type="txd:person"/>
|
||||
<part name="arg2" type="txd:person"/>
|
||||
</message>
|
||||
|
||||
<message name="echo_out">
|
||||
<part name="return" type="txd:person"/>
|
||||
</message>
|
||||
|
||||
<portType name="echo_port_type">
|
||||
<operation name="echo">
|
||||
<input message="tns:echo_in"/>
|
||||
<output message="tns:echo_out"/>
|
||||
</operation>
|
||||
|
||||
<operation name="echo_err">
|
||||
<input message="tns:echo_in"/>
|
||||
<output message="tns:echo_out"/>
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding name="echo_binding" type="tns:echo_port_type">
|
||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
|
||||
<operation name="echo">
|
||||
<soap:operation soapAction=""/>
|
||||
<input>
|
||||
<soap:body use="encoded" namespace="urn:rpc"
|
||||
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="encoded" namespace="urn:rpc"
|
||||
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
||||
</output>
|
||||
</operation>
|
||||
|
||||
<operation name="echo_err">
|
||||
<soap:operation soapAction=""/>
|
||||
<input>
|
||||
<soap:body use="encoded" namespace="urn:rpc"
|
||||
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="encoded" namespace="urn:rpc"
|
||||
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
||||
</output>
|
||||
</operation>
|
||||
</binding>
|
||||
|
||||
<service name="echo_service">
|
||||
<port name="echo_port" binding="tns:echo_binding">
|
||||
<soap:address location="http://localhost:10080"/>
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
118
test/wsdl/rpc/test_rpc.rb
Normal file
118
test/wsdl/rpc/test_rpc.rb
Normal file
|
@ -0,0 +1,118 @@
|
|||
require 'test/unit'
|
||||
require 'wsdl/parser'
|
||||
require 'wsdl/soap/wsdl2ruby'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/wsdlDriver'
|
||||
|
||||
|
||||
module WSDL; module RPC
|
||||
|
||||
|
||||
class TestRPC < Test::Unit::TestCase
|
||||
class Server < ::SOAP::RPC::StandaloneServer
|
||||
def on_init
|
||||
self.generate_explicit_type = false
|
||||
add_rpc_method(self, 'echo', 'arg1', 'arg2')
|
||||
add_rpc_method(self, 'echo_err', 'arg1', 'arg2')
|
||||
end
|
||||
|
||||
DummyPerson = Struct.new("family-name".intern, :given_name)
|
||||
def echo(arg1, arg2)
|
||||
case arg1.family_name
|
||||
when 'normal'
|
||||
arg1.family_name = arg2.family_name
|
||||
arg1.given_name = arg2.given_name
|
||||
arg1.age = arg2.age
|
||||
arg1
|
||||
when 'dummy'
|
||||
DummyPerson.new("family-name", "given_name")
|
||||
else
|
||||
raise
|
||||
end
|
||||
end
|
||||
|
||||
ErrPerson = Struct.new(:given_name, :no_such_element)
|
||||
def echo_err(arg1, arg2)
|
||||
ErrPerson.new(58, Time.now)
|
||||
end
|
||||
end
|
||||
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
setup_classdef
|
||||
@client = nil
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
File.unlink(pathname('echo.rb'))
|
||||
@client.reset_stream if @client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new('Test', "urn:rpc", '0.0.0.0', Port)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def setup_classdef
|
||||
gen = WSDL::SOAP::WSDL2Ruby.new
|
||||
gen.location = pathname("rpc.wsdl")
|
||||
gen.basedir = DIR
|
||||
gen.logger.level = Logger::FATAL
|
||||
gen.opt['classdef'] = nil
|
||||
gen.opt['force'] = true
|
||||
gen.run
|
||||
require pathname('echo')
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
t
|
||||
end
|
||||
|
||||
def pathname(filename)
|
||||
File.join(DIR, filename)
|
||||
end
|
||||
|
||||
def test_wsdl
|
||||
wsdl = File.join(DIR, 'rpc.wsdl')
|
||||
@client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
|
||||
@client.endpoint_url = "http://localhost:#{Port}/"
|
||||
@client.wiredump_dev = STDOUT if $DEBUG
|
||||
|
||||
ret = @client.echo(Person.new("normal", "", 12), Person.new("Hi", "Na", 21))
|
||||
assert_equal(Person, ret.class)
|
||||
assert_equal("Hi", ret.family_name)
|
||||
assert_equal("Na", ret.given_name)
|
||||
assert_equal(21, ret.age)
|
||||
|
||||
ret = @client.echo(Person.new("dummy", "", 12), Person.new("Hi", "Na", 21))
|
||||
assert_equal(Person, ret.class)
|
||||
assert_equal("family-name", ret.family_name)
|
||||
assert_equal("given_name", ret.given_name)
|
||||
assert_equal(nil, ret.age)
|
||||
|
||||
ret = @client.echo_err(Person.new("Na", "Hi"), Person.new("Hi", "Na"))
|
||||
assert_equal(Person, ret.class)
|
||||
assert_equal("58", ret.given_name)
|
||||
assert_equal(nil, ret.family_name)
|
||||
assert_equal(nil, ret.age)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end; end
|
214
test/xsd/codegen/test_classdef.rb
Normal file
214
test/xsd/codegen/test_classdef.rb
Normal file
|
@ -0,0 +1,214 @@
|
|||
require 'test/unit'
|
||||
require 'xsd/codegen/classdef'
|
||||
|
||||
|
||||
module XSD; module CodeGen
|
||||
|
||||
|
||||
class TestClassDefCreator < Test::Unit::TestCase
|
||||
include XSD::CodeGen
|
||||
include GenSupport
|
||||
|
||||
def test_classdef_simple
|
||||
c = ClassDef.new("Foo")
|
||||
assert_equal(format(<<-EOD), c.dump)
|
||||
class Foo
|
||||
end
|
||||
EOD
|
||||
end
|
||||
|
||||
def test_classdef_complex
|
||||
c = ClassDef.new("Foo::Bar::Baz", String)
|
||||
assert_equal(format(<<-EOD), c.dump)
|
||||
module Foo; module Bar
|
||||
|
||||
class Baz < String
|
||||
end
|
||||
|
||||
end; end
|
||||
EOD
|
||||
end
|
||||
|
||||
def test_require
|
||||
c = ClassDef.new("Foo")
|
||||
c.def_require("foo/bar")
|
||||
assert_equal(format(<<-EOD), c.dump)
|
||||
require 'foo/bar'
|
||||
|
||||
class Foo
|
||||
end
|
||||
EOD
|
||||
end
|
||||
|
||||
def test_comment
|
||||
c = ClassDef.new("Foo")
|
||||
c.def_require("foo/bar")
|
||||
c.comment = <<-EOD
|
||||
foo
|
||||
EOD
|
||||
assert_equal(format(<<-EOD), c.dump)
|
||||
require 'foo/bar'
|
||||
|
||||
# foo
|
||||
class Foo
|
||||
end
|
||||
EOD
|
||||
c.comment = <<-EOD
|
||||
foo
|
||||
|
||||
bar
|
||||
baz
|
||||
|
||||
EOD
|
||||
assert_equal(format(<<-EOD), c.dump)
|
||||
require 'foo/bar'
|
||||
|
||||
# foo
|
||||
#
|
||||
# bar
|
||||
# baz
|
||||
#
|
||||
class Foo
|
||||
end
|
||||
EOD
|
||||
end
|
||||
|
||||
def test_emptymethod
|
||||
c = ClassDef.new("Foo")
|
||||
c.def_method('foo') do
|
||||
end
|
||||
c.def_method('bar') do
|
||||
''
|
||||
end
|
||||
assert_equal(format(<<-EOD), c.dump)
|
||||
class Foo
|
||||
def foo
|
||||
end
|
||||
|
||||
def bar
|
||||
end
|
||||
end
|
||||
EOD
|
||||
end
|
||||
|
||||
def test_full
|
||||
c = ClassDef.new("Foo::Bar::HobbitName", String)
|
||||
c.def_require("foo/bar")
|
||||
c.comment = <<-EOD
|
||||
foo
|
||||
bar
|
||||
baz
|
||||
EOD
|
||||
c.def_const("FOO", 1)
|
||||
c.def_classvar("@@foo", "var".dump)
|
||||
c.def_classvar("baz", "1".dump)
|
||||
c.def_attr("Foo", true, "foo")
|
||||
c.def_attr("bar")
|
||||
c.def_attr("baz", true)
|
||||
c.def_attr("Foo2", true, "foo2")
|
||||
c.def_attr("foo3", false, "foo3")
|
||||
c.def_method("foo") do
|
||||
<<-EOD
|
||||
foo.bar = 1
|
||||
\tbaz.each do |ele|
|
||||
\t ele
|
||||
end
|
||||
EOD
|
||||
end
|
||||
c.def_method("baz", "qux") do
|
||||
<<-EOD
|
||||
[1, 2, 3].each do |i|
|
||||
p i
|
||||
end
|
||||
EOD
|
||||
end
|
||||
|
||||
m = MethodDef.new("qux", "quxx", "quxxx") do
|
||||
<<-EOD
|
||||
p quxx + quxxx
|
||||
EOD
|
||||
end
|
||||
m.comment = "hello world\n123"
|
||||
c.add_method(m)
|
||||
c.def_code <<-EOD
|
||||
Foo.new
|
||||
Bar.z
|
||||
EOD
|
||||
c.def_code <<-EOD
|
||||
Foo.new
|
||||
Bar.z
|
||||
EOD
|
||||
c.def_privatemethod("foo", "baz", "*arg", "&block")
|
||||
|
||||
assert_equal(format(<<-EOD), c.dump)
|
||||
require 'foo/bar'
|
||||
|
||||
module Foo; module Bar
|
||||
|
||||
# foo
|
||||
# bar
|
||||
# baz
|
||||
class HobbitName < String
|
||||
@@foo = "var"
|
||||
@@baz = "1"
|
||||
|
||||
FOO = 1
|
||||
|
||||
Foo.new
|
||||
Bar.z
|
||||
|
||||
Foo.new
|
||||
Bar.z
|
||||
|
||||
attr_accessor :bar
|
||||
attr_accessor :baz
|
||||
attr_reader :foo3
|
||||
|
||||
def Foo
|
||||
@foo
|
||||
end
|
||||
|
||||
def Foo=(value)
|
||||
@foo = value
|
||||
end
|
||||
|
||||
def Foo2
|
||||
@foo2
|
||||
end
|
||||
|
||||
def Foo2=(value)
|
||||
@foo2 = value
|
||||
end
|
||||
|
||||
def foo
|
||||
foo.bar = 1
|
||||
baz.each do |ele|
|
||||
ele
|
||||
end
|
||||
end
|
||||
|
||||
def baz(qux)
|
||||
[1, 2, 3].each do |i|
|
||||
p i
|
||||
end
|
||||
end
|
||||
|
||||
# hello world
|
||||
# 123
|
||||
def qux(quxx, quxxx)
|
||||
p quxx + quxxx
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def foo(baz, *arg, &block)
|
||||
end
|
||||
end
|
||||
|
||||
end; end
|
||||
EOD
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end; end
|
Loading…
Add table
Add a link
Reference in a new issue