/*
* Copyright 2013 GiavaCms.org.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.giavacms.common.controller;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.giavacms.common.model.AdminRole;
import org.giavacms.common.model.BaseCustomer;
import org.giavacms.common.model.BaseRole;
import org.giavacms.common.repository.AbstractRepository;
import org.giavacms.common.util.JSFUtils;
import org.jboss.logging.Logger;
public abstract class AbstractLoginController implements Serializable
{
private static final long serialVersionUID = 1L;
@Inject
protected Logger logger;
// --- gruppi LDAP -----------------------------------
/**
* Il gruppo restituito dall'LDAP nel caso un utente sia amministratore-root-dio di questa webapp, da verificare
* attraverso la API j2ee isUserInRole()
*
* E' l'unico gruppo LDAP noto a priori, mentre altri gruppi possono aggiungersi col tempo (estensione dell'uso della
* webapp a nuovi soggetti)
*/
public static final String JBOSS_ADMIN = "JBossAdmin";
// --- ruoli WEBAPP ------------------------------------------
private List<BaseRole> roles;
private BaseRole mainRole;
private String username;
private BaseCustomer customer;
@PostConstruct
public void postConstruct()
{
username = JSFUtils.getUserName();
logger.warn("Loading profile for: " + username);
boolean loggedIn = initRole();
trace(loggedIn);
}
protected void trace(boolean loggedIn)
{
logger.warn("Login for: " + username
+ (loggedIn ? " was succesful!" : " failed."));
}
private boolean initRole()
{
// check if admin
if (JSFUtils.isUserInRole(getAdminRole())
|| JSFUtils.isUserInRole(JBOSS_ADMIN))
{
this.roles = new ArrayList<BaseRole>();
this.roles.add(new AdminRole());
return true;
}
boolean profiled = false;
if (aliasDrivenRoles())
{
profiled = initRolesByAlias();
}
else
{
profiled = initRolesByGroups();
}
if (profiled)
{
this.mainRole = getMainRole();
this.customer = getCustomerRepository().find(mainRole.getCustomerId());
return true;
}
logger.info("No roles found for user: " + username);
String redirectURL = JSFUtils.getContextParam("redirectUrl");
if (redirectURL == null)
{
logger.warn("Failed to get redirectUrl context parameter");
redirectURL = "/error.jsp";
}
try
{
JSFUtils.redirect(redirectURL);
}
catch (Exception e)
{
logger.error(e.getMessage(), e);
}
return false;
}
protected String getAdminRole()
{
return "Admin";
}
protected boolean aliasDrivenRoles()
{
return false;
}
private boolean initRolesByGroups()
{
List<? extends BaseRole> allRoles = getRoleRepository().getAllList();
roles = new ArrayList<BaseRole>();
for (BaseRole role : allRoles)
{
if (JSFUtils.isUserInRole(role.getGroup()))
{
roles.add(role);
}
}
if (roles == null || roles.size() == 0)
{
return false;
}
else
{
return true;
}
}
private boolean initRolesByAlias()
{
// Search<? extends BaseRole> search = new Search<BaseRole>(new
// BaseRole(){
// private static final long serialVersionUID = 1L;});
// search.getObj().setAlias(username);
// this.roles = getRoleRepository().getList(search, 0, 0);
List<? extends BaseRole> allRoles = getRoleRepository().getAllList();
roles = new ArrayList<BaseRole>();
for (BaseRole role : allRoles)
{
if (username.equalsIgnoreCase(role.getAlias()))
{
roles.add(role);
}
}
if (roles == null || roles.size() == 0)
{
return false;
}
else
{
return true;
}
}
abstract protected AbstractRepository<? extends BaseRole> getRoleRepository();
abstract protected AbstractRepository<? extends BaseCustomer> getCustomerRepository();
public String selectCustomerIfAdmin()
{
this.customer = getCustomerRepository().find(this.customer.getId());
resetDependencies();
return null;
}
protected void resetDependencies()
{
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public BaseCustomer getCustomer()
{
if (customer == null)
customer = new BaseCustomer()
{
private static final long serialVersionUID = 1L;
};
return customer;
}
public void setCustomer(BaseCustomer customer)
{
this.customer = customer;
}
public List<BaseRole> getRoles()
{
return roles;
}
public void setRoles(List<BaseRole> roles)
{
this.roles = roles;
}
public BaseRole getMainRole()
{
if (mainRole == null)
{
findMainRole();
}
return mainRole;
}
public void setMainRole(BaseRole mainRole)
{
this.mainRole = mainRole;
}
private void findMainRole()
{
if (roles != null)
{
for (BaseRole r : roles)
{
if (mainRole == null)
{
mainRole = r;
}
else if (betterThanCurrent(r))
{
mainRole = r;
}
}
}
this.customer = getCustomerRepository().find(mainRole.getCustomerId());
}
protected boolean betterThanCurrent(BaseRole r)
{
// override this
return true;
}
public String getRolesAsString()
{
if (roles != null && roles.size() > 0)
{
StringBuffer sb = new StringBuffer();
for (BaseRole r : roles)
{
sb.append(", ").append(r.getType());
}
return sb.substring(2);
}
return "n.d.";
}
}