Thursday, January 13, 2011

2010 & 2011

I don't have much things to say about my blog in 2010, where I didn't make what I planned for in 2010, but I'd like to take the chance to give special thanks for two guys 
- Bex Huff who made my mind about Oracle UCM by his blog posts (which is now less than before), his components, and the two books he wrote.
- John who helped me so much in some webcenter challenges I faced and his useful comments on my posts.

Last year I became freelance consultant, and in this new year I wish to get more project and establish my own business. Also I am planning to create my first social networking website.

Wednesday, January 5, 2011

Download Jasper Report in ADF format from with ADF Taskflow

I was working on JasperReports and I had a requirement to export those reports to Pdf format. Exporting reports to Pdf by using JasperReports API is straightforward, but download it with ADF may cause an issue if you are doing it inside ADF TaskFlow.

When I google for that I found most people are doing that using Response object by setting headers


      HttpServletResponse response =(HttpServletResponse) context.getExternalContext().getResponse();
      response.setHeader("Content-Disposition", "attachment;filename=\"print.pdf\"");
      response.setContentType("application/x-download");
      OutputStream out = response.getOutputStream();
      JasperExportManager.exportReportToPdfStream(jasperPrint, out);
      context.responseComplete();

This is not working if you are using ADF Taskflow and gives the exception java.net.ProtocolException: Didn't meet stated Content-Length, wrote: '0' bytes instead of stated....; but if you are calling it from within JSPX, it will work. So what we should do with ADF Taskflow? we will do the following


      <af:commandImageLink text="My PDF Download Link"
      id="cil2">
            <af:fileDownloadActionListener contentType="application/x-download"
            filename="print.pdf"
            method="#{backingBeanScope.MyBean.downlaodReport}"/>
      </af:commandImageLink>


      public void printReport(FacesContext facesContext, OutputStream out) {
            //Export to pdf code goes here
            out.close() //close the stream
      }

I think the problem is from the way ADF TaskFlows is being rendered inside page. However best practice is to use what ADF offers which - for downloading files in this case- is  fileDownloadActionListenerOperation.