diff options
author | Mili Verma <mili.verma@isode.com> | 2012-01-06 15:00:55 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2012-01-09 15:54:52 (GMT) |
commit | cc760bfd15caadb56bfef477cb54dc94c25f7fa7 (patch) | |
tree | 05f5918b97488b05ca1266c0644a3874adb98129 /src/com/isode/stroke/elements/Command.java | |
parent | 12b1d667965556002ea0fd300a71bcdf57634e90 (diff) | |
download | stroke-cc760bfd15caadb56bfef477cb54dc94c25f7fa7.zip stroke-cc760bfd15caadb56bfef477cb54dc94c25f7fa7.tar.bz2 |
Port Adhoc commands to Stroke
This patch ports the Adhoc commands from Swiften to Stroke.
It also ports their unit tests.
Test-information:
Unit tests pass.
MLC able to use the ad-hoc command fine.
Diffstat (limited to 'src/com/isode/stroke/elements/Command.java')
-rw-r--r-- | src/com/isode/stroke/elements/Command.java | 473 |
1 files changed, 473 insertions, 0 deletions
diff --git a/src/com/isode/stroke/elements/Command.java b/src/com/isode/stroke/elements/Command.java new file mode 100644 index 0000000..75f3bf2 --- /dev/null +++ b/src/com/isode/stroke/elements/Command.java @@ -0,0 +1,473 @@ +/* + * Copyright (c) 2012 Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010 Kevin Smith + * All rights reserved. + */ + +package com.isode.stroke.elements; + +import java.util.ArrayList; +import java.util.List; + +/** + * Ad-Hoc Command (XEP-0050). + */ +public class Command extends Payload { + /** + * Attribute "node" + */ + public static final String COMMAND_ATTRIBUTE_NODE = "node"; + + /** + * Attribute "sessionid" + */ + public static final String COMMAND_ATTRIBUTE_SESSION_ID = "sessionid"; + + /** + * Attribute "status" + */ + public static final String COMMAND_ATTRIBUTE_STATUS = "status"; + + /** + * Attribute "action" + */ + public static final String COMMAND_ATTRIBUTE_ACTION = "action"; + + /** + * Element "actions" + */ + public static final String COMMAND_ELEMENT_ACTIONS = "actions"; + + /** + * Attribute "execute" + */ + public static final String COMMAND_ATTRIBUTE_EXECUTE = "execute"; + + /** + * Element "note" + */ + public static final String COMMAND_ELEMENT_NOTE = "note"; + + /** + * Attribute "type" + */ + public static final String COMMAND_ATTRIBUTE_TYPE = "type"; + + /** + * Current status of the command. + */ + public enum Status { + /** + * The command is being executed. + */ + EXECUTING("executing"), + /** + * The command has completed. The command session has ended. + */ + COMPLETED("completed"), + /** + * The command has been cancelled. The command session has ended. + */ + CANCELED("canceled"), + /** + * No status has been set for the command. + */ + NO_STATUS(""); + + private String stringForm_; + + private Status(String stringForm) { + stringForm_ = stringForm; + } + + /** + * Get status from its string form. + * + * @param stringForm String form of status, can be null + * + * @return Corresponding status if match found, otherwise + * {@link #NO_STATUS}. Will never be null. + */ + public static Status getStatus(String stringForm) { + if (stringForm != null) { + for (Status status : Status.values()) { + if (status.stringForm_.equals(stringForm)) { + return status; + } + } + } + + return NO_STATUS; + } + + /** + * @return String form of status, will never be null + */ + public String getStringForm() { + return stringForm_; + } + }; + + /** + * The action to undertake with the given command. + */ + public enum Action { + /** + * The command should be cancelled. + */ + CANCEL("cancel"), + /** + * The command should be executed or continue to be executed. + */ + EXECUTE("execute"), + /** + * The command should be completed (if possible). + */ + COMPLETE("complete"), + /** + * The command should digress to the previous stage of execution. + */ + PREV("prev"), + /** + * The command should progress to the next stage of execution. + */ + NEXT("next"), + /** + * No action is available for the command. + */ + NO_ACTION(""); + + private String stringForm_; + + private Action(String stringForm) { + stringForm_ = stringForm; + } + + /** + * Get action from its string form. + * + * @param stringForm String form of action, can be null + * + * @return Corresponding action if match found, otherwise + * {@link Action#NO_ACTION}. Will never be null. + */ + public static Action getAction(String stringForm) { + if (stringForm != null) { + for (Action action : Action.values()) { + if (action.stringForm_.equals(stringForm)) { + return action; + } + } + } + + return NO_ACTION; + } + + /** + * @return String form of action, will never be null + */ + public String getStringForm() { + return stringForm_; + } + }; + + /** + * This class contains information about the current status of the command. + * TODO: I am not sure why this is not an immutable class. + */ + public static class Note { + /** + * Severity of the note. + */ + public enum Type { + /** + * The note is informational only. This is not really an exceptional + * condition. + */ + INFO("info"), + /** + * The note indicates a warning. Possibly due to illogical (yet + * valid) data. + */ + WARN("warn"), + /** + * The note indicates an error. The text should indicate the reason + * for the error. + */ + ERROR("error"); + + private String stringForm_; + + private Type(String stringForm) { + stringForm_ = stringForm; + } + + /** + * Get type from its string form. + * + * @param stringForm String form of type, can be null + * + * @return Corresponding type if match found, otherwise + * {@link Type#INFO}. Will never be null. + */ + public static Type getType(String stringForm) { + if (stringForm != null) { + for (Type type : Type.values()) { + if (type.stringForm_.equals(stringForm)) { + return type; + } + } + } + + return INFO; + } + + /** + * @return String form of type, will never be null + */ + public String getStringForm() { + return stringForm_; + } + }; + + /** + * Create a note element for the Ad-Hoc command. + * + * @param note user-readable text, can be null which will be stored as + * an empty string + * @param type Severity of the note, can be null which will be stored as + * {@link Type#INFO} + */ + public Note(String note, Type type) { + this.note = (note != null) ? note : ""; + this.type = (type != null) ? type : Type.INFO; + } + + /** + * User-readable text, will never be null + */ + public final String note; + + /** + * Severity of the note, will never be null + */ + public final Type type; + }; + + private String node_; + private String sessionID_; + private Action action_; + private Status status_; + private Action executeAction_; + private List<Action> availableActions_ = new ArrayList<Action>(); + private List<Note> notes_ = new ArrayList<Note>(); + private Form form_ = null; + + private void assignData(String node, String sessionID, Action action, + Status status) { + setNode(node); + setSessionID(sessionID); + setAction(action); + setStatus(status); + setExecuteAction(null); + } + + /** + * Create an Ad-Hoc command with the given node, session ID, status and + * {@link Action#NO_ACTION} action. + * + * @param node Command identification, can be null which will be stored as + * an empty string + * @param sessionID The ID of the session within which the command exists, + * can be null (which will be stored as an empty string) or empty + * if this is the first stage of the command and the client does + * not know it yet + * @param status Status of the command, can be null which will be stored as + * {@link Status#NO_STATUS} + */ + public Command(String node, String sessionID, Status status) { + assignData(node, sessionID, Action.NO_ACTION, status); + } + + /** + * Create an Ad-Hoc command with the given node, session ID, action and + * {@link Status#NO_STATUS} status. + * + * @param node Command identification, can be null which will be stored as + * an empty string + * @param sessionID The ID of the session within which the command exists, + * can be null (which will be stored as an empty string) or empty + * if this is the first stage of the command and the client does + * not know it yet + * @param action action of the command, can be null which will be stored as + * {@link Action#EXECUTE} + */ + public Command(String node, String sessionID, Action action) { + assignData(node, sessionID, action, null); + } + + /** + * Create an Ad-Hoc command with an empty node, empty session ID, + * {@link Action#EXECUTE} action and {@link Status#NO_STATUS} status. + */ + public Command() { + this(null, null, (Action) null); + } + + /** + * @return The command ID, will never be null + */ + public String getNode() { + return node_; + } + + /** + * Set command ID. + * + * @param node Command identification, can be null which will be stored as + * an empty string + */ + public void setNode(String node) { + node_ = (node != null) ? node : ""; + } + + /** + * @return The ID of the session within which the command exists, can be + * empty if this is the first stage of the command and the client + * does not know it yet, will never be null + */ + public String getSessionID() { + return sessionID_; + } + + /** + * Set session ID. + * + * @param sessionID The ID of the session within which the command exists, + * can be null (which will be stored as an empty string) or empty + * if this is the first stage of the command and the client does + * not know it yet + */ + public void setSessionID(String sessionID) { + sessionID_ = (sessionID != null) ? sessionID : ""; + } + + /** + * @return action of the command, will never be null + */ + public Action getAction() { + return action_; + } + + /** + * Set action of the command. + * + * @param action action of the command, can be null which will be stored as + * {@link Action#EXECUTE} + */ + public void setAction(Action action) { + action_ = (action != null) ? action : Action.EXECUTE; + } + + /** + * @return execute action of the command, will never be null + */ + public Action getExecuteAction() { + return executeAction_; + } + + /** + * Set execute action of the command. + * + * @param action execute action of the command, can be null which will be + * stored as {@link Action#NO_ACTION} + */ + public void setExecuteAction(Action action) { + executeAction_ = (action != null) ? action : Action.NO_ACTION; + } + + /** + * @return status of the command, will never be null + */ + public Status getStatus() { + return status_; + } + + /** + * Set status of the command. + * + * @param status Status of the command, can be null which will be stored as + * {@link Status#NO_STATUS} + */ + public void setStatus(Status status) { + status_ = (status != null) ? status : Status.NO_STATUS; + } + + /** + * @return List of allowed actions for this stage of execution, will never + * be null + */ + public List<Action> getAvailableActions() { + return new ArrayList<Action>(availableActions_); + } + + /** + * Add to the list of allowed actions for this stage of execution. + * + * @param action Action to add, can be null in which case it will be ignored + */ + public void addAvailableAction(Action action) { + if (action != null) { + availableActions_.add(action); + } + } + + /** + * @return List of information elements for the current status of the + * command, will never be null + */ + public List<Note> getNotes() { + return new ArrayList<Note>(notes_); + } + + /** + * Add to the list of information elements for the current status of the + * command. + * + * @param note Note to add, can be null in which case it will be ignored + */ + public void addNote(Note note) { + if (note != null) { + notes_.add(note); + } + } + + /** + * @return form of the command, can be null. The instance of the form stored + * in the object is returned, a copy is not made. + */ + public Form getForm() { + return form_; + } + + /** + * Set form for the command. + * + * @param payload Form for the command, can be null. The instance of the + * form is stored in the object, a copy is not made. + */ + public void setForm(Form payload) { + form_ = payload; + } + + @Override + public String toString() { + return Command.class.getSimpleName() + "\nnode: " + node_ + + "\nsession ID: " + sessionID_ + "\naction: " + action_ + + "\nstatus: " + status_ + "\nexecute action: " + + executeAction_; + } +} |