package org.openedit.events;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.DateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openedit.entermedia.util.TimeParser;
import org.openedit.event.WebEvent;
import com.openedit.OpenEditException;
import com.openedit.WebPageRequest;
import com.openedit.WebServer;
import com.openedit.entermedia.scripts.ScriptLogger;
import com.openedit.entermedia.scripts.TextAppender;
import com.openedit.page.Page;
import com.openedit.users.User;
import com.openedit.util.RequestUtils;
public class PathEvent implements Comparable, TextAppender
{
private static final Log log = LogFactory.getLog(PathEvent.class);
protected User fieldUser;
protected Page fieldPage;
protected boolean fieldAsleep;
protected boolean fieldHasFailed;
protected long fieldExpirationTime;
protected Date fieldLastRun;
protected StringBuffer fieldLastOutput;
protected WebServer fieldWebServer;
protected String fieldFormattedPeriod;
protected long fieldDelay = 0;
protected long fieldPeriod = 0;
protected String fieldFormattedDelay;
protected boolean fieldEnabled = true;
protected int fieldRunningCount = 0;
protected RequestUtils fieldRequestUtils;
public PathEvent()
{
}
public boolean isRunning()
{
return fieldRunningCount > 0;
}
public int getRunningCount()
{
return fieldRunningCount;
}
public long getPeriod()
{
return fieldPeriod;
}
public void setPeriod(long inPeriod)
{
fieldPeriod = inPeriod;
}
public void setPeriod(String inPeriod)
{
fieldPeriod = parse(inPeriod);
fieldFormattedPeriod = inPeriod;
}
public String getFormattedPeriod()
{
return fieldFormattedPeriod;
}
private void setDefaults()
{
setPeriod(12 * 60 * 60 * 1000); //defaults to runing every 12 hours
setDelay(60000L); //defaults to one minute
}
public long getDelay()
{
return fieldDelay;
}
public String getFormattedDelay()
{
return fieldFormattedDelay;
}
public void setDelay(long inDelay)
{
fieldDelay = inDelay;
}
public void setDelay(String inDelay)
{
fieldDelay = parse(inDelay);
fieldFormattedDelay = inDelay;
}
/**
* @param inPeriodString
* @return
*/
private long parse(String inPeriodString)
{
if (inPeriodString == null)
{
return 0;
}
return new TimeParser().parse(inPeriodString);
}
public void putProperty(String key, String value)
{
if (key.equals("username"))
{
//This is3 handled in XMLSchedulerArchive.loadFromFile()
}
else if (key.equals("startdelay"))
{
setDelay(value);
}
else if (key.equals("period"))
{
setPeriod(value);
}
else if (key.equals("enabled"))
{
setEnabled(Boolean.parseBoolean(value));
}
getPage().setProperty(key, value);
}
public boolean isEnabled()
{
return fieldEnabled;
}
public void setEnabled(boolean inEnabled)
{
fieldEnabled = inEnabled;
}
public long getExpirationTime()
{
return fieldExpirationTime;
}
public void setExpirationTime(long inExpirationTime)
{
fieldExpirationTime = inExpirationTime;
}
public User getUser()
{
return fieldUser;
}
public void setUser(User inUser)
{
fieldUser = inUser;
}
public boolean hasFailed()
{
return fieldHasFailed;
}
public String getProperty(String key)
{
return (String) getProperties().get(key);
}
public void setProperty(String key, String value)
{
getProperties().put(key, value);
}
public boolean isSleeping()
{
return fieldAsleep;
}
public void sleep()
{
fieldAsleep = true;
}
public void wakeup()
{
fieldAsleep = false;
}
public String getFormattedLastRun()
{
if (getLastRun() != null)
{
return DateFormat.getDateTimeInstance().format(getLastRun());
}
return null;
}
public Date getLastRun()
{
return fieldLastRun;
}
public void setLastRun(Date inLastRun)
{
fieldLastRun = inLastRun;
getLastOutput().append("event started: ");
getLastOutput().append(DateFormat.getDateTimeInstance().format(fieldLastRun));
getLastOutput().append('\n');
}
public StringBuffer getLastOutput()
{
if( fieldLastOutput == null )
{
fieldLastOutput = new StringBuffer();
}
return fieldLastOutput;
}
public String getLastOutputHtml()
{
if( fieldLastOutput == null)
{
return null;
}
StringBuffer out = new StringBuffer();
out.append("<div class='emoutput'>");
out.append("<div>");
out.append( getLastOutput().toString().replace("\n", "</div><div>" ));
out.append("</div></div>");
return out.toString();
}
public void appendText(String inLastOutput)
{
// getLastOutput().append("ran on: ");
// getLastOutput().append(DateFormat.getDateTimeInstance().format(getLastRun()));
// getLastOutput().append('\n');
getLastOutput().append(inLastOutput);
getLastOutput().append('\n');
if( getLastOutput().length() > 10000 )
{
String cut = getLastOutput().substring(getLastOutput().length() - 7000, getLastOutput().length());
fieldLastOutput = new StringBuffer(cut);
}
}
public RequestUtils getRequestUtils()
{
return fieldRequestUtils;
}
public void setRequestUtils(RequestUtils inRequestUtils)
{
fieldRequestUtils = inRequestUtils;
}
/**
* This should only be called from the TaskRunner.run() method
* @param inReq
* @return
* @throws OpenEditException
*/
public boolean execute(WebPageRequest inReq) throws OpenEditException
{
//The task should make sure this does not run if it is a repeating type
// if( isRunning() )
// {
// log.info("Event is already running " + getPage().getName() );
// return false; //already running
// }
//Track if two parameterized events execute at the same moment.
fieldRunningCount++;
try
{
return runNow(inReq);
}
finally
{
fieldRunningCount--;
}
}
protected boolean runNow(WebPageRequest inReq)
{
WebPageRequest request = inReq.copy(getPage());
request.putProtectedPageValue("content", getPage());
// for (Iterator iterator = getProperties().keySet().iterator(); iterator.hasNext();) {
// String key = (String) iterator.next();
// request.setRequestParameter(key, getProperty(key));
// }
//request.putPageValue("home", "");
long start = System.currentTimeMillis();
//Thread thread = Thread.currentThread();
//ClassLoader oldLoader = thread.getContextClassLoader();
ScriptLogger logs = null;
try
{
logs = new ScriptLogger();
//thread.setContextClassLoader(getClassLoader());
Page page = request.getPage();
logs.setPrefix(page.getName());
logs.setTextAppender(this);
logs.startCapture();
StringWriter output = new StringWriter();
try
{
if( log.isDebugEnabled() )
{
log.info("running " + page.getPath());
}
WebEvent event = (WebEvent)request.getPageValue("webevent");
request.setWriter(output);
getWebServer().getOpenEditEngine().createPageStreamer(page, request);
setLastRun(new Date());
if (getPage().getContentItem().exists())
{
getWebServer().getOpenEditEngine().beginRender(request);
}
else
{
getWebServer().getOpenEditEngine().executePathActions(request);
if( !request.hasRedirected())
{
getWebServer().getModuleManager().executePageActions( page,request );
}
if( request.hasRedirected())
{
log.info("action was redirected");
}
}
}
catch( Throwable ex)
{
StringWriter ow = new StringWriter();
while( ex != null)
{
ex.printStackTrace(new PrintWriter(ow));
ex = ex.getCause();
}
log.error("\n" + ow.toString() + "\n");
}
// finally
// {
// for (Iterator iterator = logs.listLogs().iterator(); iterator.hasNext();)
// {
// String log = (String) iterator.next();
// output.append(log.toString());
// output.append("\n");
// }
// appendText(output.toString());
// }
}
finally
{
//thread.setContextClassLoader(oldLoader);
logs.stopCapture();
}
if (request.hasCancelActions())
{
appendText("Action may have failed to run. Check permissions.");
}
// List oldlogs = (List)request.getPageValue("logs");
// if( oldlogs != null)
// {
// for (Iterator iterator = oldlogs.iterator(); iterator.hasNext();)
// {
// Object object = (Object) iterator.next();
// output.append(object.toString());
// output.append("<br/>\n");
// }
// }
// long end = System.currentTimeMillis();
// setLastRunTime((end - start) / 1000L); //minutes
//log.info(output);
return true;
}
protected Map getProperties()
{
return getPage().getProperties();
}
public WebServer getWebServer()
{
return fieldWebServer;
}
public void setWebServer(WebServer inWebServer)
{
fieldWebServer = inWebServer;
}
// public ClassLoader getClassLoader()
// {
// return fieldClassLoader;
// }
//
// public void setClassLoader(ClassLoader inClassLoader)
// {
// fieldClassLoader = inClassLoader;
// }
public String getName()
{
String name = getPage().getProperty("eventname");
if( name == null)
{
name = getPage().getName();
}
return name;
}
public Page getPage()
{
return fieldPage;
}
public void setPage(Page inPage)
{
fieldPage = inPage;
setDelay(inPage.getProperty("delay"));
setEnabled(Boolean.parseBoolean(inPage.getProperty("enabled")));
setPeriod(inPage.getProperty("period"));
}
public String toString()
{
if( getPage() != null)
{
return getPage().getDirectoryName() + "/" + getPage().getName();
}
return super.toString();
}
public int compareTo(Object inO)
{
PathEvent event = (PathEvent) inO;
String name = event.toString();
return toString().compareTo(name);
}
}