Search in sources :

Example 1 with Fichier

use of fr.univlorraine.ecandidat.entities.ecandidat.Fichier in project esup-ecandidat by EsupPortail.

the class CandidaturePieceController method removeFileToPj.

/* @Transactional(rollbackFor=FileException.class) public void
	 * removeFileToPj(PjCand pjCand) throws FileException{ Fichier fichier =
	 * pjCand.getFichier(); pjCandRepository.delete(pjCand); if (fichier != null){
	 * fileController.deleteFichier(fichier,false); } } */
/**
 * Supprime un fichier d'une PJCand
 * @param pjCand
 */
public void removeFileToPj(final PjCand pjCand) {
    final Fichier fichier = pjCand.getFichier();
    final PjCandPK idPjCand = pjCand.getId();
    pjCandRepository.delete(pjCand);
    if (fichier != null) {
        FichierFiabilisation fichierFiabilisation = new FichierFiabilisation(fichier);
        fichierFiabilisation.setIdPj(idPjCand.getIdPj());
        fichierFiabilisation.setIdCand(idPjCand.getIdCand());
        fichierFiabilisation = fichierFiabilisationRepository.save(fichierFiabilisation);
        try {
            fileController.deleteFichier(fichier);
            fichierFiabilisationRepository.delete(fichierFiabilisation);
        } catch (final FileException e) {
        }
    }
}
Also used : FichierFiabilisation(fr.univlorraine.ecandidat.entities.ecandidat.FichierFiabilisation) FileException(fr.univlorraine.ecandidat.services.file.FileException) PjCandPK(fr.univlorraine.ecandidat.entities.ecandidat.PjCandPK) Fichier(fr.univlorraine.ecandidat.entities.ecandidat.Fichier)

Example 2 with Fichier

use of fr.univlorraine.ecandidat.entities.ecandidat.Fichier in project esup-ecandidat by EsupPortail.

the class CandidaturePieceController method addFileToPieceJustificative.

/**
 * Ajoute un fichier a une pj
 * @param pieceJustif
 * @param candidature
 * @param listener
 */
public void addFileToPieceJustificative(final PjPresentation pieceJustif, final Candidature candidature, final CandidatureListener listener) {
    /* Verification que le service n'est pas en maintenance */
    if (fileController.isFileServiceMaintenance(true)) {
        return;
    }
    Assert.notNull(candidature, applicationContext.getMessage("assert.notNull", null, UI.getCurrent().getLocale()));
    /* Verrou */
    if (!lockCandidatController.getLockOrNotifyCandidature(candidature)) {
        return;
    }
    final String user = userController.getCurrentNoDossierCptMinOrLogin();
    final String cod = ConstanteUtils.TYPE_FICHIER_PJ_CAND + "_" + candidature.getCandidat().getCompteMinima().getNumDossierOpiCptMin() + "_" + candidature.getIdCand() + "_" + pieceJustif.getPieceJustif().getIdPj();
    final UploadWindow uw = new UploadWindow(cod, ConstanteUtils.TYPE_FICHIER_CANDIDAT, candidature, pieceJustif.getPJCommune(), false);
    uw.addUploadWindowListener(file -> {
        if (file == null) {
            return;
        }
        /* Verrou */
        if (!lockCandidatController.getLockOrNotifyCandidature(candidature)) {
            return;
        }
        final PjCandPK pk = new PjCandPK(pieceJustif.getPieceJustif().getIdPj(), pieceJustif.getIdCandidature());
        PjCand pjCand = pjCandRepository.findOne(pk);
        if (pjCand == null) {
            pjCand = new PjCand(pk, user, candidature, pieceJustif.getPieceJustif());
        }
        final Fichier fichier = fileController.createFile(file, user, ConstanteUtils.TYPE_FICHIER_CANDIDAT);
        if (isPjModified(pieceJustif, candidature, true, listener)) {
            FichierFiabilisation fichierFiabilisation = new FichierFiabilisation(fichier);
            fichierFiabilisation = fichierFiabilisationRepository.save(fichierFiabilisation);
            try {
                fileController.deleteFichier(fichier);
                fichierFiabilisationRepository.delete(fichierFiabilisation);
            } catch (final FileException e) {
            }
            uw.close();
            return;
        }
        pjCand.setLibFilePjCand(fichier.getNomFichier());
        pjCand.setUserModPjCand(user);
        pjCand.setFichier(fichier);
        final TypeStatutPiece statutTr = tableRefController.getTypeStatutPieceTransmis();
        pjCand.setTypeStatutPiece(statutTr);
        pjCandRepository.save(pjCand);
        // obligé de recharger l'objet car le datetime est arrondi :(
        final PjCand pjCandSave = pjCandRepository.findOne(pk);
        pieceJustif.setFilePj(fichier);
        pieceJustif.setCodStatut(statutTr.getCodTypStatutPiece());
        pieceJustif.setLibStatut(i18nController.getI18nTraduction(statutTr.getI18nLibTypStatutPiece()));
        pieceJustif.setDatModification(pjCandSave.getDatModPjCand());
        candidature.setUserModCand(user);
        candidature.updatePjCand(pjCandSave);
        candidature.setDatModCand(LocalDateTime.now());
        final Candidature candidatureSave = candidatureRepository.save(candidature);
        listener.pjModified(pieceJustif, candidatureSave);
        Notification.show(applicationContext.getMessage("window.upload.success", new Object[] { file.getFileName() }, UI.getCurrent().getLocale()), Type.TRAY_NOTIFICATION);
        uw.close();
    });
    UI.getCurrent().addWindow(uw);
}
Also used : FichierFiabilisation(fr.univlorraine.ecandidat.entities.ecandidat.FichierFiabilisation) UploadWindow(fr.univlorraine.ecandidat.views.windows.UploadWindow) TypeStatutPiece(fr.univlorraine.ecandidat.entities.ecandidat.TypeStatutPiece) FileException(fr.univlorraine.ecandidat.services.file.FileException) PjCand(fr.univlorraine.ecandidat.entities.ecandidat.PjCand) PjCandPK(fr.univlorraine.ecandidat.entities.ecandidat.PjCandPK) Candidature(fr.univlorraine.ecandidat.entities.ecandidat.Candidature) FormulaireCandidature(fr.univlorraine.ecandidat.entities.ecandidat.FormulaireCandidature) Fichier(fr.univlorraine.ecandidat.entities.ecandidat.Fichier)

Example 3 with Fichier

use of fr.univlorraine.ecandidat.entities.ecandidat.Fichier in project esup-ecandidat by EsupPortail.

the class CandidaturePieceController method removeFileToPjManually.

/**
 * Utilisé dans le bacth de destruction Les fichiers physiques doivent être
 * supprimés à la main
 * @param  pjCand
 * @throws FileException
 */
public void removeFileToPjManually(final PjCand pjCand) throws FileException {
    final Fichier fichier = pjCand.getFichier();
    pjCandRepository.delete(pjCand);
    if (fichier != null) {
        fichierRepository.delete(fichier);
    }
}
Also used : Fichier(fr.univlorraine.ecandidat.entities.ecandidat.Fichier)

Example 4 with Fichier

use of fr.univlorraine.ecandidat.entities.ecandidat.Fichier in project esup-ecandidat by EsupPortail.

the class CandidatureController method downloadDossier.

/**
 * telecharge le dossier
 * @param  candidature
 * @param  listePresentation
 * @param  listeDatePresentation
 * @param  listePj
 * @param  listeForm
 * @param  addPj
 * @return                       l'InputStream du dossier
 */
public OnDemandFile downloadDossier(final Candidature candidature, final List<SimpleTablePresentation> listePresentation, final List<SimpleTablePresentation> listeDatePresentation, final List<PjPresentation> listePj, final List<FormulairePresentation> listeForm, final Boolean addPj) {
    /* Variables utiles */
    final String numDossier = candidature.getCandidat().getCompteMinima().getNumDossierOpiCptMin();
    final String nom = candidature.getCandidat().getNomPatCandidat();
    final String prenom = candidature.getCandidat().getPrenomCandidat();
    final String codForm = candidature.getFormation().getCodForm();
    final String libForm = candidature.getFormation().getLibForm();
    /* Nom du fichier */
    final String fileName = applicationContext.getMessage("candidature.download.file", new Object[] { numDossier, nom, prenom, codForm }, UI.getCurrent().getLocale());
    // Les parametres des PJ
    final Boolean enableAddApogeePJDossier = parametreController.getIsAddApogeePJDossier();
    // Font
    final PDFont font = PDType1Font.HELVETICA_BOLD;
    // le dossier outStream
    ByteArrayInputStream bisDossier = null;
    // liste des InputStream à fermer
    final List<InputStream> listeInputStreamToClose = new ArrayList<>();
    /* Génération du dossier principal */
    try {
        bisDossier = generateDossier(candidature, listePresentation, listeDatePresentation, listePj, listeForm);
        if (bisDossier == null) {
            Notification.show(applicationContext.getMessage("candidature.download.error", null, UI.getCurrent().getLocale()), Type.WARNING_MESSAGE);
            return null;
        }
    } catch (IOException | XDocReportException e2) {
        Notification.show(applicationContext.getMessage("candidature.download.error", null, UI.getCurrent().getLocale()), Type.WARNING_MESSAGE);
        logger.error("erreur a la génération du dossier", e2);
        return null;
    }
    ByteArrayInOutStream out = new ByteArrayInOutStream();
    InputStream is = null;
    try {
        /* Merger */
        final PDFMergerUtility ut = new PDFMergerUtility();
        /* Propriétés du document */
        final PDDocumentInformation info = new PDDocumentInformation();
        info.setTitle(numDossier + "_" + nom + "_" + prenom + "_" + codForm);
        info.setAuthor(ConstanteUtils.APP_NAME);
        info.setSubject(nom + " " + prenom + " (" + numDossier + ") / " + libForm + " (" + codForm + ")");
        final Calendar calendar = Calendar.getInstance(UI.getCurrent().getLocale());
        info.setCreationDate(calendar);
        info.setModificationDate(calendar);
        ut.setDestinationDocumentInformation(info);
        /* Ajout du dossier */
        ut.addSource(bisDossier);
        /* Gestion des erreurs de pj */
        Boolean errorAddPj = false;
        final List<String> fileNameError = new ArrayList<>();
        /* Calcul si besoin d'ajouter les pj */
        Integer nbFilePJ = 0;
        for (final PjPresentation pj : listePj) {
            if (pj.getFilePj() != null) {
                nbFilePJ++;
            }
        }
        if (addPj && nbFilePJ > 0 && !fileController.isFileServiceMaintenance(applicationContext.getMessage("file.service.maintenance.dossier", null, UI.getCurrent().getLocale()))) {
            for (final PjPresentation e : listePj) {
                // listePj.forEach(e->{
                try {
                    // titre header
                    final String textHeader = e.getLibPj();
                    // PJ doit etre à true
                    if (e.getFilePj() != null && (e.getPjCandidatFromApogee() == null || (e.getPjCandidatFromApogee() != null && enableAddApogeePJDossier))) {
                        final Fichier file = e.getFilePj();
                        final String nameFile = file.getNomFichier();
                        final InputStream inputStreamFile = fileController.getInputStreamFromPjPresentation(e);
                        // on doit fermer l'inputStream apres le merge donc je stock le stream et le ferme apres
                        listeInputStreamToClose.add(inputStreamFile);
                        // cas du PDF
                        if (inputStreamFile != null && MethodUtils.isPdfFileName(nameFile)) {
                            // chargement du pdf avant de l'ajouter -> evite de compiler avec des fichiers corrompus
                            final BufferedInputStream bufferedInputStreamFile = new BufferedInputStream(inputStreamFile);
                            // on doit fermer l'inputStream apres le merge donc je stock le stream et le ferme apres
                            listeInputStreamToClose.add(bufferedInputStreamFile);
                            try {
                                // on place un marker au max du buffer du stream (mark = nb byte qu'il peut lire avant d'etre invalide.. mais comme on lit tout le fichier..)
                                bufferedInputStreamFile.mark(ConstanteUtils.MAX_BUFFER_SIZE);
                                // lecture du fichier pour vérifier s'il n'est pas corrompue
                                final PDDocument doc = PDDocument.load(bufferedInputStreamFile);
                                // cloture immédiate du fichier pour libérer la mémoire
                                MethodUtils.closeRessource(doc);
                                // on replace le bufferedInputStreamFile au début
                                bufferedInputStreamFile.reset();
                                // on ajoute l'inputStream
                                ut.addSource(bufferedInputStreamFile);
                            } catch (final Exception ex1) {
                                logger.warn("fichier pdf '" + nameFile + "' en erreur et non ajouté au dossier '" + fileName + "'", ex1);
                                errorAddPj = true;
                                fileNameError.add(nameFile);
                            }
                        } else if (inputStreamFile != null && MethodUtils.isImgFileName(nameFile)) {
                            // creation document
                            final PDDocument document = new PDDocument();
                            final ByteArrayInOutStream baosImg = new ByteArrayInOutStream();
                            ByteArrayInputStream bis = null;
                            try {
                                // chargement page A4
                                final PDRectangle PAGE_SIZE_A4 = PDRectangle.A4;
                                // creation page
                                final PDPage page = new PDPage(PAGE_SIZE_A4);
                                // ajout de la page
                                document.addPage(page);
                                // Stream du document
                                final PDPageContentStream contentStream = new PDPageContentStream(document, page);
                                // margin top est calculée si un text de titre a été ajouté
                                Float marginTop = addHeaderPJ(textHeader, font, PAGE_SIZE_A4, contentStream);
                                // on ajoute la marge sous le text (ou la marge depuis le haut du doc si pas de
                                // text)
                                marginTop = marginTop + ConstanteUtils.DOSSIER_MARGIN;
                                // creation de l'image
                                PDImageXObject img = null;
                                // JPG
                                if (MethodUtils.isJpgFileName(nameFile)) {
                                    img = JPEGFactory.createFromStream(document, inputStreamFile);
                                } else // PNG
                                if (MethodUtils.isPngFileName(nameFile)) {
                                    img = LosslessFactory.createFromImage(document, ImageIO.read(inputStreamFile));
                                }
                                // calcul de la largeur et hauteur de l'image
                                Float imgWidth = (float) img.getWidth();
                                Float imgHeight = (float) img.getHeight();
                                // calcul de la largeur et hauteur de la page moins les deux marges
                                final Float a4Width = PAGE_SIZE_A4.getWidth() - 2 * ConstanteUtils.DOSSIER_MARGIN;
                                final Float a4Height = PAGE_SIZE_A4.getHeight() - ConstanteUtils.DOSSIER_MARGIN - marginTop;
                                // calcul du coef à appliquer si l'image est trop grande
                                Float coef = 1.0f;
                                if (imgWidth > a4Width) {
                                    coef = a4Width / imgWidth;
                                    imgWidth = imgWidth * coef;
                                    imgHeight = imgHeight * coef;
                                }
                                // le nouveau coef
                                if (imgHeight > a4Height) {
                                    coef = a4Height / imgHeight;
                                    imgWidth = imgWidth * coef;
                                    imgHeight = imgHeight * coef;
                                }
                                // ecriture de l'image
                                contentStream.drawImage(img, ConstanteUtils.DOSSIER_MARGIN, PAGE_SIZE_A4.getHeight() - imgHeight - marginTop, imgWidth, imgHeight);
                                // il faut d'abord fermer le flux
                                MethodUtils.closeRessource(contentStream);
                                document.save(baosImg);
                                /* Creation du flux */
                                bis = baosImg.getInputStream();
                                /* Ajout de la page au document */
                                ut.addSource(bis);
                            } catch (final Exception e1) {
                                errorAddPj = true;
                                fileNameError.add(nameFile);
                                logger.warn("fichier image '" + nameFile + "' en erreur et non ajouté au dossier '" + fileName + "'", e1);
                            } finally {
                                /* Nettoyage des ressources */
                                MethodUtils.closeRessource(document);
                                MethodUtils.closeRessource(bis);
                                MethodUtils.closeRessource(baosImg);
                            }
                        }
                    }
                } catch (final Exception e1) {
                    errorAddPj = true;
                    final String nameFile = e.getFilePj() != null ? e.getFilePj().getNomFichier() : "-";
                    if (e.getFilePj() != null) {
                        fileNameError.add(e.getFilePj().getNomFichier());
                    }
                    logger.warn("fichier '" + nameFile + "' en erreur et non ajouté au dossier '" + fileName + "'", e1);
                }
            }
        }
        if (errorAddPj) {
            String fileNamesError = "";
            if (fileNameError.size() > 0) {
                fileNamesError = " : " + fileNameError.stream().collect(Collectors.joining(", "));
            }
            Notification.show(applicationContext.getMessage("candidature.download.encoding.pj", null, UI.getCurrent().getLocale()) + fileNamesError, Type.WARNING_MESSAGE);
        }
        ut.setDestinationFileName(fileName);
        ut.setDestinationStream(out);
        ut.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
        is = pdfManager.cryptAndSignPdf(out, UI.getCurrent().getLocale());
        return new OnDemandFile(fileName, is);
    } catch (final Exception e) {
        logger.warn("erreur a la génération du dossier '" + fileName + "'", e);
        try {
            out = new ByteArrayInOutStream();
            final PDFMergerUtility ut = new PDFMergerUtility();
            ut.addSource(generateDossier(candidature, listePresentation, listeDatePresentation, listePj, listeForm));
            ut.setDestinationFileName(fileName);
            ut.setDestinationStream(out);
            ut.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
            is = pdfManager.cryptAndSignPdf(out, UI.getCurrent().getLocale());
            Notification.show(applicationContext.getMessage("candidature.download.error.pj", null, UI.getCurrent().getLocale()), Type.WARNING_MESSAGE);
            return new OnDemandFile(fileName, is);
        } catch (final Exception e2) {
            Notification.show(applicationContext.getMessage("candidature.download.error", null, UI.getCurrent().getLocale()), Type.WARNING_MESSAGE);
            logger.error("erreur a la génération du dossier", e2);
            return null;
        }
    } finally {
        // fermeture des fichiers
        MethodUtils.closeRessource(is);
        MethodUtils.closeRessource(out);
        MethodUtils.closeRessource(bisDossier);
        /* besoin de fermer les pdf apres coup */
        listeInputStreamToClose.forEach(inputStreamFile -> {
            MethodUtils.closeRessource(inputStreamFile);
        });
        listeInputStreamToClose.clear();
    }
}
Also used : PDFont(org.apache.pdfbox.pdmodel.font.PDFont) PDPage(org.apache.pdfbox.pdmodel.PDPage) ArrayList(java.util.ArrayList) OnDemandFile(fr.univlorraine.ecandidat.vaadin.components.OnDemandFile) Fichier(fr.univlorraine.ecandidat.entities.ecandidat.Fichier) BufferedInputStream(java.io.BufferedInputStream) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle) PDDocumentInformation(org.apache.pdfbox.pdmodel.PDDocumentInformation) ByteArrayInOutStream(fr.univlorraine.ecandidat.utils.ByteArrayInOutStream) BufferedInputStream(java.io.BufferedInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) Calendar(java.util.Calendar) PDFMergerUtility(org.apache.pdfbox.multipdf.PDFMergerUtility) IOException(java.io.IOException) IOException(java.io.IOException) XDocConverterException(fr.opensagres.xdocreport.converter.XDocConverterException) XDocReportException(fr.opensagres.xdocreport.core.XDocReportException) PjPresentation(fr.univlorraine.ecandidat.utils.bean.presentation.PjPresentation) PDImageXObject(org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) ByteArrayInputStream(java.io.ByteArrayInputStream) PDDocument(org.apache.pdfbox.pdmodel.PDDocument) PDPageContentStream(org.apache.pdfbox.pdmodel.PDPageContentStream) XDocReportException(fr.opensagres.xdocreport.core.XDocReportException)

Example 5 with Fichier

use of fr.univlorraine.ecandidat.entities.ecandidat.Fichier in project esup-ecandidat by EsupPortail.

the class CommissionController method deleteFileToSignataire.

/**
 * Supprime un fichier d'une commission
 * @param commission
 */
public void deleteFileToSignataire(final Commission commission) {
    /* Vérifie si le service de fichier est en maintenance */
    if (fileController.isFileServiceMaintenance(true)) {
        return;
    }
    /* Verrou */
    if (!lockController.getLockOrNotify(commission, null)) {
        return;
    }
    if (!fileController.isModeFileStockageOk(commission.getFichier(), true)) {
        return;
    }
    final Fichier fichier = commission.getFichier();
    if (fichier == null) {
        Notification.show(applicationContext.getMessage("file.error", null, UI.getCurrent().getLocale()), Type.WARNING_MESSAGE);
        lockController.releaseLock(commission);
        return;
    }
    final ConfirmWindow confirmWindow = new ConfirmWindow(applicationContext.getMessage("file.window.confirmDelete", new Object[] { fichier.getNomFichier() }, UI.getCurrent().getLocale()), applicationContext.getMessage("file.window.confirmDeleteTitle", null, UI.getCurrent().getLocale()));
    confirmWindow.addBtnOuiListener(file -> {
        removeFileToCommission(commission, fichier);
    });
    confirmWindow.addCloseListener(e -> lockController.releaseLock(commission));
    UI.getCurrent().addWindow(confirmWindow);
}
Also used : ConfirmWindow(fr.univlorraine.ecandidat.views.windows.ConfirmWindow) Fichier(fr.univlorraine.ecandidat.entities.ecandidat.Fichier)

Aggregations

Fichier (fr.univlorraine.ecandidat.entities.ecandidat.Fichier)19 FileException (fr.univlorraine.ecandidat.services.file.FileException)8 FichierFiabilisation (fr.univlorraine.ecandidat.entities.ecandidat.FichierFiabilisation)6 PjCand (fr.univlorraine.ecandidat.entities.ecandidat.PjCand)6 Candidature (fr.univlorraine.ecandidat.entities.ecandidat.Candidature)5 FormulaireCandidature (fr.univlorraine.ecandidat.entities.ecandidat.FormulaireCandidature)5 PjCandPK (fr.univlorraine.ecandidat.entities.ecandidat.PjCandPK)5 ConfirmWindow (fr.univlorraine.ecandidat.views.windows.ConfirmWindow)5 InputStream (java.io.InputStream)5 TypeStatutPiece (fr.univlorraine.ecandidat.entities.ecandidat.TypeStatutPiece)4 UploadWindow (fr.univlorraine.ecandidat.views.windows.UploadWindow)4 ByteArrayInOutStream (fr.univlorraine.ecandidat.utils.ByteArrayInOutStream)3 PjPresentation (fr.univlorraine.ecandidat.utils.bean.presentation.PjPresentation)3 OnDemandFile (fr.univlorraine.ecandidat.vaadin.components.OnDemandFile)3 IOException (java.io.IOException)3 PjCandidat (fr.univlorraine.ecandidat.entities.ecandidat.PjCandidat)2 SiScolException (fr.univlorraine.ecandidat.services.siscol.SiScolException)2 LocalDateTime (java.time.LocalDateTime)2 ZipEntry (java.util.zip.ZipEntry)2 ZipOutputStream (java.util.zip.ZipOutputStream)2