package org.openedit.events; import java.util.Date; import java.util.Iterator; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.openedit.OpenEditException; import com.openedit.WebPageRequest; public class TaskRunner extends java.util.TimerTask { protected static final Log log = LogFactory.getLog(TaskRunner.class); protected PathEvent fieldTask; protected PathEventManager fieldEventManager; protected WebPageRequest fieldWebPageRequest; protected Date fieldTimeToStart; //protected boolean fieldRepeating; protected boolean fieldWithParameters; protected boolean fieldRunAgainSoon; public boolean isRunAgainSoon() { return fieldRunAgainSoon; } public void setRunAgainSoon(boolean inRunAgainSoon) { fieldRunAgainSoon = inRunAgainSoon; } public boolean isWithParameters() { return fieldWithParameters; } public void setWithParameters(boolean inWithParameters) { fieldWithParameters = inWithParameters; } public TaskRunner(PathEvent inTask,PathEventManager inManager) { this( inTask, null,null,inManager); setWithParameters(false); } public TaskRunner(PathEvent inTask, Map inParams, Map inPageValues, PathEventManager inManager) { fieldTask = inTask; fieldEventManager = inManager; setWithParameters(true); WebPageRequest request = inManager.getRequestUtils().createPageRequest(inTask.getPage().getPath(), inTask.getUser()); if( inParams != null) { for (Iterator iterator = inParams.keySet().iterator(); iterator.hasNext();) { String key = (String ) iterator.next(); Object value = inParams.get(key); if( value instanceof String[]) { request.setRequestParameter(key, (String[])value); } else { request.setRequestParameter(key, (String)value); } } } if( inPageValues != null) { for (Iterator iterator = inPageValues.keySet().iterator(); iterator.hasNext();) { String key = (String ) iterator.next(); Object value = inPageValues.get(key); request.putPageValue(key, value); request.putSessionValue(key, value); } } fieldWebPageRequest = request; setTimeToStart(new Date(System.currentTimeMillis() + inTask.getPeriod() )); } public Date getTimeToStart() { return fieldTimeToStart; } public void setTimeToStart(Date inTimeToStart) { fieldTimeToStart = inTimeToStart; } protected WebPageRequest getWebPageRequest() { return fieldWebPageRequest; } protected void setWebPageRequest(WebPageRequest inWebPageRequest) { fieldWebPageRequest = inWebPageRequest; } public PathEvent getTask() { return fieldTask; } public void setTask(PathEvent inTask) { fieldTask = inTask; } public PathEventManager getEventManager() { return fieldEventManager; } public void setEventManager(PathEventManager inEventManager) { fieldEventManager = inEventManager; } /** * This is non blocking */ public void run() { try { Runnable execrun = new Runnable() { public void run() { runBlocking(); } }; getEventManager().addToRunQueue(execrun); } catch ( Throwable ex) { log.error("Error from action ",ex); } } public void runBlocking() { // TODO Auto-generated method stub //before we run this make sure our event is still enabled //make sure this event did not get reloaded PathEvent event = getEventManager().getPathEvent(getTask().getPage().getPath()); //make sure nobody is running this try { if( event.isEnabled() ) { executeNow(getWebPageRequest(),event); } } finally { if( isRunAgainSoon() ) { setRunAgainSoon(false); getEventManager().runSharedPathEvent(getTask().getPage().getPath()); } else { if( !isRepeating() ) { getEventManager().getRunningTasks().remove(this); } } } //Just update time and reshedule // if( isRepeating() ) //Duplicate ones will not have a period and expire // { // Date now = new Date(); //see if its already scheduled for the future // //make sure we just have one in the queue // TaskRunner runner = new TaskRunner(getTask(), getEventManager()); // getEventManager().getRunningTasks().push(runner); // if( isRunAgainSoon() ) // { // getEventManager().schedule(runner, 0); // } // else // { // getEventManager().schedule(runner, getTask().getPeriod()); // } // } } public boolean isRepeating() { return !isWithParameters() && getTask().getPeriod() > 0 && getTask().isEnabled(); } protected void executeNow(WebPageRequest inReq, PathEvent event) { if( inReq == null) { throw new OpenEditException("Request must not be null"); } inReq.putPageValue("ranevent", event); inReq.setRequestParameter("runpath", event.getPage().getPath()); event.execute(inReq); /* if( getEventManager().isLogEvents()) { //TODO: Capture error logs String type = PathUtilities.extractPageName(event.getPage().getPath()); StringBuffer stdout = new StringBuffer(); WebEvent runevent = new WebEvent(); runevent.setUser(inReq.getUser()); runevent.setOperation(type); runevent.setProperty("time", "" + event.getLastRun().getTime() /1000L); WebEvent outsideevent = (WebEvent)inReq.getPageValue("webevent"); if( outsideevent != null) { stdout.append(outsideevent.getOperation() + " event fired. "); stdout.append(outsideevent.getProperties().toString()); stdout.append("<br>\n"); } String last = event.getLastOutput(); if( last != null && last.length() > 0) { int max = Math.min(1000, last.length()); //cut the end stdout.append(last.substring(last.length() - max,last.length())); } runevent.setProperty("details", stdout.toString()); Searcher patheventseacher = getEventManager().getSearcherManager().getSearcher(getEventManager().getCatalogId(), "patheventLog"); patheventseacher.saveData(runevent,inReq.getUser()); } */ } }