/* * Copyright 2017 Graz University of Technology EAAF-Core Components has been developed in a * cooperation between EGIZ, A-SIT Plus, A-SIT, and Graz University of Technology. * * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by the European * Commission - subsequent versions of the EUPL (the "Licence"); You may not use this work except in * compliance with the Licence. You may obtain a copy of the Licence at: * https://joinup.ec.europa.eu/news/understanding-eupl-v12 * * Unless required by applicable law or agreed to in writing, software distributed under the Licence * is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the Licence for the specific language governing permissions and limitations under * the Licence. * * This product combines work with different licenses. See the "NOTICE" text file for details on the * various modules and licenses. The "NOTICE" text file is part of the distribution. Any derivative * works that you distribute must include a readable copy of the "NOTICE" text file. */ 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 { @Override public IRequest execute(final IRequest pendingReq, final ExecutionContext executionContext) throws TaskExecutionException { final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); if (requestAttributes != null && requestAttributes instanceof ServletRequestAttributes) { final HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); final 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."); } } /** * 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; }