soapex 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2007 YOUR NAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,4 @@
1
+ templates
2
+ =================
3
+
4
+ A plugin for the Merb framework that provides ....
@@ -0,0 +1,35 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+
4
+ GEM = "soapex"
5
+ VERSION = "0.1"
6
+ AUTHOR = "Brian Hawthorne"
7
+ EMAIL = "brian.lee.hawthorne at gmail dot com"
8
+ HOMEPAGE = "http://example.com"
9
+ SUMMARY = "A gem that provides extended functionality to the soap4r package"
10
+
11
+ spec = Gem::Specification.new do |s|
12
+ s.name = GEM
13
+ s.version = VERSION
14
+ s.platform = Gem::Platform::RUBY
15
+ s.has_rdoc = true
16
+ s.extra_rdoc_files = ["README", "LICENSE", 'TODO']
17
+ s.summary = SUMMARY
18
+ s.description = s.summary
19
+ s.author = AUTHOR
20
+ s.email = EMAIL
21
+ s.homepage = HOMEPAGE
22
+ s.require_path = 'lib'
23
+ s.autorequire = GEM
24
+ s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,specs}/**/*")
25
+ s.requirements << 'soap4r v 1.5.6 or greater'
26
+ s.requirements << 'soapex v 0.1 or greater'
27
+ end
28
+
29
+ Rake::GemPackageTask.new(spec) do |pkg|
30
+ pkg.gem_spec = spec
31
+ end
32
+
33
+ task :install => [:package] do
34
+ sh %{sudo gem install pkg/#{GEM}-#{VERSION}}
35
+ end
data/TODO ADDED
@@ -0,0 +1,4 @@
1
+ TODO:
2
+ Fix LICENSE with your name
3
+ Fix Rakefile with your name and contact info
4
+ Add your code to lib/<%= name %>.rb
File without changes
@@ -0,0 +1,95 @@
1
+ require 'soap/soap'
2
+ require 'soapex/error'
3
+ require 'soapex/services'
4
+
5
+ def atsym(name)
6
+ ("@"+(name.to_s)).to_sym
7
+ end
8
+
9
+ def fix_case_up(name)
10
+ (newname = name.dup)[0] = name[0,1].upcase # upper first character
11
+ newname
12
+ end
13
+
14
+ module SOAP::MultiService
15
+
16
+ class Client
17
+
18
+ class Config
19
+
20
+ def initialize(options={})
21
+ @sandbox = false
22
+ IO.foreach(filename) do |line|
23
+ next if line =~ /^#/
24
+ name, value = line.split('=')
25
+ value = (options[name] || value.strip)
26
+ instance_variable_set(atsym(name), value)
27
+ end
28
+ @sandbox = ['True', 'true', '1'].include?(@sandbox.strip)
29
+ end
30
+
31
+ def filename
32
+ raise NotImplementedError.new(
33
+ 'method filename must be implemented by a subclass')
34
+ end
35
+ end
36
+
37
+ attr_reader :config, :drivers
38
+
39
+ def initialize(options={})
40
+ @methodMap = Hash.new
41
+ prepareDrivers
42
+ end
43
+
44
+ def method_missing(m, *args)
45
+ methodName = m.id2name
46
+ requestName = fix_case_up(methodName) # upper first character
47
+
48
+ if driver = getMethodDriver(methodName)
49
+ serviceName = driver.class.name.split("::").last
50
+ req = getRequestClass(serviceName, requestName).new(*args)
51
+ return driver.method(methodName).call(req)
52
+ else
53
+ raise(SOAP::MultiService::UnknownAPICall,
54
+ "Unknown API Call: #{requestName}", caller)
55
+ end
56
+
57
+ # Handle application level error
58
+ rescue SOAP::FaultError => fault
59
+ raise(SOAP::MultiService::ApiError.new(fault),
60
+ "#{methodName} Call Failed: #{fault.faultstring.to_s}", caller)
61
+ end
62
+
63
+ private
64
+
65
+ def modulePrefix
66
+ raise NotImplementedError.new('method modulePrefix')
67
+ end
68
+
69
+ def prepareDrivers
70
+ raise NotImplementedError.new(
71
+ 'method prepareDrivers must be implemented by a subclass')
72
+ end
73
+
74
+ def updateMethodMap
75
+ @methodMap.update(
76
+ SOAP::MultiService::Services.makeMethodMap(@drivers.values))
77
+ end
78
+
79
+ def getMethodDriver(methodName)
80
+ @methodMap[methodName]
81
+ end
82
+
83
+ def getRequestClass(serviceName, requestName)
84
+ eval "#{modulePrefix}::#{serviceName}::#{requestName}"
85
+ end
86
+
87
+ def makeDriver(name, location=nil)
88
+ driver = eval("#{modulePrefix}::#{name}Service::#{name}Service").new
89
+ driver.prepare(@headers, location)
90
+ driver
91
+ end
92
+ end
93
+ end
94
+
95
+
@@ -0,0 +1,37 @@
1
+ require 'soap/rpc/driver'
2
+ require 'soap/header/simplehandler'
3
+
4
+ module SOAP::MultiService
5
+
6
+ class Driver < SOAP::RPC::Driver
7
+
8
+ class HeaderHandler < SOAP::Header::SimpleHandler
9
+ def initialize(tag, value)
10
+ super(XSD::QName.new(nil, tag))
11
+ @tag = tag
12
+ @value = value
13
+ end
14
+
15
+ # The initial handler from the sample was wrong,
16
+ # it generated 2 level of tags
17
+ def on_simple_outbound
18
+ @value
19
+ end
20
+ end
21
+
22
+ def setHeaders(header_hash)
23
+ header_hash.map do |key, value|
24
+ self.headerhandler << \
25
+ SOAP::MultiService::Driver::HeaderHandler.new(key.to_s, value)
26
+ end
27
+ end
28
+
29
+ def prepare(headers, endpoint=nil)
30
+ self.proxy.endpoint_url = endpoint if endpoint
31
+ setHeaders(headers)
32
+ (self.wiredump_dev = STDOUT) if $DEBUG
33
+ self.options['protocol.http.ssl_config.verify_mode'] = nil
34
+ (self.wiredump_file_base = "debug") if $DEBUG
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,60 @@
1
+ def atsym(name)
2
+ ("@"+(name.to_s)).to_sym
3
+ end
4
+
5
+ module SOAP::MultiService
6
+
7
+ # Generic error provides base class for more specific errors
8
+ # while still allowing a blanket rescue for any multiservice error.
9
+ class Error < StandardError; end
10
+
11
+ # Raised if a call is made to a method that does not exist in the multiservice API
12
+ class UnknownAPICall < Error; end
13
+
14
+ # Raised if an attempt is made to instantiate a type that does not exist in
15
+ # the multiservice SOAP API
16
+ class UnknownType < Error; end
17
+
18
+ # Raised if a call returns with a SOAP error
19
+ class ApiError < Error
20
+ (Attrs = [
21
+ :soap_faultcode,
22
+ :soap_faultstring,
23
+ :code,
24
+ :internal,
25
+ :message,
26
+ :trigger,
27
+ :violations
28
+ ]).each {|a|attr(a)}
29
+
30
+ def initialize(fault)
31
+ @soap_faultcode = getOrNil(fault, 'faultcode')
32
+ @soap_faultstring = getOrNil(fault, 'faultstring')
33
+ @code = getOrNil(fault.detail, 'code')
34
+ @internal = getOrNil(fault.detail,'internal')
35
+ @message = getOrNil(fault.detail,'message')
36
+ @trigger = getOrNil(fault.detail,'trigger')
37
+ @violations = getOrNil(fault.detail,'violations')
38
+ end
39
+
40
+ def inspect
41
+ "#<SOAP::MultiService::ApiError: #{message}>"
42
+ end
43
+
44
+ def message
45
+ Attrs.map{|a| [a, instance_variable_get(atsym(a))] }.
46
+ select{|p| p[1] }.
47
+ map{|p| "#{p[0]}: #{p[1].inspect}" }.join(', ')
48
+ end
49
+
50
+ def to_s
51
+ message
52
+ end
53
+
54
+ private
55
+ def getOrNil(obj, meth)
56
+ obj.respond_to?(meth) ? eval("obj.#{meth}") : nil
57
+ end
58
+ end
59
+ end
60
+
@@ -0,0 +1,31 @@
1
+ require 'soap/mapping/mapping'
2
+ require 'soap/mapping/registry'
3
+
4
+ def needspatch
5
+ SOAP::Mapping.set_attributes(a=[], :x=>10)
6
+ a != [10]
7
+ rescue Exception => e
8
+ true
9
+ end
10
+
11
+ if needspatch
12
+
13
+ # Apply mapping patch only if it has not already been applied.
14
+ class << SOAP::Mapping
15
+ alias set_attributes_old set_attributes
16
+ def set_attributes(obj, values)
17
+ if not obj.is_a?(::SOAP::Mapping::Object) and obj.kind_of?(Array)
18
+ values.each do |key, value|
19
+ if value.kind_of?(Array)
20
+ obj.concat(value)
21
+ else
22
+ obj << value
23
+ end
24
+ end
25
+ else
26
+ set_attributes_old(obj, values)
27
+ end
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,33 @@
1
+ module SOAP::MultiService
2
+
3
+ class Services
4
+ @version_services = {}
5
+
6
+ def self.getVersions
7
+ @version_services.keys
8
+ end
9
+
10
+ def self.getServices(version)
11
+ @version_services[version]
12
+ end
13
+
14
+ def self.requireDrivers(version, options={})
15
+ getServices(version).each do |servicename|
16
+ requireDriver(servicename, version, options)
17
+ end
18
+ end
19
+
20
+ def self.requireDriver(service, version, options={})
21
+ raise NotImplementedError.new(
22
+ 'method requireDriver must be implemented by a subclass')
23
+ end
24
+
25
+ def self.makeMethodMap(drivers)
26
+ methodMap = Hash.new
27
+ drivers.each do |d|
28
+ d.class::Methods.each {|m| methodMap[m[1]] = d}
29
+ end
30
+ methodMap
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,168 @@
1
+ # WSDL4R - WSDL to ruby mapping library.
2
+ # Copyright (C) 2002-2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'logger'
10
+ require 'xsd/qname'
11
+ require 'wsdl/importer'
12
+ require 'wsdl/soap/classDefCreator'
13
+ require 'wsdl/soap/servantSkeltonCreator'
14
+ require 'wsdl/soap/driverCreator'
15
+ require 'wsdl/soap/clientSkeltonCreator'
16
+ require 'wsdl/soap/standaloneServerStubCreator'
17
+ require 'wsdl/soap/cgiStubCreator'
18
+ require 'wsdl/soap/classNameCreator'
19
+
20
+
21
+ module SOAP
22
+ module MultiService
23
+
24
+ class WSDL2Ruby
25
+ attr_reader :options, :logger, :basedir
26
+
27
+ Options = [:classdef, :mapping_registry, :driver, :client_skelton, :servant_skelton,
28
+ :standalone_server_stub, :cgi_stub]
29
+
30
+ def initialize(basedir, force=false, logger=nil)
31
+ @basedir = basedir
32
+ @force = force
33
+ @logger ||= Logger.new(STDERR)
34
+ @namecreator = WSDL::SOAP::ClassNameCreator.new
35
+ end
36
+
37
+ def run(location, options={})
38
+ @modulepath = (options[:modulepath] || "")
39
+ @wsdl = import(location)
40
+ @servicename = @wsdl.services[0].name.name
41
+ Options.each do |optname|
42
+ if options.key?(optname)
43
+ servicename = (options[optname] || @servicename)
44
+ method("create_#{optname.to_s}".to_sym).call(servicename)
45
+ end
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def create_classdef(servicename)
52
+ @logger.info { "Creating class definition." }
53
+ @classdef_filename = servicename + '.rb'
54
+ write_file(@classdef_filename) do |f|
55
+ f << WSDL::SOAP::ClassDefCreator.new(@wsdl, @namecreator, @modulepath).dump
56
+ end
57
+ end
58
+
59
+ def create_mapping_registry(servicename)
60
+ @logger.info { "Creating mapping registry." }
61
+ @mapping_registry_filename = servicename + 'MappingRegistry.rb'
62
+ write_file(@mapping_registry_filename) do |f|
63
+ f << "require '#{@classdef_filename}'\n" if @classdef_filename
64
+ f << WSDL::SOAP::MappingRegistryCreator.new(@wsdl, @namecreator, @modulepath).dump
65
+ end
66
+ end
67
+
68
+ def create_driver(servicename)
69
+ @logger.info { "Creating driver." }
70
+ @driver_filename = servicename + 'Driver.rb'
71
+ write_file(@driver_filename) do |f|
72
+ f << "require '#{@classdef_filename}'\n\n" if @classdef_filename
73
+ f << WSDL::SOAP::DriverCreator.new(@wsdl, @namecreator, @modulepath).dump(create_name(servicename))
74
+ end
75
+ end
76
+
77
+ def create_client_skelton(servicename)
78
+ @logger.info { "Creating client skelton." }
79
+ @client_skelton_filename = servicename + 'Client.rb'
80
+ write_file(@client_skelton_filename) do |f|
81
+ f << shbang << "\n"
82
+ f << "require '#{@driver_filename}'\n\n" if @driver_filename
83
+ f << WSDL::SOAP::ClientSkeltonCreator.new(@wsdl, @namecreator, @modulepath).dump(
84
+ create_name(servicename))
85
+ end
86
+ end
87
+
88
+ def create_servant_skelton(servicename)
89
+ @logger.info { "Creating servant skelton." }
90
+ @servant_skelton_filename = servicename + 'Servant' + '.rb'
91
+ write_file(@servant_skelton_filename) do |f|
92
+ f << "require '#{@classdef_filename}'\n\n" if @classdef_filename
93
+ f << WSDL::SOAP::ServantSkeltonCreator.new(@wsdl, @namecreator, @modulepath).dump(
94
+ create_name(servicename))
95
+ end
96
+ end
97
+
98
+ def create_cgi_stub(servicename=nil)
99
+ @logger.info { "Creating CGI stub." }
100
+ @cgi_stubFilename = servicename + '.cgi'
101
+ write_file(@cgi_stubFilename) do |f|
102
+ f << shbang << "\n"
103
+ if @servant_skelton_filename
104
+ f << "require '#{@servant_skelton_filename}'\n\n"
105
+ end
106
+ f << WSDL::SOAP::CGIStubCreator.new(@wsdl, @namecreator, @modulepath).dump(create_name(servicename))
107
+ end
108
+ end
109
+
110
+ def create_standalone_server_stub(servicename=nil)
111
+ @logger.info { "Creating standalone stub." }
112
+ @standalone_server_stub_filename = servicename + '.rb'
113
+ write_file(@standalone_server_stub_filename) do |f|
114
+ f << shbang << "\n"
115
+ f << "require '#{@servant_skelton_filename}'\n\n" if @servant_skelton_filename
116
+ f << WSDL::SOAP::StandaloneServerStubCreator.new(@wsdl, @namecreator, @modulepath).dump(
117
+ create_name(servicename))
118
+ end
119
+ end
120
+
121
+ def write_file(filename)
122
+ check_file(filename) or return
123
+
124
+ if @basedir
125
+ filename = File.join(basedir, filename)
126
+ end
127
+ File.open(filename, "w") do |f|
128
+ yield f
129
+ end
130
+ end
131
+
132
+ def check_file(filename)
133
+ if @basedir
134
+ filename = File.join(basedir, filename)
135
+ end
136
+ if FileTest.exist?(filename)
137
+ if @force
138
+ @logger.warn {
139
+ "File '#{filename}' exists but overrides it."
140
+ }
141
+ true
142
+ else
143
+ @logger.warn {
144
+ "File '#{filename}' exists. #{$0} did not override it."
145
+ }
146
+ false
147
+ end
148
+ else
149
+ @logger.info { "Creates file '#{filename}'." }
150
+ true
151
+ end
152
+ end
153
+
154
+ def shbang
155
+ "#!/usr/bin/env ruby"
156
+ end
157
+
158
+ def create_name(name)
159
+ name ? XSD::QName.new(@wsdl.targetnamespace, name) : nil
160
+ end
161
+
162
+ def import(location)
163
+ WSDL::Importer.import(location)
164
+ end
165
+ end
166
+
167
+ end
168
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
4
+ name: soapex
5
+ version: !ruby/object:Gem::Version
6
+ version: "0.1"
7
+ date: 2008-01-20 00:00:00 -08:00
8
+ summary: A gem that provides extended functionality to the soap4r package
9
+ require_paths:
10
+ - lib
11
+ email: brian.lee.hawthorne at gmail dot com
12
+ homepage: http://example.com
13
+ rubyforge_project:
14
+ description: A gem that provides extended functionality to the soap4r package
15
+ autorequire: soapex
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Brian Hawthorne
31
+ files:
32
+ - LICENSE
33
+ - README
34
+ - Rakefile
35
+ - TODO
36
+ - lib/soapex.rb
37
+ - lib/soapex
38
+ - lib/soapex/wsdl2ruby.rb
39
+ - lib/soapex/error.rb
40
+ - lib/soapex/mapping.rb
41
+ - lib/soapex/driver.rb
42
+ - lib/soapex/services.rb
43
+ - lib/soapex/client.rb
44
+ test_files: []
45
+
46
+ rdoc_options: []
47
+
48
+ extra_rdoc_files:
49
+ - README
50
+ - LICENSE
51
+ - TODO
52
+ executables: []
53
+
54
+ extensions: []
55
+
56
+ requirements:
57
+ - soap4r v 1.5.6 or greater
58
+ - soapex v 0.1 or greater
59
+ dependencies: []
60
+