/**
* 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/>.
*/
package org.squale.squaleweb.applicationlayer.formbean;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.io.Serializable;
import org.squale.squalecommon.enterpriselayer.businessobject.profile.ProfileBO;
import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationForm;
import org.squale.welcom.outils.Access;
import org.squale.welcom.struts.bean.WILogonBeanSecurity;
import org.squale.welcom.struts.bean.WResultAction;
/**
* Bean de l'utilisateur connect�
*/
public class LogonBean
extends WResultAction
implements WILogonBeanSecurity, Serializable
{
/**
* R�sultat d'action utilis� lors de la validation des formulaires
*/
private String mResultAction;
/**
* Le user est administrateur.
*/
private boolean mIsAdmin;
/**
* Liste des applications accessibles (ApplicationDTO).
*/
private List mApplicationsList = null;
/**
* Liste des applications administrables (ApplicationDTO).
*/
private List mAdminList = null;
/**
* Liste des applications consultables (ApplicationDTO).
*/
private List mReadOnlyList = null;
/**
* Liste des applications en cours de cr�ation (ApplicationDTO).
*/
private List mInCreationList = null;
/**
* Liste des applications publiques (ApplicationDTO).
*/
private List mPublicList = null;
/**
* Liste des acc�s courants (li�s � l'application)
*/
private String mCurrentAccess = null;
/**
* Liste des acc�s par d�faut
*/
private String mDefaultAccess = null;
/**
* Le nom complet de l'utilisateur
*/
private String mName = "";
/**
* L'adresse e-mail de l'utilisateur
*/
private String mEmail = "";
/**
* Le matricule
*/
private String mMatricule = null;
/**
* La liste des applications accessibles � l'utilisateur. La cl� est l' id de l'application (Long), la valeur le nom
* du profil associ� (String).
*/
private Map mProfiles = null;
/**
* La liste des applications accessibles � l'utilisateur. La cl� ici est l'ApplicationForm, la valeur le nom
* du profil associ� (String).
*/
private Map mProfilesFullApp = null;
/**
* Indique si l'utilisateur ne souhaite pas recevoir d'emails automatiques
*/
private boolean mUnsubscribed = false;
/**
* Id de l'utilisateur
*/
private long mId = -1;
/**
* Constructeur
*/
public LogonBean()
{
}
/**
* Charge les droits li�s � l'application.<br>
*
* @param pApplicationId le nom de l'application dont on veut les droits
* @return le profil de l'utilisateur pour cette application
*/
public String getApplicationRight( Long pApplicationId )
{
return (String) mProfiles.get( pApplicationId );
}
/**
* @return le nom complet de l'utilisateur
*/
public String getUserName()
{
return mName;
}
/**
* @return le nom complet de l'utilisateur
*/
public String getUsername()
{
return getUserName();
}
/**
* @return l'adresse e-mail.
*/
public String getEmail()
{
return mEmail;
}
/**
* @return le matricule.
*/
public String getMatricule()
{
return mMatricule;
}
/**
* @return la liste des applications (ProjectDTO).
*/
public List getApplicationsList()
{
return mApplicationsList;
}
/**
* @return l'ID de l'utilisateur
*/
public long getId()
{
return mId;
}
/**
* @return la liste des applications accessibles � l'utilisateur
*/
public Map getProfilesFullApp() {
return mProfilesFullApp;
}
/**
* @return si l'utilisateur ne souhaite pas recevoir d'emails automatiques
*/
public boolean getUnsubscribed() {
return mUnsubscribed;
}
/**
* @param pId le nouvel ID
*/
public void setId( long pId )
{
mId = pId;
}
/**
* @param pDefaultAccess la nouvelle liste droits par d�faut.
*/
public void setDefaultAccess( String pDefaultAccess )
{
mDefaultAccess = pDefaultAccess;
}
/**
* @param pEmail le nouvel email.
*/
public void setEmail( String pEmail )
{
mEmail = pEmail;
}
/**
* @param pMatricule le nouveau matricule.
*/
public void setMatricule( String pMatricule )
{
mMatricule = pMatricule;
}
/**
* @param pName le nouveau nom.
*/
public void setName( String pName )
{
mName = pName;
}
/**
* @return true s'il s'agit d'un administrateur
*/
public boolean isAdmin()
{
return mIsAdmin;
}
/**
* @return la liste des applications administrable
*/
public List getAdminList()
{
return mAdminList;
}
/**
* @return la liste des applications consultables
*/
public List getReadOnlyList()
{
return mReadOnlyList;
}
/**
* @return la liste des applications en cours de cr�ation
*/
public List getInCreationList ()
{
return mInCreationList;
}
/**
* @return la liste des applications publiques dont les r�sultats sont consutables
*/
public List getPublicList()
{
return mPublicList;
}
/**
* @return la liste des applications non publiques consutables
*/
public List getNotPublicList()
{
List results = new ArrayList( mApplicationsList );
results.removeAll( mPublicList );
return results;
}
/**
* @see com.airfrance.welcom.struts.bean.WIResultAction#setResultAction(java.lang.String) {@inheritDoc}
*/
public void setResultAction( String pResultAction )
{
mResultAction = pResultAction;
}
/**
* @see com.airfrance.welcom.struts.bean.WIResultAction#getResultAction() {@inheritDoc}
*/
public String getResultAction()
{
return mResultAction;
}
/**
* @param pIsAdmin admin
*/
public void setAdmin( boolean pIsAdmin )
{
mIsAdmin = pIsAdmin;
}
/**
* @param pProfiles profils sous la forme d'une map avec l'id d'application et le nom du profil
*/
public void setProfiles( Map pProfiles )
{
mProfiles = pProfiles;
}
/**
* @param pList list des applications avec un privil�ge admin
*/
public void setAdminList( List pList )
{
mAdminList = pList;
}
/**
* @param pList list des applications avec un privil�ge lecteur
*/
public void setReadOnlyList( List pList )
{
mReadOnlyList = pList;
}
/**
* @param pList list des applications en cours de cr�ation
*/
public void setInCreationList( List pList )
{
mInCreationList = pList;
}
/**
* @param pList list des applications publiques ayant des r�sultats
*/
public void setPublicList( List pList )
{
mPublicList = pList;
}
/**
* @param pList liste des applications sous la forme de ApplicationForm
*/
public void setApplicationsList( List pList )
{
mApplicationsList = pList;
}
/**
* @param pCurrentAccess acc�s courant
*/
public void setCurrentAccess( String pCurrentAccess )
{
mCurrentAccess = pCurrentAccess;
}
/**
* @param profilesFullApp liste des applications accessibles � l'utilisateur
*/
public void setProfilesFullApp(Map profilesFullApp) {
this.mProfilesFullApp = profilesFullApp;
}
/**
* @param unsubscribed si l'utilisateur ne souhaite pas recevoir d'emails automatiques
*/
public void setUnsubscribed(boolean unsubscribed) {
this.mUnsubscribed = unsubscribed;
}
/**
* Retourne l'acc�s associ�.<br>
* Les droits li�s � l'application sont prioritaires par rapport aux droits par d�faut.<br>
* Si le droit n'est pas param�tr�, le droit le plus bas est retourn�.
*
* @param pKey cl� de droit atomique recherch�e.
* @return l'action associ�e au droit.
*/
public String getAccess( String pKey )
{
// Par d�faut : aucun acc�s possible
String result = Access.NO;
if ( isAdmin() )
{
// Un admin a tous les droits
result = Access.READWRITE;
}
else if ( pKey.equals( "manager" ) && mCurrentAccess.equals( ProfileBO.MANAGER_PROFILE_NAME ) )
{
// un manager a tous les droits sur ses applications
result = Access.READWRITE;
}
else if ( pKey.equals( "reader" ) )
{
// un lecteur n'a que les droits de lecture
result = Access.READONLY;
}
else if ( pKey.equals( "default" ) )
{
// tous les droits si default.
result = Access.READWRITE;
}
return result;
}
/**
* @param pAppliId l'id de l'application sous forme de String
* @return le profil de l'utilisateur li� � l'application d'id <code>pAppliId</code>
*/
public Object getProfile( String pAppliId )
{
Long key = new Long( Long.parseLong( pAppliId ) );
return mProfiles.get( key );
}
public Map getProfiles()
{
return mProfiles;
}
/**
* Construit les groupes d'applications pour le menu header PRECONDITION : les applications sont tri�es par ordre
* alphab�tique
*
* @param applications les applications
* @param key la cl� de configuration pr�sentant (ex : E,R qui signifie grouper les applications dont la premi�re
* lettre < E puis entre F et R et enfin celles apr�s R)
* @param minApplis le nombre minimum d'applications dans le menu pour que le regroupement soit effectu�
* @return les applications group�es alphab�tiquement : ex : key : A - E (le message du menu) value : Appli1,
* Appli2,... (les applications dont la premi�re lettre du nom est entre A et E)
*/
public static TreeMap getApplicationMenu( List applications, String key, int minApplis )
{
TreeMap result = null;
if ( null != key )
{
result = new TreeMap();
List groupedApplis = new ArrayList();
int nbApplis = 0;
// On r�cup�re les lettres pour le regroupement
// la cl� de configuration est de la forme E,R (i.e. on ne met pas la premi�re et derni�re lettre
// de l'alphabet car c'est implicite)
String[] split = key.split( " *, *" );
// Le premier groupe commence toujours par A
char firstLetter = 'A';
char lastLetter = split[0].toUpperCase().charAt( 0 );
// Le message qui va appara�tre dans le menu
String messageKey = firstLetter + " - " + lastLetter;
int cptForLetter = 1;
char appliFirstLetter;
for ( int i = 0; i < applications.size(); i++ )
{
ApplicationForm curAppli = (ApplicationForm) applications.get( i );
// On ne regarde que les applications ayant des r�sultats
if ( curAppli.getHasResults() )
{
appliFirstLetter = curAppli.getApplicationName().toUpperCase().charAt( 0 );
if ( appliFirstLetter > lastLetter )
{
// On ajoute le groupe et on commence � grouper les autres applications
result.put( messageKey, groupedApplis );
// On passe � la lettre suivant la derni�re de l'ancien groupe
// pour commencer le nouveau groupe m�me si ce nouveau groupe commence par une
// application qui commence par une lettre sup�rieure
firstLetter = (char) ( lastLetter + 1 );
cptForLetter = getNextLastLetter( cptForLetter, appliFirstLetter, split );
if ( split.length == cptForLetter )
{
// il n'y a plus d'intervalles, on prend donc le reste de l'alphabet
lastLetter = 'Z';
}
else
{
lastLetter = split[cptForLetter++].toUpperCase().charAt( 0 );
}
messageKey = firstLetter + " - " + lastLetter;
groupedApplis = new ArrayList();
}
groupedApplis.add( curAppli );
nbApplis++;
}
}
if ( groupedApplis.size() > 0 )
{
result.put( messageKey, groupedApplis );
}
if ( nbApplis <= minApplis )
{
// On ne regroupe pas
result = null;
}
}
return result;
}
/**
* Cette m�thode permet de ne pas se retrouver avec un groupe vide lors de la construction du menu 'Applications'
*
* @param cptForLetter l'index courant du tableau
* @param appliFirstLetter la premi�re lettre de l'application
* @param split le tableau des lettres
* @return la derni�re lettre du nouveau groupe
*/
private static int getNextLastLetter( int cptForLetter, char appliFirstLetter, String[] split )
{
int size = split.length;
int currentIndex = cptForLetter;
int index = size;
for ( ; currentIndex < size && index == size; currentIndex++ )
{
// Si l'application rentre bien dans ce nouveau groupe on prend cette derni�re
// lettre sinon on avance pour trouver le bon groupe
if ( split[currentIndex].toUpperCase().charAt( 0 ) >= appliFirstLetter )
{
index = currentIndex;
}
}
return index;
}
}