package jpaoletti.jpm.core.operations;
import jpaoletti.jpm.core.PMContext;
import jpaoletti.jpm.core.PMException;
import jpaoletti.jpm.core.PMSession;
import jpaoletti.jpm.core.PresentationManager;
import jpaoletti.jpm.menu.Menu;
import jpaoletti.jpm.menu.MenuSupport;
import jpaoletti.jpm.security.core.*;
/**
*
* @author jpaoletti
*/
public class LoginOperation extends OperationCommandSupport {
public LoginOperation(String operationId) {
super(operationId);
}
@Override
protected boolean prepare(PMContext ctx) throws PMException {
return true;
}
@Override
protected void doExecute(PMContext ctx) throws PMException {
final PresentationManager pm = ctx.getPresentationManager();
final PMSession session = pm.registerSession(null);
ctx.setSessionId(session.getId());
if (pm.isLoginRequired()) {
try {
final PMSecurityUser u = authenticate(ctx);
session.setUser(u);
session.setMenu(loadMenu(session, u));
} catch (UserNotFoundException e) {
pm.removeSession(session.getId());
throw new PMException("pm_security.user.not.found");
} catch (UserAlreadyLogged e) {
pm.removeSession(session.getId());
throw new PMException("pm_security.user.already.logged");
} catch (InvalidPasswordException e) {
pm.removeSession(session.getId());
throw new PMException("pm_security.password.invalid");
} catch (UserNotActiveException e) {
pm.removeSession(session.getId());
throw new PMException("pm_security.user.inactive");
} catch (PMException e) {
pm.removeSession(session.getId());
throw e;
} catch (Exception e) {
pm.error(e);
pm.removeSession(session.getId());
throw new PMException("pm_core.unespected.error");
}
} else {
final PMSecurityUser user = new PMSecurityUser();
user.setName(" ");
session.setUser(user);
session.setMenu(loadMenu(session, user));
}
}
private Menu loadMenu(PMSession session, PMSecurityUser u) throws PMException {
final Menu menu = MenuSupport.getMenu(u.getPermissionList());
session.put("user", u);
session.put("menu", menu);
return menu;
}
/**
* @param ctx The context with all the parameters
* @return The user
*/
private PMSecurityUser authenticate(PMContext ctx) throws PMSecurityException {
PMSecurityUser u = null;
final Object username = ctx.getParameter("username");
final Object password = ctx.getParameter("password");
if (username == null || password == null) {
throw new InvalidUserException();
}
u = getConnector(ctx).authenticate(
username.toString(),
password.toString());
return u;
}
private PMSecurityConnector getConnector(PMContext ctx) {
return PresentationManager.getPm().getSecurityConnector(ctx);
}
@Override
protected boolean checkUser() {
return false;
}
}