package org.sakaiproject.delegatedaccess.jobs;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeModel;
import lombok.Getter;
import lombok.Setter;
import org.apache.log4j.Logger;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;
import org.sakaiproject.authz.api.SecurityAdvisor;
import org.sakaiproject.delegatedaccess.logic.ProjectLogic;
import org.sakaiproject.delegatedaccess.logic.SakaiProxy;
import org.sakaiproject.delegatedaccess.model.NodeModel;
import org.sakaiproject.delegatedaccess.util.DelegatedAccessConstants;
import org.sakaiproject.delegatedaccess.util.DelegatedAccessMutableTreeNode;
import org.sakaiproject.api.app.scheduler.ScheduledInvocationCommand;
/**
* This is the job that will populate the shopping period access tree. It should be ran every morning (sometime after midnight).
* This is used to open and close the shopping period for sites based on their open and close dates.
*
* @author Bryan Holladay
*
*/
public class DelegatedAccessShoppingPeriodJob implements StatefulJob, ScheduledInvocationCommand {
private static final Logger log = Logger.getLogger(DelegatedAccessShoppingPeriodJob.class);
@Getter @Setter
private ProjectLogic projectLogic;
@Getter @Setter
private SakaiProxy sakaiProxy;
public void init() { }
public void execute(JobExecutionContext arg0) throws JobExecutionException {
execute("");
}
public void execute(String nodeId){
if(nodeId != null){
nodeId = nodeId.trim();
}
try{
Map<String, String> errors = new HashMap<String, String>();
log.info("DelegatedAccessShoppingPeriodJob started. NodeId: " + nodeId);
long startTime = System.currentTimeMillis();
SecurityAdvisor advisor = sakaiProxy.addSiteUpdateSecurityAdvisor();
DefaultMutableTreeNode treeNode = null;
if(nodeId == null || "".equals(nodeId)){
TreeModel treeModel = projectLogic.getEntireTreePlusUserPerms(DelegatedAccessConstants.SHOPPING_PERIOD_USER);
if (treeModel != null && treeModel.getRoot() != null) {
treeNode = (DefaultMutableTreeNode) treeModel.getRoot();
}
}else{
NodeModel nodeModel = projectLogic.getNodeModel(nodeId, DelegatedAccessConstants.SHOPPING_PERIOD_USER);
treeNode = new DelegatedAccessMutableTreeNode();
treeNode.setUserObject(nodeModel);
}
if(treeNode != null){
projectLogic.updateShoppingPeriodSettings(treeNode);
sakaiProxy.popSecurityAdvisor(advisor);
log.info("DelegatedAccessShoppingPeriodJob finished in " + (System.currentTimeMillis() - startTime) + " ms");
if(errors.size() > 0){
String warning = "The following sites had errors: \n\n";
for(Entry entry : errors.entrySet()){
warning += entry.getKey() + ": " + entry.getValue() + "\n";
}
log.warn(warning);
sakaiProxy.sendEmail("DelegatedAccessShoppingPeriodJob error", warning);
}
}
}catch (Exception e) {
log.error(e.getMessage(), e);
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
sakaiProxy.sendEmail("DelegatedAccessShoppingPeriodJob error", sw.toString());
}
}
}