/*
* Created on 21-Mar-2003
*/
package net.sf.jportlet.portlets.login;
import java.util.Locale;
import javax.mail.Address;
import javax.mail.internet.InternetAddress;
import net.sf.jportlet.impl.UserImpl;
import net.sf.jportlet.portlet.Portlet;
import net.sf.jportlet.portlet.PortletContext;
import net.sf.jportlet.portlet.PortletException;
import net.sf.jportlet.portlet.PortletRequest;
import net.sf.jportlet.portlet.PortletURI;
import net.sf.jportlet.portlet.PortletWindow;
import net.sf.jportlet.portlet.User;
import net.sf.jportlet.portlet.event.ActionEvent;
import net.sf.jportlet.portlet.event.ActionListener;
import net.sf.jportlet.portlets.ValidationHelper;
import net.sf.jportlet.service.login.LoginService;
import net.sf.jportlet.service.mail.MailService;
import net.sf.jportlet.service.user.UserEmailNotUniqueException;
import net.sf.jportlet.service.user.UserIdNotUniqueException;
import net.sf.jportlet.service.user.UserNotFoundException;
import net.sf.jportlet.service.user.UserService;
import net.sf.jportlet.util.LocaleHelper;
/**
* @author <a href="mailto:tchbansi@sourceforge.net">Herve Tchepannou</a>
*/
public class LoginActionListener
implements ActionListener
{
//~ Methods ----------------------------------------------------------------
public void actionPerformed( ActionEvent event )
throws PortletException
{
PortletRequest request = event.getPortletRequest( );
String action = event.getAction( );
String command = request.getParameter( "command" );
if ( ActionEvent.ACTION_VIEW.equals( action ) )
{
if ( "signin".equals( command ) )
{
doSignin( event, request );
}
else if ( "myprofile".equals( command ) )
{
doMyProfile( event, request );
}
else if ( "register".equals( command ) )
{
doRegister( event, request );
}
else if ( "logout".equals( command ) )
{
doLogout( event, request );
}
else if ( "login".equals( command ) )
{
doLogin( event, request );
}
else if ( "forgot_password".equals( command ) )
{
doForgotPassword( event, request );
}
else
{
throw new PortletException( "Unknown command: " + action + "/" + command );
}
}
else if ( ActionEvent.ACTION_EDIT.equals( action ) )
{
if ( "save".equals( command ) )
{
doSave( event, request, "true".equals( request.getParameter( "register" ) ) );
}
else if ( "cancel".equals( command ) )
{
doCancel( event, request, "true".equals( request.getParameter( "register" ) ) );
}
else if ( "send_email".equals( command ) )
{
doSendEmail( event, request );
}
else
{
throw new PortletException( "Unknown command: " + action + "/" + command );
}
}
else
{
throw new PortletException( "Unknown action: " + action );
}
}
private void doForgotPassword( ActionEvent event,
PortletRequest request )
{
PortletURI uri = event.getPortletResponse( ).createURI( Portlet.Mode.EDIT, PortletWindow.State.MAXIMIZED );
uri.addParameter( LoginPortlet.KEY_TEMPLATE, "forgot_password.vm" );
event.setNextURI( uri );
}
private void doSendEmail( ActionEvent event,
PortletRequest request )
throws PortletException
{
/* Validation */
String email = request.getParameter( "email" );
if ( email == null )
{
ValidationHelper.addError( "error_email_required", event );
}
if ( event.hasErrors( ) )
{
doForgotPassword( event, request );
return;
}
/* Send */
PortletContext ctx = event.getPortlet( ).getPortletConfig( ).getPortletContext( );
UserService usr = ( UserService ) ctx.getService( UserService.NAME );
try
{
/* Get the user */
UserImpl u = ( UserImpl ) usr.getUserByEmail( email );
/* Generate the email message */
String subject = "Password Requested";
StringBuffer body = new StringBuffer();
body.append( u.getFirstname( ) + " " + u.getLastname( ) + "\n" );
body.append( "Here is your requested password\n" );
body.append( " Login: " + u.getId( ) + "\n" );
body.append( " Password: " + u.getPassword( ) + "\n\n" );
/* Send the message */
MailService mailer = ( MailService ) ctx.getService( MailService.NAME );
mailer.send( null, new Address[] { new InternetAddress( u.getEmail( ) ) }, subject, body.toString(), MailService.MIME_TEXT );
}
catch ( UserNotFoundException u )
{
ctx.getLog( ).warn( email + " not found", u );
}
catch ( Exception e )
{
throw new PortletException( e );
}
doSignin(event, request);
}
private void doLogin( ActionEvent event,
PortletRequest request )
throws PortletException
{
PortletContext context = event.getPortlet( ).getPortletConfig( ).getPortletContext( );
LoginService service = ( LoginService ) context.getService( LoginService.NAME );
if ( !service.login( request ) )
{
ValidationHelper.addError( "error_login_failed", event );
doSignin( event, request );
}
else
{
event.setReturnCode( "login" );
notifyDataChanged( event );
}
}
private void doSignin( ActionEvent event,
PortletRequest request )
throws PortletException
{
PortletURI uri = event.getPortletResponse( ).createURI( Portlet.Mode.VIEW, PortletWindow.State.MAXIMIZED );
uri.addParameter( LoginPortlet.KEY_TEMPLATE, "signin.vm" );
event.setNextURI( uri );
}
private void doLogout( ActionEvent event,
PortletRequest request )
throws PortletException
{
PortletContext context = event.getPortlet( ).getPortletConfig( ).getPortletContext( );
LoginService service = ( LoginService ) context.getService( LoginService.NAME );
service.logout( request );
event.setReturnCode( "logout" );
notifyDataChanged( event );
}
private void doMyProfile( ActionEvent event,
PortletRequest request )
throws PortletException
{
if ( request.getAttribute( "user" ) == null )
{
User user = request.getUser( );
if ( user == null )
{
doSignin( event, request );
return;
}
request.setAttribute( "user", user );
}
PortletURI uri = event.getPortletResponse( ).createURI( Portlet.Mode.EDIT, PortletWindow.State.MAXIMIZED );
event.setNextURI( uri );
}
private void doRegister( ActionEvent event,
PortletRequest request )
throws PortletException
{
PortletURI uri = event.getPortletResponse( ).createURI( Portlet.Mode.EDIT, PortletWindow.State.MAXIMIZED );
event.setNextURI( uri );
}
private void doSave( ActionEvent event,
PortletRequest request,
boolean register )
throws PortletException
{
String userId = request.getParameter( UserService.USER_ID ).trim( );
String password = request.getParameter( UserService.PASSWORD ).trim( );
String email = request.getParameter( UserService.EMAIL ).trim( );
String firstname = request.getParameter( UserService.FIRSTNAME ).trim( );
String lastname = request.getParameter( UserService.LASTNAME ).trim( );
Locale locale = LocaleHelper.getLocale( request.getParameter( UserService.LOCALE ).trim( ), null );
try
{
if ( validate( userId, password, email, firstname, lastname, locale, event ) )
{
PortletContext ctx = event.getPortlet( ).getPortletConfig( ).getPortletContext( );
UserService srv = ( UserService ) ctx.getService( UserService.NAME );
if ( register )
{
srv.addUser( request );
event.setReturnCode( "register" );
}
else
{
srv.updateUser( request );
event.setReturnCode( "update" );
}
notifyDataChanged( event );
return;
}
}
catch ( UserIdNotUniqueException e )
{
ValidationHelper.addError( "error_duplicate_userId", event );
}
catch ( UserEmailNotUniqueException e )
{
ValidationHelper.addError( "error_duplicate_email", event );
}
catch ( Exception e )
{
throw new PortletException( "Unexpected error", e );
}
/* Handle Errors */
UserImpl user = new UserImpl( userId, password, email, firstname, lastname, locale );
request.setAttribute( "user", user );
if ( register )
{
doRegister( event, request );
}
else
{
doMyProfile( event, request );
}
}
private void doCancel( ActionEvent event,
PortletRequest request,
boolean register )
throws PortletException
{
event.setReturnCode( "cancel" );
}
private boolean validate( String userId,
String password,
String email,
String firsname,
String lastname,
Locale locale,
ActionEvent event )
{
ValidationHelper.assertNotEmpty( userId, "error_empty_userId", event );
ValidationHelper.assertNotEmpty( password, "error_empty_password", event );
ValidationHelper.assertNotEmpty( email, "error_empty_email", event );
return !event.hasErrors( );
}
private void notifyDataChanged( ActionEvent event )
{
( ( LoginPortlet ) event.getPortlet( ) ).dataChanged( );
}
}