iReport - Path do relatório contendo espaços [RESOLVIDO]

Caros, aqui na empresa nos deparamos com o problema abaixo, já o corrigimos mas como não encontramos uma referência a isto aqui no GUJ resolvi compartilhar a solução que utilizamos.

Tinhamos uma estrutura de projetos parecida com a mostrada abaixo:

Para gerar o utilizamos o seguinte código:


    /**
     * Gera o relatório de logs.
     *
     * @param lines Logs processados que irão compor o relatório.
     * @param reportType Tipo de relatorio a ser gerado, para saber quais tipos sao
     *  suportados consulte a enumeracao: {@link ReportType}.
     *
     * @return array de bytes representando o relatorio no formato indicado
     *
     * @throws JRException
     * @throws Exception
     */
    protected  byte[] generateReport(List<Logs> lines, final ReportType reportType) throws JRException, Exception {
        //Transforma a lista de beans em uma colecao de beans inteligivel para o Jasper
        JRBeanCollectionDataSource  jrBCDS = new JRBeanCollectionDataSource (LogsReportBean.getList(lines));

        //Inclui os parametros
        Map parameters = new HashMap();


        //Preenche o relatorio com os dados. Gera o arquivo *.jrprint
        URL url = this.getClass().getResource("ColllectReport.jasper");
        JasperPrint jasperPrint = JasperFillManager.fillReport(url.getFile(), parameters, jrBCDS);

        //Exporta para o formato PDF
        switch(reportType){
            case PDF: return JasperExportManager.exportReportToPdf(jasperPrint);

            default: throw new IllegalArgumentException(MessagesManager.getInstance().getMessage("messagemanager.report.error.format.not.supported"));
        }
    }

Enquanto o projeto foi distribuido em uma estrutura de pastas que não utilizava espaços nos nomes (como C:/workspace/GujReports) nenhum erro foi detectado, porém quando distribuímos o projeto em uma estrutura com espaços no nome (como C:/projetos de exemplos/pasta com espaços no nome/GujReports) a geração do relatório acusava erro na linha:

JasperPrint jasperPrint = JasperFillManager.fillReport(url.getFile(), parameters, jrBCDS);

Não descobrimos ainda o porquê, mas sabemos que o uso dos caracteres %20 para substituir os espaços em branco no método fillReport causa o lançamento do erro:

Abriu sessao: br.com.guj.hibernate.core.HibernateSession$Owner@11d4ab7
/D:/Arquivos%20de%20Programa/Pasta%20com%20espaço/GujReports/build/web/WEB-INF/classes/br/com/guj/GujReports/model/business/reports/meters/MetersReport.jasper
27/09/2010 13:18:21 br.com.guj.GujReports.model.business.reports.meters.MeterReportPdfGenerator generateReport
GRAVE: null
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
        at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:84)
        at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:243)
        at br.com.guj.GujReports.model.business.reports.meters.MeterReportPdfGenerator.generateReport(MeterReportPdfGenerator.java:41)
        at br.com.guj.GujReports.model.business.reports.meters.MetersReportGenerator.doReport(MetersReportGenerator.java:30)
        at br.com.guj.GujReports.control.reports.meters.MetersReportAction.execute(MetersReportAction.java:56)
        at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at br.com.guj.GujReports.control.filter.hibernate.session.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:59)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
        ... 27 more
27/09/2010 13:18:21 br.com.guj.GujReports.control.reports.meters.MetersReportAction execute
GRAVE: null
Fechou sessao: br.com.guj.hibernate.core.HibernateSession$Owner@11d4ab7
java.lang.RuntimeException: net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
        at br.com.guj.GujReports.model.business.reports.meters.MeterReportPdfGenerator.generateReport(MeterReportPdfGenerator.java:46)
        at br.com.guj.GujReports.model.business.reports.meters.MetersReportGenerator.doReport(MetersReportGenerator.java:30)
        at br.com.guj.GujReports.control.reports.meters.MetersReportAction.execute(MetersReportAction.java:56)
        at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at br.com.guj.GujReports.control.filter.hibernate.session.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:59)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)
Caused by: net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
        at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:84)
        at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:243)
        at br.com.guj.GujReports.model.business.reports.meters.MeterReportPdfGenerator.generateReport(MeterReportPdfGenerator.java:41)
        ... 24 more
Caused by: java.io.FileNotFoundException: D:\Arquivos%20de%20Programa\Pasta%20com%20espaço\GujReports\build\web\WEB-INF\classes\br\com\guj\GujReports\model\business\reports\reports\Generator.jasper
        ... 27 more

Para corrigir substituimos a linha citada acima por esta:

Espero ter ajudado.

Ps. Caso exista uma solução mais elegante ou alguém souber o porquê do erro quando usamos url.getFile() por favor comente.