RED-6864 - Close inputStreams after download file from storage
This commit is contained in:
parent
cd49c4aabb
commit
d4e1677eab
@ -7,6 +7,8 @@ import static com.iqser.red.service.persistence.management.v1.processor.roles.Ac
|
||||
import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException;
|
||||
import static com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils.getStorageId;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
@ -50,8 +52,10 @@ public class HighlightsController implements HighlightsResource {
|
||||
fileStatusService.getStatus(fileId);
|
||||
|
||||
if (storageService.objectExists(TenantContext.getTenantId(), getStorageId(dossierId, fileId, FileType.TEXT_HIGHLIGHTS))) {
|
||||
return objectMapper.readValue(fileManagementStorageService.getObject(TenantContext.getTenantId(), getStorageId(dossierId, fileId, FileType.TEXT_HIGHLIGHTS)),
|
||||
Highlights.class);
|
||||
InputStream stream = fileManagementStorageService.getObject(TenantContext.getTenantId(), getStorageId(dossierId, fileId, FileType.TEXT_HIGHLIGHTS));
|
||||
Highlights highlights = objectMapper.readValue(stream, Highlights.class);
|
||||
stream.close();
|
||||
return highlights;
|
||||
}
|
||||
|
||||
return new Highlights();
|
||||
|
||||
@ -29,7 +29,6 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid;
|
||||
import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist;
|
||||
import com.iqser.red.storage.commons.service.StorageService;
|
||||
import com.knecon.fforesight.tenantcommons.TenantContext;
|
||||
|
||||
import feign.FeignException;
|
||||
@ -202,7 +201,9 @@ public class RedactionLogController implements RedactionLogResource {
|
||||
String objectId = dossierId + "/" + fileId + "." + fileType.name() + fileType.getExtension();
|
||||
|
||||
try (var inputStream = fileManagementStorageService.getObject(TenantContext.getTenantId(), objectId)) {
|
||||
return zipBytes(filename, inputStream.readAllBytes());
|
||||
byte[] input = inputStream.readAllBytes();
|
||||
inputStream.close();
|
||||
return zipBytes(filename, input);
|
||||
}
|
||||
|
||||
} catch (StorageObjectDoesNotExist e) {
|
||||
|
||||
@ -135,18 +135,20 @@ public class ReportTemplateController implements ReportTemplateResource {
|
||||
|
||||
try {
|
||||
var reportTemplate = reportTemplatePersistenceService.find(templateId);
|
||||
byte[] file = IOUtils.toByteArray(fileManagementStorageService.getObject(TenantContext.getTenantId(), reportTemplate.getStorageId()));
|
||||
return getResponseEntity(file, reportTemplate.getFileName(), MediaType.APPLICATION_OCTET_STREAM);
|
||||
InputStream inputStream = fileManagementStorageService.getObject(TenantContext.getTenantId(), reportTemplate.getStorageId());
|
||||
byte[] file = IOUtils.toByteArray(inputStream);
|
||||
inputStream.close();
|
||||
return getResponseEntity(file, reportTemplate.getFileName());
|
||||
} catch (StorageObjectDoesNotExist | IOException e) {
|
||||
throw new NotFoundException("Template does not exist");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private ResponseEntity<?> getResponseEntity(byte[] file, String filename, MediaType mediaType) {
|
||||
private ResponseEntity<?> getResponseEntity(byte[] file, String filename) {
|
||||
|
||||
HttpHeaders httpHeaders = new HttpHeaders();
|
||||
httpHeaders.setContentType(mediaType);
|
||||
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
|
||||
|
||||
if (filename != null) {
|
||||
httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8''" + StringEncodingUtils.urlEncode(filename));
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
package com.iqser.red.service.persistence.management.v1.processor.migration.migrations;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.io.InputStreamResource;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.iqser.red.service.persistence.management.v1.processor.migration.Migration;
|
||||
@ -95,10 +94,11 @@ public class ReduceTextFileSizeMigration10 extends Migration {
|
||||
try {
|
||||
|
||||
if (!storageService.objectExists(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT) + ".bak")) {
|
||||
FileInputStream textInputStreamResource = fileManagementStorageService.getObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT));
|
||||
InputStream textInputStreamResource = fileManagementStorageService.getObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT));
|
||||
storageService.storeObject(TenantContext.getTenantId(),
|
||||
StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT) + ".bak",
|
||||
textInputStreamResource);
|
||||
textInputStreamResource.close();
|
||||
var text = storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT), Text.class);
|
||||
storageService.storeJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT), text);
|
||||
}
|
||||
|
||||
@ -39,6 +39,7 @@ import com.iqser.red.storage.commons.service.StorageService;
|
||||
import com.knecon.fforesight.tenantcommons.TenantContext;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
@ -217,7 +218,7 @@ public class DossierTemplateCloneService {
|
||||
fileAttributeConfigPersistenceService.setFileAttributesConfig(clonedDossierTemplateId, facList);
|
||||
}
|
||||
|
||||
|
||||
@SneakyThrows
|
||||
private void cloneReportTemplates(DossierTemplateEntity dossierTemplate, String clonedDossierTemplateId) {
|
||||
|
||||
var reportTemplates = reportTemplatePersistenceService.findByDossierTemplateId(dossierTemplate.getId());
|
||||
@ -227,6 +228,7 @@ public class DossierTemplateCloneService {
|
||||
String storageId = clonedDossierTemplateId + "/" + rte.getFileName();
|
||||
String templateId = UUID.randomUUID().toString();
|
||||
storageService.storeObject(TenantContext.getTenantId(), storageId, storedReportTemplate);
|
||||
storedReportTemplate.close();
|
||||
reportTemplatePersistenceService.insert(clonedDossierTemplateId, templateId, storageId, rte.getFileName(), rte.isActiveByDefault(), rte.isMultiFileReport());
|
||||
} else {
|
||||
log.debug("Deleted Report-template {} will not be cloned", rte.getTemplateId());
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
package com.iqser.red.service.persistence.management.v1.processor.service;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -32,22 +34,28 @@ public class FileManagementStorageService {
|
||||
@SneakyThrows
|
||||
public byte[] getStoredObjectBytes(String dossierId, String fileId, FileType fileType) {
|
||||
|
||||
return IOUtils.toByteArray(getObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, fileType)));
|
||||
InputStream inputStream = getObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, fileType));
|
||||
byte[] storedObjectBytes = IOUtils.toByteArray(inputStream);
|
||||
inputStream.close();
|
||||
return storedObjectBytes;
|
||||
}
|
||||
|
||||
|
||||
@SneakyThrows
|
||||
public byte[] getStoredObjectBytes(String storageId) {
|
||||
|
||||
return IOUtils.toByteArray(getObject(TenantContext.getTenantId(), storageId));
|
||||
InputStream inputStream = getObject(TenantContext.getTenantId(), storageId);
|
||||
byte[] storedObjectBytes = IOUtils.toByteArray(inputStream);
|
||||
inputStream.close();
|
||||
return storedObjectBytes;
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public FileInputStream getObject(String tenantId, String storageId) {
|
||||
File destFile = File.createTempFile("destFile", ".data");
|
||||
destFile.deleteOnExit();
|
||||
storageService.downloadTo(tenantId, storageId, destFile);
|
||||
return new FileInputStream(destFile);
|
||||
public InputStream getObject(String tenantId, String storageId) {
|
||||
|
||||
File tempFile = File.createTempFile("temp", ".data");
|
||||
storageService.downloadTo(tenantId, storageId, tempFile);
|
||||
return Files.newInputStream(Paths.get(tempFile.getPath()), StandardOpenOption.DELETE_ON_CLOSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -8,12 +8,9 @@ import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import jakarta.transaction.Transactional;
|
||||
|
||||
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionMessage;
|
||||
@ -28,7 +25,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.ColorsS
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings;
|
||||
@ -40,9 +36,9 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue;
|
||||
import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage;
|
||||
import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation;
|
||||
import com.iqser.red.storage.commons.service.StorageService;
|
||||
import com.knecon.fforesight.tenantcommons.TenantContext;
|
||||
|
||||
import jakarta.transaction.Transactional;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
@ -56,13 +52,11 @@ import lombok.extern.slf4j.Slf4j;
|
||||
public class DownloadPreparationService {
|
||||
|
||||
DownloadStatusPersistenceService downloadStatusPersistenceService;
|
||||
FileStatusPersistenceService fileStatusPersistenceService;
|
||||
FileManagementStorageService fileManagementStorageService;
|
||||
ReportTemplatePersistenceService reportTemplatePersistenceService;
|
||||
NotificationPersistenceService notificationPersistenceService;
|
||||
RabbitTemplate rabbitTemplate;
|
||||
ObjectMapper objectMapper;
|
||||
StorageService storageService;
|
||||
DownloadReportCleanupService downloadReportCleanupService;
|
||||
ColorsService colorsService;
|
||||
FileManagementServiceSettings settings;
|
||||
@ -70,7 +64,7 @@ public class DownloadPreparationService {
|
||||
|
||||
|
||||
@Transactional
|
||||
public void createDownload(ReportResultMessage reportResultMessage) throws JsonProcessingException {
|
||||
public void createDownload(ReportResultMessage reportResultMessage) {
|
||||
|
||||
var downloadStatus = downloadStatusPersistenceService.getStatus(reportResultMessage.getDownloadId());
|
||||
var dossier = downloadStatus.getDossier();
|
||||
@ -113,18 +107,12 @@ public class DownloadPreparationService {
|
||||
var result = new LinkedList<RedactionType>();
|
||||
for (var downloadFileType : downloadFileTypes) {
|
||||
switch (downloadFileType) {
|
||||
case REDACTED:
|
||||
result.add(RedactionType.REDACTED);
|
||||
break;
|
||||
case PREVIEW:
|
||||
result.add(RedactionType.PREVIEW);
|
||||
break;
|
||||
case DELTA_PREVIEW:
|
||||
result.add(RedactionType.DELTA);
|
||||
break;
|
||||
default:
|
||||
// Other types don't need to be passed to pdf-tron
|
||||
break;
|
||||
case REDACTED -> result.add(RedactionType.REDACTED);
|
||||
case PREVIEW -> result.add(RedactionType.PREVIEW);
|
||||
case DELTA_PREVIEW -> result.add(RedactionType.DELTA);
|
||||
default -> {
|
||||
}
|
||||
// Other types don't need to be passed to pdf-tron
|
||||
}
|
||||
}
|
||||
|
||||
@ -217,7 +205,9 @@ public class DownloadPreparationService {
|
||||
var redactionResultDetail = redactionResultDetails.stream().filter(rrd -> Objects.equals(fileId, rrd.getFileId()) && rrd.getRedactionType() == redactionType).findFirst();
|
||||
if (redactionResultDetail.isPresent()) {
|
||||
try (var inputStream = fileManagementStorageService.getObject(TenantContext.getTenantId(), redactionResultDetail.get().getStorageId())) {
|
||||
return inputStream.readAllBytes();
|
||||
byte[] storedFileBytes = inputStream.readAllBytes();
|
||||
inputStream.close();
|
||||
return storedFileBytes;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
@ -19,6 +19,7 @@ public final class DownloadBufferUtils {
|
||||
|
||||
var tempFile = FileUtils.createTempFile("download", "pdf");
|
||||
org.apache.commons.io.FileUtils.copyInputStreamToFile(inputStream, tempFile);
|
||||
inputStream.close();
|
||||
|
||||
if (RequestContextHolder.getRequestAttributes() != null) {
|
||||
RequestContextHolder.getRequestAttributes().setAttribute(DOWNLOAD_TEMP_FILE_BUFFER_LOCATION, tempFile.getAbsolutePath(), 0);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user