This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-cli.git
The following commit(s) were added to refs/heads/master by this push: new 9daa228 Use generics to avoid defining a new method that throws Exception 9daa228 is described below commit 9daa228c9a87ab6e1ae705913f27bc850bd202db Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Mon Jan 29 09:14:23 2024 -0500 Use generics to avoid defining a new method that throws Exception Javadoc --- .../java/org/apache/commons/cli/CommandLine.java | 2 +- .../java/org/apache/commons/cli/Converter.java | 46 ++++++++++++++-------- src/main/java/org/apache/commons/cli/Option.java | 10 ++--- .../org/apache/commons/cli/ParseException.java | 4 +- .../apache/commons/cli/PatternOptionBuilder.java | 4 +- .../java/org/apache/commons/cli/TypeHandler.java | 10 ++--- 6 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/apache/commons/cli/CommandLine.java b/src/main/java/org/apache/commons/cli/CommandLine.java index 0b6ff52..7f1bf48 100644 --- a/src/main/java/org/apache/commons/cli/CommandLine.java +++ b/src/main/java/org/apache/commons/cli/CommandLine.java @@ -446,7 +446,7 @@ public class CommandLine implements Serializable { try { return res == null ? defaultValue : (T) option.getConverter().apply(res); - } catch (final Exception e) { + } catch (final Throwable e) { throw ParseException.wrap(e); } } diff --git a/src/main/java/org/apache/commons/cli/Converter.java b/src/main/java/org/apache/commons/cli/Converter.java index d0d202c..b915689 100644 --- a/src/main/java/org/apache/commons/cli/Converter.java +++ b/src/main/java/org/apache/commons/cli/Converter.java @@ -17,7 +17,9 @@ package org.apache.commons.cli; import java.io.File; +import java.net.MalformedURLException; import java.net.URL; +import java.nio.file.InvalidPathException; import java.nio.file.Path; import java.text.SimpleDateFormat; import java.util.Date; @@ -27,28 +29,36 @@ import java.util.Date; * Like {@code Function<String,T>} but can throw an Exception. * * @param <T> The return type for the function. + * @param <E> The kind of thrown exception or error. * @since 1.7.0 */ @FunctionalInterface -public interface Converter<T> { +public interface Converter<T, E extends Throwable> { + // See also Apache Commons Lang FailableFunction - /** The default converter. Does nothing. */ - Converter<?> DEFAULT = s -> s; + /** + * The default converter. Does nothing. + */ + Converter<?, RuntimeException> DEFAULT = s -> s; - /** Class name converter. Calls {@code Class.forName}. */ - Converter<Class<?>> CLASS = Class::forName; + /** + * Class name converter. Calls {@code Class.forName}. + */ + Converter<Class<?>, ClassNotFoundException> CLASS = Class::forName; - /** File name converter. Calls @{code new File(s)} */ - Converter<File> FILE = File::new; + /** + * File name converter. Calls @{code new File(s)}. + */ + Converter<File, NullPointerException> FILE = File::new; /** Path converter. Calls @{code new Path(s)} */ - Converter<Path> PATH = s -> new File(s).toPath(); + Converter<Path, InvalidPathException> PATH = s -> new File(s).toPath(); /** * Number converter. Converts to a Double if a decimal point ('.') is in the * string or a Long otherwise. */ - Converter<Number> NUMBER = s -> { + Converter<Number, NumberFormatException> NUMBER = s -> { if (s.indexOf('.') != -1) { return Double.valueOf(s); } @@ -60,19 +70,23 @@ public interface Converter<T> { * to find the class and then call the default constructor. * @see #CLASS */ - Converter<Object> OBJECT = s -> CLASS.apply(s).getConstructor().newInstance(); + Converter<Object, ReflectiveOperationException> OBJECT = s -> CLASS.apply(s).getConstructor().newInstance(); - /** Creates a URL. Calls {@code new URL(s)}. */ - Converter<URL> URL = java.net.URL::new; + /** + * Creates a URL. Calls {@code new URL(s)}. + */ + Converter<URL, MalformedURLException> URL = java.net.URL::new; - /** Converts to a date using the format string Form "EEE MMM dd HH:mm:ss zzz yyyy". */ - Converter<Date> DATE = s -> new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").parse(s); + /** + * Converts to a date using the format string Form "EEE MMM dd HH:mm:ss zzz yyyy". + */ + Converter<Date, java.text.ParseException> DATE = s -> new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").parse(s); /** * Applies the conversion function to the String argument. * @param str the String to convert * @return the Object from the conversion. - * @throws Exception on error. + * @throws E on error. */ - T apply(String str) throws Exception; + T apply(String str) throws E; } diff --git a/src/main/java/org/apache/commons/cli/Option.java b/src/main/java/org/apache/commons/cli/Option.java index 32fa1c3..1904809 100644 --- a/src/main/java/org/apache/commons/cli/Option.java +++ b/src/main/java/org/apache/commons/cli/Option.java @@ -84,7 +84,7 @@ public class Option implements Cloneable, Serializable { private char valueSeparator; /** The converter to convert to type **/ - private Converter<?> converter; + private Converter<?, ?> converter; /** * Constructs a new {@code Builder} with the minimum required parameters for an {@code Option} instance. @@ -127,7 +127,7 @@ public class Option implements Cloneable, Serializable { * @return this builder, to allow method chaining. * @since 1.7.0 */ - public Builder converter(final Converter<?> converter) { + public Builder converter(final Converter<?, ?> converter) { this.converter = converter; return this; } @@ -353,7 +353,7 @@ public class Option implements Cloneable, Serializable { private char valuesep; /** The explicit converter for this option. May be null */ - private transient Converter<?> converter; + private transient Converter<?, ?> converter; /** * Private constructor used by the nested Builder class. @@ -547,7 +547,7 @@ public class Option implements Cloneable, Serializable { * @return the value to type converter * @since 1.7.0 */ - public Converter<?> getConverter() { + public Converter<?, ?> getConverter() { return converter == null ? TypeHandler.getConverter(type) : converter; } @@ -830,7 +830,7 @@ public class Option implements Cloneable, Serializable { * @param converter The converter to convert the string value to the type. * @since 1.7.0 */ - public void setConverter(final Converter<?> converter) { + public void setConverter(final Converter<?, ?> converter) { this.converter = converter; } diff --git a/src/main/java/org/apache/commons/cli/ParseException.java b/src/main/java/org/apache/commons/cli/ParseException.java index 0e8d250..25e4596 100644 --- a/src/main/java/org/apache/commons/cli/ParseException.java +++ b/src/main/java/org/apache/commons/cli/ParseException.java @@ -39,7 +39,7 @@ public class ParseException extends Exception { * @throws UnsupportedOperationException due to legacy expectations. Will be removed in the future. * @since 1.7.0 */ - public static ParseException wrap(final Exception e) throws UnsupportedOperationException { + public static ParseException wrap(final Throwable e) throws UnsupportedOperationException { if (e instanceof UnsupportedOperationException) { throw (UnsupportedOperationException) e; } @@ -53,7 +53,7 @@ public class ParseException extends Exception { * Constructs a new {@code ParseException} wrapping the specified exception. * @param e the Exception to wrap. */ - public ParseException(final Exception e) { + public ParseException(final Throwable e) { super(e); } diff --git a/src/main/java/org/apache/commons/cli/PatternOptionBuilder.java b/src/main/java/org/apache/commons/cli/PatternOptionBuilder.java index ca194d2..19abbd3 100644 --- a/src/main/java/org/apache/commons/cli/PatternOptionBuilder.java +++ b/src/main/java/org/apache/commons/cli/PatternOptionBuilder.java @@ -104,7 +104,7 @@ public class PatternOptionBuilder { public static final Class<URL> URL_VALUE = URL.class; /** The converter to use for Unimplemented data types */ - static final Converter<?> NOT_IMPLEMENTED = s -> { + static final Converter<?, UnsupportedOperationException> NOT_IMPLEMENTED = s -> { throw new UnsupportedOperationException("Not yet implemented"); }; @@ -176,7 +176,7 @@ public class PatternOptionBuilder { char opt = ' '; boolean required = false; Class<?> type = null; - Converter<?> converter = Converter.DEFAULT; + Converter<?, ?> converter = Converter.DEFAULT; final Options options = new Options(); diff --git a/src/main/java/org/apache/commons/cli/TypeHandler.java b/src/main/java/org/apache/commons/cli/TypeHandler.java index 9fccffa..4184daf 100644 --- a/src/main/java/org/apache/commons/cli/TypeHandler.java +++ b/src/main/java/org/apache/commons/cli/TypeHandler.java @@ -45,7 +45,7 @@ public class TypeHandler { private static final int HEX_RADIX = 16; /** Map of classes to converters. */ - private static Map<Class<?>, Converter<?>> converterMap = new HashMap<>(); + private static Map<Class<?>, Converter<?, ?>> converterMap = new HashMap<>(); static { resetConverters(); @@ -166,7 +166,7 @@ public class TypeHandler { public static <T> T createValue(final String str, final Class<T> clazz) throws ParseException { try { return (T) getConverter(clazz).apply(str); - } catch (final Exception e) { + } catch (final Throwable e) { throw ParseException.wrap(e); } } @@ -191,8 +191,8 @@ public class TypeHandler { * @return the registered converter if any, {@link Converter#DEFAULT} otherwise. * @since 1.7.0 */ - public static Converter<?> getConverter(final Class<?> clazz) { - final Converter<?> converter = converterMap.get(clazz); + public static Converter<?, ?> getConverter(final Class<?> clazz) { + final Converter<?, ?> converter = converterMap.get(clazz); return converter == null ? Converter.DEFAULT : converter; } @@ -225,7 +225,7 @@ public class TypeHandler { * @param converter The Converter to associate with Class. May be null. * @since 1.7.0 */ - public static void register(final Class<?> clazz, final Converter<?> converter) { + public static void register(final Class<?> clazz, final Converter<?, ?> converter) { if (converter == null) { converterMap.remove(clazz); } else {