RED-5479: Split method into smaller parts for readability
This commit is contained in:
parent
b74f661512
commit
9068da1b56
@ -5,6 +5,7 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@ -36,8 +37,10 @@ import com.iqser.red.service.redaction.v1.model.RedactionLog;
|
||||
import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist;
|
||||
|
||||
import io.micrometer.core.annotation.Timed;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.experimental.FieldDefaults;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@SuppressWarnings("ALL")
|
||||
@ -68,9 +71,66 @@ public class ReportGenerationService {
|
||||
|
||||
Dossier dossier = dossierClient.getDossierById(reportMessage.getDossierId(), true, false);
|
||||
|
||||
List<ReportTemplate> singleFilesTemplates = new ArrayList<>();
|
||||
List<MultiFileWorkbook> multiFileWorkbookReportTemplates = new ArrayList<>();
|
||||
List<MultiFileDocument> multiFileDocumentReportTemplates = new ArrayList<>();
|
||||
ReportTemplates reportTemplates = prepareReportTemplates(reportMessage);
|
||||
|
||||
var placeholderModel = generatePlaceholderService.buildPlaceholders(dossier);
|
||||
|
||||
String downloadId = reportMessage.getDownloadId();
|
||||
|
||||
for (int fileIdIndex = 0; fileIdIndex < reportMessage.getFileIds().size(); fileIdIndex++) {
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
var isLastFile = fileIdIndex == reportMessage.getFileIds().size() - 1;
|
||||
|
||||
String dossierId = dossier.getId();
|
||||
String fileId = reportMessage.getFileIds().get(fileIdIndex);
|
||||
String dossierName = dossier.getDossierName();
|
||||
|
||||
var fileStatus = fileStatusClient.getFileStatus(dossierId, fileId);
|
||||
generatePlaceholderService.resolveFileAttributeValues(fileStatus, placeholderModel);
|
||||
|
||||
List<ReportRedactionEntry> reportEntries = getReportEntries(dossierId, fileId, fileStatus.isExcluded());
|
||||
|
||||
generateMultiFileExcelReports(reportTemplates.multiFileWorkbookReportTemplates, placeholderModel, fileStatus, isLastFile, dossierName, reportEntries);
|
||||
|
||||
generateMultiFileWordReports(reportTemplates.multiFileDocumentReportTemplates,
|
||||
storedFileInformation,
|
||||
dossier,
|
||||
placeholderModel,
|
||||
isLastFile,
|
||||
downloadId,
|
||||
fileStatus,
|
||||
reportEntries);
|
||||
|
||||
generateSingleFileReports(reportTemplates.singleFilesTemplates, storedFileInformation, dossier, placeholderModel, downloadId, fileStatus, reportEntries);
|
||||
|
||||
long end = System.currentTimeMillis();
|
||||
log.info("Successfully processed {}/{} fileIds for downloadId {}, took {}", fileIdIndex + 1, reportMessage.getFileIds().size(), downloadId, end - start);
|
||||
}
|
||||
|
||||
for (MultiFileWorkbook multiFileWorkbook : reportTemplates.multiFileWorkbookReportTemplates) {
|
||||
byte[] template = excelTemplateReportGenerationService.toByteArray(multiFileWorkbook.getWriteWorkbook());
|
||||
String storageId = reportStorageService.storeObject(downloadId, template);
|
||||
storedFileInformation.add(new StoredFileInformation(null, storageId, ReportType.EXCEL_TEMPLATE_MULTI_FILE, multiFileWorkbook.getTemplateId(), 0));
|
||||
}
|
||||
|
||||
for (MultiFileDocument multiFileDocument : reportTemplates.multiFileDocumentReportTemplates) {
|
||||
byte[] template = wordReportGenerationService.toByteArray(multiFileDocument.getDocument());
|
||||
String storageId = reportStorageService.storeObject(downloadId, template);
|
||||
storedFileInformation.add(new StoredFileInformation(null,
|
||||
storageId,
|
||||
ReportType.WORD_TEMPLATE_MULTI_FILE,
|
||||
multiFileDocument.getTemplateId(),
|
||||
multiFileDocument.getDocumentPartNr()));
|
||||
}
|
||||
|
||||
return reportStorageService.storeReportInformation(reportMessage.getDownloadId(), storedFileInformation);
|
||||
}
|
||||
|
||||
|
||||
private ReportTemplates prepareReportTemplates(ReportRequestMessage reportMessage) {
|
||||
|
||||
var reportTemplates = new ReportTemplates();
|
||||
for (String templateId : reportMessage.getTemplateIds()) {
|
||||
try {
|
||||
ReportTemplate reportTemplate = reportTemplateClient.getReportTemplate(reportMessage.getDossierTemplateId(), templateId);
|
||||
@ -88,7 +148,7 @@ public class ReportGenerationService {
|
||||
templateId,
|
||||
reportTemplate.getFileName(),
|
||||
excelTemplateReportGenerationService.calculateExcelModel(readWorkbook.getSheetAt(0)));
|
||||
multiFileWorkbookReportTemplates.add(multiFileWorkbook);
|
||||
reportTemplates.multiFileWorkbookReportTemplates.add(multiFileWorkbook);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Could not generate multifile excel report.");
|
||||
}
|
||||
@ -97,111 +157,96 @@ public class ReportGenerationService {
|
||||
try (ByteArrayInputStream is = new ByteArrayInputStream(wordTemplate)) {
|
||||
XWPFDocument doc = new XWPFDocument(is);
|
||||
MultiFileDocument multiFileDocument = new MultiFileDocument(wordTemplate, doc, templateId, reportTemplate.getFileName(), 0, 0);
|
||||
multiFileDocumentReportTemplates.add(multiFileDocument);
|
||||
reportTemplates.multiFileDocumentReportTemplates.add(multiFileDocument);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Could not generate multifile word report.");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
singleFilesTemplates.add(reportTemplate);
|
||||
reportTemplates.singleFilesTemplates.add(reportTemplate);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("Skipping reportTemplate with id {}", templateId);
|
||||
}
|
||||
}
|
||||
return reportTemplates;
|
||||
}
|
||||
|
||||
var placeholderModel = generatePlaceholderService.buildPlaceholders(dossier);
|
||||
|
||||
int i = 1;
|
||||
for (int j = 0; j < reportMessage.getFileIds().size(); j++) {
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
|
||||
var fileStatus = fileStatusClient.getFileStatus(reportMessage.getDossierId(), reportMessage.getFileIds().get(j));
|
||||
|
||||
generatePlaceholderService.resolveFileAttributeValues(fileStatus, placeholderModel);
|
||||
|
||||
List<ReportRedactionEntry> reportEntries = getReportEntries(reportMessage.getDossierId(), reportMessage.getFileIds().get(j), fileStatus.isExcluded());
|
||||
|
||||
var isLastFile = j == reportMessage.getFileIds().size() - 1;
|
||||
|
||||
for (MultiFileWorkbook multiFileWorkbook : multiFileWorkbookReportTemplates) {
|
||||
if (multiFileWorkbook.getExcelModel().isHasRssPlaceHolders()) {
|
||||
generatePlaceholderService.resolveRssValues(fileStatus, placeholderModel);
|
||||
}
|
||||
excelTemplateReportGenerationService.generateExcelReport(reportEntries,
|
||||
placeholderModel,
|
||||
multiFileWorkbook.getTemplateName(),
|
||||
multiFileWorkbook.getWriteWorkbook(),
|
||||
dossier.getDossierName(),
|
||||
fileStatus,
|
||||
multiFileWorkbook.getExcelModel(),
|
||||
isLastFile);
|
||||
}
|
||||
|
||||
for (MultiFileDocument multiFileDocument : multiFileDocumentReportTemplates) {
|
||||
var numberOfChars = wordReportGenerationService.approxNumberOfChars(reportEntries.stream().findFirst(), fileStatus.getFilename());
|
||||
|
||||
if (multiFileDocument.getNumberOfChars() >= reportTemplateSettings.getMultiFileChunkSize()) {
|
||||
wordReportGenerationService.removePlaceholdersRow(wordReportGenerationService.getRedactionTable(multiFileDocument.getDocument()));
|
||||
byte[] wordDoc = wordReportGenerationService.toByteArray(multiFileDocument.getDocument());
|
||||
String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), wordDoc);
|
||||
storedFileInformation.add(new StoredFileInformation(null,
|
||||
storageId,
|
||||
ReportType.WORD_TEMPLATE_MULTI_FILE,
|
||||
multiFileDocument.getTemplateId(),
|
||||
multiFileDocument.getDocumentPartNr()));
|
||||
multiFileDocument.setDocumentPartNr(multiFileDocument.getDocumentPartNr() + 1);
|
||||
|
||||
try (ByteArrayInputStream is = new ByteArrayInputStream(multiFileDocument.getTemplateAsBytes())) {
|
||||
XWPFDocument doc = new XWPFDocument(is);
|
||||
multiFileDocument.setDocument(doc);
|
||||
multiFileDocument.setNumberOfChars(0);
|
||||
}
|
||||
}
|
||||
numberOfChars = wordReportGenerationService.generateWordReport(reportEntries,
|
||||
placeholderModel,
|
||||
multiFileDocument.getTemplateName(),
|
||||
multiFileDocument.getDocument(),
|
||||
fileStatus,
|
||||
dossier,
|
||||
isLastFile ? isLastFile : multiFileDocument.getNumberOfChars() + numberOfChars >= reportTemplateSettings.getMultiFileChunkSize());
|
||||
multiFileDocument.setNumberOfChars(multiFileDocument.getNumberOfChars() + numberOfChars);
|
||||
}
|
||||
|
||||
for (ReportTemplate reportTemplate : singleFilesTemplates) {
|
||||
|
||||
storedFileInformation.add(createReportFromTemplate(dossier,
|
||||
fileStatus,
|
||||
placeholderModel,
|
||||
reportTemplate.getFileName(),
|
||||
reportMessage.getDownloadId(),
|
||||
reportEntries,
|
||||
reportTemplate));
|
||||
}
|
||||
|
||||
long end = System.currentTimeMillis();
|
||||
log.info("Successfully processed {}/{} fileIds for downloadId {}, took {}", i, reportMessage.getFileIds().size(), reportMessage.getDownloadId(), end - start);
|
||||
i++;
|
||||
}
|
||||
private void generateMultiFileExcelReports(List<MultiFileWorkbook> multiFileWorkbookReportTemplates,
|
||||
PlaceholderModel placeholderModel,
|
||||
FileModel fileStatus,
|
||||
boolean isLastFile,
|
||||
String dossierName,
|
||||
List<ReportRedactionEntry> reportEntries) {
|
||||
|
||||
for (MultiFileWorkbook multiFileWorkbook : multiFileWorkbookReportTemplates) {
|
||||
byte[] template = excelTemplateReportGenerationService.toByteArray(multiFileWorkbook.getWriteWorkbook());
|
||||
String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), template);
|
||||
storedFileInformation.add(new StoredFileInformation(null, storageId, ReportType.EXCEL_TEMPLATE_MULTI_FILE, multiFileWorkbook.getTemplateId(), 0));
|
||||
if (multiFileWorkbook.getExcelModel().isHasRssPlaceHolders()) {
|
||||
generatePlaceholderService.resolveRssValues(fileStatus, placeholderModel);
|
||||
}
|
||||
excelTemplateReportGenerationService.generateExcelReport(reportEntries,
|
||||
placeholderModel,
|
||||
multiFileWorkbook.getTemplateName(),
|
||||
multiFileWorkbook.getWriteWorkbook(),
|
||||
dossierName,
|
||||
fileStatus,
|
||||
multiFileWorkbook.getExcelModel(),
|
||||
isLastFile);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void generateMultiFileWordReports(List<MultiFileDocument> multiFileDocumentReportTemplates,
|
||||
List<StoredFileInformation> storedFileInformation,
|
||||
Dossier dossier,
|
||||
PlaceholderModel placeholderModel,
|
||||
boolean isLastFile,
|
||||
String downloadId,
|
||||
FileModel fileStatus,
|
||||
List<ReportRedactionEntry> reportEntries) throws IOException {
|
||||
|
||||
for (MultiFileDocument multiFileDocument : multiFileDocumentReportTemplates) {
|
||||
byte[] template = wordReportGenerationService.toByteArray(multiFileDocument.getDocument());
|
||||
String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), template);
|
||||
storedFileInformation.add(new StoredFileInformation(null,
|
||||
storageId,
|
||||
ReportType.WORD_TEMPLATE_MULTI_FILE,
|
||||
multiFileDocument.getTemplateId(),
|
||||
multiFileDocument.getDocumentPartNr()));
|
||||
}
|
||||
var numberOfChars = wordReportGenerationService.approxNumberOfChars(reportEntries.stream().findFirst(), fileStatus.getFilename());
|
||||
|
||||
return reportStorageService.storeReportInformation(reportMessage.getDownloadId(), storedFileInformation);
|
||||
if (multiFileDocument.getNumberOfChars() >= reportTemplateSettings.getMultiFileChunkSize()) {
|
||||
wordReportGenerationService.removePlaceholdersRow(wordReportGenerationService.getRedactionTable(multiFileDocument.getDocument()));
|
||||
byte[] wordDoc = wordReportGenerationService.toByteArray(multiFileDocument.getDocument());
|
||||
String storageId = reportStorageService.storeObject(downloadId, wordDoc);
|
||||
storedFileInformation.add(new StoredFileInformation(null,
|
||||
storageId,
|
||||
ReportType.WORD_TEMPLATE_MULTI_FILE,
|
||||
multiFileDocument.getTemplateId(),
|
||||
multiFileDocument.getDocumentPartNr()));
|
||||
multiFileDocument.setDocumentPartNr(multiFileDocument.getDocumentPartNr() + 1);
|
||||
|
||||
try (ByteArrayInputStream is = new ByteArrayInputStream(multiFileDocument.getTemplateAsBytes())) {
|
||||
XWPFDocument doc = new XWPFDocument(is);
|
||||
multiFileDocument.setDocument(doc);
|
||||
multiFileDocument.setNumberOfChars(0);
|
||||
}
|
||||
}
|
||||
numberOfChars = wordReportGenerationService.generateWordReport(reportEntries,
|
||||
placeholderModel,
|
||||
multiFileDocument.getTemplateName(),
|
||||
multiFileDocument.getDocument(),
|
||||
fileStatus,
|
||||
dossier,
|
||||
isLastFile ? isLastFile : multiFileDocument.getNumberOfChars() + numberOfChars >= reportTemplateSettings.getMultiFileChunkSize());
|
||||
multiFileDocument.setNumberOfChars(multiFileDocument.getNumberOfChars() + numberOfChars);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void generateSingleFileReports(List<ReportTemplate> singleFilesTemplates, List<StoredFileInformation> storedFileInformation,
|
||||
Dossier dossier, PlaceholderModel placeholderModel,
|
||||
String downloadId,
|
||||
FileModel fileStatus,
|
||||
List<ReportRedactionEntry> reportEntries) {
|
||||
|
||||
for (ReportTemplate reportTemplate : singleFilesTemplates) {
|
||||
|
||||
storedFileInformation.add(createReportFromTemplate(dossier, fileStatus, placeholderModel, reportTemplate.getFileName(), downloadId, reportEntries, reportTemplate));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -292,4 +337,14 @@ public class ReportGenerationService {
|
||||
return mapOfEntityDisplayName;
|
||||
}
|
||||
|
||||
|
||||
@FieldDefaults(makeFinal = true, level = AccessLevel.PUBLIC)
|
||||
private static final class ReportTemplates {
|
||||
|
||||
List<ReportTemplate> singleFilesTemplates = new LinkedList<>();
|
||||
List<MultiFileWorkbook> multiFileWorkbookReportTemplates = new LinkedList<>();
|
||||
List<MultiFileDocument> multiFileDocumentReportTemplates = new LinkedList<>();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user