/**
* 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.action.accessRights;
import java.util.ArrayList;
import java.util.Arrays;
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 java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.squale.jraf.commons.exception.JrafDaoException;
import org.squale.jraf.commons.exception.JrafEnterpriseException;
import org.squale.jraf.helper.AccessDelegateHelper;
import org.squale.jraf.spi.accessdelegate.IApplicationComponent;
import org.squale.jraf.spi.persistence.ISession;
import org.squale.squalecommon.datatransfertobject.component.AuditDTO;
import org.squale.squalecommon.datatransfertobject.component.AuditGridDTO;
import org.squale.squalecommon.datatransfertobject.component.ComponentDTO;
import org.squale.squalecommon.datatransfertobject.component.UserDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.SqualeReferenceBO;
import org.squale.squalecommon.enterpriselayer.facade.quality.SqualeReferenceFacade;
import org.squale.squaleweb.applicationlayer.formbean.LogonBean;
import org.squale.squaleweb.applicationlayer.formbean.RootForm;
import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationForm;
import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationListForm;
import org.squale.squaleweb.applicationlayer.formbean.component.ProjectListForm;
import org.squale.squaleweb.applicationlayer.tracker.Tracker;
import org.squale.squaleweb.applicationlayer.tracker.TrackerStructure;
import org.squale.squaleweb.resources.WebMessages;
import org.squale.squaleweb.transformer.ApplicationListTransformer;
import org.squale.squaleweb.transformer.ProjectListTransformer;
import org.squale.squaleweb.util.ExceptionWrapper;
import org.squale.squaleweb.util.SqualeWebActionUtils;
import org.squale.squaleweb.util.SqualeWebConstants;
import org.squale.welcom.struts.action.WDispatchAction;
import org.squale.welcom.struts.transformer.WTransformerException;
import org.squale.welcom.struts.transformer.WTransformerFactory;
import org.squale.welcom.struts.util.WConstants;
/**
* Action de base Cette classe permet de factoriser les actions de base de squale
*/
public abstract class BaseDispatchAction
extends WDispatchAction
{
/**
* Logger
*/
private static Log log = LogFactory.getLog( BaseDispatchAction.class );
/**
* Contient la cl� de r�f�rence de l'attribut de session contenant la liste des projets du projet actuellement
* s�lectionn�.
*/
public static final String PROJECTS_KEY = "projects.list";
/** Constantes */
/** d�fini la constante pour le dto */
public static final String REQUEST_DTO = "requestDTO";
/** constante pour l'application */
public static final String APPLI_DTO = "applicationDTO";
/** constante pour l'application */
public static final String PROJECT_DTO = "projectDTO";
/** constante pour l'application */
public static final String CURRENT_AUDIT_DTO = "currentAuditDTO";
/** constante pour l'application */
public static final String PREVIOUS_AUDIT_DTO = "previousAuditDTO";
/** constante pour l'application */
public static final String DO_NOT_UPDATE_PROJECT_NAME = "doNotUpdateProjectName";
/**
* Param�tre de la requ�te pour indiquer qu'il ne faut pas modifier le formulaire en session. C'est le cas par
* exemple pour la cr�ation d'un projet ou d'une application
*/
public static final String DO_NOT_RESET_FORM = "doNotResetForm";
/**
* Traitement d'une exception Une exception intercept�e dans une action est trait�e par l'appel de cette m�thode qui
* log celle-ci et la place dans les param�tres de la requ�te pour une exploitation par la page jsp d'erreur
* associ�e
*
* @param pException exception
* @param pErrors erreurs
* @param pRequest requ�te
*/
protected void handleException( Exception pException, ActionMessages pErrors, HttpServletRequest pRequest )
{
log.error( pException, pException );
// Enregistrement de l'exception
ExceptionWrapper.saveException( pRequest, pException );
ActionMessage error = new ActionMessage( "error.cannot_act" );
pErrors.add( ActionMessages.GLOBAL_MESSAGE, error );
}
/**
* M�thode pour factoriser l'utilisation du tracker
*
* @param pDisplayName le nom du lien (la valeur affich�e)
* @param pUrl la valeur du lien
* @param pType le type de l'�l�ment qu'on a ajout� au tracker
* @param pRequest la requete http
* @param pReset le bool�en indiquant si le tracker doit etre r�initialis�
*/
protected void updateHistTracker( String pDisplayName, String pUrl, int pType, HttpServletRequest pRequest,
boolean pReset )
{
// on ajoute les �l�ments � la requete si ils sont pr�sents
String requestComplement = "";
if ( pRequest.getParameter( "currentAuditId" ) != null )
{
requestComplement += "¤tAuditId=" + (String) pRequest.getParameter( "currentAuditId" );
}
if ( pRequest.getParameter( "projectId" ) != null )
{
requestComplement += "&projectId=" + (String) pRequest.getParameter( "projectId" );
}
if ( pRequest.getParameter( "applicationId" ) != null )
{
requestComplement += "&applicationId=" + (String) pRequest.getParameter( "applicationId" );
}
String newUrl = pUrl + requestComplement;
TrackerStructure ts = new TrackerStructure( pDisplayName, newUrl, pType );
new Tracker().updateHistTracker( ts, pRequest, pReset );
}
/**
* M�thode pour factoriser l'utilisation du tracker sur les composants
*
* @param pId l'id du composant � rajouter
* @param pName le nom du composant � rajouter
* @param pRequest la requete http
*/
protected void updateTrackerComponent( long pId, String pName, HttpServletRequest pRequest )
{
List list = (List) pRequest.getSession().getAttribute( SqualeWebConstants.TRACKER_COMPONENT );
// v�rifie que le form n'existe pas d�j�, �vite les probl�mes de refresh entre autres
boolean alreadyExists = false;
List newList = new ArrayList( 0 );
int i = 0;
for ( i = 0; !alreadyExists && i < list.size(); i++ )
{
TrackerStructure ts = (TrackerStructure) ( list.get( i ) );
// profite de la boucle pour construire la sous liste
// dans le cas o� on aurait cliqu� sur un �l�ment du traceur
// la m�thode sublist ne permet pas d'avoir une arrayList
newList.add( i, ts );
if ( ts.getDisplayName().equals( pName ) )
{
alreadyExists = true;
}
}
// si il n'existe pas, on l'ajoute
if ( !alreadyExists )
{
TrackerStructure lastOne = new TrackerStructure();
StringTokenizer st = new StringTokenizer( pName, "(" );
String name = pName;
if ( st.hasMoreTokens() )
{
name = st.nextToken();
}
lastOne.setDisplayName( name );
lastOne.setLink( "<a href=\"project_component.do?action=component&component=" + pId );
list.add( lastOne );
pRequest.getSession().setAttribute( SqualeWebConstants.TRACKER_COMPONENT, list );
}
else
{ // si il existe d�ja, on revient � l'endroit o� il �tait dans le traceur
pRequest.getSession().setAttribute( SqualeWebConstants.TRACKER_COMPONENT, newList );
}
}
/**
* M�thode pour r�initialiser le tracker Utilis�e si on doit juste r�initialiser le tracker
*
* @param pRequest la requete http
*/
protected void resetTracker( HttpServletRequest pRequest )
{
new Tracker().reset( pRequest );
}
/**
* change le param�tre indiquant de quel type de vue on vient
*
* @param pRequest la requete http
* @param pWay indique si on vient d'une vue composant
*/
protected void changeWay( HttpServletRequest pRequest, String pWay )
{
pRequest.getSession().setAttribute( SqualeWebConstants.TRACKER_BOOL, pWay );
}
/**
* change le param�tre indiquant si il faut reinitialiser le traceur ou pas
*
* @param pRequest la requete
* @param pReset le param�tre indiquant si il faut reinitialiser le traceur ou pas
*/
protected void needToReset( HttpServletRequest pRequest, String pReset )
{
pRequest.getSession().setAttribute( SqualeWebConstants.TRACKER_RESET, pReset );
}
/**
* Applications accessibles � l'utilisateur
*
* @param pRequest requ�te HTTP
* @return liste des applications accessibles � l'utilisateur
*/
protected List getUserApplicationList( HttpServletRequest pRequest )
{
LogonBean sessionUser = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
return sessionUser.getApplicationsList();
}
/**
* L'utilisateur �tant admin,l'ensemble des applications
*
* @param pRequest requ�te HTTP
* @return liste des applications accessibles � l'utilisateur
*/
protected List getUserAdminApplicationList( HttpServletRequest pRequest )
{
LogonBean sessionUser = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
return sessionUser.getAdminList();
}
/**
* Applications publiques accessibles � l'utilisateur
*
* @param pRequest requ�te HTTP
* @return liste des applications accessibles � l'utilisateur
*/
protected List getUserPublicApplicationList( HttpServletRequest pRequest )
{
LogonBean sessionUser = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
return sessionUser.getPublicList();
}
/**
* Applications non publiques accessibles � l'utilisateur
*
* @param pRequest requ�te HTTP
* @return liste des applications accessibles � l'utilisateur
*/
protected List getUserNotPublicApplicationList( HttpServletRequest pRequest )
{
LogonBean sessionUser = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
return sessionUser.getNotPublicList();
}
/**
* Applications poss�dant des r�sultats lisibles par l'utilisateur
*
* @param pRequest requ�te HTTP
* @return liste des applications accessibles � l'utilisateur
*/
protected List getUserApplicationWithResultsList( HttpServletRequest pRequest )
{
LogonBean sessionUser = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
List applis = sessionUser.getNotPublicList();
return getWithResults( applis );
}
/**
* Applications poss�dant des r�sultats lisibles par l'utilisateur
*
* @param pRequest requ�te HTTP
* @return liste des applications accessibles � l'utilisateur
*/
protected List getUserPublicApplicationWithResultsList( HttpServletRequest pRequest )
{
LogonBean sessionUser = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
List applis = sessionUser.getPublicList();
return getWithResults( applis );
}
/**
* @param applis les applications
* @return la liste des applications ayant des r�sultats
*/
private List getWithResults( List applis )
{
List results = new ArrayList();
for ( int i = 0; i < applis.size(); i++ )
{
ApplicationForm current = (ApplicationForm) applis.get( i );
if ( current.getHasResults() )
{
results.add( current );
}
}
return results;
}
/**
* Applications accessibles � l'utilisateur
*
* @param pRequest requ�te HTTP
* @return liste des applications accessibles � l'utilisateur sous la forme de DTO
*/
protected List getUserApplicationListAsDTO( HttpServletRequest pRequest )
{
ApplicationListForm applicationListForm = new ApplicationListForm();
ArrayList applicationsList = new ArrayList();
applicationsList.addAll( getUserApplicationList( pRequest ) );
applicationListForm.setList( applicationsList );
List applications = null;
try
{
applications =
(List) ( WTransformerFactory.formToObj( ApplicationListTransformer.class, applicationListForm )[0] );
}
catch ( WTransformerException e )
{
log.error( e, e );
}
return applications;
}
/**
* Applications accessibles � l'utilisateur
*
* @param pRequest requ�te HTTP
* @return liste des applications accessibles � l'utilisateur sous la forme de DTO
*/
protected List getUserAdminApplicationListAsDTO( HttpServletRequest pRequest )
{
ApplicationListForm applicationListForm = new ApplicationListForm();
ArrayList applicationsList = new ArrayList();
applicationsList.addAll( getUserAdminApplicationList( pRequest ) );
applicationListForm.setList( applicationsList );
List applications = null;
try
{
applications =
(List) ( WTransformerFactory.formToObj( ApplicationListTransformer.class, applicationListForm )[0] );
}
catch ( WTransformerException e )
{
log.error( e, e );
}
return applications;
}
/**
* Utilisateur administrateur
*
* @param pRequest requ�te HTTP
* @return true si l'utilisateur est administrateur
*/
protected boolean isUserAdmin( HttpServletRequest pRequest )
{
LogonBean sessionUser = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
return sessionUser.isAdmin();
}
/**
* Obtention de l'utilisateur courant sous la forme de DTO
*
* @param pRequest requ�te
* @return utilisateur courant avec l'id et le matricule renseign�s
*/
protected UserDTO getUserAsDTO( HttpServletRequest pRequest )
{
UserDTO user = new UserDTO();
LogonBean sessionUser = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
user.setID( sessionUser.getId() );
user.setMatricule( sessionUser.getMatricule() );
return user;
}
/**
* V�rifie que l'utilisateur a les droits pour afficher la page demand�e
*
* @param pUser l'utilisateur courant
* @param pApplicationId l'id de l'application
* @return un bool�en indiquant si l'utilisateur a les droits requis
*/
protected abstract boolean checkRights( LogonBean pUser, Long pApplicationId );
/**
* @param pMapping l'actionMapping utilis�e pour cette instance
* @param pForm l'actionform bean utilis�e (optionnel)
* @param pRequest la requete http
* @param pResponse la r�ponse http que l'on cr�e
* @return l'ActionForward r�sultat de l'action
* @throws Exception en cas d'�chec
*/
public ActionForward wExecute( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
throws Exception
{
// redirection vers la page d'erreur par d�faut
ActionForward fw = pMapping.findForward( "unauthorized_access" );
UserDTO user = getUserAsDTO( pRequest );
LogonBean sessionUser = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
ArrayList usersList = null;
RootForm rootForm = (RootForm) pForm;
initCacheAndForm( pRequest, rootForm );
Long appliId = null;
if ( !rootForm.getApplicationId().equals( "" ) )
{
appliId = new Long( rootForm.getApplicationId() );
sessionUser.setCurrentAccess( (String) sessionUser.getProfile( "" + appliId ) );
}
try
{
if ( checkRights( sessionUser, appliId ) )
{ // Check des droits
// Ex�cution du code de l'action car l'utilisateur a les droits
fw = super.wExecute( pMapping, rootForm, pRequest, pResponse );
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
ActionMessages errors = new ActionMessages();
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
fw = pMapping.findForward( "failure" );
}
// pour g�rer tout ce qui est probl�me de session et de back
pResponse.setHeader( "Cache-Control", "no-store" ); // HTTP 1.1
pResponse.setHeader( "Pragma", "no-cache" ); // HTTP 1.0
pResponse.setDateHeader( "Expires", 0 ); // prevents caching at the proxy server
return fw;
}
/**
* Initialise le dto
*
* @param pRequest la requete http
* @param pForm le formulaire
* @throws JrafEnterpriseException en cas d'�chec
* @throws NumberFormatException en cas de probl�me de conversion
* @throws WTransformerException si erreur lors de la transformation
* @throws JrafDaoException
*/
private void initCacheAndForm( HttpServletRequest pRequest, RootForm pForm )
throws NumberFormatException, JrafEnterpriseException, WTransformerException, JrafDaoException
{
// on v�rifie que les informations ne sont pas pr�sentes ni dans
// les param�tres de la requete ni dans les attributs de la requete.
// Si ils sont pr�sents dans un des deux, on les r�cup�re.
String appliId = getParameterOrAttribute( pRequest, "applicationId" );
String projectId = getParameterOrAttribute( pRequest, "projectId" );
String currentAuditId = getParameterOrAttribute( pRequest, "currentAuditId" );
String previousAuditId = getParameterOrAttribute( pRequest, "previousAuditId" );
// Getting the application name
String applicationName = pForm.getApplicationName();
// on perd la modification
String currentProjectName = pForm.getProjectName();
// boite noire avec gestion en cache
Map map = getDTOs( appliId, projectId, currentAuditId, previousAuditId, pRequest );
// On reset les informations en cache du formulaire (sauf dans le cas de cr�ation
// de l'application ou du projet)
if ( null == pRequest.getParameter( DO_NOT_RESET_FORM ) )
{
pForm.resetCache();
}
// Cr�ation de l'application
ComponentDTO appliDTO = (ComponentDTO) map.get( APPLI_DTO );
if ( appliDTO != null )
{
pForm.setApplicationId( "" + appliDTO.getID() );
pForm.setApplicationName( appliDTO.getName() );
pForm.setNumberOfChildren( "" + appliDTO.getNumberOfChildren() );
// Setting the name of the application if it is in configuration mode
// Keep in mind that the parameter DO_NOT_RESET_FORM has been set in the config_application.jsp
if ( pRequest.getParameter( DO_NOT_RESET_FORM ) != null )
{
pForm.setApplicationName( applicationName );
}
}
// Cr�ation du projet
ComponentDTO projectDTO = (ComponentDTO) map.get( PROJECT_DTO );
if ( projectDTO != null )
{
pForm.setProjectId( "" + projectDTO.getID() );
// On modifie tout le temps le nom du projet avec le nom du projet r�cup�r� en base
// sauf dans le cas ou on veut modifier le nom du projet
if ( null == pRequest.getParameter( DO_NOT_UPDATE_PROJECT_NAME ) )
{
pForm.setProjectName( projectDTO.getName() );
}
}
// Cr�ation de l'audit
AuditDTO curAudit = (AuditDTO) map.get( CURRENT_AUDIT_DTO );
if ( curAudit != null )
{
pForm.setCurrentAuditId( "" + curAudit.getID() );
pForm.setAuditDate( SqualeWebActionUtils.getFormattedDate( pRequest.getLocale(), curAudit.getRealDate(),
"date.format" ) );
pForm.setAuditSqualeVersion( curAudit.getSqualeVersion() );
pForm.setAuditName( pForm.getAuditDate() );
if ( curAudit.getType().equals( AuditBO.MILESTONE ) )
{
pForm.setAuditName( curAudit.getName() + " (" + pForm.getAuditDate() + ")" );
}
}
// Cr�ation de l'audit pr�c�dent
AuditDTO precAudit = (AuditDTO) map.get( PREVIOUS_AUDIT_DTO );
if ( precAudit != null )
{
pForm.setPreviousAuditId( "" + precAudit.getID() );
pForm.setPreviousAuditDate( SqualeWebActionUtils.getFormattedDate( pRequest.getLocale(),
precAudit.getRealDate(), "date.format" ) );
pForm.setPreviousAuditName( pForm.getPreviousAuditDate() );
if ( precAudit.getType().equals( AuditBO.MILESTONE ) )
{
pForm.setPreviousAuditName( precAudit.getName() + " (" + pForm.getPreviousAuditDate() + ")" );
}
}
// remet en session � chaque fois pour �viter de faire trop de tests
pRequest.getSession().setAttribute( APPLI_DTO, appliDTO );
pRequest.getSession().setAttribute( PROJECT_DTO, projectDTO );
pRequest.getSession().setAttribute( CURRENT_AUDIT_DTO, curAudit );
pRequest.getSession().setAttribute( PREVIOUS_AUDIT_DTO, precAudit );
// r�cup�re en session le TopMenu, le place dans le FormBean et le retire de la session
HashMap TopMenu = (HashMap) pRequest.getSession().getAttribute( SqualeWebConstants.TOP_KEY );
pForm.setTopMenu( TopMenu );
pRequest.getSession().removeAttribute( SqualeWebConstants.TOP_KEY );
// Construit la liste des projets de l'application
// et les met en session
buildChildrenList( appliDTO, pRequest );
}
/**
* R�cup�re une cha�ne plac� soit dans les param�tres, soit dans les attributs de la requ�te
*
* @param pRequest la requ�te
* @param pKey la cl� de recherche
* @return la cha�ne
*/
private String getParameterOrAttribute( HttpServletRequest pRequest, String pKey )
{
// On essaye de r�cup�rer la cha�ne dans les param�tres de la requ�te
String result = pRequest.getParameter( pKey );
if ( null == result )
{
// Sinon on essaye dans les attributs de la requ�te
result = (String) pRequest.getAttribute( pKey );
}
return result;
}
/** 2 constantes permettant de savoir comment on r�cup�re les audits */
/** On a directement l'id de l'audit */
private final static String BY_AUDIT_ID = "byAuditId";
/** on a juste l'id de l'application, on r�cup�re le dernier audit */
private final static String BY_APPLI_ID = "byAppliId";
/**
* G�re la r�cup�ration des donn�es soit en base soit depuis la session. Gestion par cache.
*
* @param appliId l'id de l'appli
* @param projectId l'id du projet
* @param currentAuditId l'id de l'audit courant
* @param previousAuditId l'id de l'audit pr�c�dent
* @param pRequest la requete
* @return la map contenant les diff�rents dtos
* @throws JrafEnterpriseException en cas de probl�me lors de la r�cup�ration
* @throws NumberFormatException en cas de probl�me de conversion
*/
private Map getDTOs( String appliId, String projectId, String currentAuditId, String previousAuditId,
HttpServletRequest pRequest )
throws JrafEnterpriseException, NumberFormatException
{
Map map = new HashMap();
// Initialisation � null par d�faut
ComponentDTO appliDTO = null;
ComponentDTO projectDTO = null;
AuditDTO currentAuditDTO = null;
AuditDTO previousAuditDTO = null;
AuditDTO[] tab = new AuditDTO[2];
// indique si on a rep�r� un acc�s ill�gal
boolean validAccess = true;
// si on rentre ici, on a au moins l'application et le dernier audit
if ( currentAuditId != null && !"".equals( currentAuditId ) )
{
// si previous auditId vaut null, on r�cup�re celui juste avant le current
// sinon on r�cup�re celui avec l'identifiant donn�
// Au passage on r�cup�re l'application
tab = retrieveAuditAndPreviousByAuditId( currentAuditId, previousAuditId, pRequest );
currentAuditDTO = tab[0];
previousAuditDTO = tab[1];
// V�rifie que les 2 audits concernent bien la meme application (s�curit�)s
validAccess =
( currentAuditDTO != null && ( previousAuditDTO == null || currentAuditDTO.getApplicationId() == previousAuditDTO.getApplicationId() ) );
if ( validAccess )
{
// on peut r�cup�rer l'application et/ou le projet
// Si le projet est d�fini
if ( projectId != null && !"".equals( projectId ) )
{
projectDTO = retrieveAppliOrProjectByID( new Long( projectId ).longValue() );
appliDTO = retrieveAppliOrProjectByID( projectDTO.getIDParent() );
}
else
{
// Si on a l'application de l'id, on la r�cup�re directement
if ( appliId != null && !"".equals( appliId ) )
{
appliDTO = retrieveAppliOrProjectByID( new Long( appliId ).longValue() );
}
else
{
// sinon on la r�cup�re avec l'audit
appliDTO = retrieveAppliOrProjectByAuditID( currentAuditDTO.getID() );
}
}
}
}
else
{ // on n'a pas d'audits sp�cifi�s, on va r�cup�rer les 2 plus r�cents
// le projet est prioritaire
if ( projectId != null && !"".equals( projectId ) )
{
projectDTO = retrieveAppliOrProjectByID( new Long( projectId ).longValue() );
validAccess = ( projectDTO != null );
if ( validAccess )
{
appliDTO = retrieveAppliOrProjectByID( projectDTO.getIDParent() );
}
}
else
{
if ( appliId != null && !"".equals( appliId ) )
{
appliDTO = retrieveAppliOrProjectByID( new Long( appliId ).longValue() );
}
}
// si on a pu r�cup�rer l'application, on affecte la variable
// pour pouvoir r�cup�rer les projets
String newAppliId = appliId;
if ( appliDTO != null )
{
newAppliId = "" + appliDTO.getID();
}
if ( newAppliId != null && !"".equals( newAppliId ) )
{ // tout peut etre nul, page d'accueil par exemple
// R�cup�re les 2 derniers audits
tab = retrieve2LastAudits( new Long( newAppliId ).longValue(), pRequest, BY_APPLI_ID );
currentAuditDTO = tab[0];
previousAuditDTO = tab[1];
}
}
// Dans le cas o� il n'y a qu'un seul projet, comme les diff�rentes actions redirigent
// directement vers le projet il faut passer directement le projet et non pas l'application
if ( projectDTO == null && appliDTO != null && appliDTO.getNumberOfChildren() == 1 )
{
projectDTO = retrieveProjectWhereApplication( appliDTO );
}
if ( projectDTO != null )
{
// Dans ce cas on reconstruit le menu tops car on va etre redirig� vers le projet
// Mise en place du menu top contextuel � la grille dynamique
// R�cup�ration du menu top
buildTopMenu( currentAuditDTO, projectDTO, pRequest );
}
initMap( map, appliDTO, projectDTO, currentAuditDTO, previousAuditDTO, validAccess );
return map;
}
/**
* @param pAuditId l'id de l'audit
* @return l'application associ�e
* @throws JrafEnterpriseException en cas d'�chec
*/
private ComponentDTO retrieveAppliOrProjectByAuditID( long pAuditId )
throws JrafEnterpriseException
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
Object[] paramIn = { new Long( pAuditId ) };
return (ComponentDTO) ac.execute( "loadByAuditId", paramIn );
}
/**
* @param currentAuditId l'id de l'audit courant
* @param previousAuditId l'id de l'audit pr�c�dent
* @param pRequest la requete, sert pour formater les dates des audits
* @return les audits DTO
* @throws JrafEnterpriseException en cas de probl�me lors de la r�cup�ration
* @throws NumberFormatException en cas de probl�me de conversion
*/
private AuditDTO[] retrieveAuditAndPreviousByAuditId( String currentAuditId, String previousAuditId,
HttpServletRequest pRequest )
throws JrafEnterpriseException, NumberFormatException
{
AuditDTO[] result = new AuditDTO[2];
if ( previousAuditId == null || "".equals( previousAuditId ) )
{
result = retrieve2LastAudits( new Long( currentAuditId ).longValue(), pRequest, BY_AUDIT_ID );
}
else
{
result[0] = retrieveAuditById( new Long( currentAuditId ), pRequest );
result[1] = retrieveAuditById( new Long( previousAuditId ), pRequest );
}
return result;
}
/**
* @param pAuditId l'id de l'audit qu'on veut r�cup�rer
* @param pRequest la requete http
* @return l'audit
* @throws JrafEnterpriseException en cas de probl�me lors de la r�cup�ration
*/
private AuditDTO retrieveAuditById( Long pAuditId, HttpServletRequest pRequest )
throws JrafEnterpriseException
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" );
Object[] paramIn = { pAuditId };
AuditDTO currentAudit = (AuditDTO) ac.execute( "getById", paramIn );
if ( currentAudit.getRealDate() != null )
{
currentAudit.setFormattedDate( SqualeWebActionUtils.getFormattedDate( pRequest.getLocale(),
currentAudit.getRealDate(),
"date.format" ) );
}
return currentAudit;
}
/**
* @param pMap la map
* @param pAppliDTO l'application
* @param pProjectDTO le projet
* @param pCurrentAuditDTO l'audit courant
* @param pPreviousAuditDTO l'audit pr�c�dent
* @param pValidAccess le bool�en indiquant si l'acc�s a v�rifi� les r�gles
*/
private void initMap( Map pMap, ComponentDTO pAppliDTO, ComponentDTO pProjectDTO, AuditDTO pCurrentAuditDTO,
AuditDTO pPreviousAuditDTO, boolean pValidAccess )
{
// remplit la map
// on remplit tout meme si c'est null pour ne pas avoir � faire de tests
// null est une valeur autoris�e et g�r�e
if ( pValidAccess )
{ // Acc�s valide, on remplit normalement la map
pMap.put( APPLI_DTO, pAppliDTO );
pMap.put( PROJECT_DTO, pProjectDTO );
pMap.put( CURRENT_AUDIT_DTO, pCurrentAuditDTO );
pMap.put( PREVIOUS_AUDIT_DTO, pPreviousAuditDTO );
}
else
{ // acc�s incorrect, on met tout � null ce qui provoquera un pb de droit d'acc�s
pMap.put( APPLI_DTO, null );
pMap.put( PROJECT_DTO, null );
pMap.put( CURRENT_AUDIT_DTO, null );
pMap.put( PREVIOUS_AUDIT_DTO, null );
}
}
/**
* PRECONDITION: pApplication.getNumberOfChildren() == 1 est vrai
*
* @param pApplication l'application parent
* @return l'unique projet de l'application
* @throws JrafEnterpriseException en cas d'�chec
*/
private ComponentDTO retrieveProjectWhereApplication( ComponentDTO pApplication )
throws JrafEnterpriseException
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" );
Object[] paramIn = { pApplication };
List children = Arrays.asList( ( (Collection) ac.execute( "getChildren", paramIn ) ).toArray() );
return (ComponentDTO) children.get( 0 );
}
/**
* r�cup�re la liste des projets de l'application et les met en session
*
* @param appliDTO l'application
* @param pRequest la requete http
* @throws JrafEnterpriseException en cas d'�chec de r�cup�ration
* @throws WTransformerException si erreur lors de la transformation en formulaire
*/
private void buildChildrenList( ComponentDTO appliDTO, HttpServletRequest pRequest )
throws JrafEnterpriseException, WTransformerException
{
if ( appliDTO == null )
{
pRequest.getSession().removeAttribute( PROJECTS_KEY );
}
else
{ // sinon on le remet � jour
// et on remet � jour en session
// Il existe plusieurs projets, on construit la liste
// de ceux-ci pour renseigner le menu correspondant
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" );
Object[] paramIn =
{ appliDTO, null, (AuditDTO) pRequest.getSession().getAttribute( CURRENT_AUDIT_DTO ), null };
// List children = Arrays.asList(((Collection) ac.execute("getChildren", paramIn)).toArray());
Collection children = (Collection) ac.execute( "getChildren", paramIn );
// On transforme les projets en formulaire pour les utiliser dans les JSPs
ProjectListForm childrenForm =
(ProjectListForm) WTransformerFactory.objToForm( ProjectListTransformer.class,
new Object[] { children } );
pRequest.getSession().setAttribute( PROJECTS_KEY, childrenForm );
}
}
/**
* Permet de r�cup�rer une application ou un projet
*
* @param componentId l'id du composant que l'on veut
* @return le composant sous la forme d'un dto
* @throws JrafEnterpriseException en cas d'�chec de la r�cup�ration
*/
private ComponentDTO retrieveAppliOrProjectByID( long componentId )
throws JrafEnterpriseException
{
// l'id est unique
ComponentDTO appliParam = new ComponentDTO();
appliParam.setID( componentId );
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" );
Object[] paramIn = new Object[] { appliParam };
return (ComponentDTO) ac.execute( "get", paramIn );
}
/**
* R�cup�re les auditsDTO
*
* @param id l'id servant � r�cup�rer l'audit (id de l'application ou de l'audit) que l'on veut
* @param pRequest la requete
* @param pType indiquant comment on r�cup�re les audits
* @return un tableau contenant les 2 derniers audits ou null si ils n'existent pas
* @throws JrafEnterpriseException en cas d'�chec de la r�cup�ration
*/
private AuditDTO[] retrieve2LastAudits( long id, HttpServletRequest pRequest, String pType )
throws JrafEnterpriseException
{
AuditDTO currentAudit = null;
AuditDTO previousAudit = null;
AuditDTO[] tab = new AuditDTO[2];
Collection coll = getAudits( pType, id );
if ( coll.size() > 0 )
{ // il y a des audits pour cette application
Iterator it = coll.iterator();
// Le test pr�c�dent indique qu'il y a au moins 1 audit
currentAudit = (AuditDTO) ( it.next() );
// Test si il y en a un 2ieme dans la collection
// <=> un audit pr�c�dent
if ( it.hasNext() )
{
previousAudit = (AuditDTO) ( it.next() );
}
// format la date des audits
if ( currentAudit != null && currentAudit.getRealDate() != null )
{
currentAudit.setFormattedDate( SqualeWebActionUtils.getFormattedDate( pRequest.getLocale(),
currentAudit.getRealDate(),
"date.format" ) );
}
if ( previousAudit != null && previousAudit.getRealDate() != null )
{
previousAudit.setFormattedDate( SqualeWebActionUtils.getFormattedDate( pRequest.getLocale(),
previousAudit.getRealDate(),
"date.format" ) );
}
}
// remplit la map pour les audits
tab[0] = currentAudit;
tab[1] = previousAudit;
return tab;
}
/**
* @param pType la fa�on dont on va r�cup�rer
* @param pId l'id permettant le calcul
* @return la collection d'audits
* @throws JrafEnterpriseException en cas d'�chec de la r�cup�ration
*/
private Collection getAudits( String pType, long pId )
throws JrafEnterpriseException
{
Collection result = new ArrayList( 0 );
// r�cup�re les 2 derniers audits pour l'application
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Component" );
if ( pType.equals( BY_AUDIT_ID ) )
{
// R�cup�ration par l'id de l'audit
AuditDTO auditRef = null;
auditRef = new AuditDTO();
auditRef.setID( pId );
Object[] paramIn = new Object[] { auditRef };
result = (Collection) ac.execute( "getLastTwoAuditsByAuditId", paramIn );
// s'il il n'y a aucun audit termin�, on r�cup�re les 2 derniers failed
if ( result == null || result.size() == 0 )
{
paramIn = new Object[] { auditRef };
result = (Collection) ac.execute( "getLastTwoAuditsByAuditId", paramIn );
}
}
if ( pType.equals( BY_APPLI_ID ) )
{
// R�cup�ration par l'id de l'application
ComponentDTO appliParam = new ComponentDTO();
appliParam.setID( pId );
Object[] paramIn = new Object[] { appliParam, null, new Integer( 2 ), new Integer( AuditBO.TERMINATED ) };
result = (Collection) ac.execute( "getLastAllAudits", paramIn );
// sil il n'y a aucun audit termin�, on r�cup�re les 2 derniers failed
if ( result == null || result.size() == 0 )
{
paramIn = new Object[] { appliParam, null, new Integer( 2 ), new Integer( AuditBO.FAILED ) };
result = (Collection) ac.execute( "getLastAllAudits", paramIn );
}
}
return result;
}
/**
* @param currentAudit l'audit
* @param projectDTO le projet
* @param pRequest la requete http
* @throws JrafEnterpriseException en cas d'�chec
*/
private void buildTopMenu( AuditDTO currentAudit, ComponentDTO projectDTO, HttpServletRequest pRequest )
throws JrafEnterpriseException
{
HashMap topMenu = new HashMap();
HashMap languageCustomizedTopMenu = new HashMap();
// Si le currentAudit n'est pas renseign�, pas de menu tops
// Code protecteur car suivant d'ou on vient il peut parfois etre nul
if ( currentAudit != null )
{
// On va r�cup�rer la grille qualit� correspondant au dernier audit
IApplicationComponent acResult = AccessDelegateHelper.getInstance( "Results" );
AuditGridDTO auditGridDto =
(AuditGridDTO) acResult.execute( "getProjectAuditGrid", new Object[] { projectDTO, currentAudit } );
// On construit ensuite le menu des grilles
IApplicationComponent acGrid = AccessDelegateHelper.getInstance( "QualityGrid" );
topMenu = (HashMap) acGrid.execute( "getGridMetrics", new Object[] { auditGridDto.getGrid() } );
// Modification des valeurs de la HashMap TopMenu suivant le langage
Set keys = topMenu.keySet();
Iterator it = keys.iterator();
// Rajout du langage dans la requ�te pour les sous-menus
pRequest.setAttribute( SqualeWebConstants.LANGUAGE, projectDTO.getLanguage() );
// Parcours des cl�s de la HashMap
while ( it.hasNext() )
{
Object key = it.next();
String skey = key.toString();
Object pTemp = topMenu.get( key );
// On va v�rifier que la cl� d�bute par component. et qu'elle existe bien avec le langage en plus
if ( skey.startsWith( "component." ) & WebMessages.existString( skey + "." + projectDTO.getLanguage() ) )
{
languageCustomizedTopMenu.put( key + "." + projectDTO.getLanguage(), pTemp );
}
else
{
languageCustomizedTopMenu.put( key, pTemp );
}
}
}
pRequest.getSession().setAttribute( SqualeWebConstants.TOP_KEY, languageCustomizedTopMenu );
}
/**
* Add an user access to the application with id <code>pAppliId</code>
*
* @param pRequest request
* @param pAppliId id of application
* @throws JrafEnterpriseException if error
*/
public void addUserAccess( HttpServletRequest pRequest, long pAppliId )
throws JrafEnterpriseException
{
// If the user is not a SQUALE administrator,
// we save access
LogonBean user = (LogonBean) getWILogonBean( pRequest );
if ( !user.isAdmin() )
{
String matricule = user.getMatricule();
Integer maxAccesses =
new Integer( Integer.parseInt( WebMessages.getString( pRequest, "application.max.accesses" ) ) );
Object[] accessParams = new Object[] { new Long( pAppliId ), matricule, maxAccesses };
AccessDelegateHelper.getInstance( "ApplicationAdmin" ).execute( "addUserAccess", accessParams );
}
}
}