fr.amapj.view.views.importdonnees.tools.AbstractImporter.java Source code

Java tutorial

Introduction

Here is the source code for fr.amapj.view.views.importdonnees.tools.AbstractImporter.java

Source

/*
 *  Copyright 2013-2018 Emmanuel BRUN (contact@amapj.fr)
 * 
 *  This file is part of AmapJ.
 *  
 *  AmapJ 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.
    
 *  AmapJ 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 AmapJ.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * 
 */
package fr.amapj.view.views.importdonnees.tools;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;

import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Upload.Receiver;
import com.vaadin.ui.Upload.SucceededEvent;
import com.vaadin.ui.Upload.SucceededListener;

import fr.amapj.common.LongUtils;
import fr.amapj.model.engine.tools.TestTools;
import fr.amapj.view.engine.popup.corepopup.CorePopup.ColorStyle;
import fr.amapj.view.engine.popup.formpopup.OnSaveException;
import fr.amapj.view.engine.popup.messagepopup.MessagePopup;
import fr.amapj.view.engine.tools.TableItem;

@SuppressWarnings("serial")
abstract public class AbstractImporter<T extends TableItem> implements Receiver, SucceededListener {

    private List<String> errorMessage = new ArrayList<>();

    private ByteArrayOutputStream baos;

    abstract public void saveInDataBase(List<T> utilisateurs);

    abstract public T createDto(String[] strs);

    abstract public int getNumCol();

    abstract public List<T> getAllDataInDatabase();

    abstract public String checkBasic(T dto);

    abstract public String checkDifferent(T dto1, T dto2);

    abstract public void dumpInfo(List<String> errorMessage, T dto);

    @Override
    public OutputStream receiveUpload(String filename, String mimeType) {
        baos = new ByteArrayOutputStream();
        return baos;
    }

    @Override
    public void uploadSucceeded(SucceededEvent event) {
        // On efface tout d'abord la liste des erreurs
        errorMessage.clear();

        try {
            processFile();
            if (errorMessage.size() == 0) {
                MessagePopup popup = new MessagePopup("Chargement effectu", ColorStyle.GREEN,
                        "Le chargement a t effectu");
                MessagePopup.open(popup);
            } else {
                MessagePopup popup = new MessagePopup("Erreur lors du chargement", errorMessage);
                MessagePopup.open(popup);
            }
        } catch (IOException e) {
            MessagePopup popup = new MessagePopup("Erreur lors du chargement", ColorStyle.RED, e.getMessage());
            MessagePopup.open(popup);
        }
    }

    private void processFile() throws IOException {

        // Get the workbook instance for XLS file
        HSSFWorkbook workbook = new HSSFWorkbook(new ByteArrayInputStream(baos.toByteArray()));
        DataFormatter df = new DataFormatter(Locale.FRANCE);

        // Get first sheet from the workbook
        HSSFSheet sheet = workbook.getSheetAt(0);

        int numCol = getNumCol();

        List<T> existing = getAllDataInDatabase();

        List<T> utilisateurs = new ArrayList<>();

        int lastRowNum = sheet.getLastRowNum();

        for (int numLigne = 2; numLigne <= lastRowNum + 1; numLigne++) {
            Row row = sheet.getRow(numLigne - 1);

            String[] strs = new String[numCol];
            boolean isEmptyLine = true;
            for (int i = 0; i < strs.length; i++) {
                strs[i] = getCell(row, i, df);
                if ((strs[i] != null) && (strs[i].length() > 0)) {
                    isEmptyLine = false;
                }
            }

            if (isEmptyLine == false) {

                // On cre le DTO
                T dto = createDto(strs);

                // On vrifie tout d'abord si les elements de base sont bien prsents
                performBasicCheck(dto, numLigne);
                if (errorMessage.size() != 0) {
                    return;
                }

                // On verifie ensuite si l'lment est bien compatible avec les autres lignes du fichier 
                checkLineInSameFile(utilisateurs, dto, numLigne);
                if (errorMessage.size() != 0) {
                    return;
                }

                // On verifie ensuite si l'lment est bien compatible avec les autres enregistrement de la base         
                checkLineInDataBase(existing, dto, numLigne);
                if (errorMessage.size() != 0) {
                    return;
                }

                utilisateurs.add(dto);
            }

        }

        saveInDataBase(utilisateurs);
    }

    private void performBasicCheck(T dto, int numLigne) {
        String msg = checkBasic(dto);
        if (msg != null) {
            errorMessage.add("Il y a une erreur sur la ligne " + numLigne + " du fichier  importer");
            errorMessage.add("Sur cette ligne :");
            errorMessage.add(msg);
            errorMessage.add("Voici d'autres informations sur la ligne " + numLigne + ":");
            dumpInfo(errorMessage, dto);
            errorMessage.add("");
            return;
        }
    }

    private void checkLineInSameFile(List<T> utilisateurs, T dto, int numLigne) {
        int numMax = utilisateurs.size();
        for (int i = 0; i < numMax; i++) {
            T utilisateurDTO = utilisateurs.get(i);
            String msg = checkDifferent(utilisateurDTO, dto);

            if (msg != null) {
                errorMessage.add("Il y a une incohrence entre la ligne " + (i + 2) + " et la ligne " + numLigne
                        + " du fichier  importer");
                errorMessage.add("Sur ces deux lignes :");
                errorMessage.add(msg);
                errorMessage.add("Voici d'autres informations sur la ligne " + (i + 2) + ":");
                dumpInfo(errorMessage, utilisateurDTO);
                errorMessage.add("");
                errorMessage.add("Voici d'autres informations sur la ligne " + numLigne + ":");
                dumpInfo(errorMessage, dto);
                errorMessage.add("");
                return;
            }
        }
    }

    private void checkLineInDataBase(List<T> existing, T dto, int numLigne) {
        for (T utilisateurDTO : existing) {
            String msg = checkDifferent(utilisateurDTO, dto);

            if (msg != null) {
                errorMessage.add("Il y a une erreur sur la ligne " + numLigne + " du fichier  importer");
                errorMessage.add("Sur cette ligne :");
                errorMessage.add(msg);
                errorMessage
                        .add("Il existe dj dans la base de donnes un enregistrement avec ces informations :");
                dumpInfo(errorMessage, utilisateurDTO);
                errorMessage.add("");
                errorMessage.add("Voici d'autres informations sur la ligne " + numLigne + ":");
                dumpInfo(errorMessage, dto);
                errorMessage.add("");
                return;
            }
        }

    }

    // On vrifie que la chaine est vide
    protected boolean isEmpty(String str) {
        if ((str == null) || (str.length() == 0)) {
            return true;
        }
        return false;

    }

    // On vrifie que la chaine est bien dans les longueurs indiqus
    // Retourne null si tout est ok
    protected String checkLength(String val, int minLength, int maxLength, String nomChamp) {
        if (val == null) {
            val = "";
        }

        int len = val.length();
        if (len < minLength) {
            return "Le champ \"" + nomChamp + "\" est trop court. Il doit contenir au moins " + minLength
                    + " caractres";
        }

        if (len > maxLength) {
            return "Le champ \"" + nomChamp + "\"  est trop long. Il doit contenir au maximum " + maxLength
                    + " caractres";
        }

        return null;
    }

    private String getCell(Row row, int i, DataFormatter df) {
        if (row == null) {
            return null;
        }
        Cell cell = row.getCell(i);
        if (cell == null) {
            return null;
        }

        return df.formatCellValue(cell);
    }

    /**
     * Permet de verifier un lement,  utiliser dans les fichiers de base
     * 
     * Retourne null si tout est ok, sinon retourne une liste de messages d'erreur
     */
    public List<String> checkThisElement(T dto) {
        String str = checkBasic(dto);
        if (str != null) {
            errorMessage.add(str);
            return errorMessage;
        }

        List<T> existing = getAllDataInDatabase();
        for (T t : existing) {
            // On vrifie que ce n'est pas l'lement dj dans la base que l'on est en train de modifier
            if (isSameId(t, dto) == false) {

                str = checkDifferent(t, dto);

                if (str != null) {
                    errorMessage.add(
                            "Il existe un enregistrement dans la base de donnes qui entre en conflit avec votre saisie");
                    errorMessage.add("Raison :");
                    errorMessage.add(str);
                    errorMessage.add(
                            "Il existe dj dans la base de donnes un enregistrement avec ces informations :");
                    dumpInfo(errorMessage, t);
                    errorMessage.add("");
                    return errorMessage;
                }
            }
        }
        return null;
    }

    private boolean isSameId(T t1, T t2) {
        TableItem ti1 = (TableItem) t1;
        TableItem ti2 = (TableItem) t2;

        return LongUtils.equals(ti1.getId(), ti2.getId());
    }

    public void checkThisElementAsException(T dto) throws OnSaveException {
        List<String> strs = checkThisElement(dto);
        if (strs != null) {
            throw new OnSaveException(strs);
        }
    }

    public void test(String filename) throws IOException {
        TestTools.init();

        baos = new ByteArrayOutputStream();
        baos.write(Files.readAllBytes(FileSystems.getDefault().getPath(filename)));

        processFile();
        if (errorMessage.size() == 0) {
            System.out.println("Fichier import avec succs");
        } else {
            System.out.println("Erreur lors du chargement");
            for (String string : errorMessage) {
                System.out.println(string);
            }
        }
    }

}