org.silverpeas.components.almanach.control.AlmanachPdfGenerator.java Source code

Java tutorial

Introduction

Here is the source code for org.silverpeas.components.almanach.control.AlmanachPdfGenerator.java

Source

/*
 * Copyright (C) 2000 - 2015 Silverpeas
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * As a special exception to the terms and conditions of version 3.0 of
 * the GPL, you may redistribute this Program in connection with Free/Libre
 * Open Source Software ("FLOSS") applications as described in Silverpeas's
 * FLOSS exception. You should have received a copy of the text describing
 * the FLOSS exception, and it is also available here:
 * "https://www.silverpeas.org/legal/floss_exception.html"
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
/*--- formatted by Jindent 2.1, (www.c-lab.de/~jindent)
 ---*/

/*
 * AlmanachPdfGenerator.java
 *
 */

package org.silverpeas.components.almanach.control;

import java.awt.Color;
import java.io.FileOutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import com.lowagie.text.Chapter;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Section;
import com.lowagie.text.pdf.PdfWriter;
import org.silverpeas.components.almanach.service.AlmanachException;
import org.silverpeas.components.almanach.service.AlmanachRuntimeException;
import org.silverpeas.components.almanach.model.EventDetail;
import org.silverpeas.core.util.StringUtil;
import org.silverpeas.core.util.DateUtil;
import org.silverpeas.core.util.file.FileRepositoryManager;
import org.silverpeas.core.exception.SilverpeasException;

/**
 * @author squere
 * @version
 */
public class AlmanachPdfGenerator {

    public static final String PDF_MONTH_ALLDAYS = "PdfMonthAllDays";
    public static final String PDF_MONTH_EVENTSONLY = "PdfMonthEventsOnly";
    public static final String PDF_YEAR_EVENTSONLY = "PdfYearEventsOnly";

    static public void buildPdf(String name, AlmanachSessionController almanach, String mode)
            throws AlmanachRuntimeException {
        try {

            String fileName = FileRepositoryManager.getTemporaryPath(almanach.getSpaceId(),
                    almanach.getComponentId()) + name;
            Document document = new Document(PageSize.A4, 50, 50, 50, 50);

            // we add some meta information to the document
            document.addAuthor(almanach.getSettings().getString("author", ""));
            document.addSubject(almanach.getSettings().getString("subject", ""));
            document.addCreationDate();

            PdfWriter.getInstance(document, new FileOutputStream(fileName));
            document.open();

            try {
                Calendar currentDay = Calendar.getInstance();
                currentDay.setTime(almanach.getCurrentDay());
                String sHeader = almanach.getString("events");
                if (mode.equals(PDF_MONTH_ALLDAYS) || mode.equals(PDF_MONTH_EVENTSONLY)) {
                    sHeader += " " + almanach.getString("GML.mois" + currentDay.get(Calendar.MONTH));
                }
                sHeader += " " + currentDay.get(Calendar.YEAR);
                HeaderFooter header = new HeaderFooter(new Phrase(sHeader), false);
                HeaderFooter footer = new HeaderFooter(new Phrase("Page "), true);
                footer.setAlignment(Element.ALIGN_CENTER);

                document.setHeader(header);
                document.setFooter(footer);

                createFirstPage(almanach, document);
                document.newPage();

                Font titleFont = new Font(Font.HELVETICA, 24, Font.NORMAL, new Color(255, 255, 255));
                Paragraph cTitle = new Paragraph(almanach.getString("Almanach") + " "
                        + almanach.getString("GML.mois" + currentDay.get(Calendar.MONTH)) + " "
                        + currentDay.get(Calendar.YEAR), titleFont);
                Chapter chapter = new Chapter(cTitle, 1);

                // Collection<EventDetail> events =
                // almanach.getListRecurrentEvent(mode.equals(PDF_YEAR_EVENTSONLY));
                AlmanachCalendarView almanachView;
                if (PDF_YEAR_EVENTSONLY.equals(mode)) {
                    almanachView = almanach.getYearlyAlmanachCalendarView();
                } else {
                    almanachView = almanach.getMonthlyAlmanachCalendarView();
                }

                List<DisplayableEventOccurrence> occurrences = almanachView.getEvents();
                generateAlmanach(chapter, almanach, occurrences, mode);

                document.add(chapter);
            } catch (Exception ex) {
                throw new AlmanachRuntimeException("PdfGenerator.generate", AlmanachRuntimeException.WARNING,
                        "AlmanachRuntimeException.EX_PROBLEM_TO_GENERATE_PDF", ex);
            }

            document.close();

        } catch (Exception e) {
            throw new AlmanachRuntimeException("PdfGenerator.generate", AlmanachRuntimeException.WARNING,
                    "AlmanachRuntimeException.EX_PROBLEM_TO_GENERATE_PDF", e);
        }

    }

    private static void createFirstPage(AlmanachSessionController almanach, Document document)
            throws AlmanachException {
        try {
            Font masterFont = new Font(Font.HELVETICA, 40, Font.BOLD, new Color(0, 0, 0));
            Paragraph masterTitle = new Paragraph("\n\n\n\n" + almanach.getComponentLabel(), masterFont);

            masterTitle.setAlignment(Element.ALIGN_CENTER);

            Font secondFont = new Font(Font.HELVETICA, 14, Font.NORMAL, new Color(0, 0, 0));
            Paragraph secondTitle = new Paragraph(almanach.getString("editeLe") + " "
                    + DateUtil.getOutputDate(new Date(), almanach.getLanguage()) + almanach.getString("Silverpeas"),
                    secondFont);

            secondTitle.setAlignment(Element.ALIGN_CENTER);

            document.add(masterTitle);
            document.add(secondTitle);
        } catch (DocumentException e) {
            throw new AlmanachException("AlmanachPdfGenerator.createFirstPage()", SilverpeasException.ERROR,
                    "almanach.EX_CANT_CREATE_FIRST_PAGE", e);
        }
    }

    private static void generateAlmanach(Chapter chapter, AlmanachSessionController almanach,
            List<DisplayableEventOccurrence> occurrences, String mode) {

        boolean monthScope = AlmanachPdfGenerator.PDF_MONTH_EVENTSONLY.equals(mode)
                || AlmanachPdfGenerator.PDF_MONTH_ALLDAYS.equals(mode);
        boolean yearScope = AlmanachPdfGenerator.PDF_YEAR_EVENTSONLY.equals(mode);

        int currentDay = -1;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(almanach.getCurrentDay());
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        int currentMonth = calendar.get(Calendar.MONTH);
        int currentYear = calendar.get(Calendar.YEAR);

        if (yearScope) {
            // start from begin of current year
            calendar.set(Calendar.MONTH, 0);
        }

        // for each day of the current month
        while ((monthScope && currentMonth == calendar.get(Calendar.MONTH))
                || (yearScope && currentYear == calendar.get(Calendar.YEAR))) {
            Section section = null;
            if (AlmanachPdfGenerator.PDF_MONTH_ALLDAYS.equals(mode)) {
                section = chapter.addSection(generateParagraph(calendar, almanach), 0);
            }

            Font titleTextFont = new Font(Font.BOLD, 12, Font.SYMBOL, new Color(0, 0, 0));

            // get the events of the current day
            for (DisplayableEventOccurrence occurrence : occurrences) {
                EventDetail event = occurrence.getEventDetail();
                String theDay = DateUtil.date2SQLDate(calendar.getTime());
                String startDay = DateUtil.date2SQLDate(occurrence.getStartDate().asDate());
                String startHour = event.getStartHour();
                String endHour = event.getEndHour();

                if (startDay.compareTo(theDay) > 0) {
                    continue;
                }

                String endDay = startDay;
                if (event.getEndDate() != null) {
                    endDay = DateUtil.date2SQLDate(occurrence.getEndDate().asDate());
                }

                if (endDay.compareTo(theDay) < 0) {
                    continue;
                }

                if (calendar.get(Calendar.DAY_OF_MONTH) != currentDay) {
                    if (AlmanachPdfGenerator.PDF_MONTH_EVENTSONLY.equals(mode)
                            || AlmanachPdfGenerator.PDF_YEAR_EVENTSONLY.equals(mode)) {
                        section = chapter.addSection(generateParagraph(calendar, almanach), 0);
                    }
                    currentDay = calendar.get(Calendar.DAY_OF_MONTH);
                }

                Font textFont;
                if (event.getPriority() == 0) {
                    textFont = new Font(Font.HELVETICA, 10, Font.NORMAL, new Color(0, 0, 0));
                } else {
                    textFont = new Font(Font.HELVETICA, 10, Font.BOLD, new Color(0, 0, 0));
                }

                String eventTitle = event.getTitle();
                if (startDay.compareTo(theDay) == 0 && startHour != null && startHour.length() != 0) {
                    eventTitle += " (" + startHour;
                    if (endDay.compareTo(theDay) == 0 && endHour != null && endHour.length() != 0) {
                        eventTitle += "-" + endHour;
                    }
                    eventTitle += ")";
                }

                section.add(new Paragraph(eventTitle, titleTextFont));
                if (StringUtil.isDefined(event.getPlace())) {
                    section.add(new Paragraph(event.getPlace(), titleTextFont));
                }
                if (StringUtil.isDefined(event.getDescription(almanach.getLanguage()))) {
                    section.add(new Paragraph(event.getDescription(almanach.getLanguage()), textFont));
                }
                section.add(new Paragraph("\n"));

            } // end for
            calendar.add(Calendar.DAY_OF_MONTH, 1);
        }
    }

    private static Paragraph generateParagraph(Calendar calendar, AlmanachSessionController almanach) {
        Font dateFont = new Font(Font.HELVETICA, 14, Font.NORMAL, new Color(0, 0, 255));
        Paragraph dateSection = new Paragraph(almanach.getString("GML.jour" + calendar.get(Calendar.DAY_OF_WEEK))
                + " " + calendar.get(Calendar.DAY_OF_MONTH) + " "
                + almanach.getString("GML.mois" + calendar.get(Calendar.MONTH)) + " " + calendar.get(Calendar.YEAR),
                dateFont);
        return dateSection;
    }

}