RED-10683: fix NPE for firstRow

This commit is contained in:
Kilian Schuettler 2024-12-16 12:32:45 +01:00
parent 583ced03f5
commit a652de293b
2 changed files with 76 additions and 81 deletions

View File

@ -34,7 +34,6 @@ import static com.iqser.red.service.redaction.report.v1.server.service.Placehold
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.HashMap;
@ -127,69 +126,63 @@ public class ExcelReportGenerationService {
.filter(entry -> !entry.isSkipped())
.collect(Collectors.toList()) : allReportEntries;
try {
for (Sheet sheet : workbook) {
for (Sheet sheet : workbook) {
if (!excelModel.isRowsBeforeRedactionEntryRowsAdded()) {
if (!excelModel.isRowsBeforeRedactionEntryRowsAdded()) {
for (Map.Entry<Integer, Integer> columnWidthEntry : excelModel.getCellWidths().entrySet()) {
sheet.setColumnWidth(columnWidthEntry.getKey(), columnWidthEntry.getValue());
}
addRows(workbook,
sheet,
excelModel.getCellsToCopyBeforeRedactionPlaceholderRow(),
excelModel.isRssPlaceholdersPresent() ? excelModel.getWrittenRows().size() : 0,
placeholderModel,
dossierName,
fileModel.getFilename(),
excelModel);
if (!excelModel.isRssPlaceholdersPresent()) {
excelModel.setRowsBeforeRedactionEntryRowsAdded(true);
}
for (Map.Entry<Integer, Integer> columnWidthEntry : excelModel.getCellWidths().entrySet()) {
sheet.setColumnWidth(columnWidthEntry.getKey(), columnWidthEntry.getValue());
}
if (!excelModel.isRssPlaceholdersPresent() && !excelModel.isFileAttributesPlaceholderPresent() && !excelModel.isScmFunctionPlaceholderPresent()) {
addRedactionEntryRows(sheet, reportEntries, fileModel.getFilename(), excelModel, placeholderModel);
}
addRows(workbook,
sheet,
excelModel.getCellsToCopyBeforeRedactionPlaceholderRow(),
excelModel.isRssPlaceholdersPresent() ? excelModel.getWrittenRows().size() : 0,
placeholderModel,
dossierName,
fileModel.getFilename(),
excelModel);
if (excelModel.isFileAttributesPlaceholderPresent()) {
componentReportService.addScmRows(sheet, fileModel, excelModel);
}
if (excelModel.isScmFunctionPlaceholderPresent()) {
componentRowsReportService.addComponentRows(sheet, fileModel, excelModel);
}
if (isLastFile) {
addRows(workbook,
sheet,
excelModel.getCellsToCopyAfterRedactionPlaceholderRow(),
excelModel.getWrittenRows().size(),
placeholderModel,
dossierName,
fileModel.getFilename(),
excelModel);
if (!excelModel.isRssPlaceholdersPresent()) {
excelModel.setRowsBeforeRedactionEntryRowsAdded(true);
}
}
log.info("Report Generation took: {} for file with id {}, pageCount: {}, entityLogEntryCount: {}, reportName: {}, className: {}",
System.currentTimeMillis() - start,
fileModel.getId(),
fileModel.getNumberOfPages(),
reportEntries.size(),
reportTemplateName,
getClass().getSimpleName());
if (!excelModel.isRssPlaceholdersPresent() && !excelModel.isFileAttributesPlaceholderPresent() && !excelModel.isScmFunctionPlaceholderPresent()) {
addRedactionEntryRows(sheet, reportEntries, fileModel.getFilename(), excelModel, placeholderModel);
}
} catch (Exception e) {
throw new RuntimeException(e);
if (excelModel.isFileAttributesPlaceholderPresent()) {
componentReportService.addScmRows(sheet, fileModel, excelModel);
}
if (excelModel.isScmFunctionPlaceholderPresent()) {
componentRowsReportService.addComponentRows(sheet, fileModel, excelModel);
}
if (isLastFile) {
addRows(workbook,
sheet,
excelModel.getCellsToCopyAfterRedactionPlaceholderRow(),
excelModel.getWrittenRows().size(),
placeholderModel,
dossierName,
fileModel.getFilename(),
excelModel);
}
}
log.info("Report Generation took: {} for file with id {}, pageCount: {}, entityLogEntryCount: {}, reportName: {}, className: {}",
System.currentTimeMillis() - start,
fileModel.getId(),
fileModel.getNumberOfPages(),
reportEntries.size(),
reportTemplateName,
getClass().getSimpleName());
}
@SneakyThrows
private void addRows(SXSSFWorkbook workbook,
Sheet sheet,
Map<CellIdentifier, Cell> copiedCells,
@ -268,7 +261,8 @@ public class ExcelReportGenerationService {
}
private void replacePlaceholdersForImagePlaceholder(SXSSFWorkbook workbook, Sheet sheet, Cell cell, PlaceholderModel placeholderModel) throws IOException {
@SneakyThrows
private void replacePlaceholdersForImagePlaceholder(SXSSFWorkbook workbook, Sheet sheet, Cell cell, PlaceholderModel placeholderModel) {
for (ImagePlaceholder imagePlaceholder : placeholderModel.getImagePlaceholders()) {
@ -335,18 +329,15 @@ public class ExcelReportGenerationService {
return filename;
}
if (placeholderModel.getFileAttributeValueByPlaceholder().containsKey(placeholder)) {
return placeholderModel.getFileAttributeValueByPlaceholder()
.get(placeholder);
return placeholderModel.getFileAttributeValueByPlaceholder().get(placeholder);
}
if (placeholderModel.getDossierAttributesValueByPlaceholder().containsKey(placeholder)) {
return placeholderModel.getDossierAttributesValueByPlaceholder()
.get(placeholder);
return placeholderModel.getDossierAttributesValueByPlaceholder().get(placeholder);
}
if (placeholderModel.getRssComponentPlaceholder() != null && placeholderModel.getRssComponentPlaceholder().containsKey(placeholder)) {
return placeholderModel.getRssComponentPlaceholder()
.get(placeholder);
return placeholderModel.getRssComponentPlaceholder().get(placeholder);
}
return null;
@ -516,12 +507,10 @@ public class ExcelReportGenerationService {
private Function<PlaceholderInput, String> getFunctionForPlaceHolder(String placeholder) {
if (placeholder.startsWith(FILE_ATTRIBUTE_PLACEHOLDER_BASE)) {
return placeholderInput -> placeholderInput.getPlaceholderModel().getFileAttributeValueByPlaceholder()
.get(placeholder);
return placeholderInput -> placeholderInput.getPlaceholderModel().getFileAttributeValueByPlaceholder().get(placeholder);
}
if (placeholder.startsWith(DOSSIER_ATTRIBUTE_PLACEHOLDER_BASE)) {
return placeholderInput -> placeholderInput.getPlaceholderModel().getDossierAttributesValueByPlaceholder()
.get(placeholder);
return placeholderInput -> placeholderInput.getPlaceholderModel().getDossierAttributesValueByPlaceholder().get(placeholder);
}
return switch (placeholder) {

View File

@ -30,7 +30,6 @@ import lombok.experimental.FieldDefaults;
@SuppressWarnings("checkstyle:all")
public class ScmReportService {
public static final int MAX_CELL_TEXT_LENGTH = 32767;
final ComponentClient componentResource;
final FileAttributesConfigClient fileAttributesClient;
final CellTextChunkingService cellTextChunkingService;
@ -39,19 +38,7 @@ public class ScmReportService {
public void addScmRows(Sheet sheet, FileModel fileModel, ExcelModel excelModel) {
var firstRow = sheet.getRow(0);
int firstRowIndex = 1;
while (firstRow == null) {
firstRow = sheet.getRow(firstRowIndex);
firstRowIndex++;
}
// Ensure we have the correct first row
Cell firstCell = firstRow.getCell(0);
if (!formatter.formatCellValue(firstCell).equals("File")) {
firstRow = sheet.getRow(0);
}
Row firstRow = findFirstRow(sheet);
int fileColumnIndex = 0;
int textColumnIndex = firstRow.getLastCellNum() - 1;
@ -66,8 +53,6 @@ public class ScmReportService {
Map<String, Integer> componentIndexMap = new HashMap<>();
Row finalFirstRow = firstRow;
componentLog.getComponentLogEntries()
.forEach(componentLogEntry -> {
@ -82,7 +67,7 @@ public class ScmReportService {
componentIndexMap,
componentLogEntry,
fileModel,
finalFirstRow,
firstRow,
fileColumnIndex,
componentColumnIndex,
valueIndexColumn,
@ -104,6 +89,28 @@ public class ScmReportService {
}
private Row findFirstRow(Sheet sheet) {
Row firstRow;
for (int firstRowIndex = 0; firstRowIndex < 100; firstRowIndex++) {
firstRow = sheet.getRow(firstRowIndex);
if (firstRow == null) {
continue;
}
var firstCell = firstRow.getCell(0);
if (firstCell == null) {
continue;
}
if (!formatter.formatCellValue(firstCell).equals("File")) {
continue;
}
return firstRow;
}
throw new AssertionError("No row with 'File' placeholder in first column found");
}
private void addOtherCells(Sheet sheet,
ExcelModel excelModel,
AtomicInteger rowIndex,
@ -162,8 +169,7 @@ public class ScmReportService {
for (FileAttributeModel fileAttributeModel : fileAttributeModels) {
Cell fileAttributeCell = row.createCell(fileAttributeModel.getCell().getColumnIndex());
String cellValue = fileModel.getFileAttributes()
.get(fileAttributeModel.getId());
String cellValue = fileModel.getFileAttributes().get(fileAttributeModel.getId());
fileAttributeCell.setCellValue(cellValue == null ? "" : cellValue);
CellUtil.setAlignment(fileAttributeCell, HorizontalAlignment.CENTER);
CellUtil.setVerticalAlignment(fileAttributeCell, VerticalAlignment.TOP);