<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Technology Bits and Bytes &#187; kapil</title>
	<atom:link href="http://blogs.circlesource.com/author/kapil/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.circlesource.com</link>
	<description>CircleSource Technical Talent ShowCase</description>
	<lastBuildDate>Thu, 10 Dec 2009 20:01:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Battling with java.lang.IllegalStateException: getWriter() has already been called for this response</title>
		<link>http://blogs.circlesource.com/2009/01/08/89/</link>
		<comments>http://blogs.circlesource.com/2009/01/08/89/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 07:04:25 +0000</pubDate>
		<dc:creator>kapil</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blogs.circlesource.com/?p=89</guid>
		<description><![CDATA[

 
 
I had a requirement to generate reports as PDF file which will also includes the charts and download them at client&#8217;s system. For creating charts, I was using Chart FX 6.5 (Product of Software FX). 
 
And as a part of framework I created a JAVA class which will create the Charts images [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><strong><span style="font-size: 15pt; font-family: Calibri;"><em><br />
</em></span></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">I had a requirement to generate reports as <strong>PDF </strong>file which will also includes the charts and download them at client&#8217;s system. For creating charts, I was using <strong>Chart FX 6.5</strong> (Product of Software FX). </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">And as a part of framework I created a <strong>JAVA </strong>class which will create the Charts images and return path of the Chart images.(This <strong>JAVA</strong> class was called by controller, a <strong>SERVLET</strong>).</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">There are two constructors for creating ChartServer object. This object is used to design the Chart and assign the values of charts. Lately Chart can be generated by this object.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><strong><span style="font-family: Calibri;font-size: 12pt">1)<span> </span><em>ChartServer chart = new ChartServer();</em></span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: Calibri;font-size: 12pt">2)<span> </span><em>ChartServer chart = new ChartServer(servletContext, request, response);</em></span></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">Initially I used the first option to create Charts.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">I saved a path of a creating image in a String variable.</span></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt">path = chart.getHtmlTag(&#8220;1070&#8243;, &#8220;500&#8243;, &#8220;PNG&#8221;);</span></em></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">and returned this path back to Controller. After all these <strong>CONTROLLER </strong>will call a method which will create the report with charts in <strong>PDF</strong> and send the <strong>PDF </strong>file to the client.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">When application is running and I try to download a <strong>PDF </strong>file, sometimes it was downloading <strong>PDF </strong>and sometimes it was giving following error.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt">NullPointerException</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt">chart.getHtmlTag(Unknown source)</span></em></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">I had a feeling that ChartFX was not finding the context path to generate the Charts. Finally came out know that at many places ChartServer internally uses Application context.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">So I decided to go to second constructor of ChartServer.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt">ChartServer chart = new ChartServer(servletContext, request, response);</span></em></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">For sending <strong>PDF </strong>to client browser I created a method in controller which is the end point of the request.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt">private void doDownload(final HttpServletResponse resp,</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>final String filename, final String originalFilename, final String reportType)</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>throws IOException {</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>File f = new File(filename);</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>int length = Constants.ZER0;</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>ServletOutputStream op = resp.getOutputStream();</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>resp.setContentType(&#8220;application/PDF;charset=UTF-8&#8243;);</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>resp.setContentLength((int) f.length());</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>resp.setHeader(&#8220;Content-Disposition&#8221;, &#8220;attachment; filename=&#8221;" + originalFilename + &#8220;&#8221;");</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>byte[] bbuf = new byte[Constants.FIVE_HUNDRED];</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>DataInputStream in = new DataInputStream(new FileInputStream(f));</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>while ((in != null) &amp;&amp; ((length = in.read(bbuf)) != -1)) {</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>op.write(bbuf, Constants.ZER0, length);</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>}</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>in.close();</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>op.flush();</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>op.close();</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>if (f.exists()) {</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>f.delete();</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>}</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>}</span></em></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">By doing this, I faced another awesome problem.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt">java.lang.IllegalStateException: getWriter() has already been called for this response</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>org.apache.catalina.connector.Response.getOutputStream(Response.java:576)</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:181)</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>javax.servlet.http.HttpServlet.service(HttpServlet.java:627)</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>javax.servlet.http.HttpServlet.service(HttpServlet.java:729)</span></em></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">Oops !! Another exception in developer’s life. </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">I debugged it and found that everything is going fine before the following line which responsible for generating the Chart image.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt">path = chart.getHtmlTag(&#8220;1070&#8243;, &#8220;500&#8243;, &#8220;PNG&#8221;);</span></em></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">Exception is coming on this line. So, I believed that ChartServer internally calls getWriter() of ServletResponse.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">Now I wanted to know whether Response has been committed or not. I used <em>isCommitted</em> method of Servlet Response (Used it in Controller, separate java class and in doDownload method before ServletOutputStream was being opened) to find it out whether response has been committed or not. But no luck every where I got it as false.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">I tried something different this time, I used <strong>JSP </strong>instead of java class, because in <strong>JSP </strong>no need to pass context as a parameter. So, I wrote chart code in <strong>JSP </strong>to create Charts and forwarded the request to another controller which will create the <strong>PDF </strong>file.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">My flow was </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><strong><span style="font-family: Calibri;font-size: 12pt">Controller &#8212;&#8212;&gt; JSP &#8212;&#8212;&#8211;&gt; Controller</span></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">But these time also no luck. Same old exception.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><em><span style="font-family: Calibri;font-size: 12pt"><strong>java.lang.IllegalStateException: getWriter() </strong>has already been called for this response</span></em></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">After a lots of trial and error, I decided to reset buffer of the Servlet Response, Following method I used <em>response.resetBuffer()</em> from Servlet Response before I generate the PDF file.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">But exception was luckier then me and came all over again.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">Then I tried to reset the Servlet Response too using <em>reset()</em> method of Servlet Response.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">This time I didn&#8217;t get any error/exception and my <strong>PDF </strong>was generating with appropriate charts and I was able to download it from my Browser too.</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">So my final <strong>PDF </strong>creation and downloading method is</span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt">public void doDownloadPDF(HttpServletResponse response, </span></em></strong></p>
<p class="MsoNormal" style="margin-left: 0.5in; text-indent: 0.5in;"><strong><em><span style="font-family: Calibri;font-size: 12pt">String jasperFilename, String PDFFilename,</span></em></strong></p>
<p class="MsoNormal" style="margin-left: 0.5in; text-indent: 0.5in;"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>Map reportParams, JRDataSource dataSource) throws IOException {</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>InputStream jasperStream = this.getClass().getClassLoader().getResourceAsStream(</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>jasperFilename + &#8220;.jasper&#8221;);</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>response.reset();</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>response.resetBuffer(); //This may not required but I feel good to have this.</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal" style="margin-left: 21pt;"><strong><em><span style="font-family: Calibri;font-size: 12pt">response.setContentType(&#8220;application/PDF;charset=UTF-8&#8243;);<span> </span> response.setHeader(&#8220;Content-Disposition&#8221;, &#8220;attachment; filename=&#8221;" + PDFFilename + &#8220;.PDF&#8221; + &#8220;&#8221;");</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span></span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal" style="text-indent: 21pt;"><strong><em><span style="font-family: Calibri;font-size: 12pt">//getting jasperReport by loading jasper file</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>JasperReport jasperReport;</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>try {</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>jasperReport = (JasperReport) JRLoader.loadObject(jasperStream);</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>//getting jasper Print by filling the report</span></em></strong></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, reportParams, dataSource);</span></em></strong></p>
<p class="MsoNormal" style="margin-left: 0.5in; text-indent: 2.25pt;"><strong><em><span style="font-family: Calibri;font-size: 12pt">JasperExportManager.exportReportToPDFStream(jasperPrint, response.getOutputStream());</span></em></strong></p>
<p class="MsoNormal" style="text-indent: 0.5in;"><strong><em><span style="font-family: Calibri;font-size: 12pt"> </span></em></strong></p>
<p class="MsoNormal" style="text-indent: 0.5in;"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>response.getOutputStream().flush();</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span><span> </span><span> </span>response.getOutputStream().close();</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>} catch (JRException ex) {</span></em></strong></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>Logger.getLogger(JasperReportController.class.getName()).log(Level.SEVERE, null, ex);</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>}</span></em></strong></p>
<p class="MsoNormal"><strong><em><span style="font-family: Calibri;font-size: 12pt"><span> </span>}</span></em></strong></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">Now my <strong>PDFs </strong>are generating without any problem. I am using <strong>JRE 1.5 and Tomcat 5.5.27</strong>. </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt"> </span></p>
<p class="MsoNormal"><span style="font-family: Calibri;font-size: 12pt">A battle of a Developer has been appreciated by the Exception and Exception is now demolished!! <img src='http://blogs.circlesource.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.circlesource.com/2009/01/08/89/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
