This is an automated email from the ASF dual-hosted git repository.

kinow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-imaging.git

commit ec786f1951de472d40596abef38f4954abfac3e8
Author: Bruno P. Kinoshita <ki...@apache.org>
AuthorDate: Thu Dec 2 21:35:43 2021 +1300

    [IMAGING-159] Apply parts of @darkma773r design suggestion, reducing the 
generics suppressed warnings
---
 .../org/apache/commons/imaging/ImageFormat.java    |   2 -
 .../org/apache/commons/imaging/ImageFormats.java   |   8 --
 .../org/apache/commons/imaging/ImageParser.java    |  10 +-
 .../java/org/apache/commons/imaging/Imaging.java   | 104 ++++++---------------
 .../imaging/formats/bmp/BmpImageParser.java        |   5 +
 .../imaging/formats/dcx/DcxImageParser.java        |   5 +
 .../imaging/formats/gif/GifImageParser.java        |   5 +
 .../imaging/formats/icns/IcnsImageParser.java      |   5 +
 .../imaging/formats/ico/IcoImageParser.java        |   5 +
 .../imaging/formats/jpeg/JpegImageParser.java      |   5 +
 .../imaging/formats/pcx/PcxImageParser.java        |   5 +
 .../imaging/formats/png/PngImageParser.java        |   5 +
 .../imaging/formats/pnm/PnmImageParser.java        |   6 +-
 .../imaging/formats/psd/PsdImageParser.java        |   6 +-
 .../imaging/formats/rgbe/RgbeImageParser.java      |   5 +
 .../imaging/formats/tiff/TiffImageParser.java      |   5 +
 .../imaging/formats/wbmp/WbmpImageParser.java      |   5 +
 .../imaging/formats/xbm/XbmImageParser.java        |   5 +
 .../imaging/formats/xpm/XpmImageParser.java        |   5 +
 .../org/apache/commons/imaging/internal/Util.java  |  54 +++++++++++
 .../common/bytesource/ByteSourceImageTest.java     |   4 +-
 .../commons/imaging/roundtrip/RoundtripBase.java   |   5 +-
 22 files changed, 170 insertions(+), 94 deletions(-)

diff --git a/src/main/java/org/apache/commons/imaging/ImageFormat.java 
b/src/main/java/org/apache/commons/imaging/ImageFormat.java
index d9b1724..ff1b1a4 100644
--- a/src/main/java/org/apache/commons/imaging/ImageFormat.java
+++ b/src/main/java/org/apache/commons/imaging/ImageFormat.java
@@ -37,6 +37,4 @@ public interface ImageFormat {
     String[] getExtensions();
 
     String getDefaultExtension();
-
-    ImagingParameters createImagingParameters();
 }
diff --git a/src/main/java/org/apache/commons/imaging/ImageFormats.java 
b/src/main/java/org/apache/commons/imaging/ImageFormats.java
index 5153a86..1a9831c 100644
--- a/src/main/java/org/apache/commons/imaging/ImageFormats.java
+++ b/src/main/java/org/apache/commons/imaging/ImageFormats.java
@@ -60,12 +60,9 @@ public enum ImageFormats implements ImageFormat {
     XBM(XbmImagingParameters::new, "xbm"),
     XPM(XpmImagingParameters::new, "xpm");
 
-    private final Supplier<? extends ImagingParameters> factory;
-
     private final String[] extensions;
 
     ImageFormats(Supplier<? extends ImagingParameters> factory, String 
...extensions) {
-        this.factory = factory;
         this.extensions = extensions;
     }
 
@@ -83,9 +80,4 @@ public enum ImageFormats implements ImageFormat {
     public String getDefaultExtension() {
         return this.extensions[0];
     }
-
-    @Override
-    public ImagingParameters createImagingParameters() {
-        return this.factory == null ? null : factory.get();
-    }
 }
diff --git a/src/main/java/org/apache/commons/imaging/ImageParser.java 
b/src/main/java/org/apache/commons/imaging/ImageParser.java
index 2710ea5..e57c095 100644
--- a/src/main/java/org/apache/commons/imaging/ImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/ImageParser.java
@@ -122,6 +122,12 @@ public abstract class ImageParser<T extends 
ImagingParameters> extends BinaryFil
     }
 
     /**
+     * Get a default parameters instance for this parser.
+     * @return default parameters instance
+     */
+    public abstract T getDefaultParameters();
+
+    /**
      * Get image metadata from the specified byte source.  Format-specific
      * ImageParser implementations are expected to return a valid
      * IImageMetadata object or to throw an ImageReadException if unable
@@ -886,7 +892,7 @@ public abstract class ImageParser<T extends 
ImagingParameters> extends BinaryFil
      * @param file An valid file reference.
      * @return If the parser can accept the format, true; otherwise, false.
      */
-    protected final boolean canAcceptExtension(final File file) {
+    public boolean canAcceptExtension(final File file) {
         return canAcceptExtension(file.getName());
     }
 
@@ -897,7 +903,7 @@ public abstract class ImageParser<T extends 
ImagingParameters> extends BinaryFil
      * @param fileName A valid string giving a file name or file path.
      * @return If the parser can accept the format, true; otherwise, false.
      */
-    protected final boolean canAcceptExtension(final String fileName) {
+    public final boolean canAcceptExtension(final String fileName) {
         final String[] extensions = getAcceptedExtensions();
         if (extensions == null) {
             return true;
diff --git a/src/main/java/org/apache/commons/imaging/Imaging.java 
b/src/main/java/org/apache/commons/imaging/Imaging.java
index b529588..c5a6ef3 100644
--- a/src/main/java/org/apache/commons/imaging/Imaging.java
+++ b/src/main/java/org/apache/commons/imaging/Imaging.java
@@ -28,6 +28,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.List;
 import java.util.Locale;
+import java.util.Objects;
 import java.util.stream.Stream;
 
 import org.apache.commons.imaging.common.ImageMetadata;
@@ -39,6 +40,7 @@ import 
org.apache.commons.imaging.common.bytesource.ByteSourceFile;
 import org.apache.commons.imaging.common.bytesource.ByteSourceInputStream;
 import org.apache.commons.imaging.icc.IccProfileInfo;
 import org.apache.commons.imaging.icc.IccProfileParser;
+import org.apache.commons.imaging.internal.Util;
 
 /**
  * The primary application programming interface (API) to the Imaging library.
@@ -225,7 +227,6 @@ public final class Imaging {
         return (a[0] == b[0]) && (a[1] == b[1]);
     }
 
-
     /**
      * Attempts to determine the image format of a file based on its
      * "magic numbers," the first bytes of the data.
@@ -241,12 +242,12 @@ public final class Imaging {
      * @return An ImageFormat, such as ImageFormat.IMAGE_FORMAT_JPEG. Returns
      *         ImageFormat.IMAGE_FORMAT_UNKNOWN if the image type cannot be
      *         determined.
-     * @throws ImageReadException in the event of an unsuccessful
+     * @throws IllegalArgumentException in the event of an unsuccessful
      * attempt to read the image data
      * @throws IOException in the event of an unrecoverable I/O condition.
      */
     public static ImageFormat guessFormat(final ByteSource byteSource)
-            throws ImageReadException, IOException {
+            throws IOException {
 
         if (byteSource == null) {
             return ImageFormats.UNKNOWN;
@@ -256,8 +257,7 @@ public final class Imaging {
             final int i1 = is.read();
             final int i2 = is.read();
             if ((i1 < 0) || (i2 < 0)) {
-                throw new ImageReadException(
-                        "Couldn't read magic numbers to guess format.");
+                throw new IllegalArgumentException("Couldn't read magic 
numbers to guess format.");
             }
 
             final int b1 = i1 & 0xff;
@@ -313,8 +313,7 @@ public final class Imaging {
                 final int i3 = is.read();
                 final int i4 = is.read();
                 if ((i3 < 0) || (i4 < 0)) {
-                    throw new ImageReadException(
-                            "Couldn't read magic numbers to guess format.");
+                    throw new IllegalArgumentException("Couldn't read magic 
numbers to guess format.");
                 }
 
                 final int b3 = i3 & 0xff;
@@ -556,9 +555,7 @@ public final class Imaging {
 
     private static <T extends ImagingParameters> byte[] 
getICCProfileBytes(final ByteSource byteSource, final T params)
             throws ImageReadException, IOException {
-        // TODO: better generics or redesign API
-        @SuppressWarnings("unchecked")
-        final ImageParser<T> imageParser = (ImageParser<T>) 
getImageParser(byteSource);
+        final ImageParser<T> imageParser = getImageParser(byteSource);
 
         return imageParser.getICCProfileBytes(byteSource, params);
     }
@@ -735,39 +732,22 @@ public final class Imaging {
         return getImageInfo(file, null);
     }
 
-    // See getImageParser
-    @SuppressWarnings("unchecked")
     private static ImageInfo getImageInfo(final ByteSource byteSource, final 
ImagingParameters params) throws ImageReadException, IOException {
         return Imaging.getImageParser(byteSource).getImageInfo(byteSource, 
params);
     }
 
-    // TODO: We have no way of knowing whether the returned ImageParser will 
accept the ImagingParameters,
-    // even if we specified generic types for the static methods.
-    @SuppressWarnings("rawtypes")
-    private static ImageParser getImageParser(final ByteSource byteSource) 
throws ImageReadException, IOException {
+    private static <T extends ImagingParameters> ImageParser<T> 
getImageParser(final ByteSource byteSource) throws IOException {
         final ImageFormat format = guessFormat(byteSource);
         if (!format.equals(ImageFormats.UNKNOWN)) {
-            final List<ImageParser<?>> imageParsers = 
ImageParser.getAllImageParsers();
-
-            for (final ImageParser<?> imageParser : imageParsers) {
-                if (imageParser.canAcceptType(format)) {
-                    return imageParser;
-                }
-            }
+            return Util.getImageParser(format);
         }
 
         final String fileName = byteSource.getFileName();
         if (fileName != null) {
-            final List<ImageParser<?>> imageParsers = 
ImageParser.getAllImageParsers();
-
-            for (final ImageParser<?> imageParser : imageParsers) {
-                if (imageParser.canAcceptExtension(fileName)) {
-                    return imageParser;
-                }
-            }
+            return Util.getImageParser(fileName);
         }
 
-        throw new ImageReadException("Can't parse this format.");
+        throw new IllegalArgumentException("Can't parse this format.");
     }
 
     /**
@@ -869,9 +849,7 @@ public final class Imaging {
 
     public static <T extends ImagingParameters> Dimension getImageSize(final 
ByteSource byteSource, final T params)
             throws ImageReadException, IOException {
-        // TODO: better generics or redesign API
-        @SuppressWarnings("unchecked")
-        final ImageParser<T> imageParser = (ImageParser<T>) 
getImageParser(byteSource);
+        final ImageParser<T> imageParser = getImageParser(byteSource);
 
         return imageParser.getImageSize(byteSource, params);
     }
@@ -1152,10 +1130,7 @@ public final class Imaging {
 
     private static <T extends ImagingParameters> ImageMetadata 
getMetadata(final ByteSource byteSource, final T params)
             throws ImageReadException, IOException {
-        // TODO: better generics or redesign API
-        @SuppressWarnings("unchecked")
-        final ImageParser<T> imageParser = (ImageParser<T>) 
getImageParser(byteSource);
-
+        final ImageParser<T> imageParser = getImageParser(byteSource);
         return imageParser.getMetadata(byteSource, params);
     }
 
@@ -1284,7 +1259,6 @@ public final class Imaging {
         return getAllBufferedImages(new ByteSourceFile(file));
     }
 
-
     private static List<BufferedImage> getAllBufferedImages(
             final ByteSource byteSource) throws ImageReadException, 
IOException {
         final ImageParser<?> imageParser = getImageParser(byteSource);
@@ -1292,7 +1266,6 @@ public final class Imaging {
         return imageParser.getAllBufferedImages(byteSource);
     }
 
-
     /**
      * Reads the first image from an InputStream.
      * <p>
@@ -1314,8 +1287,6 @@ public final class Imaging {
         return getBufferedImage(is, null);
     }
 
-
-
     /**
      * Reads the first image from an InputStream
      * using data-processing options specified through a parameters
@@ -1362,7 +1333,6 @@ public final class Imaging {
         return getBufferedImage(new ByteSourceArray(bytes), null);
     }
 
-
     /**
      * Reads the first image from a byte array
      * using data-processing options specified through the parameters
@@ -1407,7 +1377,6 @@ public final class Imaging {
         return getBufferedImage(new ByteSourceFile(file), null);
     }
 
-
     /**
      * Reads the first image from a file
      * using data-processing options specified through a parameters
@@ -1433,14 +1402,11 @@ public final class Imaging {
         return getBufferedImage(new ByteSourceFile(file), params);
     }
 
-    @SuppressWarnings("unchecked")
     private static <T extends ImagingParameters> BufferedImage 
getBufferedImage(final ByteSource byteSource,
             T params) throws ImageReadException, IOException {
-        // TODO: better generics or redesign API
-        final ImageParser<T> imageParser = (ImageParser<T>) 
getImageParser(byteSource);
+        final ImageParser<T> imageParser = getImageParser(byteSource);
         if (params == null) {
-            ImageFormat format = Imaging.guessFormat(byteSource);
-            params = (T) format.createImagingParameters();
+            params = imageParser.getDefaultParameters();
         }
         return imageParser.getBufferedImage(byteSource, params);
     }
@@ -1477,7 +1443,6 @@ public final class Imaging {
         }
     }
 
-
     /**
      * Writes the content of a BufferedImage to a byte array using the 
specified
      * image format.  Specifications for storing the file (such as data 
compression,
@@ -1504,15 +1469,13 @@ public final class Imaging {
     public static byte[] writeImageToBytes(final BufferedImage src,
             final ImageFormat format, final ImagingParameters params) throws 
ImageWriteException,
             IOException {
-        final ByteArrayOutputStream os = new ByteArrayOutputStream();
-
-        writeImage(src, os, format, params);
-
-        return os.toByteArray();
+        try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
+            writeImage(src, os, format, params);
+            return os.toByteArray();
+        }
     }
 
-
-     /**
+    /**
      * Writes the content of a BufferedImage to an OutputStream using the 
specified
      * image format.  Specifications for storing the file (such as data 
compression,
      * color models, metadata tags, etc.) may be specified using optional
@@ -1534,27 +1497,14 @@ public final class Imaging {
      * @throws IOException in the event of an unrecoverable I/O exception.
      * @see ImagingConstants
      */
-    // TODO: fix generics due to ImageParser retrieved via getAllImageParsers, 
and the given ImagingParameters type
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    public static void writeImage(final BufferedImage src, final OutputStream 
os,
-            final ImageFormat format, ImagingParameters params) throws 
ImageWriteException,
+    public static <T extends ImagingParameters> void writeImage(final 
BufferedImage src, final OutputStream os,
+            final ImageFormat format, T params) throws ImageWriteException,
             IOException {
-        final List<ImageParser<?>> imageParsers = 
ImageParser.getAllImageParsers();
-        if (params == null) {
-            params = format.createImagingParameters();
-        }
+        Objects.requireNonNull(src, "src must not be null");
+        Objects.requireNonNull(os, "os must not be null");
+        Objects.requireNonNull(format, "format must not be null");
 
-        ImageParser imageParser = null;
-        for (final ImageParser<?> imageParser2 : imageParsers) {
-            if (imageParser2.canAcceptType(format)) {
-                imageParser = imageParser2;
-                break;
-            }
-        }
-        if (imageParser == null) {
-            throw new ImageWriteException("Unknown Format: " + format);
-        }
-        imageParser.writeImage(src, os, params);
+        ImageParser<T> imageParser = Util.getImageParser(format);
+        imageParser.writeImage(src, os, params == null ? 
imageParser.getDefaultParameters() : params);
     }
-
 }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/bmp/BmpImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/bmp/BmpImageParser.java
index f00d4fd..38bd718 100644
--- a/src/main/java/org/apache/commons/imaging/formats/bmp/BmpImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/bmp/BmpImageParser.java
@@ -68,6 +68,11 @@ public class BmpImageParser extends 
ImageParser<BmpImagingParameters> {
     }
 
     @Override
+    public BmpImagingParameters getDefaultParameters() {
+        return new BmpImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Bmp-Custom";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
index c26a2f7..f818f81 100644
--- a/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
@@ -51,6 +51,11 @@ public class DcxImageParser extends 
ImageParser<PcxImagingParameters> {
     }
 
     @Override
+    public PcxImagingParameters getDefaultParameters() {
+        return new PcxImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Dcx-Custom";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/gif/GifImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/gif/GifImageParser.java
index 3a2c606..889ab97 100644
--- a/src/main/java/org/apache/commons/imaging/formats/gif/GifImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/gif/GifImageParser.java
@@ -94,6 +94,11 @@ public class GifImageParser extends 
ImageParser<GifImagingParameters> implements
     }
 
     @Override
+    public GifImagingParameters getDefaultParameters() {
+        return new GifImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Graphics Interchange Format";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/icns/IcnsImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/icns/IcnsImageParser.java
index 2673386..fdaf10d 100644
--- a/src/main/java/org/apache/commons/imaging/formats/icns/IcnsImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/icns/IcnsImageParser.java
@@ -49,6 +49,11 @@ public class IcnsImageParser extends 
ImageParser<IcnsImagingParameters> {
     }
 
     @Override
+    public IcnsImagingParameters getDefaultParameters() {
+        return new IcnsImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Apple Icon Image";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
index 416f55f..dc31cf9 100644
--- a/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
@@ -57,6 +57,11 @@ public class IcoImageParser extends 
ImageParser<IcoImagingParameters> {
     }
 
     @Override
+    public IcoImagingParameters getDefaultParameters() {
+        return new IcoImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "ico-Custom";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java
index b0d82a3..d541e6e 100644
--- a/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/jpeg/JpegImageParser.java
@@ -80,6 +80,11 @@ public class JpegImageParser extends 
ImageParser<JpegImagingParameters> implemen
     }
 
     @Override
+    public JpegImagingParameters getDefaultParameters() {
+        return new JpegImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Jpeg-Custom";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/pcx/PcxImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/pcx/PcxImageParser.java
index 7dced55..57546e4 100644
--- a/src/main/java/org/apache/commons/imaging/formats/pcx/PcxImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/pcx/PcxImageParser.java
@@ -70,6 +70,11 @@ public class PcxImageParser extends 
ImageParser<PcxImagingParameters> {
     }
 
     @Override
+    public PcxImagingParameters getDefaultParameters() {
+        return new PcxImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Pcx-Custom";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/png/PngImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/png/PngImageParser.java
index 19d63f2..327749d 100644
--- a/src/main/java/org/apache/commons/imaging/formats/png/PngImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/png/PngImageParser.java
@@ -78,6 +78,11 @@ public class PngImageParser extends 
ImageParser<PngImagingParameters>  implement
     private static final String[] ACCEPTED_EXTENSIONS = 
ImageFormats.PNG.getExtensions();
 
     @Override
+    public PngImagingParameters getDefaultParameters() {
+        return new PngImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Png-Custom";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImageParser.java
index 2e0113e..717d2c4 100644
--- a/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImageParser.java
@@ -52,7 +52,11 @@ public class PnmImageParser extends 
ImageParser<PnmImagingParameters> {
 
     public PnmImageParser() {
         super.setByteOrder(ByteOrder.LITTLE_ENDIAN);
-        // setDebug(true);
+    }
+
+    @Override
+    public PnmImagingParameters getDefaultParameters() {
+        return new PnmImagingParameters();
     }
 
     @Override
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/psd/PsdImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/psd/PsdImageParser.java
index 4d40c66..e5190e2 100644
--- a/src/main/java/org/apache/commons/imaging/formats/psd/PsdImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/psd/PsdImageParser.java
@@ -70,7 +70,11 @@ public class PsdImageParser extends 
ImageParser<PsdImagingParameters> implements
 
     public PsdImageParser() {
         super.setByteOrder(ByteOrder.BIG_ENDIAN);
-        // setDebug(true);
+    }
+
+    @Override
+    public PsdImagingParameters getDefaultParameters() {
+        return new PsdImagingParameters();
     }
 
     @Override
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/rgbe/RgbeImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/rgbe/RgbeImageParser.java
index a3219e7..68e7dd2 100644
--- a/src/main/java/org/apache/commons/imaging/formats/rgbe/RgbeImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/rgbe/RgbeImageParser.java
@@ -50,6 +50,11 @@ public class RgbeImageParser extends 
ImageParser<RgbeImagingParameters> {
     }
 
     @Override
+    public RgbeImagingParameters getDefaultParameters() {
+        return new RgbeImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Radiance HDR";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
index 733f628..36eb873 100644
--- a/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
@@ -69,6 +69,11 @@ public class TiffImageParser extends 
ImageParser<TiffImagingParameters> implemen
     private static final String[] ACCEPTED_EXTENSIONS = 
ImageFormats.TIFF.getExtensions();
 
     @Override
+    public TiffImagingParameters getDefaultParameters() {
+        return new TiffImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Tiff-Custom";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/wbmp/WbmpImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/wbmp/WbmpImageParser.java
index a98032c..5e8617e 100644
--- a/src/main/java/org/apache/commons/imaging/formats/wbmp/WbmpImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/wbmp/WbmpImageParser.java
@@ -45,6 +45,11 @@ public class WbmpImageParser extends 
ImageParser<WbmpImagingParameters> {
     private static final String[] ACCEPTED_EXTENSIONS = 
ImageFormats.WBMP.getExtensions();
 
     @Override
+    public WbmpImagingParameters getDefaultParameters() {
+        return new WbmpImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "Wireless Application Protocol Bitmap Format";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImageParser.java
index 63160c1..3ec1e53 100644
--- a/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImageParser.java
@@ -51,6 +51,11 @@ public class XbmImageParser extends 
ImageParser<XbmImagingParameters> {
     private static final String[] ACCEPTED_EXTENSIONS = 
ImageFormats.XBM.getExtensions();
 
     @Override
+    public XbmImagingParameters getDefaultParameters() {
+        return new XbmImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "X BitMap";
     }
diff --git 
a/src/main/java/org/apache/commons/imaging/formats/xpm/XpmImageParser.java 
b/src/main/java/org/apache/commons/imaging/formats/xpm/XpmImageParser.java
index cb31a64..8ab8136 100644
--- a/src/main/java/org/apache/commons/imaging/formats/xpm/XpmImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/formats/xpm/XpmImageParser.java
@@ -104,6 +104,11 @@ public class XpmImageParser extends 
ImageParser<XpmImagingParameters> {
     }
 
     @Override
+    public XpmImagingParameters getDefaultParameters() {
+        return new XpmImagingParameters();
+    }
+
+    @Override
     public String getName() {
         return "X PixMap";
     }
diff --git a/src/main/java/org/apache/commons/imaging/internal/Util.java 
b/src/main/java/org/apache/commons/imaging/internal/Util.java
new file mode 100644
index 0000000..8e18d10
--- /dev/null
+++ b/src/main/java/org/apache/commons/imaging/internal/Util.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.imaging.internal;
+
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
+import org.apache.commons.imaging.ImageFormat;
+import org.apache.commons.imaging.ImageParser;
+import org.apache.commons.imaging.ImagingParameters;
+
+/**
+ * Internal utilities.
+ *
+ * @since 1.0-alpha3
+ */
+public class Util {
+
+    private Util() {}
+
+    public static <T extends ImagingParameters> ImageParser<T> 
getImageParser(ImageFormat format) {
+        return getImageParser((parser) -> parser.canAcceptType(format), () -> 
new RuntimeException("Unknown Format: " + format));
+    }
+
+    public static <T extends ImagingParameters> ImageParser<T> 
getImageParser(String fileExtension) {
+        return getImageParser((parser) -> 
parser.canAcceptExtension(fileExtension), () -> new RuntimeException("Unknown 
Extension: " + fileExtension));
+    }
+
+    // This generics suppression is as good as the predicate given. If the 
predicate violates a generics design,
+    // then there will be an error during runtime.
+    @SuppressWarnings("unchecked")
+    private static <T extends ImagingParameters> ImageParser<T> 
getImageParser(Predicate<ImageParser<?>> pred, Supplier<? extends 
RuntimeException> supl) {
+        return (ImageParser<T>) ImageParser
+                .getAllImageParsers()
+                .stream()
+                .filter((parser) -> pred.test(parser))
+                .findFirst()
+                .orElseThrow(supl);
+    }
+}
diff --git 
a/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
 
b/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
index a1aab34..010811c 100644
--- 
a/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
+++ 
b/src/test/java/org/apache/commons/imaging/common/bytesource/ByteSourceImageTest.java
@@ -163,11 +163,13 @@ public class ByteSourceImageTest extends ByteSourceTest {
             IllegalArgumentException, InvocationTargetException {
         final boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
         final ImageFormat imageFormat = Imaging.guessFormat(imageFile);
-        final ImagingParameters params = imageFormat.createImagingParameters();
+        ImagingParameters params = null;
         if (imageFormat == ImageFormats.TIFF) {
+            params = new TiffImagingParameters();
             ((TiffImagingParameters) 
params).setReadThumbnails(Boolean.valueOf(!ignoreImageData));
         }
         if (imageFormat == ImageFormats.JPEG) {
+            params = new JpegImagingParameters();
             ((JpegImagingParameters) 
params).setReadThumbnails(Boolean.valueOf(!ignoreImageData));
         }
 
diff --git 
a/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java 
b/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java
index 0b6b546..5c80987 100644
--- a/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java
+++ b/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripBase.java
@@ -29,6 +29,7 @@ import org.apache.commons.imaging.Imaging;
 import org.apache.commons.imaging.ImagingParameters;
 import org.apache.commons.imaging.common.RgbBufferedImageFactory;
 import org.apache.commons.imaging.internal.Debug;
+import org.apache.commons.imaging.internal.Util;
 import org.junit.jupiter.params.provider.Arguments;
 
 public class RoundtripBase {
@@ -40,10 +41,10 @@ public class RoundtripBase {
                 + formatInfo.format.getDefaultExtension());
         Debug.debug("tempFile: " + temp1.getName());
 
-        final ImagingParameters params = 
formatInfo.format.createImagingParameters();
+        final ImagingParameters params = 
Util.getImageParser(formatInfo.format).getDefaultParameters();
         Imaging.writeImage(testImage, temp1, formatInfo.format, params);
 
-        final ImagingParameters readParams = 
formatInfo.format.createImagingParameters();
+        final ImagingParameters readParams = 
Util.getImageParser(formatInfo.format).getDefaultParameters();
         readParams.setBufferedImageFactory(new RgbBufferedImageFactory());
         final BufferedImage image2 = Imaging.getBufferedImage(temp1, 
readParams);
         assertNotNull(image2);

Reply via email to