package com.redhat.ceylon.common.tool; import java.util.Collections; import java.util.List; /** * Exception for problems parsing options and arguments. */ public abstract class OptionArgumentException extends ToolError { private static String getIllegalArgumentErrorMessage(Throwable t) { String msg = ""; if (t.getLocalizedMessage() != null) { msg += t.getLocalizedMessage(); } if (t.getCause() instanceof IllegalArgumentException && t.getCause().getLocalizedMessage() != null && !t.getMessage().endsWith(t.getCause().getLocalizedMessage())) { msg += ": " + t.getCause().getLocalizedMessage(); } return msg; } private static String getToolName(ArgumentModel<?> argumentModel) { return getToolName(argumentModel.getToolModel()); } private static String getToolName(OptionModel<?> optionModel) { return getToolName(optionModel.getToolModel()); } private static String getToolName(ToolModel<?> toolModel) { String toolName = toolModel.getName(); if (toolName == null || toolName.isEmpty()) { toolName = Tools.progName(); } return toolName; } private OptionArgumentException(String message) { super(message); } private OptionArgumentException(String message, Throwable cause) { super(message, cause); } OptionArgumentException(Throwable cause) { super(cause); } public static class ToolInitializationException extends OptionArgumentException { private ToolModel<?> toolModel; public ToolInitializationException(ToolModel<?> toolModel, Throwable cause) { super(cause.getLocalizedMessage(), cause); this.toolModel = toolModel; } public ToolModel<?> getToolModel() { return toolModel; } @Override public String getErrorMessage() { return getIllegalArgumentErrorMessage(this); } } public static class OptionWithoutArgumentException extends OptionArgumentException { private final OptionModel<?> optionModel; public OptionWithoutArgumentException(OptionModel<?> optionModel, String arg) { super(ToolMessages.msg("option.without.argument", arg, getToolName(optionModel))); this.optionModel = optionModel; } public OptionModel<?> getOptionModel() { return optionModel; } public ToolModel<?> getToolModel() { return getOptionModel().getToolModel(); } } public static class UnexpectedArgumentException extends OptionArgumentException { public UnexpectedArgumentException(String arg, ToolModel<?> toolModel) { super(ToolMessages.msg("argument.unexpected", arg, getToolName(toolModel))); } } public static class InvalidOptionValueException extends OptionArgumentException { private final OptionModel<?> optionModel; private final String givenOption; private final String badValue; public InvalidOptionValueException(Throwable cause, OptionModel<?> optionModel, String givenOption, String badValue) { super(ToolMessages.msg("option.invalid.value", givenOption, getToolName(optionModel), badValue), cause); this.optionModel = optionModel; this.givenOption = givenOption; this.badValue = badValue; } public OptionModel<?> getOptionModel() { return optionModel; } public ToolModel<?> getToolModel() { return getOptionModel().getToolModel(); } public String getGivenOption() { return givenOption; } public String getBadValue() { return badValue; } @Override public String getErrorMessage() { return getIllegalArgumentErrorMessage(this); } } public static class InvalidArgumentValueException extends OptionArgumentException { private final ArgumentModel<?> argumentModel; private final String badValue; public InvalidArgumentValueException(Throwable cause, ArgumentModel<?> argumentModel, String badValue) { super(ToolMessages.msg("argument.invalid.value", argumentModel.getName(), getToolName(argumentModel), badValue), cause); this.argumentModel = argumentModel; this.badValue = badValue; } public ArgumentModel<?> getArgumentModel() { return argumentModel; } public ToolModel<?> getToolModel() { return getArgumentModel().getToolModel(); } public String getBadValue() { return badValue; } @Override public String getErrorMessage() { return getIllegalArgumentErrorMessage(this); } } public static class OptionMultiplicityException extends OptionArgumentException { private final OptionModel<?> optionModel; public OptionMultiplicityException(OptionModel<?> optionModel, String givenOptions, int bound, String msgKey) { super(ToolMessages.msg(msgKey, givenOptions, getToolName(optionModel), bound)); this.optionModel = optionModel; } public OptionModel<?> getOptionModel() { return optionModel; } public ToolModel<?> getToolModel() { return getOptionModel().getToolModel(); } } public static class ArgumentMultiplicityException extends OptionArgumentException { private ArgumentModel<?> argumentModel; public ArgumentMultiplicityException(ArgumentModel<?> argumentModel, int bound, String msgKey) { super(ToolMessages.msg(msgKey, argumentModel.getName(), getToolName(argumentModel), bound)); this.argumentModel = argumentModel; } public ArgumentModel<?> getArgumentModel() { return argumentModel; } public ToolModel<?> getToolModel() { return getArgumentModel().getToolModel(); } } public static class UnknownOptionException extends OptionArgumentException { private final List<UnknownOptionException> aggregating; private final String longName; private final Character shortName; private ToolModel<?> toolModel; private UnknownOptionException( ToolModel<?> toolModel, String longName, Character shortName, List<UnknownOptionException> aggregating, String msg) { super(msg); this.toolModel = toolModel; this.longName = longName; this.shortName = shortName; this.aggregating = aggregating; } public ToolModel<?> getToolModel() { return toolModel; } public String getLongName() { return longName; } public Character getShortName() { return shortName; } public List<UnknownOptionException> getAggregating() { return aggregating; } public static UnknownOptionException shortOption(ToolModel<?> toolModel, char shortName, String arg) { String msgKey; if (arg.equals("-"+shortName)) { msgKey = "option.unknown.short"; } else { msgKey = "option.unknown.short.in.combined"; } return new UnknownOptionException(toolModel, null, shortName, Collections.<UnknownOptionException>emptyList(), ToolMessages.msg(msgKey, "-" + shortName, getToolName(toolModel), arg)); } public static UnknownOptionException longOption(ToolModel<?> toolModel, String arg) { int idx = arg.indexOf('='); String longOption = arg.substring(2, idx == -1 ? arg.length() : idx); return new UnknownOptionException(toolModel, longOption, null, Collections.<UnknownOptionException>emptyList(), ToolMessages.msg("option.unknown.long", arg, getToolName(toolModel))); } public static UnknownOptionException aggregate( List<UnknownOptionException> unrecognised) { StringBuilder sb = new StringBuilder(); for (UnknownOptionException u : unrecognised) { if (u.getLongName() != null) { sb.append(u.getLongName()); } else if (u.getShortName() != null) { sb.append(u.getShortName()); } sb.append(", "); } sb.setLength(sb.length()-2); UnknownOptionException result = new UnknownOptionException(null, null, null, unrecognised, ToolMessages.msg("option.unknown.multiple", sb.toString())); return result; } } }