You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by pt...@apache.org on 2020/11/06 03:27:28 UTC

[fineract] 03/04: Factor out ImageData.resize into ImageResizer (FINERACT-1201)

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

ptuomola pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git

commit 465623d5ae9481fea31b55191c61c659a7ba5787
Author: Michael Vorburger <mi...@vorburger.ch>
AuthorDate: Sun Oct 18 02:51:16 2020 +0200

    Factor out ImageData.resize into ImageResizer (FINERACT-1201)
---
 .../documentmanagement/api/ImagesApiResource.java  |  9 ++-
 .../documentmanagement/data/ImageData.java         | 55 +--------------
 .../data/{ImageData.java => ImageResizer.java}     | 80 ++--------------------
 3 files changed, 11 insertions(+), 133 deletions(-)

diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResource.java
index 1bf5c12..851af09 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResource.java
@@ -44,6 +44,7 @@ import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSer
 import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepositoryUtils;
 import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepositoryUtils.ImageFileExtension;
 import org.apache.fineract.infrastructure.documentmanagement.data.ImageData;
+import org.apache.fineract.infrastructure.documentmanagement.data.ImageResizer;
 import org.apache.fineract.infrastructure.documentmanagement.exception.ContentManagementException;
 import org.apache.fineract.infrastructure.documentmanagement.exception.InvalidEntityTypeForImageManagementException;
 import org.apache.fineract.infrastructure.documentmanagement.service.ImageReadPlatformService;
@@ -64,16 +65,18 @@ public class ImagesApiResource {
     private final ImageWritePlatformService imageWritePlatformService;
     private final DefaultToApiJsonSerializer<ClientData> toApiJsonSerializer;
     private final FileUploadValidator fileUploadValidator;
+    private final ImageResizer imageResizer;
 
     @Autowired
     public ImagesApiResource(final PlatformSecurityContext context, final ImageReadPlatformService readPlatformService,
             final ImageWritePlatformService imageWritePlatformService, final DefaultToApiJsonSerializer<ClientData> toApiJsonSerializer,
-            final FileUploadValidator fileUploadValidator) {
+            final FileUploadValidator fileUploadValidator, final ImageResizer imageResizer) {
         this.context = context;
         this.imageReadPlatformService = readPlatformService;
         this.imageWritePlatformService = imageWritePlatformService;
         this.toApiJsonSerializer = toApiJsonSerializer;
         this.fileUploadValidator = fileUploadValidator;
+        this.imageResizer = imageResizer;
     }
 
     /**
@@ -146,7 +149,7 @@ public class ImagesApiResource {
             imageDataURISuffix = ContentRepositoryUtils.ImageDataURIsuffix.PNG.getValue();
         }
 
-        ImageData resizedImage = imageData.resize(imageData, maxWidth, maxHeight);
+        ImageData resizedImage = imageResizer.resize(imageData, maxWidth, maxHeight);
         try {
             byte[] resizedImageBytes = resizedImage.getInputStream().readAllBytes();
             final String clientImageAsBase64Text = imageDataURISuffix + Base64.getMimeEncoder().encodeToString(resizedImageBytes);
@@ -170,7 +173,7 @@ public class ImagesApiResource {
         }
 
         final ImageData imageData = this.imageReadPlatformService.retrieveImage(entityName, entityId);
-        final ImageData resizedImage = imageData.resize(imageData, maxWidth, maxHeight);
+        final ImageData resizedImage = imageResizer.resize(imageData, maxWidth, maxHeight);
         final ResponseBuilder response = Response.ok(resizedImage.getInputStream());
         final String dispositionType = "inline_octet".equals(output) ? "inline" : "attachment";
         response.header("Content-Disposition",
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageData.java
index e0509b5..3f7df51 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageData.java
@@ -18,20 +18,12 @@
  */
 package org.apache.fineract.infrastructure.documentmanagement.data;
 
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.IOException;
+import java.io.FileNotFoundException;
 import java.io.InputStream;
-import javax.imageio.ImageIO;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepositoryUtils;
-import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepositoryUtils.ImageFileExtension;
 import org.apache.fineract.infrastructure.documentmanagement.domain.StorageType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,51 +46,6 @@ public class ImageData {
         this.entityDisplayName = entityDisplayName;
     }
 
-    public ImageData resize(ImageData image, Integer maxWidth, Integer maxHeight) {
-        if (maxWidth == null && maxHeight != null) {
-            return image;
-        }
-        try (InputStream is = image.getInputStream()) {
-            InputStream resizedIS = resizeImage(image.getFileExtension(), is, maxWidth != null ? maxWidth : Integer.MAX_VALUE,
-                    maxHeight != null ? maxHeight : Integer.MAX_VALUE);
-
-            ImageData resizedImage = new ImageData(image.location(), image.storageType(), image.getEntityDisplayName());
-            resizedImage.updateContent(resizedIS);
-            return resizedImage;
-        } catch (IOException e) {
-            LOG.warn("resize() failed, returning original image: {}", e.getMessage(), e);
-            return image;
-        }
-    }
-
-    private InputStream resizeImage(ImageFileExtension fileExtension, InputStream in, int maxWidth, int maxHeight) throws IOException {
-        ByteArrayOutputStream os = new ByteArrayOutputStream();
-
-        BufferedImage src = ImageIO.read(in);
-        if (src.getWidth() <= maxWidth && src.getHeight() <= maxHeight) {
-            in.reset();
-            return in;
-        }
-        float widthRatio = (float) src.getWidth() / maxWidth;
-        float heightRatio = (float) src.getHeight() / maxHeight;
-        float scaleRatio = widthRatio > heightRatio ? widthRatio : heightRatio;
-
-        // TODO(lindahl): Improve compressed image quality (perhaps quality ratio)
-
-        int newWidth = (int) (src.getWidth() / scaleRatio);
-        int newHeight = (int) (src.getHeight() / scaleRatio);
-        int colorModel = fileExtension == ContentRepositoryUtils.ImageFileExtension.JPEG ? BufferedImage.TYPE_INT_RGB
-                : BufferedImage.TYPE_INT_ARGB;
-        BufferedImage target = new BufferedImage(newWidth, newHeight, colorModel);
-        Graphics2D g = target.createGraphics();
-        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
-        g.drawImage(src, 0, 0, newWidth, newHeight, Color.BLACK, null);
-        g.dispose();
-        ImageIO.write(target, fileExtension != null ? fileExtension.getValueWithoutDot() : "jpeg", os);
-
-        return new ByteArrayInputStream(os.toByteArray());
-    }
-
     private void setImageFileExtension(String filename) {
         fileExtension = ContentRepositoryUtils.ImageFileExtension.JPEG;
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageResizer.java
similarity index 60%
copy from fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageData.java
copy to fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageResizer.java
index e0509b5..9241ea6 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageResizer.java
@@ -24,35 +24,19 @@ import java.awt.RenderingHints;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import javax.imageio.ImageIO;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepositoryUtils;
 import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepositoryUtils.ImageFileExtension;
-import org.apache.fineract.infrastructure.documentmanagement.domain.StorageType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
 
-public class ImageData {
+@Service
+public class ImageResizer {
 
-    private static final Logger LOG = LoggerFactory.getLogger(ImageData.class);
-
-    private final String location;
-    private final StorageType storageType;
-    private final String entityDisplayName;
-
-    private File file;
-    private ContentRepositoryUtils.ImageFileExtension fileExtension;
-    private InputStream inputStream;
-
-    public ImageData(final String location, final StorageType storageType, final String entityDisplayName) {
-        this.location = location;
-        this.storageType = storageType;
-        this.entityDisplayName = entityDisplayName;
-    }
+    private static final Logger LOG = LoggerFactory.getLogger(ImageResizer.class);
 
     public ImageData resize(ImageData image, Integer maxWidth, Integer maxHeight) {
         if (maxWidth == null && maxHeight != null) {
@@ -98,60 +82,4 @@ public class ImageData {
 
         return new ByteArrayInputStream(os.toByteArray());
     }
-
-    private void setImageFileExtension(String filename) {
-        fileExtension = ContentRepositoryUtils.ImageFileExtension.JPEG;
-
-        if (StringUtils.endsWith(filename.toLowerCase(), ContentRepositoryUtils.ImageFileExtension.GIF.getValue())) {
-            fileExtension = ContentRepositoryUtils.ImageFileExtension.GIF;
-        } else if (StringUtils.endsWith(filename, ContentRepositoryUtils.ImageFileExtension.PNG.getValue())) {
-            fileExtension = ContentRepositoryUtils.ImageFileExtension.PNG;
-        }
-    }
-
-    public void updateContent(final File file) {
-        this.file = file;
-        if (this.file != null) {
-            setImageFileExtension(this.file.getName());
-        }
-    }
-
-    public void updateContent(final InputStream objectContent) {
-        this.inputStream = objectContent;
-    }
-
-    public InputStream getInputStream() {
-        if (this.file != null) {
-            try {
-                return new FileInputStream(this.file);
-            } catch (FileNotFoundException e) {
-                throw new IllegalStateException("FileNotFoundException: " + file, e);
-            }
-        }
-        return this.inputStream;
-    }
-
-    public String contentType() {
-        return ContentRepositoryUtils.ImageMIMEtype.fromFileExtension(this.fileExtension).getValue();
-    }
-
-    public ContentRepositoryUtils.ImageFileExtension getFileExtension() {
-        return this.fileExtension;
-    }
-
-    public StorageType storageType() {
-        return this.storageType;
-    }
-
-    public String name() {
-        return this.file.getName();
-    }
-
-    public String location() {
-        return this.location;
-    }
-
-    public String getEntityDisplayName() {
-        return this.entityDisplayName;
-    }
 }