Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'soap/rpc/driver'
- # Modify SOAP::RPC::Proxy class to return SOAP Message in addition to object mapping
- # to access the SOAP attachments
- # Taken from: http://www.jasperforge.org/index.php?option=com_joomlaboard&Itemid=&func=view&catid=10&id=31754#31754
- module SOAP
- module RPC
- class Proxy
- include SOAP
- def call(name, *params)
- unless op_info = @operation[name]
- raise MethodDefinitionError, "method: #{name} not defined"
- end
- mapping_opt = create_mapping_opt
- req_header = create_request_header
- req_body = SOAPBody.new(
- op_info.request_body(params, @mapping_registry,
- @literal_mapping_registry, mapping_opt)
- )
- reqopt = create_encoding_opt(
- :soapaction => op_info.soapaction || @soapaction,
- :envelopenamespace => @options["soap.envelope.requestnamespace"],
- :default_encodingstyle =>
- @default_encodingstyle || op_info.request_default_encodingstyle,
- :elementformdefault => op_info.elementformdefault,
- :attributeformdefault => op_info.attributeformdefault
- )
- resopt = create_encoding_opt(
- :envelopenamespace => @options["soap.envelope.responsenamespace"],
- :default_encodingstyle =>
- @default_encodingstyle || op_info.response_default_encodingstyle,
- :elementformdefault => op_info.elementformdefault,
- :attributeformdefault => op_info.attributeformdefault
- )
- env = route(req_header, req_body, reqopt, resopt)
- raise EmptyResponseError unless env
- receive_headers(env.header)
- begin
- check_fault(env.body)
- rescue ::SOAP::FaultError => e
- op_info.raise_fault(e, @mapping_registry, @literal_mapping_registry)
- end
- response_obj = op_info.response_obj(env.body, @mapping_registry,
- @literal_mapping_registry, mapping_opt)
- response_obj.instance_variable_set(:@env, env)
- return response_obj
- end
- end
- end
- end
- class JasperSoapClient
- JASPER_URL = "http://your.jasper.server:8080/jasperserver/services/repository"
- JASPER_URN = "urn:"
- def initialize(options = {})
- @jasper_username = options[:username]
- @jasper_password = options[:password]
- end
- def run_report(report, format, parameters = {})
- jasper = connect
- parameters_xml = ""
- parameters.each do |name, value|
- if value.kind_of? Array
- value.each do |item|
- parameters_xml << %{<parameter name="#{name}" isListItem="true">#{@@html_encoder.encode(item, :decimal)}</parameter>\n}
- end
- elsif value.kind_of? Time
- # convert to milisecond timestamp
- ts = value.to_i * 1000
- # adjust for timezone
- ts -= value.utc_offset * 1000
- parameters_xml << %{<parameter name="#{name}">#{ts}</parameter>\n}
- elsif value.kind_of? Integer
- parameters_xml << %{<parameter name="#{name}">#{value}</parameter>\n}
- elsif !value.blank?
- parameters_xml << %{<parameter name="#{name}"><![CDATA[#{value}]]></parameter>\n}
- end
- end
- request = %Q|<request operationName="runReport" locale="en">
- <argument name="RUN_OUTPUT_FORMAT">#{format}</argument>
- <resourceDescriptor name="" wsType=""
- uriString="#{report}"
- isNew="false">
- <label>null</label>
- #{parameters_xml}
- </resourceDescriptor>
- </request>|
- RAILS_DEFAULT_LOGGER.debug "JasperSoapClient Request:\n#{request}"
- result = jasper.runReport(request)
- RAILS_DEFAULT_LOGGER.debug "JasperSoapClient Response:\n#{result}"
- xml = XmlSimple.xml_in_string(result)
- unless xml['returnCode'].first.to_i == 0
- raise JasperServerError, "JasperServer replied with an error: #{xml['returnMessage'] ? xml['returnMessage'].first : xml.inspect}"
- end
- result.instance_variable_get(:@env).external_content['report'].data.content
- end
- class JasperServerError < Exception
- end
- private
- def connect
- driver = SOAP::RPC::Driver.new(JASPER_URL, JASPER_URN)
- driver.options['protocol.http.basic_auth'] << [JASPER_URL, @jasper_username, @jasper_password]
- driver.add_method('runReport', 'requestXmlString')
- return driver
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement