/******************************************************************************* *******************************************************************************/ package at.gv.egiz.eaaf.core.impl.idp.process.springweb; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.filter.RequestContextFilter; import at.gv.egiz.eaaf.core.api.IRequest; import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; import at.gv.egiz.eaaf.core.api.idp.process.Task; import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException; /** * Abstract task implementation providing {@link HttpServletRequest} and {@link HttpServletResponse}. *

* Note that this abstract task requires the Spring (web) framework including a {@link RequestContextFilter} to be set * within {@code web.xml}. * *

 * ...
 * <filter>
 *   <filter-name>requestContextFilter</filter-name>
 *   <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
 * </filter>
 * <filter-mapping>
 *   <filter-name>requestContextFilter</filter-name>
 *   <url-pattern>/*</url-pattern>
 * </filter-mapping>
 * ...
 * 
* * @author tknall * @author tlenz * */ public abstract class AbstractTask implements Task { /** * Executes the task providing the underlying {@link ExecutionContext} {@code executionContext} as well as the * respective {@link HttpServletRequest} and {@link HttpServletResponse}. * * @param executionContext * The execution context (never {@code null}). * @param request * The HttpServletRequest (never {@code null}). * @param response * The HttpServletResponse (never {@code null}). * @throws IllegalStateException * Thrown in case the task is nur being run within the required environment. Refer to javadoc for * further information. * @throws Exception * Thrown in case of error executing the task. */ public abstract void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response) throws TaskExecutionException; /** * Executes the task providing the underlying {@link ExecutionContext} {@code executionContext} * and the {@link IRequest} {@code pendingReq }as well as the * respective {@link HttpServletRequest} and {@link HttpServletResponse}. * * This method sets the pending-request object of the task implementation and starts the * {@code execute} method of the task * * @param pendingReq The pending-request object (never {@code null}). * @param executionContext The execution context (never {@code null}). * @param request The HttpServletRequest (never {@code null}). * @param response The HttpServletResponse (never {@code null}). * @return The pending-request object, because Process-management works recursive * * @throws IllegalStateException * Thrown in case the task is being run within the required environment. Refer to javadoc for * further information. * @throws Exception * Thrown in case of error executing the task. */ protected abstract IRequest internalExecute(IRequest pendingReq, ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response) throws TaskExecutionException; @Override public IRequest execute(IRequest pendingReq, ExecutionContext executionContext) throws TaskExecutionException { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); if (requestAttributes != null && requestAttributes instanceof ServletRequestAttributes) { HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); HttpServletResponse response = ((ServletRequestAttributes) requestAttributes).getResponse(); if (request == null || response == null) { throw new IllegalStateException( "Spring's RequestContextHolder did not provide HttpServletResponse. Did you forget to set the required org.springframework.web.filter.RequestContextFilter in your web.xml."); } return internalExecute(pendingReq, executionContext, request, response); } else { throw new IllegalStateException("Task needs to be executed within a Spring web environment."); } } }