package fi.csc.microarray.messaging.message;

import java.util.List;

import javax.jms.JMSException;
import javax.jms.MapMessage;

/**
 * For sending a named command and a list of parameters.
 *  
 * @author akallio
 */
public class CommandMessage extends ParameterMessage {

	
	private final static String KEY_COMMAND = "command";

	public final static String COMMAND_CANCEL = "cancel";
	public final static String COMMAND_ACK = "acknowledge";
	public final static String COMMAND_EOT = "end-of-transmission";
	public final static String COMMAND_OFFER = "offer";
	public final static String COMMAND_ACCEPT_OFFER = "choose";
	public final static String COMMAND_DESCRIBE = "describe";
	public final static String COMMAND_GET_SOURCE = "get-source";
	public final static String COMMAND_COMP_AVAILABLE = "comp-available";

	public final static String COMMAND_NEW_URL_REQUEST ="new-url-request";
	public final static String COMMAND_GET_URL ="get-url";

	@Deprecated
	public final static String COMMAND_PUBLIC_URL_REQUEST ="public-url-request";
	public final static String COMMAND_PUBLIC_FILES_REQUEST ="public-url-list-request";
	public final static String COMMAND_DISK_SPACE_REQUEST ="disk-space-request";

	public static final String COMMAND_MOVE_FROM_CACHE_TO_STORAGE = "move-from-cache-to-storage";
	public static final String COMMAND_IS_AVAILABLE = "is-available";
	public static final String COMMAND_STORE_SESSION = "store-session";
	public static final String COMMAND_REMOVE_SESSION = "remove-session";
	public static final String COMMAND_LIST_SESSIONS = "list-sessions";
	public static final String COMMAND_GET_STATUS_REPORT = "get-status-report";

	public static final String COMMAND_FILE_OPERATION_SUCCESSFUL = "file-operation-successful";
	public static final String COMMAND_FILE_OPERATION_FAILED = "file-operation-failed";
	public static final String COMMAND_FILE_OPERATION_DENIED = "file-operation-denied";

	public static final String COMMAND_LIST_STORAGE_USAGE_OF_USERS = "get-storage-usage-by-user";
	public static final String COMMAND_LIST_STORAGE_USAGE_OF_SESSIONS = "get-sessions-for-user";
	public static final String COMMAND_GET_STORAGE_USAGE_TOTALS = "get-sessions-for-session-name";
	
	public static final String COMMAND_LIST_RUNNING_JOBS = "get-running-jobs";
	public static final String COMMAND_GET_COMP_STATUS = "get-comp-status";
	public static final String COMMAND_STOP_GRACEFULLY_COMP = "shutdown-comp";

	public static final String COMMAND_GET_JOB = "get-job";

	public static final String COMMAND_PURGE_OLD_JOBS = "purge-old-jobs";
	
	public static final String COMMAND_LOGIN = "login";

	public static final String COMMAND_LOG_STATUS = "log-status";
	
	private String command;
	

	/**
	 * When only one kind of commands are passed to a given topic, this constructor
	 * can be used to create anonymous command.
	 */
	public CommandMessage() {
		this(null, null);
	}
	
	public CommandMessage(String command) {
		this(command, null);		
	}
	
	public CommandMessage(String command, List<String> parameters) {
		super(parameters);
		this.command = command;		
	}
	
	@Override
	public void unmarshal(MapMessage from) throws JMSException {
		super.unmarshal(from);
		this.command = from.getString(KEY_COMMAND);
	}
	
	@Override
	public void marshal(MapMessage to) throws JMSException {
		super.marshal(to);
		to.setString(KEY_COMMAND, command);
	}
	
	/**
	 * Returns the command or null if it is anonymous.
	 */
	public String getCommand() {
		return command;
	}
	
	/**
	 * Gets parameters in the order they were inserted.
	 * No safety precautions, should only be used in messaging
	 * between system components (never for user input).
	 */
	public List<String> getParameters() {
		return super.getParameters();
	}
}