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

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import org.taverna.server.master.common.Workflow;
import org.taverna.server.master.common.Status;
import org.taverna.server.master.exceptions.BadStateChangeException;
import org.taverna.server.master.exceptions.FilesystemAccessException;
import org.taverna.server.master.exceptions.NoDestroyException;
import org.taverna.server.master.exceptions.UnknownRunException;

/**
 * The interface to a taverna workflow run, or "run" for short.
 * 
 * @author Donal Fellows
 */
public interface TavernaRun extends Serializable {
	/**
	 * @return The identifier of the run.
	 */
	String getId();

	/**
	 * @return What was this run was create to execute.
	 */
	Workflow getWorkflow();

	/**
	 * @return The name of the run.
	 */
	String getName();

	/**
	 * @param name
	 *            The new name of the run. May be truncated.
	 */
	void setName(String name);

	/**
	 * @return The name of the Baclava file to use for all inputs, or
	 *         <tt>null</tt> if no Baclava file is set.
	 */
	String getInputBaclavaFile();

	/**
	 * Sets the Baclava file to use for all inputs. This overrides the use of
	 * individual inputs.
	 * 
	 * @param filename
	 *            The filename to use. Must not start with a <tt>/</tt> or
	 *            contain any <tt>..</tt> segments. Will be interpreted relative
	 *            to the run's working directory.
	 * @throws FilesystemAccessException
	 *             If the filename is invalid.
	 * @throws BadStateChangeException
	 *             If the workflow is not in the {@link Status#Initialized
	 *             Initialized} state.
	 */
	void setInputBaclavaFile(String filename) throws FilesystemAccessException,
			BadStateChangeException;

	/**
	 * @return The list of input assignments.
	 */
	List<Input> getInputs();

	/**
	 * Create an input assignment.
	 * 
	 * @param name
	 *            The name of the port that this will be an input for.
	 * @return The assignment reference.
	 * @throws BadStateChangeException
	 *             If the workflow is not in the {@link Status#Initialized
	 *             Initialized} state.
	 */
	Input makeInput(String name) throws BadStateChangeException;

	/**
	 * @return The file (relative to the working directory) to write the outputs
	 *         of the run to as a Baclava document, or <tt>null</tt> if they are
	 *         to be written to non-Baclava files in a directory called
	 *         <tt>out</tt>.
	 */
	String getOutputBaclavaFile();

	/**
	 * Sets where the output of the run is to be written to. This will cause the
	 * output to be generated as a Baclava document, rather than a collection of
	 * individual non-Baclava files in the subdirectory of the working directory
	 * called <tt>out</tt>.
	 * 
	 * @param filename
	 *            Where to write the Baclava file (or <tt>null</tt> to cause the
	 *            output to be written to individual files); overwrites any
	 *            previous setting of this value.
	 * @throws FilesystemAccessException
	 *             If the filename starts with a <tt>/</tt> or contains a
	 *             <tt>..</tt> segment.
	 * @throws BadStateChangeException
	 *             If the workflow is not in the {@link Status#Initialized
	 *             Initialized} state.
	 */
	void setOutputBaclavaFile(String filename)
			throws FilesystemAccessException, BadStateChangeException;

	/**
	 * @return When this run will expire, becoming eligible for automated
	 *         deletion.
	 */
	Date getExpiry();

	/**
	 * Set when this run will expire.
	 * 
	 * @param d
	 *            Expiry time. Deletion will happen some time after that.
	 */
	void setExpiry(Date d);

	/**
	 * @return The current status of the run.
	 */
	Status getStatus();

	/**
	 * Set the status of the run, which should cause it to move into the given
	 * state. This may cause some significant changes.
	 * 
	 * @param s
	 *            The state to try to change to.
	 * @return <tt>null</tt>, or a string describing the incomplete state change
	 *         if the operation has internally timed out.
	 * @throws BadStateChangeException
	 *             If the change to the given state is impossible.
	 */
	String setStatus(Status s) throws BadStateChangeException;

	/**
	 * @return Handle to the main working directory of the run.
	 * @throws FilesystemAccessException
	 */
	Directory getWorkingDirectory() throws FilesystemAccessException;

	/**
	 * @return The list of listener instances attached to the run.
	 */
	List<Listener> getListeners();

	/**
	 * Add a listener to the run.
	 * 
	 * @param listener
	 *            The listener to add.
	 */
	void addListener(Listener listener);

	/**
	 * @return The security context structure for this run.
	 */
	TavernaSecurityContext getSecurityContext();

	/**
	 * Kill off this run, removing all resources which it consumes.
	 * 
	 * @throws NoDestroyException
	 *             If the destruction failed.
	 */
	void destroy() throws NoDestroyException;

	/**
	 * @return When this workflow run was created.
	 */
	Date getCreationTimestamp();

	/**
	 * @return When this workflow run was started, or <tt>null</tt> if it has
	 *         never been started.
	 */
	Date getStartTimestamp();

	/**
	 * @return When this workflow run was found to have finished, or
	 *         <tt>null</tt> if it has never finished (either still running or
	 *         never started).
	 */
	Date getFinishTimestamp();

	/**
	 * Test if this run is really there.
	 * 
	 * <p>
	 * <i>Implementation note:</i> Used to test communication fabrics, etc. so
	 * implementations of this interface that do not delegate to another object
	 * should do nothing.
	 * 
	 * @throws UnknownRunException
	 *             If things fail.
	 */
	void ping() throws UnknownRunException;

	/**
	 * @return whether the run generates provenance data
	 */
	boolean getGenerateProvenance();

	/**
	 * @param generateProvenance
	 *            whether the run generates provenance data
	 */
	void setGenerateProvenance(boolean generateProvenance);
}
