nc.noumea.mairie.appock.core.utility.AppockUtil.java Source code

Java tutorial

Introduction

Here is the source code for nc.noumea.mairie.appock.core.utility.AppockUtil.java

Source

package nc.noumea.mairie.appock.core.utility;

/*-
 * #%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 java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.persistence.Column;
import javax.persistence.Query;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.imgscalr.Scalr;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import org.zkoss.zk.ui.Component;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Label;
import org.zkoss.zul.Row;

import net.sf.jmimemagic.Magic;
import net.sf.jmimemagic.MagicMatch;

public class AppockUtil {

    private static Logger log = LoggerFactory.getLogger(AppockUtil.class);

    private static final NumberFormat FORMATTER_CFP = construitFormatterCfp("#,##0.## FCFP");
    private static final NumberFormat FORMATTER_SEPARATEUR_MILLIER_DEUX_CHIFFRES_APRES_VIRGULE = construitFormatterCfp(
            "###,##0.00");

    /**
     * retourne la taille maximale annote sur la proprit d'un objet
     * @param object objet
     * @param property nom de la proprit concerne
     * @return taille max. dclare
     * @throws Exception exception en cas d'erreur
     */
    public static Integer getMaxLength(Object object, String property) throws Exception {
        if (object == null) {
            return null;
        }
        return getMaxLengthGeneric(object.getClass(), property);
    }

    private static int getMaxLengthGeneric(Class<?> clazz, String property) throws Exception {
        return clazz.getDeclaredField(property).getAnnotation(Column.class).length();
    }

    public static Integer getMaxLengthClassProperty(String className, String property) throws Exception {
        return getMaxLengthGeneric(Class.forName(className), property);
    }

    public static String getSimpleClassNameOfObject(Object object) {
        if (object == null) {
            return null;
        }
        return getSimpleNameOfClass(object.getClass());
    }

    public static String getSimpleNameOfClass(@SuppressWarnings("rawtypes") Class clazz) {
        if (clazz == null) {
            return null;
        }
        String result = clazz.getSimpleName();
        String marqueur = "_$$"; // quelquefois le simple name contient _$$ suivi d'une chane gnre, cette mthode permet de ne pas en tenir compte
        if (result.contains(marqueur)) {
            result = result.substring(0, result.indexOf(marqueur));
        }
        return result;
    }

    public static String capitalizeFullyFrench(String str) {
        if (StringUtils.isBlank(str)) {
            return null;
        }
        return WordUtils.capitalizeFully(str, new char[] { '-', ' ' });
    }

    /**
     * Convertit la chaine en entre en majuscule sans accent, et sans blanc devant/derrire.
     *
     * @param str chane concerne
     * @return "" si la chaine en entre est null
     */
    public static String majusculeSansAccentTrim(String str) {
        if (str == null) {
            return "";
        }
        String s = StringUtils.trimToEmpty(str).toUpperCase();
        s = s.replaceAll("[]", "A");
        s = s.replaceAll("[]", "E");
        s = s.replaceAll("[?]", "I");
        s = s.replaceAll("", "O");
        s = s.replaceAll("[]", "U");
        s = s.replaceAll("", "C");
        return s;
    }

    public static String majusculeSansAccentTrimToNull(String str) {
        return StringUtils.isBlank(str) ? null : majusculeSansAccentTrim(str);
    }

    /**
     * Mthode pour "charger" une collection, pour viter pb de lazy loading
     * @param collection collection  charger
     */
    public static void chargeCollection(@SuppressWarnings("rawtypes") Collection collection) {
        // ne pas enlever cette ligne de debug, volontaire
        if (collection != null) {
            log.debug(collection.toString());
        }
    }

    /**
     * @return la version du runtime Java (utile en particulier dans le footer)
     */
    public static String getSystemPropertyJavaVersion() {
        return System.getProperty("java.version");
    }

    public static boolean sameIdAndNotNull(Long id1, Long id2) {
        if (id1 == null || id2 == null) {
            return false;
        }
        return id1.longValue() == id2.longValue();
    }

    public static String paddingZeroAGaucheSaufSiVide(String str, int nombreChiffre) {
        return StringUtils.isBlank(str) ? null : StringUtils.leftPad(str, nombreChiffre, "0");
    }

    public static Object getLastOrNull(List<?> liste) {
        return CollectionUtils.isEmpty(liste) ? null : liste.get(liste.size() - 1);
    }

    /**
     * Construit un texte tronqu s'il dpasse la longueur du texte indique
     * @param texte texte
     * @param longueurMaxTexte longueur max.
     * @param suffixeSiTronque suffixe  utiliser en fin de rsultat si le texte dpasse la longueur max.
     * @return texte tronqu
     */
    public static String construitTexteTronque(String texte, int longueurMaxTexte, String suffixeSiTronque) {
        if (texte == null) {
            return null;
        }
        if (StringUtils.isBlank(texte)) {
            return "";
        }
        String result = StringUtils.trimToEmpty(texte);
        if (result.length() <= longueurMaxTexte) {
            return result;
        }
        return StringUtils.left(result, longueurMaxTexte) + ((suffixeSiTronque == null) ? "" : suffixeSiTronque);
    }

    /**
     * Mthode pour "charger" un lment, pour viter pb de lazy loading
     * @param element lment  charger
     */
    public static void chargeElement(Object element) {
        // ne pas enlever cette ligne de debug, volontaire
        if (element != null) {
            log.debug(element.toString());
        }
    }

    /**
     * Mthode utilitaire, cr une liste d'objet depuis une liste de tableau d'objets (sur chaque tableau on ne s'intresse qu' la colonne indexColumn)
     * @param listOfArrayOfObject liste de tableau d'objets
     * @param indexColumn numro de colonne (index dans chaque tableau)
     * @param <T> type d'objet
     * @return la liste des objets en position indexColumn dans la liste de tableau d'objets passe en entre
     */
    @SuppressWarnings("unchecked")
    public static <T> List<T> createList(List<Object> listOfArrayOfObject, int indexColumn) {
        List<T> result = new ArrayList<>();
        if (listOfArrayOfObject != null) {
            for (Object arrayOfObject : listOfArrayOfObject) {
                Object[] arrayOfObjectCast = (Object[]) arrayOfObject;
                result.add((T) arrayOfObjectCast[indexColumn]);
            }
        }
        return result;
    }

    public static boolean isValidEmailAddress(String email) {
        if (StringUtils.isBlank(email)) {
            return false;
        }
        boolean result = true;
        try {
            InternetAddress emailAddr = new InternetAddress(email);
            emailAddr.validate();
        } catch (AddressException ex) {
            result = false;
        }
        return result;
    }

    public static String creerReprLigne(String... listeElement) {
        List<String> listeElementRetenu = new ArrayList<>();
        for (String element : listeElement) {
            if (!StringUtils.isBlank(element)) {
                listeElementRetenu.add(StringUtils.trimToEmpty(element));
            }
        }
        return StringUtils.join(listeElementRetenu, " ");
    }

    private static DecimalFormat construitFormatterCfp(String formatCfp) {
        DecimalFormat formatter = new DecimalFormat(formatCfp);
        DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();
        symbols.setGroupingSeparator(' ');
        formatter.setDecimalFormatSymbols(symbols);
        return formatter;
    }

    public synchronized static String representationCfp(int montantEnCfp) {
        return FORMATTER_CFP.format(montantEnCfp);
    }

    public static String formatteAvec2ChiffreApresVirgule(Double valeur, boolean separateurMillier) {
        if (valeur == null) {
            return "";
        }
        if (separateurMillier) {
            return FORMATTER_SEPARATEUR_MILLIER_DEUX_CHIFFRES_APRES_VIRGULE.format(valeur);
        }
        return new DecimalFormat("0.00").format(valeur).replace(".", ",");
    }

    /**
     * @param content contenu  tester
     * @return null si content est null, ou vide, ou en cas d'erreur de dtection du type mime
     */
    public static String getMimeType(byte[] content) {
        if (content == null || content.length == 0) {
            return null;
        }
        try {
            MagicMatch match = Magic.getMagicMatch(content);
            return match.getMimeType();
        } catch (Exception e) {
            log.error("Erreur sur la dtermination du type mime", e);
            return null;
        }
    }

    /**
     * Permet de redimensionner une image
     * @param fileData l'image
     * @param width la largeur souhaite
     * @param height la hauteur souhaite
     * @return l'image modifie
     * @throws IOException si le fichier n'a pas pu tre lu
     */
    public static byte[] scale(byte[] fileData, int width, int height) throws IOException {
        ByteArrayInputStream in = new ByteArrayInputStream(fileData);
        try {
            BufferedImage img = ImageIO.read(in);
            BufferedImage result = Scalr.resize(img, Scalr.Method.QUALITY, width, height);
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            ImageIO.write(result, "png", buffer);
            return buffer.toByteArray();
        } catch (IIOException e) {
            return null;
        }
    }

    public static void setParameter(Query query, String parameter, Object value) {
        query.setParameter(parameter, value);
    }

    /**
     * Arrondi un nombre  la dizaine
     * @param nombre le nombre  arrondir
     * @return le nombre arrondi  la dizaine
     */
    public static int arrondiDizaine(double nombre) {
        int ratio = (int) (nombre * 100);
        if (ratio == 0) {
            return 0;
        }

        return ((ratio + 9) / 10 * 10);
    }

    /**
     * Lit le contenu d'un fichier, et le convertit en base 64
     * @param file fichier
     * @return contenu base 64
     * @throws IOException exception
     */
    public static String readFileToBase64(File file) throws IOException {
        byte[] bytes;
        bytes = Files.readAllBytes(file.toPath());
        StringBuilder sb = new StringBuilder();
        sb.append("data:" + getMimeType(bytes) + ";base64,");
        sb.append(org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64.encodeBase64(bytes, false)));
        return sb.toString();
    }

    /**
     * @param listeString liste de chanes
     * @param separateur separateur de liste
     * @return chaine reprsentant la liste spare par le sparateur
     */
    public static String joinListeStringNotBlank(List<String> listeString, String separateur) {
        return joinListeStringNotBlank(listeString, separateur, null);
    }

    /**
     * @param listeString liste de chanes
     * @param separateur separateur de liste
     * @param tronquerApresIndex index de la liste aprs lequel la liste sera tronque et affichera "..." (les index de valeur invalide sont ignors)
     * @return chaine reprsentant la liste spare par le sparateur et tronque aprs l'index dfinit
     */
    public static String joinListeStringNotBlank(List<String> listeString, String separateur,
            Integer tronquerApresIndex) {
        if (listeString == null) {
            return null;
        }
        List<String> listeStringRetenu = new ArrayList<>();
        for (String ligne : listeString) {
            if (!StringUtils.isBlank(ligne)) {
                listeStringRetenu.add(StringUtils.trimToEmpty(ligne));
            }
        }
        if (tronquerApresIndex != null && tronquerApresIndex > 0 && tronquerApresIndex < listeStringRetenu.size()) {
            return StringUtils.join(listeStringRetenu.toArray(), separateur, 0, tronquerApresIndex) + separateur
                    + "...";
        } else {
            return StringUtils.join(listeStringRetenu, separateur);
        }
    }

    public static Label findLabelByRowId(Grid sideBarGrid, String rowId) {
        for (Component component : sideBarGrid.getRows().getChildren()) {
            if (component instanceof Row && component.getId().equals(rowId)) {
                return (Label) component.getChildren().get(1);
            }
        }

        return null;
    }

    public static String replaceAllSpecialCharacter(String texte) {
        if (texte == null) {
            return null;
        }

        return texte.replaceAll("[^a-zA-Z0-9.-]", "_");
    }
}