lib/jasper-rails.rb in jasper-rails-1.0.1 vs lib/jasper-rails.rb in jasper-rails-1.0.2

- old
+ new

@@ -1,22 +1,22 @@ -# +# # Copyright (C) 2012 Marlus Saraiva, Rodrigo Maia -# -# Permission is hereby granted, free of charge, to any person obtaining +# +# Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: -# +# # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. -# +# # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -29,76 +29,113 @@ Mime::Type.register "application/pdf", :pdf end module JasperRails + class << self + attr_accessor :config + end + classpath = '.' Dir["#{File.dirname(__FILE__)}/java/*.jar"].each do |jar| classpath << File::PATH_SEPARATOR + File.expand_path(jar) end - + Dir["lib/*.jar"].each do |jar| classpath << File::PATH_SEPARATOR + File.expand_path(jar) end Rjb::load( classpath, ['-Djava.awt.headless=true','-Xms128M', '-Xmx256M'] ) + Locale = Rjb::import 'java.util.Locale' JRException = Rjb::import 'net.sf.jasperreports.engine.JRException' JasperCompileManager = Rjb::import 'net.sf.jasperreports.engine.JasperCompileManager' JasperExportManager = Rjb::import 'net.sf.jasperreports.engine.JasperExportManager' JasperFillManager = Rjb::import 'net.sf.jasperreports.engine.JasperFillManager' JasperPrint = Rjb::import 'net.sf.jasperreports.engine.JasperPrint' JRXmlUtils = Rjb::import 'net.sf.jasperreports.engine.util.JRXmlUtils' + JREmptyDataSource = Rjb::import 'net.sf.jasperreports.engine.JREmptyDataSource' # This is here to avoid the "already initialized constant QUERY_EXECUTER_FACTORY_PREFIX" warnings. JRXPathQueryExecuterFactory = silence_warnings{Rjb::import 'net.sf.jasperreports.engine.query.JRXPathQueryExecuterFactory'} InputSource = Rjb::import 'org.xml.sax.InputSource' StringReader = Rjb::import 'java.io.StringReader' HashMap = Rjb::import 'java.util.HashMap' ByteArrayInputStream = Rjb::import 'java.io.ByteArrayInputStream' JavaString = Rjb::import 'java.lang.String' JFreeChart = Rjb::import 'org.jfree.chart.JFreeChart' + # Default report params + self.config = { + :report_params=>{ + "REPORT_LOCALE" => Locale.new('en', 'US'), + "XML_LOCALE" => Locale.new('en', 'US'), + "XML_DATE_PATTERN" => 'yyyy-MM-dd' + } + } + module Jasper module Rails def self.render_pdf(jasper_file, datasource, parameters, options) options ||= {} parameters ||= {} jrxml_file = jasper_file.sub(/\.jasper$/, ".jrxml") begin - # Convert the ruby parameters' hash to a java HashMap. - # Pay attention that, for now, all parameters are converted to string! + # Converting default report params to java HashMap jasper_params = HashMap.new - parameters.each do |k,v| - jasper_params.put(JavaString.new(k.to_s), JavaString.new(v.to_s)) + JasperRails.config[:report_params].each do |k,v| + jasper_params.put(k, v) end + # Convert the ruby parameters' hash to a java HashMap, but keeps it as + # default when they already represent a JRB entity. + # Pay attention that, for now, all other parameters are converted to string! + parameters.each do |key, value| + jasper_params.put(JavaString.new(key.to_s), parameter_value_of(value)) + end + # Compile it, if needed if !File.exist?(jasper_file) || (File.exist?(jrxml_file) && File.mtime(jrxml_file) > File.mtime(jasper_file)) JasperCompileManager.compileReportToFile(jrxml_file, jasper_file) end # Fill the report - input_source = InputSource.new - input_source.setCharacterStream(StringReader.new(datasource.to_xml(options).to_s)) - data_document = silence_warnings do - # This is here to avoid the "already initialized constant DOCUMENT_POSITION_*" warnings. - JRXmlUtils._invoke('parse', 'Lorg.xml.sax.InputSource;', input_source) + if datasource + input_source = InputSource.new + input_source.setCharacterStream(StringReader.new(datasource.to_xml(options).to_s)) + data_document = silence_warnings do + # This is here to avoid the "already initialized constant DOCUMENT_POSITION_*" warnings. + JRXmlUtils._invoke('parse', 'Lorg.xml.sax.InputSource;', input_source) + end + + jasper_params.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, data_document) + jasper_print = JasperFillManager.fillReport(jasper_file, jasper_params) + else + jasper_print = JasperFillManager.fillReport(jasper_file, jasper_params, JREmptyDataSource.new) end - jasper_params.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, data_document) - jasper_print = JasperFillManager.fillReport(jasper_file, jasper_params) - # Export it! JasperExportManager._invoke('exportReportToPdf', 'Lnet.sf.jasperreports.engine.JasperPrint;', jasper_print) rescue Exception=>e if e.respond_to? 'printStackTrace' ::Rails.logger.error e.message e.printStackTrace else ::Rails.logger.error e.message + "\n " + e.backtrace.join("\n ") end raise e + end + end + + # Returns the value without conversion when it's converted to Java Types. + # When isn't a Rjb class, returns a Java String of it. + def self.parameter_value_of(param) + # Using Rjb::import('java.util.HashMap').new, it returns an instance of + # Rjb::Rjb_JavaProxy, so the Rjb_JavaProxy parent is the Rjb module itself. + if param.class.parent == Rjb + param + else + JavaString.new(param.to_s) end end end end