/**
* 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.results.audit;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.AuditDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squaleweb.applicationlayer.action.accessRights.ManagerAction;
import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationErrorForm;
import org.squale.squaleweb.applicationlayer.formbean.component.AuditForm;
import org.squale.squaleweb.applicationlayer.formbean.component.SplitAuditsListForm;
import org.squale.squaleweb.transformer.AuditTransformer;
import org.squale.squaleweb.util.SqualeWebActionUtils;
import org.squale.squaleweb.util.SqualeWebConstants;
import org.squale.welcom.struts.transformer.WTransformerException;
import org.squale.welcom.struts.transformer.WTransformerFactory;
/**
*/
public class ManagerAuditAction
extends ManagerAction
{
/**
* Permet la purge d'audits.
*
* @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 )
{
ActionErrors errors = new ActionErrors();
ActionMessages messages = new ActionMessages();
ActionForward forward = pMapping.findForward( "purgeError" );
try
{
// R�cup�ration des audits s�lectionn�s par checkbox
SplitAuditsListForm form = (SplitAuditsListForm) pForm;
ArrayList auditsSelected = new ArrayList();
auditsSelected.addAll( new AuditUtils().getSelection( form.getAudits() ) );
// Si la purge s'est bien pass�e, on foraward vers une pages r�capitulative des purges
if ( purge( form.getApplicationName(), auditsSelected, form.getAudits(), pRequest, messages ) )
{
forward = pMapping.findForward( "purge" );
saveMessages( pRequest, messages );
// On met en attribut de requ�te l'action appelante pour le bouton retour
// Il y a au moins un audit, on le r�cup�re pour avoir les informations
AuditForm audit = (AuditForm) form.getAudits().get( 0 );
pRequest.setAttribute( SqualeWebConstants.RETURN_ACTION_KEY, "audits.do?action=list&kind="
+ SqualeWebActionUtils.getAuditKind( audit.getStatus() ) + "&applicationId="
+ audit.getApplicationId() );
}
}
catch ( Exception e )
{
handleException( e, errors, pRequest );
}
if ( !errors.isEmpty() )
{
// Enregistrement du message et routage vers la page d'erreur
saveErrors( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
/**
* Permet la purge d'audits en cours
*
* @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 purgeRunningAudits( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionErrors errors = new ActionErrors();
ActionMessages messages = new ActionMessages();
ActionForward forward = pMapping.findForward( "purgeInvalid" );
try
{
// R�cup�ration des audits s�lectionn�s par checkbox
SplitAuditsListForm form = (SplitAuditsListForm) pForm;
ArrayList auditsSelected = new ArrayList();
auditsSelected.addAll( new AuditUtils().getSelection( form.getShutDownAudits() ) );
if ( purge( form.getApplicationName(), auditsSelected, form.getShutDownAudits(), pRequest, messages ) )
{
forward = pMapping.findForward( "purge" );
// On met en attribut de requ�te l'action appelante pour le bouton retour
pRequest.setAttribute( SqualeWebConstants.RETURN_ACTION_KEY,
"adminNotAttemptedAudit.do?action=displayNotAttemptedAndRunning" );
}
}
catch ( Exception e )
{
handleException( e, errors, pRequest );
}
if ( !errors.isEmpty() )
{
// Enregistrement du message et routage vers la page d'erreur
saveErrors( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
/**
* M�thode permettant de factoriser le code de v�rification de la s�lection et le code de suppression des diff�rents
* audits
*
* @param pApplicationName le nom de l'application
* @param pSelectedAudit la liste des audits � purger
* @param pCurrentAuditsList la liste correspondante au niveau du form
* @param pRequest la requete http
* @param messages les messages
* @return true si la s�lection pour la purge est correcte : * Il faut au moins un audit * on doit garder au moins
* un audit termin�
* @throws JrafEnterpriseException en cas d'�chec de r�cup�ration des donn�es
* @throws WTransformerException en cas de probl�me de transformation
*/
private boolean purge( String pApplicationName, List pSelectedAudit, List pCurrentAuditsList,
HttpServletRequest pRequest, ActionMessages messages )
throws JrafEnterpriseException, WTransformerException
{
ActionMessage message = null;
boolean selectionOk = true;
// On doit s�lectionn� au moins un audit pour que la s�lection
if ( pSelectedAudit.size() < 1 )
{
message = new ActionMessage( "error.invalid_audits_purge_selection" );
messages.add( ActionMessages.GLOBAL_MESSAGE, message );
selectionOk = false;
}
else
{
// On doit garder au moins un audit termin�
if ( ( (AuditForm) pSelectedAudit.get( 0 ) ).getStatus() == AuditBO.TERMINATED )
{
if ( pCurrentAuditsList.size() == pSelectedAudit.size() )
{
message = new ActionMessage( "error.invalid_terminated_audits_purge_selection" );
messages.add( ActionMessages.GLOBAL_MESSAGE, message );
selectionOk = false;
}
}
}
if ( message == null )
{
// La s�lection est forc�ment valide ici
// Parcours de la s�lection et purge de chaque audit
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Purge" );
Object[] paramIn = { null };
Iterator iterator = pSelectedAudit.iterator();
// On purge les audits un par un
// et on cr�e le message de confirmation
while ( iterator.hasNext() )
{
AuditForm auditForm = (AuditForm) iterator.next();
AuditDTO auditDTO = (AuditDTO) WTransformerFactory.formToObj( AuditTransformer.class, auditForm )[0];
paramIn[0] = auditDTO;
ac.execute( "purgeAudit", paramIn );
// Construction d'un message de confirmation pour chaque
// audit purg�
// Le message affichera la date de r�alisation de l'audit
SimpleDateFormat format = new SimpleDateFormat( "EEE d MMM yyyy", pRequest.getLocale() );
String date = format.format( auditDTO.getRealDate() );
// Si il s'agit d'un audit de jalon, on rajoute le label entre parenth�ses
if ( auditDTO.getType().equals( AuditBO.MILESTONE ) && auditDTO.getName() != null )
{
date += " (" + auditDTO.getName() + ")";
}
String appliName =
( null == auditForm.getApplicationName() ) ? pApplicationName : auditForm.getApplicationName();
message = new ActionMessage( "info.purge_audit", new Object[] { appliName, date } );
messages.add( ActionMessages.GLOBAL_MESSAGE, message );
}
}
// sauvegarde les messages
saveMessages( pRequest, messages );
return selectionOk;
}
/**
* Permet la purge d'un audit en echec.
*
* @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 purgeFailedAudit( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionErrors errors = new ActionErrors();
ActionForward forward = new ActionForward();
try
{
// R�cup�ration de l'audit concern�
ApplicationErrorForm form = (ApplicationErrorForm) pForm;
ActionErrors messages = new ActionErrors();
// Purge de l'audit
IApplicationComponent ac = AccessDelegateHelper.getInstance( "Purge" );
Object[] paramIn = { null };
AuditDTO auditDTO = new AuditDTO();
auditDTO.setID( form.getAuditId() );
paramIn[0] = auditDTO;
ac.execute( "purgeAudit", paramIn );
// Construction d'un message de confirmation pour
// l'audit purg�
String appliName = (String) pRequest.getParameter( "applicationName" );
String date = (String) pRequest.getParameter( "auditDate" );
ActionMessage message = new ActionMessage( "info.purge_failed_audit", appliName, date );
messages.add( ActionMessages.GLOBAL_MESSAGE, message );
saveMessages( pRequest, messages );
forward = pMapping.findForward( "purge" );
// On met en attribut de requ�te l'action appelante pour le bouton retour
String oldAuditId = pRequest.getParameter( "oldAuditId" );
if ( null != oldAuditId && !oldAuditId.equals( "none" ) )
{
// On vient de la liste des audits en echec d'une application
String oldPAuditId = pRequest.getParameter( "oldPreviousAuditId" );
pRequest.setAttribute( SqualeWebConstants.RETURN_ACTION_KEY,
"audits.do?action=list&kind=failed&applicationId="
+ form.getApplicationId() + "¤tAuditId=" + oldAuditId
+ "&previousAuditId=" + oldPAuditId );
}
else
{
// On retourne sur la page d'accueil
pRequest.setAttribute( SqualeWebConstants.RETURN_ACTION_KEY, "index.do" );
}
}
catch ( Exception e )
{
handleException( e, errors, pRequest );
}
if ( !errors.isEmpty() )
{
// Enregistrement du message et routage vers la page d'erreur
saveErrors( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
/**
* Permet de reprogrammer un audit.
*
* @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 restart( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionErrors errors = new ActionErrors();
ActionForward forward = new ActionForward();
try
{
// R�cup�ration de l'audit concern�
ApplicationErrorForm form = (ApplicationErrorForm) pForm;
ActionErrors messages = new ActionErrors();
// Purge de l'audit
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
Object[] paramIn = { null };
AuditDTO auditDTO = new AuditDTO();
auditDTO.setID( form.getAuditId() );
// On r�cup�re l'id de l'application sur laquelle l'audit � �t� r�alis�
String appliId = (String) pRequest.getParameter( "applicationId" );
// On affecte l'id de l'application au dto
auditDTO.setApplicationId( Integer.parseInt( appliId ) );
paramIn[0] = auditDTO;
AuditDTO newAudit = (AuditDTO) ac.execute( "restartAudit", paramIn );
// Construction d'un message de confirmation pour
// l'audit purg�
ActionMessage message = null;
if ( null != newAudit )
{
message = new ActionMessage( "info.restart_failed_audit" );
}
else
{
message = new ActionMessage( "error.restart_failed_audit" );
}
messages.add( ActionMessages.GLOBAL_MESSAGE, message );
saveMessages( pRequest, messages );
forward = pMapping.findForward( "restart" );
}
catch ( Exception e )
{
handleException( e, errors, pRequest );
}
if ( !errors.isEmpty() )
{
// Enregistrement du message et routage vers la page d'erreur
saveErrors( pRequest, errors );
forward = pMapping.findForward( "total_failure" );
}
return forward;
}
}