/******************************************************************************* * Copyright 2017 Graz University of Technology * EAAF-Core Components has been developed in a cooperation between EGIZ, * A-SIT+, 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 { /** * 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."); } } }