You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by pe...@apache.org on 2020/11/19 09:25:44 UTC

[fineract] branch develop updated (bf0c7e2 -> 6c853a6)

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

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


    from bf0c7e2  docs: Fix broken build
     new 3e1444a  Remove unused fileName and resourceId from ContentRepository deleteFile() & deleteImage() (FINERACT-1201)
     new 6c853a6  ContentRepository.fetchImage() FileData not ImageData (FINERACT-1201)

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../documentmanagement/api/ContentResources.java   | 61 ++++++++++++++++++++++
 .../api/DocumentManagementApiResource.java         |  8 +--
 .../documentmanagement/api/ImagesApiResource.java  | 41 ++++-----------
 .../contentrepository/ContentRepository.java       |  9 ++--
 .../contentrepository/ContentRepositoryUtils.java  | 14 ++++-
 .../FileSystemContentRepository.java               | 30 +++++------
 .../contentrepository/S3ContentRepository.java     | 21 +++++---
 .../documentmanagement/data/DocumentData.java      | 18 +++++--
 .../documentmanagement/data/FileData.java          | 36 +++----------
 .../documentmanagement/data/ImageData.java         | 52 +++---------------
 .../documentmanagement/data/ImageResizer.java      | 19 ++++---
 .../service/DocumentReadPlatformServiceImpl.java   | 13 +----
 ...umentWritePlatformServiceJpaRepositoryImpl.java |  4 +-
 .../service/ImageReadPlatformService.java          |  4 +-
 .../service/ImageReadPlatformServiceImpl.java      |  3 +-
 ...ImageWritePlatformServiceJpaRepositoryImpl.java |  4 +-
 .../integrationtests/client/DocumentTest.java      | 14 +++--
 17 files changed, 169 insertions(+), 182 deletions(-)
 create mode 100644 fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ContentResources.java


[fineract] 01/02: Remove unused fileName and resourceId from ContentRepository deleteFile() & deleteImage() (FINERACT-1201)

Posted by pe...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3e1444a6e48226f095e98e50e7c629cf014ceabb
Author: Michael Vorburger <mi...@vorburger.ch>
AuthorDate: Sat Oct 31 19:33:15 2020 +0100

    Remove unused fileName and resourceId from ContentRepository deleteFile() & deleteImage() (FINERACT-1201)
---
 .../contentrepository/ContentRepository.java       |  7 +++++--
 .../FileSystemContentRepository.java               | 23 ++++++++++------------
 .../contentrepository/S3ContentRepository.java     |  4 ++--
 ...umentWritePlatformServiceJpaRepositoryImpl.java |  4 ++--
 ...ImageWritePlatformServiceJpaRepositoryImpl.java |  4 ++--
 5 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepository.java
index bacfaa8..2e02efc 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepository.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepository.java
@@ -26,6 +26,9 @@ import org.apache.fineract.infrastructure.documentmanagement.data.FileData;
 import org.apache.fineract.infrastructure.documentmanagement.data.ImageData;
 import org.apache.fineract.infrastructure.documentmanagement.domain.StorageType;
 
+/**
+ * Repository which stores Files (AKA Documents) and Images.
+ */
 public interface ContentRepository {
 
     // TODO:Vishwas Need to move these settings to the Database
@@ -36,7 +39,7 @@ public interface ContentRepository {
 
     String saveFile(InputStream uploadedInputStream, DocumentCommand documentCommand);
 
-    void deleteFile(String fileName, String documentPath);
+    void deleteFile(String documentPath);
 
     FileData fetchFile(DocumentData documentData);
 
@@ -44,7 +47,7 @@ public interface ContentRepository {
 
     String saveImage(Base64EncodedImage base64EncodedImage, Long resourceId, String imageName);
 
-    void deleteImage(Long resourceId, String location);
+    void deleteImage(String location);
 
     ImageData fetchImage(ImageData imageData);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/FileSystemContentRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/FileSystemContentRepository.java
index 5722e6c..75adf66 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/FileSystemContentRepository.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/FileSystemContentRepository.java
@@ -78,25 +78,22 @@ public class FileSystemContentRepository implements ContentRepository {
     }
 
     @Override
-    public void deleteImage(final Long resourceId, final String location) {
-        final boolean fileDeleted = deleteFile(location);
-        if (!fileDeleted) {
-            // no need to throw an Error, simply log a warning
-            LOG.warn("Unable to delete image associated with clients with Id {}", resourceId);
-        }
+    public void deleteImage(final String location) {
+        deleteFileInternal(location);
     }
 
     @Override
-    public void deleteFile(final String fileName, final String documentPath) {
-        final boolean fileDeleted = deleteFile(documentPath);
-        if (!fileDeleted) {
-            throw new ContentManagementException(fileName, null);
-        }
+    public void deleteFile(final String documentPath) {
+        deleteFileInternal(documentPath);
     }
 
-    private boolean deleteFile(final String documentPath) {
+    private void deleteFileInternal(final String documentPath) {
         final File fileToBeDeleted = new File(documentPath);
-        return fileToBeDeleted.delete();
+        final boolean fileDeleted = fileToBeDeleted.delete();
+        if (!fileDeleted) {
+            // no need to throw an Error, what's a caller going to do about it, so simply log a warning
+            LOG.warn("Unable to delete file {}", documentPath);
+        }
     }
 
     @Override
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/S3ContentRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/S3ContentRepository.java
index db1aae8..9c4a02b 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/S3ContentRepository.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/S3ContentRepository.java
@@ -73,7 +73,7 @@ public class S3ContentRepository implements ContentRepository {
     }
 
     @Override
-    public void deleteFile(final String documentName, final String documentPath) {
+    public void deleteFile(final String documentPath) {
         deleteObject(documentPath);
     }
 
@@ -99,7 +99,7 @@ public class S3ContentRepository implements ContentRepository {
     }
 
     @Override
-    public void deleteImage(final Long resourceId, final String location) {
+    public void deleteImage(final String location) {
         deleteObject(location);
     }
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java
index dce1ab8..e3065f0 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java
@@ -128,7 +128,7 @@ public class DocumentWritePlatformServiceJpaRepositoryImpl implements DocumentWr
 
             if (inputStream != null && documentCommand.isFileNameChanged()) {
                 final ContentRepository contentRepository = this.contentRepositoryFactory.getRepository(documentStoreType);
-                contentRepository.deleteFile(documentCommand.getName(), oldLocation);
+                contentRepository.deleteFile(oldLocation);
             }
 
             this.documentRepository.saveAndFlush(documentForUpdate);
@@ -157,7 +157,7 @@ public class DocumentWritePlatformServiceJpaRepositoryImpl implements DocumentWr
         this.documentRepository.delete(document);
 
         final ContentRepository contentRepository = this.contentRepositoryFactory.getRepository(document.storageType());
-        contentRepository.deleteFile(document.getName(), document.getLocation());
+        contentRepository.deleteFile(document.getLocation());
         return new CommandProcessingResult(document.getId());
     }
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageWritePlatformServiceJpaRepositoryImpl.java
index 534fde1..04c316e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageWritePlatformServiceJpaRepositoryImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageWritePlatformServiceJpaRepositoryImpl.java
@@ -99,7 +99,7 @@ public class ImageWritePlatformServiceJpaRepositoryImpl implements ImageWritePla
         if (image != null) {
             final ContentRepository contentRepository = this.contentRepositoryFactory
                     .getRepository(StorageType.fromInt(image.getStorageType()));
-            contentRepository.deleteImage(clientId, image.getLocation());
+            contentRepository.deleteImage(image.getLocation());
             this.imageRepository.delete(image);
         }
 
@@ -126,7 +126,7 @@ public class ImageWritePlatformServiceJpaRepositoryImpl implements ImageWritePla
         if (image != null) {
             final ContentRepository contentRepository = this.contentRepositoryFactory
                     .getRepository(StorageType.fromInt(image.getStorageType()));
-            contentRepository.deleteImage(entityId, image.getLocation());
+            contentRepository.deleteImage(image.getLocation());
         }
         return owner;
     }


[fineract] 02/02: ContentRepository.fetchImage() FileData not ImageData (FINERACT-1201)

Posted by pe...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6c853a6cc77c1697cbe3a868847b38522744e0e6
Author: Michael Vorburger <mi...@vorburger.ch>
AuthorDate: Sun Nov 1 13:13:37 2020 +0100

    ContentRepository.fetchImage() FileData not ImageData (FINERACT-1201)
    
    This is more consistent with fetchFile(), and allows to re-use code.
---
 .../documentmanagement/api/ContentResources.java   | 61 ++++++++++++++++++++++
 .../api/DocumentManagementApiResource.java         |  8 +--
 .../documentmanagement/api/ImagesApiResource.java  | 41 ++++-----------
 .../contentrepository/ContentRepository.java       |  2 +-
 .../contentrepository/ContentRepositoryUtils.java  | 14 ++++-
 .../FileSystemContentRepository.java               |  7 ++-
 .../contentrepository/S3ContentRepository.java     | 17 +++---
 .../documentmanagement/data/DocumentData.java      | 18 +++++--
 .../documentmanagement/data/FileData.java          | 36 +++----------
 .../documentmanagement/data/ImageData.java         | 52 +++---------------
 .../documentmanagement/data/ImageResizer.java      | 19 ++++---
 .../service/DocumentReadPlatformServiceImpl.java   | 13 +----
 .../service/ImageReadPlatformService.java          |  4 +-
 .../service/ImageReadPlatformServiceImpl.java      |  3 +-
 .../integrationtests/client/DocumentTest.java      | 14 +++--
 15 files changed, 148 insertions(+), 161 deletions(-)

diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ContentResources.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ContentResources.java
new file mode 100644
index 0000000..23a885f
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ContentResources.java
@@ -0,0 +1,61 @@
+/**
+ * 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.fineract.infrastructure.documentmanagement.api;
+
+import com.google.common.io.ByteSource;
+import java.io.IOException;
+import java.io.InputStream;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import org.apache.fineract.infrastructure.documentmanagement.data.FileData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utilities common to file upload/download resources.
+ *
+ * @author Michael Vorburger.ch
+ */
+final class ContentResources {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ContentResources.class);
+
+    private ContentResources() {}
+
+    static Response fileDataToResponse(FileData fileData, String fileName, String dispositionType) {
+        ResponseBuilder response;
+        try {
+            ByteSource byteSource = fileData.getByteSource();
+            // TODO Where is this InputStream closed?! It needs to be AFTER it's read by JAX-RS.. how to do that?
+            InputStream is = byteSource.openBufferedStream();
+            response = Response.ok(is);
+            response.header("Content-Disposition", dispositionType + "; filename=\"" + fileName + "\"");
+            response.header("Content-Length", byteSource.sizeIfKnown().or(-1L));
+            response.header("Content-Type", fileData.contentType());
+        } catch (IOException e) {
+            LOG.error("resizedImage.getByteSource().openBufferedStream() failed", e);
+            response = Response.serverError();
+        }
+        return response.build();
+    }
+
+    static Response fileDataToResponse(FileData fileData, String dispositionType) {
+        return fileDataToResponse(fileData, fileData.name(), dispositionType);
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java
index 05a3b2c..6e53cf5 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java
@@ -46,7 +46,6 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
 import javax.ws.rs.core.UriInfo;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
@@ -225,13 +224,8 @@ public class DocumentManagementApiResource {
             @PathParam("documentId") @Parameter(description = "documentId") final Long documentId) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.systemEntityType);
-
         final FileData fileData = this.documentReadPlatformService.retrieveFileData(entityType, entityId, documentId);
-        final ResponseBuilder response = Response.ok(fileData.inputStream());
-        response.header("Content-Disposition", "attachment; filename=\"" + fileData.name() + "\"");
-        response.header("Content-Type", fileData.contentType());
-
-        return response.build();
+        return ContentResources.fileDataToResponse(fileData, "attachment");
     }
 
     @DELETE
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 c745ff5..ed8a5b4 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
@@ -18,7 +18,6 @@
  */
 package org.apache.fineract.infrastructure.documentmanagement.api;
 
-import com.google.common.io.ByteSource;
 import com.sun.jersey.core.header.FormDataContentDisposition;
 import com.sun.jersey.multipart.FormDataBodyPart;
 import com.sun.jersey.multipart.FormDataParam;
@@ -37,14 +36,13 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.infrastructure.core.domain.Base64EncodedImage;
 import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
 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.FileData;
 import org.apache.fineract.infrastructure.documentmanagement.data.ImageResizer;
 import org.apache.fineract.infrastructure.documentmanagement.exception.ContentManagementException;
 import org.apache.fineract.infrastructure.documentmanagement.exception.InvalidEntityTypeForImageManagementException;
@@ -52,8 +50,6 @@ import org.apache.fineract.infrastructure.documentmanagement.service.ImageReadPl
 import org.apache.fineract.infrastructure.documentmanagement.service.ImageWritePlatformService;
 import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.portfolio.client.data.ClientData;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
@@ -63,8 +59,6 @@ import org.springframework.stereotype.Component;
 @Path("{entity}/{entityId}/images")
 public class ImagesApiResource {
 
-    private static final Logger LOG = LoggerFactory.getLogger(ImagesApiResource.class);
-
     private final PlatformSecurityContext context;
     private final ImageReadPlatformService imageReadPlatformService;
     private final ImageWritePlatformService imageWritePlatformService;
@@ -144,23 +138,23 @@ public class ImagesApiResource {
             return downloadClientImage(entityName, entityId, maxWidth, maxHeight, output);
         }
 
-        final ImageData imageData = this.imageReadPlatformService.retrieveImage(entityName, entityId);
+        final FileData imageData = this.imageReadPlatformService.retrieveImage(entityName, entityId);
 
         // TODO: Need a better way of determining image type
         String imageDataURISuffix = ContentRepositoryUtils.ImageDataURIsuffix.JPEG.getValue();
-        if (StringUtils.endsWith(imageData.location(), ContentRepositoryUtils.ImageFileExtension.GIF.getValue())) {
+        if (StringUtils.endsWith(imageData.name(), ContentRepositoryUtils.ImageFileExtension.GIF.getValue())) {
             imageDataURISuffix = ContentRepositoryUtils.ImageDataURIsuffix.GIF.getValue();
-        } else if (StringUtils.endsWith(imageData.location(), ContentRepositoryUtils.ImageFileExtension.PNG.getValue())) {
+        } else if (StringUtils.endsWith(imageData.name(), ContentRepositoryUtils.ImageFileExtension.PNG.getValue())) {
             imageDataURISuffix = ContentRepositoryUtils.ImageDataURIsuffix.PNG.getValue();
         }
 
-        ImageData resizedImage = imageResizer.resize(imageData, maxWidth, maxHeight);
+        FileData resizedImage = imageResizer.resize(imageData, maxWidth, maxHeight);
         try {
             byte[] resizedImageBytes = resizedImage.getByteSource().read();
             final String clientImageAsBase64Text = imageDataURISuffix + Base64.getMimeEncoder().encodeToString(resizedImageBytes);
             return Response.ok(clientImageAsBase64Text).build();
         } catch (IOException e) {
-            throw new ContentManagementException(imageData.getEntityDisplayName(), e.getMessage(), e);
+            throw new ContentManagementException(imageData.name(), e.getMessage(), e);
         }
     }
 
@@ -177,25 +171,10 @@ public class ImagesApiResource {
             this.context.authenticatedUser().validateHasReadPermission("STAFFIMAGE");
         }
 
-        final ImageData imageData = this.imageReadPlatformService.retrieveImage(entityName, entityId);
-        final ImageData resizedImage = imageResizer.resize(imageData, maxWidth, maxHeight);
-        ResponseBuilder response;
-        try {
-            ByteSource byteSource = resizedImage.getByteSource();
-            // TODO Where is this InputStream closed?! It needs to be AFTER it's read by JAX-RS.. how to do that?
-            InputStream is = byteSource.openBufferedStream();
-            response = Response.ok(is);
-            final String dispositionType = "inline_octet".equals(output) ? "inline" : "attachment";
-            response.header("Content-Disposition",
-                    dispositionType + "; filename=\"" + imageData.getEntityDisplayName() + ImageFileExtension.JPEG + "\"");
-            response.header("Content-Length", byteSource.sizeIfKnown().or(-1L));
-            // TODO: Need a better way of determining image type
-            response.header("Content-Type", imageData.contentType());
-        } catch (IOException e) {
-            LOG.error("resizedImage.getByteSource().openBufferedStream() failed", e);
-            response = Response.serverError();
-        }
-        return response.build();
+        final FileData imageData = this.imageReadPlatformService.retrieveImage(entityName, entityId);
+        final FileData resizedImage = imageResizer.resize(imageData, maxWidth, maxHeight);
+        return ContentResources.fileDataToResponse(resizedImage, resizedImage.name() + ImageFileExtension.JPEG,
+                "inline_octet".equals(output) ? "inline" : "attachment");
     }
 
     /**
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepository.java
index 2e02efc..831e7b6 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepository.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepository.java
@@ -49,7 +49,7 @@ public interface ContentRepository {
 
     void deleteImage(String location);
 
-    ImageData fetchImage(ImageData imageData);
+    FileData fetchImage(ImageData imageData);
 
     StorageType getStorageType();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepositoryUtils.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepositoryUtils.java
index b50d391..e9f03e5 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepositoryUtils.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/ContentRepositoryUtils.java
@@ -113,14 +113,24 @@ public final class ContentRepositoryUtils {
         }
     }
 
+    public static ImageFileExtension imageExtensionFromFileName(String fileName) {
+        if (StringUtils.endsWith(fileName.toLowerCase(), ContentRepositoryUtils.ImageFileExtension.GIF.getValue())) {
+            return ContentRepositoryUtils.ImageFileExtension.GIF;
+        } else if (StringUtils.endsWith(fileName, ContentRepositoryUtils.ImageFileExtension.PNG.getValue())) {
+            return ContentRepositoryUtils.ImageFileExtension.PNG;
+        } else {
+            return ContentRepositoryUtils.ImageFileExtension.JPEG;
+        }
+    }
+
     /**
      * Validates that passed in Mime type maps to known image mime types
      *
      * @param mimeType
      */
     public static void validateImageMimeType(final String mimeType) {
-        if (!(mimeType.equalsIgnoreCase(ImageMIMEtype.GIF.getValue()) || mimeType.equalsIgnoreCase(ImageMIMEtype.JPEG.getValue())
-                || mimeType.equalsIgnoreCase(ImageMIMEtype.PNG.getValue()))) {
+        if ((!mimeType.equalsIgnoreCase(ImageMIMEtype.GIF.getValue()) && !mimeType.equalsIgnoreCase(ImageMIMEtype.JPEG.getValue())
+                && !mimeType.equalsIgnoreCase(ImageMIMEtype.PNG.getValue()))) {
             throw new ImageUploadException(mimeType);
         }
     }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/FileSystemContentRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/FileSystemContentRepository.java
index 75adf66..483cd5e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/FileSystemContentRepository.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/FileSystemContentRepository.java
@@ -99,14 +99,13 @@ public class FileSystemContentRepository implements ContentRepository {
     @Override
     public FileData fetchFile(final DocumentData documentData) {
         final File file = new File(documentData.fileLocation());
-        return new FileData(file, documentData.fileName(), documentData.contentType());
+        return new FileData(Files.asByteSource(file), documentData.fileName(), documentData.contentType());
     }
 
     @Override
-    public ImageData fetchImage(final ImageData imageData) {
+    public FileData fetchImage(final ImageData imageData) {
         final File file = new File(imageData.location());
-        imageData.updateContent(file);
-        return imageData;
+        return new FileData(Files.asByteSource(file), imageData.getEntityDisplayName(), imageData.contentType().getValue());
     }
 
     @Override
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/S3ContentRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/S3ContentRepository.java
index 9c4a02b..da999a7 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/S3ContentRepository.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/contentrepository/S3ContentRepository.java
@@ -105,21 +105,26 @@ public class S3ContentRepository implements ContentRepository {
 
     @Override
     public FileData fetchFile(final DocumentData documentData) throws DocumentNotFoundException {
-        final S3Object s3object = getObject(documentData.fileLocation());
-        return new FileData(s3object.getObjectContent(), documentData.fileName(), documentData.contentType());
+        return new FileData(new ByteSource() {
+
+            @Override
+            public InputStream openStream() throws IOException {
+                final S3Object s3object = getObject(documentData.fileLocation());
+                return s3object.getObjectContent();
+            }
+        }, documentData.fileName(), documentData.contentType());
     }
 
     @Override
-    public ImageData fetchImage(final ImageData imageData) {
-        imageData.updateContent(new ByteSource() {
+    public FileData fetchImage(final ImageData imageData) {
+        return new FileData(new ByteSource() {
 
             @Override
             public InputStream openStream() throws IOException {
                 final S3Object s3object = getObject(imageData.location());
                 return s3object.getObjectContent();
             }
-        });
-        return imageData;
+        }, imageData.getEntityDisplayName(), imageData.contentType().getValue());
     }
 
     @Override
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/DocumentData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/DocumentData.java
index cf815cf..c8b53ce 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/DocumentData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/DocumentData.java
@@ -21,22 +21,19 @@ package org.apache.fineract.infrastructure.documentmanagement.data;
 import org.apache.fineract.infrastructure.documentmanagement.domain.StorageType;
 
 /**
- * Immutable data object represent document being managed on platform.
+ * Immutable data object representing a user document being managed on the platform.
  */
 public class DocumentData {
 
     private final Long id;
     private final String parentEntityType;
     private final Long parentEntityId;
-    @SuppressWarnings("unused")
     private final String name;
     private final String fileName;
-    @SuppressWarnings("unused")
     private final Long size;
     private final String type;
-    @SuppressWarnings("unused")
-    private final String description;
     private final String location;
+    private final String description;
     private final Integer storageType;
 
     public DocumentData(final Long id, final String parentEntityType, final Long parentEntityId, final String name, final String fileName,
@@ -81,4 +78,15 @@ public class DocumentData {
         return this.id;
     }
 
+    public String getName() {
+        return this.name;
+    }
+
+    public String getDescription() {
+        return this.description;
+    }
+
+    public Long getSize() {
+        return this.size;
+    }
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/FileData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/FileData.java
index 7442e1c..a17c5c3 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/FileData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/FileData.java
@@ -18,34 +18,18 @@
  */
 package org.apache.fineract.infrastructure.documentmanagement.data;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.google.common.io.ByteSource;
 
 public class FileData {
 
-    private static final Logger LOG = LoggerFactory.getLogger(FileData.class);
-
-    private final File file;
     private final String fileName;
     private final String contentType;
-    private final InputStream inputStream;
-
-    public FileData(final File file, final String fileName, final String contentType) {
-        this.file = file;
-        this.fileName = fileName;
-        this.contentType = contentType;
-        this.inputStream = null;
-    }
+    private final ByteSource byteSource;
 
-    public FileData(final InputStream inputStream, final String fileName, final String contentType) {
-        this.file = null;
-        this.inputStream = inputStream;
+    public FileData(final ByteSource byteSource, final String fileName, final String contentType) {
         this.fileName = fileName;
         this.contentType = contentType;
+        this.byteSource = byteSource;
     }
 
     public String contentType() {
@@ -56,15 +40,7 @@ public class FileData {
         return this.fileName;
     }
 
-    public InputStream inputStream() {
-        try {
-            if (this.inputStream == null) {
-                return new FileInputStream(this.file);
-            }
-            return this.inputStream;
-        } catch (final FileNotFoundException e) {
-            LOG.error("Error occured.", e);
-            return null;
-        }
+    public ByteSource getByteSource() {
+        return this.byteSource;
     }
 }
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 9c15a77..18993eb 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,11 +18,8 @@
  */
 package org.apache.fineract.infrastructure.documentmanagement.data;
 
-import com.google.common.io.ByteSource;
-import com.google.common.io.Files;
-import java.io.File;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepositoryUtils;
+import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepositoryUtils.ImageMIMEtype;
 import org.apache.fineract.infrastructure.documentmanagement.domain.StorageType;
 
 public class ImageData {
@@ -30,61 +27,24 @@ public class ImageData {
     private final String location;
     private final StorageType storageType;
     private final String entityDisplayName;
-
-    private File file;
-    private ByteSource byteSource;
-    private ContentRepositoryUtils.ImageFileExtension fileExtension;
+    private final ContentRepositoryUtils.ImageMIMEtype contentType;
 
     public ImageData(final String location, final StorageType storageType, final String entityDisplayName) {
         this.location = location;
         this.storageType = storageType;
         this.entityDisplayName = entityDisplayName;
+        this.contentType = ContentRepositoryUtils.ImageMIMEtype
+                .fromFileExtension(ContentRepositoryUtils.imageExtensionFromFileName(location));
     }
 
-    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 ByteSource byteSource) {
-        this.byteSource = byteSource;
-    }
-
-    public ByteSource getByteSource() {
-        if (this.file != null) {
-            return Files.asByteSource(file);
-        }
-        return this.byteSource;
-    }
-
-    public String contentType() {
-        return ContentRepositoryUtils.ImageMIMEtype.fromFileExtension(this.fileExtension).getValue();
-    }
-
-    public ContentRepositoryUtils.ImageFileExtension getFileExtension() {
-        return this.fileExtension;
+    public ImageMIMEtype contentType() {
+        return this.contentType;
     }
 
     public StorageType storageType() {
         return this.storageType;
     }
 
-    public String name() {
-        return this.file.getName();
-    }
-
     public String location() {
         return this.location;
     }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageResizer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageResizer.java
index 3653837..0f2e745 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageResizer.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/data/ImageResizer.java
@@ -40,28 +40,27 @@ public class ImageResizer {
 
     private static final Logger LOG = LoggerFactory.getLogger(ImageResizer.class);
 
-    public ImageData resize(ImageData image, Integer maxWidth, Integer maxHeight) {
+    public FileData resize(FileData fileData, Integer maxWidth, Integer maxHeight) {
         if (maxWidth == null && maxHeight != null) {
-            return image;
+            return fileData;
         }
-        try (InputStream is = image.getByteSource().openBufferedStream()) {
-            Optional<InputStream> optResizedIS = resizeImage(image.getFileExtension(), is, maxWidth != null ? maxWidth : Integer.MAX_VALUE,
-                    maxHeight != null ? maxHeight : Integer.MAX_VALUE);
+        try (InputStream is = fileData.getByteSource().openBufferedStream()) {
+            Optional<InputStream> optResizedIS = resizeImage(ContentRepositoryUtils.imageExtensionFromFileName(fileData.name()), is,
+                    maxWidth != null ? maxWidth : Integer.MAX_VALUE, maxHeight != null ? maxHeight : Integer.MAX_VALUE);
             if (optResizedIS.isPresent()) {
-                ImageData resizedImage = new ImageData(image.location(), image.storageType(), image.getEntityDisplayName());
-                resizedImage.updateContent(new ByteSource() {
+                FileData resizedImage = new FileData(new ByteSource() {
 
                     @Override
                     public InputStream openStream() throws IOException {
                         return optResizedIS.get();
                     }
-                });
+                }, fileData.name(), fileData.contentType());
                 return resizedImage;
             }
-            return image;
+            return fileData;
         } catch (IOException e) {
             LOG.warn("resize() failed, returning original image: {}", e.getMessage(), e);
-            return image;
+            return fileData;
         }
     }
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentReadPlatformServiceImpl.java
index f76a05b..cef527b 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentReadPlatformServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentReadPlatformServiceImpl.java
@@ -60,7 +60,7 @@ public class DocumentReadPlatformServiceImpl implements DocumentReadPlatformServ
         // scope for the particular entities
         final DocumentMapper mapper = new DocumentMapper(true, true);
         final String sql = "select " + mapper.schema() + " order by d.id";
-        return this.jdbcTemplate.query(sql, mapper, new Object[] { entityType, entityId });
+        return this.jdbcTemplate.query(sql, mapper, entityType, entityId);
     }
 
     @Override
@@ -85,17 +85,10 @@ public class DocumentReadPlatformServiceImpl implements DocumentReadPlatformServ
         }
     }
 
-    /**
-     * @param entityType
-     * @param entityId
-     * @param documentId
-     * @param mapper
-     * @return
-     */
     private DocumentData fetchDocumentDetails(final String entityType, final Long entityId, final Long documentId,
             final DocumentMapper mapper) {
         final String sql = "select " + mapper.schema() + " and d.id=? ";
-        return this.jdbcTemplate.queryForObject(sql, mapper, new Object[] { entityType, entityId, documentId });
+        return this.jdbcTemplate.queryForObject(sql, mapper, entityType, entityId, documentId);
     }
 
     private static final class DocumentMapper implements RowMapper<DocumentData> {
@@ -117,7 +110,6 @@ public class DocumentReadPlatformServiceImpl implements DocumentReadPlatformServ
 
         @Override
         public DocumentData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
-
             final Long id = JdbcSupport.getLong(rs, "id");
             final Long parentEntityId = JdbcSupport.getLong(rs, "parentEntityId");
             final Long fileSize = JdbcSupport.getLong(rs, "fileSize");
@@ -138,5 +130,4 @@ public class DocumentReadPlatformServiceImpl implements DocumentReadPlatformServ
                     storageType);
         }
     }
-
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageReadPlatformService.java
index 436ebc3..608f647 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageReadPlatformService.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageReadPlatformService.java
@@ -18,10 +18,10 @@
  */
 package org.apache.fineract.infrastructure.documentmanagement.service;
 
-import org.apache.fineract.infrastructure.documentmanagement.data.ImageData;
+import org.apache.fineract.infrastructure.documentmanagement.data.FileData;
 
 public interface ImageReadPlatformService {
 
-    ImageData retrieveImage(String entityType, Long entityId);
+    FileData retrieveImage(String entityType, Long entityId);
 
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageReadPlatformServiceImpl.java
index 8c4830c..82c0bf2 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageReadPlatformServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/ImageReadPlatformServiceImpl.java
@@ -25,6 +25,7 @@ import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
 import org.apache.fineract.infrastructure.documentmanagement.api.ImagesApiResource.EntityTypeForImages;
 import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepository;
 import org.apache.fineract.infrastructure.documentmanagement.contentrepository.ContentRepositoryFactory;
+import org.apache.fineract.infrastructure.documentmanagement.data.FileData;
 import org.apache.fineract.infrastructure.documentmanagement.data.ImageData;
 import org.apache.fineract.infrastructure.documentmanagement.domain.StorageType;
 import org.apache.fineract.organisation.staff.domain.Staff;
@@ -84,7 +85,7 @@ public class ImageReadPlatformServiceImpl implements ImageReadPlatformService {
     }
 
     @Override
-    public ImageData retrieveImage(String entityType, final Long entityId) {
+    public FileData retrieveImage(String entityType, final Long entityId) {
         try {
             String displayName;
             if (EntityTypeForImages.CLIENTS.toString().equalsIgnoreCase(entityType)) {
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java
index 1d7d49b..a36be51 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java
@@ -52,7 +52,7 @@ public class DocumentTest extends IntegrationTest {
     void createDocument() {
         String name = "Test";
         Part part = Parts.fromFile(testFile);
-        String description = null;
+        String description = "The Description";
         var response = ok(fineract().documents.createDocument("clients", clientId, part, name, description));
         assertThat(response.getResourceId()).isNotNull();
         assertThat(response.getResourceIdentifier()).isNotEmpty();
@@ -65,12 +65,13 @@ public class DocumentTest extends IntegrationTest {
         GetEntityTypeEntityIdDocumentsResponse doc = ok(fineract().documents.getDocument("clients", clientId, documentId));
         assertThat(doc.getName()).isEqualTo("Test");
         assertThat(doc.getFileName()).isEqualTo(testFile.getName());
-        assertThat(doc.getDescription()).isNull();
+        assertThat(doc.getDescription()).isEqualTo("The Description");
         assertThat(doc.getId()).isEqualTo(documentId);
         assertThat(doc.getParentEntityType()).isEqualTo("clients");
         assertThat(doc.getParentEntityId()).isEqualTo(clientId);
-        // TODO huh?! It's more than uploaded file; seems like a bug - it's including create body, not just file size
-        assertThat(doc.getSize()).isEqualTo(testFile.length() + 411);
+        // TODO FINERACT-1251 It's more than uploaded file; seems like a bug - it's including create body, not just file
+        // size
+        assertThat(doc.getSize()).isEqualTo(testFile.length() + 618);
         assertThat(doc.getType()).isEqualTo("image/jpeg");
         // TODO doc.getStorageType() shouldn't be exposed by the API?!
     }
@@ -82,7 +83,7 @@ public class DocumentTest extends IntegrationTest {
         try (ResponseBody body = r.body()) {
             assertThat(body.contentType()).isEqualTo(MediaType.get("image/jpeg"));
             assertThat(body.bytes().length).isEqualTo(testFile.length());
-            assertThat(body.contentLength()).isEqualTo(-1); // TODO testFile.length()
+            assertThat(body.contentLength()).isEqualTo(testFile.length());
         }
         assertThat(Parts.fileName(r)).hasValue(testFile.getName());
     }
@@ -97,6 +98,9 @@ public class DocumentTest extends IntegrationTest {
         GetEntityTypeEntityIdDocumentsResponse doc = ok(fineract().documents.getDocument("clients", clientId, documentId));
         assertThat(doc.getName()).isEqualTo(newName);
         assertThat(doc.getDescription()).isEqualTo(newDescription);
+        // TODO FINERACT-1251 It's more than uploaded file; seems like a bug - it's including create body, not just file
+        // size
+        assertThat(doc.getSize()).isEqualTo(testFile.length() + 618);
     }
 
     @Test