/* * 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.controller; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.text.StringEscapeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import at.gv.egiz.eaaf.core.api.IRequest; import at.gv.egiz.eaaf.core.api.IRequestStorage; import at.gv.egiz.eaaf.core.api.IStatusMessenger; import at.gv.egiz.eaaf.core.api.data.EaafConstants; import at.gv.egiz.eaaf.core.api.idp.process.ProcessEngine; import at.gv.egiz.eaaf.core.exceptions.EaafException; import at.gv.egiz.eaaf.core.exceptions.EaafIllegalStateException; import at.gv.egiz.eaaf.core.impl.utils.TransactionIdUtils; /** * Servlet that resumes a suspended process (in case of asynchronous tasks). * * @author tknall * */ public abstract class AbstractProcessEngineSignalController extends AbstractController { private static final Logger log = LoggerFactory.getLogger(AbstractProcessEngineSignalController.class); @Autowired(required = true) protected ProcessEngine processEngine; @Autowired(required = true) protected IRequestStorage requestStorage; protected void signalProcessManagement(final HttpServletRequest req, final HttpServletResponse resp) throws IOException, EaafException { final String pendingRequestID = StringEscapeUtils.escapeHtml4(getPendingRequestId(req)); IRequest pendingReq = null; try { if (pendingRequestID == null) { throw new EaafException(IStatusMessenger.CODES_INTERNAL_ERROR_AUTH_NOPENDIGREQID, null); } pendingReq = requestStorage.getPendingRequest(pendingRequestID); if (pendingReq == null) { log.info("No PendingRequest with Id: " + pendingRequestID + " Maybe, a transaction timeout occure."); throw new EaafException(IStatusMessenger.CODES_INTERNAL_ERROR_AUTH_TIMEOUT, new Object[] { pendingRequestID }); } // change pending-request ID requestStorage.changePendingRequestID(pendingReq); // process instance is mandatory if (pendingReq.getProcessInstanceId() == null) { throw new EaafIllegalStateException( new Object[] { "MOA session does not provide process instance id." }); } // wake up next task processEngine.signal(pendingReq); } catch (final Exception ex) { handleError(null, ex, req, resp, pendingReq); } finally { // MOASessionDBUtils.closeSession(); TransactionIdUtils.removeAllLoggingVariables(); } } /** * Retrieves the current pending-request id from the HttpServletRequest * parameter * *

* Note that this class/method can be overwritten by modules providing their own * strategy of retrieving the respective pending-request id. * * @param request The unterlying HttpServletRequest. * @return The current pending-request id. */ public String getPendingRequestId(final HttpServletRequest request) { return StringEscapeUtils .escapeHtml4(request.getParameter(EaafConstants.PARAM_HTTP_TARGET_PENDINGREQUESTID)); } }