/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.command.common;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import de.rcenvironment.core.command.spi.CommandContext;
/**
* Exception class for malformed RCE commands.
*
* @author Robert Mischke
*/
public final class CommandException extends Exception {
/**
* Type of the generated exception.
*
* @author Robert Mischke
*/
public enum Type {
/**
* Pseudo-exception for commands that actively request help information.
*/
HELP_REQUESTED,
/**
* Unknown command.
*/
UNKNOWN_COMMAND,
/**
* Command syntax error.
*/
SYNTAX_ERROR,
/**
* Indicates that the command was syntactically correct, but has encountered an error.
*/
EXECUTION_ERROR
}
private static final long serialVersionUID = 405551760124111120L;
private final Type type;
private final List<String> commandTokens;
private final boolean showDeveloperHelp;
private CommandException(Type type, String message, CommandContext context) {
super(message);
this.type = type;
this.commandTokens = context.getOriginalTokens();
this.showDeveloperHelp = context.isDeveloperCommandSetEnabled(); // TODO move to getter?
}
/**
* Creates a custom {@link Type#SYNTAX_ERROR} exception.
*
* @param message the message text
* @param context the {@link CommandContext}
* @return the generated exception
*/
public static CommandException syntaxError(String message, CommandContext context) {
return new CommandException(Type.SYNTAX_ERROR, message, context);
}
/**
* Creates a "wrong number of parameters" {@link Type#SYNTAX_ERROR} exception.
*
* @param context the {@link CommandContext}
* @return the generated exception
*/
public static CommandException wrongNumberOfParameters(CommandContext context) {
return new CommandException(Type.SYNTAX_ERROR, "Wrong number of parameters", context);
}
/**
* Creates a custom {@link Type#EXECUTION_ERROR} exception.
*
* @param message the message text
* @param context the {@link CommandContext}
* @return the generated exception
*/
public static CommandException executionError(String message, CommandContext context) {
return new CommandException(Type.EXECUTION_ERROR, message, context);
}
/**
* Creates an {@link Type#UNKNOWN_COMMAND} exception.
*
* @param context the {@link CommandContext}
* @return the generated exception
*/
public static CommandException unknownCommand(CommandContext context) {
return new CommandException(Type.UNKNOWN_COMMAND, null, context);
}
/**
* Creates a {@link Type#HELP_REQUESTED} pseudo-exception to request help output.
*
* @param context the {@link CommandContext}
* @return the generated exception
*/
public static CommandException requestHelp(CommandContext context) {
return new CommandException(Type.HELP_REQUESTED, null, context);
}
public Type getType() {
return type;
}
public String getCommandString() {
return StringUtils.join(commandTokens, ' ');
}
/**
* @return true if the problematic command was a developer command; in this case, developer syntax help should be printed
*/
public boolean shouldPrintDeveloperHelp() {
return showDeveloperHelp;
}
@Override
public String toString() {
return de.rcenvironment.core.utils.common.StringUtils.format("Type=%s, Tokens=%s, ShowDevHelp=%s, Message=%s", type, commandTokens,
showDeveloperHelp, getMessage());
}
}