lib/shapewear/wsdl.rb in shapewear-0.0.2 vs lib/shapewear/wsdl.rb in shapewear-0.0.3

- old
+ new

@@ -1,127 +1,137 @@ require 'builder' -module Shapewear - #noinspection RubyArgCount,RubyResolve - module WSDL - # reference: http://www.w3.org/TR/wsdl - def to_wsdl - tns = options[:wsdl_namespace] || "http://shapewear.elementarsistemas.com.br/auto/#{self.name}.wsdl" - xsd = options[:schema_namespace] || "http://shapewear.elementarsistemas.com.br/auto/#{self.name}.xsd" +#noinspection RubyArgCount,RubyResolve +module Shapewear::WSDL + # reference: http://www.w3.org/TR/wsdl + def to_wsdl + xm = Builder::XmlMarkup.new - xm = Builder::XmlMarkup.new + xm.instruct! + xm.definitions :name => self.name, 'targetNamespace' => namespaces['tns'], + 'xmlns' => namespaces['wsdl'], + 'xmlns:soap' => namespaces['soap'], + 'xmlns:xsd1' => namespaces['xsd1'], + 'xmlns:tns' => namespaces['tns'] do |xdef| - xm.instruct! - xm.definitions :name => self.name, 'targetNamespace' => tns, - 'xmlns' => 'http://schemas.xmlsoap.org/wsdl/', - 'xmlns:soap' => 'http://schemas.xmlsoap.org/wsdl/soap/', - 'xmlns:xsd1' => xsd, 'xmlns:tns' => tns do |xdef| + xdef.types do |xtypes| + xtypes.schema 'xmlns' => namespaces['xsd'], 'targetNamespace' => namespaces['xsd1'] do |xschema| - xdef.types do |xtypes| - xtypes.schema 'xmlns' => 'http://www.w3.org/2000/10/XMLSchema', 'targetNamespace' => xsd do |xschema| - - # define elements for each defined method - instance_methods(false).each do |m| - build_type_elements_for_method(m, xschema) - end + # define elements for each defined method + instance_methods(false).each do |m| + build_type_elements_for_method(m, xschema) end end + end - instance_methods(false).each do |m| - xdef.message :name => "#{m.camelize}Input" do |xmsg| - xmsg.part :name => :body, :element => "xsd1:#{m.camelize}Request" - end unless instance_method(m).arity == 0 - xdef.message :name => "#{m.camelize}Output" do |xmsg| - xmsg.part :name => :body, :element => "xsd1:#{m.camelize}" - end + instance_methods(false).each do |m| + xdef.message :name => "#{m.camelize}Input" do |xmsg| + xmsg.part :name => :body, :element => "xsd1:#{m.camelize}Request" + end unless instance_method(m).arity == 0 + xdef.message :name => "#{m.camelize}Output" do |xmsg| + xmsg.part :name => :body, :element => "xsd1:#{m.camelize}Response" end + end - xdef.portType :name => "#{self.name}PortType" do |xpt| - instance_methods(false).each do |m| - xpt.operation :name => m.camelize do |xop| - xop.input :message => "tns:#{m.camelize}Input" unless instance_method(m).arity == 0 - xop.output :message => "tns:#{m.camelize}Output" - end + xdef.portType :name => "#{self.name}PortType" do |xpt| + instance_methods(false).each do |m| + xpt.operation :name => m.camelize do |xop| + xop.input :message => "tns:#{m.camelize}Input" unless instance_method(m).arity == 0 + xop.output :message => "tns:#{m.camelize}Output" end end + end - xdef.binding :name => "#{self.name}Binding", :type => "tns:#{self.name}PortType" do |xbind| - xbind.tag! 'soap:binding', :style => 'document', :transport => 'http://schemas.xmlsoap.org/soap/http' - instance_methods(false).each do |m| - xbind.operation :name => m.camelize do |xop| - xop.tag! 'soap:operation', :soapAction => "#{tns}/#{m.camelize}" - xop.input { |xin| xin.tag! 'soap:body', :use => 'literal' } unless instance_method(m).arity == 0 - xop.output { |xin| xin.tag! 'soap:body', :use => 'literal' } - end + xdef.binding :name => "#{self.name}Binding", :type => "tns:#{self.name}PortType" do |xbind| + xbind.tag! 'soap:binding', :style => 'document', :transport => 'http://schemas.xmlsoap.org/soap/http' + operations.each do |op, op_opts| + xbind.operation :name => op_opts[:public_name] do |xop| + doc = op_opts[:documentation] rescue nil + xop.documentation doc unless doc.nil? + xop.tag! 'soap:operation', :soapAction => "#{namespaces['tns']}/#{op_opts[:public_name]}" + xop.input { |xin| xin.tag! 'soap:body', :use => 'literal' } unless instance_method(op).arity == 0 + xop.output { |xin| xin.tag! 'soap:body', :use => 'literal' } end end + end - xdef.service :name => self.name do |xsrv| - xsrv.documentation "WSDL auto-generated by shapewear." - xsrv.port :name => "#{self.name}Port", :binding => "#{self.name}Binding" do |xport| - xport.tag! 'soap:address', :location => options[:endpoint_url] - end + xdef.service :name => self.name do |xsrv| + xsrv.documentation "WSDL auto-generated by shapewear." + xsrv.port :name => "#{self.name}Port", :binding => "#{self.name}Binding" do |xport| + xport.tag! 'soap:address', :location => options[:endpoint_url] end end end + end - def build_type_elements_for_method(m, xschema) - # element for method arguments - um = instance_method(m) - op_options = options[:operations][m.to_sym] rescue nil + def build_type_elements_for_method(m, xschema) + # element for method arguments + um = instance_method(m) + op_options = options[:operations][m.to_sym] rescue nil - if um.arity > 0 - xschema.element :name => "#{m.camelize}Request" do |xreq| - xreq.complexType do |xct| - xct.all do |xall| - params = op_options[:parameters] rescue nil - if params.nil? - if um.respond_to?(:parameters) - # with Ruby 1.9, we can create the parameters with the correct names - params = um.parameters.select { |p| p.first == :in }.map { |p| [p.first, Object] } - else - params = (0..um.arity).map { |i| ["arg#{i}", Object] } - end + if um.arity > 0 + xschema.element :name => "#{op_options[:public_name]}Request" do |xreq| + xreq.complexType do |xct| + xct.all do |xall| + params = op_options[:parameters] rescue nil + if params.nil? + if um.respond_to?(:parameters) + # with Ruby 1.9, we can create the parameters with the correct names + params = um.parameters.select { |p| p.first == :in }.map { |p| [p.first, Object] } + else + params = (0..um.arity).map { |i| ["arg#{i}", Object] } end + end - params.each do |p| - xall.element :name => p.first, :type => to_xsd_type(p.last) + params.each do |p| + t = p.last + if t.nil? + xall.element :name => p.first, :type => 'xsd:any' + elsif t.is_a?(Class) + xall.element :name => p.first, :type => to_xsd_type(t) + elsif t.is_a?(Hash) + xall.complexType do |xct2| + xct2.all do |xall2| + t.each do |name, type| + xall2.element :name => name, :type => to_xsd_type(type) + end + end + end + else + raise "Could not interpret #{t.inspect} as a return type definition" end end end end end + end - # element for method result - xschema.element :name => "#{m.camelize}" do |xreq| - xreq.complexType do |xct| - xct.all do |xall| - ret = op_options[:returns] rescue nil - if ret.nil? - xall.element :name => 'result', :type => 'xsd:any' - elsif ret.is_a?(Class) - xall.element :name => 'result', :type => to_xsd_type(ret) - elsif ret.is_a?(Hash) - ret.each do |name, type| - xall.element :name => name, :type => to_xsd_type(type) - end - else - raise "Could not interpret #{ret.inspect} as a return type definition" + # element for method result + xschema.element :name => "#{op_options[:public_name]}" do |xreq| + xreq.complexType do |xct| + xct.all do |xall| + ret = op_options[:returns] rescue nil + if ret.nil? + xall.element :name => 'result', :type => 'xsd:any' + elsif ret.is_a?(Class) + xall.element :name => 'result', :type => to_xsd_type(ret) + elsif ret.is_a?(Hash) + ret.each do |name, type| + xall.element :name => name, :type => to_xsd_type(type) end + else + raise "Could not interpret #{ret.inspect} as a return type definition" end end end end + end - def to_xsd_type(t) - if t.is_a?(Class) - return 'xsd:string' if t == String - return 'xsd:integer' if t == Fixnum - return 'xsd:dateTime' if t == DateTime - return 'xsd:any' if t == Object - raise "Could not convert type #{t} to a valid XSD type" - elsif t.is_a?(Hash) - '??' - end - end + # @param t [Class] + def to_xsd_type(t) + return 'xsd:string' if t == String + return 'xsd:integer' if t == Fixnum + return 'xsd:dateTime' if t == DateTime + return 'xsd:any' if t.nil? || t == Object + raise "Could not convert type #{t} to a valid XSD type" end end