de.jdufner.sudoku.generator.service.PdfGeneratorService.java Source code

Java tutorial

Introduction

Here is the source code for de.jdufner.sudoku.generator.service.PdfGeneratorService.java

Source

// $Id$

/*
 * Gudoku (http://sourceforge.net/projects/gudoku)
 * Sudoku-Implementierung auf Basis des Google Webtoolkit
 * (http://code.google.com/webtoolkit/). Die Lsungsalgorithmen in Java laufen
 * parallel. Die Sudoku-Rtsel werden mittels JDBC in einer Datenbank
 * gespeichert.
 *
 * Copyright (C) 2008 Jrgen Dufner
 *
 * Dieses Programm ist freie Software. Sie knnen es unter den Bedingungen der
 * GNU General Public License, wie von der Free Software Foundation
 * verffentlicht, weitergeben und/oder modifizieren, entweder gem Version 3
 * der Lizenz oder (nach Ihrer Option) jeder spteren Version.
 *
 * Die Verffentlichung dieses Programms erfolgt in der Hoffnung, da es Ihnen
 * von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die
 * implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FR EINEN
 * BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
 *
 * Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem
 * Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>.
 *
 */
package de.jdufner.sudoku.generator.service;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfName;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

import de.jdufner.sudoku.common.factory.SudokuFactory;
import de.jdufner.sudoku.dao.SudokuDao;
import de.jdufner.sudoku.dao.SudokuData;
import de.jdufner.sudoku.generator.pdf.PdfPrinter;
import de.jdufner.sudoku.generator.pdf.PdfSolution;
import de.jdufner.sudoku.generator.service.PdfGeneratorConfiguration.Page;
import de.jdufner.sudoku.generator.text.JavascriptGenerator;
import de.jdufner.sudoku.generator.text.RegExpReplacer;
import de.jdufner.sudoku.solver.service.ExtendedSolver;
import de.jdufner.sudoku.solver.service.Solution;

/**
 * 
 * @author <a href="mailto:jdufner@users.sf.net">J&uuml;rgen Dufner</a>
 * @since 2009-12-20
 * @version $Revision$
 */
public final class PdfGeneratorService {

    private SudokuDao sudokuDao;
    private PdfPrinter pdfPrinter;
    private ExtendedSolver solver;
    private String fileDirectory;
    private String filePattern;

    public void generate(PdfGeneratorConfiguration config) throws DocumentException, IOException {
        final String fileBaseName = new SimpleDateFormat(getFilePattern()).format(new Date());
        final String filePathName = getFileDirectory() + System.getProperty("file.separator");
        final String packageFileBaseName = fileBaseName + ".pdf";
        final String packageFileName = filePathName + packageFileBaseName;
        final String frontpageFileBaseName = fileBaseName + "_Frontpage.pdf";
        final String frontpageFileName = filePathName + frontpageFileBaseName;
        final String questsFileBaseName = fileBaseName + "_Quests.pdf";
        final String questsFileName = filePathName + questsFileBaseName;
        final String resultsFileBaseName = fileBaseName + "_Results.pdf";
        final String resultsFileName = filePathName + resultsFileBaseName;
        final String htmlFileBaseName = fileBaseName + ".html";
        final String htmlFileName = filePathName + htmlFileBaseName;
        final StringBuilder javascriptSudokus = new StringBuilder();
        final List<SudokuData> allSudokuQuests = new ArrayList<SudokuData>();
        for (Page page : config.getPages()) {
            List<SudokuData> sudokus = getSudokuDao().findSudokus(config.getSize(), page.getLevel(),
                    page.getNumber(), Boolean.FALSE);
            allSudokuQuests.addAll(sudokus);
        }
        getPdfPrinter().printQuests(allSudokuQuests, questsFileName);

        final List<PdfSolution> allSolutions = new ArrayList<PdfSolution>(allSudokuQuests.size());
        final List<SudokuData> allSudokuResults = new ArrayList<SudokuData>(allSudokuQuests.size());
        int index = 0;
        for (SudokuData sudokuData : allSudokuQuests) {
            SudokuData sudokuData2 = new SudokuData();
            Solution solution = solver
                    .getSolution(SudokuFactory.INSTANCE.buildSudoku(sudokuData.getSudokuAsString()));
            allSolutions.add(new PdfSolution(sudokuData, solution));
            sudokuData2.setId(sudokuData.getId());
            sudokuData2.setLevel(sudokuData.getLevel());
            sudokuData2.setSize(sudokuData.getSize());
            sudokuData2.setSudokuAsString(solution.getResult().toString());
            if (index != 0) {
                javascriptSudokus.append(",");
            }
            javascriptSudokus.append(JavascriptGenerator.toJavascript(sudokuData.getId(), solution));
            allSudokuResults.add(sudokuData2);
            index++;
        }
        getPdfPrinter().printFrontpage(fileBaseName, allSolutions, frontpageFileName);
        getPdfPrinter().printResults(allSudokuResults, resultsFileName);

        Date now = new Date();
        for (SudokuData sudoku : allSudokuQuests) {
            getSudokuDao().updatePrintedAt(sudoku.getId(), now);
        }
        RegExpReplacer.replace(htmlFileName, fileBaseName, javascriptSudokus.toString());

        packPdf(filePathName, packageFileBaseName, frontpageFileBaseName, questsFileBaseName, resultsFileBaseName,
                htmlFileBaseName);
    }

    public void packPdf(String filePathName, String packageFileBaseName, String frontpageFileBaseName,
            String questsFileBaseName, String resultsFileBaseName, String htmlFileName)
            throws FileNotFoundException, DocumentException, IOException {
        PdfStamper pdfStamper = new PdfStamper(new PdfReader(filePathName + frontpageFileBaseName),
                new FileOutputStream(filePathName + packageFileBaseName));
        pdfStamper.addFileAttachment("Quests", null, filePathName + questsFileBaseName, questsFileBaseName);
        pdfStamper.addFileAttachment("Results", null, filePathName + resultsFileBaseName, resultsFileBaseName);
        pdfStamper.addFileAttachment("HTML", null, filePathName + htmlFileName, htmlFileName);
        pdfStamper.makePackage(PdfName.T);
        pdfStamper.close();
    }

    //
    // Spring-Wiring
    //

    public SudokuDao getSudokuDao() {
        return sudokuDao;
    }

    public void setSudokuDao(SudokuDao sudokuDao) {
        this.sudokuDao = sudokuDao;
    }

    public PdfPrinter getPdfPrinter() {
        return pdfPrinter;
    }

    public void setPdfPrinter(PdfPrinter pdfPrinter) {
        this.pdfPrinter = pdfPrinter;
    }

    public ExtendedSolver getSolver() {
        return solver;
    }

    public void setSolver(ExtendedSolver solver) {
        this.solver = solver;
    }

    public String getFileDirectory() {
        return fileDirectory;
    }

    public void setFileDirectory(String fileDirectory) {
        this.fileDirectory = fileDirectory;
    }

    public String getFilePattern() {
        return filePattern;
    }

    public void setFilePattern(String filePattern) {
        this.filePattern = filePattern;
    }

}