d77e6bc7b1e81749e778a8e633c347050d3c42a7
[portal/sdk.git] /
1 /*
2  * ============LICENSE_START==========================================
3  * ONAP Portal SDK
4  * =================================================================== 
5  * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * ===================================================================
7  *
8  * Unless otherwise specified, all software contained herein is licensed
9  * under the Apache License, Version 2.0 (the "License");
10  * you may not use this software except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *             http://www.apache.org/licenses/LICENSE-2.0 
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  * Unless otherwise specified, all documentation contained herein is licensed
22  * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
23  * you may not use this documentation except in compliance with the License.
24  * You may obtain a copy of the License at
25  *
26  *             https://creativecommons.org/licenses/by/4.0/
27  *
28  * Unless required by applicable law or agreed to in writing, documentation
29  * distributed under the License is distributed on an "AS IS" BASIS,
30  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31  * See the License for the specific language governing permissions and
32  * limitations under the License.
33  *
34  * ============LICENSE_END============================================
35  *
36  * 
37  */
38
39 /* ===========================================================================================
40  * This class is part of <I>RAPTOR (Rapid Application Programming Tool for OLAP Reporting)</I> 
41  * Raptor : This tool is used to generate different kinds of reports with lot of utilities
42  * ===========================================================================================
43  *
44  * -------------------------------------------------------------------------------------------
45  * PdfReportHandler.java - This class is used to generate reports in PDF using iText 
46  * -------------------------------------------------------------------------------------------
47  *
48  *
49  * Changes
50  * -------
51  * 14-Jul-2009 : Version 8.4 (Sundar); <UL> 
52  *                                     <LI> Dashboard reports can be downloaded with each report occupying separate page including its charts. </LI>
53  *                                     </UL>   
54  *
55  */
56 package org.onap.portalsdk.analytics.model.pdf;
57
58 import com.lowagie.text.BadElementException;
59 import com.lowagie.text.Chunk;
60 import com.lowagie.text.Document;
61 import com.lowagie.text.DocumentException;
62 import com.lowagie.text.Element;
63 import com.lowagie.text.ElementTags;
64 import com.lowagie.text.Font;
65 import com.lowagie.text.FontFactory;
66 import com.lowagie.text.Image;
67 import com.lowagie.text.PageSize;
68 import com.lowagie.text.Paragraph;
69 import com.lowagie.text.Phrase;
70 import com.lowagie.text.Rectangle;
71 import com.lowagie.text.html.simpleparser.HTMLWorker;
72 import com.lowagie.text.html.simpleparser.StyleSheet;
73 import com.lowagie.text.pdf.PdfPCell;
74 import com.lowagie.text.pdf.PdfPTable;
75 import com.lowagie.text.pdf.PdfWriter;
76 import java.awt.Color;
77 import java.io.File;
78 import java.io.FileNotFoundException;
79 import java.io.IOException;
80 import java.io.OutputStream;
81 import java.io.StringReader;
82 import java.net.MalformedURLException;
83 import java.sql.Connection;
84 import java.sql.ResultSet;
85 import java.sql.ResultSetMetaData;
86 import java.sql.SQLException;
87 import java.sql.Statement;
88 import java.text.SimpleDateFormat;
89 import java.util.ArrayList;
90 import java.util.Calendar;
91 import java.util.Date;
92 import java.util.HashMap;
93 import java.util.Iterator;
94 import java.util.List;
95 import java.util.Map;
96 import java.util.Map.Entry;
97 import java.util.Set;
98 import java.util.TimeZone;
99 import java.util.TreeMap;
100 import java.util.Vector;
101 import javax.servlet.http.HttpServletRequest;
102 import javax.servlet.http.HttpServletResponse;
103 import javax.servlet.http.HttpSession;
104 import org.onap.portalsdk.analytics.error.RaptorException;
105 import org.onap.portalsdk.analytics.error.ReportSQLException;
106 import org.onap.portalsdk.analytics.model.ReportHandler;
107 import org.onap.portalsdk.analytics.model.ReportLoader;
108 import org.onap.portalsdk.analytics.model.base.IdNameValue;
109 import org.onap.portalsdk.analytics.model.definition.ReportDefinition;
110 import org.onap.portalsdk.analytics.model.runtime.ReportRuntime;
111 import org.onap.portalsdk.analytics.system.AppUtils;
112 import org.onap.portalsdk.analytics.system.ConnectionUtils;
113 import org.onap.portalsdk.analytics.system.Globals;
114 import org.onap.portalsdk.analytics.util.AppConstants;
115 import org.onap.portalsdk.analytics.util.DataSet;
116 import org.onap.portalsdk.analytics.util.HtmlStripper;
117 import org.onap.portalsdk.analytics.util.Utils;
118 import org.onap.portalsdk.analytics.view.ColumnHeader;
119 import org.onap.portalsdk.analytics.view.ColumnHeaderRow;
120 import org.onap.portalsdk.analytics.view.DataRow;
121 import org.onap.portalsdk.analytics.view.DataValue;
122 import org.onap.portalsdk.analytics.view.HtmlFormatter;
123 import org.onap.portalsdk.analytics.view.ReportData;
124 import org.onap.portalsdk.analytics.view.RowHeader;
125 import org.onap.portalsdk.analytics.view.RowHeaderCol;
126 import org.onap.portalsdk.analytics.xmlobj.DataColumnType;
127 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; 
128
129 /**
130  * @author mwliu and sundar
131  *
132  */
133 public class PdfReportHandler extends org.onap.portalsdk.analytics.RaptorObject{
134
135         private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(PdfReportHandler.class);
136
137         private PdfBean pb;
138         private HtmlStripper strip = new HtmlStripper();
139         private static final int RetryCreateNewImage = 3;
140         private int retryCreateNewImageCount=0;
141
142         private String FONT_FAMILY = "Arial";
143         private int FONT_SIZE = 9;
144         
145         public PdfReportHandler() {     }
146
147         public void createPdfFileContent(HttpServletRequest request, HttpServletResponse response, int type) throws IOException, RaptorException {
148
149                 Document document = new Document();
150                 ReportHandler rh = new ReportHandler();
151         String formattedDate = new SimpleDateFormat("MMddyyyyHHmm").format(new Date());
152                 String pdfFName = "";
153                 String user_id = AppUtils.getUserID(request);
154                 response.reset();
155                 response.setContentType("application/pdf");
156                 OutputStream outStream = response.getOutputStream();
157         
158         String formattedReportName = "";
159         PdfWriter writer = null;
160         ReportRuntime firstReportRuntimeObj = null;
161         int returnValue = 0;
162
163         ReportRuntime rr = null;
164         if(rr==null)
165             rr = (ReportRuntime) request.getSession().getAttribute(AppConstants.SI_REPORT_RUNTIME);
166         
167         boolean isDashboard = false;
168         if ((request.getSession().getAttribute(AppConstants.SI_DASHBOARD_REP_ID)!=null) && ( ((String) request.getSession().getAttribute(AppConstants.SI_DASHBOARD_REP_ID)).equals(rr.getReportID())) ) {
169                 isDashboard = true;
170         }
171                 if(isDashboard) {
172                         try {
173                                         String reportID = (String) request.getSession().getAttribute(AppConstants.SI_DASHBOARD_REP_ID);
174                                         ReportRuntime rrDash = rh.loadReportRuntime(request, reportID, true, 1);
175                                         pb = preparePdfBean(request,rrDash);
176                 
177                                         // Setting pb Values
178                                 document.setPageSize(PageSize.getRectangle(pb.getPagesize()));
179                                         if(!pb.isPortrait()) // get this from properties file
180                                                 document.setPageSize(document.getPageSize().rotate());
181                                 
182                                 //                      
183                                         writer = PdfWriter.getInstance(document, response.getOutputStream());
184                                         writer.setPageEvent(new PageEvent(pb));//header,footer,bookmark
185                                         document.open();
186
187                                         formattedReportName = new HtmlStripper().stripSpecialCharacters(rrDash.getReportName());
188                                 if(pb.isAttachmentOfEmail())
189                                         response.setHeader("Content-disposition", "inline");
190                                 else
191                                         response.setHeader("Content-disposition", "attachment;filename="+ formattedReportName+formattedDate+user_id+".pdf");
192                                         
193                                         pdfFName = "dashboard"+formattedReportName+formattedDate+user_id+".pdf";
194                                         Map reportRuntimeMap = null;
195                                         Map reportDataMap = null;
196                                         Map reportDisplayTypeMap = null;
197
198                                         reportRuntimeMap                        = (TreeMap) request.getSession().getAttribute(AppConstants.SI_DASHBOARD_REPORTRUNTIME_MAP);
199                                         reportDataMap                           = (TreeMap) request.getSession().getAttribute(AppConstants.SI_DASHBOARD_REPORTDATA_MAP);
200                                         reportDisplayTypeMap            = (TreeMap) request.getSession().getAttribute(AppConstants.SI_DASHBOARD_DISPLAYTYPE_MAP);
201
202                                         if(reportRuntimeMap!=null) {
203                                                 //ServletOutputStream sos = response.getOutputStream();
204                                                 Set setReportRuntime            = reportRuntimeMap.entrySet();
205                                                 Set setReportDataMap            = reportDataMap.entrySet();
206                                                 Set setReportDisplayTypeMap = reportDisplayTypeMap.entrySet();
207                                                 
208                                                 Iterator iter2 = setReportDataMap.iterator();
209                                                 Iterator iter3 = setReportDisplayTypeMap.iterator();
210                                 int count = 0;
211                                                 for(Iterator iter = setReportRuntime.iterator(); iter.hasNext(); ) {
212                                                         count++;
213                                                         Map.Entry entryData             = (Entry) iter2.next();
214                                                         Map.Entry entry                         = (Entry) iter.next();
215                                                         Map.Entry entryCheckChart       = (Entry) iter3.next();
216                                                         //String rep_id                                 = (String) entry.getKey();
217                                                         ReportRuntime rrDashRep         = (ReportRuntime) entry.getValue();
218                                                         
219                                                         if(count == 1)  { 
220                                                                 firstReportRuntimeObj = (ReportRuntime) entry.getValue();
221                                                                 if(pb.isCoverPageIncluded()) {
222                                                                         document = paintDashboardCoverPage(document, rrDash, firstReportRuntimeObj, request);
223                                                                 }
224                                                         }
225                                                         ReportData rdDashRep            = (ReportData) entryData.getValue();
226                                                 int col = 0;
227                                                 //pb.setDisplayChart(nvl(rr.getChartType()).trim().length()>0 && rr.getDisplayChart());
228                                                         if( ((rrDashRep.getChartType()).trim().length()>0 && rrDashRep.getDisplayChart()) && entryCheckChart.getValue().toString().equals("c")) {
229                                                                 document.newPage();
230                                                                 pb.setTitle(nvl(rrDashRep.getReportTitle()).length()>0?rrDashRep.getReportTitle():rrDashRep.getReportName());
231                                                                 paintPdfImage(request, document,AppUtils.getTempFolderPath()+"cr_"+  pb.getUserId()+"_"+request.getSession().getId()+"_"+rrDashRep.getReportID()+".png", rrDashRep);
232                                                         } else {
233                                                                 document.newPage();
234                                                                 pb.setTitle(nvl(rrDashRep.getReportTitle()).length()>0?rrDashRep.getReportTitle():rrDashRep.getReportName());
235                                                                 paintPdfData(request, document,rdDashRep,rrDashRep, "");
236                                                         }
237                                                 }
238                                         
239                                 }
240                         } catch (DocumentException dex) {
241                             logger.error(EELFLoggerDelegate.errorLogger, "DocumentException in createPdfFileContent", dex);
242                         }
243                         catch (RaptorException rex) {
244                             logger.error(EELFLoggerDelegate.errorLogger, "RaptorException in createPdfFileContent", rex);
245                         }
246                 } else {
247
248                         //ReportRuntime rr = (ReportRuntime) request.getSession().getAttribute(AppConstants.SI_REPORT_RUNTIME);
249                         //ReportData    rd = (ReportData)    request.getSession().getAttribute(AppConstants.RI_REPORT_DATA);
250                         rr = null;
251                         ReportData rd = null;
252                         String parent = "";
253                         int parentFlag = 0;
254                         if(!nvl(request.getParameter("parent"), "").equals("N"))
255                                 parent = nvl(request.getParameter("parent"), "");
256                         if(parent.startsWith("parent_"))
257                                 parentFlag = 1;
258                         if(parentFlag == 1) {
259                                 rr = (ReportRuntime) request.getSession().getAttribute(parent+"_rr");
260                                 rd = (ReportData) request.getSession().getAttribute(parent+"_rd");
261                         }
262                         if(rr==null)
263                                 rr = (ReportRuntime) request.getSession().getAttribute(AppConstants.SI_REPORT_RUNTIME);
264                         if(rd==null)
265                                 rd = (ReportData)    request.getSession().getAttribute(AppConstants.RI_REPORT_DATA);
266                         
267                         pb = preparePdfBean(request,rr);
268                         FONT_FAMILY = rr.getPDFFont();
269                         FONT_SIZE = rr.getPDFFontSize();
270                         //System.out.println(pb);
271                                         
272                         formattedReportName = new HtmlStripper().stripSpecialCharacters(rr.getReportName());
273                         
274                         
275                         
276                 response.setContentType("application/pdf");
277                 if(pb.isAttachmentOfEmail())
278                         response.setHeader("Content-disposition", "inline");
279                 else
280                         response.setHeader("Content-disposition", "attachment;filename="+ formattedReportName+formattedDate+user_id+".pdf");
281                         
282                         document.setPageSize(PageSize.getRectangle(pb.getPagesize()));
283                         
284                         if(!pb.isPortrait()) // get this from properties file
285                                 document.setPageSize(document.getPageSize().rotate());
286         
287                         try {
288                                 
289                                 writer = PdfWriter.getInstance(document, outStream);
290                                 writer.setPageEvent(new PageEvent(pb));//header,footer,bookmark
291                                 document.open();
292                                 
293                                 //System.out.println("Document 1 " + document);
294                                 if(pb.isCoverPageIncluded()) {
295                                         document = paintCoverPage(document, rr, request);
296                                 }
297                                 
298                                 //boolean isImageRotate = false;
299                                 //System.out.println("Document 2 " + document);
300         
301                                 if(pb.isDisplayChart()) {
302                                         paintPdfImage(request, document,AppUtils.getTempFolderPath()+"cr_"+  pb.getUserId()+"_"+request.getSession().getId()+"_"+rr.getReportID()+".png", rr);
303                                 }
304                                 //System.out.println("Document 4" + document);
305         
306                                 document.newPage();
307                         if(type == 3 && rr.getSemaphoreList()==null && !(rr.getReportType().equals(AppConstants.RT_CROSSTAB)) ) { //type = 3 is whole
308                                 String sql_whole = (String) request.getAttribute(AppConstants.RI_REPORT_SQL_WHOLE);
309                                 returnValue = paintPdfData(request, document, rd, rr, sql_whole);
310                         } else if(type == 2) {
311                                 returnValue = paintPdfData(request, document, rd, rr, "");
312                         } else {
313                                 //String sql_whole = (String) request.getAttribute(AppConstants.RI_REPORT_SQL_WHOLE);
314                                         int downloadLimit = (rr.getMaxRowsInExcelDownload()>0)?rr.getMaxRowsInExcelDownload():Globals.getDownloadLimit();
315                                         String action = request.getParameter(AppConstants.RI_ACTION);
316
317                                         if(!(rr.getReportType().equals(AppConstants.RT_CROSSTAB)) && !action.endsWith("session"))
318                                                 rd              = rr.loadReportData(-1, AppUtils.getUserID(request), downloadLimit,request, false /*download*/);
319                                         if(rr.getSemaphoreList()!=null) {
320                                                 rd   =  rr.loadReportData(-1, AppUtils.getUserID(request), downloadLimit,request, true);
321                                                 returnValue = paintPdfData(request, document, rd, rr, "");
322                                         } else {
323                                                 returnValue = paintPdfData(request, document, rd, rr, rr.getWholeSQL());
324                                         }
325                                         
326                                         
327                         }
328                         
329                                 
330                                 //paintPdfData(document,rd,rr);
331                         
332                         
333                         } catch (DocumentException de) {
334                          logger.error(EELFLoggerDelegate.errorLogger, "DocumentException in createPdfFileContent", de);
335                 }
336                         
337                 }
338                 document.close();
339         int mb = 1024*1024;
340         Runtime runtime = Runtime.getRuntime();         
341         logger.debug(EELFLoggerDelegate.debugLogger, ("##### Heap utilization statistics [MB] #####"));
342         logger.debug(EELFLoggerDelegate.debugLogger, ("Used Memory:"
343                         + (runtime.maxMemory() - runtime.freeMemory()) / mb));
344         logger.debug(EELFLoggerDelegate.debugLogger, ("Free Memory:"
345                         + runtime.freeMemory() / mb));
346         logger.debug(EELFLoggerDelegate.debugLogger, ("Total Memory:" + runtime.totalMemory() / mb));
347         logger.debug(EELFLoggerDelegate.debugLogger, ("Max Memory:" + runtime.maxMemory() / mb));
348
349         }
350         
351         private Document paintCoverPage(Document doc, ReportRuntime rr, HttpServletRequest request) throws IOException, DocumentException {
352                 
353                 //System.out.println("PDFREPORTHANDLER STARTED ... " );
354                 if(nvl(rr.getPdfImg()).length()>0) {
355                         Image image1 = Image.getInstance(AppUtils.getExcelTemplatePath()+"../../"+AppUtils.getImgFolderURL()+rr.getPdfImg());
356                         image1.scalePercent(20f, 20f);
357                         doc.add(image1);
358                 }
359                 float firstColumnSize = Globals.getCoverPageFirstColumnSize();
360                 float[] relativeWidths = {firstColumnSize,1f-firstColumnSize};
361                 PdfPTable table = new PdfPTable(relativeWidths);
362                 table.getDefaultCell().setBorderWidth(0);
363                 addEmptyRows(table,6);
364                 HTMLWorker worker = new HTMLWorker(doc);
365         StyleSheet style = new StyleSheet();
366         style.loadTagStyle("body", "leading", "16,0");
367         StringBuffer reportDescrBuf = new StringBuffer("");
368         ArrayList descr = HTMLWorker.parseToList(new StringReader(nvl(rr.getReportDescr())), style);
369         ArrayList paraList = null;
370            if(nvl(rr.getReportTitle()).length()>0) {
371                         add2Cells(table,"Report Title   : ",nvl(rr.getReportTitle()));
372                         if(nvl(rr.getReportSubTitle()).length()>0) {
373                                 add2Cells(table,"Report Sub-Title       : ",nvl(rr.getReportSubTitle()));
374                                 System.out.println("Adding the report sub-title ");
375                         }
376                         
377            } else {
378                         add2Cells(table,"Report Name    : ",nvl(rr.getReportName()));
379            }
380                         if((descr!=null && descr.size()>0)) {
381                                 paraList = (com.lowagie.text.Paragraph)descr.get(0);
382                                 for (int i=0 ; i<paraList.size(); i++) {
383                                         reportDescrBuf.append(paraList.get(i));
384                                 }
385                                 
386                         }
387                         add2Cells(table,"Description    : ",reportDescrBuf.toString());
388                 if(Globals.getSessionInfoForTheCoverPage().length()>0) {
389                         String nameValue[] = Globals.getSessionInfoForTheCoverPage().split(",");
390                                 String name=nameValue[0];
391                                 String value=nameValue[1];
392                                 add2Cells(table,name+" : ",(AppUtils.getRequestNvlValue(request, value).length()>0?AppUtils.getRequestNvlValue(request, value):nvl((String)request.getSession().getAttribute(value))));
393                 }
394                 
395                 if(Globals.isCreatedOwnerInfoNeeded()) {
396                         add2Cells(table,"Created By     : ",nvl(AppUtils.getUserName(rr.getCreateID())));
397                         add2Cells(table,"Owner                  : ",nvl(AppUtils.getUserName(rr.getOwnerID())));
398                 }
399                 if(Globals.displayLoginIdForDownloadedBy())
400                         add2Cells(table,"Downloaded by  : ",nvl(AppUtils.getUserBackdoorLoginId(request)));
401                 else
402                         add2Cells(table,"Downloaded by  : ",nvl(AppUtils.getUserName(AppUtils.getUserID(request))));
403                 
404                 addEmptyRows(table,1);
405
406                 boolean isFirstRow = true;
407         ArrayList al = rr.getParamNameValuePairsforPDFExcel(request, 1);
408         if(al.size()<=0) {
409                 al = (ArrayList) request.getSession().getAttribute(AppConstants.SI_FORMFIELD_DOWNLOAD_INFO);
410         }
411
412                 Iterator it = al.iterator();
413                 addEmptyRows(table,1);
414                 //if(!Globals.customizeFormFieldInfo()) {
415                 if(rr.getFormFieldComments(request).length()<=0) {
416                         while(it.hasNext()) {
417                 
418                                 if(isFirstRow) {
419                         add2Cells(table, "Run-time Criteria : ", " ");
420                                         isFirstRow = false;
421                                 }
422                                         
423                                 IdNameValue value = (IdNameValue)it.next();
424                                 if(!value.getId().trim().equals("BLANK"))
425                                         //System.out.println("PDFREPORTHANDLER " + value.getId()+" : "+value.getName());
426                                         add2Cells(table, value.getId()+" : ",value.getName().replaceAll("~",","));
427                                         //add2Cells(table, rr.getFormFieldComments(request), " ");
428                         }
429                         addEmptyRows(table,1);
430                         doc.add(table);
431                         
432                 } else {
433                 it = al.iterator();
434                 if(it.hasNext()) {
435                         //add2Cells(table, "Run-time Criteria : ", " ");
436                         addEmptyRows(table,1);                  
437                         doc.add(table);
438                         //com.lowagie.text.html.HtmlParser.parse(doc, new StringReader(rr.getFormFieldComments(request)));
439                         ArrayList p = HTMLWorker.parseToList(new StringReader(rr.getFormFieldComments(request).replaceAll("~",",")), style);
440                         
441                          for (int k = 0; k < p.size(); ++k){
442                             doc.add((com.lowagie.text.Element)p.get(k));
443                          }
444                 }
445                 } 
446                 
447                 return doc;             
448         }
449         
450
451         private Document paintDashboardCoverPage(Document doc, ReportRuntime rrDashRep, ReportRuntime firstReportRuntimeObj, HttpServletRequest request) throws IOException, DocumentException {
452                 
453                 //System.out.println("PDFREPORTHANDLER STARTED ... " );
454                 float firstColumnSize = Globals.getCoverPageFirstColumnSize();
455                 float[] relativeWidths = {firstColumnSize,1f-firstColumnSize};
456                 PdfPTable table = new PdfPTable(relativeWidths);
457                 table.getDefaultCell().setBorderWidth(0);
458                 addEmptyRows(table,6);
459
460                 add2Cells(table,"Report Name : ",rrDashRep.getReportName());
461                 add2Cells(table,"Description : ",rrDashRep.getReportDescr());
462                 if(Globals.getSessionInfoForTheCoverPage().length()>0) {
463                         String nameValue[] = Globals.getSessionInfoForTheCoverPage().split(",");
464                                 String name=nameValue[0];
465                                 String value=nameValue[1];
466                                 add2Cells(table,name+" : ",(AppUtils.getRequestNvlValue(request, value).length()>0?AppUtils.getRequestNvlValue(request, value):nvl((String)request.getSession().getAttribute(value))));
467                 }
468                 
469                 if(Globals.isCreatedOwnerInfoNeeded()) {
470                         add2Cells(table,"Created By : ",AppUtils.getUserName(rrDashRep.getCreateID()));
471                         add2Cells(table,"Owner : ",AppUtils.getUserName(rrDashRep.getOwnerID()));
472                 }
473                 if(Globals.displayLoginIdForDownloadedBy())
474                         add2Cells(table,"Downloaded by : ",AppUtils.getUserBackdoorLoginId(request));
475                 else
476                         add2Cells(table,"Downloaded by : ",AppUtils.getUserName(request));
477                 
478                 addEmptyRows(table,1);
479
480                 boolean isFirstRow = true;
481                 ArrayList al = firstReportRuntimeObj.getParamNameValuePairsforPDFExcel(request, 2);
482                 Iterator it = al.iterator();
483                 addEmptyRows(table,1);
484                 //if(!Globals.customizeFormFieldInfo()) {
485                 if(firstReportRuntimeObj.getFormFieldComments(request).length()<=0) {
486                         while(it.hasNext()) {
487                 
488                                 if(isFirstRow) {
489                                         add2Cells(table, "Run-time Criteria : ", " ");
490                                         isFirstRow = false;
491                                 }
492                                         
493                                 IdNameValue value = (IdNameValue)it.next();
494                                 if(!value.getId().trim().equals("BLANK"))
495                                         //System.out.println("PDFREPORTHANDLER " + value.getId()+" : "+value.getName());
496                                         add2Cells(table, value.getId()+" : ",value.getName());
497                                         //add2Cells(table, rr.getFormFieldComments(request), " ");
498                         }
499                         addEmptyRows(table,1);
500                         doc.add(table);
501                         
502                 } else {
503                 it = al.iterator();
504                 if(it.hasNext()) {
505                         //add2Cells(table, "Run-time Criteria : ", " ");
506                         addEmptyRows(table,1);                  
507                         doc.add(table);
508                         //com.lowagie.text.html.HtmlParser.parse(doc, new StringReader(rr.getFormFieldComments(request)));
509                         HTMLWorker worker = new HTMLWorker(doc);
510                         StyleSheet style = new StyleSheet();
511                         style.loadTagStyle("body", "leading", "16,0");
512                         ArrayList p = HTMLWorker.parseToList(new StringReader(firstReportRuntimeObj.getFormFieldComments(request)), style);
513                         
514                          for (int k = 0; k < p.size(); ++k){
515                             doc.add((com.lowagie.text.Element)p.get(k));
516                          }
517                 }
518                 } 
519                 
520                 return doc;             
521         }
522         
523         
524         public static void addEmptyRows(PdfPTable table, int rows) throws DocumentException {
525                 for (int i=0; i<rows; i++) 
526                         for(int j=0;j<table.getAbsoluteWidths().length;j++)
527                                 table.addCell(new Paragraph(" "));
528                 
529         }
530         
531         private void add2Cells(PdfPTable table, String key, String value) {
532                 
533                 PdfPCell cell;
534                 cell = new PdfPCell(new Paragraph(key));
535                 cell.setHorizontalAlignment(Rectangle.ALIGN_RIGHT);
536                 cell.setBorderWidth(0f);
537                 table.addCell(cell);
538                 
539                 cell = new PdfPCell(new Paragraph(value));
540                 cell.setHorizontalAlignment(Rectangle.ALIGN_LEFT);
541                 cell.setBorderWidth(0f);
542                 table.addCell(cell);
543         }
544
545         private void paintPdfImage(HttpServletRequest request, Document document, String fileName, ReportRuntime rr) 
546                                 throws DocumentException
547         {
548                 
549                 ArrayList images = getImage(request, fileName,pb.isAttachmentOfEmail()?true:false, rr);
550                 //Image image = getImage(request, fileName,pb.isAttachmentOfEmail()?true:false);
551                 PdfPTable table =  null;
552                 PdfPCell cellValue = null;
553                 if(images!=null) {
554                         
555                 for (int i = 0; i < images.size(); i++) {
556                         table = new PdfPTable(1);
557                         cellValue = new PdfPCell();
558                         cellValue.setHorizontalAlignment(Rectangle.ALIGN_CENTER);
559                 Image image = (Image) images.get(i);                            
560                         image.setAlignment(Image.ALIGN_CENTER);
561                         //System.out.println("Document 3 " + document + " i-" + i);
562                         if(i%2 ==0)
563                         document.newPage();
564                         //System.out.println("Document 31 " + document);
565                         cellValue.setImage(image);
566                         //table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
567                         table.addCell(cellValue);
568                         //System.out.println("Document 32 " + document + "table  " + table);
569                         document.add(table);
570                         //System.out.println("Document 33 " + document);                        
571                         }
572                 }
573         }
574         
575         private ArrayList getImage(HttpServletRequest request, String fileName, boolean isGenerateNewImage, ReportRuntime rr) {
576                 ArrayList images = new ArrayList();
577                 if(!isGenerateNewImage) {
578                         try {
579                                 Image image = Image.getInstance(fileName);
580                                 images.add(image);
581                                 return images;
582                         } 
583                         catch (MalformedURLException e) {
584                                 isGenerateNewImage = true;
585                     logger.error(EELFLoggerDelegate.errorLogger, "MalformedURLException in getImage", e);
586                         } 
587                         catch (BadElementException e) {
588                                 isGenerateNewImage = true;
589                     logger.error(EELFLoggerDelegate.errorLogger, "BadElementException in getImage", e);
590                         } catch (FileNotFoundException e) {
591                                 isGenerateNewImage = true;
592                 logger.error(EELFLoggerDelegate.errorLogger, "FileNotFoundException in getImage", e);
593                         } catch (IOException e) {
594                                 isGenerateNewImage = true;
595                 logger.error(EELFLoggerDelegate.errorLogger, "IOException in getImage", e);
596                     }                   
597                 }
598                 
599                 if(isGenerateNewImage && retryCreateNewImageCount<RetryCreateNewImage){
600                         retryCreateNewImageCount++;
601                         return generateNewImage(request, rr);
602                         //return getImage(request,fileName, false);
603                 }
604                 
605                 return null;
606                         
607         }
608
609         private ArrayList generateNewImage(HttpServletRequest request, ReportRuntime rr) {
610                 ArrayList images = new ArrayList();
611                 final String MALFORMEDURLEXCEPTION_MSG = "MalformedURLException in generateNewImage";
612                 final String BADELEMENTEXCEPTION_MSG = "BadElementException in generateNewImage";
613                 final String FILENOTFOUNDEXCEPTION_MSG = "FileNotFoundException in generateNewImage";
614                 final String IOEXCEPTION_MSG = "IOException in generateNewImage";
615                 try {
616                         //ReportRuntime rr = (ReportRuntime) request.getSession().getAttribute(AppConstants.SI_REPORT_RUNTIME);
617                         DataSet ds = null;
618                         if(request.getSession().getAttribute(AppConstants.RI_CHART_DATA)!=null) {
619                                 ds = (DataSet) request.getSession().getAttribute(AppConstants.RI_CHART_DATA);
620                         } else {
621                                 ds = rr.loadChartData(pb.getUserId(),request);
622                         }
623                     String downloadFileName = "";
624                         HashMap additionalChartOptionsMap = new HashMap();
625                         String chartType = nvl(rr.getChartType());
626                         if(chartType.equals(AppConstants.GT_PIE_MULTIPLE)) {
627                                 additionalChartOptionsMap.put("multiplePieOrderRow", new Boolean((AppUtils.getRequestNvlValue(request, "multiplePieOrder").length()>0?AppUtils.getRequestNvlValue(request, "multiplePieOrder").equals("row"):rr.isMultiplePieOrderByRow())) );
628                                 additionalChartOptionsMap.put("multiplePieLabelDisplay", AppUtils.getRequestNvlValue(request, "multiplePieLabelDisplay").length()>0? AppUtils.getRequestNvlValue(request, "multiplePieLabelDisplay"):rr.getMultiplePieLabelDisplay());
629                                 additionalChartOptionsMap.put("chartDisplay", new Boolean(AppUtils.getRequestNvlValue(request, "chartDisplay").length()>0? AppUtils.getRequestNvlValue(request, "chartDisplay").equals("3D"):rr.isChartDisplayIn3D()));
630                         } else if (chartType.equals(AppConstants.GT_BAR_3D)) {
631                                 additionalChartOptionsMap.put("chartOrientation", new Boolean((AppUtils.getRequestNvlValue(request, "chartOrientation").length()>0?AppUtils.getRequestNvlValue(request, "chartOrientation").equals("vertical"):rr.isVerticalOrientation())) );
632                                 additionalChartOptionsMap.put("secondaryChartRenderer", AppUtils.getRequestNvlValue(request, "secondaryChartRenderer").length()>0? AppUtils.getRequestNvlValue(request, "secondaryChartRenderer"):rr.getSecondaryChartRenderer());
633                                 additionalChartOptionsMap.put("chartDisplay", new Boolean(AppUtils.getRequestNvlValue(request, "chartDisplay").length()>0? AppUtils.getRequestNvlValue(request, "chartDisplay").equals("3D"):rr.isChartDisplayIn3D()));
634                                 additionalChartOptionsMap.put("lastSeriesALineChart", new Boolean(rr.isLastSeriesALineChart()));                
635                         } else if (chartType.equals(AppConstants.GT_LINE)) {
636                                 additionalChartOptionsMap.put("chartOrientation", new Boolean((AppUtils.getRequestNvlValue(request, "chartOrientation").length()>0?AppUtils.getRequestNvlValue(request, "chartOrientation").equals("vertical"):rr.isVerticalOrientation())) );
637                                 //additionalChartOptionsMap.put("secondaryChartRenderer", AppUtils.getRequestNvlValue(request, "secondaryChartRenderer").length()>0? AppUtils.getRequestNvlValue(request, "secondaryChartRenderer"):rr.getSecondaryChartRenderer());
638                                 additionalChartOptionsMap.put("chartDisplay", new Boolean(AppUtils.getRequestNvlValue(request, "chartDisplay").length()>0? AppUtils.getRequestNvlValue(request, "chartDisplay").equals("3D"):rr.isChartDisplayIn3D()));
639                                 additionalChartOptionsMap.put("lastSeriesABarChart", new Boolean(rr.isLastSeriesABarChart()));
640                         } else if (chartType.equals(AppConstants.GT_TIME_DIFFERENCE_CHART)) {
641                                 additionalChartOptionsMap.put("intervalFromDate",AppUtils.getRequestNvlValue(request, "intervalFromDate").length()>0?AppUtils.getRequestNvlValue(request, "intervalFromDate"):rr.getIntervalFromdate());
642                                 additionalChartOptionsMap.put("intervalToDate", AppUtils.getRequestNvlValue(request, "intervalToDate").length()>0? AppUtils.getRequestNvlValue(request, "intervalToDate"):rr.getIntervalTodate());
643                                 additionalChartOptionsMap.put("intervalLabel", AppUtils.getRequestNvlValue(request, "intervalLabel").length()>0? AppUtils.getRequestNvlValue(request, "intervalLabel"):rr.getIntervalLabel());
644                         } else if (chartType.equals(AppConstants.GT_REGRESSION)) {
645                                 additionalChartOptionsMap.put("regressionType",AppUtils.getRequestNvlValue(request, "regressionType").length()>0?AppUtils.getRequestNvlValue(request, "regressionType"):rr.getLinearRegression());
646                                 additionalChartOptionsMap.put("linearRegressionColor",nvl(rr.getLinearRegressionColor()));
647                                 additionalChartOptionsMap.put("expRegressionColor",nvl(rr.getExponentialRegressionColor()));
648                                 additionalChartOptionsMap.put("maxRegression",nvl(rr.getCustomizedRegressionPoint()));
649                         } else if (chartType.equals(AppConstants.GT_STACK_BAR) ||chartType.equals(AppConstants.GT_STACKED_HORIZ_BAR) || chartType.equals(AppConstants.GT_STACKED_HORIZ_BAR_LINES)
650                            || chartType.equals(AppConstants.GT_STACKED_VERT_BAR) || chartType.equals(AppConstants.GT_STACKED_VERT_BAR_LINES)    
651                         ) {
652                                 additionalChartOptionsMap.put("overlayItemValue",new Boolean(nvl(rr.getOverlayItemValueOnStackBar()).equals("Y")));
653                         }
654                         additionalChartOptionsMap.put("legendPosition", nvl(rr.getLegendPosition()));
655                         additionalChartOptionsMap.put("hideToolTips", new Boolean(rr.hideChartToolTips()));
656                         additionalChartOptionsMap.put("hideLegend", new Boolean(AppUtils.getRequestNvlValue(request, "hideLegend").length()>0? AppUtils.getRequestNvlValue(request, "hideLegend").equals("Y"):rr.hideChartLegend()));
657                         additionalChartOptionsMap.put("labelAngle", nvl(rr.getLegendLabelAngle()));
658                         additionalChartOptionsMap.put("maxLabelsInDomainAxis", nvl(rr.getMaxLabelsInDomainAxis()));
659                         additionalChartOptionsMap.put("rangeAxisLowerLimit", nvl(rr.getRangeAxisLowerLimit()));
660                         additionalChartOptionsMap.put("rangeAxisUpperLimit", nvl(rr.getRangeAxisUpperLimit()));
661                         
662                     
663                         boolean totalOnChart = false;
664                         totalOnChart = AppUtils.getRequestNvlValue(request, "totalOnChart").equals("Y");
665                         String filename  = null;
666                         ArrayList graphURL  = new ArrayList();
667                         ArrayList chartNames = new ArrayList();
668                         ArrayList fileNames = new ArrayList(); 
669                     List l = rr.getAllColumns();
670                     List lGroups = rr.getAllChartGroups();
671                     HashMap mapYAxis = rr.getAllChartYAxis(rr.getReportParamValues());
672                     String chartLeftAxisLabel = rr.getFormFieldFilled(nvl(rr.getChartLeftAxisLabel()));
673                 String chartRightAxisLabel = rr.getFormFieldFilled(nvl(rr.getChartRightAxisLabel()));
674                     int displayTotalOnChart = 0;
675                     HashMap formValues = Globals.getRequestParamtersMap(request, false);
676
677                     for (Iterator iterC = l.iterator(); iterC.hasNext();) {
678                                 DataColumnType dc = (DataColumnType) iterC.next();
679                                 if(nvl(dc.getColName()).equals(AppConstants.RI_CHART_TOTAL_COL)) {
680                                         displayTotalOnChart = 1;
681                                 }
682                         }
683                     
684                     String legendColumnName = (rr.getChartLegendColumn()!=null)?rr.getChartLegendColumn().getDisplayName():"Legend Column";
685                     
686                     
687                     
688                         if(ds!=null)
689                         {
690                                    if(rr.hasSeriesColumn() && chartType.equals(AppConstants.GT_TIME_SERIES) && (lGroups==null || lGroups.size() <= 0)) { /** Check whether Report has only category  columns if so then all the columns will open in seperate chart - sundar**/
691                                 for (int i=0; i<rr.getChartValueColumnAxisList(AppConstants.CHART_ALL_COLUMNS, formValues).size();i++) {
692                                 String chartTitle = Globals.getDisplayChartTitle()? rr.getReportName():"";
693                                 chartTitle = rr.getFormFieldFilled(chartTitle);
694                                                 downloadFileName = AppUtils.getTempFolderPath()+"cr_"+pb.getUserId()+"_"+request.getSession().getId()+"_"+rr.getReportID()+"_"+i+".png";
695                                                 filename = null;/*(String) ChartGen.generateChart(  chartType,
696                                                                                                         request.getSession(),
697                                                                                                         ds,
698                                                                                                         legendColumnName, 
699                                                                                                         chartLeftAxisLabel,
700                                                                                                         chartRightAxisLabel,
701                                                                                                         rr.getChartDisplayNamesList(AppConstants.CHART_ALL_COLUMNS, formValues).subList(i, i+1), 
702                                                                                                         rr.getChartColumnColorsList(AppConstants.CHART_ALL_COLUMNS, formValues).subList(i, i+1), 
703                                                                                                         rr.getChartValueColumnAxisList(AppConstants.CHART_ALL_COLUMNS, formValues).subList(i, i+1), 
704                                                                                                         "",
705                                                                                                         chartTitle,
706                                                                                                         null,
707                                                                                                         rr.getChartWidthAsInt(),
708                                                                                                         rr.getChartHeightAsInt(),
709                                                                                     rr.getChartValueColumnsList(AppConstants.CHART_ALL_COLUMNS, formValues).subList(i,i+1),
710                                                                                     rr.hasSeriesColumn(),
711                                                                                     //rr.isChartMultiSeries(),
712                                                                                     rr.isMultiSeries(),
713                                                                                     rr.getAllColumns(),
714                                                                         downloadFileName,
715                                                                         totalOnChart, 
716                                                                         AppConstants.WEB_VERSION deviceType,
717                                                                         additionalChartOptionsMap,
718                                                                         true
719                                                         );*/
720                         try {
721                             Image image = Image.getInstance(downloadFileName);
722                             images.add(image);
723                         } catch (MalformedURLException e) {
724                             logger.error(EELFLoggerDelegate.errorLogger, MALFORMEDURLEXCEPTION_MSG,
725                                     e);
726                         } catch (BadElementException e) {
727                             logger.error(EELFLoggerDelegate.errorLogger, BADELEMENTEXCEPTION_MSG,
728                                     e);
729                         } catch (FileNotFoundException e) {
730                             logger.error(EELFLoggerDelegate.errorLogger, FILENOTFOUNDEXCEPTION_MSG,
731                                     e);
732                         } catch (IOException e) {
733                             logger.error(EELFLoggerDelegate.errorLogger, IOEXCEPTION_MSG, e);
734                         }
735                                 }
736                                            
737                                    } else { /** first check the columns to be opened in new charts and loop around in ChartGen generate chart function  - sundar**/
738                             String tempChartGroupPrev = "";
739                                         String tempChartGroupCurrent = "";
740                                 for (int i=0; i<lGroups.size();i++) {
741                                         String chartGroupOrg = (String) lGroups.get(i);
742                                         String chartYAxis = (String) mapYAxis.get(chartGroupOrg);
743                                         //System.out.println("chartGroupOrg " + chartGroupOrg);
744                                         if(nvl(chartGroupOrg).length()>0)
745                                                 tempChartGroupCurrent = chartGroupOrg.substring(0,chartGroupOrg.lastIndexOf("|"));
746                                         if(i>0)
747                                                                 tempChartGroupPrev = ((String) lGroups.get(i-1)).substring(0,((String) lGroups.get(i-1)).lastIndexOf("|"));
748                                         //System.out.println("TEMPCHARTGROUP " + tempChartGroupCurrent + " " + tempChartGroupPrev);
749                                         if(tempChartGroupCurrent.equals(tempChartGroupPrev))
750                                                                 continue;
751                                         //System.out.println("CHARTGROUPORG " + chartGroupOrg + " " + lGroups) ;
752                                         //String chartGroup = chartGroupOrg.substring(0,chartGroupOrg.lastIndexOf("|"));
753                                         String chartGroup = chartGroupOrg;
754                                         
755                                         //System.out.println("$$$$CHARTGROUP in JSP  " +chartGroup+ " "+ chartGroupOrg );
756                                                            //System.out.println(" rr.getChartGroupDisplayNamesList(chartGroup) " + rr.getChartGroupDisplayNamesList(chartGroup));
757                                                            //System.out.println(" rr.getChartGroupColumnColorsList(chartGroup) " + rr.getChartGroupColumnColorsList(chartGroup));
758                                                            //System.out.println(" rr.getChartGroupColumnAxisList(chartGroup) " + rr.getChartGroupColumnAxisList(chartGroup));
759                                                            //System.out.println(" rr.getChartGroupValueColumnAxisList(chartGroupOrg) " + rr.getChartGroupValueColumnAxisList(chartGroupOrg));
760                                         
761                                                         downloadFileName = AppUtils.getTempFolderPath()+"cr_"+pb.getUserId()+"_"+request.getSession().getId()+"_"+rr.getReportID()+"_"+i+".png";
762                                                         String chartTitle = (Globals.getDisplayChartTitle()? (chartGroup!=null && chartGroup.indexOf("|") > 0 ?chartGroup.substring(0,chartGroup.lastIndexOf("|")):rr.getReportName()):"");
763                                                         chartTitle = rr.getFormFieldFilled(chartTitle);
764                                                         String leftAxisLabel = "";
765                                                         //if(!rr.isChartMultiSeries()) {
766                                                           if(!rr.isMultiSeries()) {
767                                                                 leftAxisLabel = ((chartYAxis!=null && chartYAxis.indexOf("|") > 0) ? chartYAxis.substring(0,chartYAxis.lastIndexOf("|")): chartLeftAxisLabel );
768                                                         } else {
769                                                                 leftAxisLabel = chartLeftAxisLabel;
770                                                         }
771
772                                                 filename = null;/*(String) ChartGen.generateChart(  chartType,
773                                                                                                                                 request.getSession(),
774                                                                                                                                 ds,
775                                                                                                                                 legendColumnName,  
776                                                                                                                                 leftAxisLabel,
777                                                                                                                                 chartRightAxisLabel,
778                                                                                                                                 ((chartType.indexOf("Stacked")>0 || chartType.equals(AppConstants.GT_PIE_MULTIPLE) || chartType.equals(AppConstants.GT_BAR_3D))?rr.getChartDisplayNamesList(AppConstants.CHART_ALL_COLUMNS, formValues):rr.getChartGroupDisplayNamesList(chartGroup, formValues)), 
779                                                                                                                                 ((chartType.indexOf("Stacked")>0 || chartType.equals(AppConstants.GT_PIE_MULTIPLE) || chartType.equals(AppConstants.GT_BAR_3D))?rr.getChartColumnColorsList(AppConstants.CHART_ALL_COLUMNS, formValues):rr.getChartGroupColumnColorsList(chartGroup, formValues)), 
780                                                                                                                                 ((chartType.indexOf("Stacked")>0 || chartType.equals(AppConstants.GT_PIE_MULTIPLE) || chartType.equals(AppConstants.GT_BAR_3D))?rr.getChartValueColumnAxisList(AppConstants.CHART_ALL_COLUMNS, formValues):rr.getChartGroupValueColumnAxisList(chartGroupOrg, formValues)), 
781                                                                                                                                 "",
782                                                                                                                                 chartTitle,
783                                                                                                                                 null,
784                                                                                                                                 rr.getChartWidthAsInt(),
785                                                                                                                                 rr.getChartHeightAsInt(),
786                                                                                                                                 ((chartType.indexOf("Stacked")>0 || chartType.equals(AppConstants.GT_PIE_MULTIPLE))?rr.getChartValueColumnsList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS, formValues):rr.getChartGroupValueColumnAxisList(chartGroupOrg, formValues)),
787                                                                                                             rr.hasSeriesColumn(),
788                                                                                                             //rr.isChartMultiSeries(),
789                                                                                                             rr.isMultiSeries(),
790                                                                                                             rr.getAllColumns(),
791                                                                                                 downloadFileName,
792                                                                                                 totalOnChart, 
793                                                                                                 AppConstants.WEB_VERSION deviceType, 
794                                                                                                 additionalChartOptionsMap,
795                                                                                                 true
796                                                                   );*/
797                         try {
798                             Image image = Image.getInstance(downloadFileName);
799                             images.add(image);
800                         } catch (MalformedURLException e) {
801                             logger.error(EELFLoggerDelegate.errorLogger, MALFORMEDURLEXCEPTION_MSG,
802                                     e);
803                         } catch (BadElementException e) {
804                             logger.error(EELFLoggerDelegate.errorLogger, BADELEMENTEXCEPTION_MSG,
805                                     e);
806                         } catch (FileNotFoundException e) {
807                             logger.error(EELFLoggerDelegate.errorLogger, FILENOTFOUNDEXCEPTION_MSG,
808                                     e);
809                         } catch (IOException e) {
810                             logger.error(EELFLoggerDelegate.errorLogger, IOEXCEPTION_MSG, e);
811                         }
812                                                 }
813                                            
814                             if(!chartType.equals(AppConstants.GT_PIE_MULTIPLE)) {    
815                         for (int i=0; i<rr.getChartValueColumnAxisList(AppConstants.CHART_NEWCHART_COLUMNS, formValues).size();i++) { 
816                                            //System.out.println(" rr.getChartDisplayNamesList(AppConstants.CHART_NEWCHART_COLUMNS).subList(i, i+1) " + rr.getChartDisplayNamesList(AppConstants.CHART_NEWCHART_COLUMNS).subList(i, i+1));
817                                            //System.out.println(" rr.getChartValueColumnAxisList(AppConstants.CHART_NEWCHART_COLUMNS).subList(i, i+1) " + rr.getChartValueColumnAxisList(AppConstants.CHART_NEWCHART_COLUMNS).subList(i, i+1));
818                                            //System.out.println(" rr.getChartValueColumnsList(AppConstants.CHART_NEWCHART_COLUMNS).subList(i,i+1) " + rr.getChartValueColumnsList(AppConstants.CHART_NEWCHART_COLUMNS).subList(i,i+1));
819
820                                                 downloadFileName = AppUtils.getTempFolderPath()+"cr_"+ pb.getUserId()+"_"+request.getSession().getId()+"_"+rr.getReportID()+"_"+i+".png";
821                                 String chartTitle = Globals.getDisplayChartTitle()? rr.getReportName():"";
822                                 chartTitle = rr.getFormFieldFilled(chartTitle);
823
824                         filename = null; /*(String) ChartGen.generateChart(  chartType,
825                                                                                                         request.getSession(),
826                                                                                                         ds,
827                                                                                                         legendColumnName, 
828                                                                                                         chartLeftAxisLabel,
829                                                                                                         chartRightAxisLabel,
830                                                                                                         (chartType.equals(AppConstants.GT_PIE_MULTIPLE))?rr.getChartDisplayNamesList(AppConstants.CHART_ALL_COLUMNS, formValues):rr.getChartDisplayNamesList(AppConstants.CHART_NEWCHART_COLUMNS, formValues).subList(i, i+1), 
831                                                                                                         (chartType.equals(AppConstants.GT_PIE_MULTIPLE))?rr.getChartColumnColorsList(AppConstants.CHART_ALL_COLUMNS, formValues):rr.getChartColumnColorsList(AppConstants.CHART_NEWCHART_COLUMNS, formValues).subList(i, i+1), 
832                                                                                                         (chartType.equals(AppConstants.GT_PIE_MULTIPLE))?rr.getChartValueColumnAxisList(AppConstants.CHART_ALL_COLUMNS, formValues):rr.getChartValueColumnAxisList(AppConstants.CHART_NEWCHART_COLUMNS, formValues).subList(i, i+1), 
833                                                                                                         "",
834                                                                                                         chartTitle,
835                                                                                                         null,
836                                                                                                         rr.getChartWidthAsInt(),
837                                                                                                         rr.getChartHeightAsInt(),
838                                                                         rr.getChartValueColumnsList(AppConstants.CHART_NEWCHART_COLUMNS, formValues).subList(i,i+1),
839                                                                                     rr.hasSeriesColumn(),
840                                                                                     //rr.isChartMultiSeries(),
841                                                                                     rr.isMultiSeries(),
842                                                                                     rr.getAllColumns(),
843                                                                         downloadFileName,
844                                                                         totalOnChart, 
845                                                                         AppConstants.WEB_VERSION, 
846                                                                         additionalChartOptionsMap,
847                                                                         true
848                                           );*/
849                             try {
850                                 Image image = Image.getInstance(downloadFileName);
851                                 images.add(image);
852                             } catch (MalformedURLException e) {
853                                 logger.error(EELFLoggerDelegate.errorLogger,
854                                         MALFORMEDURLEXCEPTION_MSG, e);
855                             } catch (BadElementException e) {
856                                 logger.error(EELFLoggerDelegate.errorLogger,
857                                         BADELEMENTEXCEPTION_MSG, e);
858                             } catch (FileNotFoundException e) {
859                                 logger.error(EELFLoggerDelegate.errorLogger,
860                                         FILENOTFOUNDEXCEPTION_MSG, e);
861                             } catch (IOException e) {
862                                 logger.error(EELFLoggerDelegate.errorLogger, IOEXCEPTION_MSG, e);
863                             }
864                         }
865                             }
866                         /** second rest of the columns are merged to one single chart  - sundar**/
867                                           // System.out.println(" rr.getChartDisplayNamesList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS) " + rr.getChartDisplayNamesList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS));
868                                           // System.out.println(" rr.getChartValueColumnAxisList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS) " + rr.getChartValueColumnAxisList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS));
869                                           // System.out.println(" rr.getChartValueColumnsList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS) " + rr.getChartValueColumnsList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS));
870
871                                           if((!(lGroups!=null && lGroups.size() > 0))) {
872                                                   
873                                            if(/*chartType.equals(AppConstants.GT_TIME_SERIES) && */rr.getChartDisplayNamesList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS, formValues)!=null && rr.getChartDisplayNamesList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS, formValues).size()>0) {
874                         downloadFileName = AppUtils.getTempFolderPath()+"cr_"+  pb.getUserId()+"_"+request.getSession().getId()+"_"+rr.getReportID()+"_All.png";
875                         String chartTitle = Globals.getDisplayChartTitle()? rr.getReportName():"";
876                         chartTitle = rr.getFormFieldFilled(chartTitle);
877
878                         filename = null; /*(String) ChartGen.generateChart(  chartType,
879                                                                                                         request.getSession(),
880                                                                                                         ds,
881                                                                                                         legendColumnName, 
882                                                                                                         chartLeftAxisLabel,
883                                                                                                         chartRightAxisLabel,
884                                                                                                         rr.getChartDisplayNamesList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS, formValues), 
885                                                                                                         rr.getChartColumnColorsList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS, formValues), 
886                                                                                                         rr.getChartValueColumnAxisList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS, formValues), 
887                                                                                                         "",
888                                                                                                         chartTitle,
889                                                                                                         null,
890                                                                                                         rr.getChartWidthAsInt(),
891                                                                                                         rr.getChartHeightAsInt(),
892                                                                         rr.getChartValueColumnsList(AppConstants.CHART_WITHOUT_NEWCHART_COLUMNS, formValues),
893                                                                                     rr.hasSeriesColumn(),
894                                                                                   //rr.isChartMultiSeries(),
895                                                                                     rr.isMultiSeries(),
896                                                                                     rr.getAllColumns(),
897                                                                         downloadFileName,
898                                                                         totalOnChart, 
899                                                                         AppConstants.WEB_VERSION, 
900                                                                         additionalChartOptionsMap,
901                                                                         true
902                                           );*/
903                             try {
904                                 Image image = Image.getInstance(downloadFileName);
905                                 images.add(image);
906                             } catch (MalformedURLException e) {
907                                 logger.error(EELFLoggerDelegate.errorLogger,
908                                         MALFORMEDURLEXCEPTION_MSG, e);
909                             } catch (BadElementException e) {
910                                 logger.error(EELFLoggerDelegate.errorLogger,
911                                         BADELEMENTEXCEPTION_MSG, e);
912                             } catch (FileNotFoundException e) {
913                                 logger.error(EELFLoggerDelegate.errorLogger,
914                                         FILENOTFOUNDEXCEPTION_MSG, e);
915                             } catch (IOException e) {
916                                 logger.error(EELFLoggerDelegate.errorLogger, IOEXCEPTION_MSG, e);
917                             }
918                         }
919                     } // Stacked Chart Check
920                 } // else no Series Column
921
922             } // if(ds!=null)
923
924         } catch (Exception e) {
925             logger.error(EELFLoggerDelegate.errorLogger, "Exception in generateNewImage", e);
926         }
927 //              System.out.println("Total Images " + images.size());
928                 return images.size()>0?images:null;
929                 
930         }
931
932 /*
933         private boolean isImageRotate(Document doc, Image image) {
934                 
935                 System.out.println("image size="+image.getWidthPercentage()+ " "+ image.scaledWidth()+ 
936                                                         " "+image.scaledHeight()+" "+image.getXYRatio());
937                 System.out.println("page size = "+ doc.getPageSize().width() + " " +doc.getPageSize().height() +" "+ 
938                                    doc.topMargin() + " " +doc.bottomMargin() + " " +   doc.leftMargin() + " " +
939                                    doc.rightMargin());
940                 System.out.println(image.scaledWidth()/image.scaledHeight());
941                 System.out.println((PageEvent.getPageWidth(doc)/PageEvent.getPageHeight(doc)));
942 //              System.out.println(doc.getPageSize().getRotation());
943                 
944                 float image_w = image.scaledWidth();
945                 float image_h = image.scaledHeight();
946                 float image_ratio = image_w/image_h;
947                 
948                 float page_w = PageEvent.getPageWidth(doc);
949                 float page_h = PageEvent.getPageHeight(doc);
950                 float page_ratio = page_w/page_h;
951                 
952                 return  (image_w > page_w && image_ratio > page_ratio) ||
953                                 (image_h > page_h && image_ratio < page_ratio);
954
955         }
956         
957 */
958         private final int DEFAULT_PDF_DISPLAY_WIDTH = 10;
959
960     private int paintPdfData(final HttpServletRequest request, final Document document, final ReportData rd,
961         final ReportRuntime rr, final String sql_whole) throws DocumentException, RaptorException, IOException {
962
963         final int mb = 1024 * 1024;
964         final Runtime runtime = Runtime.getRuntime();
965         int returnValue = 0;
966
967         final float f[] = getRelativeWidths(rd, AppConstants.RT_CROSSTAB.equals(rr.getReportType()));
968         PdfPTable table = new PdfPTable(f);
969         table.setWidthPercentage(100f);
970         table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
971         table.getDefaultCell().setVerticalAlignment(Rectangle.ALIGN_BOTTOM);
972
973         final ReportDefinition rdef = (new ReportHandler()).loadReportDefinition(request, rr.getReportID());
974
975         final List allColumns = rdef.getAllColumns();
976
977         final float[] repotWidths = new float[rdef.getVisibleColumnCount()];
978         int columnIdx = 0;
979         float pdfDisplayWidth = 0;
980         for (final Iterator iter = allColumns.iterator(); iter.hasNext(); ) {
981             final DataColumnType dct = (DataColumnType) iter.next();
982             if (dct.isVisible()) {
983
984                 if (dct.getPdfDisplayWidthInPxls() == null || dct.getPdfDisplayWidthInPxls().isEmpty() || dct
985                     .getPdfDisplayWidthInPxls().startsWith("null")) {
986                     pdfDisplayWidth = DEFAULT_PDF_DISPLAY_WIDTH;
987                 } else {
988                     pdfDisplayWidth = Float.parseFloat(dct.getPdfDisplayWidthInPxls());
989                 }
990
991                 repotWidths[columnIdx++] = pdfDisplayWidth;
992             }
993         }
994
995         table.setWidths(repotWidths);
996
997         //TODO: check title and subtitle
998         final HttpSession session = request.getSession();
999         final String drilldown_index = (String) session.getAttribute("drilldown_index");
1000         int index = 0;
1001         try {
1002             index = Integer.parseInt(drilldown_index);
1003         } catch (NumberFormatException ex) {
1004             index = 0;
1005         }
1006         final String titleRep = (String) session.getAttribute("TITLE_" + index);
1007         final String subtitle = (String) session.getAttribute("SUBTITLE_" + index);
1008
1009         if (nvl(titleRep).length() > 0 && nvl(subtitle).length() > 0) {
1010             table.setHeaderRows(3);
1011         } else if (nvl(titleRep).length() > 0) {
1012             table.setHeaderRows(2);
1013         } else {
1014             table.setHeaderRows(1);
1015         }
1016         table = paintPdfReportHeader(request, document, table, rr, f);
1017         paintPdfTableHeader(document, rd, table);
1018
1019         int idx = 0;
1020         final int fragmentsize = 30; //for memory management
1021
1022         rd.reportDataRows.resetNext();
1023         DataRow dr = rd.reportDataRows.getNext();
1024
1025         if (nvl(sql_whole).length() > 0 && AppConstants.RT_LINEAR.equals(rr.getReportType())) {
1026             try (final Connection conn = ConnectionUtils.getConnection(rr.getDbInfo());
1027                 final Statement st = conn.createStatement();
1028                 final ResultSet rs = st.executeQuery(sql_whole);) {
1029
1030                 logger.debug(EELFLoggerDelegate.debugLogger, ("************* Map Whole SQL *************"));
1031                 logger.debug(EELFLoggerDelegate.debugLogger, (sql_whole));
1032                 logger.debug(EELFLoggerDelegate.debugLogger, ("*****************************************"));
1033
1034                 final ResultSetMetaData rsmd = rs.getMetaData();
1035                 final int numberOfColumns = rsmd.getColumnCount();
1036                 dr = null;
1037                 int rowCount = 0;
1038                 while (rs.next()) {
1039
1040                     rowCount++;
1041                     final Map colHash = new HashMap();
1042                     for (int i = 1; i <= numberOfColumns; i++) {
1043                         colHash.put(rsmd.getColumnLabel(i).toUpperCase(), rs.getString(i));
1044                     }
1045                     rd.reportDataRows.resetNext();
1046
1047                     dr = rd.reportDataRows.getNext();
1048
1049                     for (dr.resetNext(); dr.hasNext(); ) {
1050                         final DataValue dv = dr.getNext();
1051
1052                         final String value = nvl((String) colHash.get(dv.getColId().toUpperCase()));
1053                         if (dv.isVisible()) {
1054
1055                             final HtmlFormatter cfmt = dv.getCellFormatter();
1056                             final HtmlFormatter rfmt = dv.getRowFormatter();
1057
1058                             final Font cellFont = FontFactory.getFont(FONT_FAMILY,
1059                                 FONT_SIZE,
1060                                 Font.NORMAL, Color.BLACK);
1061                             if (cfmt != null) {
1062                                 cellFormatterFont(cfmt, cellFont);
1063                             } else if (rfmt != null) {
1064                                 cellFormatterFont(rfmt, cellFont);
1065                             } else {
1066                                 if (dv.isBold()) {
1067                                     cellFont.setStyle(Font.BOLD);
1068                                 }
1069                             }
1070
1071                             final String cellValue = strip.stripHtml(value.trim());
1072                             final PdfPCell cell = new PdfPCell(new Paragraph(cellValue, cellFont));
1073
1074                             //row background color can be overwritten by cell background color
1075                             cell.setBackgroundColor(getRowBackgroundColor(dr, idx));
1076
1077                             if (nvl(dv.getAlignment()).trim().length() > 0) {
1078                                 cell.setHorizontalAlignment(ElementTags.alignmentValue(dv.getAlignment()));
1079                             } else {
1080                                 cell.setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1081                             }
1082
1083                             if (cfmt != null) {
1084                                 formatterCell(cfmt, cell);
1085                             } else if (rfmt != null) {
1086                                 formatterCell(rfmt, cell);
1087                             }
1088
1089                             table.addCell(cell);
1090
1091                         }//if isVisible()
1092
1093                     }
1094
1095                 }
1096                 if (rd.reportDataTotalRow != null) {
1097                     for (rd.reportDataTotalRow.resetNext(); rd.reportDataTotalRow.hasNext(); idx++) {
1098                         dr = rd.reportDataTotalRow.getNext();
1099                         table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1100                         final Font rowHeaderFont = FontFactory.getFont(FONT_FAMILY,
1101                             FONT_SIZE,
1102                             Font.NORMAL, Color.BLACK);
1103                         rowHeaderFont.setStyle(Font.BOLD);
1104                         rowHeaderFont.setSize(FONT_SIZE + 1f);
1105                         table.getDefaultCell().setBackgroundColor(getRowBackgroundColor(dr, idx));
1106                         table.addCell(new Paragraph("Total", rowHeaderFont));
1107
1108                         addTotalRowColumns(table, dr, idx);
1109                         if (idx % fragmentsize == fragmentsize - 1) {
1110                             document.add(table);
1111                             table.deleteBodyRows();
1112                             table.setSkipFirstHeader(true);
1113                         }
1114
1115                     }
1116                 }
1117             } catch (final SQLException | ReportSQLException ex) {
1118                 throw new RaptorException(ex);
1119             } catch (final Exception ex) {
1120                 if (!(ex.getCause() instanceof java.net.SocketException)) {
1121                     throw new RaptorException(ex);
1122                 }
1123             }
1124             //document.add(table);
1125         } else {
1126             if (rr.getReportType().equals(AppConstants.RT_LINEAR)) {
1127                 for (rd.reportDataRows.resetNext(); rd.reportDataRows.hasNext(); idx++) {
1128
1129                     if (runtime.freeMemory() / mb <= ((runtime.maxMemory() / mb) * Globals.getMemoryThreshold()
1130                         / 100)) {
1131                         returnValue = 1;
1132                     }
1133
1134                     dr = rd.reportDataRows.getNext();
1135
1136                     addRowHeader(table, dr, idx, rd);
1137
1138                     addRowColumns(table, dr, idx);
1139
1140                     if (idx % fragmentsize == fragmentsize - 1) {
1141                         document.add(table);
1142                         table.deleteBodyRows();
1143                         table.setSkipFirstHeader(true);
1144                     }
1145                 }
1146
1147                 if (rd.reportDataTotalRow != null) {
1148                     for (rd.reportDataTotalRow.resetNext(); rd.reportDataTotalRow.hasNext(); idx++) {
1149                         dr = rd.reportDataTotalRow.getNext();
1150                         table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1151                         Font rowHeaderFont = FontFactory.getFont(FONT_FAMILY,
1152                             FONT_SIZE,
1153                             Font.NORMAL, Color.BLACK);
1154                         rowHeaderFont.setStyle(Font.BOLD);
1155                         rowHeaderFont.setSize(FONT_SIZE + 1f);
1156                         table.getDefaultCell().setBackgroundColor(getRowBackgroundColor(dr, idx));
1157                         table.addCell(new Paragraph("Total", rowHeaderFont));
1158
1159                         addTotalRowColumns(table, dr, idx);
1160                         if (idx % fragmentsize == fragmentsize - 1) {
1161                             document.add(table);
1162                             table.deleteBodyRows();
1163                             table.setSkipFirstHeader(true);
1164                         }
1165
1166                     }
1167                 }
1168
1169             } else if (AppConstants.RT_CROSSTAB.equals(rr.getReportType())) {
1170                 int rowCount = 0;
1171                 final List l = rd.getReportDataList();
1172                 boolean first = true;
1173                 for (int dataRow = 0; dataRow < l.size(); dataRow++) {
1174                     first = true;
1175                     rowCount++;
1176                     dr = (DataRow) l.get(dataRow);
1177                     final Vector<DataValue> rowNames = dr.getRowValues();
1178                     for (dr.resetNext(); dr.hasNext(); ) {
1179
1180                         if (first) {
1181                             HtmlFormatter rfmt = dr.getRowFormatter();
1182
1183                             Font cellFont = FontFactory.getFont(FONT_FAMILY,
1184                                 FONT_SIZE,
1185                                 Font.NORMAL, Color.BLACK);
1186                             if (rfmt != null) {
1187                                 cellFormatterFont(rfmt, cellFont);
1188                             }
1189
1190                             if (rowNames != null) {
1191                                 for (int i = 0; i < rowNames.size(); i++) {
1192                                     final DataValue dv = rowNames.get(i);
1193                                     rfmt = dr.getRowFormatter();
1194
1195                                     cellFont = FontFactory.getFont(FONT_FAMILY,
1196                                         FONT_SIZE,
1197                                         Font.NORMAL, Color.BLACK);
1198                                     if (rfmt != null) {
1199                                         cellFormatterFont(rfmt, cellFont);
1200                                     }
1201                                     String cellValue = dv.getDisplayValue();
1202                                     if (cellValue.indexOf("|#") != -1) {
1203                                         cellValue = cellValue.substring(0, cellValue.indexOf("|"));
1204                                     }
1205
1206                                     final PdfPCell cell = new PdfPCell(new Paragraph(cellValue, cellFont));
1207                                     //row background color can be overwritten by cell background color
1208                                     cell.setBackgroundColor(getRowBackgroundColor(dr, idx));
1209
1210                                     cell.setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1211
1212                                     if (rfmt != null) {
1213                                         formatterCell(rfmt, cell);
1214                                     }
1215                                     table.addCell(cell);
1216                                 }
1217                             }
1218                         }
1219                         first = false;
1220
1221                         if (runtime.freeMemory() / mb <= ((runtime.maxMemory() / mb) * Globals.getMemoryThreshold()
1222                             / 100)) {
1223                             returnValue = 1;
1224                         }
1225
1226                         //addRowHeader(table,dr,idx,rd);
1227
1228                         addRowColumns(table, dr, idx);
1229
1230                         if (idx % fragmentsize == fragmentsize - 1) {
1231                             document.add(table);
1232                             table.deleteBodyRows();
1233                             table.setSkipFirstHeader(true);
1234                         }
1235                     }
1236
1237                 }
1238             }
1239
1240             //document.add(table);
1241
1242         }
1243
1244         document.add(table);
1245         paintPdfReportFooter(request, document, rr, f);
1246
1247         return returnValue;
1248     }
1249
1250         private void addRowHeader(PdfPTable table, DataRow dr, int idx, ReportData rd) {
1251                 
1252                 table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);  
1253
1254                 for(rd.reportRowHeaderCols.resetNext();rd.reportRowHeaderCols.hasNext();) {
1255                         RowHeaderCol rhc = rd.reportRowHeaderCols.getNext();
1256                         if(idx==0) 
1257                                 rhc.resetNext();
1258                         RowHeader rh = rhc.getNext();
1259                         //System.out.println(" =============== RowHeader\n "+rh);
1260                         
1261                         Font rowHeaderFont = FontFactory.getFont(FONT_FAMILY, 
1262                                                                                                         FONT_SIZE,
1263                                                                                                         Font.NORMAL, Color.BLACK);
1264                         if(rh.isBold()) {
1265                                 rowHeaderFont.setStyle(Font.BOLD);
1266                                 rowHeaderFont.setSize(FONT_SIZE+1f);
1267                         }
1268                         
1269                         if(rh.getColSpan()>0) {
1270                                 table.getDefaultCell().setColspan(rh.getColSpan());
1271                                 table.getDefaultCell().setBackgroundColor(getRowBackgroundColor(dr, idx));
1272                                 table.addCell(new Paragraph(strip.stripHtml(rh.getRowTitle()),rowHeaderFont));
1273                         }
1274                 }               
1275         }
1276
1277         private void addRowColumns(PdfPTable table, DataRow dr, int idx) {
1278                         
1279                 table.getDefaultCell().setColspan(1);
1280                         
1281                 for(dr.resetNext();dr.hasNext();)
1282                 {
1283                         DataValue dv = dr.getNext();
1284                         //System.out.println(columnCount +" --> "+dv);
1285                         if(dv.isVisible()) {
1286                                 HtmlFormatter cfmt = dv.getCellFormatter();
1287                                 HtmlFormatter rfmt = dv.getRowFormatter();
1288
1289                                 Font cellFont = FontFactory.getFont(FONT_FAMILY, 
1290                                                                                                         FONT_SIZE,
1291                                                                                                         Font.NORMAL, Color.BLACK);
1292                                 if(cfmt!= null) {
1293                                         cellFormatterFont(cfmt,cellFont);
1294                                 }
1295                                 else if(rfmt != null) {
1296                                         cellFormatterFont(rfmt,cellFont);
1297                                 }
1298                                 else {
1299                                         if(dv.isBold()) {
1300                                                 cellFont.setStyle(Font.BOLD);
1301                                         }
1302                                 }
1303                                 
1304                                 String cellValue = strip.stripHtml(dv.getDisplayValue().trim());
1305                                 PdfPCell cell = new PdfPCell(new Paragraph(cellValue,cellFont));
1306                                 
1307                                 //row background color can be overwritten by cell background color
1308                                 cell.setBackgroundColor(getRowBackgroundColor(dr, idx));
1309                                 
1310                                 if(nvl(dv.getAlignment()).trim().length()>0)
1311                                         cell.setHorizontalAlignment(ElementTags.alignmentValue(dv.getAlignment()));
1312                                 else
1313                                         cell.setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1314                                 
1315                                 if(cfmt!= null) {
1316                                         formatterCell(cfmt,cell);
1317                                 }
1318                                 else if(rfmt != null) {
1319                                         formatterCell(rfmt,cell);
1320                                 }
1321                                 
1322                                 table.addCell(cell);
1323                         
1324                         }//if isVisible()
1325                 }                                       
1326         }
1327
1328
1329         private void addTotalRowColumns(PdfPTable table, DataRow dr, int idx) {
1330                 
1331                 table.getDefaultCell().setColspan(1);
1332                 dr.resetNext();
1333                 dr.getNext();
1334                 for(;dr.hasNext();)
1335                 {
1336                         DataValue dv = dr.getNext();
1337                         //System.out.println(columnCount +" --> "+dv);
1338                         if(dv.isVisible()) {
1339                                 HtmlFormatter cfmt = dv.getCellFormatter();
1340                                 HtmlFormatter rfmt = dv.getRowFormatter();
1341
1342                                 Font cellFont = FontFactory.getFont(FONT_FAMILY, 
1343                                                                                                         FONT_SIZE,
1344                                                                                                         Font.NORMAL, Color.BLACK);
1345                                 if(cfmt!= null) {
1346                                         cellFormatterFont(cfmt,cellFont);
1347                                 }
1348                                 else if(rfmt != null) {
1349                                         cellFormatterFont(rfmt,cellFont);
1350                                 }
1351                                 else {
1352                                         if(dv.isBold()) {
1353                                                 cellFont.setStyle(Font.BOLD);
1354                                         }
1355                                 }
1356                                 
1357                                 String cellValue = strip.stripHtml(dv.getDisplayValue().trim());
1358                                 PdfPCell cell = new PdfPCell(new Paragraph(cellValue,cellFont));
1359                                 
1360                                 //row background color can be overwritten by cell background color
1361                                 cell.setBackgroundColor(getRowBackgroundColor(dr, idx));
1362                                 
1363                                 if(nvl(dv.getAlignment()).trim().length()>0)
1364                                         cell.setHorizontalAlignment(ElementTags.alignmentValue(dv.getAlignment()));
1365                                 else
1366                                         cell.setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1367                                 
1368                                 if(cfmt!= null) {
1369                                         formatterCell(cfmt,cell);
1370                                 }
1371                                 else if(rfmt != null) {
1372                                         formatterCell(rfmt,cell);
1373                                 }
1374                                 
1375                                 table.addCell(cell);
1376                         
1377                         }//if isVisible()
1378                 }                                       
1379         }
1380         
1381         
1382         private void formatterCell(HtmlFormatter fmt, PdfPCell cell) {
1383                 
1384                 if(nvl(fmt.getBgColor()).trim().length()>0)
1385                         cell.setBackgroundColor(Color.decode(fmt.getBgColor()));
1386                 if(nvl(fmt.getAlignment()).trim().length()>0)
1387                         cell.setHorizontalAlignment(ElementTags.alignmentValue(fmt.getAlignment()));
1388         }
1389
1390         private void cellFormatterFont(HtmlFormatter fmt, Font font) {
1391                 
1392                 if(fmt.isBold()) 
1393                         font.setStyle(Font.BOLD);
1394                 if(fmt.isItalic()) 
1395                         font.setStyle(Font.ITALIC);
1396                 if(fmt.isUnderline()) 
1397                         font.setStyle(Font.UNDERLINE);
1398                 if(fmt.getFontColor().trim().length()>0)
1399                         font.setColor(Color.decode(fmt.getFontColor()));
1400                 if(fmt.getFontSize().trim().length()>0)
1401                         font.setSize(Float.parseFloat(fmt.getFontSize())-Globals.getDataFontSizeOffset());
1402 //              if(fmt.getFontFace().trim().length()>0)
1403 //                      cellFont.setFamily()
1404                 
1405         }
1406
1407         private Color getRowBackgroundColor(DataRow dr, int idx) {
1408                 
1409                 Color color =  Color.decode(Globals.getDataDefaultBackgroundHexCode());
1410                 
1411                 HtmlFormatter rhf = dr.getRowFormatter();
1412                 if(rhf!=null && nvl(rhf.getBgColor()).trim().length()>0)
1413                         
1414                         color = Color.decode(rhf.getBgColor());
1415                 
1416                 else if(pb.isAlternateColor() && idx%2==0)
1417                         
1418                         color = Color.decode(Globals.getDataBackgroundAlternateHexCode());
1419                 
1420                 return color;           
1421
1422         }
1423
1424         private int getTotalVisbleColumns(ReportData rd) {
1425                 
1426                 int totalVisbleColumn = rd.getTotalColumnCount();
1427                 for(rd.reportDataRows.resetNext();rd.reportDataRows.hasNext();)
1428                 {       
1429                         DataRow dr = rd.reportDataRows.getNext();
1430                         for(dr.resetNext();dr.hasNext();) {
1431                                 DataValue dv = dr.getNext();
1432                                 if(!dv.isVisible())
1433                                     totalVisbleColumn--;
1434                         }
1435                         
1436                         break;
1437                 }
1438                 
1439                 return totalVisbleColumn;
1440         }
1441
1442         /*
1443         private int getFirstRowIndex(ReportRuntime rr) {
1444                 return (pb.getCurrentPage()>0)?pb.getCurrentPage()*rr.getPageSize()+1 : 1;
1445         }
1446         */
1447         private float[] getRelativeWidths(ReportData rd, boolean crosstab){
1448                 
1449                 int totalColumns = getTotalVisbleColumns(rd);
1450                 /*if(rd.reportTotalRowHeaderCols!=null) {
1451                         totalColumns += 1;
1452                 }*/
1453                 if(crosstab) {
1454                         totalColumns += 1;
1455                 }
1456
1457                 if(totalColumns == 0 )
1458                         totalColumns=1;
1459                 
1460                 float[] relativeWidths = new float[totalColumns];
1461                 //initial widths are even
1462                 for(int i=0; i<relativeWidths.length; i++)
1463                         relativeWidths[i] = 10f;
1464                 
1465                 int index=0;
1466                 boolean firstPass = true;
1467                 
1468                 for (rd.reportColumnHeaderRows.resetNext(); rd.reportColumnHeaderRows.hasNext();) 
1469                 {
1470                         if(firstPass) {
1471                                 /*if(rd.reportTotalRowHeaderCols!=null) { 
1472                                         String columnWidth = "5";
1473                                         
1474                                         if(columnWidth != null && columnWidth.trim().endsWith("%"))
1475                                                 relativeWidths[index] = Float.parseFloat(removeLastCharacter(columnWidth));
1476                                         
1477                                         index++;
1478                                 }*/
1479                                 
1480                                 for(rd.reportRowHeaderCols.resetNext();rd.reportRowHeaderCols.hasNext();) {
1481                                         String columnWidth = rd.reportRowHeaderCols.getNext().getColumnWidth();
1482                                         
1483                                         if(columnWidth != null && columnWidth.trim().endsWith("%"))
1484                                                 relativeWidths[index] = Float.parseFloat(removeLastCharacter(columnWidth));
1485                                         
1486                                         index++;
1487                                 }
1488                                 firstPass = false;
1489                         }
1490                 
1491                         ColumnHeaderRow chr = rd.reportColumnHeaderRows.getNext();
1492                         for (chr.resetNext(); chr.hasNext();) {
1493                                 
1494                                 ColumnHeader ch = chr.getNext();
1495
1496                                 if(ch.isVisible()) {
1497                                         
1498                                         String columnWidth = ch.getColumnWidth();
1499                                         
1500                                         if(ch.getColSpan() <= 1){
1501                                                 if(columnWidth != null && columnWidth.trim().endsWith("%")) 
1502                                                         relativeWidths[index] = Float.parseFloat(removeLastCharacter(columnWidth));
1503                                         } 
1504                                         else {
1505                                                 for(int i=0; i<ch.getColSpan(); i++) {
1506                                                         index += i;
1507                                                         if(columnWidth != null && columnWidth.trim().endsWith("%"))
1508                                                                 relativeWidths[index] = 
1509                                                                         (Float.parseFloat(removeLastCharacter(columnWidth)))/ch.getColSpan();                                                   
1510                                                 }
1511                                         }
1512                                         
1513                                         index++;
1514                                 }
1515                         }
1516                 }
1517                 
1518                 return relativeWidths;
1519         }
1520         
1521         public static String removeLastCharacter(String str) {
1522                 return str.substring(0, str.length()-1);
1523         }
1524         
1525         private PdfPTable paintPdfReportHeader(HttpServletRequest request, Document document, PdfPTable table, ReportRuntime rr, float[] f) 
1526                         throws DocumentException, IOException {
1527                 
1528                 HttpSession session = request.getSession();
1529                 String drilldown_index = (String) session.getAttribute("drilldown_index");
1530                 int index = 0;
1531                 try {
1532                  index = Integer.parseInt(drilldown_index);
1533                 } catch (NumberFormatException ex) {
1534                         index = 0;
1535                 }
1536                 String title = (String) session.getAttribute("TITLE_"+index);
1537                 String subtitle = (String) session.getAttribute("SUBTITLE_"+index);
1538                 if(nvl(title).length()>0) {
1539                         //PdfPTable table = new PdfPTable(1);
1540                         table.setWidthPercentage(100f);
1541                         table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1542                         table.getDefaultCell().setVerticalAlignment(Rectangle.ALIGN_BOTTOM);
1543                 
1544         
1545                         Font font = FontFactory.getFont(FONT_FAMILY, 
1546                                         FONT_SIZE-2f,
1547                                         Font.BOLD, 
1548                                         Color.BLACK);
1549                 
1550                         //addEmptyRows(table,1);
1551                         table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1552                         //table.getDefaultCell().setBackgroundColor(Color.decode(Globals.getDataTableHeaderBackgroundFontColor()));
1553                     title = Utils.replaceInString(title, "<BR/>", " ");
1554                     title = Utils.replaceInString(title, "<br/>", " ");
1555                     title = Utils.replaceInString(title, "<br>", " ");
1556                         title  = strip.stripHtml(nvl(title).trim());
1557                         //subtitle = Utils.replaceInString(subtitle, "<BR/>", " ");
1558                         //subtitle = Utils.replaceInString(subtitle, "<br/>", " ");
1559                         //subtitle = Utils.replaceInString(subtitle, "<br>", " ");
1560                         //subtitle  = strip.stripHtml(nvl(subtitle).trim());
1561                         StyleSheet styles = new StyleSheet();
1562                         
1563                         HTMLWorker htmlWorker = new HTMLWorker(document); 
1564                         ArrayList cc = new ArrayList(); 
1565                         cc = htmlWorker.parseToList(new StringReader(subtitle), styles); 
1566                                                 
1567                         Phrase p1 = new Phrase(); 
1568                         for (int i = 0; i < cc.size(); i++){ 
1569                                 Element elem = (Element)cc.get(i); 
1570                                 ArrayList al  = elem.getChunks();
1571                                 for (int j = 0; j < al.size(); j++) {
1572                                         Chunk chunk = (Chunk) al.get(j);
1573                                         chunk.font().setSize(6.0f);
1574                                 }
1575                                 p1.add(elem); 
1576                         } 
1577                         //cell = new PdfPCell(p1);
1578                 StyleSheet style = new StyleSheet();
1579                 style.loadTagStyle("font", "font-size", "3");
1580                 style.loadTagStyle("font", "size", "3");
1581             styles.loadStyle("pdfFont1", "size", "11px");                                 
1582             styles.loadStyle("pdfFont1", "font-size", "11px"); 
1583                 /*ArrayList p = HTMLWorker.parseToList(new StringReader(nvl(title)), style);
1584                 for (int k = 0; k < p.size(); ++k){
1585                         document.add((com.lowagie.text.Element)p.get(k));
1586                 }*/
1587             //p1.font().setSize(3.0f);
1588                         PdfPCell titleCell = new PdfPCell(new Phrase(title, font));
1589                         titleCell.setColspan(rr.getVisibleColumnCount());
1590                         PdfPCell subtitleCell = new PdfPCell(p1);
1591                         subtitleCell.setColspan(rr.getVisibleColumnCount());
1592                         titleCell.setHorizontalAlignment(1);
1593                         subtitleCell.setHorizontalAlignment(1);
1594                         table.addCell(titleCell);
1595                         table.addCell(subtitleCell);
1596                         //document.add(table);
1597                 }
1598                 return table;
1599         }
1600
1601
1602         private void paintPdfReportFooter(HttpServletRequest request, Document document, ReportRuntime rr, float[] f) 
1603                         throws DocumentException, IOException {
1604                 
1605                 HttpSession session = request.getSession();
1606                 String drilldown_index = (String) session.getAttribute("drilldown_index");
1607                 int index = 0;
1608                 try {
1609                  index = Integer.parseInt(drilldown_index);
1610                 } catch (NumberFormatException ex) {
1611                         index = 0;
1612                 }
1613
1614                 String title = (String) session.getAttribute("FOOTER_"+index);
1615                 if(nvl(title).length()>0) {
1616                         PdfPTable table = new PdfPTable(1);
1617                         table.setWidthPercentage(100f);
1618                         table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1619                         table.getDefaultCell().setVerticalAlignment(Rectangle.ALIGN_BOTTOM);
1620                 
1621                         Font font = FontFactory.getFont(FONT_FAMILY, 
1622                                         FONT_SIZE-3f,
1623                                         Font.BOLD, 
1624                                         Color.BLACK);
1625                 
1626                         
1627                         //addEmptyRows(table,1);
1628                         table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1629                         //table.getDefaultCell().setBackgroundColor(Color.decode(Globals.getDataTableHeaderBackgroundFontColor()));
1630                     /*title = Utils.replaceInString(title, "<BR/>", " ");
1631                     title = Utils.replaceInString(title, "<br/>", " ");
1632                     title = Utils.replaceInString(title, "<br>", " ");
1633                         title  = strip.stripHtml(nvl(title).trim());*/
1634                 StyleSheet style = new StyleSheet();
1635                 
1636                         HTMLWorker htmlWorker = new HTMLWorker(document); 
1637                         ArrayList cc = new ArrayList(); 
1638                         cc = htmlWorker.parseToList(new StringReader(title), style); 
1639                                                 
1640                         Phrase p1 = new Phrase(); 
1641                         for (int i = 0; i < cc.size(); i++){ 
1642                                 Element elem = (Element)cc.get(i); 
1643                                 ArrayList al  = elem.getChunks();
1644                                 for (int j = 0; j < al.size(); j++) {
1645                                         Chunk chunk = (Chunk) al.get(j);
1646                                         chunk.font().setSize(6.0f);
1647                                 }
1648                                 p1.add(elem); 
1649                         } 
1650                 
1651 /*                      
1652                         HTMLWorker.parseToList(new StringReader(nvl(title)), style);*/
1653                         PdfPCell titleCell = new PdfPCell(p1);
1654                         titleCell.setHorizontalAlignment(Element.ALIGN_LEFT);
1655                         table.addCell(titleCell);
1656                         //table.
1657                         document.add(table);
1658                 }
1659                 //return table;
1660         }
1661         
1662         
1663         private void paintPdfTableHeader(Document document, ReportData rd, PdfPTable table) 
1664                                                                                                                                 throws DocumentException {
1665                         
1666                 Font font = FontFactory.getFont(FONT_FAMILY, 
1667                                                                                 FONT_SIZE+1f,
1668                                                                                 Font.BOLD, 
1669                                                                                 Color.decode(Globals.getDataTableHeaderFontColor()));
1670                 //table.setHeaderRows(1);
1671                 table.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
1672                 table.getDefaultCell().setBackgroundColor(Color.decode(Globals.getDataTableHeaderBackgroundFontColor()));
1673                 String title = "";
1674                 
1675                 boolean firstPass = true;
1676                 
1677                 /*if(rd.reportTotalRowHeaderCols!=null) {
1678                         if(firstPass) {
1679                                 table.addCell(new Paragraph("No.", font));
1680                                 firstPass = false;
1681                         }
1682                 }*/             
1683                 for (rd.reportColumnHeaderRows.resetNext(); rd.reportColumnHeaderRows.hasNext();) 
1684                 {
1685                         if(firstPass) {
1686                                 for(rd.reportRowHeaderCols.resetNext();rd.reportRowHeaderCols.hasNext();) {
1687                                         /*if(firstPass) {
1688                                                 table.addCell(new Paragraph("No.", font));
1689                                                 firstPass = false;
1690                                         } else {*/
1691                                                 RowHeaderCol rhc = rd.reportRowHeaderCols.getNext();
1692                                                 title = rhc.getColumnTitle();
1693                                         title = Utils.replaceInString(title,"_nl_", " \n");
1694                                                 table.addCell(new Paragraph(title,font));
1695                                         //}
1696                                 }
1697                         }
1698                         
1699                         ColumnHeaderRow chr = rd.reportColumnHeaderRows.getNext();
1700                         for (chr.resetNext(); chr.hasNext();) {
1701                                 ColumnHeader ch = chr.getNext();
1702                                 //System.out.println(ch);
1703                                 if(ch.isVisible()) {
1704                                         title = ch.getColumnTitle();
1705                                 title = Utils.replaceInString(title,"_nl_", " \n");
1706                                         table.addCell(new Paragraph(title,font));
1707                                 }
1708                         }
1709                 }
1710         }
1711         
1712         public static String currentTime(String pattern) {
1713                 try {
1714                 SimpleDateFormat oracleDateFormat = new SimpleDateFormat("MM/dd/yyyy kk:mm:ss");
1715                 Date sysdate = oracleDateFormat.parse(ReportLoader.getSystemDateTime());
1716                 SimpleDateFormat dtimestamp = new SimpleDateFormat(Globals.getScheduleDatePattern());
1717                 return dtimestamp.format(sysdate)+" "+Globals.getTimeZone();
1718                 //paramList.add(new IdNameValue("DATE", dtimestamp.format(sysdate)+" "+Globals.getTimeZone()));
1719         } catch(Exception ex) {}         
1720                 
1721                 SimpleDateFormat s = new SimpleDateFormat(pattern);
1722                 s.setTimeZone(TimeZone.getTimeZone(Globals.getTimeZone()));
1723                 //System.out.println("^^^^^^^^^^^^^^^^^^^^ " + Calendar.getInstance().getTime());
1724                 //System.out.println("^^^^^^^^^^^^^^^^^^^^ " + s.format(Calendar.getInstance().getTime()));
1725                 return s.format(Calendar.getInstance().getTime());
1726         }
1727
1728         private PdfBean preparePdfBean(HttpServletRequest request,ReportRuntime rr) {
1729                 PdfBean pb = new PdfBean();
1730
1731                 pb.setUserId(AppUtils.getUserID(request));
1732
1733                 pb.setWhereToShowPageNumber(Globals.getPageNumberPosition());
1734                 pb.setAlternateColor(Globals.isDataAlternateColor());
1735                 pb.setTimestampPattern(Globals.getDatePattern());
1736
1737                 int temp = -1;
1738                 try {
1739                         temp = Integer.parseInt(request.getParameter(AppConstants.RI_NEXT_PAGE));
1740                 } catch (NumberFormatException e) {}            
1741                 pb.setCurrentPage(temp);
1742         
1743                 //pb.setPortrait( trueORfalse(request.getParameter("isPortrait"),true));
1744                 pb.setPortrait(trueORfalse(rr.getPDFOrientation() == "portait"?"true":"false", true));
1745                 //pb.setCoverPageIncluded( trueORfalse(request.getParameter("isCoverPageIncluded"), true));
1746                 //if(Globals.isCoverPageNeeded()) {
1747                         pb.setCoverPageIncluded(Globals.isCoverPageNeeded()?rr.isPDFCoverPage():false);
1748                 //}
1749                 pb.setTitle(nvl(request.getParameter("title")));
1750                 pb.setPagesize(nvls(request.getParameter("pagesize"),"LETTER"));
1751                 
1752                 pb.setLogo1Url(rr.getPDFLogo1());
1753                 pb.setLogo2Url(rr.getPDFLogo2());
1754                 pb.setLogo1Size(rr.getPDFLogo1Size());
1755                 pb.setLogo2Size(rr.getPDFLogo2Size());
1756                 pb.setFullWebContextPath(request.getSession().getServletContext().getRealPath(File.separator));
1757                 
1758
1759                 pb.setDisplayChart(nvl(rr.getChartType()).trim().length()>0 && rr.getDisplayChart());
1760                         
1761                 String id = nvl(request.getParameter("pdfAttachmentKey")).trim();
1762                 String log_id = nvl(request.getParameter("log_id")).trim();
1763                 if(id.length()>0 && log_id.length()>0)
1764                         pb.setAttachmentOfEmail(true);
1765                 
1766                 return pb;
1767         }
1768         
1769         private boolean trueORfalse(String str) {
1770                 return (str != null) && (str.equalsIgnoreCase("true"));
1771         }
1772         
1773         private boolean trueORfalse(String str,boolean b_default) {
1774                 return str==null ? b_default : (str.equalsIgnoreCase("true"));
1775         }
1776         
1777    
1778 }