/**
* 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.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.ProjectConfDTO;
import org.squale.squalecommon.datatransfertobject.component.parameters.ListParameterDTO;
import org.squale.squalecommon.datatransfertobject.component.parameters.MapParameterDTO;
import org.squale.squalecommon.datatransfertobject.component.parameters.StringParameterDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO;
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.creation.CreateApplicationForm;
import org.squale.squaleweb.applicationlayer.formbean.creation.CreateProjectForm;
import org.squale.squaleweb.resources.WebMessages;
import org.squale.squaleweb.transformer.ProjectConfTransformer;
import org.squale.squaleweb.util.SqualeWebConstants;
import org.squale.welcom.struts.transformer.WTransformerException;
import org.squale.welcom.struts.transformer.WTransformerFactory;
import org.squale.welcom.struts.util.WConstants;
/**
* @version 1.0
* @author
*/
public class CreateProjectAction
extends ReaderAction
{
/**
* M�thode permettant de factoriser la r�cup�ration 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 le projet
* @throws JrafEnterpriseException en cas d'�chec
* @throws WTransformerException si erreur lors de la transformation
*/
private CreateProjectForm getProject( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
throws JrafEnterpriseException, WTransformerException
{
// On r�cup�re l'id du projet
String projectId = pRequest.getParameter( "projectId" );
// On supprime le projet en session
pRequest.getSession().removeAttribute( "createProjectForm" );
CreateProjectForm project = null;
if ( null != projectId )
{
// Si l'id du projet est renseign�, on modifie les attributs
// en session pour qu'ils correspondent � ceux du projet
setProfiles( pRequest );
setSourceManagements( pRequest );
// On r�cup�re l'application correspondant au projet et on la place en session
CreateApplicationForm application =
ManageApplicationUtils.getCreateApplicationForm( ( (CreateProjectForm) pForm ).getApplicationId(),
pRequest );
List projects = application.getProjects();
// Recherche du projet dans la liste des projets
// au niveau de l'application
for ( int i = 0; null == project && i < projects.size(); i++ )
{
project = (CreateProjectForm) projects.get( i );
// Tant qu'on a pas trouv� le projet, project reste � null
// et on continue la recherche
if ( new Long( project.getProjectId() ).longValue() == Long.parseLong( projectId ) )
{
// On passe tous les id des param�tres � -1 pour pouvoir
// faire un update
changeMapParametersId( (MapParameterDTO) project.getParameters() );
// On enregistre le projet en session
pRequest.getSession().setAttribute( "createProjectForm", project );
}
else
{
project = null;
}
}
}
return project;
}
/**
* Permet de s�lectionner le projet dont on veux modifier la 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 selectProjectToModify( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
CreateProjectForm project = null;
try
{
project = getProject( pMapping, pForm, pRequest, pResponse );
if ( null != project )
{
forward = pMapping.findForward( "project" );
pRequest.getSession().setAttribute( "modification", "true" );
// Add an user access for this application
addUserAccess( pRequest, Long.parseLong( project.getApplicationId() ) );
}
else
{
// Projet non trouv�
ActionMessage error = new ActionMessage( "error.project_not_got" );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
forward = pMapping.findForward( "application" );
}
}
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() )
{
saveMessages( pRequest, errors );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* Permet de s�lectionner le projet dont on veux voir la 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 selectProjectToView( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
CreateProjectForm project = null;
try
{
project = getProject( pMapping, pForm, pRequest, pResponse );
if ( null != project )
{
forward = pMapping.findForward( "project" );
if ( null != pRequest.getParameter( "modification" ) )
{
pRequest.setAttribute( "modification", "true" );
}
else
{
pRequest.getSession().removeAttribute( "modification" );
}
}
else
{
// Projet non trouv�
ActionMessage error = new ActionMessage( "error.project_not_got" );
errors.add( ActionMessages.GLOBAL_MESSAGE, error );
forward = pMapping.findForward( "application" );
}
}
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() )
{
saveMessages( pRequest, errors );
}
// On est pass� par un menu donc on r�initialise le traceur
resetTracker( pRequest );
return forward;
}
/**
* Change l'id des param�tres � -1 pour �viter les conflit lors de l'enregistrement en base
*
* @param pParams la map de param�tres
*/
private void changeMapParametersId( MapParameterDTO pParams )
{
pParams.setId( -1 );
Map mapParam = pParams.getParameters();
// On r�cup�re toutes les cl�s des param�tres
java.util.Set keys = mapParam.keySet();
Iterator it = keys.iterator();
String currentKey;
// On parcours la map des param�tres afin de changer tous les id
// de tous les param�tres stock�s dans la map
while ( it.hasNext() )
{
currentKey = (String) it.next();
// Si le param�tre est de type Map ou List, il faut changer les id
// des param�tres qu'il contient
if ( mapParam.get( currentKey ) instanceof MapParameterDTO )
{
changeMapParametersId( (MapParameterDTO) mapParam.get( currentKey ) );
}
else
{
if ( mapParam.get( currentKey ) instanceof ListParameterDTO )
{
changeListParametersId( (ListParameterDTO) mapParam.get( currentKey ) );
}
else
{
// Si le param�tre est de type String, on change l'id directement
if ( mapParam.get( currentKey ) instanceof StringParameterDTO )
{
( (StringParameterDTO) mapParam.get( currentKey ) ).setId( -1 );
}
}
}
}
}
/**
* Change l'id des param�tres � -1 pour �viter les conflit lors de l'enregistrement en base
*
* @param pParams la liste de param�tres
*/
private void changeListParametersId( ListParameterDTO pParams )
{
pParams.setId( -1 );
List listParam = pParams.getParameters();
// On parcours la liste des param�tres afin de changer tous les id
// de tous les param�tres stock�s dans la liste
for ( int i = 0; i < listParam.size(); i++ )
{
// Si le param�tre est de type Map ou List, il faut changer les id
// des param�tres qu'il contient
if ( listParam.get( i ) instanceof MapParameterDTO )
{
changeMapParametersId( (MapParameterDTO) listParam.get( i ) );
}
else
{
if ( listParam.get( i ) instanceof ListParameterDTO )
{
changeListParametersId( (ListParameterDTO) listParam.get( i ) );
}
else
{
// Si le param�tre est de type String, on change l'id directement
if ( listParam.get( i ) instanceof StringParameterDTO )
{
( (StringParameterDTO) listParam.get( i ) ).setId( -1 );
}
}
}
}
}
/**
* Positionnement des profiles
*
* @param pRequest requ�te
* @throws JrafEnterpriseException si erreur
*/
private void setProfiles( HttpServletRequest pRequest )
throws JrafEnterpriseException
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "SqualixConfig" );
pRequest.getSession().setAttribute( "profiles", ac.execute( "getProfiles" ) );
}
/**
* Positionnement des outils de r�cup�ration des sources
*
* @param pRequest requ�te
* @throws JrafEnterpriseException si erreur
*/
private void setSourceManagements( HttpServletRequest pRequest )
throws JrafEnterpriseException
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "SqualixConfig" );
pRequest.getSession().setAttribute( "sourceManagements", ac.execute( "getSourceManagements" ) );
}
/**
* Cr�ation d'un nouveau 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 newProject( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionForward forward = null;
ActionMessages errors = new ActionMessages();
try
{
setProfiles( pRequest );
setSourceManagements( pRequest );
( (CreateProjectForm) pForm ).reset();
// On remet � jour le form en session avec les donn�es pass�es en requete
String applicationId = (String) pRequest.getParameter( "applicationId" );
( (CreateProjectForm) pForm ).setApplicationId( applicationId );
ManageApplicationUtils.getCreateApplicationForm( applicationId, pRequest );
forward = pMapping.findForward( "project" );
}
catch ( Exception e )
{
// Traitement factoris� des exceptions
handleException( e, errors, pRequest );
// Routage vers la page d'erreur
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
/**
* Sauvegarde le 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 saveProject( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
CreateProjectForm project = (CreateProjectForm) pForm;
try
{
ProjectConfDTO dto =
(ProjectConfDTO) WTransformerFactory.formToObj( ProjectConfTransformer.class, project )[0];
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
// On r�cup�re en base le bon objet ApplicationConfDTO car celui en session n'est pas forc�ment le bon
// car on a pu faire des backs
ApplicationConfDTO applicationDTO = new ApplicationConfDTO();
applicationDTO.setId( new Long( project.getApplicationId() ).longValue() );
applicationDTO = (ApplicationConfDTO) ac.execute( "getApplicationConf", new Object[] { applicationDTO } );
// On change le nom de l'utilisateur et la date de derni�re modification en cas
applicationDTO.setLastUser( ( (LogonBean) pRequest.getSession().getAttribute( WConstants.USER_KEY ) ).getMatricule() );
applicationDTO.setLastUpdate( Calendar.getInstance().getTime() );
Object[] paramIn = { dto, applicationDTO };
String action =
"/manageApplication.do?" + "action=selectApplicationToConfig&applicationId=" + applicationDTO.getId();
forward = new ActionForward( action );
// Appel de la couche m�tier
dto = (ProjectConfDTO) ac.execute( "saveProject", paramIn );
if ( dto != null )
{
project.setProjectId( "" + dto.getId() );
// permet d'envoyer un mail si un nouveau projet est cr�e
manageMailforProjectCreation( pRequest, applicationDTO, project );
}
// On recharge les profils de l'utilisateur
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;
}
/**
* M�thode permettant d'envoyer un mail dans le cas d'un nouveau projet
*
* @param pRequest la requete http
* @param pApplicationDTO l'application courante
* @param pProject le projet courant
*/
private void manageMailforProjectCreation( HttpServletRequest pRequest, ApplicationConfDTO pApplicationDTO,
CreateProjectForm pProject )
{
// Si l'application est valid�e et que c'est un nouveau projet, alors on avertit les administrateurs qu'un
// nouveau projet a �t� ajout�
// � une application d�j� valid�e
if ( pRequest.getSession().getAttribute( SqualeWebConstants.NEW_PROJECT ) != null
&& pApplicationDTO.getStatus() == ApplicationBO.VALIDATED )
{
String[] params = new String[] { pProject.getProjectName(), pApplicationDTO.getName() };
String sender = WebMessages.getString( getLocale( pRequest ), "mail.sender.squale" );
String header = WebMessages.getString( getLocale( pRequest ), "mail.headerForAdmin" );
String object = sender + WebMessages.getString( pRequest, "mail.project.added.object" );
String content =
header + (String) WebMessages.getString( pRequest.getLocale(), "mail.project.added.content", params );
SqualeCommonUtils.notifyByEmail( MailerHelper.getMailerProvider(), SqualeCommonConstants.ONLY_ADMINS, null,
object, content, false );
// on efface l'attribut
pRequest.getSession().removeAttribute( SqualeWebConstants.NEW_PROJECT );
}
}
}