RED-5479: Split method into smaller parts for readability

This commit is contained in:
Viktor Seifert 2022-11-29 16:17:55 +01:00
parent b74f661512
commit 9068da1b56

View File

@ -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<>();
}
}