package org.sakaiproject.delegatedaccess.jobs; import java.util.ArrayList; import java.util.Date; import java.util.List; import lombok.Getter; import lombok.Setter; import org.apache.log4j.Logger; import org.sakaiproject.delegatedaccess.dao.DelegatedAccessDao; import org.sakaiproject.delegatedaccess.logic.ProjectLogic; import org.sakaiproject.delegatedaccess.logic.SakaiProxy; import org.sakaiproject.delegatedaccess.util.DelegatedAccessConstants; import org.sakaiproject.hierarchy.HierarchyService; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.SitePage; import org.sakaiproject.site.api.ToolConfiguration; import org.sakaiproject.api.app.scheduler.ScheduledInvocationCommand; public class DelegatedAccessAddToolToMyWorkspacesJob implements ScheduledInvocationCommand{ private static final Logger log = Logger.getLogger(DelegatedAccessAddToolToMyWorkspacesJob.class); @Getter @Setter private DelegatedAccessDao dao; @Getter @Setter private ProjectLogic projectLogic; @Getter @Setter private SakaiProxy sakaiProxy; public void execute(String nodeId){ log.info("DelegatedAccessAddToolToMyWorkspacesJob started"); long startTime = System.currentTimeMillis(); List<String> userIds = dao.getDelegatedAccessUsers(); if(userIds != null){ //convert userIds to workspace site ids by adding a ~ to the front List<String> userWorkspaceIds = new ArrayList<String>(); for(String userId : userIds){ if(!DelegatedAccessConstants.SHOPPING_PERIOD_USER.equals(userId) && !DelegatedAccessConstants.SITE_HIERARCHY_USER.equals(userId)){ userWorkspaceIds.add("~" + userId); } } //find which site's already have the DA tool List<String> sitesWithDelegatedAccess = dao.getSitesWithDelegatedAccessTool(userWorkspaceIds.toArray(new String[userWorkspaceIds.size()])); //filter out the sites that already ahve the DA tool for(String siteId : sitesWithDelegatedAccess){ userWorkspaceIds.remove(siteId); } //now go through the leftover sites and add the DA tool: //user has access but doesn't have the DA tool, we need to add it String currentUserId = sakaiProxy.getCurrentUserId(); try{ for(String siteId : userWorkspaceIds){ //trick the session into thinking you are the user who's workspace this is for. This way, //SiteService will create the workspace if its missing sakaiProxy.setSessionUserId(siteId.substring(1)); Site workspace = sakaiProxy.getSiteById(siteId); if(workspace != null){ SitePage page = workspace.addPage(); page.addTool("sakai.delegatedaccess"); //check if the workspace already has the become user tool, if not add it: ToolConfiguration tool = workspace.getToolForCommonId("sakai.su"); if(tool == null && projectLogic.hasAllowBecomeUserPerm(siteId.substring(1))){ SitePage suPage = workspace.addPage(); suPage.addTool("sakai.su"); } sakaiProxy.saveSite(workspace); } } }catch (Exception e) { log.error(e); }finally{ sakaiProxy.setSessionUserId(currentUserId); } } projectLogic.updateAddDAMyworkspaceJobStatus("" + new Date().getTime()); log.info("DelegatedAccessAddToolToMyWorkspacesJob finished in " + (System.currentTimeMillis() - startTime) + " ms"); } }