package org.tgdb; import org.tgdb.frame.Caller; import org.tgdb.project.privilege.PrivilegeRemote; import org.tgdb.project.project.ProjectRemote; import org.tgdb.project.securityprinciple.SecurityPrincipleRemote; import org.tgdb.project.user.UserRemote; import org.tgdb.project.user.UserRemoteHome; import org.tgdb.samplingunit.samplingunit.SamplingUnitRemote; import org.tgdb.samplingunit.samplingunit.SamplingUnitRemoteHome; import org.tgdb.servicelocator.ServiceLocator; import java.io.Serializable; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; public class TgDbCaller extends Caller implements Serializable { private int sid; private int pid; private int suid; private String suidName; private HashMap projectsHashMap; public TgDbCaller() {} public TgDbCaller(UserRemote user) { try { this.id = user.getId(); setUsr(user.getUsr()); setName(user.getName()); updatePrivileges(); } catch (Exception e) { e.printStackTrace(); logger.error("---------------------------------------->TgDbCaller#TgDbCaller: Failed to initialize ",e); } } public int getSuid(){ return suid; } public void setSuid(int suid){ this.suid = suid; this.setAttribute("suid", suid); } public void setSuidName(String suidName){ this.suidName = suidName; this.setAttribute("suidName", suidName); } public String getSuidName() { return suidName; } public boolean hasPrivilege(String privilegeName) { return hasPrivilege(privilegeName, pid); } public boolean hasPrivilege(String privilegeName, int pid) { try { long t1 = System.currentTimeMillis(); if (getPrivHashMap(pid)!=null && getPrivHashMap(pid).containsKey(privilegeName)) { long t2 = System.currentTimeMillis(); //logger.debug("---------------------------------------->TgDbCaller#hasPrivilege: Fetched privilege '"+privilegeName+"' in "+(t2-t1)+" ms"); return true; } else { //logger.debug("---------------------------------------->TgDbCaller#hasPrivilege: Privilege '"+privilegeName+"' not granted"); } } catch (Exception e) { e.printStackTrace(); } return false; } public boolean hasPrivilegeSU(String privilegeName, int suid) { long t1 = System.currentTimeMillis(); try { SamplingUnitRemoteHome suHome = (SamplingUnitRemoteHome)ServiceLocator.getInstance().getHome(ServiceLocator.Services.SAMPLINGUNIT); SamplingUnitRemote su = suHome.findByPrimaryKey(new Integer(suid)); Collection projects = su.getProjects(); Iterator i = projects.iterator(); ProjectRemote prj = null; while (i.hasNext()) { prj = (ProjectRemote)i.next(); //logger.debug("---------------------------------------->TgDbCaller#hasPrivilegeSU: Fetched privilege '"+privilegeName+"' for suid = "+suid+" in pid = "+prj.getPid()); if (getPrivHashMap(prj.getPid())!=null && getPrivHashMap(prj.getPid()).containsKey(privilegeName)) { long t2 = System.currentTimeMillis(); //logger.debug("---------------------------------------->TgDbCaller#hasPrivilegeSU: Fetched privilege '"+privilegeName+"' in "+(t2-t1)+" ms"); return true; } } } catch (Exception e) { e.printStackTrace(); } return false; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; this.setAttribute("sid",sid); } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; this.setAttribute("pid", pid); } public void updatePrivileges() { try { long t1 = System.currentTimeMillis(); projectsHashMap = new HashMap(); ServiceLocator locator = ServiceLocator.getInstance(); UserRemoteHome userHome = (UserRemoteHome)locator.getHome(ServiceLocator.Services.USER); UserRemote user = userHome.findByPrimaryKey(new Integer(id)); isAdmin = user.isAdmin(); Collection securityPrinciples = user.getSecurityPrinciples(); SecurityPrincipleRemote sp = null; Iterator iPrivs = null; Collection arrPrivs = null; HashMap tempPrivsHash = null; Privilege p = null; Iterator i = securityPrinciples.iterator(); while (i.hasNext()) { tempPrivsHash = new HashMap(); sp = (SecurityPrincipleRemote)i.next(); // Project object Project prj = new Project(sp.getProject()); // Get privileges for project arrPrivs = sp.getRole().getPrivileges(); iPrivs = arrPrivs.iterator(); while (iPrivs.hasNext()) { p = new Privilege((PrivilegeRemote)iPrivs.next()); tempPrivsHash.put(p.getName(), p); } // Set Privileges to project object prj.setPrivs(tempPrivsHash); // Set project object to hashmap projectsHashMap.put(new Integer(prj.getPid()), prj); } long t2 = System.currentTimeMillis(); logger.debug("---------------------------------------->TgDbCaller#updatePrivileges: Updated privileges in "+(t2-t1)+" ms"); } catch (Exception e) { e.printStackTrace(); } } public HashMap getPrivHashMap(int pid) { Project prj = (Project)projectsHashMap.get(new Integer(pid)); if (prj!=null) return prj.getPrivs(); else return null; } }