Java tutorial
/* * This file is a part of Square, Customer Relationship Management Software for insurance's companies * Copyright (C) 2010-2012 SCUB <square@scub.net> - Mutuelle SMATIS FRANCE <square@smatis.fr > * * 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 2 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package com.square.tarificateur.noyau.util.comparaison.famille; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.Converter; import org.apache.log4j.Logger; import org.scub.foundation.framework.base.exception.BusinessException; import org.scub.foundation.framework.base.exception.TechnicalException; import org.scub.foundation.framework.core.messagesource.MessageSourceUtil; import com.square.tarificateur.noyau.dto.personne.BeneficiaireTarificateurDto; import com.square.tarificateur.noyau.dto.personne.PersonneTarificateurDto; import com.square.tarificateur.noyau.model.personne.Beneficiaire; import com.square.tarificateur.noyau.model.personne.Personne; import com.square.tarificateur.noyau.service.interfaces.TarificateurSquareMappingService; import com.square.tarificateur.noyau.util.MessageKeyUtil; /** * Classe utilitaire permettant la comparaison de famille. * @author Nicolas PELTIER (nicolas.peltier@scub.net) - SCUB */ public class ComparaisonFamilleUtil { /** MessageSourceUtil. */ private MessageSourceUtil messageSourceUtil; /** Liste de Custom Converter pour BeanUtils. */ private Map<Class<? extends Object>, Converter> customConverter; /** Liste des proprits de personne comparer. */ private List<String> listeProprietesPersonneAComparer; /** Liste des proprits d'info sant comparer. */ private List<String> listeProprietesInfoSanteAComparer; /** Liste des proprits d'adresses comparer. */ private List<String> listeProprietesAdresseAComparer; /** Logger. */ private Logger logger = Logger.getLogger(ComparaisonFamilleUtil.class); /** * Constructeur. * @param tarificateurSquareMappingService le service de mapping * @param messageSourceUtil le message source * @param customConverter les custom converters */ public ComparaisonFamilleUtil(TarificateurSquareMappingService tarificateurSquareMappingService, MessageSourceUtil messageSourceUtil, Map<Class<? extends Object>, Converter> customConverter) { this.messageSourceUtil = messageSourceUtil; this.customConverter = customConverter; this.listeProprietesPersonneAComparer = tarificateurSquareMappingService .getListeProprietesPersonneAComparer(); this.listeProprietesAdresseAComparer = tarificateurSquareMappingService .getListeProprietesAdresseAComparer(); this.listeProprietesInfoSanteAComparer = tarificateurSquareMappingService .getListeProprietesInfoSanteAComparer(); } /** * Compare les champs des 2 familles passes en paramtres. * @param personnePrincipaleDto le DTO de la personne principale * @param personnePrincipale le modle de la personne principale * @return true si les familles sont identiques, false sinon */ public boolean isFamillesIdentiques(PersonneTarificateurDto personnePrincipaleDto, Personne personnePrincipale) { // Rinitialisation des converters pour BeanUtils resetConverter(); // Comparaison de la personne principale if (!isPersonnesIdentiques(personnePrincipaleDto, personnePrincipale)) { return false; } // Rcupration des bnficiaires (cl : eidPersonne, valeur : bnficiaire) final Map<Long, BeneficiaireTarificateurDto> mapBeneficiairesDto = new HashMap<Long, BeneficiaireTarificateurDto>(); final Map<Long, Beneficiaire> mapBeneficiaires = new HashMap<Long, Beneficiaire>(); final List<Long> listeEidBeneficiairesDto = new ArrayList<Long>(); final List<Long> listeEidBeneficiaires = new ArrayList<Long>(); // Parcours de la liste des bnficiaires pour remplissage des maps if (personnePrincipaleDto.getListeBeneficiaires() != null && !personnePrincipaleDto.getListeBeneficiaires().isEmpty()) { for (BeneficiaireTarificateurDto beneficiaireDto : personnePrincipaleDto.getListeBeneficiaires()) { if (beneficiaireDto.getEidPersonne() == null) { throw new BusinessException( messageSourceUtil.get(MessageKeyUtil.ERROR_EID_PERSONNE_BENEFICIAIRE_NON_RENSEIGNE)); } mapBeneficiairesDto.put(beneficiaireDto.getEidPersonne(), beneficiaireDto); listeEidBeneficiairesDto.add(beneficiaireDto.getEidPersonne()); } } if (personnePrincipale.getListeBeneficiaires() != null && !personnePrincipale.getListeBeneficiaires().isEmpty()) { for (Beneficiaire beneficiaire : personnePrincipale.getListeBeneficiaires()) { if (beneficiaire.getPersonneCible().getEidPersonne() == null) { throw new BusinessException( messageSourceUtil.get(MessageKeyUtil.ERROR_EID_PERSONNE_BENEFICIAIRE_NON_RENSEIGNE)); } mapBeneficiaires.put(beneficiaire.getPersonneCible().getEidPersonne(), beneficiaire); listeEidBeneficiaires.add(beneficiaire.getPersonneCible().getEidPersonne()); } } // Comparaison du nombre et des eid des bnficiaires if (!(listeEidBeneficiairesDto.containsAll(listeEidBeneficiaires) && listeEidBeneficiaires.containsAll(listeEidBeneficiairesDto))) { logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_LISTE_BENEFICIAIRE_DIFFERE_DTO_MODEL, new String[] { listeEidBeneficiairesDto.toString(), listeEidBeneficiaires.toString() })); return false; } // Comparaison des champs de chacun des bnficiaires for (Long eidBeneficiaire : listeEidBeneficiairesDto) { final BeneficiaireTarificateurDto beneficiaireDto = mapBeneficiairesDto.get(eidBeneficiaire); final Beneficiaire beneficiaire = mapBeneficiaires.get(eidBeneficiaire); // Comparaison des liens familiaux if (!beneficiaire.getLienFamilial().getId().equals(beneficiaireDto.getIdLienFamilial())) { logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_LIEN_FAMILIAL_INCOHERENT)); return false; } // Comparaison des champs des bnficiaires if (!isObjetsIdentiques(beneficiaireDto, beneficiaire.getPersonneCible(), listeProprietesPersonneAComparer)) { return false; } } // Tout est identique return true; } /** * Compare les champs des 2 personnes passes en paramtres. * @param personneDto le DTO de la personne * @param personne le modle de la personne * @return true si les personnes sont identiques, false sinon */ private boolean isPersonnesIdentiques(PersonneTarificateurDto personneDto, Personne personne) { // Comparaison des champs de la personne if (!isObjetsIdentiques(personneDto, personne, listeProprietesPersonneAComparer)) { logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_CHAMPS_DIFFERENTS_PERSONNE, new String[] { String.valueOf(personne.getId()) })); return false; } // Comparaison des champs des infos sant if (!isObjetsIdentiques(personneDto.getInfoSante(), personne.getInfoSante(), listeProprietesInfoSanteAComparer)) { logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_INFO_SANTE_DIFFERENTES_PERSONNE, new String[] { String.valueOf(personne.getId()) })); return false; } // Comparaison de l'adresse principale de la personne if (!isObjetsIdentiques(personneDto.getAdressePrincipale(), personne.getAdressePrincipale(), listeProprietesAdresseAComparer)) { logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_ADRESSE_PRINCIPALE_DIFFERENTES_PERSONNE, new String[] { String.valueOf(personne.getId()) })); return false; } // Tout est identique return true; } /** * Compare les champs des 2 objets passs en paramtres. * @param objetDto le DTO de l'objet * @param objetModel le modle de l'objet * @return true si les objets sont identiques, false sinon */ @SuppressWarnings("unchecked") private boolean isObjetsIdentiques(Object objetDto, Object objetModel, List<String> listeProprietesAComparer) { // Si les 2 objets sont vides ==> identiques if (objetDto == null && objetModel == null) { return true; } // Si un objet est vide et l'autre pas ==> diffrents else if ((objetDto == null && objetModel != null) || (objetDto != null && objetModel == null)) { logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_OBJET_DIFFERENTS)); return false; } // Rcupration des proprits des objets Map<String, String> mapProprietesObjetDto = null; Map<String, String> mapProprietesObjetModele = null; try { mapProprietesObjetDto = BeanUtils.describe(objetDto); mapProprietesObjetModele = BeanUtils.describe(objetModel); } catch (IllegalAccessException e) { logger.error(messageSourceUtil.get(MessageKeyUtil.LOGGER_ERROR_WHILE_OBJECT_PROPERTY_RECUPERATION, new String[] { e.getMessage() })); throw new TechnicalException(messageSourceUtil.get(MessageKeyUtil.ERROR_COMPARAISON_FAMILLES)); } catch (InvocationTargetException e) { logger.error(messageSourceUtil.get(MessageKeyUtil.LOGGER_ERROR_WHILE_OBJECT_PROPERTY_RECUPERATION, new String[] { e.getMessage() })); throw new TechnicalException(messageSourceUtil.get(MessageKeyUtil.ERROR_COMPARAISON_FAMILLES)); } catch (NoSuchMethodException e) { logger.error(messageSourceUtil.get(MessageKeyUtil.LOGGER_ERROR_WHILE_OBJECT_PROPERTY_RECUPERATION, new String[] { e.getMessage() })); throw new TechnicalException(messageSourceUtil.get(MessageKeyUtil.ERROR_COMPARAISON_FAMILLES)); } // Parcours des proprits comparer for (String nomPropriete : listeProprietesAComparer) { // Vrification que la proprit est prsente dans le DTO if (!mapProprietesObjetDto.containsKey(nomPropriete)) { logger.warn(messageSourceUtil.get(MessageKeyUtil.LOGGER_WARN_PROPERTY_MISSING_DTO, new String[] { nomPropriete })); } // Vrification que la proprit est prsente dans le MODEL if (!mapProprietesObjetModele.containsKey(nomPropriete)) { logger.warn(messageSourceUtil.get(MessageKeyUtil.LOGGER_WARN_PROPERTY_MISSING_MODEL, new String[] { nomPropriete })); } // Rcupration de la valeur du DTO et du modle final String valeurProprieteObjetDto = mapProprietesObjetDto.get(nomPropriete); final String valeurProprieteObjetModele = mapProprietesObjetModele.get(nomPropriete); // Comparaison des valeurs if (valeurProprieteObjetDto != null && valeurProprieteObjetModele != null && !valeurProprieteObjetDto.equalsIgnoreCase(valeurProprieteObjetModele)) { logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_PROPERTY_DIFFERE_DTO_MODEL, new String[] { nomPropriete, valeurProprieteObjetDto, valeurProprieteObjetModele })); return false; } else if ((valeurProprieteObjetDto != null && !"".equals(valeurProprieteObjetDto) && valeurProprieteObjetModele == null) || (valeurProprieteObjetDto == null && valeurProprieteObjetModele != null && !"".equals(valeurProprieteObjetModele))) { logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_PROPERTY_DIFFERE_DTO_MODEL_NULL, new String[] { nomPropriete, valeurProprieteObjetDto, valeurProprieteObjetModele })); return false; } } return true; } /** Enregistrement des converters. */ private void resetConverter() { ConvertUtils.deregister(); if (customConverter != null) { for (Class<? extends Object> clazz : customConverter.keySet()) { ConvertUtils.register(customConverter.get(clazz), clazz); } } } }