Prepare FileSystemContentRepository for code re-use with S3ContentRepository (FINERACT-1201)

This commit is contained in:
Michael Vorburger
2020-10-14 10:34:02 +03:00
committed by Petri Tuomola
parent 0146f518bc
commit 2af09708f1
@@ -18,12 +18,13 @@
*/ */
package org.apache.fineract.infrastructure.documentmanagement.contentrepository; package org.apache.fineract.infrastructure.documentmanagement.contentrepository;
import com.google.common.io.Files;
import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.util.Base64; import java.util.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.fineract.infrastructure.core.domain.Base64EncodedImage; import org.apache.fineract.infrastructure.core.domain.Base64EncodedImage;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import org.apache.fineract.infrastructure.documentmanagement.command.DocumentCommand; import org.apache.fineract.infrastructure.documentmanagement.command.DocumentCommand;
@@ -44,13 +45,10 @@ public class FileSystemContentRepository implements ContentRepository {
@Override @Override
public String saveFile(final InputStream uploadedInputStream, final DocumentCommand documentCommand) { public String saveFile(final InputStream uploadedInputStream, final DocumentCommand documentCommand) {
final String fileName = documentCommand.getFileName(); final String fileName = documentCommand.getFileName();
final String uploadDocumentLocation = generateFileParentDirectory(documentCommand.getParentEntityType(),
documentCommand.getParentEntityId());
ContentRepositoryUtils.validateFileSizeWithinPermissibleRange(documentCommand.getSize(), fileName); ContentRepositoryUtils.validateFileSizeWithinPermissibleRange(documentCommand.getSize(), fileName);
makeDirectories(uploadDocumentLocation);
final String fileLocation = uploadDocumentLocation + File.separator + fileName; final String fileLocation = generateFileParentDirectory(documentCommand.getParentEntityType(), documentCommand.getParentEntityId())
+ File.separator + fileName;
writeFileToFileSystem(fileName, uploadedInputStream, fileLocation); writeFileToFileSystem(fileName, uploadedInputStream, fileLocation);
return fileLocation; return fileLocation;
@@ -58,38 +56,25 @@ public class FileSystemContentRepository implements ContentRepository {
@Override @Override
public String saveImage(final InputStream uploadedInputStream, final Long resourceId, final String imageName, final Long fileSize) { public String saveImage(final InputStream uploadedInputStream, final Long resourceId, final String imageName, final Long fileSize) {
final String uploadImageLocation = generateClientImageParentDirectory(resourceId);
ContentRepositoryUtils.validateFileSizeWithinPermissibleRange(fileSize, imageName); ContentRepositoryUtils.validateFileSizeWithinPermissibleRange(fileSize, imageName);
makeDirectories(uploadImageLocation); final String fileLocation = generateClientImageParentDirectory(resourceId) + File.separator + imageName;
final String fileLocation = uploadImageLocation + File.separator + imageName;
writeFileToFileSystem(imageName, uploadedInputStream, fileLocation); writeFileToFileSystem(imageName, uploadedInputStream, fileLocation);
return fileLocation; return fileLocation;
} }
@Override @Override
public String saveImage(final Base64EncodedImage base64EncodedImage, final Long resourceId, final String imageName) { public String saveImage(final Base64EncodedImage base64EncodedImage, final Long resourceId, final String imageName) {
final String uploadImageLocation = generateClientImageParentDirectory(resourceId); final String fileLocation = generateClientImageParentDirectory(resourceId) + File.separator + imageName
+ base64EncodedImage.getFileExtension();
makeDirectories(uploadImageLocation); String base64EncodedImageString = base64EncodedImage.getBase64EncodedString();
final String fileLocation = uploadImageLocation + File.separator + imageName + base64EncodedImage.getFileExtension();
final String base64EncodedImageString = base64EncodedImage.getBase64EncodedString();
try { try {
final OutputStream out = new FileOutputStream(new File(fileLocation)); final InputStream toUploadInputStream = new ByteArrayInputStream(Base64.getMimeDecoder().decode(base64EncodedImageString));
final byte[] imgBytes = Base64.getMimeDecoder().decode(base64EncodedImageString); writeFileToFileSystem(imageName, toUploadInputStream, fileLocation);
out.write(imgBytes); return fileLocation;
out.flush();
out.close();
} catch (final IOException ioe) {
throw new ContentManagementException(imageName, ioe.getMessage(), ioe);
} catch (IllegalArgumentException iae) { } catch (IllegalArgumentException iae) {
LOG.error("IllegalArgumentException due to invalid Base64 encoding: {}", base64EncodedImageString, iae); LOG.error("IllegalArgumentException due to invalid Base64 encoding: {}", base64EncodedImageString, iae);
throw iae; throw iae;
} }
return fileLocation;
} }
@Override @Override
@@ -114,11 +99,6 @@ public class FileSystemContentRepository implements ContentRepository {
return fileToBeDeleted.delete(); return fileToBeDeleted.delete();
} }
@Override
public StorageType getStorageType() {
return StorageType.FILE_SYSTEM;
}
@Override @Override
public FileData fetchFile(final DocumentData documentData) { public FileData fetchFile(final DocumentData documentData) {
final File file = new File(documentData.fileLocation()); final File file = new File(documentData.fileLocation());
@@ -132,6 +112,11 @@ public class FileSystemContentRepository implements ContentRepository {
return imageData; return imageData;
} }
@Override
public StorageType getStorageType() {
return StorageType.FILE_SYSTEM;
}
/** /**
* Generate the directory path for storing the new document * Generate the directory path for storing the new document
*/ */
@@ -153,23 +138,14 @@ public class FileSystemContentRepository implements ContentRepository {
/** /**
* Recursively create the directory if it does not exist. * Recursively create the directory if it does not exist.
*/ */
private void makeDirectories(final String uploadDocumentLocation) { private void makeDirectories(final String uploadDocumentLocation) throws IOException {
if (!new File(uploadDocumentLocation).isDirectory()) { Files.createParentDirs(new File(uploadDocumentLocation));
new File(uploadDocumentLocation).mkdirs();
}
} }
private void writeFileToFileSystem(final String fileName, final InputStream uploadedInputStream, final String fileLocation) { private void writeFileToFileSystem(final String fileName, final InputStream uploadedInputStream, final String fileLocation) {
try { try {
final OutputStream out = new FileOutputStream(new File(fileLocation)); makeDirectories(fileLocation);
int read = 0; FileUtils.copyInputStreamToFile(uploadedInputStream, new File(fileLocation));
final byte[] bytes = new byte[1024];
while ((read = uploadedInputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
} catch (final IOException ioException) { } catch (final IOException ioException) {
LOG.warn("writeFileToFileSystem() IOException (logged because cause is not propagated in ContentManagementException)", LOG.warn("writeFileToFileSystem() IOException (logged because cause is not propagated in ContentManagementException)",
ioException); ioException);