package org.jblooming.security.businessLogic;
import org.jblooming.PlatformRuntimeException;
import org.jblooming.ontology.Identifiable;
import org.jblooming.ontology.businessLogic.DeleteHelper;
import org.jblooming.operator.Operator;
import org.jblooming.oql.QueryHelper;
import org.jblooming.page.HibernatePage;
import org.jblooming.persistence.PersistenceHome;
import org.jblooming.persistence.exceptions.FindByPrimaryKeyException;
import org.jblooming.persistence.exceptions.PersistenceException;
import org.jblooming.security.*;
import org.jblooming.security.SecurityException;
import org.jblooming.utilities.ReflectionUtilities;
import org.jblooming.utilities.StringUtilities;
import org.jblooming.waf.ActionUtilities;
import org.jblooming.waf.SessionState;
import org.jblooming.waf.constants.Fields;
import org.jblooming.waf.constants.RoleConstants;
import org.jblooming.waf.exceptions.ActionException;
import org.jblooming.waf.html.display.Paginator;
import org.jblooming.waf.html.input.Collector;
import org.jblooming.waf.html.state.Form;
import org.jblooming.waf.html.table.ListHeader;
import org.jblooming.waf.settings.ApplicationState;
import org.jblooming.waf.settings.I18n;
import org.jblooming.waf.state.PersistentSearch;
import org.jblooming.waf.view.ClientEntries;
import org.jblooming.waf.view.ClientEntry;
import org.jblooming.waf.view.PageState;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Set;
import java.util.TreeMap;
public class RoleAction {
boolean hasAreas;
public void cmdDelete(PageState pageState) throws org.jblooming.security.SecurityException, PersistenceException {
SessionState sm = pageState.getSessionState();
Operator user = pageState.getLoggedOperator();
user.testPermission(PlatformPermissions.role_canCreate);
Role delenda = (Role) PersistenceHome.findByPrimaryKey(Role.class, pageState.getMainObjectId());
DeleteHelper.cmdDelete(delenda, pageState);
// doubled PersistenceHome.remove(delenda);
}
public void cmdSave(PageState pageState) throws org.jblooming.security.SecurityException, PersistenceException, ActionException {
boolean invalidEntries = false;
SessionState sm = pageState.getSessionState();
Operator user = pageState.getLoggedOperator();
user.testPermission(PlatformPermissions.role_canWrite);
Role role = null;
ClientEntry rt = pageState.getEntry("ROLE_TYPE");
rt.required = true;
try {
if (PersistenceHome.NEW_EMPTY_ID.equals(pageState.getMainObjectId())) {
String roleClassName = rt.stringValueNullIfEmpty();
role = (Role) Class.forName(roleClassName).newInstance();
role.setIdAsNewSer();
} else {
role = (Role) PersistenceHome.findByPrimaryKey(Role.class, pageState.getMainObjectId());
if (role == null) throw new FindByPrimaryKeyException();
}
invalidEntries = !ActionUtilities.setString(pageState.getEntryAndSetRequired(RoleConstants.FLD_ROLE_NAME), role, "name");
ActionUtilities.setString(pageState.getEntry(RoleConstants.FLD_ROLE_DESCRIPTION), role, "description");
if (hasAreas) {
Method setArea = ReflectionUtilities.getDeclaredInheritedMethods(ReflectionUtilities.getUnderlyingObject(role).getClass()).get("setArea");
String areaIdS = pageState.getEntry("AREA").stringValueNullIfEmpty();
if ("SYSTEM_ROLE".equals(areaIdS)) {
setArea.invoke(role, null);
} else {
int areaId = 0;
areaId = pageState.getEntry("AREA").intValueNoErrorCodeNoExc();
Area area = null;
if (areaId > 0)
area = (Area) PersistenceHome.findByPrimaryKey(Area.class, areaId);
if (area != null) {
if (setArea != null)
setArea.invoke(role, area);
else {
pageState.getEntry("AREA").errorCode = role.getClass().getName() + " " + I18n.get("OBJ_HAS_NO_AREA_ATTRIBUTE");
}
}
}
}
TreeMap<String, String> chosen = Collector.chosen("permColl", pageState);
role.setPermissionIds(StringUtilities.setToString(chosen.keySet(), "|"));
pageState.setMainObject(role);
} catch (Exception e) {
invalidEntries = true;
rt.errorCode = e.getMessage();
}
if (invalidEntries) {
throw new ActionException();
}
role.store();
//ce = make(role, pageState);
//pageState.setClientEntries(ce);
}
public void cmdFind(PageState pageState) throws PersistenceException {
final Operator logged = pageState.getLoggedOperator();
String hql = "from " + Role.class.getName() + " as role ";
if (pageState.getEntry(Form.FLD_FORM_ORDER_BY + "ROLELH").stringValueNullIfEmpty() == null) {
hql = hql + " order by role.name ";
}
QueryHelper qhelp = new QueryHelper(hql);
boolean recoveredFromSavedFilter = PersistentSearch.feedFromSavedSearch(pageState);
String FLD_des = pageState.getEntry("name").stringValueNullIfEmpty();
if (FLD_des != null) {
qhelp.addQBEClause("role.name", "name", FLD_des, QueryHelper.TYPE_CHAR);
}
ListHeader.orderAction(qhelp, "ROLELH", pageState);
pageState.setPage(HibernatePage.getHibernatePageInstance(qhelp.toHql().getQuery(),
Paginator.getWantedPageNumber(pageState),
Paginator.getWantedPageSize(pageState)));
}
public ClientEntries make(Role role, PageState pageState) {
ClientEntries ces = new ClientEntries();
ces.addRequiredEntry(RoleConstants.FLD_ROLE_NAME, role.getName());
ces.addEntry(RoleConstants.FLD_ROLE_DESCRIPTION, role.getDescription());
Class<? extends Identifiable> aClass = ReflectionUtilities.getUnderlyingObject(role).getClass();
ces.addRequiredEntry("ROLE_TYPE", aClass.getName());
if (hasAreas) {
Method getArea = ReflectionUtilities.getDeclaredInheritedMethods(aClass).get("getArea");
if (getArea != null) {
Area area = null;
try {
area = (Area) getArea.invoke(role);
if (area != null)
ces.addEntry("AREA", area.getId() + "");
else
ces.addEntry("AREA", "SYSTEM_ROLE");
} catch (IllegalAccessException e) {
throw new PlatformRuntimeException(e);
} catch (InvocationTargetException e) {
throw new PlatformRuntimeException(e);
}
}
}
Set<Permission> chosen = role.getPermissions();
// come sopra non vengono caricati tutti
// teo soluzione al volo per Piazzesi
/*
Set<Permission> chosen = new HashSet<Permission>();
String ids = role.getPermissionIds();
String[] idsArray = StringUtilities.splitToArray(ids, "|");
for (int i = 0; i < idsArray.length; i++) {
String id = idsArray[i];
Permission pr = new Permission(id);
chosen.add(pr);
}
*/
TreeMap<String, String> ctm = new TreeMap<String, String>();
if (chosen != null && chosen.size() > 0) {
for (Permission p : chosen) {
if (p != null)
ctm.put(p.getName(), I18n.get(p.getName()));
}
}
Collection<String> cand = ApplicationState.getPermissions().keySet();
TreeMap<String, String> candTm = new TreeMap<String, String>();
if (cand != null && cand.size() > 0) {
for (Object aCand : cand) {
String s = (String) aCand;
if (chosen == null || !ctm.keySet().contains(s))
candTm.put(s, I18n.get(s));
}
}
Collector.make("permColl", candTm, ctm, pageState);
for (Permission p : ApplicationState.getPermissions().values()) {
if (role.hasPermissionFor(p))
ces.addEntry(new ClientEntry(Fields.FORM_PREFIX + p.getName(), "on"));
}
return ces;
}
public void cmdEdit(PageState pageState) throws PersistenceException, SecurityException {
SessionState sm = pageState.getSessionState();
Operator user = pageState.getLoggedOperator();
user.testPermission(PlatformPermissions.role_canWrite);
Role role = (Role) PersistenceHome.findByPrimaryKey(Role.class, pageState.getMainObjectId());
pageState.setMainObject(role);
pageState.getClientEntries().addEntries(make(role, pageState));
}
public void cmdAdd(PageState pageState) throws PersistenceException {
SessionState sm = pageState.getSessionState();
Operator op = pageState.getLoggedOperator();
Role role = new Role();
//role.setIdAsNew();
role.setIdAsNewSer();
pageState.setMainObject(role);
pageState.getClientEntries().addEntries(make(role, pageState));
}
public void cmdMove(String s, PageState pageState) throws FindByPrimaryKeyException {
Collector.move("permColl", pageState);
Role role;
if (PersistenceHome.NEW_EMPTY_ID.equals(pageState.getMainObjectId())) {
role = new Role();
role.setIdAsNewSer();
} else {
role = (Role) PersistenceHome.findByPrimaryKey(Role.class, pageState.getMainObjectId());
if (role == null)
throw new FindByPrimaryKeyException();
}
pageState.setMainObject(role);
//pageState.getClientEntries().addEntries(make(role, pageState));
}
}