Java tutorial
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.-]", "_"); } }