You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/03/21 21:40:36 UTC

[commons-imaging] 02/03: Allow fluent API use of ImagingParameters and subclasses

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-imaging.git

commit 7317d00ec003210d93582aec80e69fb5a18cc7a5
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Mar 21 17:34:18 2023 -0400

    Allow fluent API use of ImagingParameters and subclasses
---
 .../org/apache/commons/imaging/ImageParser.java    |  4 +---
 .../imaging/common/XmpImagingParameters.java       |  1 +
 .../org/apache/commons/imaging/internal/Util.java  | 20 +++++++++--------
 .../common/bytesource/ByteSourceImageTest.java     | 17 +++++++-------
 .../commons/imaging/formats/xmp/XmpUpdateTest.java | 26 +++++++++++-----------
 5 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/src/main/java/org/apache/commons/imaging/ImageParser.java b/src/main/java/org/apache/commons/imaging/ImageParser.java
index 23cbac55..2ba98549 100644
--- a/src/main/java/org/apache/commons/imaging/ImageParser.java
+++ b/src/main/java/org/apache/commons/imaging/ImageParser.java
@@ -90,7 +90,7 @@ import org.apache.commons.imaging.formats.xpm.XpmImageParser;
  *
  * @param <T> type of parameters used by this image parser
  */
-public abstract class ImageParser<T extends ImagingParameters> extends BinaryFileParser {
+public abstract class ImageParser<T extends ImagingParameters<T>> extends BinaryFileParser {
 
     private static final Logger LOGGER = Logger.getLogger(ImageParser.class.getName());
 
@@ -574,8 +574,6 @@ public abstract class ImageParser<T extends ImagingParameters> extends BinaryFil
      */
     public void writeImage(final BufferedImage src, final OutputStream os, final T params)
             throws ImageWriteException, IOException {
-        os.close(); // we are obligated to close stream.
-
         throw new ImageWriteException("This image format (" + getName() + ") cannot be written.");
     }
 
diff --git a/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java b/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java
index f2f26ef8..53e7d67d 100644
--- a/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java
+++ b/src/main/java/org/apache/commons/imaging/common/XmpImagingParameters.java
@@ -22,6 +22,7 @@ import org.apache.commons.imaging.ImagingParameters;
 /**
  * Parameters for formats that support Xmp.
  *
+ * @param <E> this type
  * @since 1.0-alpha3
  */
 public class XmpImagingParameters<E extends XmpImagingParameters<E>> extends ImagingParameters<E> {
diff --git a/src/main/java/org/apache/commons/imaging/internal/Util.java b/src/main/java/org/apache/commons/imaging/internal/Util.java
index c3bd6d7a..355063cf 100644
--- a/src/main/java/org/apache/commons/imaging/internal/Util.java
+++ b/src/main/java/org/apache/commons/imaging/internal/Util.java
@@ -16,16 +16,17 @@
  */
 package org.apache.commons.imaging.internal;
 
+import java.io.IOException;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
 import org.apache.commons.imaging.ImageFormat;
 import org.apache.commons.imaging.ImageFormats;
 import org.apache.commons.imaging.ImageParser;
 import org.apache.commons.imaging.Imaging;
+import org.apache.commons.imaging.ImagingParameters;
 import org.apache.commons.imaging.common.bytesource.ByteSource;
 
-import java.io.IOException;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-
 /**
  * Internal utilities.
  *
@@ -35,18 +36,19 @@ public class Util {
 
     private Util() {}
 
-    public static ImageParser<?> getImageParser(final ImageFormat format) {
+    public static <T extends ImagingParameters<T>> ImageParser<T> getImageParser(final ImageFormat format) {
         return getImageParser(parser -> parser.canAcceptType(format), () -> new IllegalArgumentException("Unknown Format: " + format));
     }
 
-    public static ImageParser<?> getImageParser(final String fileExtension) {
+    public static <T extends ImagingParameters<T>> ImageParser<T> getImageParser(final String fileExtension) {
         return getImageParser(parser -> parser.canAcceptExtension(fileExtension), () -> new IllegalArgumentException("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.
-    private static ImageParser<?> getImageParser(final Predicate<ImageParser<?>> pred, final Supplier<? extends RuntimeException> supplier) {
-        return ImageParser
+    @SuppressWarnings("unchecked")
+    private static <T extends ImagingParameters<T>> ImageParser<T> getImageParser(final Predicate<ImageParser<?>> pred, final Supplier<? extends RuntimeException> supplier) {
+        return (ImageParser<T>) ImageParser
                 .getAllImageParsers()
                 .stream()
                 .filter(pred)
@@ -54,7 +56,7 @@ public class Util {
                 .orElseThrow(supplier);
     }
 
-    public static ImageParser<?> getImageParser(final ByteSource byteSource) throws IOException {
+    public static <T extends ImagingParameters<T>> ImageParser<T> getImageParser(final ByteSource byteSource) throws IOException {
         // TODO: circular dependency between Imaging and internal Util class below.
         final ImageFormat format = Imaging.guessFormat(byteSource);
         if (!format.equals(ImageFormats.UNKNOWN)) {
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 e8fc0658..c9bb876a 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
@@ -160,13 +160,13 @@ public class ByteSourceImageTest extends ByteSourceTest {
         assertArrayEquals(iccBytesFile, iccBytesBytes);
     }
 
-    public void checkGetImageInfo(final File imageFile, final byte[] imageFileBytes) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ImageReadException {
+    public void checkGetImageInfo(final File imageFile, final byte[] imageFileBytes)
+            throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ImageReadException {
         final boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
         final ImageFormat imageFormat = Imaging.guessFormat(imageFile);
         ImagingParameters params = null;
         if (imageFormat == ImageFormats.TIFF) {
-            params = new TiffImagingParameters();
-            ((TiffImagingParameters) params).setReadThumbnails(!ignoreImageData);
+            params = new TiffImagingParameters().setReadThumbnails(!ignoreImageData);
         }
         if (imageFormat == ImageFormats.JPEG) {
             params = new JpegImagingParameters();
@@ -189,15 +189,14 @@ public class ByteSourceImageTest extends ByteSourceTest {
             if (!method2.getName().startsWith("get")) {
                 continue;
             }
-            if (method2.getName().equals("getClass"))
-             {
+            if (method2.getName().equals("getClass")) {
                 continue;
-            // if (method.getGenericParameterTypes().length > 0)
-            // continue;
+                // if (method.getGenericParameterTypes().length > 0)
+                // continue;
             }
 
-            final Object valueFile = method2.invoke(imageInfoFile, (Object[])null);
-            final Object valueBytes = method2.invoke(imageInfoBytes, (Object[])null);
+            final Object valueFile = method2.invoke(imageInfoFile, (Object[]) null);
+            final Object valueBytes = method2.invoke(imageInfoBytes, (Object[]) null);
 
             assertEquals(valueFile, valueBytes);
         }
diff --git a/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java b/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
index a662b45c..13ddafe9 100644
--- a/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
+++ b/src/test/java/org/apache/commons/imaging/formats/xmp/XmpUpdateTest.java
@@ -16,6 +16,15 @@
  */
 package org.apache.commons.imaging.formats.xmp;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.nio.file.Files;
+import java.util.List;
+
 import org.apache.commons.imaging.ImageFormat;
 import org.apache.commons.imaging.ImageFormats;
 import org.apache.commons.imaging.ImageParser;
@@ -27,16 +36,7 @@ import org.apache.commons.imaging.internal.Debug;
 import org.apache.commons.imaging.internal.Util;
 import org.junit.jupiter.api.Test;
 
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.nio.file.Files;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-public class XmpUpdateTest extends ImagingTest {
+public class XmpUpdateTest<E extends XmpImagingParameters<E>> extends ImagingTest {
 
     @Test
     public void test() throws Exception {
@@ -68,9 +68,9 @@ public class XmpUpdateTest extends ImagingTest {
             final File tempFile = Files.createTempFile(imageFile.getName() + ".", "." + imageFormat.getDefaultExtension()).toFile();
             final BufferedImage image = Imaging.getBufferedImage(imageFile);
 
-            final ImageParser parser = Util.getImageParser("." + imageFormat.getDefaultExtension());
-            final ImagingParameters params = parser.getDefaultParameters();
-            ((XmpImagingParameters) params).setXmpXml(xmpXml);
+            final ImageParser<E> parser = Util.getImageParser("." + imageFormat.getDefaultExtension());
+            final E params = parser.getDefaultParameters();
+            params.setXmpXml(xmpXml);
             try (FileOutputStream fos = new FileOutputStream(tempFile)) {
                 parser.writeImage(image, fos, params);
             }