/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wps.executor;
import java.util.Map;
import org.geoserver.threadlocals.ThreadLocalsTransfer;
import org.geoserver.wps.resource.WPSResourceManager;
import org.geotools.process.ProcessException;
import org.opengis.feature.type.Name;
import org.opengis.util.ProgressListener;
/**
* Handles the execution of a certain class of processes. Implementations using thread pools should
* take care of transferring the thread locals inside the thread pool leveraging the
* {@link ThreadLocalsTransfer} class.
*
* @author Andrea Aime - GeoSolutions
*/
public interface ProcessManager {
/**
* If this process manager can handle the submission
*/
boolean canHandle(Name processName);
/**
* Synchronous submission, returns the process outputs. GeoServer will use this call only to run
* nested processes in a process chain, do not use a thread pool for this one as this will
* result in a deadlock in case there are enough parallel requests with chained processes (which
* will result in each request taking more than one execution thread, which are limited, one of
* the common causes for deadlock) <br/>
* It is responsibility of the implementor to call
* {@link WPSResourceManager#setCurrentExecutionId(String)} from within the thread that is
* evaluating the inputs and executing the process to ensure proper temporary resource handling
* (some inputs will parse during execution and require temporary storage, same goes for certain
* processes in need to use temporary files)
*
*
* @param executionId The unique identifier generated by GeoServer for this execution
* @param processName The name of the process
* @param inputs The process inputs
* @param listener The progress listener, that the process will use to report about its
* progress, and check for cancellation
* @return The results
* @throws ProcessException
*/
Map<String, Object> submitChained(String executionId, Name processName,
Map<String, Object> inputs, ProgressListener listener) throws ProcessException;
/**
* Asynchronous submission, not blocking. The process outputs can be retrieved using
* {@link #getOutput(String, long)}. <br/>
* It is responsibility of the implementor to call
* {@link WPSResourceManager#setCurrentExecutionId(String)} from within the thread that is
* evaluating the inputs and executing the process to ensure proper temporary resource handling
* (some inputs will parse during execution and require temporary storage, same goes for certain
* processes in need to use temporary files)
*
* @param executionId
* @param processName The name of the process
* @param inputs The process inputs
* @param listener The progress listener, that the process will use to report about its
* progress, and check for cancellation
* @param background Whether this submission is for a background process (that can run at a lower
* pace) or a foreground one. This is used to differentiate between a synchronous WPS
* request, that has a time sensitive HTTP connection associated to it, and a
* asynchronous one, in which the client will poll the server for updates
* @throws ProcessException
*/
void submit(String executionId, Name processName, Map<String, Object> inputs,
ProgressListener listener, boolean background)
throws ProcessException;
/**
* Gets the process output. Will block the caller for at most "timeout" if the process execution
* is not complete. Once the output is retrieved the process will be marked as terminated and it
* won't be possible to get its outputs or status anymore.
*
* @param executionId
* @param timeout
*
*/
Map<String, Object> getOutput(String executionId, long timeout) throws ProcessException;
/**
* Attempts to cancel the process execution. If the process is queued for execution it will be
* removed from the queue, if it's still running a best effort attempt to stop the process will
* be made.
*/
void cancel(String executionId);
}