package com.appirio.report; import static net.sf.dynamicreports.report.builder.DynamicReports.cmp; import static net.sf.dynamicreports.report.builder.DynamicReports.col; import static net.sf.dynamicreports.report.builder.DynamicReports.field; import static net.sf.dynamicreports.report.builder.DynamicReports.grp; import static net.sf.dynamicreports.report.builder.DynamicReports.report; import static net.sf.dynamicreports.report.builder.DynamicReports.stl; import static net.sf.dynamicreports.report.builder.DynamicReports.type; import java.awt.Color; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import net.sf.dynamicreports.jasper.builder.JasperReportBuilder; import net.sf.dynamicreports.jasper.builder.export.Exporters; import net.sf.dynamicreports.report.base.AbstractScriptlet; import net.sf.dynamicreports.report.base.expression.AbstractSimpleExpression; import net.sf.dynamicreports.report.builder.DynamicReports; import net.sf.dynamicreports.report.builder.FieldBuilder; import net.sf.dynamicreports.report.builder.Units; import net.sf.dynamicreports.report.builder.column.ComponentColumnBuilder; import net.sf.dynamicreports.report.builder.column.TextColumnBuilder; import net.sf.dynamicreports.report.builder.component.HorizontalListBuilder; import net.sf.dynamicreports.report.builder.component.SubreportBuilder; import net.sf.dynamicreports.report.builder.component.VerticalListBuilder; import net.sf.dynamicreports.report.builder.datatype.BigDecimalType; import net.sf.dynamicreports.report.builder.group.ColumnGroupBuilder; import net.sf.dynamicreports.report.builder.group.CustomGroupBuilder; import net.sf.dynamicreports.report.builder.style.PaddingBuilder; import net.sf.dynamicreports.report.builder.style.PenBuilder; import net.sf.dynamicreports.report.builder.style.ReportStyleBuilder; import net.sf.dynamicreports.report.builder.style.StyleBuilder; import net.sf.dynamicreports.report.constant.GroupHeaderLayout; import net.sf.dynamicreports.report.constant.HorizontalAlignment; import net.sf.dynamicreports.report.constant.PageOrientation; import net.sf.dynamicreports.report.definition.ReportParameters; import net.sf.dynamicreports.report.exception.DRException; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.data.JRXmlDataSource; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import com.appirio.PDFCombinerContentEntry; import com.appirio.PDFCombinerFile; /** * @author jesus * * This generates a Report in PDF or XLS format. Uses xml as a * datasource and can be defined which fields and summary options to * use. Uses DynamicReports java library * (http://www.dynamicreports.org/) */ public class PdfReporter extends Reporter { private static final String QUERY_RESULT_RECORDS_WITH_CHILD_FLIGHT_LINES = "/QueryResult/records[Child_Flight_Lines__r = boolean(1) and RecordTypeId = boolean(0)]"; private static final String QUERY_RESULT_RECORDS_UNIQUE_PACKAGE = "/QueryResult/records/Package_Flight__r/Package_Market__r/Package__r[not(@url=preceding::Package_Flight__r/Package_Market__r/Package__r/@url)]"; private static final String QUERY_RESULT_RECORDS_UNIQUE_MARKET = "/QueryResult/records/Package_Flight__r/Package_Market__r[not(@url=preceding::Package_Flight__r/Package_Market__r/@url)]"; private static final String QUERY_RESULT_RECORDS_UNIQUE_FLIGHT = "/QueryResult/records/Package_Flight__r[not(@url=preceding::Package_Flight__r/@url)]"; private static final String QUERY_RESULT_RECORDS_RECORD_TYPE_ID_BOOLEAN_1 = "/QueryResult/records[RecordTypeId = boolean(1)]"; private static final String QUERY_RESULT_RECORDS_RECORD_TYPE_ID_BOOLEAN_0 = "/QueryResult/records[RecordTypeId = boolean(0)]"; // page number where shipping instructions start private Integer shippingInstructionsPageNumber = null; // page number where shipping instructions start private boolean doesShippingInstructionsExists = false; // map panel order pref file name private String mapPanelOrderPrefDataSourceFileName; private String detailDataSourceFileName; // summary level enum private enum SummaryLevelEnum { Market, Package }; // column hashmap (key = column name, value = label) private HashMap<String, String> flightLineColumnLabelHashMap = null; private Set<String> autoDisclaimersSet = new HashSet<String>(); DisclaimerStore disclaimerStore = new DisclaimerStore(); private Map<String, Set<String>> divisionsMap = new HashMap<String, Set<String>>(); private Map<String, Set<String>> marketNamesMap = new HashMap<String, Set<String>>(); private Map<String, Set<String>> marketTypesMap = new HashMap<String, Set<String>>(); private Map<String, Set<String>> packageNamesMap = new HashMap<String, Set<String>>(); private Map<String, List<String>> flightNamesMap = new HashMap<String, List<String>>(); private Map<String, Set<String>> flightTypesMap = new HashMap<String, Set<String>>(); private Map<String, Set<String>> startDatesMap = new HashMap<String, Set<String>>(); private Map<String, Set<String>> endDatesMap = new HashMap<String, Set<String>>(); private Map<String, Set<String>> durationsMap = new HashMap<String, Set<String>>(); private Map<String, Set<String>> targetsMap = new HashMap<String, Set<String>>(); private Map<String, Set<String>> targetPopulationsMap = new HashMap<String, Set<String>>(); private Map<String, Set<String>> packageCommentsMap = new HashMap<String, Set<String>>(); private Map<String, List<String>> flightCommentsMap = new HashMap<String, List<String>>(); private StyleBuilder flightHeaderStyle; private StyleBuilder columnTitleStyle; // record count (flight lines in total) private Integer recordCount = 0; public List<DisclaimerStore.DisclaimerWrapper> validAllDisclaimersList = new ArrayList<DisclaimerStore.DisclaimerWrapper>(); public List<String> validDisclaimersListDisplay = new ArrayList<String>(); /** * Used to record content entries during generating pdf report. */ private List<Integer> tocEntries = new ArrayList<Integer>(); public PdfReporter(String dataSourceFileName, String disclaimerDataSourceFileName, String mapPanelOrderPrefDataSourceFileName, String shippingInstructionsDataSourceFileName, Boolean excludeNetworkDetails, Boolean showTotalProgramSummary, Boolean showIndividualMarketSummary, Boolean showIndividualFlightSummary, PDFCombinerFile pdfCombinerFile, List<PDFCombinerFile> appendixes) throws Exception { /*System.out.println("Reporter: begin"); System.out .println(" --- Information for repeating report using ReporterTest ---"); System.out.println(" dataSourceFileName : " + dataSourceFileName); System.out.println(" disclaimerDataSourceFileName : " + disclaimerDataSourceFileName); System.out.println(" shippingInstructionsDataSourceFileName : " + shippingInstructionsDataSourceFileName); System.out.println(" mapPanelOrderPrefDataSourceFileName: " + mapPanelOrderPrefDataSourceFileName); System.out.println(" excludeNetworkDetails : " + excludeNetworkDetails); System.out.println(" showTotalProgramSummary : " + showTotalProgramSummary); System.out.println(" showIndividualMarketSummary : " + showIndividualMarketSummary); System.out.println(" showIndividualFlightSummary : " + showIndividualFlightSummary); System.out.println(" getFieldNamesPipeDelimited : " + pdfCombinerFile.getFieldNamesPipeDelimited()); System.out.println(" getFieldLabelsPipeDelimited: " + pdfCombinerFile.getFieldLabelsPipeDelimited()); System.out.println(" getFieldTypesPipeDelimited : " + pdfCombinerFile.getFieldTypesPipeDelimited());*/ boolean locationMapExists = hasLocationMapAttachments(appendixes); // set flight line column - label setFlightLineColumnLabelHashMap(getKeyValueHashMap(pdfCombinerFile .getFieldNamesPipeDelimited().get(0), pdfCombinerFile .getFieldLabelsPipeDelimited().get(0))); // set the file name for map panel order pref setMapPanelOrderPrefDataSourceFileName(mapPanelOrderPrefDataSourceFileName); setDetailDataSourceFileName(dataSourceFileName); /*System.out.println(" ------- labels -----------"); for (String label : pdfCombinerFile.getFieldLabelsPipeDelimited()) { System.out.println(" label: " + label); }*/ try { PenBuilder grayThinLine = stl.penThin().setLineColor( Color.LIGHT_GRAY); PaddingBuilder padding = stl.padding(Units.inch(0.03)); StyleBuilder boldStyle = stl.style().bold(); StyleBuilder boldRightAlignStyle = stl.style(boldStyle) .setHorizontalAlignment(HorizontalAlignment.RIGHT); StyleBuilder boldCenteredStyle = stl.style(boldStyle); columnTitleStyle = stl.style(boldCenteredStyle).setPadding(padding) .setBorder(grayThinLine).setFontSize(8) .setForegroundColor(new Color(255, 255, 255)) .setBackgroundColor(new Color(0, 153, 216)) .setHorizontalAlignment(HorizontalAlignment.CENTER); StyleBuilder groupHeaderStyleNew = stl.style().setFontSize(0) .setBackgroundColor(new Color(255, 255, 255)); setFlightHeaderStyle(stl.style(boldRightAlignStyle) .setLeftPadding(Units.inch(0.5)).setPadding(padding) .setFontSize(8)); StyleBuilder flightHeaderValueStyle = stl.style() .setPadding(padding).setFontSize(8); StyleBuilder columnStyle = stl.style().setPadding(padding) .setBorder(grayThinLine).setFontSize(8); StyleBuilder summaryStyle = stl.style().setPadding(padding) .setFontSize(10); // readfile(dataSourceFileName); // ================ define report JRXmlDataSource dataSource = new JRXmlDataSource( dataSourceFileName, "/QueryResult/records"); // count records recordCount = 0; while (dataSource.next()) { recordCount++; } dataSource.moveFirst(); new DisclaimersDataExpression(disclaimerDataSourceFileName); // Anjali 6 sept- increased this to accomodate max 34 cols in pdf. // else they get wrapped up. JasperReportBuilder b = report() .setPageFormat(Units.inch(23.4), Units.inch(16.5), PageOrientation.PORTRAIT) .setPageMargin(DynamicReports.margin(20)) .setDataSource(dataSource); // create an expression that gets information for a previous record // at market flight level PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression = new PackageMarketFlightPreviousRecordExpression(); // information for a previous record (flight line) FlightLinePreviousRecordExpression flightLinePreviousRecordExpression = new FlightLinePreviousRecordExpression(); // add detail level Integer fieldLevel = 1; // ============ create a vertical table of flight titles: begin boolean isDetail = fieldLevel - 1 == 0; if (isDetail) { //System.out.println(" creating header"); b.pageHeader( cmp.horizontalList().add( cmp.image("/app/public/images/CCOA-logo.png") .setFixedDimension(244, 22)), // cmp.text(textValue).setStyle(titleStyle), cmp.text("")); } // ============ create a vertical table of flight titles: end // add flight fields FieldBuilder<String> marketIdField = field( "Package_Flight__r/Package_Market__r/Id", String.class); FieldBuilder<String> packageIdField = field( "Package_Flight__r/Package_Market__r/Package__r/Id", String.class); FieldBuilder<String> flightIdField = field("Package_Flight__r/Id", String.class); FieldBuilder<String> flightTypeField = field( "Package_Flight__r/Type__c", String.class); FieldBuilder<String> mediaCategoryField = field( "Package_Flight__r/Media_Category__c", String.class); FieldBuilder<String> flightCommentsField = field( "Package_Flight__r/Flight_Comments__c", String.class); FieldBuilder<String> flightDivisionField = field( "Package_Flight__r/Division__c", String.class); FieldBuilder<String> flightPackageNameField = field( "Package_Flight__r/Package_Name__c", String.class); FieldBuilder<String> flightMarketNameField = field( "Package_Flight__r/Market_Name__c", String.class); FieldBuilder<String> flightMarketTypeField = field( "Package_Flight__r/Market_Type__c", String.class); FieldBuilder<String> flightNameField = field( "Package_Flight__r/Name", String.class); FieldBuilder<String> flightStartDateField = field( "Package_Flight__r/Campaign_Start_Date__c", String.class); FieldBuilder<String> flightEndDateField = field( "Package_Flight__r/Campaign_End_Date__c", String.class); FieldBuilder<String> flightDurationField = field( "Package_Flight__r/Duration_And_Type__c", String.class); FieldBuilder<String> flightTargetField = field( "Package_Flight__r/Target__c", String.class); FieldBuilder<Integer> flightTargetPopulationField = field( "Package_Flight__r/Target_Population__c", Integer.class); FieldBuilder<String> flightPackageCommentsField = field( "Package_Flight__r/Package_Comments__c", String.class); FieldBuilder<String> additionalCostTypeField = field( "Additional_Cost_Type__c", String.class); FieldBuilder<String> additionalCostField = field( "Additional_Cost__c", String.class); b.addField(marketIdField); b.addField(packageIdField); b.addField(flightIdField); b.addField(flightTypeField); b.addField(mediaCategoryField); b.addField(flightCommentsField); b.addField(flightDivisionField); b.addField(flightPackageNameField); b.addField(flightMarketNameField); b.addField(flightMarketTypeField); b.addField(flightNameField); b.addField(flightStartDateField); b.addField(flightEndDateField); b.addField(flightDurationField); b.addField(flightTargetField); b.addField(flightTargetPopulationField); b.addField(flightPackageCommentsField); b.addField(additionalCostTypeField); b.addField(additionalCostField); // group by flight //System.out.println(" creating group"); CustomGroupBuilder group = grp.group(new FlightIdGroupExpression()); group.setHeaderLayout(GroupHeaderLayout.EMPTY); group.setStyle(groupHeaderStyleNew); group.startInNewPage(); PackageChangedExpression packageHeaderChangedExpression = new PackageChangedExpression( packageMarketFlightPreviousRecordExpression); // =================== previous values observers: begin PackageMarketFlightPreviousRecordHadAudienceExpression packageMarketFlightPreviousRecordHadAudienceExpression = new PackageMarketFlightPreviousRecordHadAudienceExpression( packageMarketFlightPreviousRecordExpression); PackageMarketFlightPreviousRecordHadLocationExpression packageMarketFlightPreviousRecordHadLocationExpression = new PackageMarketFlightPreviousRecordHadLocationExpression( packageMarketFlightPreviousRecordExpression); PackageMarketFlightPreviousRecordHadRotaryExpression packageMarketFlightPreviousRecordHadRotaryExpression = new PackageMarketFlightPreviousRecordHadRotaryExpression( packageMarketFlightPreviousRecordExpression); PackageMarketFlightPreviousRecordHadNetworkExpression packageMarketFlightPreviousRecordHadNetworkExpression = new PackageMarketFlightPreviousRecordHadNetworkExpression( packageMarketFlightPreviousRecordExpression); // =================== previous values observers: end // add group b.addGroup(group); FlightNameReportScriptlet flightNameSubreportScriptlet = new FlightNameReportScriptlet(); b.scriptlets(flightNameSubreportScriptlet); // =================== report flight headers: begin JRXmlDataSource packageHeaderDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_FLIGHT); new FlightDataExpression(packageHeaderDataSource); SubreportBuilder packageHeaderSubreport = cmp .subreport( new PackageHeaderSubreportExpression( flightHeaderStyle, flightHeaderValueStyle)) .setDataSource(packageHeaderDataSource) .setPrintWhenExpression(packageHeaderChangedExpression) .removeLineWhenBlank(); // =================== report flight headers: end //System.out.println(" creating subreport"); // set information for a previous record at market flight level CustomGroupBuilder packageMarketFlightPreviousRecordCustomGroupBuilder = grp .group(packageMarketFlightPreviousRecordExpression); b.addGroup(packageMarketFlightPreviousRecordCustomGroupBuilder); // =================== end // =================== audience subreport: begin JRXmlDataSource audienceDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_RECORD_TYPE_ID_BOOLEAN_0); SubreportBuilder audienceSubreport = cmp .subreport( new AudienceSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, false)) .setDataSource(audienceDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadAudienceExpression) .removeLineWhenBlank(); // =================== audience subreport: end // =================== audience subreport summary: begin JRXmlDataSource audienceFlightSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_RECORD_TYPE_ID_BOOLEAN_1); SubreportBuilder audienceFlightSummarySubreport = cmp .subreport( new AudienceSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, true)) .setDataSource(audienceFlightSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadAudienceExpression) .removeLineWhenBlank(); // =================== audience subreport summary: end // =================== audience subreport market summary: begin JRXmlDataSource audienceMarketSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_MARKET); SubreportBuilder audienceMarketSummarySubreport = cmp .subreport( new AudienceSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, true, SummaryLevelEnum.Market)) .setDataSource(audienceMarketSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadAudienceExpression) .removeLineWhenBlank(); // =================== audience subreport summary: end // =================== audience subreport package summary: begin JRXmlDataSource audiencePackageSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_PACKAGE); SubreportBuilder audiencePackageSummarySubreport = cmp .subreport( new AudienceSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, true, SummaryLevelEnum.Package)) .setDataSource(audiencePackageSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadAudienceExpression) .removeLineWhenBlank(); // =================== audience subreport summary: end // =================== location subreport: begin JRXmlDataSource locationDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_RECORD_TYPE_ID_BOOLEAN_0); SubreportBuilder locationSubreport = cmp .subreport( new LocationSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, false, locationMapExists)) .setDataSource(locationDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadLocationExpression) .removeLineWhenBlank(); // =================== location subreport: end // =================== location summary subreport: begin JRXmlDataSource locationFlightSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_RECORD_TYPE_ID_BOOLEAN_1); SubreportBuilder locationFlightSummarySubreport = cmp .subreport( new LocationSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, true, locationMapExists)) .setDataSource(locationFlightSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadLocationExpression) .removeLineWhenBlank(); // =================== location subreport: end // =================== location market summary subreport: begin JRXmlDataSource locationMarketSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_MARKET); SubreportBuilder locationMarketSummarySubreport = cmp .subreport( new LocationSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, true, locationMapExists, SummaryLevelEnum.Market)) .setDataSource(locationMarketSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadLocationExpression) .removeLineWhenBlank(); // =================== location market summary subreport: end // =================== location package summary subreport: begin JRXmlDataSource locationPackageSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_PACKAGE); SubreportBuilder locationPackageSummarySubreport = cmp .subreport( new LocationSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, true, locationMapExists, SummaryLevelEnum.Package)) .setDataSource(locationPackageSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadLocationExpression) .removeLineWhenBlank(); // =================== location market summary subreport: end // =================== rotary subreport: begin JRXmlDataSource rotaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_RECORD_TYPE_ID_BOOLEAN_0); SubreportBuilder rotarySubreport = cmp .subreport( new RotarySubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, false)) .setDataSource(rotaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadRotaryExpression) .removeLineWhenBlank(); // =================== rotary subreport: end // =================== rotary summary subreport: begin JRXmlDataSource rotaryFlightSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_RECORD_TYPE_ID_BOOLEAN_1); SubreportBuilder rotaryFlightSummarySubreport = cmp .subreport( new RotarySubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, true)) .setDataSource(rotaryFlightSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadRotaryExpression) .removeLineWhenBlank(); // =================== rotary summary subreport: end // =================== rotary market summary subreport: begin JRXmlDataSource rotaryMarketSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_MARKET); SubreportBuilder rotaryMarketSummarySubreport = cmp .subreport( new RotarySubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, true, SummaryLevelEnum.Market)) .setDataSource(rotaryMarketSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadRotaryExpression) .removeLineWhenBlank(); // =================== rotary market summary subreport: end // =================== rotary market summary subreport: begin JRXmlDataSource rotaryPackageSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_PACKAGE); SubreportBuilder rotaryPackageSummarySubreport = cmp .subreport( new RotarySubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, true, SummaryLevelEnum.Package)) .setDataSource(rotaryPackageSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadRotaryExpression) .removeLineWhenBlank(); // =================== rotary market summary subreport: end // =================== network subreport: begin JRXmlDataSource networkDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_WITH_CHILD_FLIGHT_LINES); SubreportBuilder networkSubreport = cmp .subreport( new NetworkSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, flightLinePreviousRecordExpression, columnTitleStyle, columnStyle, false, excludeNetworkDetails)) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadNetworkExpression) .setDataSource(networkDataSource).removeLineWhenBlank(); // =================== network subreport: end // =================== network subreport: begin JRXmlDataSource networkFlightSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_RECORD_TYPE_ID_BOOLEAN_1); SubreportBuilder networkFlightSummarySubreport = cmp .subreport( new NetworkSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, null, columnTitleStyle, columnStyle, true, true)) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadNetworkExpression) .setDataSource(networkFlightSummaryDataSource) .removeLineWhenBlank(); // =================== network subreport: end // =================== network market summary subreport: begin JRXmlDataSource networkMarketSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_MARKET); SubreportBuilder networkMarketSummarySubreport = cmp .subreport( new NetworkSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, null, columnTitleStyle, columnStyle, true, true, SummaryLevelEnum.Market)) .setDataSource(networkMarketSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadNetworkExpression) .removeLineWhenBlank(); // =================== network market summary subreport: end // =================== network package summary subreport: begin JRXmlDataSource networkPackageSummaryDataSource = new JRXmlDataSource( dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_PACKAGE); SubreportBuilder networkPackageSummarySubreport = cmp .subreport( new NetworkSubreportExpression( dataSourceFileName, packageMarketFlightPreviousRecordExpression, null, columnTitleStyle, columnStyle, true, true, SummaryLevelEnum.Package)) .setDataSource(networkPackageSummaryDataSource) .setPrintWhenExpression( packageMarketFlightPreviousRecordHadNetworkExpression) .removeLineWhenBlank(); // =================== network market summary subreport: end // =================== subreport and summaries positioning: begin group.footer(packageHeaderSubreport); group.footer(audienceSubreport); if (showIndividualFlightSummary) group.footer(audienceFlightSummarySubreport); if (showIndividualMarketSummary) group.footer(audienceMarketSummarySubreport); if (showTotalProgramSummary) group.footer(audiencePackageSummarySubreport); group.footer(locationSubreport); if (showIndividualFlightSummary) group.footer(locationFlightSummarySubreport); if (showIndividualMarketSummary) group.footer(locationMarketSummarySubreport); if (showTotalProgramSummary) group.footer(locationPackageSummarySubreport); group.footer(rotarySubreport); if (showIndividualFlightSummary) group.footer(rotaryFlightSummarySubreport); if (showIndividualMarketSummary) group.footer(rotaryMarketSummarySubreport); if (showTotalProgramSummary) group.footer(rotaryPackageSummarySubreport); group.footer(networkSubreport); if (showIndividualFlightSummary) group.footer(networkFlightSummarySubreport); if (showIndividualMarketSummary) group.footer(networkMarketSummarySubreport); if (showTotalProgramSummary) group.footer(networkPackageSummarySubreport); // =================== subreport and summaries positioning: end // styles // b.setTableOfContents(true); // b.pageFooter(cmp.pageXofY()); b.highlightDetailEvenRows(); b.setColumnStyle(columnStyle); b.setSubtotalStyle(columnStyle); b.setGroupStyle(groupHeaderStyleNew); // =================== begin // Shipping instructions is part of the Plan that is displayed after // all Plan Data is rendered in PDF JRXmlDataSource shippingInstructionsDataSource = null; if (shippingInstructionsDataSourceFileName != null) { shippingInstructionsDataSource = new JRXmlDataSource( shippingInstructionsDataSourceFileName, "/QueryResult/records"); this.setDoesShippingInstructionsExists(shippingInstructionsDataSource .next()); shippingInstructionsDataSource.moveFirst(); ShippingInstructionsSubreportExpression shippingInstructionsSubreportExpression = new ShippingInstructionsSubreportExpression( this); SubreportBuilder shippingInstructionsSubreport = cmp .subreport(shippingInstructionsSubreportExpression) .setDataSource(shippingInstructionsDataSource) .removeLineWhenBlank(); b.summary(shippingInstructionsSubreport); //System.out.println(" doesShippingInstructionsExists " + doesShippingInstructionsExists); if (doesShippingInstructionsExists) { VerticalListBuilder autoValidDisclaimerReports = cmp .verticalList(); b.summary(cmp.text("")); b.summary(cmp.text("")); autoValidDisclaimerReports.add(cmp.text("Important Notes:") .setStyle(boldStyle).removeLineWhenBlank()); autoValidDisclaimerReports.add(cmp.text( new AutoDisclaimerExpression()).setStyle( summaryStyle)); b.summary(autoValidDisclaimerReports); } } // =================== end // throw an exception if internal use fields are not set if (!hasRequiredInternalUseFields(b)) { throw new Exception("Required fields missing" + StringUtils.join(getRequiredMissingFieldsList(b), ", ")); } // export b.toPdf(Exporters.pdfExporter(getGeneratedReport("pdf"))); // As DynamicReports doesn't have a method/property that return // Table of Contents (TOC) entries for more info see here: // http://www.dynamicreports.org/forum/viewtopic.php?f=1&t=416&sid=25edfbfe63ade19e637c1a79f5974ee1 // We'll do an additional export in csv format after having exported // to usual pdf/xls export formats. // This way other clients can pull report as csv and grab manually // the TOC entries. b.setTableOfContents(true); b.rebuild(); b.toCsv(Exporters.csvExporter(getGeneratedReport("csv"))); } catch (JRException e) { //System.out.println("Exception in Reporter: " + e.getMessage()); e.printStackTrace(); throw new Exception("Exception while creating jasper report: " + e.getMessage(), e); } catch (ParserConfigurationException e) { //System.out.println("Exception in Reporter: " + e.getMessage()); e.printStackTrace(); throw new Exception( "Exception while parsing, wrong parser config: " + e.getMessage(), e); } catch (SAXException e) { //System.out.println("Exception in Reporter: " + e.getMessage()); e.printStackTrace(); throw new Exception("Exception while parsing xml: " + e.getMessage(), e); } catch (IOException e) { //System.out.println("Exception in Reporter: " + e.getMessage()); e.printStackTrace(); throw new Exception("Exception during file I/O: " + e.getMessage(), e); } catch (ParseException e) { //System.out.println("Exception in Reporter: " + e.getMessage()); e.printStackTrace(); throw new Exception("Exception while parsing text: " + e.getMessage(), e); } catch (DRException e) { //System.out.println("Exception in Reporter: " + e.getMessage()); e.printStackTrace(); throw new Exception( "Exception while creating dynamic jasper report: " + e.getMessage(), e); } } public PdfReporter() { // TODO Auto-generated constructor stub } private boolean hasRequiredInternalUseFields(JasperReportBuilder report) { return getRequiredMissingFieldsList(report).size() == 0; } private List<String> getRequiredMissingFieldsList(JasperReportBuilder report) { ArrayList<String> requiredFieldsList = new ArrayList<String>(); requiredFieldsList.add("Package_Flight__r/Id"); requiredFieldsList.add("Package_Flight__r/Name"); requiredFieldsList.add("Package_Flight__r/Type__c"); requiredFieldsList.add("Package_Flight__r/Package_Name__c"); requiredFieldsList.add("Package_Flight__r/Media_Category__c"); requiredFieldsList.add("Package_Flight__r/Package_Market__r/Id"); requiredFieldsList .add("Package_Flight__r/Package_Market__r/Package__r/Id"); for (Integer i = 0; i < report.getReport().getFields().size(); i++) { // searched field name String fieldName = report.getReport().getFields().get(i).getName(); // check if searched field name is in required field list if (requiredFieldsList.contains(fieldName)) { // as this field exists, remove it from the required field list requiredFieldsList.remove(report.getReport().getFields().get(i) .getName()); } } return requiredFieldsList; } // returns true if first fieldname from array has three parts and // penultimate part is Package_Market__r // this indicates that is a market level field // sample for true case: Package_Flight__r/Package_Market__r/Market_Name__c // sample for false case: Package_Flight__r/Id public static boolean isMarketLevel(PDFCombinerFile pdfCombinerFile, Integer levelIndex) { String[] fieldNamesArray = pdfCombinerFile.getFieldNamesPipeDelimited() .get(levelIndex).split("\\|"); Boolean returnValue = false; if (fieldNamesArray.length > 0) { String fieldName = fieldNamesArray[0]; String[] fieldNameParts = fieldName.split("\\/"); boolean hasThreeParts = fieldNameParts.length == 3; boolean penultimatePartIsPackageMarketRelation = hasThreeParts && fieldNameParts[1].equals("Package_Market__r"); returnValue = penultimatePartIsPackageMarketRelation; } return returnValue; } /* * Returns the corresponding summary field name related to the specified * flight line field name. */ private String getSummaryFieldNameRelatedToFlightLineFieldName( SummaryLevelEnum summaryLevel, String flightLineFieldName) { String summaryFieldName = flightLineFieldName; if (summaryLevel == null) { summaryFieldName = flightLineFieldName; } else if (summaryLevel.equals(SummaryLevelEnum.Market)) { if (flightLineFieldName.equals("Weekly_Total_18_Imps__c")) { summaryFieldName = "Weekly_Total_18_Imps__c"; } else if (flightLineFieldName.equals("In_Mkt_Imps__c")) { summaryFieldName = "In_Mkt_Imps__c"; } else if (flightLineFieldName.equals("Total_Imps__c")) { summaryFieldName = "Target_Total_Imps__c"; } else if (flightLineFieldName.equals("In_Mkt_TRP__c")) { summaryFieldName = "In_Mkt_TRP__c"; } else if (flightLineFieldName.equals("PlanTRP__c")) { summaryFieldName = "Plan_TRP__c"; } else if (flightLineFieldName.equals("Discount__c")) { // this // field // doesn't // exist in // flight // lines. // Just used // it here // to get // related // field summaryFieldName = "Discount__c"; } else if (flightLineFieldName.equals("Total_Price_0d__c")) { summaryFieldName = "Total_Price__c"; } else if (flightLineFieldName.equals("TotalInMarketCPM_0d__c")) { summaryFieldName = "CPM__c"; } else if (flightLineFieldName.equals("CPP_0d__c")) { summaryFieldName = "CPP__c"; } else if (flightLineFieldName.equals("Plan_Imps_Reach_Perc__c")) { summaryFieldName = "Reach__c"; } else if (flightLineFieldName.equals("Plan_Imps_Avg_Frequency__c")) { summaryFieldName = "Frequency__c"; } } else if (summaryLevel.equals(SummaryLevelEnum.Package)) { if (flightLineFieldName.equals("Weekly_Total_18_Imps__c")) { summaryFieldName = "Weekly_Total_18_Imps__c"; } else if (flightLineFieldName.equals("In_Mkt_Imps__c")) { summaryFieldName = "In_Mkt_Imps__c"; } else if (flightLineFieldName.equals("Total_Imps__c")) { summaryFieldName = "Target_Total_Imps__c"; } else if (flightLineFieldName.equals("In_Mkt_TRP__c")) { summaryFieldName = "In_Mkt_TRP__c"; } else if (flightLineFieldName.equals("PlanTRP__c")) { summaryFieldName = "Plan_TRP__c"; } else if (flightLineFieldName.equals("Discount__c")) { // this // field // doesn't // exist in // flight // lines. // Just used // it here // to get // related // field summaryFieldName = "Discount__c"; } else if (flightLineFieldName.equals("Total_Price_0d__c")) { summaryFieldName = "Total_Price__c"; } else if (flightLineFieldName.equals("TotalInMarketCPM_0d__c")) { summaryFieldName = "CPM__c"; } else if (flightLineFieldName.equals("CPP_0d__c")) { summaryFieldName = "CPP__c"; } } return summaryFieldName; } /* * add summary field */ private void addSummaryField(SummaryLevelEnum summaryLevel, JasperReportBuilder report) { // by default, point to a column we know that wont exist String summaryField = "Package_Flight__r/Name"; // determine which field will be used for specified summary level if (summaryLevel == SummaryLevelEnum.Market) { summaryField = "MarketName__c"; } else if (summaryLevel == SummaryLevelEnum.Package) { summaryField = "Package_Name__c"; } // add column report.addColumn(col.column("Summary", summaryField, type.stringType()) .setHorizontalAlignment(HorizontalAlignment.LEFT)); } private class ValidDisclaimerExistsExpression extends AbstractSimpleExpression<Boolean> { private static final long serialVersionUID = 1632549537807166153L; public ValidDisclaimerExistsExpression() { } @Override public Boolean evaluate(ReportParameters reportParameters) { /*System.out .println("******** ValidDisclaimerExistsExpression evaluate.validDisclaimersListDisplay exists " + validDisclaimersListDisplay.size() + " validAllDisclaimersList size " + validAllDisclaimersList.size());*/ return validAllDisclaimersList != null && validAllDisclaimersList.size() > 0; } } private class PackageMarketFlightPreviousRecordExpression extends AbstractSimpleExpression<String> { private static final long serialVersionUID = 549979415L; private Integer m_reportRowNumber = 0; private String lastMarketId = null; private String currentMarketId = null; private String lastPackageId = null; private String currentPackageId = null; String m_lastIdValue = null; String m_lastBuyTypeValue = null; String m_lastMediaCategoryValue = null; // true = all records have been evaluated private boolean eof = false; @Override public String evaluate(ReportParameters reportParameters) { Integer reportRowNumber = reportParameters.getReportRowNumber(); // We record the entries here. It goes here for each beginning of flight. List<Integer> toc = PdfReporter.this.tocEntries; if (toc.isEmpty() || toc.get(toc.size() - 1) < reportParameters.getPageNumber()) { toc.add(reportParameters.getPageNumber()); } if (!eof) { eof = reportRowNumber == getRecordCount() - 1; //System.out.println(" check eof: reportRowNumber, this.m_reportRowNumber, eof " + reportRowNumber + " " + this.m_reportRowNumber + " " + eof); } if (reportRowNumber > this.m_reportRowNumber) { // System.out.println("PackageMarketFlightPreviousRecordExpression.evaluate"); this.m_reportRowNumber = reportRowNumber; // try to get market id value (if exception is raised that's // because // the field doesn't exist) // so in this case just continue... try { //System.out.println(" try to get market id value"); String idValue = reportParameters .getValue("Package_Flight__r/Package_Market__r/Id"); setLastMarketId(idValue); //System.out.println(" market id value-> " + idValue); } catch (Exception e) { e.printStackTrace(); } // try to get package id value (if exception is raised that's // because // the field doesn't exist) // so in this case just continue... try { //System.out.println(" try to get package id value"); String idValue = reportParameters .getValue("Package_Flight__r/Package_Market__r/Package__r/Id"); setLastPackageId(idValue); //System.out.println(" package id value-> " + idValue); } catch (Exception e) { e.printStackTrace(); } // try to get id value (if exception is raised that's because // the field doesn't exist) // so in this case just continue... try { String idValue = reportParameters .getValue("Package_Flight__r/Id"); this.m_lastIdValue = idValue; //System.out.println("idValue->" + idValue); } catch (Exception e) { e.printStackTrace(); } // try to get buy type value (if exception is raised that's // because the field doesn't exist) // so in this case just continue... try { String buyTypeValue = reportParameters .getValue("Package_Flight__r/Type__c"); this.m_lastBuyTypeValue = buyTypeValue; //System.out.println("buyTypeValue->" + buyTypeValue); } catch (Exception e) { e.printStackTrace(); } // try to get media category value (if exception is raised // that's because the field doesn't exist) // so in this case just continue...Media_Category__c try { String mediaCategoryValue = reportParameters .getValue("Package_Flight__r/Media_Category__c"); this.m_lastMediaCategoryValue = mediaCategoryValue; //System.out.println("mediaCategoryValue->" + m_lastMediaCategoryValue); } catch (Exception e) { e.printStackTrace(); } } else { try { String idValue = reportParameters .getValue("Package_Flight__r/Package_Market__r/Id"); setCurrentMarketId(idValue); //System.out.println(" current and last market id -> " + idValue + " " + this.getLastMarketId()); } catch (Exception e) { e.printStackTrace(); } try { String idValue = reportParameters .getValue("Package_Flight__r/Package_Market__r/Package__r/Id"); setCurrentPackageId(idValue); //System.out.println(" current and last package id -> " + idValue + " " + this.getLastPackageId()); } catch (Exception e) { e.printStackTrace(); } } return null; } public String getId() { return this.m_lastIdValue; } public Boolean isBuyTypeLocation() { return this.m_lastBuyTypeValue != null && this.m_lastBuyTypeValue.equals("Location"); } public Boolean isBuyTypeRotary() { return this.m_lastBuyTypeValue != null && this.m_lastBuyTypeValue.equals("Rotary"); } public Boolean isBuyTypeAudience() { return this.m_lastBuyTypeValue != null && this.m_lastBuyTypeValue.equals("Audience"); } public Boolean isBuyTypeNetwork() { return this.m_lastBuyTypeValue != null && this.m_lastBuyTypeValue.equals("Network/Custom"); } public Boolean isDigitalMediaCategory() { return this.m_lastMediaCategoryValue != null && this.m_lastMediaCategoryValue.equals("Digital"); } public String getLastMarketId() { return lastMarketId; } public void setLastMarketId(String lastMarketId) { this.lastMarketId = lastMarketId; } public String getCurrentMarketId() { return currentMarketId; } public void setCurrentMarketId(String currentMarketId) { this.currentMarketId = currentMarketId; } /* * Returns true if eof (end of records) or current market id is * different than the last market id value */ public boolean isMarketIdChanged() { return eof || !getCurrentMarketId().equals(getLastMarketId()); } public String getLastPackageId() { return lastPackageId; } public void setLastPackageId(String lastPackageId) { this.lastPackageId = lastPackageId; } public String getCurrentPackageId() { return currentPackageId; } public void setCurrentPackageId(String currentPackageId) { this.currentPackageId = currentPackageId; } /* * Returns true if eof (end of records) or current market id is * different than the last market id value */ public boolean isPackageIdChanged() { return eof || !getCurrentPackageId().equals(getLastPackageId()); } } private class PackageMarketFlightPreviousRecordHadAudienceExpression extends AbstractSimpleExpression<Boolean> { private static final long serialVersionUID = 1632549537807166153L; private PackageMarketFlightPreviousRecordExpression m_groupByExpression; public PackageMarketFlightPreviousRecordHadAudienceExpression( PackageMarketFlightPreviousRecordExpression groupByExpression) { m_groupByExpression = groupByExpression; } @Override public Boolean evaluate(ReportParameters reportParameters) { return this.m_groupByExpression.isBuyTypeAudience(); } } private class PackageMarketFlightPreviousRecordHadLocationExpression extends AbstractSimpleExpression<Boolean> { private static final long serialVersionUID = 1635849537807166153L; private PackageMarketFlightPreviousRecordExpression m_groupByExpression; public PackageMarketFlightPreviousRecordHadLocationExpression( PackageMarketFlightPreviousRecordExpression groupByExpression) { m_groupByExpression = groupByExpression; } @Override public Boolean evaluate(ReportParameters reportParameters) { return this.m_groupByExpression.isBuyTypeLocation(); } } private class PackageMarketFlightPreviousRecordHadRotaryExpression extends AbstractSimpleExpression<Boolean> { private static final long serialVersionUID = 1632549537807166153L; private PackageMarketFlightPreviousRecordExpression m_groupByExpression; public PackageMarketFlightPreviousRecordHadRotaryExpression( PackageMarketFlightPreviousRecordExpression groupByExpression) { m_groupByExpression = groupByExpression; } @Override public Boolean evaluate(ReportParameters reportParameters) { return this.m_groupByExpression.isBuyTypeRotary(); } } private class PackageMarketFlightPreviousRecordHadNetworkExpression extends AbstractSimpleExpression<Boolean> { private static final long serialVersionUID = 1632549537807166153L; private PackageMarketFlightPreviousRecordExpression m_groupByExpression; public PackageMarketFlightPreviousRecordHadNetworkExpression( PackageMarketFlightPreviousRecordExpression groupByExpression) { m_groupByExpression = groupByExpression; } @Override public Boolean evaluate(ReportParameters reportParameters) { return this.m_groupByExpression.isBuyTypeNetwork(); } } private void addFlightFields(JasperReportBuilder report) { FieldBuilder<String> flightTypeField = field("Type__c", String.class); FieldBuilder<String> mediaCategoryField = field("Media_Category__c", String.class); FieldBuilder<String> flightCommentsField = field("Flight_Comments__c", String.class); FieldBuilder<String> flightDivisionField = field("Division__c", String.class); FieldBuilder<String> flightPackageNameField = field("Package_Name__c", String.class); FieldBuilder<String> flightMarketNameField = field("Market_Name__c", String.class); FieldBuilder<String> flightMarketTypeField = field("Market_Type__c", String.class); FieldBuilder<String> flightNameField = field("Name", String.class); FieldBuilder<String> flightStartDateField = field( "Campaign_Start_Date__c", String.class); FieldBuilder<String> flightEndDateField = field("Campaign_End_Date__c", String.class); FieldBuilder<String> flightDurationField = field( "Duration_And_Type__c", String.class); FieldBuilder<String> flightTargetField = field("Target__c", String.class); FieldBuilder<Integer> flightTargetPopulationField = field( "Target_Population__c", Integer.class); FieldBuilder<String> flightPackageCommentsField = field( "Package_Comments__c", String.class); report.addField(flightTypeField); report.addField(mediaCategoryField); report.addField(flightCommentsField); report.addField(flightDivisionField); report.addField(flightPackageNameField); report.addField(flightMarketNameField); report.addField(flightMarketTypeField); report.addField(flightNameField); report.addField(flightStartDateField); report.addField(flightEndDateField); report.addField(flightDurationField); report.addField(flightTargetField); report.addField(flightTargetPopulationField); report.addField(flightPackageCommentsField); } private void addFlightHeader(JasperReportBuilder report, String packageId, ReportStyleBuilder flightHeaderStyle, ReportStyleBuilder flightHeaderValueStyle) { String[] headerFieldNamesArray1 = new String[6]; String[] headerFieldLabelsArray1 = new String[6]; String[] headerFieldNamesArray2 = new String[6]; String[] headerFieldLabelsArray2 = new String[6]; int arr1Idx = 0; int arr2Idx = 0; // iterate on the flight line column label hashmap (user selected and // ordered fields) for (String key : getFlightLineColumnLabelHashMap().keySet()) { if (key.equals("Package_Flight__r/Division__c")) { headerFieldNamesArray1[arr1Idx] = "Division__c"; headerFieldLabelsArray1[arr1Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Division__c"); arr1Idx++; } if (key.equals("Package_Flight__r/Market_Name__c")) { headerFieldNamesArray1[arr1Idx] = "Market_Name__c"; headerFieldLabelsArray1[arr1Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Market_Name__c"); arr1Idx++; } if (key.equals("Package_Flight__r/Market_Type__c")) { headerFieldNamesArray1[arr1Idx] = "Market_Type__c"; headerFieldLabelsArray1[arr1Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Market_Type__c"); arr1Idx++; } if (key.equals("Package_Flight__r/Package_Name__c")) { headerFieldNamesArray1[arr1Idx] = "Package_Name__c"; headerFieldLabelsArray1[arr1Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Package_Name__c"); arr1Idx++; } if (key.equals("Package_Flight__r/Name")) { headerFieldNamesArray1[arr1Idx] = "Name"; headerFieldLabelsArray1[arr1Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Name"); arr1Idx++; } if (key.equals("Package_Flight__r/Type__c")) { headerFieldNamesArray1[arr1Idx] = "Type__c"; headerFieldLabelsArray1[arr1Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Type__c"); arr1Idx++; } if (key.equals("Package_Flight__r/Campaign_Start_Date__c")) { headerFieldNamesArray2[arr2Idx] = "Campaign_Start_Date__c"; headerFieldLabelsArray2[arr2Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Campaign_Start_Date__c"); arr2Idx++; } if (key.equals("Package_Flight__r/Campaign_End_Date__c")) { headerFieldNamesArray2[arr2Idx] = "Campaign_End_Date__c"; headerFieldLabelsArray2[arr2Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Campaign_End_Date__c"); arr2Idx++; } if (key.equals("Package_Flight__r/Duration_And_Type__c")) { headerFieldNamesArray2[arr2Idx] = "Duration_And_Type__c"; headerFieldLabelsArray2[arr2Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Duration_And_Type__c"); arr2Idx++; } if (key.equals("Package_Flight__r/Target__c")) { headerFieldNamesArray2[arr2Idx] = "Target__c"; headerFieldLabelsArray2[arr2Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Target__c"); arr2Idx++; } if (key.equals("Package_Flight__r/Target_Population__c")) { headerFieldNamesArray2[arr2Idx] = "Target_Population__c"; headerFieldLabelsArray2[arr2Idx] = getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Target_Population__c"); arr2Idx++; } } for (int i = arr1Idx; i < headerFieldNamesArray1.length; i++) { headerFieldNamesArray1[i] = ""; headerFieldLabelsArray1[i] = ""; } for (int i = arr2Idx; i < headerFieldNamesArray2.length; i++) { headerFieldNamesArray2[i] = ""; headerFieldLabelsArray2[i] = ""; } report.title(createVerticalTable(flightHeaderStyle, flightHeaderValueStyle, headerFieldNamesArray1, headerFieldLabelsArray1, headerFieldNamesArray2, headerFieldLabelsArray2, Units.inch(2), packageId)); } private class PackageHeaderSubreportExpression extends AbstractSimpleExpression<JasperReportBuilder> { private static final long serialVersionUID = -4488328880017058659L; private StyleBuilder flightHeaderStyle; private StyleBuilder flightHeaderValueStyle; public PackageHeaderSubreportExpression(StyleBuilder flightHeaderStyle, StyleBuilder flightHeaderValueStyle) { setFlightHeaderStyle(flightHeaderStyle); setFlightHeaderValueStyle(flightHeaderValueStyle); } @Override public JasperReportBuilder evaluate(ReportParameters reportParameters) { JasperReportBuilder report = report(); // ======================================================== begin // add flight fields report.addField(field("Package_Market__r/Package__r/Id", type.stringType())); String packageId = reportParameters .getValue("Package_Flight__r/Package_Market__r/Package__r/Id"); addFlightFields(report); // add flight headers addFlightHeader(report, packageId, getFlightHeaderStyle(), getFlightHeaderValueStyle()); // ======================================================== end // add a blank line at the end report.addLastPageFooter(cmp.text("")); // return report return report; } public StyleBuilder getFlightHeaderStyle() { return flightHeaderStyle; } public void setFlightHeaderStyle(StyleBuilder flightHeaderStyle) { this.flightHeaderStyle = flightHeaderStyle; } public StyleBuilder getFlightHeaderValueStyle() { return flightHeaderValueStyle; } public void setFlightHeaderValueStyle( StyleBuilder flightHeaderValueStyle) { this.flightHeaderValueStyle = flightHeaderValueStyle; } } private class PackageFooterSubreportExpression extends AbstractSimpleExpression<JasperReportBuilder> { private static final long serialVersionUID = 8852584488641186565L; public PackageFooterSubreportExpression() { } @Override public JasperReportBuilder evaluate(ReportParameters reportParameters) { JasperReportBuilder report = report(); StyleBuilder boldStyle = stl.style().bold(); StyleBuilder summaryStyle = stl.style() .setPadding(Units.inch(0.03)).setFontSize(10); // ======================================================== begin report.addField(field("Id", type.stringType())); String packageId = reportParameters.getValue("Id"); VerticalListBuilder flightCommentReports = cmp.verticalList(); flightCommentReports.add(createCommentTable(packageId) .removeLineWhenBlank()); flightCommentReports.add(cmp.text("")); report.summary(flightCommentReports); // create a vertical list of Valid disclaimer reports as per rules ValidDisclaimerExistsExpression validDisclaimerExistsExpression = new ValidDisclaimerExistsExpression(); VerticalListBuilder validDisclaimerReports = cmp.verticalList(); validDisclaimerReports .setPrintWhenExpression(validDisclaimerExistsExpression); validDisclaimerReports.add(cmp.text("Important Notes:") .setStyle(boldStyle).removeLineWhenBlank()); validDisclaimerReports.add(cmp.text(new DisclaimerExpression()) .setStyle(summaryStyle)); report.summary(validDisclaimerReports); // ======================================================== end // add a blank line at the end report.addLastPageFooter(cmp.text("")); // return report return report; } } private class AudienceSubreportExpression extends AbstractSimpleExpression<JasperReportBuilder> { private static final long serialVersionUID = 1656551952324L; private PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression; private StyleBuilder columnTitleStyle; private StyleBuilder columnStyle; private boolean showSummaryHeaders; private String dataSourceFileName; private SummaryLevelEnum summaryLevel; public AudienceSubreportExpression( String dataSourceFileName, PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression, StyleBuilder columnTitleStyle, StyleBuilder columnStyle, boolean showSummaryHeaders) { this(dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, showSummaryHeaders, null); } public AudienceSubreportExpression( String dataSourceFileName, PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression, StyleBuilder columnTitleStyle, StyleBuilder columnStyle, boolean showSummaryHeaders, SummaryLevelEnum summaryLevel) { setDataSourceFileName(dataSourceFileName); setPackageMarketFlightPreviousRecordExpression(packageMarketFlightPreviousRecordExpression); setColumnTitleStyle(columnTitleStyle); setColumnStyle(columnStyle); setShowSummaryHeaders(showSummaryHeaders); setSummaryLevel(summaryLevel); } @Override public JasperReportBuilder evaluate(ReportParameters reportParameters) { JasperReportBuilder report = report(); // add columns addColumns(report, getFlightLineColumnLabelHashMap()); // add fields report.addField(field("Package_Flight__r/Id", type.stringType())); report.addField(field("Id", type.stringType())); // style report.highlightDetailEvenRows(); report.setColumnStyle(getColumnStyle()); report.setColumnTitleStyle(getColumnTitleStyle()); // filter if (getSummaryLevel() == null) { report.setFilterExpression(new FilterByFlightIdExpression( getPackageMarketFlightPreviousRecordExpression())); } else if (getSummaryLevel() == SummaryLevelEnum.Market) { // set filter by market report.setFilterExpression(new FilterByMarketIdExpression( getPackageMarketFlightPreviousRecordExpression())); } else if (getSummaryLevel() == SummaryLevelEnum.Package) { // set filter by market report.setFilterExpression(new FilterByPackageIdExpression( getPackageMarketFlightPreviousRecordExpression())); createPackageCommentsAndDisclamersFooter( getDataSourceFileName(), report); } // add a blank line at the end report.addLastPageFooter(cmp.text("")); // return report return report; } private JasperReportBuilder addColumns(JasperReportBuilder report, Map<String, String> fieldMap) { // types CurrencyWithFractionDecimalType currencyWithFractionDecimalType = new CurrencyWithFractionDecimalType(); CurrencyWithoutFractionDecimalType currencyWithoutFractionDecimalType = new CurrencyWithoutFractionDecimalType(); // indicates (summary mode only) that first column has been // overriden with Summary column boolean firstColumnOverriden = false; for (String key : fieldMap.keySet()) { if (key.equals("Weekly_Total_18_Imps__c")) { TextColumnBuilder<BigDecimal> weeklyTotal18ImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "Weekly_Total_18_Imps__c"), "Weekly_Total_18_Imps__c", type.bigDecimalType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyTotal18ImpsColumn.setWidth(Units.inch(3)); report.addColumn(weeklyTotal18ImpsColumn); } if (key.equals("Total_Imps__c")) { TextColumnBuilder<BigDecimal> totalImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "Total_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Total_Imps__c"), type.bigDecimalType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("#,###"); totalImpsColumn.setWidth(Units.inch(3)); report.addColumn(totalImpsColumn); } if (key.equals("Total_Price_0d__c")) { TextColumnBuilder<BigDecimal> totalPriceColumn = col .column(getFlightLineColumnLabelHashMap().get( "Total_Price_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Total_Price_0d__c"), currencyWithoutFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.RIGHT); totalPriceColumn.setWidth(Units.inch(2.5)); report.addColumn(totalPriceColumn); } if (key.equals("Media_Category__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> mediaTypeColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Media_Category__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Media_Category__c", type .stringType()); mediaTypeColumn.setWidth(Units.inch(2.0)); report.addColumn(mediaTypeColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Number_of_Panels__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> noOfPanelsColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Number_of_Panels__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "Number_of_Panels__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); report.addColumn(noOfPanelsColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("In_Mkt_Imps__c")) { TextColumnBuilder<BigDecimal> targetInMarketImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "In_Mkt_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "In_Mkt_Imps__c"), type.bigDecimalType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("#,###"); targetInMarketImpsColumn.setWidth(Units.inch(3)); report.addColumn(targetInMarketImpsColumn); } if (key.equals("In_Mkt_TRP__c")) { TextColumnBuilder<Double> weekklyTRPColumn = col .column(getFlightLineColumnLabelHashMap().get( "In_Mkt_TRP__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "In_Mkt_TRP__c"), type.doubleType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("##0.0"); weekklyTRPColumn.setWidth(Units.inch(3)); report.addColumn(weekklyTRPColumn); } if (key.equals("PlanTRP__c")) { TextColumnBuilder<Double> planTRPColumn = col .column(getFlightLineColumnLabelHashMap().get( "PlanTRP__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "PlanTRP__c"), type.doubleType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("##0.0"); planTRPColumn.setWidth(Units.inch(2)); report.addColumn(planTRPColumn); } if (key.equals("Plan_Imps_Reach_Perc__c")) { //if (!isShowSummaryHeaders() || firstColumnOverriden) TextColumnBuilder<Double> planImpsReachPercColumn = col .column(getFlightLineColumnLabelHashMap().get( "Plan_Imps_Reach_Perc__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Plan_Imps_Reach_Perc__c"), type.percentageType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("##0.0"); planImpsReachPercColumn.setWidth(Units.inch(1.5)); report.addColumn(planImpsReachPercColumn); } if (key.equals("Plan_Imps_Avg_Frequency__c")) { //if (!isShowSummaryHeaders() || firstColumnOverriden) TextColumnBuilder<Double> frequencyColumn = col .column(getFlightLineColumnLabelHashMap().get( "Plan_Imps_Avg_Frequency__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Plan_Imps_Avg_Frequency__c"), type.doubleType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("##0.0"); frequencyColumn.setWidth(Units.inch(1.5)); report.addColumn(frequencyColumn); } /*else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } }*/ if (key.equals("X4_Wk_Proposed_Price__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> X4WkProposedPriceColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("X4_Wk_Proposed_Price__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "X4_Wk_Proposed_Price__c", currencyWithoutFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); X4WkProposedPriceColumn.setWidth(Units.inch(2.5)); report.addColumn(X4WkProposedPriceColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("TotalInMarketCPM_0d__c")) { TextColumnBuilder<BigDecimal> totalInMarketCPM0dColumn = col .column(getFlightLineColumnLabelHashMap().get( "TotalInMarketCPM_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "TotalInMarketCPM_0d__c"), currencyWithFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.RIGHT); totalInMarketCPM0dColumn.setWidth(Units.inch(2.5)); report.addColumn(totalInMarketCPM0dColumn); } if (key.equals("CPP_0d__c")) { TextColumnBuilder<BigDecimal> cppColumn = col.column( getFlightLineColumnLabelHashMap().get("CPP_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "CPP_0d__c"), currencyWithoutFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.RIGHT); cppColumn.setWidth(Units.inch(2.5)); report.addColumn(cppColumn); } if (key.equals("Comments__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> commentsColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Comments__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Comments__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); commentsColumn.setWidth(Units.inch(3.5)); report.addColumn(commentsColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Timing__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> timingColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Timing__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Timing__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); timingColumn.setWidth(Units.inch(3)); report.addColumn(timingColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Weekly_Total_18_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyTotal18Imps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Weekly_Total_18_Imps_000__c"), "Weekly_Total_18_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyTotal18Imps000Column.setWidth(Units.inch(3)); report.addColumn(weeklyTotal18Imps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("WeeklyMarketImps__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyTotalTargetImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "WeeklyMarketImps__c"), "WeeklyMarketImps__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyTotalTargetImpsColumn.setWidth(Units.inch(3)); report.addColumn(weeklyTotalTargetImpsColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Weekly_Total_Target_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyTotalTargetImps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Weekly_Total_Target_Imps_000__c"), "Weekly_Total_Target_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyTotalTargetImps000Column.setWidth(Units.inch(3)); report.addColumn(weeklyTotalTargetImps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("WeeklyInMarketImps__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyInMarketTargetImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "WeeklyInMarketImps__c"), "WeeklyInMarketImps__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyInMarketTargetImpsColumn.setWidth(Units.inch(3)); report.addColumn(weeklyInMarketTargetImpsColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Weekly_In_Market_Target_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyInMarketTargetImps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Weekly_In_Market_Target_Imps_000__c"), "Weekly_In_Market_Target_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyInMarketTargetImps000Column.setWidth(Units .inch(3)); report.addColumn(weeklyInMarketTargetImps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Target_In_Market_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> targetInMarketImps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Target_In_Market_Imps_000__c"), "Target_In_Market_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); targetInMarketImps000Column.setWidth(Units.inch(3)); report.addColumn(targetInMarketImps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Target_Total_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> totalImps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Target_Total_Imps_000__c"), "Target_Total_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); totalImps000Column.setWidth(Units.inch(3)); report.addColumn(totalImps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("X4_Wk_Avg_Rate_per_Panel__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> x4WkAverageRatePanelColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("X4_Wk_Avg_Rate_per_Panel__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "X4_Wk_Avg_Rate_per_Panel__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT); x4WkAverageRatePanelColumn.setWidth(Units.inch(1.5)); report.addColumn(x4WkAverageRatePanelColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Net_Amount_Value__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> subTotalPriceColumn = col .column(getFlightLineColumnLabelHashMap().get( "Net_Amount_Value__c"), "Net_Amount_Value__c", currencyWithoutFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); subTotalPriceColumn.setWidth(Units.inch(2.5)); report.addColumn(subTotalPriceColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("In_Mkt_Perc_Comp__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> inMktPercCompColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("In_Mkt_Perc_Comp__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "In_Mkt_Perc_Comp__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.LEFT) .setPattern("#,##0.00"); inMktPercCompColumn.setWidth(Units.inch(1.5)); report.addColumn(inMktPercCompColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Production__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> productionColumn = col .column(getFlightLineColumnLabelHashMap().get( "Production__c"), "Production__c", currencyWithFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); productionColumn.setWidth(Units.inch(1.5)); report.addColumn(productionColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Additional_Cost__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> additionalCostColumn = col .column(getFlightLineColumnLabelHashMap().get( "Additional_Cost__c"), "Additional_Cost__c", currencyWithFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); additionalCostColumn.setWidth(Units.inch(1.5)); report.addColumn(additionalCostColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Tax_Amt__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> taxAmtColumn = col .column(getFlightLineColumnLabelHashMap().get( "Tax_Amt__c"), "Tax_Amt__c", currencyWithFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); taxAmtColumn.setWidth(Units.inch(1.5)); report.addColumn(taxAmtColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Discount__c")) { TextColumnBuilder<Double> discountColumn = col .column(getFlightLineColumnLabelHashMap().get( "Discount__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Discount__c"), type.percentageType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("##0.0"); discountColumn.setWidth(Units.inch(1.5)); report.addColumn(discountColumn); } } // return report return report; } public PackageMarketFlightPreviousRecordExpression getPackageMarketFlightPreviousRecordExpression() { return packageMarketFlightPreviousRecordExpression; } public void setPackageMarketFlightPreviousRecordExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { this.packageMarketFlightPreviousRecordExpression = packageMarketFlightPreviousRecordExpression; } public StyleBuilder getColumnTitleStyle() { return columnTitleStyle; } public void setColumnTitleStyle(StyleBuilder columnTitleStyle) { this.columnTitleStyle = columnTitleStyle; } public StyleBuilder getColumnStyle() { return columnStyle; } public void setColumnStyle(StyleBuilder columnStyle) { this.columnStyle = columnStyle; } public boolean isShowSummaryHeaders() { return showSummaryHeaders; } public void setShowSummaryHeaders(boolean showSummaryHeaders) { this.showSummaryHeaders = showSummaryHeaders; } public SummaryLevelEnum getSummaryLevel() { return summaryLevel; } public void setSummaryLevel(SummaryLevelEnum summaryLevel) { this.summaryLevel = summaryLevel; } public void setDataSourceFileName(String dataSourceFileName) { this.dataSourceFileName = dataSourceFileName; } public String getDataSourceFileName() { return dataSourceFileName; } } private class LocationSubreportExpression extends AbstractSimpleExpression<JasperReportBuilder> { private static final long serialVersionUID = 1656551952324L; private PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression; private StyleBuilder columnTitleStyle; private StyleBuilder columnStyle; private boolean showSummaryHeaders; private String dataSourceFileName; private boolean locationMapExists; private SummaryLevelEnum summaryLevel; public LocationSubreportExpression( String dataSourceFileName, PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression, StyleBuilder columnTitleStyle, StyleBuilder columnStyle, boolean showSummaryHeaders, boolean locationMapExists) { this(dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, showSummaryHeaders, locationMapExists, null); } public LocationSubreportExpression( String dataSourceFileName, PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression, StyleBuilder columnTitleStyle, StyleBuilder columnStyle, boolean showSummaryHeaders, boolean locationMapExists, SummaryLevelEnum summaryLevel) { setDataSourceFileName(dataSourceFileName); setPackageMarketFlightPreviousRecordExpression(packageMarketFlightPreviousRecordExpression); setColumnTitleStyle(columnTitleStyle); setColumnStyle(columnStyle); setShowSummaryHeaders(showSummaryHeaders); setLocationMapExists(locationMapExists); setSummaryLevel(summaryLevel); } @Override public JasperReportBuilder evaluate(ReportParameters reportParameters) { JasperReportBuilder report = report(); // add columns addColumns(report, getFlightLineColumnLabelHashMap()); // add fields report.addField(field("Package_Flight__r/Id", type.stringType())); report.addField(field("Id", type.stringType())); // style report.highlightDetailEvenRows(); report.setColumnStyle(getColumnStyle()); report.setColumnTitleStyle(getColumnTitleStyle()); // filter if (getSummaryLevel() == null) { report.setFilterExpression(new FilterByFlightIdExpression( getPackageMarketFlightPreviousRecordExpression())); } else if (getSummaryLevel() == SummaryLevelEnum.Market) { // set filter by market report.setFilterExpression(new FilterByMarketIdExpression( getPackageMarketFlightPreviousRecordExpression())); } else if (getSummaryLevel() == SummaryLevelEnum.Package) { // set filter by market report.setFilterExpression(new FilterByPackageIdExpression( getPackageMarketFlightPreviousRecordExpression())); createPackageCommentsAndDisclamersFooter( getDataSourceFileName(), report); } // add a blank line at the end report.addLastPageFooter(cmp.text("")); return report; } private JasperReportBuilder addColumns(JasperReportBuilder report, Map<String, String> fieldMap) { CurrencyWithoutFractionDecimalType currencyWithoutFractionDecimalType = new CurrencyWithoutFractionDecimalType(); CurrencyWithFractionDecimalType currencyWithFractionDecimalType = new CurrencyWithFractionDecimalType(); // indicates (summary mode only) that first column has been // overriden with Summary column boolean firstColumnOverriden = false; for (String key : fieldMap.keySet()) { if (isLocationMapExists()) { if (key.equals("MapLocation_Number__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { try { TextColumnBuilder<Integer> mapLocNumberColumn = col .column(getFlightLineColumnLabelHashMap() .get("MapLocation_Number__c"), new MapLocationNumberExpressionColumn( getMapPanelOrderPrefDataSourceFileName())) .setHorizontalAlignment( HorizontalAlignment.RIGHT); mapLocNumberColumn.setWidth(Units.inch(2)); report.addColumn(mapLocNumberColumn); report.sortBy(mapLocNumberColumn); report.addField(field("MapLocation_Number__c", type.stringType())); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } } if (key.equals("Media_Category__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> mediaTypeColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Media_Category__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Media_Category__c", type .stringType()); mediaTypeColumn.setWidth(Units.inch(2.0)); report.addColumn(mediaTypeColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Panel_Id_Label__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> panelIdColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Panel_Id_Label__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Panel_Id_Label__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT); panelIdColumn.setWidth(Units.inch(1.5)); report.addColumn(panelIdColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("TAB_Id__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> tabIdColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("TAB_Id__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "TAB_Id__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT); tabIdColumn.setWidth(Units.inch(1.5)); report.addColumn(tabIdColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Location_Description__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> descriptionTextColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Location_Description__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Location_Description__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); descriptionTextColumn.setWidth(Units.inch(3.5)); report.addColumn(descriptionTextColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Face_Direction__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> flightLineTextColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Face_Direction__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Face_Direction__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); report.addColumn(flightLineTextColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Weekly_Total_18_Imps__c")) { TextColumnBuilder<BigDecimal> weeklyTotal18ImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "Weekly_Total_18_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Weekly_Total_18_Imps__c"), type.bigDecimalType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyTotal18ImpsColumn.setWidth(Units.inch(3)); report.addColumn(weeklyTotal18ImpsColumn); } if (key.equals("Weekly_Total_18_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyTotal18Imps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Weekly_Total_18_Imps_000__c"), "Weekly_Total_18_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyTotal18Imps000Column.setWidth(Units.inch(3)); report.addColumn(weeklyTotal18Imps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("In_Mkt_Imps__c")) { TextColumnBuilder<BigDecimal> targetInMarketImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "In_Mkt_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "In_Mkt_Imps__c"), type.bigDecimalType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("#,###"); targetInMarketImpsColumn.setWidth(Units.inch(3)); report.addColumn(targetInMarketImpsColumn); } if (key.equals("Target_In_Market_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> targetInMarketImps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Target_In_Market_Imps_000__c"), "Target_In_Market_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); targetInMarketImps000Column.setWidth(Units.inch(3)); report.addColumn(targetInMarketImps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Total_Imps__c")) { TextColumnBuilder<BigDecimal> totalImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "Total_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Total_Imps__c"), type.bigDecimalType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("#,###"); totalImpsColumn.setWidth(Units.inch(3)); report.addColumn(totalImpsColumn); } if (key.equals("Target_Total_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> totalImps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Target_Total_Imps_000__c"), "Target_Total_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); totalImps000Column.setWidth(Units.inch(3)); report.addColumn(totalImps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("WeeklyMarketImps__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyTotalTargetImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "WeeklyMarketImps__c"), "WeeklyMarketImps__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyTotalTargetImpsColumn.setWidth(Units.inch(3)); report.addColumn(weeklyTotalTargetImpsColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Weekly_Total_Target_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyTotalTargetImps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Weekly_Total_Target_Imps_000__c"), "Weekly_Total_Target_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyTotalTargetImps000Column.setWidth(Units.inch(3)); report.addColumn(weeklyTotalTargetImps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("WeeklyInMarketImps__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyInMarketTargetImpsColumn = col .column(getFlightLineColumnLabelHashMap().get( "WeeklyInMarketImps__c"), "WeeklyInMarketImps__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyInMarketTargetImpsColumn.setWidth(Units.inch(3)); report.addColumn(weeklyInMarketTargetImpsColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Weekly_In_Market_Target_Imps_000__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> weeklyInMarketTargetImps000Column = col .column(getFlightLineColumnLabelHashMap().get( "Weekly_In_Market_Target_Imps_000__c"), "Weekly_In_Market_Target_Imps_000__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); weeklyInMarketTargetImps000Column.setWidth(Units .inch(3)); report.addColumn(weeklyInMarketTargetImps000Column); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("In_Mkt_TRP__c")) { TextColumnBuilder<Double> weekklyTRPColumn = col .column(getFlightLineColumnLabelHashMap().get( "In_Mkt_TRP__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "In_Mkt_TRP__c"), type.doubleType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("##0.0"); weekklyTRPColumn.setWidth(Units.inch(3)); report.addColumn(weekklyTRPColumn); } if (key.equals("PlanTRP__c")) { TextColumnBuilder<Double> planTRPColumn = col .column(getFlightLineColumnLabelHashMap().get( "PlanTRP__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "PlanTRP__c"), type.doubleType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("##0.0"); planTRPColumn.setWidth(Units.inch(2)); report.addColumn(planTRPColumn); } if (key.equals("Plan_Imps_Reach_Perc__c")) { //if (!isShowSummaryHeaders() || firstColumnOverriden) TextColumnBuilder<Double> planImpsReachPercColumn = col .column(getFlightLineColumnLabelHashMap().get( "Plan_Imps_Reach_Perc__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Plan_Imps_Reach_Perc__c"), type.percentageType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("##0.0"); planImpsReachPercColumn.setWidth(Units.inch(1.5)); report.addColumn(planImpsReachPercColumn); } if (key.equals("Plan_Imps_Avg_Frequency__c")) { //if (!isShowSummaryHeaders() || firstColumnOverriden) TextColumnBuilder<Double> frequencyColumn = col .column(getFlightLineColumnLabelHashMap().get( "Plan_Imps_Avg_Frequency__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Plan_Imps_Avg_Frequency__c"), type.doubleType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("##0.0"); frequencyColumn.setWidth(Units.inch(1.5)); report.addColumn(frequencyColumn); } if (key.equals("X4_Wk_Proposed_Price__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> X4WkProposedPriceColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("X4_Wk_Proposed_Price__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "X4_Wk_Proposed_Price__c", currencyWithoutFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); X4WkProposedPriceColumn.setWidth(Units.inch(2.5)); report.addColumn(X4WkProposedPriceColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Net_Amount_Value__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> subTotalPriceColumn = col .column(getFlightLineColumnLabelHashMap().get( "Net_Amount_Value__c"), "Net_Amount_Value__c", currencyWithoutFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); subTotalPriceColumn.setWidth(Units.inch(2.5)); report.addColumn(subTotalPriceColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Total_Price_0d__c")) { TextColumnBuilder<BigDecimal> totalPriceColumn = col .column(getFlightLineColumnLabelHashMap().get( "Total_Price_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Total_Price_0d__c"), currencyWithoutFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.RIGHT); totalPriceColumn.setWidth(Units.inch(2.5)); report.addColumn(totalPriceColumn); } if (key.equals("TotalInMarketCPM_0d__c")) { TextColumnBuilder<BigDecimal> totalInMarketCPM0dColumn = col .column(getFlightLineColumnLabelHashMap().get( "TotalInMarketCPM_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "TotalInMarketCPM_0d__c"), currencyWithFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.RIGHT); totalInMarketCPM0dColumn.setWidth(Units.inch(2.5)); report.addColumn(totalInMarketCPM0dColumn); } if (key.equals("CPP_0d__c")) { TextColumnBuilder<BigDecimal> cppColumn = col.column( getFlightLineColumnLabelHashMap().get("CPP_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "CPP_0d__c"), currencyWithoutFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.RIGHT); cppColumn.setWidth(Units.inch(2.5)); report.addColumn(cppColumn); } if (key.equals("Unit_Size__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> unitSizeColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Unit_Size__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Unit_Size__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT); unitSizeColumn.setWidth(Units.inch(1.5)); report.addColumn(unitSizeColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Illumination_yn__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> illuminationColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Illumination_yn__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Illumination_yn__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); illuminationColumn.setWidth(Units.inch(1)); report.addColumn(illuminationColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Comments__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> commentsColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Comments__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Comments__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); commentsColumn.setWidth(Units.inch(3.5)); report.addColumn(commentsColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Timing__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> timingColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Timing__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Timing__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); timingColumn.setWidth(Units.inch(3)); report.addColumn(timingColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("In_Mkt_Perc_Comp__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> inMktPercCompColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("In_Mkt_Perc_Comp__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "In_Mkt_Perc_Comp__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.LEFT) .setPattern("#,##0.00"); inMktPercCompColumn.setWidth(Units.inch(1.5)); report.addColumn(inMktPercCompColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("X4_Wk_Avg_Rate_per_Panel__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> x4WkAverageRatePanelColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("X4_Wk_Avg_Rate_per_Panel__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "X4_Wk_Avg_Rate_per_Panel__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT); x4WkAverageRatePanelColumn.setWidth(Units.inch(1.5)); report.addColumn(x4WkAverageRatePanelColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Production__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> productionColumn = col .column(getFlightLineColumnLabelHashMap().get( "Production__c"), "Production__c", currencyWithFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); productionColumn.setWidth(Units.inch(1.5)); report.addColumn(productionColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Additional_Cost__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> additionalCostColumn = col .column(getFlightLineColumnLabelHashMap().get( "Additional_Cost__c"), "Additional_Cost__c", currencyWithFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); additionalCostColumn.setWidth(Units.inch(1.5)); report.addColumn(additionalCostColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Tax_Amt__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> taxAmtColumn = col .column(getFlightLineColumnLabelHashMap().get( "Tax_Amt__c"), "Tax_Amt__c", currencyWithFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); taxAmtColumn.setWidth(Units.inch(1.5)); report.addColumn(taxAmtColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Location__Longitude__s")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> locationLangitudeColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Location__Longitude__s"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Location__Longitude__s", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); locationLangitudeColumn.setWidth(Units.inch(1)); report.addColumn(locationLangitudeColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Location__Latitude__s")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> locationLatitudeColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Location__Latitude__s"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Location__Latitude__s", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); locationLatitudeColumn.setWidth(Units.inch(1)); report.addColumn(locationLatitudeColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Embellishments__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> embellishmentsColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Embellishments__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Embellishments__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); embellishmentsColumn.setWidth(Units.inch(1)); report.addColumn(embellishmentsColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Illumination__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> illuminationColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Illumination__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "Illumination__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("#,###"); illuminationColumn.setWidth(Units.inch(1)); report.addColumn(illuminationColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Current_Copy__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> currentCopyColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Current_Copy__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Current_Copy__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); currentCopyColumn.setWidth(Units.inch(1)); report.addColumn(currentCopyColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("City__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> cityColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("City__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "City__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); cityColumn.setWidth(Units.inch(1.5)); report.addColumn(cityColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("County__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> countryColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("County__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "County__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); countryColumn.setWidth(Units.inch(1.5)); report.addColumn(countryColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("State__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> stateColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("State__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "State__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); stateColumn.setWidth(Units.inch(1.5)); report.addColumn(stateColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Zip__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> zipColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Zip__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Zip__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); zipColumn.setWidth(Units.inch(1.5)); report.addColumn(zipColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Media_Product__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> mediaProductColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Media_Product__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Media_Product__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); mediaProductColumn.setWidth(Units.inch(1.5)); report.addColumn(mediaProductColumn); ; } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Ride_Order__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> rideOrderColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Ride_Order__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Ride_Order__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); rideOrderColumn.setWidth(Units.inch(1.5)); report.addColumn(rideOrderColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Facing__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> faceSideColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Facing__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Facing__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT); faceSideColumn.setWidth(Units.inch(1.5)); report.addColumn(faceSideColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (getPackageMarketFlightPreviousRecordExpression() .isDigitalMediaCategory()) { if (key.equals("Average_Daily_Spots__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<String> averageDailySpotsColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Average_Daily_Spots__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Average_Daily_Spots__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT); averageDailySpotsColumn.setWidth(Units.inch(1.5)); report.addColumn(averageDailySpotsColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } } if (key.equals("Discount__c")) { TextColumnBuilder<Double> discountColumn = col .column(getFlightLineColumnLabelHashMap().get( "Discount__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Discount__c"), type.percentageType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("##0.0"); discountColumn.setWidth(Units.inch(1.5)); report.addColumn(discountColumn); } } // return report return report; } public PackageMarketFlightPreviousRecordExpression getPackageMarketFlightPreviousRecordExpression() { return packageMarketFlightPreviousRecordExpression; } public void setPackageMarketFlightPreviousRecordExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { this.packageMarketFlightPreviousRecordExpression = packageMarketFlightPreviousRecordExpression; } public StyleBuilder getColumnTitleStyle() { return columnTitleStyle; } public void setColumnTitleStyle(StyleBuilder columnTitleStyle) { this.columnTitleStyle = columnTitleStyle; } public StyleBuilder getColumnStyle() { return columnStyle; } public void setColumnStyle(StyleBuilder columnStyle) { this.columnStyle = columnStyle; } public boolean isLocationMapExists() { return locationMapExists; } public void setLocationMapExists(boolean mapExists) { this.locationMapExists = mapExists; } public boolean isShowSummaryHeaders() { return showSummaryHeaders; } public void setShowSummaryHeaders(boolean showSummaryHeaders) { this.showSummaryHeaders = showSummaryHeaders; } public SummaryLevelEnum getSummaryLevel() { return summaryLevel; } public void setSummaryLevel(SummaryLevelEnum summaryLevel) { this.summaryLevel = summaryLevel; } public void setDataSourceFileName(String dataSourceFileName) { this.dataSourceFileName = dataSourceFileName; } public String getDataSourceFileName() { return dataSourceFileName; } } private class RotarySubreportExpression extends AbstractSimpleExpression<JasperReportBuilder> { private static final long serialVersionUID = 1656551952324L; private PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression; private StyleBuilder columnTitleStyle; private StyleBuilder columnStyle; private boolean showSummaryHeaders; private String dataSourceFileName; private SummaryLevelEnum summaryLevel; public RotarySubreportExpression( String dataSourceFileName, PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression, StyleBuilder columnTitleStyle, StyleBuilder columnStyle, boolean showSummaryHeaders) { this(dataSourceFileName, packageMarketFlightPreviousRecordExpression, columnTitleStyle, columnStyle, showSummaryHeaders, null); } public RotarySubreportExpression( String dataSourceFileName, PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression, StyleBuilder columnTitleStyle, StyleBuilder columnStyle, boolean showSummaryHeaders, SummaryLevelEnum summaryLevel) { setDataSourceFileName(dataSourceFileName); setPackageMarketFlightPreviousRecordExpression(packageMarketFlightPreviousRecordExpression); setColumnTitleStyle(columnTitleStyle); setColumnStyle(columnStyle); setShowSummaryHeaders(showSummaryHeaders); setSummaryLevel(summaryLevel); } @Override public JasperReportBuilder evaluate(ReportParameters reportParameters) { JasperReportBuilder report = report(); // add columns addColumns(report, getFlightLineColumnLabelHashMap()); // add fields report.addField(field("Package_Flight__r/Id", type.stringType())); report.addField(field("Id", type.stringType())); // style report.highlightDetailEvenRows(); report.setColumnStyle(getColumnStyle()); report.setColumnTitleStyle(getColumnTitleStyle()); // filter if (getSummaryLevel() == null) { report.setFilterExpression(new FilterByFlightIdExpression( getPackageMarketFlightPreviousRecordExpression())); } else if (getSummaryLevel() == SummaryLevelEnum.Market) { // set filter by market report.setFilterExpression(new FilterByMarketIdExpression( getPackageMarketFlightPreviousRecordExpression())); } else if (getSummaryLevel() == SummaryLevelEnum.Package) { // set filter by package report.setFilterExpression(new FilterByPackageIdExpression( getPackageMarketFlightPreviousRecordExpression())); createPackageCommentsAndDisclamersFooter( getDataSourceFileName(), report); } // add a blank line at the end report.addLastPageFooter(cmp.text("")); return report; } private JasperReportBuilder addColumns(JasperReportBuilder report, Map<String, String> fieldMap) { // types CurrencyWithoutFractionDecimalType currencyWithoutFractionDecimalType = new CurrencyWithoutFractionDecimalType(); // indicates (summary mode only) that first column has been // overriden with Summary column boolean firstColumnOverriden = false; for (String key : fieldMap.keySet()) { // add columns if (key.equals("Network_Name__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Network_Name__c"), "Network_Name__c", type.stringType())); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Number_of_Panels__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Number_of_Panels__c"), "Number_of_Panels__c", type.integerType()) .setHorizontalAlignment( HorizontalAlignment.CENTER)); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Weekly_Total_18_Imps__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Weekly_Total_18_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Weekly_Total_18_Imps__c"), type.integerType()).setHorizontalAlignment( HorizontalAlignment.CENTER)); } if (key.equals("In_Mkt_Imps__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "In_Mkt_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "In_Mkt_Imps__c"), type.doubleType()).setHorizontalAlignment( HorizontalAlignment.CENTER)); } if (key.equals("Total_Imps__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Total_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Total_Imps__c"), type.doubleType()).setHorizontalAlignment( HorizontalAlignment.CENTER)); } if (key.equals("In_Mkt_TRP__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "In_Mkt_TRP__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "In_Mkt_TRP__c"), type.doubleType()).setHorizontalAlignment( HorizontalAlignment.CENTER)); } if (key.equals("PlanTRP__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "PlanTRP__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "PlanTRP__c"), type.doubleType()).setHorizontalAlignment( HorizontalAlignment.CENTER)); } if (key.equals("Plan_Imps_Reach_Perc__c")) { //if (!isShowSummaryHeaders() || firstColumnOverriden) TextColumnBuilder<Double> planImpsReachPercColumn = col .column(getFlightLineColumnLabelHashMap().get( "Plan_Imps_Reach_Perc__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Plan_Imps_Reach_Perc__c"), type.percentageType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("##0.0"); planImpsReachPercColumn.setWidth(Units.inch(1.5)); report.addColumn(planImpsReachPercColumn); } if (key.equals("Plan_Imps_Avg_Frequency__c")) { //if (!isShowSummaryHeaders() || firstColumnOverriden) TextColumnBuilder<Double> frequencyColumn = col .column(getFlightLineColumnLabelHashMap().get( "Plan_Imps_Avg_Frequency__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Plan_Imps_Avg_Frequency__c"), type.doubleType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("##0.0"); frequencyColumn.setWidth(Units.inch(1.5)); report.addColumn(frequencyColumn); } if (key.equals("X4_Wk_Proposed_Price__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("X4_Wk_Proposed_Price__c"), "X4_Wk_Proposed_Price__c", currencyWithoutFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.CENTER)); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Total_Price_0d__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Total_Price_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Total_Price_0d__c"), currencyWithoutFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.CENTER)); } if (key.equals("TotalInMarketCPM_0d__c")) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "TotalInMarketCPM_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "TotalInMarketCPM_0d__c"), currencyWithoutFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.CENTER)); } if (key.equals("CPP_0d__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "CPP_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "CPP_0d__c"), currencyWithoutFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.CENTER)); } if (key.equals("Package_Flight__r/Flight_Comments__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Package_Flight__r/Flight_Comments__c"), "Package_Flight__r/Flight_Comments__c", type .stringType())); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } } // return report return report; } public PackageMarketFlightPreviousRecordExpression getPackageMarketFlightPreviousRecordExpression() { return packageMarketFlightPreviousRecordExpression; } public void setPackageMarketFlightPreviousRecordExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { this.packageMarketFlightPreviousRecordExpression = packageMarketFlightPreviousRecordExpression; } public StyleBuilder getColumnTitleStyle() { return columnTitleStyle; } public void setColumnTitleStyle(StyleBuilder columnTitleStyle) { this.columnTitleStyle = columnTitleStyle; } public StyleBuilder getColumnStyle() { return columnStyle; } public void setColumnStyle(StyleBuilder columnStyle) { this.columnStyle = columnStyle; } public boolean isShowSummaryHeaders() { return showSummaryHeaders; } public void setShowSummaryHeaders(boolean showSummaryHeaders) { this.showSummaryHeaders = showSummaryHeaders; } public SummaryLevelEnum getSummaryLevel() { return summaryLevel; } public void setSummaryLevel(SummaryLevelEnum summaryLevel) { this.summaryLevel = summaryLevel; } public void setDataSourceFileName(String dataSourceFileName) { this.dataSourceFileName = dataSourceFileName; } public String getDataSourceFileName() { return dataSourceFileName; } } private class NetworkSubreportExpression extends AbstractSimpleExpression<JasperReportBuilder> { private static final long serialVersionUID = 1656551952324L; private PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression; private FlightLinePreviousRecordExpression flightLinePreviousRecordExpression; private StyleBuilder columnTitleStyle; private StyleBuilder columnStyle; private boolean showSummaryHeaders; private String dataSourceFileName; private SummaryLevelEnum summaryLevel; private boolean excludeNetworkDetails; public NetworkSubreportExpression( String dataSourceFileName, PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression, FlightLinePreviousRecordExpression flightLinePreviousRecordExpression, StyleBuilder columnTitleStyle, StyleBuilder columnStyle, boolean showSummaryHeaders, boolean excludeNetworkDetails) { this(dataSourceFileName, packageMarketFlightPreviousRecordExpression, flightLinePreviousRecordExpression, columnTitleStyle, columnStyle, showSummaryHeaders, excludeNetworkDetails, null); } public NetworkSubreportExpression( String dataSourceFileName, PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression, FlightLinePreviousRecordExpression flightLinePreviousRecordExpression, StyleBuilder columnTitleStyle, StyleBuilder columnStyle, boolean showSummaryHeaders, boolean excludeNetworkDetails, SummaryLevelEnum summaryLevel) { setDataSourceFileName(dataSourceFileName); setPackageMarketFlightPreviousRecordExpression(packageMarketFlightPreviousRecordExpression); setFlightLinePreviousRecordExpression(flightLinePreviousRecordExpression); setColumnTitleStyle(columnTitleStyle); setColumnStyle(columnStyle); setShowSummaryHeaders(showSummaryHeaders); setExcludeNetworkDetails(excludeNetworkDetails); setSummaryLevel(summaryLevel); } @Override public JasperReportBuilder evaluate(ReportParameters reportParameters) { JasperReportBuilder report = report(); // network detail dataset JRXmlDataSource networkDetailDataSource = null; try { networkDetailDataSource = new JRXmlDataSource( getDataSourceFileName(), "/QueryResult/records/Child_Flight_Lines__r/records"); } catch (JRException e) { // TODO Auto-generated catch block e.printStackTrace(); } report.title(cmp.text("")); if (!isExcludeNetworkDetails()) { // attach observer to group CustomGroupBuilder flightLinePreviousRecordCustomGroupBuilder = grp .group(getFlightLinePreviousRecordExpression()); flightLinePreviousRecordCustomGroupBuilder .setHeaderLayout(GroupHeaderLayout.EMPTY); flightLinePreviousRecordCustomGroupBuilder.setPadding(0); report.addGroup(flightLinePreviousRecordCustomGroupBuilder); // create column group to re-render headers with each row ColumnGroupBuilder flightLineCurrentRecordColumnGroupBuilder = grp .group(col.column("Id", "Id", type.stringType())); flightLineCurrentRecordColumnGroupBuilder .setHeaderLayout(GroupHeaderLayout.EMPTY); flightLineCurrentRecordColumnGroupBuilder .showColumnHeaderAndFooter().setKeepTogether(true); flightLineCurrentRecordColumnGroupBuilder.setPadding(0); report.groupBy(flightLineCurrentRecordColumnGroupBuilder) .setShowColumnTitle(false); // network detail sub-report SubreportBuilder networkDetailSubreport = cmp.subreport( new NetworkDetailSubreportExpression( getFlightLinePreviousRecordExpression(), columnTitleStyle, columnStyle, false)) .setDataSource(networkDetailDataSource); report.columns().detailFooter(cmp.text(""), networkDetailSubreport); } // add columns addColumns(report, getFlightLineColumnLabelHashMap()); // add fields report.addField(field("Package_Flight__r/Id", type.stringType())); report.addField(field("Package_Flight__r/Type__c", type.stringType())); report.addField(field("Id", type.stringType())); report.addField(field("Parent_Flight_Line__c", type.stringType())); report.addField(field( "Package_Flight__r/Package_Market__r/Package__r/Id", type.stringType())); // filter if (getSummaryLevel() == null) { report.setFilterExpression(new FilterByFlightIdExpression( getPackageMarketFlightPreviousRecordExpression())); } else if (getSummaryLevel() == SummaryLevelEnum.Market) { // set filter by market report.setFilterExpression(new FilterByMarketIdExpression( getPackageMarketFlightPreviousRecordExpression())); } else if (getSummaryLevel() == SummaryLevelEnum.Package) { // set filter by market report.setFilterExpression(new FilterByPackageIdExpression( getPackageMarketFlightPreviousRecordExpression())); createPackageCommentsAndDisclamersFooter( getDataSourceFileName(), report); } // style report.setColumnTitleStyle(getColumnTitleStyle()); report.setColumnStyle(getColumnStyle()); // add a blank line at the end report.addLastPageFooter(cmp.text("")); // return report return report; } private JasperReportBuilder addColumns(JasperReportBuilder report, Map<String, String> fieldMap) { // types CurrencyWithFractionDecimalType currencyWithFractionDecimalType = new CurrencyWithFractionDecimalType(); CurrencyWithoutFractionDecimalType currencyWithoutFractionDecimalType = new CurrencyWithoutFractionDecimalType(); // indicates (summary mode only) that first column has been // overriden with Summary column boolean firstColumnOverriden = false; for (String key : fieldMap.keySet()) { // ================================= add columns: begin if (key.equals("Network_Name__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Network_Name__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Network_Name__c", type.stringType())); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Number_of_Panels__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col .column(getFlightLineColumnLabelHashMap().get( "Number_of_Panels__c"), "Number_of_Panels__c", type.integerType()) .setPattern("#,###") .setHorizontalAlignment( HorizontalAlignment.RIGHT)); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Media_Category__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Media_Category__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Media_Category__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.LEFT) .setWidth(Units.inch(2.0))); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Weekly_Total_18_Imps__c")) { report.addColumn(col .column(getFlightLineColumnLabelHashMap().get( "Weekly_Total_18_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Weekly_Total_18_Imps__c"), type.integerType()).setPattern("#,###") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("In_Mkt_Imps__c")) { report.addColumn(col .column(getFlightLineColumnLabelHashMap().get( "In_Mkt_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "In_Mkt_Imps__c"), type.doubleType()).setPattern("#,###") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("Total_Imps__c")) { report.addColumn(col .column(getFlightLineColumnLabelHashMap().get( "Total_Imps__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Total_Imps__c"), type.doubleType()).setPattern("#,###") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("In_Mkt_TRP__c")) { report.addColumn(col .column(getFlightLineColumnLabelHashMap().get( "In_Mkt_TRP__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "In_Mkt_TRP__c"), type.doubleType()).setPattern("##0.0") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("PlanTRP__c")) { report.addColumn(col .column(getFlightLineColumnLabelHashMap().get( "PlanTRP__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "PlanTRP__c"), type.doubleType()).setPattern("##0.0") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("Plan_Imps_Reach_Perc__c")) { //if (!isShowSummaryHeaders() || firstColumnOverriden) TextColumnBuilder<Double> planImpsReachPercColumn = col .column(getFlightLineColumnLabelHashMap().get( "Plan_Imps_Reach_Perc__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Plan_Imps_Reach_Perc__c"), type.percentageType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("##0.0"); planImpsReachPercColumn.setWidth(Units.inch(1.5)); report.addColumn(planImpsReachPercColumn); } if (key.equals("Plan_Imps_Avg_Frequency__c")) { //if (!isShowSummaryHeaders() || firstColumnOverriden) TextColumnBuilder<Double> frequencyColumn = col .column(getFlightLineColumnLabelHashMap().get( "Plan_Imps_Avg_Frequency__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Plan_Imps_Avg_Frequency__c"), type.doubleType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setPattern("##0.0"); frequencyColumn.setWidth(Units.inch(1.5)); report.addColumn(frequencyColumn); } if (key.equals("X4_Wk_Proposed_Price__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("X4_Wk_Proposed_Price__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "X4_Wk_Proposed_Price__c", currencyWithoutFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT)); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("In_Mkt_Perc_Comp__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> inMktPercCompColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("In_Mkt_Perc_Comp__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "In_Mkt_Perc_Comp__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.LEFT) .setPattern("#,##0.00"); inMktPercCompColumn.setWidth(Units.inch(1.5)); report.addColumn(inMktPercCompColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Total_Price_0d__c")) { report.addColumn(col.column( getFlightLineColumnLabelHashMap().get( "Total_Price_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Total_Price_0d__c"), currencyWithoutFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("TotalInMarketCPM_0d__c")) { report.addColumn(col .column(getFlightLineColumnLabelHashMap().get( "TotalInMarketCPM_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "TotalInMarketCPM_0d__c"), currencyWithFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("CPP_0d__c")) { report.addColumn(col.column( getFlightLineColumnLabelHashMap().get("CPP_0d__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "CPP_0d__c"), currencyWithoutFractionDecimalType) .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("Network_Description__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Network_Description__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Network_Description__c", type.stringType()).setWidth( Units.inch(3.5))); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Network_Notes__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Network_Notes__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Network_Notes__c", type.stringType())); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (getPackageMarketFlightPreviousRecordExpression() .isDigitalMediaCategory()) { if (key.equals("Average_Daily_Spots__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Average_Daily_Spots__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Average_Daily_Spots__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT)); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } if (key.equals("Hours_of_Operation__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("Hours_of_Operation__c"), this.isShowSummaryHeaders() ? "Parent_Flight_Line__c" : "Hours_of_Operation__c", type.stringType()) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setWidth(Units.inch(1.32))); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } } if (key.equals("Discount__c")) { report.addColumn(col .column(getFlightLineColumnLabelHashMap().get( "Discount__c"), getSummaryFieldNameRelatedToFlightLineFieldName( getSummaryLevel(), "Discount__c"), type.percentageType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setWidth(Units.inch(1.5)).setPattern("##0.0")); } if (key.equals("Additional_Cost__c")) { if (!isShowSummaryHeaders() || firstColumnOverriden) { TextColumnBuilder<BigDecimal> additionalCostColumn = col .column(getFlightLineColumnLabelHashMap().get( "Additional_Cost__c"), "Additional_Cost__c", currencyWithFractionDecimalType) .setHorizontalAlignment( HorizontalAlignment.RIGHT); additionalCostColumn.setWidth(Units.inch(1.5)); report.addColumn(additionalCostColumn); } else { if (!firstColumnOverriden) { addSummaryField(getSummaryLevel(), report); firstColumnOverriden = true; } } } } // ================================= add columns: end return report; } public PackageMarketFlightPreviousRecordExpression getPackageMarketFlightPreviousRecordExpression() { return packageMarketFlightPreviousRecordExpression; } public void setPackageMarketFlightPreviousRecordExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { this.packageMarketFlightPreviousRecordExpression = packageMarketFlightPreviousRecordExpression; } public StyleBuilder getColumnTitleStyle() { return columnTitleStyle; } public void setColumnTitleStyle(StyleBuilder columnTitleStyle) { this.columnTitleStyle = columnTitleStyle; } public StyleBuilder getColumnStyle() { return columnStyle; } public void setColumnStyle(StyleBuilder columnStyle) { this.columnStyle = columnStyle; } public boolean isShowSummaryHeaders() { return showSummaryHeaders; } public void setShowSummaryHeaders(boolean showSummaryHeaders) { this.showSummaryHeaders = showSummaryHeaders; } public String getDataSourceFileName() { return dataSourceFileName; } public void setDataSourceFileName(String dataSourceFileName) { this.dataSourceFileName = dataSourceFileName; } public FlightLinePreviousRecordExpression getFlightLinePreviousRecordExpression() { return flightLinePreviousRecordExpression; } public void setFlightLinePreviousRecordExpression( FlightLinePreviousRecordExpression theFlightLinePreviousRecordExpression) { this.flightLinePreviousRecordExpression = theFlightLinePreviousRecordExpression; } public SummaryLevelEnum getSummaryLevel() { return summaryLevel; } public void setSummaryLevel(SummaryLevelEnum summaryLevel) { this.summaryLevel = summaryLevel; } public boolean isExcludeNetworkDetails() { return excludeNetworkDetails; } public void setExcludeNetworkDetails(boolean excludeNetworkDetails) { this.excludeNetworkDetails = excludeNetworkDetails; } } @SuppressWarnings("serial") private class NetworkDetailSubreportExpression extends AbstractSimpleExpression<JasperReportBuilder> { private FlightLinePreviousRecordExpression flightLinePreviousRecordExpression; private StyleBuilder columnTitleStyle; private StyleBuilder columnStyle; private boolean showSummaryHeaders; public NetworkDetailSubreportExpression( FlightLinePreviousRecordExpression flightLinePreviousRecordExpression, StyleBuilder columnTitleStyle, StyleBuilder columnStyle, boolean showSummaryHeaders) { setFlightLinePreviousRecordExpression(flightLinePreviousRecordExpression); setColumnTitleStyle(columnTitleStyle); setColumnStyle(columnStyle); setShowSummaryHeaders(showSummaryHeaders); } @Override public JasperReportBuilder evaluate(ReportParameters reportParameters) { JasperReportBuilder report = report(); // add fields report.addField(field("Package_Flight__r/Id", type.stringType())); report.addField(field("Package_Flight__r/Type__c", type.stringType())); // add group fields report.addField(field("Parent_Flight_Line__c", type.stringType())); report.addField(field("Network_Name__c", type.stringType())); addColumns(report, getFlightLineColumnLabelHashMap()); // style report.highlightDetailEvenRows(); report.setColumnTitleStyle(getColumnTitleStyle()); report.setColumnStyle(getColumnStyle()); // filter report.setFilterExpression(new FilterByDetailFlightLineIdExpression( getFlightLinePreviousRecordExpression())); // add a blank line at the end report.addLastPageFooter(cmp.text("")); // return report return report; } private JasperReportBuilder addColumns(JasperReportBuilder report, Map<String, String> fieldMap) { for (String key : fieldMap.keySet()) { // ================================= add columns: begin TextColumnBuilder<Integer> mapLocNumberColumn; if (key.equals("MapLocation_Number__c")) { try { mapLocNumberColumn = col .column(isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("MapLocation_Number__c"), new MapLocationNumberExpressionColumn( getMapPanelOrderPrefDataSourceFileName())) .setHorizontalAlignment( HorizontalAlignment.RIGHT) .setWidth(Units.inch(2)); report.addColumn(mapLocNumberColumn); report.sortBy(mapLocNumberColumn); report.addField(field("MapLocation_Number__c", type.stringType())); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (key.equals("MarketName__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "MarketName__c"), "MarketName__c", type.stringType())); } if (key.equals("Location_Description__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Location_Description__c"), "Location_Description__c", type.stringType()) .setWidth(Units.inch(3.5))); } if (key.equals("Panel_Id_Label__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Panel_Id_Label__c"), "Panel_Id_Label__c", type.stringType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("TAB_Id__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "TAB_Id__c"), "TAB_Id__c", type.stringType()).setHorizontalAlignment( HorizontalAlignment.RIGHT)); } // TODO: network detail columns. implement "Media Product" // column in salesforce object: PFL. Add formula field // (Panel__r.Quattro_Media_Product__c). Add to fieldset if (key.equals("Quattro_Media_Product__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Quattro_Media_Product__c"), "Quattro_Media_Product__c", type.stringType()) .setHorizontalAlignment(HorizontalAlignment.CENTER)); } if (key.equals("Face_Direction__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Face_Direction__c"), "Face_Direction__c", type.stringType()) .setHorizontalAlignment(HorizontalAlignment.LEFT)); } if (key.equals("Unit_Size__c")) { report.addColumn(col.column( this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Unit_Size__c"), "Unit_Size__c", type.stringType()).setHorizontalAlignment( HorizontalAlignment.RIGHT)); } if (key.equals("Weekly_Total_18_Imps__c")) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Weekly_Total_18_Imps__c"), "Weekly_Total_18_Imps__c", type.integerType()).setPattern("#,###") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("In_Mkt_Imps__c")) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "In_Mkt_Imps__c"), "In_Mkt_Imps__c", type.doubleType()) .setPattern("#,###") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("Total_Imps__c")) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Total_Imps__c"), "Total_Imps__c", type.doubleType()).setPattern("#,###") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("In_Mkt_TRP__c")) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "In_Mkt_TRP__c"), "In_Mkt_TRP__c", type.doubleType()).setPattern("##0.0") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("PlanTRP__c")) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "PlanTRP__c"), "PlanTRP__c", type.doubleType()).setPattern("##0.0") .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("Plan_Imps_Reach_Perc__c")) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Plan_Imps_Reach_Perc__c"), "Plan_Imps_Reach_Perc__c", type.percentageType()).setPattern("##0.0").setWidth(Units.inch(1.5)) .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("Plan_Imps_Avg_Frequency__c")) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Plan_Imps_Avg_Frequency__c"), "Plan_Imps_Avg_Frequency__c", type.doubleType()).setPattern("##0.0").setWidth(Units.inch(1.5)) .setHorizontalAlignment(HorizontalAlignment.RIGHT)); } if (key.equals("Illumination__c")) { report.addColumn(col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap().get( "Illumination__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "Illumination__c", type.bigDecimalType()) .setHorizontalAlignment(HorizontalAlignment.RIGHT) .setPattern("#,###").setWidth(Units.inch(1))); } if (key.equals("In_Mkt_Perc_Comp__c")) { TextColumnBuilder<BigDecimal> inMktPercCompColumn = col .column(this.isShowSummaryHeaders() ? "" : getFlightLineColumnLabelHashMap() .get("In_Mkt_Perc_Comp__c"), this.isShowSummaryHeaders() ? "OB_Summ_Num__c" : "In_Mkt_Perc_Comp__c", type.bigDecimalType()) .setHorizontalAlignment( HorizontalAlignment.LEFT) .setPattern("#,##0.00"); inMktPercCompColumn.setWidth(Units.inch(1.5)); report.addColumn(inMktPercCompColumn); } // ================================= add columns: end } return report; } public FlightLinePreviousRecordExpression getFlightLinePreviousRecordExpression() { return flightLinePreviousRecordExpression; } public void setFlightLinePreviousRecordExpression( FlightLinePreviousRecordExpression flightLinePreviousRecordExpression) { this.flightLinePreviousRecordExpression = flightLinePreviousRecordExpression; } public StyleBuilder getColumnTitleStyle() { return columnTitleStyle; } public void setColumnTitleStyle(StyleBuilder columnTitleStyle) { this.columnTitleStyle = columnTitleStyle; } public StyleBuilder getColumnStyle() { return columnStyle; } public void setColumnStyle(StyleBuilder columnStyle) { this.columnStyle = columnStyle; } public boolean isShowSummaryHeaders() { return showSummaryHeaders; } public void setShowSummaryHeaders(boolean showSummaryHeaders) { this.showSummaryHeaders = showSummaryHeaders; } } @SuppressWarnings("serial") private class FilterByDetailFlightLineIdExpression extends AbstractSimpleExpression<Boolean> { private FlightLinePreviousRecordExpression flightLinePreviousRecordExpression; public FilterByDetailFlightLineIdExpression( FlightLinePreviousRecordExpression flightLinePreviousRecordExpression) { //System.out.println(" FilterByDetailFlightLineIdExpression()"); setFlightLinePreviousRecordExpression(flightLinePreviousRecordExpression); } @Override public Boolean evaluate(ReportParameters reportParameters) { //System.out.println(" FilterByDetailFlightLineIdExpression evaluate begin"); String flightLineIdValue = getFlightLinePreviousRecordExpression() .getId(); String parentIdValue = reportParameters .getValue("Parent_Flight_Line__c"); Boolean returnValue = parentIdValue.equals(flightLineIdValue); //System.out.println(" FilterByDetailFlightLineIdExpression returnValue, flightLineIdValue, parentIdValue: " + returnValue + ", " + flightLineIdValue + ", " + parentIdValue); //System.out.println(" FilterByDetailFlightLineIdExpression evaluate: end"); return returnValue; } public FlightLinePreviousRecordExpression getFlightLinePreviousRecordExpression() { return flightLinePreviousRecordExpression; } public void setFlightLinePreviousRecordExpression( FlightLinePreviousRecordExpression flightLinePreviousRecordExpression) { this.flightLinePreviousRecordExpression = flightLinePreviousRecordExpression; } } private class FlightLinePreviousRecordExpression extends AbstractSimpleExpression<String> { private static final long serialVersionUID = 549979415L; private Integer m_reportRowNumber = 0; String m_lastIdValue = null; @Override public String evaluate(ReportParameters reportParameters) { //System.out.println("FlightLinePreviousRecordExpression.evaluate"); Integer reportRowNumber = reportParameters.getReportRowNumber(); //System.out.println(" reportRowNumber: " + reportRowNumber); if (reportRowNumber > this.m_reportRowNumber) { this.m_reportRowNumber = reportRowNumber; // try to get id value (if exception is raised that's because // the field doesn't exist) // so in this case just continue... try { //System.out.println("in FlightLinePreviousRecordExpression.evaluate ... get Id field value."); String idValue = reportParameters.getValue("Id"); this.m_lastIdValue = idValue; //System.out.println("Id -> " + idValue); } catch (Exception e) { //System.out.println("Couldn't get Id field value."); e.printStackTrace(); } } return "id: " + this.getId(); } public String getId() { return this.m_lastIdValue; } } private class CurrencyWithoutFractionDecimalType extends BigDecimalType { private static final long serialVersionUID = 1L; @Override public String getPattern() { return "$#,###"; } } private class CurrencyWithFractionDecimalType extends BigDecimalType { private static final long serialVersionUID = 1L; @Override public String getPattern() { return "$#,##0.00"; } } private class FlightNameReportScriptlet extends AbstractScriptlet { @Override public void afterDetailEval(ReportParameters reportParameters) { super.afterDetailEval(reportParameters); String division = reportParameters .getValue("Package_Flight__r/Division__c"); String flightName = reportParameters .getValue("Package_Flight__r/Name"); String mediaCategory = ""; String additionalCostType = reportParameters .getValue("Additional_Cost_Type__c"); /*String isAdditionalCostRelated = reportParameters .getValue("IsAdditionalCostRelated__c");*/ try { mediaCategory = reportParameters .getValue("Package_Flight__r/Media_Category__c"); // System.out.println(" FlightNameReportScriptlet mediaCategory " + mediaCategory); } catch (Exception e) { //System.out.println(" exc getting flight line Media_Category__c " + e); } //System.out.println(" FlightNameReportScriptlet calling valid disclaimers for flight division " + division + " media category " + mediaCategory + " isAdditionalCostRelated " + isAdditionalCostRelated + " additionalCostType " + additionalCostType); List<DisclaimerStore.DisclaimerWrapper> validDisclaimersList = new ArrayList<DisclaimerStore.DisclaimerWrapper>(); boolean isAdditionalCostFieldSelected = false; String flightLineAdditionalCostValue = ""; isAdditionalCostFieldSelected = getFlightLineColumnLabelHashMap().containsKey("Additional_Cost__c"); if(isAdditionalCostFieldSelected) { flightLineAdditionalCostValue = reportParameters.getValue("Additional_Cost__c"); } validDisclaimersList = disclaimerStore.getValidDisclaimers_Cost( flightName, division, mediaCategory, isAdditionalCostFieldSelected, flightLineAdditionalCostValue, additionalCostType); //System.out.println(" FlightNameReportScriptlet calling auto disclaimers "); Set<String> autoDisclaimerSet = disclaimerStore.getAutoDisclaimers( flightName, division, mediaCategory); validAllDisclaimersList.addAll(validDisclaimersList); autoDisclaimersSet.addAll(autoDisclaimerSet); } @Override public void afterGroupInit(String groupName, ReportParameters reportParameters) { super.afterGroupInit(groupName, reportParameters); /*for (String adiscl : autoDisclaimersSet) { System.out.println(" ******* auto disclaimers " + adiscl); }*/ } } @SuppressWarnings("serial") private class FilterByMarketIdExpression extends AbstractSimpleExpression<Boolean> { private PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression; public FilterByMarketIdExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { setPackageMarketFlightPreviousRecordExpression(packageMarketFlightPreviousRecordExpression); } @Override public Boolean evaluate(ReportParameters reportParameters) { // filter by market try { String lastMarketId = this .getPackageMarketFlightPreviousRecordExpression() .getLastMarketId(); /*String lastFlightId = this .getPackageMarketFlightPreviousRecordExpression() .getId();*/ String marketId = reportParameters.getValue("Id"); //System.out.println("FilterByMarketIdExpression.evaluate marketId, lastMarketId, lastFlightId = " + marketId + " " + lastMarketId + " " + lastFlightId); if (this.getPackageMarketFlightPreviousRecordExpression() .isMarketIdChanged()) { return marketId.equals(lastMarketId); } else { return false; } } catch (Exception e) { //System.out.println("FilterByMarketIdExpression.evaluate exception. "); e.printStackTrace(); return false; } } public PackageMarketFlightPreviousRecordExpression getPackageMarketFlightPreviousRecordExpression() { return packageMarketFlightPreviousRecordExpression; } public void setPackageMarketFlightPreviousRecordExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { this.packageMarketFlightPreviousRecordExpression = packageMarketFlightPreviousRecordExpression; } } @SuppressWarnings("serial") private class FilterByPackageIdExpression extends AbstractSimpleExpression<Boolean> { private PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression; public FilterByPackageIdExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { setPackageMarketFlightPreviousRecordExpression(packageMarketFlightPreviousRecordExpression); } @Override public Boolean evaluate(ReportParameters reportParameters) { // filter by package try { String lastPackageId = this .getPackageMarketFlightPreviousRecordExpression() .getLastPackageId(); /*String lastFlightId = this .getPackageMarketFlightPreviousRecordExpression() .getId();*/ String packageId = reportParameters.getValue("Id"); //System.out.println("FilterByPackageIdExpression.evaluate packageId, lastPackageId, lastFlightId = " + packageId + " " + lastPackageId + " " + lastFlightId); if (this.getPackageMarketFlightPreviousRecordExpression() .isPackageIdChanged()) { return packageId.equals(lastPackageId); } else { return false; } } catch (Exception e) { //System.out.println("FilterByPackageIdExpression.evaluate exception. "); e.printStackTrace(); return false; } } public PackageMarketFlightPreviousRecordExpression getPackageMarketFlightPreviousRecordExpression() { return packageMarketFlightPreviousRecordExpression; } public void setPackageMarketFlightPreviousRecordExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { this.packageMarketFlightPreviousRecordExpression = packageMarketFlightPreviousRecordExpression; } } private class FilterByFlightIdExpression extends AbstractSimpleExpression<Boolean> { private static final long serialVersionUID = 16566633224L; private PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression; public FilterByFlightIdExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { setPackageMarketFlightPreviousRecordExpression(packageMarketFlightPreviousRecordExpression); } @Override public Boolean evaluate(ReportParameters reportParameters) { return reportParameters.getValue("Package_Flight__r/Id").equals( getPackageMarketFlightPreviousRecordExpression().getId()); } public PackageMarketFlightPreviousRecordExpression getPackageMarketFlightPreviousRecordExpression() { return packageMarketFlightPreviousRecordExpression; } public void setPackageMarketFlightPreviousRecordExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { this.packageMarketFlightPreviousRecordExpression = packageMarketFlightPreviousRecordExpression; } } private class PackageChangedExpression extends AbstractSimpleExpression<Boolean> { private static final long serialVersionUID = 2447421076494269295L; private PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression; private Boolean isPackageChanged = true; public PackageChangedExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { setPackageMarketFlightPreviousRecordExpression(packageMarketFlightPreviousRecordExpression); } @Override public Boolean evaluate(ReportParameters reportParameters) { Boolean returnValue = isPackageChanged; try { String lastPackageId = this .getPackageMarketFlightPreviousRecordExpression() .getLastPackageId(); String packageId = reportParameters .getValue("Package_Flight__r/Package_Market__r/Package__r/Id"); if (this.getPackageMarketFlightPreviousRecordExpression() .isPackageIdChanged()) { returnValue = isPackageChanged; isPackageChanged = !packageId.equals(lastPackageId); } else { isPackageChanged = false; } } catch (Exception e) { //System.out.println("FilterByPackageNameExpression.evaluate exception. "); e.printStackTrace(); returnValue = false; } return returnValue; } public PackageMarketFlightPreviousRecordExpression getPackageMarketFlightPreviousRecordExpression() { return packageMarketFlightPreviousRecordExpression; } public void setPackageMarketFlightPreviousRecordExpression( PackageMarketFlightPreviousRecordExpression packageMarketFlightPreviousRecordExpression) { this.packageMarketFlightPreviousRecordExpression = packageMarketFlightPreviousRecordExpression; } } private class ShippingInstructionsSubreportExpression extends AbstractSimpleExpression<JasperReportBuilder> { public ShippingInstructionsSubreportExpression(PdfReporter reporter) { super(); this.setReporter(reporter); } private static final long serialVersionUID = 8861654532L; private PdfReporter reporter; @Override public JasperReportBuilder evaluate(ReportParameters reportParameters) { //System.out.println(" ShippingInstructionsSubreportExpression... getPageNumber(): " + reportParameters.getPageNumber()); // We record the entries here. It goes here for shipping instructions. List<Integer> toc = PdfReporter.this.tocEntries; if (toc.isEmpty() || toc.get(toc.size() - 1) <= reportParameters.getPageNumber()) { toc.add(reportParameters.getPageNumber() + 1); } // pass page number to reporter this.getReporter().setShippingInstructionsPageNumber( reportParameters.getPageNumber()); // styles /* * StyleBuilder boldStyle = stl.style().bold(); StyleBuilder * pageHeaderStyle = stl.style(boldStyle).setFontSize(10); * StyleBuilder columnTitleStyle = stl.style().setFontSize(8); * StyleBuilder columnStyle = stl.style(boldStyle).setFontSize(8); */ // styles StyleBuilder boldStyle = stl.style().bold().setFontSize(9)/* * .setFontName * ("Arial") */; StyleBuilder pageHeaderStyle = stl.style(boldStyle).setFontSize(10); StyleBuilder columnTitleStyle = stl.style().setFontSize(9)/* * .setFontName * ("Arial") */; // field reference FieldBuilder<String> nameField = field("Name", type.stringType()); FieldBuilder<String> addresseeField = field("Addressee__c", type.stringType()); FieldBuilder<String> attentionField = field("Attention__c", type.stringType()); FieldBuilder<String> address1Field = field("Address1__c", type.stringType()); FieldBuilder<String> address2Field = field("Address2__c", type.stringType()); FieldBuilder<String> cityField = field("City__c", type.stringType()); FieldBuilder<String> stateField = field("State__c", type.stringType()); FieldBuilder<String> zipCodeField = field("Zip_Code__c", type.stringType()); FieldBuilder<String> countryField = field("Country__c", type.stringType()); FieldBuilder<String> phoneField = field("Phone__c", type.stringType()); FieldBuilder<String> receiving_TimeField = field( "Receiving_Time__c", type.stringType()); FieldBuilder<String> notesField = field("Notes__c", type.stringType()); // header list at the top for division and addressee VerticalListBuilder headerList = cmp.verticalList(cmp.text(""), cmp .text(nameField).setStyle(boldStyle), cmp.text(addresseeField).setStyle(columnTitleStyle)); // rest of the fields VerticalListBuilder nameList = cmp.verticalList( cmp.text("Attention:").setStyle(columnTitleStyle) // attentionField , cmp.text("Address:").setStyle(columnTitleStyle) // address1Field , cmp.text("").setStyle(columnTitleStyle) // address2Field , cmp.text("").setStyle(columnTitleStyle) // cityField // stateField // zipCodeField , cmp.text("").setStyle(columnTitleStyle) // , cmp.text("Phone:").setStyle(columnTitleStyle) // phoneField , cmp.text("Time:").setStyle(columnTitleStyle) // receiving_TimeField , cmp.text("Note:").setStyle(columnTitleStyle) // notesField ); VerticalListBuilder valueList = cmp.verticalList(); // .setStyle(columnStyle) valueList.add(cmp.text(attentionField).setStyle(columnTitleStyle)); // Attention: valueList.add(cmp.text(address1Field).setStyle(columnTitleStyle)); // Address: valueList.add(cmp.text(address2Field).setStyle(columnTitleStyle)); // valueList.add(cmp.horizontalList( cmp.text(cityField).setStyle(columnTitleStyle) .setFixedWidth(Units.cm(2)), cmp.text(stateField).setStyle(columnTitleStyle) .setFixedWidth(Units.cm(1)), cmp.text(zipCodeField).setStyle(columnTitleStyle) .setFixedWidth(Units.cm(4)))); valueList.add(cmp.text(countryField).setStyle(columnTitleStyle)); // Phone: valueList.add(cmp.text(phoneField).setStyle(columnTitleStyle)); // Phone: valueList.add(cmp.text(receiving_TimeField).setStyle( columnTitleStyle)); // Time: valueList.add(cmp.text(notesField).setStyle(columnTitleStyle)); // Note: // create a column for names and another column for values ComponentColumnBuilder nameColumn = col.componentColumn(nameList) .setFixedWidth(Units.inch(1)); ComponentColumnBuilder valueColumn = col.componentColumn(valueList); // create report definition JasperReportBuilder report = report(); try { report.setTitleOnANewPage(true) .addPageHeader( cmp.text("Shipping Instructions").setStyle( pageHeaderStyle)) .addDetailHeader(headerList) .columns(nameColumn, valueColumn); } catch (Exception ex) { //System.out.println(" Some error occurred while creating shipping instructions sub report " + ex.getMessage()); ex.printStackTrace(); } // return report return report; } public PdfReporter getReporter() { return reporter; } public void setReporter(PdfReporter reporter) { this.reporter = reporter; } } private VerticalListBuilder createVerticalTable( ReportStyleBuilder groupHeaderStyle, ReportStyleBuilder groupValueStyle, String[] fieldNamesArray1, String[] fieldLabelsArray1, String[] fieldNamesArray2, String[] fieldLabelsArray2, Integer leftColumnWidth, String packageId) { VerticalListBuilder verticalList; verticalList = cmp.verticalList(); for (Integer index = 0; index < fieldNamesArray1.length; index++) { //System.out.println(" creating vertical table element. label: " + fieldLabelsArray1[index] + " name: " + fieldNamesArray1[index]); verticalList.add(createHorizontalKeyValueList( fieldLabelsArray1[index], new ValueExpression(packageId, fieldNamesArray1[index]), fieldLabelsArray2[index], new ValueExpression(packageId, fieldNamesArray2[index]), groupHeaderStyle, groupValueStyle, leftColumnWidth)); } verticalList.add(cmp.text("")); return verticalList; } private void createPackageCommentsAndDisclamersFooter( String dataSourceFileName, JasperReportBuilder report) { JRXmlDataSource packageFooterDataSource = null; try { packageFooterDataSource = new JRXmlDataSource(dataSourceFileName, QUERY_RESULT_RECORDS_UNIQUE_FLIGHT); } catch (JRException e) { // TODO Auto-generated catch block e.printStackTrace(); } SubreportBuilder packageFooterSubreport = cmp .subreport(new PackageFooterSubreportExpression()) .setDataSource(packageFooterDataSource).removeLineWhenBlank(); report.summary(packageFooterSubreport); } private VerticalListBuilder createCommentTable(String packageId) { VerticalListBuilder verticalList; verticalList = cmp.verticalList(); // for (String packageId : packageIds) { Set<String> packageNames = packageNamesMap.get(packageId); Set<String> packageComments = packageCommentsMap.get(packageId); List<String> flightNames = flightNamesMap.get(packageId); List<String> flightComments = flightCommentsMap.get(packageId); if (!(packageComments.isEmpty() || flightComments.isEmpty())) { verticalList.add(cmp.text("Comments:").setStyle(stl.style().bold()).removeLineWhenBlank()); Iterator<String> packageNamesIterator = packageNames.iterator(); Iterator<String> packageCommentsIterator = packageComments.iterator(); Iterator<String> flightNamesIterator = flightNames.iterator(); Iterator<String> flightCommentsIterator = flightComments.iterator(); String packageName = ""; if (packageNamesIterator.hasNext()) { packageName = (String) packageNamesIterator.next(); } String packageComment = ""; if (packageCommentsIterator.hasNext()) { packageComment = (String) packageCommentsIterator.next(); } if (StringUtils.isNotEmpty(packageComment)) { verticalList.add(cmp.text(packageName).setStyle(stl.style().bold()).removeLineWhenBlank()); verticalList.add(cmp.text(packageComment).removeLineWhenBlank()); } while (flightCommentsIterator.hasNext()) { String flightName = (String) flightNamesIterator.next(); String flightComment = (String) flightCommentsIterator.next(); if (StringUtils.isNotEmpty(flightComment)) { verticalList.add(cmp.text(flightName).setStyle(stl.style().bold()).removeLineWhenBlank()); verticalList.add(cmp.text(flightComment).removeLineWhenBlank()); } } } // } return verticalList; } private class DisclaimerExpression extends AbstractSimpleExpression<Object> { private static final long serialVersionUID = -2468924311042394628L; public DisclaimerExpression() { } public Object evaluate(ReportParameters reportParameters) { //System.out.println("******** DisclaimerExpression evaluate. getFieldName():validAllDisclaimersList " + validAllDisclaimersList.size()); String str = ""; Collections.sort(validAllDisclaimersList); for (DisclaimerStore.DisclaimerWrapper discWrapper : validAllDisclaimersList) { //System.out.println("******** DisclaimerExpression : valid disc " + discWrapper.sequenceInt + " disclaimer " + discWrapper.disclaimerText); if (!validDisclaimersListDisplay .contains(discWrapper.disclaimerText)) { validDisclaimersListDisplay.add(discWrapper.disclaimerText); } } for (String disc : validDisclaimersListDisplay) { //System.out.println("******** DisclaimerExpression :valid disc " + disc); str += disc.trim(); str += " "; } //System.out.println("******** disc string " + str + " length = " + str.length()); // str = str == "" ? "" : str.substring(0, str.length() - 2); //System.out.println("******** valid disc string " + str); return str; } } private class AutoDisclaimerExpression extends AbstractSimpleExpression<Object> { private static final long serialVersionUID = -2468924311042394628L; public AutoDisclaimerExpression() { } public Object evaluate(ReportParameters reportParameters) { //System.out.println("******** AutoDisclaimerExpression evaluate. getFieldName():autoDisclaimersSet " + autoDisclaimersSet.size()); String str = ""; for (String disc : autoDisclaimersSet) { //System.out.println("******** Auto disc " + disc); str += disc.trim(); str += " "; } // str = str == "" ? "" : str.substring(0, str.length() - 2); //System.out.println("******** Auto disc " + str); return str; // return StringUtils.join(autoDisclaimersSet, ','); } } private class ValueExpression extends AbstractSimpleExpression<Object> { private static final long serialVersionUID = -2468924311042394628L; // store field name private String m_fieldName; // store package id private String m_packageId; // create value expression for getting a value by field name, for // package id public ValueExpression(String packageId, String fieldName) { this.setPackageId(packageId); this.setFieldName(fieldName); } public Object evaluate(ReportParameters reportParameters) { //System.out.println("evaluate. getFieldName(): " + this.getFieldName()); // reportParameters. Object returnValue = ""; try { if (this.getFieldName() == null || this.getFieldName() == "") { return ""; } else if (this.getFieldName() == "Type__c") { returnValue = StringUtils.join( flightTypesMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Division__c") { returnValue = StringUtils.join( divisionsMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Package_Name__c") { returnValue = StringUtils.join( packageNamesMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Market_Name__c") { returnValue = StringUtils.join( marketNamesMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Market_Type__c") { returnValue = StringUtils.join( marketTypesMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Name") { returnValue = StringUtils.join( flightNamesMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Campaign_Start_Date__c") { returnValue = StringUtils.join( startDatesMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Campaign_End_Date__c") { returnValue = StringUtils.join( endDatesMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Duration_And_Type__c") { returnValue = StringUtils.join( durationsMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Target__c") { returnValue = StringUtils.join( targetsMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Target_Population__c") { returnValue = StringUtils.join( targetPopulationsMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Flight_Comments__c") { returnValue = StringUtils.join( flightCommentsMap.get(getPackageId()), ", "); } else if (this.getFieldName() == "Package_Comments__c") { returnValue = StringUtils.join( packageCommentsMap.get(getPackageId()), ", "); } else { returnValue = reportParameters .getValue(this.getFieldName()); } //System.out.println(" returnValue " + returnValue); } catch (Exception ex) { //System.out.println(" Some exception trying to get field " + this.getFieldName() + " message: " + ex.getMessage()); } return returnValue; } public String getFieldName() { return m_fieldName; } public void setFieldName(String m_fieldName) { this.m_fieldName = m_fieldName; } public String getPackageId() { return m_packageId; } public void setPackageId(String m_packageId) { this.m_packageId = m_packageId; } } /** * Create a horizontal list */ private HorizontalListBuilder createHorizontalKeyValueList(String text1, ValueExpression valueExpression1, String text2, ValueExpression valueExpression2, ReportStyleBuilder groupHeaderStyle, ReportStyleBuilder groupValueStyle, Integer leftColumnWidth) { HorizontalListBuilder horizontalList = cmp.horizontalList(); horizontalList.add(cmp.text(text1).setStyle(groupHeaderStyle) .setFixedWidth(leftColumnWidth)); horizontalList .add(cmp.text(valueExpression1).setStyle(groupValueStyle)); horizontalList.add(cmp.text(text2).setStyle(groupHeaderStyle) .setFixedWidth(leftColumnWidth)); horizontalList .add(cmp.text(valueExpression2).setStyle(groupValueStyle)); return horizontalList; } /* * Group expression for Flight Id */ private class FlightIdGroupExpression extends AbstractSimpleExpression<String> { private static final long serialVersionUID = 8512811414598238519L; @Override public String evaluate(ReportParameters reportParameters) { try { // NOTICE: group by name because we could loose TOC if grouping // by id. It means that for // generating TOC we need the names. If we put ID, this ID value // would // be shown in the TOC. return " " + reportParameters.getValue("Package_Flight__r/Name") + "................................................................................" + "$~" + reportParameters .getValue("Package_Flight__r/Package_Name__c"); } catch (Exception ex) { //System.out.println(ex.getStackTrace()); } return null; } } private class FlightDataExpression extends AbstractSimpleExpression<Integer> { private static final long serialVersionUID = 5879536463855991534L; public FlightDataExpression(JRXmlDataSource jrXmlDataSource) throws Exception { String packageId = ""; String buyType = ""; String division = ""; String packageName = ""; String marketName = ""; String marketType = ""; String flightName = ""; String startDate = ""; String endDate = ""; String duration = ""; String target = ""; String flightComment = ""; String packageComment = ""; Set<String> divisions = null; Set<String> marketNames = null; Set<String> marketTypes = null; Set<String> packageNames = null; List<String> flightNames = null; Set<String> flightTypes = null; Set<String> startDates = null; Set<String> endDates = null; Set<String> durations = null; Set<String> targets = null; Set<String> targetPopulations = null; List<String> flightComments = null; Set<String> packageComments = null; while (jrXmlDataSource.next()) { Document document = jrXmlDataSource.subDocument(); // optional, but recommended read this - // http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work document.getDocumentElement().normalize(); //System.out.println("Root element :" + document.getDocumentElement().getNodeName()); NodeList flightRecordsList = document .getElementsByTagName("Package_Flight__r"); // get current date as yyyy-mm-dd SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd"); // get current date as MM/dd/yyyy SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); DecimalFormat df = new DecimalFormat("#,###"); if (flightRecordsList != null && flightRecordsList.getLength() > 0) { for (int i = 0; i < flightRecordsList.getLength(); i++) { Node nNode = flightRecordsList.item(i); //System.out.println("\nCurrent Element :" + nNode.getNodeName()); packageId = ""; buyType = ""; division = ""; packageName = ""; marketName = ""; marketType = ""; flightName = ""; startDate = ""; endDate = ""; duration = ""; target = ""; flightComment = ""; packageComment = ""; if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; NodeList marketList = eElement .getElementsByTagName("Package_Market__r"); if (marketList != null && marketList.getLength() > 0) { Node mNode = marketList.item(0); //System.out.println("\nCurrent Element :" + mNode.getNodeName()); if (mNode.getNodeType() == Node.ELEMENT_NODE) { Element mElement = (Element) mNode; NodeList packageList = mElement .getElementsByTagName("Package__r"); if (packageList != null && packageList.getLength() > 0) { Node pNode = packageList.item(0); //System.out.println("\nCurrent Element :" + pNode.getNodeName()); if (pNode.getNodeType() == Node.ELEMENT_NODE) { Element gElement = (Element) pNode; NodeList idList = gElement .getElementsByTagName("Id"); if (idList != null && idList.getLength() > 0) { packageId = idList.item(0) .getTextContent(); //System.out.println("\nPackage Id :" + packageId); } } } } } divisions = divisionsMap.get(packageId) != null ? divisionsMap .get(packageId) : new LinkedHashSet<String>(); marketNames = marketNamesMap.get(packageId) != null ? marketNamesMap .get(packageId) : new LinkedHashSet<String>(); marketTypes = marketTypesMap.get(packageId) != null ? marketTypesMap .get(packageId) : new LinkedHashSet<String>(); packageNames = packageNamesMap.get(packageId) != null ? packageNamesMap .get(packageId) : new LinkedHashSet<String>(); flightNames = flightNamesMap.get(packageId) != null ? flightNamesMap .get(packageId) : new LinkedList<String>(); flightTypes = flightTypesMap.get(packageId) != null ? flightTypesMap .get(packageId) : new LinkedHashSet<String>(); startDates = startDatesMap.get(packageId) != null ? startDatesMap .get(packageId) : new LinkedHashSet<String>(); endDates = endDatesMap.get(packageId) != null ? endDatesMap .get(packageId) : new LinkedHashSet<String>(); durations = durationsMap.get(packageId) != null ? durationsMap .get(packageId) : new LinkedHashSet<String>(); targets = targetsMap.get(packageId) != null ? targetsMap .get(packageId) : new LinkedHashSet<String>(); targetPopulations = targetPopulationsMap .get(packageId) != null ? targetPopulationsMap .get(packageId) : new LinkedHashSet<String>(); flightComments = flightCommentsMap.get(packageId) != null ? flightCommentsMap .get(packageId) : new LinkedList<String>(); packageComments = packageCommentsMap.get(packageId) != null ? packageCommentsMap .get(packageId) : new LinkedHashSet<String>(); NodeList buyTypeList = eElement .getElementsByTagName("Type__c"); if (buyTypeList != null && buyTypeList.getLength() > 0) { buyType = buyTypeList.item(0).getTextContent(); flightTypes.add(buyType); } NodeList divisionList = eElement .getElementsByTagName("Division__c"); if (divisionList != null && divisionList.getLength() > 0) { division = divisionList.item(0) .getTextContent(); divisions.add(division); } NodeList packageNameList = eElement .getElementsByTagName("Package_Name__c"); if (packageNameList != null && packageNameList.getLength() > 0) { packageName = packageNameList.item(0) .getTextContent(); packageNames.add(packageName); } NodeList marketNameList = eElement .getElementsByTagName("Market_Name__c"); if (marketNameList != null && marketNameList.getLength() > 0) { marketName = marketNameList.item(0) .getTextContent(); marketNames.add(marketName); } NodeList marketTypeList = eElement .getElementsByTagName("Market_Type__c"); if (marketTypeList != null && marketTypeList.getLength() > 0) { marketType = marketTypeList.item(0) .getTextContent(); marketTypes.add(marketType); } NodeList flightNameList = eElement .getElementsByTagName("Name"); if (flightNameList != null && flightNameList.getLength() > 0) { flightName = flightNameList.item(0) .getTextContent(); flightNames.add(flightName); } NodeList startDateList = eElement .getElementsByTagName("Campaign_Start_Date__c"); if (startDateList != null && startDateList.getLength() > 0) { startDate = formatter.format(parser .parse(startDateList.item(0) .getTextContent())); startDates.add(startDate); } NodeList endDateList = eElement .getElementsByTagName("Campaign_End_Date__c"); if (endDateList != null && endDateList.getLength() > 0) { endDate = formatter.format(parser .parse(endDateList.item(0) .getTextContent())); endDates.add(endDate); } NodeList durationList = eElement .getElementsByTagName("Duration_And_Type__c"); if (durationList != null && durationList.getLength() > 0) { duration = durationList.item(0) .getTextContent(); durations.add(duration); } NodeList targetList = eElement .getElementsByTagName("Target__c"); if (targetList != null && targetList.getLength() > 0) { target = targetList.item(0).getTextContent(); targets.add(target); } NodeList targetPopulationList = eElement .getElementsByTagName("Target_Population__c"); if (targetPopulationList != null && targetPopulationList.getLength() > 0) { Double temp = Double .parseDouble(targetPopulationList.item( 0).getTextContent()); if (temp != null) { targetPopulations.add(df.format(temp)); } } NodeList flightCommentsList = eElement .getElementsByTagName("Flight_Comments__c"); if (flightCommentsList != null && flightCommentsList.getLength() > 0) { flightComment = flightCommentsList.item(0) .getTextContent(); flightComments.add(flightComment); } NodeList packageCommentsList = eElement .getElementsByTagName("Package_Comments__c"); if (packageCommentsList != null && packageCommentsList.getLength() > 0) { packageComment = packageCommentsList.item(0) .getTextContent(); packageComments.add(packageComment); } divisionsMap.put(packageId, divisions); marketNamesMap.put(packageId, marketNames); marketTypesMap.put(packageId, marketTypes); packageNamesMap.put(packageId, packageNames); flightNamesMap.put(packageId, flightNames); flightTypesMap.put(packageId, flightTypes); startDatesMap.put(packageId, startDates); endDatesMap.put(packageId, endDates); durationsMap.put(packageId, durations); targetsMap.put(packageId, targets); targetPopulationsMap.put(packageId, targetPopulations); flightCommentsMap.put(packageId, flightComments); packageCommentsMap.put(packageId, packageComments); /*System.out .println(" ********** creating flight header object : " + "buyType " + buyType + "division " + division + "packageName " + packageName + "marketName " + marketName + "marketType " + marketType + "flightName " + flightName + "startDate " + startDate + "endDate " + endDate + "duration " + duration + "target" + target + "targetPopulation " + targetPopulation);*/ } } } } } @Override public Integer evaluate(ReportParameters reportParameters) { //System.out.println(" DisclaimersDataExpression evaluate "); return null; } } public class DisclaimersDataExpression extends AbstractSimpleExpression<Integer> { private static final long serialVersionUID = 616516564L; // private Map<String, List<DisclaimerWrapper>> disclaimersMetadataMap = // new HashMap<String, List<DisclaimerWrapper>> (); // Disclaimer__c ,p.Proposal_Type__c, p.Output_Location__c, p.Notes__c, // p.Media_Types__c, p.Markets__c, p.Division__c From // //Proposal_Disclaimer__c p order by p.Output_Location__c public DisclaimersDataExpression(String disclaimerDataSourceFileName) throws ParserConfigurationException, SAXException, IOException, ParseException { File fXmlFile = new File(disclaimerDataSourceFileName); DocumentBuilderFactory dbFactory = DocumentBuilderFactory .newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); String division = ""; String disclaimerText = ""; String outputLocation = ""; String mediaType = ""; String proposalType = ""; String notes = ""; String sequence = ""; String shippingInstr = ""; String additionalCostType = ""; boolean isAdditionalCostRelated = false; // optional, but recommended // read this - // http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work doc.getDocumentElement().normalize(); //System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); NodeList disclaimerRecordsList = doc .getElementsByTagName("records"); // System.out.println("----------Total disclaimers ------------------" // + disclaimerRecordsList.getLength()); // mapPanelOrderPrefHashtable = new LinkedHashMap<String, // Integer>(); if (disclaimerRecordsList != null && disclaimerRecordsList.getLength() > 0) { for (int i = 0; i < disclaimerRecordsList.getLength(); i++) { Node nNode = disclaimerRecordsList.item(i); disclaimerText = ""; outputLocation = ""; mediaType = ""; division = ""; proposalType = ""; notes = ""; sequence = ""; shippingInstr = ""; additionalCostType = ""; isAdditionalCostRelated = false; // System.out.println("\nCurrent Element :" + // nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { // System.out.println("====================="); Element eElement = (Element) nNode; NodeList dcList = eElement .getElementsByTagName("Disclaimer__c"); if (dcList != null && dcList.getLength() > 0) { disclaimerText = dcList.item(0).getTextContent(); } NodeList opList = eElement .getElementsByTagName("Output_Location__c"); if (opList != null && opList.getLength() > 0) { outputLocation = opList.item(0).getTextContent(); } NodeList medCatList = eElement .getElementsByTagName("Media_Types__c"); if (medCatList != null && medCatList.getLength() > 0) { mediaType = medCatList.item(0).getTextContent(); } NodeList propList = eElement .getElementsByTagName("Proposal_Type__c"); if (propList != null && propList.getLength() > 0) { proposalType = propList.item(0).getTextContent(); } NodeList mkList = eElement .getElementsByTagName("Division__c"); if (mkList != null && mkList.getLength() > 0) { division = mkList.item(0).getTextContent(); } NodeList ntList = eElement .getElementsByTagName("Notes__c"); if (ntList != null && ntList.getLength() > 0) { notes = ntList.item(0).getTextContent(); } NodeList seqList = eElement .getElementsByTagName("Sequence__c"); if (seqList != null && seqList.getLength() > 0) { sequence = seqList.item(0).getTextContent(); } NodeList shippingInstList = eElement .getElementsByTagName("isShippingInstruction__c"); if (shippingInstList != null && shippingInstList.getLength() > 0) { shippingInstr = shippingInstList.item(0) .getTextContent(); } NodeList isAdditionalCostRelatedLst = eElement .getElementsByTagName("IsAdditionalCostRelated__c"); if (isAdditionalCostRelatedLst != null && isAdditionalCostRelatedLst.getLength() > 0) { String costVal = isAdditionalCostRelatedLst.item(0).getTextContent() ; if(costVal != null && costVal.equalsIgnoreCase("false")) { isAdditionalCostRelated = false; }else { isAdditionalCostRelated = true; } } NodeList additionalCostTypeLst = eElement .getElementsByTagName("Additional_Cost_Type__c"); if (additionalCostTypeLst != null && additionalCostTypeLst.getLength() > 0) { additionalCostType = additionalCostTypeLst.item(0) .getTextContent(); } /*System.out .println(" ********** creating disclaimer wrapper object: " + " Seq " + sequence + " Disclaimer Txt: " + disclaimerText + " mediaType " + mediaType + " division " + division + " shippingInstr " + shippingInstr + " isAdditionalCostRelated " + isAdditionalCostRelated + " additionalCostType " +additionalCostType );*/ disclaimerStore.createDisclaimerWrapper(disclaimerText, outputLocation, proposalType, division, mediaType, notes, sequence, shippingInstr, isAdditionalCostRelated, additionalCostType); } } //System.out.println(" ************ disclaimerStore disclaimerlist length " + disclaimerStore.getDisclaimersList().size()); } } @Override public Integer evaluate(ReportParameters reportParameters) { //System.out.println(" DisclaimersDataExpression evaluate "); return null; } } private class MapLocationNumberExpressionColumn extends AbstractSimpleExpression<Integer> { private static final long serialVersionUID = 616516564L; private LinkedHashMap<String, Integer> mapPanelOrderPrefHashtable = null; public MapLocationNumberExpressionColumn( String mapPanelOrderPrefDataSourceFileName) throws ParserConfigurationException, SAXException, IOException, ParseException { File fXmlFile = new File(mapPanelOrderPrefDataSourceFileName); DocumentBuilderFactory dbFactory = DocumentBuilderFactory .newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); // optional, but recommended read this - // http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work doc.getDocumentElement().normalize(); //System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("records"); //System.out.println("----------------------------"); mapPanelOrderPrefHashtable = new LinkedHashMap<String, Integer>(); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); //System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; //System.out.println("Staff id : " + eElement.getAttribute("id")); //System.out.println("Sort_Sequence__c: " + eElement.getElementsByTagName("Sort_Sequence__c").item(0).getTextContent()); //System.out.println("Flight__c: " + eElement.getElementsByTagName("Flight__c").item(0).getTextContent()); //System.out.println("Panel__c: " + eElement.getElementsByTagName("Panel__c").item(0).getTextContent()); String key = eElement.getElementsByTagName("Flight__c") .item(0).getTextContent() + " " + eElement.getElementsByTagName("Panel__c").item(0) .getTextContent(); String stringValue = eElement .getElementsByTagName("Sort_Sequence__c").item(0) .getTextContent(); // Use NumberFormat to format and parse numbers for the US // locale NumberFormat nf = NumberFormat.getNumberInstance(Locale.US); // Get // a // NumberFormat Number n = nf.parse(stringValue); // Parse strings according // to locale // set value //Integer value = (int) Math.round(n.doubleValue()); //System.out.println(" value: " + value); mapPanelOrderPrefHashtable.put(key, n.intValue()); } } } @Override public Integer evaluate(ReportParameters reportParameters) { String key = reportParameters.getValue("MapLocation_Number__c"); //System.out.println(" searching MapLocation_Number__c key" + key); Integer integerValue = this.mapPanelOrderPrefHashtable.get(key); if (integerValue != null) { //System.out.println(" found integerValue: " + integerValue); return integerValue; } //System.out.println(" key not found " + integerValue); return null; } } public List<PDFCombinerContentEntry> getPDFCombinerContentEntryList() throws IOException { // read file to string String encoding = System.getProperty("file.encoding"); String rawTableOfContentsString = FileUtils.readFileToString(new File( getGeneratedReport("csv")), encoding); // source lines String[] lines = rawTableOfContentsString.split("\\n"); //System.out.println(" lines " + lines); // debug info //System.out.println(" encoding: " + encoding); //System.out.println(" lineSeparator: " + lineSeparator); //System.out.println(" line count: " + lines.length); List<PDFCombinerContentEntry> pages = getPDFCombinerContentEntryList(lines); // boolean hasShippingInstructionsPageNumber = // this.getShippingInstructionsPageNumber() != null; // if(hasShippingInstructionsPageNumber) if (this.doesShippingInstructionsExists) { PDFCombinerContentEntry pdfCombinerContentEntry = new PDFCombinerContentEntry(); pdfCombinerContentEntry.setTitle("Shipping Instructions"); pdfCombinerContentEntry.setPageNumber(this .getShippingInstructionsPageNumber() + 1); // page number seems zero-index based, so adding one to it. pages.add(pdfCombinerContentEntry); } refreshTocEntries(pages); return pages; } /** * This method refresh toc entries with page indices recorded during generating pdf report. * <p>This is a more accurate way to do this.</p> * * @author TCSASSEMBLER * @version 1.0 * * @param pages The pdf content entry list. */ private void refreshTocEntries(List<PDFCombinerContentEntry> pages) { int len = Math.min(pages.size(), this.tocEntries.size()); for (int i = 0; i < len; i++) { pages.get(i).setPageNumber(this.tocEntries.get(i)); } } public static List<PDFCombinerContentEntry> getPDFCombinerContentEntryList( String[] lines) { // pdf combiner entry list List<PDFCombinerContentEntry> pdfCombinerContentEntryList = new ArrayList<PDFCombinerContentEntry>(); // detecting if string has table of contents? Boolean hasTOC = false; // System.out.println(" rawTableOfContentsString: " + // rawTableOfContentsString); // last added title String lastAddedTitle = null; // parse lines for (String line : lines) { //System.out.println(" ************ line " + line); boolean startsWithOnlyOneSpace = line.startsWith(" ") && line.substring(1, 2) != " "; if (line.startsWith("Table of contents")) { hasTOC = true; } else if (line.startsWith("Proposal")) { break; } else if (hasTOC && startsWithOnlyOneSpace) { // get page number int pageNumber = getPageNumberFromLine(line); // get title part String lineParts[] = line.split("\\,"); String finalLine = lineParts[0]; finalLine = finalLine.replaceAll("null", "").trim(); //System.out.println(" finalLine, pageNumber: " + finalLine + ", " + pageNumber); //System.out.println(" hasTOC, line: " + hasTOC + "," + line); if (lastAddedTitle == null || !finalLine.equals(lastAddedTitle)) { // add entry PDFCombinerContentEntry pdfCombinerContentEntry = new PDFCombinerContentEntry(); //System.out.println(" finalLine, indexof: " + finalLine + ", " + pageNumber); if (finalLine.indexOf("$~") > 0) { //System.out.println("if"); String[] arr = finalLine.split("\\$\\~"); //System.out.println("array length " + arr.length); if (arr.length > 1) { pdfCombinerContentEntry.setTitle(arr[1]); } pdfCombinerContentEntry.setDescription(arr[0]); } else { //System.out.println("why else"); pdfCombinerContentEntry.setTitle(finalLine); } // pdfCombinerContentEntry.setTitle(finalLine); pdfCombinerContentEntry.setPageNumber(pageNumber); pdfCombinerContentEntryList.add(pdfCombinerContentEntry); /* * System.out.println(" finalLine, pageNumber: " + * finalLine + ", " + pageNumber); * * System.out.println(" hasTOC, line: " + hasTOC + "," + * line); */ lastAddedTitle = finalLine; } } } return pdfCombinerContentEntryList; } // get numbers from the end of passed input string // input example: Package Albaquerque // DMA,,,,,,..............................................................................................................................................,,,,,,258 // return 258 public static int getPageNumberFromLine(String string) { String numberString = ""; for (int i = string.length(); i > 0; i--) { String s = string.substring(i - 1, i); // System.out.println(" i, s, numberString: " + i + ", " + s + // ", " + numberString); if (isIntegerParseInt(s)) { numberString = s + numberString; } else { // no more numbers found break; } } if (numberString.length() > 0) { return Integer.parseInt(numberString); } else { return 0; } } public static boolean isIntegerParseInt(String str) { try { Integer.parseInt(str); return true; } catch (NumberFormatException nfe) { } return false; } public Integer getShippingInstructionsPageNumber() { return shippingInstructionsPageNumber; } public void setShippingInstructionsPageNumber( Integer shippingInstructionsPageNumber) { this.shippingInstructionsPageNumber = shippingInstructionsPageNumber; } public boolean isDoesShippingInstructionsExists() { return doesShippingInstructionsExists; } public void setDoesShippingInstructionsExists( boolean doesShippingInstructionsExists) { this.doesShippingInstructionsExists = doesShippingInstructionsExists; } private HashMap<String, String> getFlightLineColumnLabelHashMap() { return flightLineColumnLabelHashMap; } private void setFlightLineColumnLabelHashMap( HashMap<String, String> flightLineColumnLabelHashMap) { this.flightLineColumnLabelHashMap = flightLineColumnLabelHashMap; } public String getMapPanelOrderPrefDataSourceFileName() { return mapPanelOrderPrefDataSourceFileName; } public void setMapPanelOrderPrefDataSourceFileName( String mapPanelOrderPrefDataSourceFileName) { this.mapPanelOrderPrefDataSourceFileName = mapPanelOrderPrefDataSourceFileName; } public String getDetailDataSourceFileName() { return detailDataSourceFileName; } public void setDetailDataSourceFileName(String detailDataSrcFileName) { this.detailDataSourceFileName = detailDataSrcFileName; } private static boolean hasLocationMapAttachments( List<PDFCombinerFile> appendixes) { boolean locationMapExists = false; // if it has appendixes if (appendixes != null) { for (PDFCombinerFile file : appendixes) { //System.out.println(" appendix attachment url " + file.getSalesforceUrl()); if (file.getSalesforceUrl() != null) { if (file.getSalesforceUrl().toLowerCase() .contains("sobjects/attachment")) { locationMapExists = true; break; } } } } return locationMapExists; } public Integer getRecordCount() { return recordCount; } public void setRecordCount(Integer recordCount) { this.recordCount = recordCount; } public StyleBuilder getFlightHeaderStyle() { return flightHeaderStyle; } public void setFlightHeaderStyle(StyleBuilder flightHeaderStyle) { this.flightHeaderStyle = flightHeaderStyle; } public DisclaimerStore getDisclaimerStore() { return disclaimerStore; } }