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);