/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or any later version. * * Squale 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 Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ //Source file: D:\\CC_VIEWS\\SQUALE_V0_0_ACT\\SQUALE\\SRC\\squaleCommon\\src\\org\\squale\\squalecommon\\enterpriselayer\\facade\\UserFacade.java package org.squale.squalecommon.enterpriselayer.facade.component; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.squale.jraf.commons.exception.JrafDaoException; import org.squale.jraf.commons.exception.JrafEnterpriseException; import org.squale.jraf.helper.PersistenceHelper; import org.squale.jraf.provider.persistence.hibernate.facade.FacadeHelper; import org.squale.jraf.spi.enterpriselayer.IFacade; import org.squale.jraf.spi.persistence.IPersistenceProvider; import org.squale.jraf.spi.persistence.ISession; import org.squale.squalecommon.daolayer.component.ApplicationDAOImpl; import org.squale.squalecommon.daolayer.profile.ProfileDAOImpl; import org.squale.squalecommon.daolayer.profile.UserDAOImpl; import org.squale.squalecommon.datatransfertobject.component.ProfileDTO; import org.squale.squalecommon.datatransfertobject.component.UserDTO; import org.squale.squalecommon.datatransfertobject.transform.component.ComponentTransform; import org.squale.squalecommon.datatransfertobject.transform.component.ProfileTransform; import org.squale.squalecommon.datatransfertobject.transform.component.UserTransform; import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO; import org.squale.squalecommon.enterpriselayer.businessobject.profile.ProfileBO; import org.squale.squalecommon.enterpriselayer.businessobject.profile.UserBO; /** */ public class UserFacade implements IFacade { /** * Persistence provider */ private static final IPersistenceProvider PERSISTENTPROVIDER = PersistenceHelper.getPersistenceProvider(); /** * Constructeur vide * * @roseuid 42CBFFB20158 */ private UserFacade() { } /** * retourne une collection de application pour un utilisateur donn� * * @param pUser utilisateur donn� * @return Collection de applicationDTO (lastAudit ne sera pas instanci�) * @throws JrafEnterpriseException exception JRAF * @deprecated l'utilisateur logu� recoit l'objet UserDTO qui contient la liste de application. * @roseuid 42CBFFB2014C */ public static Collection getApplicationList( UserDTO pUser ) throws JrafEnterpriseException { // Initialisation du retour et des BO Collection applicationDTOs = null; UserBO userBO = new UserBO(); Set keyCollection = null; ISession session = null; try { session = PERSISTENTPROVIDER.getSession(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); userBO = (UserBO) userDAO.loadWithMatricule( session, pUser.getMatricule() ); // Recuperation des cles qui sont des applicationBO keyCollection = ( userBO.getRights() ).keySet(); // ajout au retour des BO transformes en DTO Iterator iterator = keyCollection.iterator(); while ( iterator.hasNext() ) { applicationDTOs.add( ComponentTransform.bo2Dto( (ApplicationBO) iterator.next() ) ); } } catch ( JrafDaoException e ) { FacadeHelper.convertException( e, UserFacade.class.getName() + ".getApplicationList" ); } finally { FacadeHelper.closeSession( session, UserFacade.class.getName() + ".getApplicationList" ); } return applicationDTOs; } /** * Retourne le UserDTO en renseignant l'identifiant * * @param pUser utilisateur donn� * @param pAdmin indique si le privil�ge admin est plac� * @return UserDTO avec l'identifiant * @throws JrafEnterpriseException exception JRAF */ public static UserDTO getUser( UserDTO pUser, Boolean pAdmin ) throws JrafEnterpriseException { // Initialisation UserBO userBO = null; // retour de la DAO UserDTO userDTO = null; // retour de la facade ISession session = null; try { // r�cup�ration d'une session session = PERSISTENTPROVIDER.getSession(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); ProfileDAOImpl profileDAO = ProfileDAOImpl.getInstance(); // traitement different si on initialise l'identifiant dans le UserDTO : // si l'id est connu, l'utilisateur est d�j� authentifi�, donc pas besoin de v�rifier // son mot de passe if ( pUser.getID() < 0 ) { // r�cup�ration du UserBO � partir du matricule userBO = (UserBO) userDAO.loadWithMatricule( session, pUser.getMatricule() ); } else { // r�cup�ration du UserBO � partir de l'id Long userID = new Long( pUser.getID() ); userBO = (UserBO) userDAO.get( session, userID ); } // Traitement du cas du user guest : on affecte un profil en fonction // du privil�ge administrateur if ( userBO == null ) { userBO = createDefaultUser( session, pUser.getMatricule(), pAdmin ); } else { // We update the user profil (case of non admin gest who becomes an admin later) if ( pAdmin.booleanValue() && !ProfileBO.ADMIN_PROFILE_NAME.equals( userBO.getDefaultProfile() ) ) { userBO.setDefaultProfile( profileDAO.loadByKey( session, ProfileBO.ADMIN_PROFILE_NAME ) ); userDAO.save( session, userBO ); } } // transformation du UserBO en UserDTO userDTO = UserTransform.bo2Dto( userBO ); // ajout des droits de l'utilisateurs sur les diff�rentes applications setRights( session, userDTO, userBO, pAdmin ); } catch ( JrafDaoException e ) { FacadeHelper.convertException( e, UserFacade.class.getName() + ".getApplicationList" ); } finally { FacadeHelper.closeSession( session, UserFacade.class.getName() + ".getApplicationList" ); } return userDTO; } /** * This method do the search of a user by his identifier and his password This method return in a userDTO all * information concerning the user who corresponding to the identifier and the password. if there is no user * corresponding, the method return a null userDTO. * * @param pUser The userDTO with the identifier and the password inside * @return UserDTO the user found or null if he is not found * @throws JrafEnterpriseException exception intervened during the search of the user in the data base */ public static UserDTO getUserByMatriculeAndPassword( UserDTO pUser ) throws JrafEnterpriseException { UserBO userBO = null; UserDTO userDTO = null; ISession session = null; try { session = PERSISTENTPROVIDER.getSession(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); userBO = (UserBO) userDAO.loadWithMatriculeAndPassword( session, pUser.getMatricule(), pUser.getPassword() ); userDTO = UserTransform.bo2Dto( userBO ); } catch ( JrafDaoException e ) { FacadeHelper.convertException( e, UserFacade.class.getName() ); } finally { FacadeHelper.closeSession( session, UserFacade.class.getName() ); } return userDTO; } /** * This method do the search of a user by his identifier This method return in a userDTO all information concerning * the user who corresponding to the identifier . if there is no user corresponding, the method return a null * userDTO. * * @param pUser The userDTO with the identifier * @return UserDTO the user found or null if he is not found * @throws JrafEnterpriseException exception intervened during the search of the user in the data base */ public static UserDTO getUserByMatricule( UserDTO pUser ) throws JrafEnterpriseException { UserBO userBO = null; UserDTO userDTO = null; ISession session = null; try { session = PERSISTENTPROVIDER.getSession(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); userBO = (UserBO) userDAO.loadWithMatricule( session, pUser.getMatricule() ); if ( userBO != null ) { userDTO = UserTransform.bo2Dto( userBO ); } } catch ( JrafDaoException e ) { FacadeHelper.convertException( e, UserFacade.class.getName() ); } finally { FacadeHelper.closeSession( session, UserFacade.class.getName() ); } return userDTO; } /** * Permet d'ajouter des droits au UserDTO Dans le cas d'un utilisateur avec un privil�ge admin, tous les * applications valid�s sont ajout�s � l'utilisateur * * @param pSession session hibernate * @param pUserDTO UserDTO de destination * @param pUserBO UserBO contenant les droits * @param pAdmin indique si l'utilisateur a les droits admin * @return UserDTO renseign� entierement * @throws JrafEnterpriseException exception Jraf */ private static UserDTO setRights( ISession pSession, UserDTO pUserDTO, UserBO pUserBO, Boolean pAdmin ) throws JrafEnterpriseException { // Initialisation UserDTO userDTO = pUserDTO; // retour de la methode Map rights = new HashMap(); // map des droits sur un utilisateur List publicApplicationsBO = new ArrayList(); List publicApplicationsDTO = new ArrayList(); List applicationsInCreation = new ArrayList(); ApplicationDAOImpl applicationDAO = ApplicationDAOImpl.getInstance(); // initialisation de Dao try { // Un administrateur a acc�s � toutes les applications confirm�es if ( pAdmin.booleanValue() ) { ApplicationBO rightKey = null; Long applicationId = null; Iterator applicationIterator = null; // on ne veut pas les applications � supprimer // R�cup�ration de toutes les applications valid�es et a valider int[] status = {ApplicationBO.VALIDATED, ApplicationBO.IN_CREATION}; applicationIterator = applicationDAO.findWhereStatus( pSession, status ).iterator(); // Affectation des droits admin sur les applications valid�es et a valider fillRights( pSession, applicationIterator, ProfileBO.ADMIN_PROFILE_NAME, rights, null ); } else { // Initialisation de la map � partir des droits utilisateur // L'utilisation d'une map permet de surcharger si besoin les droits par d�faut accord�s // sur l'application publique Set rightBOs = pUserBO.getRights().keySet(); Iterator applicationIterator = rightBOs.iterator(); ApplicationBO rightKey = null; Long applicationId = null; // La liste des ids des applications appartenant � l'utilisateur String userAppli = ""; while ( applicationIterator.hasNext() ) { // Chargement de l'application applicationId = new Long( ( (ApplicationBO) applicationIterator.next() ).getId() ); rightKey = (ApplicationBO) applicationDAO.get( pSession, applicationId ); userAppli += ", " + applicationId; // visibilit� uniquement sur les applications valid�es ou en cours de cr�ation if ( rightKey.getStatus() == ApplicationBO.VALIDATED ) { rights.put( ComponentTransform.bo2Dto( rightKey ), ProfileTransform.bo2Dto( (ProfileBO) pUserBO.getRights().get( rightKey ) ) ); } else if ( rightKey.getStatus() == ApplicationBO.IN_CREATION ) { rights.put( ComponentTransform.bo2Dto( rightKey ), ProfileTransform.bo2Dto( (ProfileBO) pUserBO.getRights().get( rightKey ) ) ); applicationsInCreation.add( ComponentTransform.bo2Dto( rightKey ) ); } } // Recup�ration des applications publiques qui n'appartiennent pas � l'utilisateur if ( userAppli.length() > 0 ) { // On supprime le premi�re virgule inutile userAppli = userAppli.substring( 1 ); } publicApplicationsBO = applicationDAO.findPublic( pSession, userAppli ); applicationIterator = publicApplicationsBO.iterator(); // Affectation des droits reader fillRights( pSession, applicationIterator, ProfileBO.READER_PROFILE_NAME, rights, publicApplicationsDTO ); } userDTO.setProfiles( rights ); userDTO.setApplicationsInCreation( applicationsInCreation ); userDTO.setPublicApplications( publicApplicationsDTO ); } catch ( JrafDaoException e ) { FacadeHelper.convertException( e, UserFacade.class.getName() + ".setRights" ); } return userDTO; } /** * Affectation des droits Le param�tre pRights est mis � jour pour contenir l'ensemble des applications avec leur * droit associ� * * @param pSession session * @param pApplicationIterator applications concern�es * @param pProfile profil � utiliser * @param pRights droits � renseigner * @param pPublicAppli la liste des applications publiques ayant des r�sultats * @throws JrafDaoException si erreur */ static private void fillRights( ISession pSession, Iterator pApplicationIterator, String pProfile, Map pRights, List pPublicAppli ) throws JrafDaoException { // Affectation dans la Map pour chaque application du profil administrateur ProfileDAOImpl profileDAO = ProfileDAOImpl.getInstance(); ProfileDTO adminProfile = ProfileTransform.bo2Dto( (ProfileBO) profileDAO.loadByKey( pSession, pProfile ) ); ApplicationDAOImpl applicationDAO = ApplicationDAOImpl.getInstance(); while ( pApplicationIterator.hasNext() ) { ApplicationBO rightKey = (ApplicationBO) pApplicationIterator.next(); if ( rightKey.getStatus() != ApplicationBO.DELETED ) { pRights.put( ComponentTransform.bo2Dto( rightKey ), adminProfile ); // La liste des applications publiques peut �tre nulle dans le cas // o� l'utilisateur est administrateur car dans ce cas on ne les diff�rencie pas if ( pPublicAppli != null && rightKey.getPublic() ) { pPublicAppli.add( ComponentTransform.bo2Dto( rightKey ) ); } } } } /** * Cr�ation ou mise � jour de l'utilisateur. La cr�ation se fait avec un profil minimal, la mise � jour concerne * que l'adresse email, le nom et . * * @param pUser utilisateur donn� * @param pAdmin indique si le user est un admin * @return UserDTO avec l'identifiant * @throws JrafEnterpriseException exception survenu pendant le traitement */ public static UserDTO createOrUpdateUser( UserDTO pUser, Boolean pAdmin ) throws JrafEnterpriseException { return createOrUpdateUser( pUser, pAdmin, true ); } /** * Cr�ation ou mise � jour de l'utilisateur. La cr�ation se fait avec un profil minimal, la mise � jour concerne * que l'adresse email et/ou le nom. * * @param pUser utilisateur donn� * @param pAdmin indique si le privil�ge admin est plac� * @param updateUnsubscribed flag pour la mise � jour de l'attribut "email unsubscribed" * @return UserDTO avec l'identifiant * @throws JrafEnterpriseException exception JRAF */ public static UserDTO createOrUpdateUser( UserDTO pUser, Boolean pAdmin, Boolean updateUnsubscribed ) throws JrafEnterpriseException { // Initialisation UserBO userBO = null; // retour de la DAO UserDTO userDTO = null; // retour de la facade ISession session = null; try { // r�cup�ration d'une session session = PERSISTENTPROVIDER.getSession(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); // traitement different si on initialise l'identifiant dans le UserDTO : // si l'id est connu, l'utilisateur est d�j� authentifi�, donc pas besoin de v�rifier // son mot de passe if ( pUser.getID() < 0 ) { // r�cup�ration du UserBO � partir du matricule userBO = (UserBO) userDAO.loadWithMatricule( session, pUser.getMatricule() ); } else { // r�cup�ration du UserBO � partir de l'id Long userID = new Long( pUser.getID() ); userBO = (UserBO) userDAO.get( session, userID ); } // Traitement du cas du user guest : on affecte un profil en fonction // du privil�ge administrateur if ( userBO == null ) { userBO = createDefaultUser( session, pUser.getMatricule(), pAdmin ); } // Mise � jour des infomations du BO en fonction du DTO userBO.setEmail( pUser.getEmail() ); userBO.setFullName( pUser.getFullName() ); if(updateUnsubscribed) { userBO.setUnsubscribed( pUser.isUnsubscribed() ); } // Update the defauilt profile value ProfileDAOImpl profileDAO = ProfileDAOImpl.getInstance(); ProfileBO profileBO = null; if ( pAdmin.booleanValue() ) { profileBO = (ProfileBO) profileDAO.loadByKey( session, ProfileBO.ADMIN_PROFILE_NAME ); } else { profileBO = (ProfileBO) profileDAO.loadByKey( session, ProfileBO.DEFAULT_PROFILE_NAME ); } userBO.setDefaultProfile( profileBO ); // Sauvegarde dans la base userDAO.save( session, userBO ); // transformation du UserBO en UserDTO userDTO = UserTransform.bo2Dto( userBO ); // ajout des droits de l'utilisateurs sur les diff�rentes applications setRights( session, userDTO, userBO, pAdmin ); } catch ( JrafDaoException e ) { FacadeHelper.convertException( e, UserFacade.class.getName() + ".getApplicationList" ); } finally { FacadeHelper.closeSession( session, UserFacade.class.getName() + ".getApplicationList" ); } return userDTO; } /** * Cr�ation d'un utilisateur par d�faut L'utilisateur est cr�e avec le matricule pass� en param�tre et le profil par * d�faut en fonction du droit admin (soit admin soit default) * * @param pSession session * @param pMatricule matricule * @param pAdmin indique si le profil admin est requis * @return user cr�� * @throws JrafDaoException si erreur */ static private UserBO createDefaultUser( ISession pSession, String pMatricule, Boolean pAdmin ) throws JrafDaoException { UserBO userBO = new UserBO(); userBO.setMatricule( pMatricule ); ProfileDAOImpl profileDAO = ProfileDAOImpl.getInstance(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); ProfileBO defaultProfile; if ( pAdmin.booleanValue() ) { defaultProfile = (ProfileBO) profileDAO.loadByKey( pSession, ProfileBO.ADMIN_PROFILE_NAME ); } else { defaultProfile = (ProfileBO) profileDAO.loadByKey( pSession, ProfileBO.DEFAULT_PROFILE_NAME ); } userBO.setDefaultProfile( defaultProfile ); // Sauvegarde de l'utilisateur userDAO.save( pSession, userBO ); return userBO; } /** * @param pId l'id de l'application * @param pProfile le profil utilisateur recherch� pour cette application * @param pUnsubscribed true si on veut r�cup�rer aussi les utilisateur qui se sont d�sabonn�s de l'envoi * automatique d'email. * @return l'ensemble des utilisateurs ayant <code>pProfile</code> comme droit sur l'application * @throws JrafEnterpriseException en cas d'�checs */ public static Collection getUsersWithEmails( Long pId, String pProfile, boolean pUnsubscribed ) throws JrafEnterpriseException { Collection result = new ArrayList(); // retour de la facade ISession session = null; try { // r�cup�ration d'une session session = PERSISTENTPROVIDER.getSession(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); // Obtention des users avec le profil pProfile sur l'application ProfileBO profileBO = ProfileDAOImpl.getInstance().loadByKey( session, pProfile ); Collection applicationUsers = userDAO.findWhereApplicationAndProfileAndHaveEmails( session, pId, profileBO, pUnsubscribed ); Iterator it = applicationUsers.iterator(); // Transformation des userBO en DTO while ( it.hasNext() ) { UserBO userBO = (UserBO) it.next(); UserDTO userDTO = UserTransform.bo2Dto( userBO ); result.add( userDTO ); } } catch ( JrafDaoException e ) { // Renvoi d'une exception FacadeHelper.convertException( e, UserFacade.class.getName() + ".getManagers" ); } finally { // Fermeture de la session FacadeHelper.closeSession( session, UserFacade.class.getName() + ".getManagers" ); } return result; } /** * Obtention des utilisateurs avec le profil administrateur * * @param pUnsubscribed true si on veut r�cup�rer aussi les utilisateur qui se sont d�sabonn�s de l'envoi * automatique d'email. * @return utilisateurs avec le profil administrateur ou ayant le profil manager sur l'application concern�e * @throws JrafEnterpriseException si erreur */ static public Collection getAdminsWithEmails( boolean pUnsubscribed ) throws JrafEnterpriseException { Collection result = new ArrayList(); // retour de la facade ISession session = null; try { // r�cup�ration d'une session session = PERSISTENTPROVIDER.getSession(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); // Obtention des utilisateurs avec le profil admin Collection adminUsers = userDAO.findWhereAdminAndHaveEmails( session, pUnsubscribed ); Iterator it = adminUsers.iterator(); // transformation du UserBO en UserDTO while ( it.hasNext() ) { UserDTO userDTO = UserTransform.bo2Dto( (UserBO) it.next() ); result.add( userDTO ); } } catch ( JrafDaoException e ) { // Renvoi d'une exception FacadeHelper.convertException( e, UserFacade.class.getName() + ".getAdminUsers" ); } finally { // Fermeture de la session FacadeHelper.closeSession( session, UserFacade.class.getName() + ".getAdminUsers" ); } return result; } /** * This method returns a list of UserDTO whose IDs start by the given "idStart" parameter. * * @param idStart the beginning of the user id * @return a collection of users whose IDs start by the given paramater * @throws JrafEnterpriseException en cas d'�checs */ public static Collection<UserDTO> getUsersWithIdStartingBy( String idStart ) throws JrafEnterpriseException { ArrayList<UserDTO> result = new ArrayList<UserDTO>(); ISession session = null; try { // r�cup�ration d'une session session = PERSISTENTPROVIDER.getSession(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); Collection<UserBO> foundUsers = userDAO.findWhereMatriculeStartsWith( session, idStart ); for ( UserBO userBO : foundUsers ) { result.add( UserTransform.bo2Dto( userBO ) ); } } catch ( JrafDaoException e ) { // Renvoi d'une exception FacadeHelper.convertException( e, UserFacade.class.getName() + ".getUsersWithIdStartingBy" ); } finally { // Fermeture de la session FacadeHelper.closeSession( session, UserFacade.class.getName() + ".getUsersWithIdStartingBy" ); } return result; } /** * Cr�ation ou mise � jour de l'utilisateur La cr�ation se fait avec un profil minimal, la mise � jour ne concerne * que l'adresse email ou le nom * * @param pUser utilisateur donn� * @throws JrafEnterpriseException exception JRAF */ public static void removeUser( UserDTO pUser ) throws JrafEnterpriseException { // Initialisation UserBO userBO = null; // retour de la DAO ISession session = null; try { // r�cup�ration d'une session session = PERSISTENTPROVIDER.getSession(); UserDAOImpl userDAO = UserDAOImpl.getInstance(); userBO = (UserBO) userDAO.loadWithMatricule( session, pUser.getMatricule() ); userDAO.remove( session, userBO ); } catch ( JrafDaoException e ) { FacadeHelper.convertException( e, UserFacade.class.getName() + ".removeUser" ); } finally { FacadeHelper.closeSession( session, UserFacade.class.getName() + ".removeUser" ); } } }