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 <[email protected]> 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
