package example;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.inject.Inject;
/**
* Filter to show a maintenance page if the MaintenanceRunner is active.
*
* <h3>init parameters</h3>
* <dl>
* <dt>url
* <dd>The url to forward to when active, if not set then a 503
* (SERVICE_UNAVAILABLE) error code is returned.
* <dt>min-estimated-time
* <dd>The minimum amount of time in seconds for an estimate of when the task
* will complete, default is 5 seconds.
* </dl>
*/
public class PeriodicTaskFilter implements Filter {
static protected final Logger log =
Logger.getLogger(PeriodicTaskFilter.class.getName());
private String _url = null;
private int _minEstimatedTime = 5;;
@Inject private PeriodicTask _periodicTask;
public PeriodicTaskFilter()
{
}
public void setPeriodicTask(PeriodicTask periodicTask)
{
_periodicTask = periodicTask;
}
/**
* The url to forward to when active, if not set then a 503
* (SERVICE_UNAVAILABLE) error code is returned.
*/
public void setUrl(String url)
{
_url = url;
}
/**
* The minimum amount of time in seconds for an estimate of when the task
* will complete, default is 5 seconds.
*/
public void setMinEstimatedTime(int seconds)
{
_minEstimatedTime = seconds;
}
public void init(FilterConfig filterConfig)
throws ServletException
{
String p;
p = filterConfig.getInitParameter("url");
if (p != null)
setUrl(p);
p = filterConfig.getInitParameter("min-estimated-time");
if (p != null)
setMinEstimatedTime(Integer.parseInt(p));
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws ServletException, IOException
{
if (_periodicTask.isActive()) {
dispatch( (HttpServletRequest) request, (HttpServletResponse) response);
}
else {
chain.doFilter(request,response);
}
}
/**
* Disptach to a page that shows a "temporarily unavailable" message, or
* respond with 503.
*/
protected void dispatch(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
long remaining = _periodicTask.getEstimatedTimeRemaining();
// convert to seconds
remaining = ( (1000L + remaining) / 1000L ) - 1;
if (remaining < _minEstimatedTime)
remaining = _minEstimatedTime;
response.addHeader("Cache-Control", "max-age=" + remaining);
response.addHeader("refresh", String.valueOf(remaining));
if (_url != null)
request.getRequestDispatcher(_url).forward(request,response);
else
response.sendError(response.SC_SERVICE_UNAVAILABLE);
}
public void destroy()
{
}
}