package org.caudexorigo.cli;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import org.caudexorigo.cli.ArgumentValidationException.ValidationError.ErrorType;
/**
* The arguments are not valid
*
* @author tim
*/
public class ArgumentValidationException extends CliException
{
private static final long serialVersionUID = -4781861924515211053L;
private static final ResourceBundle m_messages = ResourceBundle.getBundle("org.caudexorigo.cli.Messages", Locale.getDefault());
public interface ValidationError
{
enum ErrorType
{
UnexpectedOption
{
public String getDescription(final ValidationError error)
{
return m_messages.getString("validationError.UnexpectedOption");
}
},
MissingValue
{
public String getDescription(final ValidationError error)
{
return m_messages.getString("validationError.MissingValue");
}
},
MisplacedOption
{
public String getDescription(final ValidationError error)
{
return String.format(m_messages.getString("validationError.MisplacedOption"), error.getMessage());
}
},
UnexpectedValue
{
public String getDescription(final ValidationError error)
{
return m_messages.getString("validationError.UnexpectedValue");
}
},
AdditionalValue
{
public String getDescription(final ValidationError error)
{
return m_messages.getString("validationError.AdditionalValue");
}
},
MissingOption
{
public String getDescription(final ValidationError error)
{
return m_messages.getString("validationError.MissingOption");
}
},
InvalidValueForType
{
public String getDescription(final ValidationError error)
{
return String.format(m_messages.getString("validationError.InvalidValueForType"), error.getMessage());
}
},
UnableToConstructType
{
public String getDescription(final ValidationError error)
{
return String.format(m_messages.getString("validationError.UnableToConstructType"), error.getMessage());
}
},
PatternMismatch
{
public String getDescription(final ValidationError error)
{
return String.format(m_messages.getString("validationError.PatternMismatch"), error.getMessage());
}
},
HelpRequested
{
public String getDescription(final ValidationError error)
{
return error.getMessage();
}
};
public abstract String getDescription(ValidationError error);
}
String getMessage();
ErrorType getErrorType();
}
private static class ValidationErrorImpl implements ValidationError
{
private final ErrorType m_errorType;
private final ArgumentSpecification m_specification;
private final String m_message;
public ValidationErrorImpl(final ErrorType errorType, final ArgumentSpecification specification)
{
this(errorType, specification, "");
}
public ValidationErrorImpl(final ErrorType errorType, final ArgumentSpecification specification, final String message)
{
m_errorType = errorType;
m_specification = specification;
m_message = message;
}
public ErrorType getErrorType()
{
return m_errorType;
}
public ArgumentSpecification getSpecification()
{
return m_specification;
}
@Override
public String toString()
{
return String.format("%s: %s", getErrorType().getDescription(ValidationErrorImpl.this), getSpecification());
}
public String getMessage()
{
return m_message;
}
}
private final ArrayList<ValidationError> m_validationErrors;
private final String m_message;
public ArgumentValidationException(final ValidationError validationError)
{
this(Arrays.asList(validationError));
}
public ArgumentValidationException(final List<ValidationError> validationErrors)
{
m_validationErrors = new ArrayList<ValidationError>(validationErrors);
final StringBuilder message = new StringBuilder();
String separator = "";
for (final ValidationError error : validationErrors)
{
message.append(separator).append(error.toString());
separator = System.getProperty("line.separator");
}
m_message = message.toString();
}
public ArrayList<ValidationError> getValidationErrors()
{
return m_validationErrors;
}
@Override
public String getMessage()
{
return m_message;
}
static ValidationError createUnexpectedOptionError(final String name)
{
return new ValidationErrorImpl(ErrorType.UnexpectedOption, new UnexpectedOptionSpecification(name));
}
static ValidationError createAdditionalValuesError(final ArgumentSpecification optionSpecification)
{
return new ValidationErrorImpl(ErrorType.AdditionalValue, optionSpecification);
}
static ValidationError createMissingValueError(final ArgumentSpecification optionSpecification)
{
return new ValidationErrorImpl(ErrorType.MissingValue, optionSpecification);
}
static ValidationError createUnexpectedValueError(final ArgumentSpecification optionSpecification)
{
return new ValidationErrorImpl(ErrorType.UnexpectedValue, optionSpecification);
}
static ValidationError createMissingOptionError(ArgumentSpecification optionSpecification)
{
return new ValidationErrorImpl(ErrorType.MissingOption, optionSpecification);
}
static ValidationError createInvalidValueForType(final ArgumentSpecification optionSpecification, final String message)
{
return new ValidationErrorImpl(ErrorType.InvalidValueForType, optionSpecification, message);
}
static ValidationError createUnableToConstructType(final ArgumentSpecification optionSpecification, final String message)
{
return new ValidationErrorImpl(ErrorType.UnableToConstructType, optionSpecification, message);
}
static ValidationError createPatternMismatch(final ArgumentSpecification optionSpecification, final String message)
{
return new ValidationErrorImpl(ErrorType.PatternMismatch, optionSpecification, message);
}
static ValidationError createhelpRequested(final OptionsSpecification specification)
{
return new HelpValidationErrorImpl(specification);
}
}