I want to use multiple wsdls with conflicting class definitions, so i am forced to stuff all classes of one wsdl in a module. Here's my patch so that soap4r respects ruby namespaces:
Index: soap4r-1_5_5/lib/soap/rpc/proxy.rb
===================================================================
--- soap4r-1_5_5/lib/soap/rpc/proxy.rb (revision 3915)
+++ soap4r-1_5_5/lib/soap/rpc/proxy.rb (working copy)
@@ -31,6 +31,7 @@
attr_accessor :generate_explicit_type
attr_reader :headerhandler
attr_reader :streamhandler
+ attr_accessor :ruby_namespace
attr_accessor :mapping_registry
attr_accessor :literal_mapping_registry
Index: soap4r-1_5_5/lib/soap/rpc/driver.rb
===================================================================
--- soap4r-1_5_5/lib/soap/rpc/driver.rb (revision 3915)
+++ soap4r-1_5_5/lib/soap/rpc/driver.rb (working copy)
@@ -68,6 +68,7 @@
attr_reader :proxy
attr_reader :options
attr_accessor :soapaction
+ attr_accessor :ruby_namespace
def inspect
"#<#{self.class}:#{@proxy.inspect}>"
@@ -105,12 +106,15 @@
optionsprotocol.wiredump_file_base? = wiredump_file_base
end
- def initialize(endpoint_url, namespace = nil, soapaction = nil)
+ def initialize(endpoint_url, namespace = nil, soapaction = nil, ruby_namespace = nil)
@namespace = namespace
@soapaction = soapaction
@options = setup_options
@wiredump_file_base = nil
@proxy = Proxy.new(endpoint_url, @soapaction, @options)
+ @ruby_namespace = (!ruby_namespace && self.class.respond_to?(:parents)) ? self.class.parents[0] : ruby_namespace
+ @proxy.ruby_namespace = @ruby_namespace
+ @proxy.literal_mapping_registry.ruby_namespace = @ruby_namespace
end
def loadproperty(propertyname)
Index: soap4r-1_5_5/lib/soap/mapping/wsdlliteralregistry.rb
===================================================================
--- soap4r-1_5_5/lib/soap/mapping/wsdlliteralregistry.rb (revision 3916)
+++ soap4r-1_5_5/lib/soap/mapping/wsdlliteralregistry.rb (working copy)
@@ -22,6 +22,7 @@
attr_reader :definedtypes
attr_accessor :excn_handler_obj2soap
attr_accessor :excn_handler_soap2obj
+ attr_accessor :ruby_namespace
def initialize(definedtypes = XSD::NamedElements::Empty,
definedelements = XSD::NamedElements::Empty)
@@ -255,10 +256,15 @@
obj
end
+ def class_from_name(name)
+ obj_class = Mapping.class_from_name(name)
+ obj_class = Mapping.class_from_name("#{@ruby_namespace.to_s}::#{name}") if (@ruby_namespace && !obj_class) ; obj_class
+ end
+
def any2obj(node, obj_class = nil)
unless obj_class
typestr = XSD::CodeGen::GenSupport?.safeconstname(node.elename.name)
- obj_class = Mapping.class_from_name(typestr)
+ obj_class = class_from_name(typestr)
end
if obj_class and obj_class.class_variables.include?('@@schema_element')
soapele2stubobj(node, obj_class)
@@ -293,7 +299,7 @@
item = elements.find { |k, v| k.name == name }
if item
elename, class_name = item
- if klass = Mapping.class_from_name(class_name)
+ if klass = class_from_name(class_name)
# klass must be a SOAPBasetype or a class
if klass.ancestors.include?(::SOAP::SOAPBasetype)
if value.respond_to?(:data)
@@ -333,7 +339,7 @@
attributes.each do |qname, class_name|
attr = node.extraattr[qname]
next if attr.nil? or attr.empty?
- klass = Mapping.class_from_name(class_name)
+ klass = class_from_name(class_name)
if klass.ancestors.include?(::SOAP::SOAPBasetype)
child = klass.new(attr).data
else