soapex 0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+