wbs.jsf1.pdf.LottoReceiptBean0.java Source code

Java tutorial

Introduction

Here is the source code for wbs.jsf1.pdf.LottoReceiptBean0.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package wbs.jsf1.pdf;

import com.itextpdf.io.font.FontConstants;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.border.Border;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.HorizontalAlignment;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import wbs.jsf1.persistence.Lottoschein;
import wbs.jsf1.persistence.LottoscheinFacadeLocal;
import wbs.jsf1.util.ByteLongConverter;
import wbs.jsf1.util.LottoUtil;

/**
 *
 * @author Guy Boldon
 */
// @Stateless

public class LottoReceiptBean0 implements LottoReceiptBeanLocal {

    // @EJB
    LottoscheinFacadeLocal lottoscheinFacadeLocal;

    private static final Logger LOG = Logger.getLogger(LottoReceiptBean0.class.getName());
    private static final int annahmeschlussMittwoch = 18;
    private static final int annahmeschlussSamstag = 19;
    private static final String IMAGE_NAME = "lotto6aus49.png";
    private static String imagePath;
    private static String datum = new SimpleDateFormat("ddMMyyyy").format(new Date());
    private Lottoschein zahlen;

    @PostConstruct
    public void init() {
        // imagePath = this.getClass().getResource(IMAGE_NAME).getPath();
        // imagePath = LottoReceiptBean.class.getResource(IMAGE_NAME).getPath();
        imagePath = Thread.currentThread().getContextClassLoader().getResource(IMAGE_NAME).getPath();
    }

    public byte[] createPdfFrom(Lottoschein lottoschein) {
        try {
            zahlen = lottoschein;

            ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
            PdfWriter writer = new PdfWriter(pdfStream);
            PdfDocument pdf = new PdfDocument(writer);
            PageSize pageSize = new PageSize(PageSize.A6);
            Document document = new Document(pdf, pageSize);
            document.setMargins(20, 20, 40, 20);
            PdfFont font = PdfFontFactory.createFont(FontConstants.HELVETICA);
            PdfFont bold = PdfFontFactory.createFont(FontConstants.HELVETICA_BOLD);
            // Header
            document.add(getHeaderTable());
            // Lottozahlen auflisten
            document.add(getZiehungsDatenTable(font, bold));
            // Losnummer
            document.add(getLosnummerTable(font, bold));
            // Spieltage
            document.add(getSpieltageTable(font, bold));
            // Laufzeit
            document.add(getLaufzeitTable(font, bold));
            // Betrag
            document.add(getBetragTable(font, bold));
            document.close();
            LOG.log(Level.INFO, "PDF succesfully created.");
            return pdfStream.toByteArray();
        } catch (IOException ex) {
            Logger.getLogger(LottoReceiptBean0.class.getName()).log(Level.SEVERE, "pdf creation problem", ex);
        }
        return null;
    }

    private Table getHeaderTable() throws MalformedURLException {
        Table table = new Table(new float[] { 1 }) {
        };
        table.setWidthPercent(100);
        getHeaderImage(table);
        table.addCell(new Cell().add("").setBorder(Border.NO_BORDER));

        return table;
    }

    private void getHeaderImage(Table table) {
        Image headerLogo;

        try {
            headerLogo = new Image(ImageDataFactory.create(imagePath)).setAutoScale(true)
                    .setBorder(Border.NO_BORDER);
            table.addCell(new Cell().add(headerLogo).setBorder(Border.NO_BORDER));
        } catch (Exception e) {
            LOG.log(Level.WARNING, "cannot find the image file for the pdf");
            table.addCell(new Cell().setBorder(Border.NO_BORDER));
        }

    }

    private Table getZiehungsDatenTable(PdfFont font, PdfFont bold) {
        Table table = new Table(new float[] { 1, 1, 1, 1, 1, 1, 1 }) {
        };
        table.setWidthPercent(100);

        int lineCnt = 0;
        long[] result = ByteLongConverter.byteToLong(zahlen.getTipps());

        for (long l : result) {
            table.addCell(new Cell().add(new Paragraph(String.valueOf(++lineCnt) + ".").setFont(font))
                    .setBorder(Border.NO_BORDER).setWidthPercent(20));
            List<Integer> lz = LottoUtil.tippAsArrayList(l);

            for (Integer i : lz) {
                table.addCell(new Cell().add(new Paragraph(String.valueOf(i)).setFont(font))
                        .setBorder(Border.NO_BORDER).setWidthPercent(13));
            }

        }
        return table;
    }

    private Table getLosnummerTable(PdfFont font, PdfFont bold) {
        Table table = new Table(new float[] { 1, 1, 1 }) {
        };
        table.setWidthPercent(100);

        table.addCell(new Cell().add("").setBorder(Border.NO_BORDER));
        table.addCell(new Cell().add("").setBorder(Border.NO_BORDER));
        table.addCell(new Cell().add("").setBorder(Border.NO_BORDER));

        table.addCell(new Cell().add(new Paragraph("Superzahl").setFont(font)).setBorder(Border.NO_BORDER)
                .setWidthPercent(55));
        table.addCell(
                new Cell().add(new Paragraph("").setFont(font)).setBorder(Border.NO_BORDER).setWordSpacing(35));
        String superzahl = String.valueOf(zahlen.getLosnummer());
        table.addCell(new Cell().add(new Paragraph(superzahl.substring(superzahl.length() - 1)).setFont(font))
                .setBorder(Border.NO_BORDER).setWordSpacing(10).setHorizontalAlignment(HorizontalAlignment.RIGHT));

        table.addCell(new Cell().add(new Paragraph("Losnummer").setFont(font)).setBorder(Border.NO_BORDER)
                .setWidthPercent(55));
        table.addCell(new Cell().add(new Paragraph("Super6").setFont(font)).setBorder(Border.NO_BORDER)
                .setWordSpacing(35));
        table.addCell(new Cell().add(new Paragraph(isGame(zahlen.getIsSuper6())).setFont(font))
                .setBorder(Border.NO_BORDER).setWordSpacing(10));

        table.addCell(new Cell().add(new Paragraph(String.valueOf(zahlen.getLosnummer())).setFont(font))
                .setBorder(Border.NO_BORDER).setWidthPercent(55));
        table.addCell(new Cell().add(new Paragraph("Spiel77").setFont(font)).setBorder(Border.NO_BORDER)
                .setWordSpacing(35));
        table.addCell(new Cell().add(new Paragraph(isGame(zahlen.getIsSpiel77())).setFont(font))
                .setBorder(Border.NO_BORDER).setWordSpacing(10));

        return table;
    }

    private Table getSpieltageTable(PdfFont font, PdfFont bold) {
        Table table = new Table(new float[] { 1 }) {
        };
        table.addCell(new Cell().add("").setBorder(Border.NO_BORDER));
        table.addCell(new Cell()
                .add(new Paragraph(getSpieltageText(zahlen.getIsMittwoch(), zahlen.getIsSamstag()).toString())
                        .setFont(font))
                .setBorder(Border.NO_BORDER).setWidthPercent(55));
        return table;
    }

    private Table getLaufzeitTable(PdfFont font, PdfFont bold) {
        Table table = new Table(new float[] { 1, 1 }) {
        };
        table.addCell(new Cell().add("").setBorder(Border.NO_BORDER));
        table.addCell(new Cell().add("").setBorder(Border.NO_BORDER));

        table.addCell(new Cell().add(new Paragraph(getLaufzeitText(zahlen.getLaufzeit()).toString()).setFont(font))
                .setBorder(Border.NO_BORDER).setWidthPercent(55));
        table.addCell(new Cell().add(new Paragraph("vom " + dateFormatter(zahlen.getAbgabeDatum())).setFont(font))
                .setBorder(Border.NO_BORDER).setWidthPercent(45));

        table.addCell(
                new Cell().add(new Paragraph("").setFont(font)).setBorder(Border.NO_BORDER).setWidthPercent(55));
        table.addCell(new Cell().add(new Paragraph("bis " + dateFormatter(getEndDatum())).setFont(font))
                .setBorder(Border.NO_BORDER).setWidthPercent(45));

        return table;
    }

    private Table getBetragTable(PdfFont font, PdfFont bold) {
        Table table = new Table(new float[] { 1, 1 }) {
        };
        table.addCell(new Cell().add("").setBorder(Border.NO_BORDER));
        table.addCell(new Cell().add("").setBorder(Border.NO_BORDER));

        table.addCell(new Cell().add("Betrag: ").setBorder(Border.NO_BORDER).setWidthPercent(80));
        table.addCell(new Cell().add(zahlen.getKosten().toString() + " ").setBorder(Border.NO_BORDER)
                .setWidthPercent(20).setHorizontalAlignment(HorizontalAlignment.RIGHT));
        return table;
    }

    // TODO: Schlauer machen
    /*
     * Ermittelt das letzte Spieldatum. Problematik: Um den tatschlich letzten
     * Ziehungstag zu errechnen, kann man nicht einfach 2 Wochen zum Abgabedatum
     * dazu rechnen. Reiche ich beispielsweise am Dienstag 20.03. den Lottoschein
     * ein und gebe 2 Wochen Laufzeit an, spiele aber nur Mittwochslotto, dann wrde
     * bei einer Aufrechnung von 2 Wochen der letzte Samstag mit eingeschlossen und
     * somit angezeigt werden, obwohl ich nur Mittwochslotto spiel. Daher muss
     * geprft werden, welche Tage (Mi oder Sa) gespielt werden, um diese dann von
     * meinen Zhlern abzuziehen. Wenn 0 erreicht wurde, muss die Schleife beendet
     * werden. Das dann ermittelte Datum ist der letzte tatschlich Ziehungstag, an
     * dem man teilnimmt.
     */
    private Date getEndDatum() {
        int wochenlaufzeit = zahlen.getLaufzeit();
        int tage = wochenlaufzeit * 7;
        Date datumStart = zahlen.getAbgabeDatum();

        int m = wochenlaufzeit;
        int s = wochenlaufzeit;

        Calendar curr = Calendar.getInstance();
        curr.get(Calendar.HOUR_OF_DAY);

        Calendar cal = Calendar.getInstance();
        cal.setTime(datumStart);

        if (cal.get(Calendar.DAY_OF_WEEK) == 4 & curr.get(Calendar.HOUR_OF_DAY) > annahmeschlussMittwoch) {
            cal.add(Calendar.DATE, 1);
        }

        if (cal.get(Calendar.DAY_OF_WEEK) == 7 & curr.get(Calendar.HOUR_OF_DAY) > annahmeschlussSamstag) {
            cal.add(Calendar.DATE, 1);
        }

        for (int i = 0; i < tage; i++) {
            cal.add(Calendar.DATE, 1);
            if (cal.get(Calendar.DAY_OF_WEEK) == 4) {
                m--;
            }
            if (cal.get(Calendar.DAY_OF_WEEK) == 7) {
                s--;
            }
            if (zahlen.getIsMittwoch() & zahlen.getIsSamstag()) {
                if (m == 0 & s == 0) {
                    break;
                }
            } else {
                if (zahlen.getIsMittwoch()) {
                    if (m == 0) {
                        break;
                    }
                }
                if (zahlen.getIsSamstag()) {
                    if (s == 0) {
                        break;
                    }
                }
            }
        }

        return cal.getTime();
    }

    private String dateFormatter(Date date) {
        DateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
        return formatter.format(date);
    }

    private StringBuilder getLaufzeitText(int wochen) {
        StringBuilder laufzeit = new StringBuilder();
        laufzeit.append("Laufzeit: " + wochen + " Woche");
        if (wochen > 1) {
            laufzeit.append("n");
        }
        return laufzeit;
    }

    private StringBuilder getSpieltageText(boolean isM, boolean isS) {
        StringBuilder spieltage = new StringBuilder();
        spieltage.append("Spieltag");
        if (isM & isS) {
            spieltage.append("e");
        }
        if (isM) {
            spieltage.append(" Mittwoch ");
        }
        if (isM & isS) {
            spieltage.append("und");
        }
        if (isS) {
            spieltage.append(" Samstag");
        }
        return spieltage;
    }

    private String isGame(boolean check) {
        return check ? "JA" : "NEIN";
    }
}