hornet.framework.web.service.export.AbstractTableExportService.java Source code

Java tutorial

Introduction

Here is the source code for hornet.framework.web.service.export.AbstractTableExportService.java

Source

/**
 * Copyright ou  ou Copr. Ministre de l'Europe et des Affaires trangres (2017)
 * <p/>
 * pole-architecture.dga-dsi-psi@diplomatie.gouv.fr
 * <p/>
 * Ce logiciel est un programme informatique servant  faciliter la cration
 * d'applications Web conformment aux rfrentiels gnraux franais : RGI, RGS et RGAA
 * <p/>
 * Ce logiciel est rgi par la licence CeCILL soumise au droit franais et
 * respectant les principes de diffusion des logiciels libres. Vous pouvez
 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
 * de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA
 * sur le site "http://www.cecill.info".
 * <p/>
 * En contrepartie de l'accessibilit au code source et des droits de copie,
 * de modification et de redistribution accords par cette licence, il n'est
 * offert aux utilisateurs qu'une garantie limite.  Pour les mmes raisons,
 * seule une responsabilit restreinte pse sur l'auteur du programme,  le
 * titulaire des droits patrimoniaux et les concdants successifs.
 * <p/>
 * A cet gard  l'attention de l'utilisateur est attire sur les risques
 * associs au chargement,   l'utilisation,   la modification et/ou au
 * dveloppement et  la reproduction du logiciel par l'utilisateur tant
 * donn sa spcificit de logiciel libre, qui peut le rendre complexe 
 * manipuler et qui le rserve donc  des dveloppeurs et des professionnels
 * avertis possdant  des  connaissances  informatiques approfondies.  Les
 * utilisateurs sont donc invits  charger  et  tester  l'adquation  du
 * logiciel  leurs besoins dans des conditions permettant d'assurer la
 * scurit de leurs systmes et ou de leurs donnes et, plus gnralement,
 *  l'utiliser et l'exploiter dans les mmes conditions de scurit.
 * <p/>
 * Le fait que vous puissiez accder  cet en-tte signifie que vous avez
 * pris connaissance de la licence CeCILL, et que vous en avez accept les
 * termes.
 * <p/>
 * <p/>
 * Copyright or  or Copr. Ministry for Europe and Foreign Affairs (2017)
 * <p/>
 * pole-architecture.dga-dsi-psi@diplomatie.gouv.fr
 * <p/>
 * This software is a computer program whose purpose is to facilitate creation of
 * web application in accordance with french general repositories : RGI, RGS and RGAA.
 * <p/>
 * This software is governed by the CeCILL license under French law and
 * abiding by the rules of distribution of free software.  You can  use,
 * modify and/ or redistribute the software under the terms of the CeCILL
 * license as circulated by CEA, CNRS and INRIA at the following URL
 * "http://www.cecill.info".
 * <p/>
 * As a counterpart to the access to the source code and  rights to copy,
 * modify and redistribute granted by the license, users are provided only
 * with a limited warranty  and the software's author,  the holder of the
 * economic rights,  and the successive licensors  have only  limited
 * liability.
 * <p/>
 * In this respect, the user's attention is drawn to the risks associated
 * with loading,  using,  modifying and/or developing or reproducing the
 * software by the user in light of its specific status of free software,
 * that may mean  that it is complicated to manipulate,  and  that  also
 * therefore means  that it is reserved for developers  and  experienced
 * professionals having in-depth computer knowledge. Users are therefore
 * encouraged to load and test the software's suitability as regards their
 * requirements in conditions enabling the security of their systems and/or
 * data to be ensured and,  more generally, to use and operate it in the
 * same conditions as regards security.
 * <p/>
 * The fact that you are presently reading this means that you have had
 * knowledge of the CeCILL license and that you accept its terms.
 *
 */
package hornet.framework.web.service.export;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import hornet.framework.export.ExportCsvModelService;
import hornet.framework.export.ExportXlsModelService;
import hornet.framework.export.vo.presentation.ColVO;
import hornet.framework.export.vo.presentation.RowVO;
import hornet.framework.export.vo.presentation.TableVO;
import hornet.framework.export.vo.utils.TableVOUtils;

/**
 * @author MEAE - Ministre de l'Europe et des Affaires trangres
 */
public abstract class AbstractTableExportService<T> implements ExportCsvModelService<T>, ExportXlsModelService<T> {

    private static final Logger LOG = LoggerFactory.getLogger(AbstractTableExportService.class);

    @Override
    public boolean supports(final Class<?> clazz) {

        return getSupportedClass().isAssignableFrom(clazz);
    }

    /**
     * Permet  l'implmentation de dfinir quel est le contenu de son tableau
     *
     * @return
     */
    public abstract Class<T> getSupportedClass();

    /**
     * Mthode  implmenter par l'application en fonction du type de Table. <br>
     * Utilis par l'export CSV et l'export Excel
     *
     * @param toExport
     * @return
     */
    abstract protected TableVO construireTableauExport(final T toExport);

    @Override
    public TableVO constuireCSVModel(final T toExport) {

        return construireTableauExport(toExport);
    }

    @Override
    public HSSFWorkbook construireXlsModel(final T toExport) {

        // Blank workbook
        final HSSFWorkbook workbook = new HSSFWorkbook();

        // Create a blank sheet
        final HSSFSheet sheet = workbook.createSheet();
        int rownum = 0;

        // Style pour la bordure des cellules
        final CellStyle styleBordure = workbook.createCellStyle();
        styleBordure.setBorderBottom(BorderStyle.THIN);
        styleBordure.setBorderTop(BorderStyle.THIN);
        styleBordure.setBorderRight(BorderStyle.THIN);
        styleBordure.setBorderLeft(BorderStyle.THIN);

        final CellStyle styleEntete = workbook.createCellStyle();
        styleEntete.cloneStyleFrom(styleBordure);
        styleEntete.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
        styleEntete.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // Rcupration du Table VO
        final TableVO tableVo = construireTableauExport(toExport);

        final Collection<String> colTitles = tableVo.getColumnsTitles();
        final Iterator<String> itTitles = colTitles.iterator();

        // Titre des colonnes
        int cellnum = 0;
        final Row xlsRow = sheet.createRow(rownum++);
        while (itTitles.hasNext()) {
            final String title = itTitles.next();
            final Cell cell = xlsRow.createCell(cellnum++);
            cell.setCellValue(title);
            cell.setCellStyle(styleEntete);
        }

        if (tableVo.getRows() != null) {
            final List<RowVO> rows = tableVo.getRows();
            final Iterator<RowVO> itRows = rows.iterator();
            // Lignes
            while (itRows.hasNext()) {
                this.exporteLigne(itRows, rownum, sheet, styleBordure);
                rownum++;
            }

            for (int i = 0; i < cellnum; i++) {
                sheet.autoSizeColumn(i);
            }
        }

        return workbook;
    }

    /**
     * Exporte une ligne de tableau.
     *
     * @param itRows
     *            the it rows
     * @param rownum
     *            the rownum
     * @param sheet
     *            the sheet
     * @param styleBordure
     *            the style bordure
     */
    private void exporteLigne(final Iterator<RowVO> itRows, final int rownum, final HSSFSheet sheet,
            final CellStyle styleBordure) {

        final RowVO row = itRows.next();
        final Iterator<ColVO> itCols;
        final Row xlsRow = sheet.createRow(rownum);
        if (row.getCols() != null) {
            itCols = row.getCols().iterator();
            // Cellules
            int cellnum = 0;
            while (itCols.hasNext()) {
                final ColVO col = itCols.next();
                final Cell cell = xlsRow.createCell(cellnum++);
                if (col.getValue() != null) {
                    cell.setCellValue(TableVOUtils.formaterCellule(col));
                    cell.setCellStyle(styleBordure);
                }
            }
        }
    }

}