package org.sakaiproject.delegatedaccess.logic; import java.util.List; import java.util.Map; import java.util.Observable; import java.util.Observer; import lombok.Getter; import lombok.Setter; import org.apache.log4j.Logger; import org.sakaiproject.delegatedaccess.util.DelegatedAccessConstants; import org.sakaiproject.event.api.Event; import org.sakaiproject.event.api.EventTrackingService; import org.sakaiproject.event.api.UsageSessionService; import org.sakaiproject.site.api.SiteService; /** * This is an Observer for Delegated Access. It listens for a user to login and checks * if they have any delegated access. If so, then it populates the user's session with * the access information. * * @author Bryan Holladay (holladay@longsight.com) * */ public class DelegatedAccessObserver implements Observer { @Getter @Setter private ProjectLogic projectLogic; @Getter @Setter private EventTrackingService eventTrackingService; private static final Logger log = Logger.getLogger(DelegatedAccessObserver.class); public void init() { log.info("init()"); eventTrackingService.addObserver(this); } public void update(Observable arg0, Object arg) { if (!(arg instanceof Event)) return; Event event = (Event) arg; // check the event function against the functions we have notifications watching for if (UsageSessionService.EVENT_LOGIN.equals(event.getEvent()) || UsageSessionService.EVENT_LOGIN_CONTAINER.equals(event.getEvent())) { projectLogic.initializeDelegatedAccessSession(); }else if(SiteService.SECURE_REMOVE_SITE.equals(event.getEvent())){ //Site has been deleted, check if it exists and remove all nodes: boolean deleted = false; Map<String, List<String>> nodeIds = projectLogic.getNodesBySiteRef(new String[]{event.getResource()}, DelegatedAccessConstants.HIERARCHY_ID); if(nodeIds != null && nodeIds.containsKey(event.getResource())){ for(String nodeId : nodeIds.get(event.getResource())){ projectLogic.removeNode(nodeId); deleted = true; } if(deleted){ projectLogic.clearNodeCache(); } } }else if(DelegatedAccessConstants.EVENT_CHECK_ACCESS.equals(event.getEvent())){ //this will set the Session attribute for this site and user projectLogic.getCurrentUsersAccessToSite(event.getResource()); } } }