nc.noumea.mairie.appock.services.impl.ConfigServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for nc.noumea.mairie.appock.services.impl.ConfigServiceImpl.java

Source

package nc.noumea.mairie.appock.services.impl;

/*-
 * #%L
 * Logiciel de Gestion des approvisionnements et des stocks des fournitures administratives de la Mairie de Nouma
 * %%
 * Copyright (C) 2017 Mairie de Nouma, Nouvelle-Caldonie
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/gpl-3.0.html>.
 * #L%
 */

import nc.noumea.mairie.appock.core.utility.AppockUtil;
import nc.noumea.mairie.appock.core.utility.DateUtil;
import nc.noumea.mairie.appock.entity.Config;
import nc.noumea.mairie.appock.entity.FichierDocumentationUtilisateur;
import nc.noumea.mairie.appock.repositories.ConfigRepository;
import nc.noumea.mairie.appock.repositories.FichierDocumentationUtilisateurRepository;
import nc.noumea.mairie.appock.repositories.MimeTypeRepository;
import nc.noumea.mairie.appock.services.ConfigService;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@Service("configService")
@Scope(value = "singleton", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ConfigServiceImpl implements ConfigService {

    private static final Logger logger = LoggerFactory.getLogger(ConfigServiceImpl.class);

    @Autowired(required = true)
    String pieceJointeDir;

    @Autowired
    ConfigRepository configRepository;

    @Autowired
    MimeTypeRepository mimeTypeRepository;

    @Autowired
    FichierDocumentationUtilisateurRepository fichierDocumentationUtilisateurRepository;

    private static Logger log = LoggerFactory.getLogger(ConfigServiceImpl.class);
    private Map<String, String> cacheCleValeur;
    private LocalDateTime dateCache;

    @Override
    public String getPieceJointeDir() {
        return pieceJointeDir;
    }

    public void setPieceJointeDir(String pieceJointeDir) {
        this.pieceJointeDir = pieceJointeDir;
        logger.info("Attachments directory : " + pieceJointeDir);
    }

    @Override
    public String getValeur(String cle) {
        if (isCacheARecharger()) {
            rechargeCache();
        }
        if (!cacheCleValeur.containsKey(cle)) {
            throw new RuntimeException("L'lment de configuration " + cle + " n'a pas t trouv");
        }
        return cacheCleValeur.get(cle);
    }

    private boolean isCacheARecharger() {
        return cacheCleValeur == null || dateCache == null || LocalDateTime.now().isAfter(dateCache.plusMinutes(5));
    }

    @Override
    public void rechargeCache() {
        this.dateCache = LocalDateTime.now();
        this.cacheCleValeur = new HashMap<>();
        for (Config config : configRepository.findAll()) {
            this.cacheCleValeur.put(config.getCle(), config.getValeur());
        }
    }

    @Override
    public Integer getValeurInt(String cle, boolean throwExceptionIfNotParsable) {
        String valeur = getValeur(cle);
        Integer result = null;
        if (!StringUtils.isBlank(valeur)) {
            try {
                result = Integer.parseInt(valeur);
            } catch (Exception e) {
                log.error("La config pour la cl n'est pas un entier : " + cle + ", valeur = " + valeur, e);
            }
        }
        if (throwExceptionIfNotParsable && result == null) {
            throw new RuntimeException("Erreur sur lecture cl " + cle + " non entire : " + valeur);
        }
        return result;
    }

    /**
     * Retourne la valeur d'un lment de configuration au format JJ/MM/AAAA
     *
     * @param cle                         cl
     * @param throwExceptionIfNotParsable dans le cas o l'lment n'est pas parsable
     * @return la date extraite de la configuration
     */
    @Override
    public LocalDate getValeurDate(String cle, boolean throwExceptionIfNotParsable) {
        String valeur = getValeur(cle);
        LocalDate result = null;
        if (!StringUtils.isBlank(valeur)) {
            try {
                result = DateUtil.parseLocalDate(valeur);
            } catch (Exception e) {
                log.error("La config pour la cl n'est pas un entier : " + cle + ", valeur = " + valeur, e);
            }
        }
        if (throwExceptionIfNotParsable && result == null) {
            throw new RuntimeException("Erreur sur lecture cl " + cle + " non date : " + valeur);
        }
        return result;
    }

    @Override
    public String getTitreApplication() {
        return getValeur(Config.TITRE_APPLICATION);
    }

    @Override
    public Integer getTailleMaxPieceJointeEnMo() {
        return getValeurInt(Config.TAILLE_MAX_PIECE_JOINTE_EN_MO, true);
    }

    @Override
    public String getMotDePasseVerrouExcel() {
        return getValeur(Config.MOT_DE_PASSE_VERROU_EXCEL);
    }

    @Override
    public String getEncodageSujetEmail() {
        return getValeur(Config.ENCODAGE_SUJET_EMAIL);
    }

    @Override
    public String getPiedDeMail() {
        return getValeur(Config.PIED_DE_MAIL);
    }

    @Override
    public String getDefaultFromEmailAddress() {
        return getValeur(Config.DEFAULT_FROM_EMAIL_ADDRESS);
    }

    @Override
    public FichierDocumentationUtilisateur saveFichierDocumentationUtilisateur(byte[] content, String nomFichier)
            throws IOException {
        FichierDocumentationUtilisateur fichierDocumentationUtilisateur = new FichierDocumentationUtilisateur();
        fichierDocumentationUtilisateur.setNomFichier(nomFichier);
        fichierDocumentationUtilisateur.setContenu(content);
        fichierDocumentationUtilisateur
                .setMimeType(mimeTypeRepository.findFirstByLibelle(AppockUtil.getMimeType(content)));

        fichierDocumentationUtilisateur = fichierDocumentationUtilisateurRepository
                .save(fichierDocumentationUtilisateur);

        creeFichierCoteServeur(fichierDocumentationUtilisateur);

        return fichierDocumentationUtilisateur;
    }

    private void creeFichierCoteServeur(FichierDocumentationUtilisateur fichierDocumentationUtilisateur)
            throws IOException {
        if (fichierDocumentationUtilisateur.getContenu() == null) {
            return;
        }

        FileUtils.writeByteArrayToFile(getFileFichierDocumentationUtilisateur(fichierDocumentationUtilisateur),
                fichierDocumentationUtilisateur.getContenu());
    }

    @Override
    public File getFileFichierDocumentationUtilisateur(
            FichierDocumentationUtilisateur fichierDocumentationUtilisateur) {
        if (fichierDocumentationUtilisateur == null || fichierDocumentationUtilisateur.getId() == null) {
            throw new IllegalArgumentException(
                    "fichierDocumentationUtilisateur null ou sans id : " + fichierDocumentationUtilisateur);
        }
        return new File(getPieceJointeDir() + "/fichierDocumentationUtilisateur" + File.separatorChar
                + fichierDocumentationUtilisateur.getId());
    }
}