/**
* 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.mail;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
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.helper.AccessDelegateHelper;
import org.squale.jraf.spi.accessdelegate.IApplicationComponent;
import org.squale.squalecommon.util.SqualeCommonConstants;
import org.squale.squalecommon.util.SqualeCommonUtils;
import org.squale.squalecommon.util.mail.IMailerProvider;
import org.squale.squalecommon.util.mail.MailerHelper;
import org.squale.squaleweb.applicationlayer.action.accessRights.AdminAction;
import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationForm;
import org.squale.squaleweb.applicationlayer.formbean.mails.MailForm;
import org.squale.squaleweb.comparator.ComponentComparator;
import org.squale.squaleweb.resources.WebMessages;
import org.squale.squaleweb.transformer.mails.MailTransformer;
import org.squale.welcom.struts.bean.WActionForm;
import org.squale.welcom.struts.transformer.WTransformerFactory;
/**
*
*/
public class SendMailAction
extends AdminAction
{
/**
* @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 init( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
MailForm form = (MailForm) pForm;
try
{
IApplicationComponent ac = AccessDelegateHelper.getInstance( "ApplicationAdmin" );
Collection appliDtoColl = (Collection) ac.execute( "listAll" );
// On trie la applications par ordre alphab�tique (sans tenit compte de la casse)
ArrayList sortedAppliList = new ArrayList( appliDtoColl );
Collections.sort( sortedAppliList, new ComponentComparator() );
// Transformation en formulaire
WTransformerFactory.objToForm( MailTransformer.class, ( (WActionForm) pForm ), sortedAppliList );
forward = pMapping.findForward( "success" );
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "failure" );
}
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 sendMail( ActionMapping pMapping, ActionForm pForm, HttpServletRequest pRequest,
HttpServletResponse pResponse )
{
// On envoie un email m�me aux utilisateurs d�sabonn�s car il ne s'agit pas d'un email automatique
ActionMessages errors = new ActionMessages();
ActionForward forward = null;
// on enl�ve l'�l�ment qui permettait de ne pas v�rifier que les champs
// �taient remplis suite � l'initialisation pr�alable n�cessaire
pRequest.removeAttribute( "fromMenu" );
try
{
/*
* En attendant un refonte de la gestion de la v�rification des mails on affiche tous les mails des
* gestionnaires pour chaque application
*/
IApplicationComponent acLogin = AccessDelegateHelper.getInstance( "Login" );
ActionMessage listEmailsMsg = new ActionMessage( "mail.send.list_emails_title" );
errors.add( "listEmailsMsg", listEmailsMsg );
MailForm mailForm = (MailForm) pForm;
String appliName = mailForm.getAppliName();
Collection applis = getApplisForEmail( appliName, mailForm.getApplicationFormsList().getList() );
// on pr�fixe le sujet choisis par l'utilisateur par [Squale - <nom application>]
// pour qu'un gestionnaire qui g�re plusieurs applications sache sur quelle application
// le mail porte.
String content =
WebMessages.getString( pRequest, "mail.admin.start.content" ) + mailForm.getContent()
+ WebMessages.getString( pRequest, "mail.admin.end.content" );
// On envoie � toutes les applications ou � celle s�lectionn�e
Long appliId = new Long( -1 );
IMailerProvider mailer = MailerHelper.getMailerProvider();
Iterator appliIt = applis.iterator();
while ( appliIt.hasNext() )
{
// Pour chaque application, on envoie un mail aux managers
ApplicationForm curAppli = (ApplicationForm) appliIt.next();
appliId = new Long( curAppli.getId() );
// On r�cup�re les mails des gestionnaires
Collection managerEmails =
(Collection) acLogin.execute( "getManagersEmails", new Object[] { appliId, Boolean.TRUE } );
// On ajoute au message
listEmailsMsg =
new ActionMessage( "mail.send.list_emails_by_application", new Object[] {
curAppli.getApplicationName(), getFormattedEmails( managerEmails ) } );
errors.add( "listEmailsMsg", listEmailsMsg );
// On ajoute le message de confirmation
String object = "[Squale - <" + curAppli.getApplicationName() + ">] " + mailForm.getObject();
if ( !SqualeCommonUtils.notifyByEmail( mailer, SqualeCommonConstants.ONLY_MANAGERS, appliId, object,
content, true ) )
{
// On le nom de l'application � la liste des non envoy�es pour construire le message
// d'erreur
ActionMessage error = new ActionMessage( "mail.admin.appli", curAppli.getApplicationName() );
errors.add( "errorMsg", error );
}
}
if ( !errors.isEmpty() )
{
// On ajoute le titre pour la liste des applications non envoy�es
ActionMessage errorTitle = new ActionMessage( "mail.admin.no.sent" );
errors.add( "errorTitleMsg", errorTitle );
}
saveMessages( pRequest, errors );
forward = pMapping.findForward( "success" );
}
catch ( Exception e )
{
// Traitement factoris� des exceptions et transfert vers la page d'erreur
handleException( e, errors, pRequest );
saveMessages( pRequest, errors );
forward = pMapping.findForward( "failure" );
}
return forward;
}
/**
* @param managerEmails les emails
* @return les emails format�s sous la forme : email1, email2
*/
private String getFormattedEmails( Collection managerEmails )
{
final String sep = ", ";
String result = "";
StringBuffer emails = new StringBuffer();
for ( Iterator it = managerEmails.iterator(); it.hasNext(); )
{
emails.append( (String) it.next() );
emails.append( sep );
}
result = emails.toString();
if ( result.endsWith( sep ) )
{
int cutId = result.lastIndexOf( sep );
result = result.substring( 0, cutId );
}
return result;
}
/**
* @param appliName le nom de l'application s�lectionn�e
* @param allApplis toutes les applications
* @return les applications qui doivent recevoir l'email
*/
private Collection getApplisForEmail( String appliName, List allApplis )
{
ArrayList applis = new ArrayList( 1 );
Iterator allApplisIt = allApplis.iterator();
if ( !MailForm.ALL_APPLICATIONS.equals( appliName ) )
{
// Il faut rechercher l'application
while ( allApplisIt.hasNext() && applis.size() == 0 )
{
ApplicationForm appliForm = (ApplicationForm) ( allApplisIt.next() );
if ( appliForm.getApplicationName().equals( appliName ) )
{
applis.add( appliForm );
}
}
}
else
{
// On prend toutes les applications
applis = new ArrayList( allApplis );
}
return applis;
}
}