/*
 * Copyright (C) 2010-2012 The University of Manchester
 * 
 * See the file "LICENSE" for license terms.
 */
package org.taverna.server.localworker.api;

import java.io.File;
import java.util.List;
import java.util.Map;

import org.taverna.server.localworker.impl.LocalWorker;
import org.taverna.server.localworker.remote.ImplementationException;
import org.taverna.server.localworker.remote.RemoteListener;
import org.taverna.server.localworker.remote.RemoteStatus;
import org.taverna.server.localworker.server.UsageRecordReceiver;

/**
 * The interface between the connectivity layer and the thunk to the
 * subprocesses.
 * 
 * @author Donal Fellows
 */
public interface Worker {
	/**
	 * Fire up the workflow. This causes a transition into the operating state.
	 * 
	 * @param local
	 *            The reference to the factory class for this worker.
	 * @param executeWorkflowCommand
	 *            The command to run to execute the workflow.
	 * @param workflow
	 *            The workflow document to execute.
	 * @param workingDir
	 *            What directory to use as the working directory.
	 * @param inputBaclavaFile
	 *            The baclava file to use for inputs, or <tt>null</tt> to use
	 *            the other <b>input*</b> arguments' values.
	 * @param inputRealFiles
	 *            A mapping of input names to files that supply them. Note that
	 *            we assume that nothing mapped here will be mapped in
	 *            <b>inputValues</b>.
	 * @param inputValues
	 *            A mapping of input names to values to supply to them. Note
	 *            that we assume that nothing mapped here will be mapped in
	 *            <b>inputFiles</b>.
	 * @param inputDelimiters
	 *            A mapping of input names to characters used to split them into
	 *            lists.
	 * @param outputBaclavaFile
	 *            What baclava file to write the output from the workflow into,
	 *            or <tt>null</tt> to have it written into the <tt>out</tt>
	 *            subdirectory.
	 * @param contextDirectory
	 *            The directory containing the keystore and truststore. <i>Must
	 *            not be <tt>null</tt>.</i>
	 * @param keystorePassword
	 *            The password to the keystore and truststore. <i>Must not be
	 *            <tt>null</tt>.</i>
	 * @param generateProvenance
	 *            Whether to generate a run bundle containing provenance data.
	 * @param environment
	 *            Any environment variables that need to be added to the
	 *            invokation.
	 * @param masterToken
	 *            The internal name of the workflow run.
	 * @param runtimeSettings
	 *            List of configuration details for the forked runtime.
	 * @return Whether a successful start happened.
	 * @throws Exception
	 *             If any of quite a large number of things goes wrong.
	 */
	boolean initWorker(LocalWorker local, String executeWorkflowCommand,
			byte[] workflow, File workingDir, File inputBaclavaFile,
			Map<String, File> inputRealFiles, Map<String, String> inputValues,
			Map<String, String> inputDelimiters, File outputBaclavaFile,
			File contextDirectory, char[] keystorePassword,
			boolean generateProvenance, Map<String, String> environment,
			String masterToken, List<String> runtimeSettings) throws Exception;

	/**
	 * Kills off the subprocess if it exists and is alive.
	 * 
	 * @throws Exception
	 *             if anything goes badly wrong when the worker is being killed
	 *             off.
	 */
	void killWorker() throws Exception;

	/**
	 * Move the worker out of the stopped state and back to operating.
	 * 
	 * @throws Exception
	 *             if it fails (which it always does; operation currently
	 *             unsupported).
	 */
	void startWorker() throws Exception;

	/**
	 * Move the worker into the stopped state from the operating state.
	 * 
	 * @throws Exception
	 *             if it fails (which it always does; operation currently
	 *             unsupported).
	 */
	void stopWorker() throws Exception;

	/**
	 * @return The status of the workflow run. Note that this can be an
	 *         expensive operation.
	 */
	RemoteStatus getWorkerStatus();

	/**
	 * @return The listener that is registered by default, in addition to all
	 *         those that are explicitly registered by the user.
	 */
	RemoteListener getDefaultListener();

	/**
	 * @param receiver
	 *            The destination where any final usage records are to be
	 *            written in order to log them back to the server.
	 */
	void setURReceiver(UsageRecordReceiver receiver);

	/**
	 * Arrange for the deletion of any resources created during worker process
	 * construction. Guaranteed to be the last thing done before finalization.
	 * 
	 * @throws ImplementationException
	 *             If anything goes wrong.
	 */
	void deleteLocalResources() throws ImplementationException;
}
