Advertisement
Guest User

mzukowski

a guest
Apr 8th, 2008
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 4.34 KB | None | 0 0
  1. require 'soap/rpc/driver'
  2.  
  3. # Modify SOAP::RPC::Proxy class to return SOAP Message in addition to object mapping
  4. # to access the SOAP attachments
  5. # Taken from: http://www.jasperforge.org/index.php?option=com_joomlaboard&Itemid=&func=view&catid=10&id=31754#31754
  6. module SOAP
  7.   module RPC
  8.  
  9.     class Proxy
  10.       include SOAP
  11.      
  12.       def call(name, *params)
  13.         unless op_info = @operation[name]
  14.           raise MethodDefinitionError, "method: #{name} not defined"
  15.         end
  16.         mapping_opt = create_mapping_opt
  17.         req_header = create_request_header
  18.         req_body = SOAPBody.new(
  19.           op_info.request_body(params, @mapping_registry,
  20.             @literal_mapping_registry, mapping_opt)
  21.         )
  22.         reqopt = create_encoding_opt(
  23.           :soapaction => op_info.soapaction || @soapaction,
  24.           :envelopenamespace => @options["soap.envelope.requestnamespace"],
  25.           :default_encodingstyle =>
  26.             @default_encodingstyle || op_info.request_default_encodingstyle,
  27.           :elementformdefault => op_info.elementformdefault,
  28.           :attributeformdefault => op_info.attributeformdefault
  29.         )
  30.         resopt = create_encoding_opt(
  31.           :envelopenamespace => @options["soap.envelope.responsenamespace"],
  32.           :default_encodingstyle =>
  33.             @default_encodingstyle || op_info.response_default_encodingstyle,
  34.           :elementformdefault => op_info.elementformdefault,
  35.           :attributeformdefault => op_info.attributeformdefault
  36.         )
  37.         env = route(req_header, req_body, reqopt, resopt)
  38.         raise EmptyResponseError unless env
  39.         receive_headers(env.header)
  40.         begin
  41.           check_fault(env.body)
  42.         rescue ::SOAP::FaultError => e
  43.           op_info.raise_fault(e, @mapping_registry, @literal_mapping_registry)
  44.         end
  45.         response_obj = op_info.response_obj(env.body, @mapping_registry,
  46.           @literal_mapping_registry, mapping_opt)
  47.         response_obj.instance_variable_set(:@env, env)
  48.         return response_obj
  49.       end
  50.     end
  51.  
  52.   end
  53. end
  54.  
  55.  
  56.  
  57. class JasperSoapClient
  58.   JASPER_URL = "http://your.jasper.server:8080/jasperserver/services/repository"
  59.   JASPER_URN = "urn:"
  60.  
  61.   def initialize(options = {})
  62.     @jasper_username = options[:username]
  63.     @jasper_password = options[:password]
  64.   end
  65.  
  66.   def run_report(report, format, parameters = {})
  67.     jasper = connect
  68.    
  69.     parameters_xml = ""
  70.     parameters.each do |name, value|
  71.       if value.kind_of? Array
  72.         value.each do |item|
  73.           parameters_xml << %{<parameter name="#{name}" isListItem="true">#{@@html_encoder.encode(item, :decimal)}</parameter>\n}
  74.         end
  75.       elsif value.kind_of? Time
  76.         # convert to milisecond timestamp
  77.         ts = value.to_i * 1000
  78.         # adjust for timezone
  79.         ts -= value.utc_offset * 1000
  80.         parameters_xml << %{<parameter name="#{name}">#{ts}</parameter>\n}
  81.       elsif value.kind_of? Integer
  82.         parameters_xml << %{<parameter name="#{name}">#{value}</parameter>\n}
  83.       elsif !value.blank?
  84.         parameters_xml << %{<parameter name="#{name}"><![CDATA[#{value}]]></parameter>\n}
  85.       end
  86.     end
  87.    
  88.     request = %Q|<request operationName="runReport" locale="en">
  89.       <argument name="RUN_OUTPUT_FORMAT">#{format}</argument>
  90.       <resourceDescriptor name="" wsType=""
  91.           uriString="#{report}"
  92.           isNew="false">
  93.         <label>null</label>
  94.         #{parameters_xml}
  95.       </resourceDescriptor>
  96.     </request>|
  97.    
  98.     RAILS_DEFAULT_LOGGER.debug "JasperSoapClient Request:\n#{request}"
  99.  
  100.     result = jasper.runReport(request)
  101.    
  102.     RAILS_DEFAULT_LOGGER.debug "JasperSoapClient Response:\n#{result}"
  103.    
  104.     xml = XmlSimple.xml_in_string(result)
  105.     unless xml['returnCode'].first.to_i == 0
  106.       raise JasperServerError, "JasperServer replied with an error: #{xml['returnMessage'] ? xml['returnMessage'].first : xml.inspect}"
  107.     end
  108.    
  109.     result.instance_variable_get(:@env).external_content['report'].data.content
  110.   end
  111.  
  112.   class JasperServerError < Exception
  113.   end
  114.  
  115.   private
  116.   def connect
  117.     driver = SOAP::RPC::Driver.new(JASPER_URL, JASPER_URN)
  118.     driver.options['protocol.http.basic_auth'] << [JASPER_URL, @jasper_username, @jasper_password]
  119.    
  120.     driver.add_method('runReport', 'requestXmlString')
  121.    
  122.     return driver
  123.   end
  124. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement