/*
 */
package org.taverna.server.master.worker;

import java.util.List;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import org.taverna.server.master.notification.NotificationEngine;

/**
 * The interface to the database of runs.
 * 
 * @author Donal Fellows
 */
public interface RunDBSupport {
	/**
	 * Scan each run to see if it has finished yet and issue registered
	 * notifications if it has.
	 */
	void checkForFinishNow();

	/**
	 * Remove currently-expired runs from this database.
	 */
	void cleanNow();

	/**
	 * How many runs are stored in the database.
	 * 
	 * @return The current size of the run table.
	 */
	int countRuns();

	/**
	 * Ensure that a run gets persisted in the database. It is assumed that the
	 * value is already in there.
	 * 
	 * @param run
	 *            The run to persist.
	 */
	void flushToDisk(@Nonnull RemoteRunDelegate run);

	/**
	 * Select an arbitrary representative run.
	 * 
	 * @return The selected run.
	 * @throws Exception
	 *             If anything goes wrong.
	 */
	@Nullable
	RemoteRunDelegate pickArbitraryRun() throws Exception;

	/**
	 * Get a list of all the run names.
	 * 
	 * @return The names (i.e., UUIDs) of all the runs.
	 */
	@Nonnull
	List<String> listRunNames();

	/**
	 * @param notificationEngine
	 *            A reference to the notification fabric bean.
	 */
	void setNotificationEngine(NotificationEngine notificationEngine);

	/**
	 * @param notifier
	 *            A reference to the bean that creates messages about workflow
	 *            run termination.
	 */
	void setNotifier(CompletionNotifier notifier);

	/**
	 * @return A reference to the actual factory for remote runs.
	 */
	FactoryBean getFactory();
}