summaryrefslogtreecommitdiffstats
path: root/ecomp-sdk/sdk-analytics/src/main/java/org/openecomp/portalsdk/analytics/model/pdf/PageEvent.java
blob: 34e38062f5c8cd914b3258891706dc7188eeda77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

@media only all and (prefers-color-scheme: dark) {
.highlight .hll { background-color: #49483e }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: light) {
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066
/*-
 * ================================================================================
 * eCOMP Portal SDK
 * ================================================================================
 * Copyright (C) 2017 AT&T Intellectual Property
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ================================================================================
 */
package org.openecomp.portalsdk.analytics.model.pdf;

import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;

import org.openecomp.portalsdk.analytics.system.AppUtils;
import org.openecomp.portalsdk.analytics.system.Globals;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.ExceptionConverter;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfDestination;
import com.lowagie.text.pdf.PdfOutline;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfPageEventHelper;
import com.lowagie.text.pdf.PdfWriter;

class PageEvent extends PdfPageEventHelper {
	private PdfBean pb;
	private int pageNo = 0;
	private int omit_page_count = 0;
	private int DEFAULT_LOGO_SIZE = 100;

	public PageEvent(PdfBean pb) {
		this.pb = pb;
	}

	private int getWidthEntries(int howManyLogos){
		int widthEntries = 0;
		
		if(howManyLogos == 2)
			widthEntries = 3;
		else
		if(howManyLogos == 1)
			widthEntries = 2;
		else
			widthEntries = 0;
		
		return widthEntries;
	}
	
	private int getHowManyLogos(){
		int howManyLogos = 0;
		
		if(AppUtils.isNotEmpty(pb.getLogo1Url()) && !pb.getLogo1Url().equalsIgnoreCase("<no logo>"))
			howManyLogos ++;
		
		if(AppUtils.isNotEmpty(pb.getLogo2Url()) && !pb.getLogo2Url().equalsIgnoreCase("<no logo>"))
			howManyLogos ++;
		
		return howManyLogos;
	}
	
	private float[] fillWidthsArray(int howManyLogos){
		float[] widthsArray = new float[howManyLogos + 1];
		
		//If one logo, we will need two columns in the header[left log, spacer] 
		if(howManyLogos == 1){
			widthsArray = new float[2];
			widthsArray[0] = 0.1f;
			widthsArray[1] = 0.1f;
		}
		//If two logs, we will need three columns in the header [left log, spacer, right log]
		else
		if(howManyLogos == 2){
			widthsArray = new float[3];
			widthsArray[0] = 0.1f;
			widthsArray[1] = 0.5f;
			widthsArray[2] = 0.1f;
		}
		
		return widthsArray;
	}
	public void onStartPage(PdfWriter writer, Document document) {
		
		Font font = FontFactory.getFont(Globals.getFooterFontFamily(), Globals.getFooterFontSize(), Font.NORMAL, Color.BLACK);
		int howManyLogos = getHowManyLogos();
		
		//No need to draw anything in the header if no logo was set in the report.
		if(howManyLogos == 0)
			return;
		
		float[] widths = fillWidthsArray(howManyLogos);
				
		PdfPTable foot = new PdfPTable(widths);
		
		if(AppUtils.isNotEmpty(pb.getLogo1Url()) && !pb.getLogo1Url().equalsIgnoreCase("<no logo>"))
			addLogo(foot, font, pb.getLogo1Url().substring(pb.getLogo1Url().indexOf("|") + 1).trim(), Cell.ALIGN_LEFT, pb.getLogo1Size() == null ? DEFAULT_LOGO_SIZE : pb.getLogo1Size());
		
		PdfPCell spacingCell = new PdfPCell();
		spacingCell.setBorderColor(Color.WHITE);
		foot.addCell(spacingCell);
		
		//Using logo1 size for now - use logo2 size if it is required to deal it separately.
		if(AppUtils.isNotEmpty(pb.getLogo2Url()) && !pb.getLogo2Url().equalsIgnoreCase("<no logo>"))
			addLogo(foot, font, pb.getLogo2Url().substring(pb.getLogo2Url().indexOf("|") + 1).trim(),  Cell.ALIGN_RIGHT, pb.getLogo2Size() == null ? DEFAULT_LOGO_SIZE : pb.getLogo2Size());

		foot.setTotalWidth(getPageWidth(document));
		foot.writeSelectedRows(0, -1, 36, 600, writer.getDirectContent());
	}

	public void onEndPage(PdfWriter writer, Document document) {

		Font font = FontFactory.getFont(Globals.getFooterFontFamily(), Globals.getFooterFontSize(), Font.NORMAL, Color.BLACK);

		try {

			// footer
			float[] f = { 1f, 0.4f, 1f };
			PdfPTable foot = new PdfPTable(f);
			foot.getDefaultCell().setBorderWidth(0);
			foot.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
			foot.getDefaultCell().setVerticalAlignment(Rectangle.ALIGN_BOTTOM);

			foot.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_LEFT);
			addLeftFooter(foot, font);

			foot.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_CENTER);
			addPageNumber(foot, font, pb.isPageNumberAtFooter(), document.getPageNumber());

			foot.getDefaultCell().setHorizontalAlignment(Rectangle.ALIGN_RIGHT);
			foot.getDefaultCell().setNoWrap(true);

			foot.addCell(new Paragraph("                   " + PdfReportHandler.currentTime(pb.getTimestampPattern()), font));

			foot.setTotalWidth(getPageWidth(document));
			foot.writeSelectedRows(0, -1, document.leftMargin(), document.bottomMargin(), writer.getDirectContent());

			// bookmark
			pageNo++;
			PdfContentByte cb = writer.getDirectContent();
			PdfDestination destination = new PdfDestination(PdfDestination.FITH);
			String bookmark = "Data Page " + (pageNo - omit_page_count);
			if (pageNo == 1) {
				if (pb.isCoverPageIncluded()) {
					bookmark = "Cover Page";
					omit_page_count++;
				} else if (pb.isDisplayChart()) {
					bookmark = "Chart";
					omit_page_count++;
				}
			}
			if (pageNo == 2 && pb.isCoverPageIncluded() && pb.isDisplayChart()) {
				bookmark = "Chart";
				omit_page_count++;
			}

			PdfOutline outline = new PdfOutline(cb.getRootOutline(), destination, bookmark);

		} catch (Exception e) {
			throw new ExceptionConverter(e);
		}
	}

	private void addPageNumber(PdfPTable table, Font font, boolean isAdd, int pageNum) {
		if (isAdd)
			table.addCell(new Paragraph(Globals.getWordBeforePageNumber() + " " + pageNum + " " + Globals.getWordAfterPageNumber(), font));
		else
			table.addCell("");
	}

	private void addLeftFooter(PdfPTable table, Font font) {
		Font font1 = new Font(font);
		font1.setSize(Globals.getAttProprieraryFontSize());

		if (isEmpty(pb.getLeftFooter()))
			table.addCell(new Paragraph("                 " + Globals.getAttProprietary(), font1));
		else
			table.addCell(new Paragraph(pb.getLeftFooter(), font));
	}

	private void addHeaderDummy(PdfPTable table, Font font) {
		Font font1 = new Font(font);
		font1.setSize(Globals.getAttProprieraryFontSize());

		table.addCell(new Paragraph("Header row", font1));
	}

	private void addLogo(PdfPTable table, Font font, String imgSrc, int alignment, int absoluteSize) {

		Image img = null;
		try {
			img = Image.getInstance(pb.getFullWebContextPath() + AppUtils.getImgFolderURL() + File.separator + imgSrc);
		} catch (BadElementException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			img = null;
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			img = null;
		} catch (IOException e) {
			// TODO Auto-generated catch block			
			e.printStackTrace();
			
		}
		if(img == null){
			//log that the input file couldnt be loaded - 
		}
		else{
			//img.scaleAbsolute(absoluteSize, absoluteSize);
			img.scalePercent(absoluteSize, absoluteSize);
			PdfPCell cell = new PdfPCell(img);
			cell.setBorderColor(Color.WHITE);
			cell.setHorizontalAlignment(alignment);
			table.addCell(cell);
		}

	}

	public static float getPageWidth(Document doc) {
		return doc.getPageSize().width() - doc.leftMargin() - doc.rightMargin();
	}

	public static float getPageHeight(Document doc) {
		return doc.getPageSize().height() - doc.topMargin() - doc.bottomMargin();
	}

	private float getHeadTopMargin(Document doc, PdfPTable table) {
		return doc.getPageSize().height() - doc.topMargin() + table.getTotalHeight();
	}

	private boolean isEmpty(String str) {
		return str == null || str.trim().length() == 0;
	}

} // PageEvent