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;
import com.google.common.io.Files;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.fineract.infrastructure.core.domain.Base64EncodedImage;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import org.apache.fineract.infrastructure.documentmanagement.command.DocumentCommand;
@@ -44,13 +45,10 @@ public class FileSystemContentRepository implements ContentRepository {
@Override
public String saveFile(final InputStream uploadedInputStream, final DocumentCommand documentCommand) {
final String fileName = documentCommand.getFileName();
final String uploadDocumentLocation = generateFileParentDirectory(documentCommand.getParentEntityType(),
documentCommand.getParentEntityId());
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);
return fileLocation;
@@ -58,38 +56,25 @@ public class FileSystemContentRepository implements ContentRepository {
@Override
public String saveImage(final InputStream uploadedInputStream, final Long resourceId, final String imageName, final Long fileSize) {
final String uploadImageLocation = generateClientImageParentDirectory(resourceId);
ContentRepositoryUtils.validateFileSizeWithinPermissibleRange(fileSize, imageName);
makeDirectories(uploadImageLocation);
final String fileLocation = uploadImageLocation + File.separator + imageName;
final String fileLocation = generateClientImageParentDirectory(resourceId) + File.separator + imageName;
writeFileToFileSystem(imageName, uploadedInputStream, fileLocation);
return fileLocation;
}
@Override
public String saveImage(final Base64EncodedImage base64EncodedImage, final Long resourceId, final String imageName) {
final String uploadImageLocation = generateClientImageParentDirectory(resourceId);
makeDirectories(uploadImageLocation);
final String fileLocation = uploadImageLocation + File.separator + imageName + base64EncodedImage.getFileExtension();
final String base64EncodedImageString = base64EncodedImage.getBase64EncodedString();
final String fileLocation = generateClientImageParentDirectory(resourceId) + File.separator + imageName
+ base64EncodedImage.getFileExtension();
String base64EncodedImageString = base64EncodedImage.getBase64EncodedString();
try {
final OutputStream out = new FileOutputStream(new File(fileLocation));
final byte[] imgBytes = Base64.getMimeDecoder().decode(base64EncodedImageString);
out.write(imgBytes);
out.flush();
out.close();
} catch (final IOException ioe) {
throw new ContentManagementException(imageName, ioe.getMessage(), ioe);
final InputStream toUploadInputStream = new ByteArrayInputStream(Base64.getMimeDecoder().decode(base64EncodedImageString));
writeFileToFileSystem(imageName, toUploadInputStream, fileLocation);
return fileLocation;
} catch (IllegalArgumentException iae) {
LOG.error("IllegalArgumentException due to invalid Base64 encoding: {}", base64EncodedImageString, iae);
throw iae;
}
return fileLocation;
}
@Override
@@ -114,11 +99,6 @@ public class FileSystemContentRepository implements ContentRepository {
return fileToBeDeleted.delete();
}
@Override
public StorageType getStorageType() {
return StorageType.FILE_SYSTEM;
}
@Override
public FileData fetchFile(final DocumentData documentData) {
final File file = new File(documentData.fileLocation());
@@ -132,6 +112,11 @@ public class FileSystemContentRepository implements ContentRepository {
return imageData;
}
@Override
public StorageType getStorageType() {
return StorageType.FILE_SYSTEM;
}
/**
* 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.
*/
private void makeDirectories(final String uploadDocumentLocation) {
if (!new File(uploadDocumentLocation).isDirectory()) {
new File(uploadDocumentLocation).mkdirs();
}
private void makeDirectories(final String uploadDocumentLocation) throws IOException {
Files.createParentDirs(new File(uploadDocumentLocation));
}
private void writeFileToFileSystem(final String fileName, final InputStream uploadedInputStream, final String fileLocation) {
try {
final OutputStream out = new FileOutputStream(new File(fileLocation));
int read = 0;
final byte[] bytes = new byte[1024];
while ((read = uploadedInputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
makeDirectories(fileLocation);
FileUtils.copyInputStreamToFile(uploadedInputStream, new File(fileLocation));
} catch (final IOException ioException) {
LOG.warn("writeFileToFileSystem() IOException (logged because cause is not propagated in ContentManagementException)",
ioException);