/**
* 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.component;
import java.io.IOException;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
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.JrafEnterpriseException;
import org.squale.jraf.helper.AccessDelegateHelper;
import org.squale.jraf.spi.accessdelegate.IApplicationComponent;
import org.squale.squalecommon.datatransfertobject.component.ApplicationConfDTO;
import org.squale.squalecommon.datatransfertobject.component.AuditDTO;
import org.squale.squalecommon.datatransfertobject.component.ProjectConfDTO;
import org.squale.squalecommon.datatransfertobject.component.UserDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO;
import org.squale.squalecommon.enterpriselayer.businessobject.profile.ProfileBO;
import org.squale.squalecommon.util.SqualeCommonConstants;
import org.squale.squalecommon.util.SqualeCommonUtils;
import org.squale.squalecommon.util.mail.MailerHelper;
import org.squale.squaleweb.applicationlayer.action.ActionUtils;
import org.squale.squaleweb.applicationlayer.action.accessRights.ReaderAction;
import org.squale.squaleweb.applicationlayer.formbean.LogonBean;
import org.squale.squaleweb.applicationlayer.formbean.component.AuditForm;
import org.squale.squaleweb.applicationlayer.formbean.config.ServeurListForm;
import org.squale.squaleweb.applicationlayer.formbean.creation.ApplicationRightsForm;
import org.squale.squaleweb.applicationlayer.formbean.creation.CreateApplicationForm;
import org.squale.squaleweb.applicationlayer.formbean.creation.CreateProjectForm;
import org.squale.squaleweb.connection.UserBeanAccessorHelper;
import org.squale.squaleweb.resources.WebMessages;
import org.squale.squaleweb.transformer.ApplicationConfTransformer;
import org.squale.squaleweb.transformer.AuditTransformer;
import org.squale.squaleweb.transformer.ProjectConfTransformer;
import org.squale.squaleweb.transformer.ServeurListTransformer;
import org.squale.squaleweb.util.InputFieldDataChecker;
import org.squale.squaleweb.util.SqualeWebActionUtils;
import org.squale.welcom.struts.ajax.WHttpEasyCompleteResponse;
import org.squale.welcom.struts.bean.WActionForm;
import org.squale.welcom.struts.easycomplete.WEasyCompleteUtil;
import org.squale.welcom.struts.transformer.WTransformerException;
import org.squale.welcom.struts.transformer.WTransformerFactory;
import org.squale.welcom.struts.util.WConstants;
/**
* Struts Action used to handle applications.
*/
public class ManageApplicationAction
extends ReaderAction
{
/**
* Action called to configure the application.
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward config( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
// On r�cup�re l'aplication courante
CreateApplicationForm application = (CreateApplicationForm) pForm;
validateConfig( pForm, errors, pMapping, pRequest );
// Renvoi vers la page d'attribution des droits
forward = pMapping.findForward( "add_rights" );
if ( pRequest.getParameter( "modification" ) != null && errors.isEmpty() )
{
// Obtention de l'AC
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
ApplicationConfDTO applicationDTO =
(ApplicationConfDTO) WTransformerFactory.formToObj( ApplicationConfTransformer.class, application )[0];
// On change le nom de l'utilisateur et la date de derni�re modification
applicationDTO.setLastUser( ( (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY ) ).getMatricule() );
applicationDTO.setLastUpdate( Calendar.getInstance().getTime() );
Object[] paramIn = { applicationDTO };
forward = pMapping.findForward( "application_summary" );
if ( ( (Integer) ac.execute( "saveApplication", paramIn ) ).intValue() != 0 )
{
// Renvoi d'un message g�n�rique suite � l'�chec de sauvegarde de l'application
ActionMessage error = new ActionMessage( "error.application_not_saved" );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
else
{
// l'application est recharg�e afin de mettre � jour le nom du serveur
applicationDTO = (ApplicationConfDTO) ac.execute( "getApplicationConf", paramIn );
application =
(CreateApplicationForm) WTransformerFactory.objToForm( ApplicationConfTransformer.class,
applicationDTO );
pRequest.getSession().setAttribute( "createApplicationForm", application );
loadLastBranchAuditInSession( pRequest, applicationDTO.getId() );
}
ActionUtils.refreshUser( pRequest );
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
// Transfert vers la page d'erreur
forward = pMapping.findForward( "total_failure" );
}
if ( !errors.isEmpty() )
{
// On sauvegarde les erreurs pour les afficher sur la page initiale
saveMessages( pRequest, errors );
// On renvoie vers la page initiale avec message d'erreur
try
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Serveur" );
Collection lListeServeurDTO = (Collection) ac.execute( "listeServeurs" );
ServeurListForm lListeServeurForm = new ServeurListForm();
WTransformerFactory.objToForm( ServeurListTransformer.class, lListeServeurForm, lListeServeurDTO );
pRequest.setAttribute( "listeServeur", lListeServeurForm );
forward = pMapping.findForward( "config_application" );
}
catch ( Exception e )
{
// Traitement factoris� des exceptions
handleException( e, errors, pRequest );
}
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward configAndForward( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
validateConfig( pForm, errors, pMapping, pRequest );
forward = pMapping.findForward( "add_rights" );
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
if ( !errors.isEmpty() )
{
// On sauvegarde les erreurs pour les afficher sur la page initiale
saveMessages( pRequest, errors );
// On renvoie vers la page initiale avec message d'erreur
try
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Serveur" );
Collection lListeServeurDTO = (Collection) ac.execute( "listeServeurs" );
ServeurListForm lListeServeurForm = new ServeurListForm();
WTransformerFactory.objToForm( ServeurListTransformer.class, lListeServeurForm, lListeServeurDTO );
pRequest.setAttribute( "listeServeur", lListeServeurForm );
forward = pMapping.findForward( "config_application" );
}
catch ( Exception e )
{
// Factorisation du traitement des exceptions
handleException( e, errors, pRequest );
}
}
return forward;
}
/**
* @param pForm le formulaire
* @param pErrors les erreurs
*/
private void validateConfig( ActionForm pForm, ActionMessages pErrors, ActionMapping pMapping,
HttpServletRequest pRequest )
{
// On r�cup�re l'aplication courante
CreateApplicationForm application = (CreateApplicationForm) pForm;
// V�rification de la validit� de la saisie en fonction de l'audit
if ( ( !application.isMilestone() && application.getAuditFrequency() < 1 ) || application.getPurgeDelay() < 1 )
{
ActionMessage error = null;
// On r�affecte la valeur par d�faut au champ qui n'est pas bien rempli
if ( application.getAuditFrequency() < 1 )
{
error = new ActionMessage( "error.invalid_audit_frequency" );
application.setAuditFrequency( CreateApplicationForm.DEFAULT_AUDIT_FREQUENCY );
pErrors.add( ActionMessages.GLOBAL_MESSAGE, error );
} // Eventuellement les 2
if ( application.getPurgeDelay() < 1 )
{
application.setPurgeDelay( CreateApplicationForm.DEFAULT_PURGE_DELAY );
error = new ActionMessage( "error.invalid_purge_delay" );
pErrors.add( ActionMessages.GLOBAL_MESSAGE, error );
}
}
// V�rification de la validit� de saisie du site
if ( application.getServeurForm().getServeurId() == 0 )
{
// Le site est un obligatoire --> erreur si pas renseign�
ActionMessage error = new ActionMessage( "error.invalid_site" );
pErrors.add( ActionMessages.GLOBAL_MESSAGE, error );
}
// v�rification que la fr�quence de purge est sup�rieur � celle d'audits de suivi
if ( application.getPurgeDelay() < application.getAuditFrequency() )
{
ActionMessage error = new ActionMessage( "error.purge_frequency" );
pErrors.add( ActionMessages.GLOBAL_MESSAGE, error );
}
if ( application.getInInitialDev() )
{
if ( application.getDevCost() > application.getGlobalCostInitial() )
{
ActionMessage error = new ActionMessage( "error.dev_cost" );
pErrors.add( ActionMessages.GLOBAL_MESSAGE, error );
}
}
// Validation of the pattern used to rename the application
if ( application.validateName( pMapping, pRequest ) != null )
{
pErrors.add( ActionMessages.GLOBAL_MESSAGE, application.validateName( pMapping, pRequest ) );
}
}
/**
* Finalise la modification du projet en base de donn�es, apr�s avoir ajout� les utilisateurs.
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward addRights( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
// Cette action est la derni�re � �tre appel�e apr�s
// chaque �tape de configuration d'application
// Elle r�alise la sauvegarde dans la base des donn�es collect�es
try
{
ApplicationRightsForm form = (ApplicationRightsForm) pForm;
CreateApplicationForm createApplicationForm =
(CreateApplicationForm) pRequest.getSession().getAttribute( "createApplicationForm" );
// R�cup�ration de la liste des utilisateurs dans le formulaire
HashMap users = new HashMap();
boolean hasManager = false;
for ( int i = 0; null != form.getMatricule() && i < form.getMatricule().length; i++ )
{
// On v�rifie que l'utilisateur � ajouter poss�de un matricule valide
String matricule = form.getMatricule()[i].trim();
if ( matricule.length() > 0 )
{
if ( InputFieldDataChecker.USER_ID.check( matricule ) )
{
String right = form.getRightProfile()[i];
if ( ProfileBO.MANAGER_PROFILE_NAME.equals( right ) )
{
hasManager = true;
}
// On v�rifie que l'utilisateur n'existe pas d�j� avec des droits diff�rents
String userRight = (String) users.get( matricule );
if ( userRight != null && !userRight.equals( right ) )
{
// Erreur de configuration
ActionMessage error = new ActionMessage( "error.application_more_than_one_right" );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "failure" );
}
users.put( matricule, right );
}
else
{
// Message d'erreur
ActionMessage error = new ActionMessage( "error.application.not_valid_user", matricule );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "failure" );
}
}
}
if ( !hasManager )
{
// Message d'erreur
ActionMessage error = new ActionMessage( "error.application_without_manager" );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "failure" );
}
// On nettoie les matricules
form.setMatricule( SqualeWebActionUtils.cleanValues( form.getMatricule() ) );
// si il n'y a pas d'erreur on enregistre les modifications
if ( errors.isEmpty() )
{
// On ajoute la liste des droits � l'instance de l'application en cours de modification
createApplicationForm.setRights( users );
// On v�rifie en base que le nom est disponible
ApplicationConfDTO application =
(ApplicationConfDTO) WTransformerFactory.formToObj( ApplicationConfTransformer.class,
createApplicationForm )[0];
// Obtention de l'AC
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
// On change le nom de l'utilisateur et la date de derni�re modification
application.setLastUser( ( (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY ) ).getMatricule() );
application.setLastUpdate( Calendar.getInstance().getTime() );
Object[] paramIn = { application };
forward = pMapping.findForward( "success" );
if ( ( (Integer) ac.execute( "saveApplication", paramIn ) ).intValue() != 0 )
{
// Renvoi d'un message g�n�rique suite � l'�chec de sauvegarde de l'application
ActionMessage error = new ActionMessage( "error.application_not_saved" );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
else
{
// l'application est recharg�e afin de mettre � jour le nom du serveur
application = (ApplicationConfDTO) ac.execute( "getApplicationConf", paramIn );
createApplicationForm =
(CreateApplicationForm) WTransformerFactory.objToForm( ApplicationConfTransformer.class,
application );
pRequest.getSession().setAttribute( "createApplicationForm", createApplicationForm );
ActionUtils.refreshUser( pRequest );
}
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return ( forward );
}
/**
* S�lectionne l'application � configurer
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward selectApplicationToConfig( ActionMapping pMapping, ActionForm pForm,
HttpServletRequest pRequest, HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
// R�cup�ration de l'application depuis la requ�te
String applicationId = pRequest.getParameter( "applicationId" );
ApplicationConfDTO dto = ManageApplicationUtils.getApplication( applicationId );
if ( null == dto )
{
// Message g�n�rique si l'application n'existe pas
ActionMessage error = new ActionMessage( "error.application_not_got" );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
}
else
{
ManageApplicationUtils.getCreateApplicationForm( applicationId, pRequest );
loadLastBranchAuditInSession( pRequest, dto.getId() );
// Add an user access for this application
addUserAccess( pRequest, dto.getId() );
forward = pMapping.findForward( "application_summary" );
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions
handleException( e, errors, pRequest );
}
if ( !errors.isEmpty() )
{
// Sauvegarde des messages
saveMessages( pRequest, errors );
// Transfert vers la page d'erreur
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* Ajoute un projet � l'application actuellement en cours de configuration
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward addProject( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
CreateProjectForm project = (CreateProjectForm) pForm;
// R�cup�re la config du projet
Collection tasksDTO = getConfig( project, pRequest, errors, true );
if ( !errors.isEmpty() )
{
saveMessages( pRequest, errors );
forward = pMapping.findForward( "save_failure" );
}
else
{
// on sauvegarde le projet
forward = new CreateProjectAction().saveProject( pMapping, project, pRequest, pResponse );
if ( tasksDTO.size() != 0 )
{ // Il reste les outils � configurer
forward = pMapping.findForward( "configure" );
}
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* Sauvegarde un projet de l'application actuellement en cours de configuration
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward saveProject( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
// On r�cup�re le formulaire de cr�ation du projet
CreateProjectForm project = (CreateProjectForm) pForm;
// On sauvegarde le projet seulement si il n'y a pas eu d'erreurs
if ( isNameAvailable( project, pRequest ) )
{
forward = new CreateProjectAction().saveProject( pMapping, project, pRequest, pResponse );
}
else
{
ActionMessage error = new ActionMessage( "project_creation.name.already_used" );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
forward = pMapping.findForward( "save_failure" );
saveMessages( pRequest, errors );
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* M�thode de factorisation
*
* @param pForm le formulaire
* @param pRequest la requete http
* @param errors les messages � stocker
* @param pCheckNeeded un bool�en indiquant si on est dans un cas de lecture ou de modification Si false, on ne
* v�rifie pas, si true on effectue les v�rifications sur le nom
* @return la liste des taches que l'on a r�cup�r�
* @throws Exception en cas d'�chec
*/
private Collection getConfig( CreateProjectForm pForm, HttpServletRequest pRequest, ActionMessages errors,
boolean pCheckNeeded )
throws Exception
{
// On ajout le projet � l'application
if ( pCheckNeeded && !isNameAvailable( pForm, pRequest ) )
{
ActionMessage error = new ActionMessage( "project_creation.name.already_used" );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
}
// Il faut peut-�tre configurer les t�ches
IApplicationComponent ac = AccessDelegateHelper.getInstance( "SqualixConfig" );
Object[] paramIn = { pForm.getSourceManagement(), pForm.getProfile() };
// Ex�cution de l'AC
Collection tasksDTO = (Collection) ac.execute( "getConfigurableTasks", paramIn );
ArrayList configurableTasks = new ArrayList();
configurableTasks.addAll( tasksDTO );
pForm.setTasks( configurableTasks );
return tasksDTO;
}
/**
* Action tr�s simple juste dans le cas on on veut visualiser la configuration d'un projet
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward viewProjectConfig( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = pMapping.findForward( "configure" );
try
{
getConfig( (CreateProjectForm) pForm, pRequest, errors, false );
if ( !errors.isEmpty() )
{
saveMessages( pRequest, errors );
forward = pMapping.findForward( "failure" );
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* Supprime les projets s�lectionn�s de l'application
*
* @param pMapping le mapping
* @param pForm le formulaire
* @param pRequest la requ�te
* @param pResponse la r�ponse
* @return l'action � r�aliser
*/
public ActionForward deleteProjects( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
return changeProjectsStatus( pMapping, pForm, pRequest, ProjectBO.DELETED, "removeProject" );
}
/**
* D�sactive ou r�active les projets s�lectionn�s de l'application
*
* @param pMapping le mapping
* @param pForm le formulaire
* @param pRequest la requ�te
* @param pResponse la r�ponse
* @return l'action � r�aliser
*/
public ActionForward disactiveOrReactiveProjects( ActionMapping pMapping, ActionForm pForm,
HttpServletRequest pRequest, HttpServletResponse pResponse )
{
return changeProjectsStatus( pMapping, pForm, pRequest, ProjectBO.DISACTIVATED, "disactiveOrReactiveProject" );
}
/**
* @param pMapping le mapping
* @param pForm le formulaire
* @param pRequest la requ�te
* @param pStatus le statut du projet
* @param pMethod le nom de la m�thode � appeler
* @return l'action � r�aliser
*/
private ActionForward changeProjectsStatus( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
int pStatus, String pMethod )
{
ActionForward forward = null;
ActionErrors errors = new ActionErrors();
try
{
// R�cup�ration des projets s�lectionn�s par checkbox
CreateApplicationForm applicationForm =
(CreateApplicationForm) pRequest.getSession().getAttribute( "createApplicationForm" );
List projects = applicationForm.getProjects();
List newProjects = new ArrayList();
// On d�fini une variable permettant de compter les modifications de statut
int cpt = 0;
ActionErrors messages = new ActionErrors();
// Parcours de la s�lection et suppression de chaque projet
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
Object[] paramIn = new Object[1];
for ( int i = 0; i < projects.size(); i++ )
{
CreateProjectForm projectForm = (CreateProjectForm) projects.get( i );
CreateProjectForm newProjectForm = projectForm;
if ( projectForm.isSelected() )
{
cpt++;
paramIn[0] = new Long( projectForm.getProjectId() );
ProjectConfDTO result = (ProjectConfDTO) ac.execute( pMethod, paramIn );
// Construction d'un message de confirmation pour chaque
// projet modifi�
ActionMessage message =
new ActionMessage( "info.update_project_" + pStatus + "_" + ( result != null ),
projectForm.getProjectName() );
messages.add( "projectsMessages", message );
if ( null != result )
{
// On transforme
newProjectForm =
(CreateProjectForm) WTransformerFactory.objToForm( ProjectConfTransformer.class, result );
// on affecte l'id de l'application
newProjectForm.setApplicationId( applicationForm.getApplicationId() );
}
}
// Si il n'est pas supprim�, on l'ajoute
if ( newProjectForm.getStatus() != ProjectBO.DELETED )
{
newProjects.add( newProjectForm );
}
saveMessages( pRequest, messages );
}
// V�rification de la s�lection
if ( cpt < 1 )
{
ActionError error = new ActionError( "error.invalid_projects_selection" );
errors.add( "invalid.selection", error );
}
else
{
LogonBean user = (LogonBean) getWILogonBean( pRequest );
// On enregistre les param�tres de derni�res modifications pour l'application
ac.execute( "updateLastModifParams", new Object[] {
new Long( Long.parseLong( applicationForm.getApplicationId() ) ), user.getMatricule(),
Calendar.getInstance().getTime() } );
// On recharge l'application en session
ApplicationConfDTO applicationDTO =
(ApplicationConfDTO) WTransformerFactory.formToObj( ApplicationConfTransformer.class,
applicationForm )[0];
applicationDTO =
(ApplicationConfDTO) ac.execute( "getApplicationConf", new Object[] { applicationDTO } );
applicationForm =
(CreateApplicationForm) WTransformerFactory.objToForm( ApplicationConfTransformer.class,
applicationDTO );
pRequest.getSession().setAttribute( "createApplicationForm", applicationForm );
ActionUtils.refreshUser( pRequest );
}
applicationForm.setProjects( newProjects );
forward = pMapping.findForward( "application_summary" );
}
catch ( Exception e )
{
// Traitement factoris� des exceptions
handleException( e, errors, pRequest );
// Routage vers la page d'erreur
forward = pMapping.findForward( "total_failure" );
}
if ( !errors.isEmpty() )
{
// Enregistrement du message et routage vers la page d'erreur
saveErrors( pRequest, errors );
}
return forward;
}
/**
* Ajoute un audit de suivi � r�aliser sur l'application.
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward addMilestone( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
// Pr�paration de l'audit
AuditDTO audit = (AuditDTO) WTransformerFactory.formToObj( AuditTransformer.class, (AuditForm) pForm )[0];
// Placement des champs non d�finis dans le formulaire
audit.setType( AuditBO.MILESTONE );
if ( null == audit.getHistoricalDate() )
{
// On affecte la date du jour
Calendar today = GregorianCalendar.getInstance();
audit.setHistoricalDate( today.getTime() );
}
CreateApplicationForm application =
(CreateApplicationForm) pRequest.getSession().getAttribute( "createApplicationForm" );
audit.setApplicationId( new Long( application.getApplicationId() ).longValue() );
// Obtention de l'AC
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
Object[] paramIn = { audit };
forward = pMapping.findForward( "success" );
// Ex�cution de l'AC en v�rifiant que l'insertion s'est bien pass�e
AuditDTO result = (AuditDTO) ac.execute( "addMilestone", paramIn );
if ( null == result )
{
// L'audit n'a pas un nom correct ou l'ex�cution dans la base pose probl�me
// On renvoie un message d'erreur neutre
ActionMessage error = new ActionMessage( "error.application.audit.not_saved" );
errors.add( "milestoneMsg", error );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "failure" );
}
else
{
ActionMessage message = new ActionMessage( "info.audit_created", result.getName() );
errors.add( "milestoneMsg", message );
saveMessages( pRequest, errors );
// Mise � jour du form dans la session
application.setMilestoneAudit( result );
pRequest.getSession().setAttribute( "createApplicationForm", application );
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* Ajoute un audit de suivi � r�aliser sur l'application. Les �ventuels audits de suivi programm�s sont supprim�s au
* profit du nouvel audit cr��
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward addBranch( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
AuditDTO lAuditDTO =
(AuditDTO) WTransformerFactory.formToObj( AuditTransformer.class, (WActionForm) pForm )[0];
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
Object[] paramIn = { lAuditDTO };
lAuditDTO = (AuditDTO) ac.execute( "addBranch", paramIn );
if ( lAuditDTO != null )
{
// mise � jour de la date de l'audit de suivi programm� dans le formulaire
AuditForm lAuditForm =
(AuditForm) WTransformerFactory.objToForm( AuditTransformer.class, new Object[] { lAuditDTO } );
pRequest.getSession().setAttribute( "auditForm2", lAuditForm );
forward = pMapping.findForward( "success" );
errors.add( "branchMsg", new ActionMessage( "info.audit_branch_created" ) );
}
else
{
forward = pMapping.findForward( "failure" );
errors.add( "branchMsg", new ActionMessage( "error.application.audit.not_saved" ) );
}
saveMessages( pRequest, errors );
}
catch ( Exception e )
{
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
/**
* Supprime l'audit de jalon programm� pour l'application.
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward deleteMilestone( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
// R�cup�ration de l'application
CreateApplicationForm applicationForm =
(CreateApplicationForm) pRequest.getSession().getAttribute( "createApplicationForm" );
Long auditId = new Long( applicationForm.getMilestoneAudit().getId() ); // Obtention de l'AC
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
Object[] paramIn = { auditId };
forward = pMapping.findForward( "success" );
// Ex�cution de l'AC en v�rifiant que la suppression c'est bien effectu�e
if ( ( (Integer) ac.execute( "removeAudit", paramIn ) ).intValue() == 1 )
{
// L'ex�cution dans la base pose probl�me
// On renvoie un message d'erreur neutre
ActionMessage error = new ActionMessage( "error.application.audit.not_deleted" );
errors.add( "milestoneMsg", error );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "failure" );
}
else
{
ActionMessage message =
new ActionMessage( "info.audit_removed", applicationForm.getMilestoneAudit().getName() );
// Mise � jour du form dans la session
applicationForm.resetMilestoneAudit();
pRequest.getSession().setAttribute( "createApplicationForm", applicationForm );
errors.add( "milestoneMsg", message );
saveMessages( pRequest, errors );
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* Modifie l'audit de jalon programm� pour l'application.
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward modifyMilestone( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
try
{
// R�cup�ration de l'id de l'audit
CreateApplicationForm applicationForm =
ManageApplicationUtils.getCreateApplicationForm( ( (AuditForm) pForm ).getApplicationId(), pRequest );
long auditId = applicationForm.getMilestoneAudit().getId();
// Pr�paration de l'audit
AuditDTO auditDTO =
(AuditDTO) WTransformerFactory.formToObj( AuditTransformer.class, (WActionForm) pForm )[0];
auditDTO.setID( auditId );
auditDTO.setStatus( AuditBO.NOT_ATTEMPTED );
auditDTO.setType( AuditBO.MILESTONE );
if ( null == auditDTO.getHistoricalDate() )
{
// On affecte la date du jour
Calendar today = GregorianCalendar.getInstance();
auditDTO.setHistoricalDate( today.getTime() );
}
// Obtention de l'AC
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
Object[] paramIn = { auditDTO };
forward = pMapping.findForward( "success" );
// Ex�cution de l'AC
AuditDTO result = (AuditDTO) ac.execute( "modifyAudit", paramIn );
if ( null == result )
{
// L'ex�cution dans la base pose probl�me
// On renvoie un message d'erreur neutre
ActionMessage error = new ActionMessage( "error.application.audit.not_modified" );
errors.add( "milestoneMsg", error );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "failure" );
}
else
{
ActionMessage message = new ActionMessage( "info.audit_modified", result.getName() );
errors.add( "milestoneMsg", message );
saveMessages( pRequest, errors );
// Mise � jour du form dans la session
applicationForm.setMilestoneAudit( result );
pRequest.getSession().setAttribute( "createApplicationForm", applicationForm );
}
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* Permet de v�rifier que tous les champs sont renseign�s dans le premier formulaire d'ajout de projets.
*
* @param pProjectForm formulaire de projet en cr�ation
* @return la validit� du formulaire.
*/
private boolean checkProjectForm( final CreateProjectForm pProjectForm )
{
// V�rification du nom de projet non vide,
// du profil et du source management du projet
return ( pProjectForm.getProjectName().trim().length() > 0 )
&& ( pProjectForm.getProfile().trim().length() > 0 )
&& ( pProjectForm.getSourceManagement().trim().length() > 0 );
}
/**
* V�rifie si le projet existe d�j�, ou sinon, si son nom est disponible.
*
* @param pProject le projet.
* @param pRequest la requete http
* @return la validit� du projet
* @throws WTransformerException si erreur dans la transformation
* @throws JrafEnterpriseException si erreur JRAF
*/
private boolean isNameAvailable( CreateProjectForm pProject, HttpServletRequest pRequest )
throws JrafEnterpriseException, WTransformerException
{
// On r�cup�re l'application courant
CreateApplicationForm appliForm =
ManageApplicationUtils.getCreateApplicationForm( pProject.getApplicationId(), pRequest );
List projects = appliForm.getProjects();
boolean isNameAvailable = true;
// D�ja si le nom du projet n'est pas correct, on renvoie true pour que le projet ne soit pas persist�
if ( checkProjectForm( pProject ) )
{
// Si le projet n'a jamais �t� persist�e, on v�rifie que son nom est disponible
CreateProjectForm project = null;
for ( int i = 0; i < projects.size() && isNameAvailable; i++ )
{
project = (CreateProjectForm) projects.get( i );
// le nom est disponible si :
// ce n'est pas le meme nom
// ou c'est le meme nom mais avec le meme id (on modifie un projet d�j� existant)
isNameAvailable =
( !project.getProjectName().equals( pProject.getProjectName() ) )
|| ( project.getProjectName().equals( pProject.getProjectName() ) && project.getProjectId().equals(
pProject.getProjectId() ) );
if ( project.getProjectId().equals( "-1" ) )
{
// Le nom est disponible puisque le projet n'a pas persist�.
// Par contre il faut supprimer le projet dans la liste
isNameAvailable = !isNameAvailable;
projects.remove( i );
}
}
}
// par apport au nom de la m�thode faut renvoyer le contraire
return isNameAvailable;
}
/**
* Confirmation fot deleting (not physically) an application
*
* @param pMapping mapping.
* @param pForm bean
* @param pRequest HTTP request.
* @param pResponse servlet response.
* @return action to realize.
*/
public ActionForward deleteConfirm( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
pRequest.setAttribute( "hide", "true" );
return pMapping.findForward( "application_confirm_purge" );
}
/**
* Confirmation de purge d'une application. La purge d'une application se fait apr�s avoir eu une confirmation de
* celle-ci
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward purgeConfirm( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
return pMapping.findForward( "application_confirm_purge" );
}
/**
* Hide an application for not admin users without delete it physically: - remove users - if it's public, becomes
* private - disactive audits - delete current not attempted audits - rename application like
* applicationName(year)(month)(day)(hour)(minute)
*
* @param pMapping mapping
* @param pForm bean
* @param pRequest request
* @param pResponse response
* @return action to do
*/
public ActionForward deleteApplication( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward;
try
{
// Pr�paration de l'application
CreateApplicationForm form = (CreateApplicationForm) pForm;
ApplicationConfDTO applicationConf = new ApplicationConfDTO();
applicationConf.setId( new Long( form.getApplicationId() ).longValue() );
applicationConf.setName( form.getApplicationName() );
// Purge de l'application
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Purge" );
Object[] paramIn = { applicationConf };
ac.execute( "hideApplication", paramIn );
// Envoi d'un mail aux administrateurs et aux gestionnaires de l'application pour leur signaler
// qu'une application a �t� supprim�e
String sender = WebMessages.getString( getLocale( pRequest ), "mail.sender.squale" );
String header = WebMessages.getString( getLocale( pRequest ), "mail.header" );
String object = sender + WebMessages.getString( pRequest, "mail.appli.deleted.object" );
SimpleDateFormat formator =
new SimpleDateFormat( WebMessages.getString( getLocale( pRequest ), "date.format.simple" ) );
String today = formator.format( Calendar.getInstance().getTime() );
LogonBean identifiedUser = (LogonBean) getWILogonBean( pRequest );
Object[] params = { form.getApplicationName(), today, identifiedUser.getMatricule() };
String content =
header + MessageFormat.format( WebMessages.getString( pRequest, "mail.appli.deleted.content" ), params );
content += "\n\n" + WebMessages.getString( pRequest, "mail.appli.deleted.content.users" );
// On affiche les utilisateurs de l'application
for ( Iterator it = form.getRights().keySet().iterator(); it.hasNext(); )
{
String user = (String) it.next();
content +=
"\n" + user + " - "
+ WebMessages.getString( getLocale( pRequest ), (String) form.getRights().get( user ) );
}
SqualeCommonUtils.notifyByEmail( MailerHelper.getMailerProvider(),
SqualeCommonConstants.MANAGERS_AND_ADMINS,
new Long( applicationConf.getId() ), object, content, false );
forward = applicationEndPurge( pMapping, pRequest, errors, form, applicationConf );
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
/**
* Purge d'une application.
*
* @param pMapping le mapping.
* @param pForm le formulaire � lire.
* @param pRequest la requ�te HTTP.
* @param pResponse la r�ponse de la servlet.
* @return l'action � r�aliser.
*/
public ActionForward purge( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward;
try
{
// Pr�paration de l'application
CreateApplicationForm form = (CreateApplicationForm) pForm;
ApplicationConfDTO applicationConf = new ApplicationConfDTO();
applicationConf.setId( new Long( form.getApplicationId() ).longValue() );
applicationConf.setName( form.getApplicationName() );
// Purge de l'application
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Purge" );
Object[] paramIn = { applicationConf };
ac.execute( "purgeApplication", paramIn );
// Envoi d'un mail aux administrateurs et aux gestionnaires de l'application pour leur signaler
// qu'une application a �t� supprim�e
String sender = WebMessages.getString( getLocale( pRequest ), "mail.sender.squale" );
String header = WebMessages.getString( getLocale( pRequest ), "mail.header" );
String object = sender + WebMessages.getString( pRequest, "mail.appli.deleted.object" );
SimpleDateFormat formator =
new SimpleDateFormat( WebMessages.getString( getLocale( pRequest ), "date.format.simple" ) );
String today = formator.format( Calendar.getInstance().getTime() );
LogonBean identifiedUser = (LogonBean) getWILogonBean( pRequest );
Object[] params = { form.getApplicationName(), today, identifiedUser.getMatricule() };
String content =
header + MessageFormat.format( WebMessages.getString( pRequest, "mail.appli.deleted.content" ), params );
content += "\n\n" + WebMessages.getString( pRequest, "mail.appli.deleted.content.users" );
// On affiche les utilisateurs de l'application
for ( Iterator it = form.getRights().keySet().iterator(); it.hasNext(); )
{
String user = (String) it.next();
content +=
"\n" + user + " - "
+ WebMessages.getString( getLocale( pRequest ), (String) form.getRights().get( user ) );
}
SqualeCommonUtils.notifyByEmail( MailerHelper.getMailerProvider(),
SqualeCommonConstants.MANAGERS_AND_ADMINS,
new Long( applicationConf.getId() ), object, content, false );
forward = applicationEndPurge( pMapping, pRequest, errors, form, applicationConf );
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
/**
* Common forward for purge
*
* @param pMapping mapping
* @param pRequest request
* @param pErrors errors
* @param pForm bean
* @param pApplicationConf application configuration (DTO)
* @return action forward
* @throws JrafEnterpriseException if JRAF error
* @throws WTransformerException if Transformation error
*/
private ActionForward applicationEndPurge( ActionMapping pMapping, HttpServletRequest pRequest,
ActionMessages pErrors, CreateApplicationForm pForm,
ApplicationConfDTO pApplicationConf )
throws JrafEnterpriseException, WTransformerException
{
ActionForward forward;
// On recharge les profils de l'utilisateur
ActionUtils.refreshUser( pRequest );
// On place un message de confirmation de la purge
ActionMessage message = new ActionMessage( "info.purge_application", pApplicationConf.getName() );
pErrors.add( ActionMessages.GLOBAL_MESSAGE, message );
saveMessages( pRequest, pErrors );
// On redirige vers la page de fin de purge d�pendant du statut de l'application et de l'utilisateurs
// lors de la suppression
LogonBean user = (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY );
if ( ApplicationBO.IN_CREATION == pForm.getStatus() && user.isAdmin() )
{
forward = pMapping.findForward( "ack_application_end_purge" );
}
else
{
forward = pMapping.findForward( "application_end_purge" );
}
return forward;
}
/**
* Enregistrement en session du dernier audit de suivi programm�
*
* @param pRequest la requ�te HTTP
* @param pApplicationId l'id de l'application
* @throws Exception une exception
*/
private void loadLastBranchAuditInSession( HttpServletRequest pRequest, long pApplicationId )
throws Exception
{
AuditForm lAuditForm = null;
final AuditDTO lAuditDTO = ManageApplicationUtils.getLastNotAttemptedAudit( pApplicationId );
if ( lAuditDTO != null )
{
lAuditForm = (AuditForm) WTransformerFactory.objToForm( AuditTransformer.class, new Object[] { lAuditDTO } );
}
pRequest.getSession().setAttribute( "auditForm2", lAuditForm );
}
/**
* Method called to fill the suggest input field when adding a user to an application. The "ch" parameter passed
* along the request gives the string that the user has just typed in.
*
* @param mapping the mapping.
* @param form the form
* @param request the HTTP request.
* @param response the servlet response.
* @return null (because the response is an XML stream)
*/
public ActionForward findUserForAutocomplete( final ActionMapping mapping, final ActionForm form,
final HttpServletRequest request, final HttpServletResponse response )
{
// retrieves the string that the user has just typed in
String stringFirstChars = request.getParameter( "ch" );
stringFirstChars = WEasyCompleteUtil.filter( stringFirstChars ).toLowerCase();
// create the response object
WHttpEasyCompleteResponse easyComplete = new WHttpEasyCompleteResponse( response );
// and fill it with the users' information
if ( stringFirstChars.length() > 0 )
{
Collection<UserDTO> foundUsers = UserBeanAccessorHelper.getUserBeanAccessor().getUsers( stringFirstChars );
for ( UserDTO user : foundUsers )
{
String value = user.getMatricule();
String label = user.getFullName();
easyComplete.addValueLabel( value, label );
}
}
// now return the response
try
{
easyComplete.close();
}
catch ( IOException e )
{
// there's nothing we can do about it, forget it
}
return null;
}
}