diff --git a/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java b/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java index 0a2ad0d909e4cf108ff1a1d8de324e8d8fe5beaa..1e1125d1fc2af4f21f6afdfff1a5a22c25066442 100644 --- a/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java +++ b/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java @@ -28,22 +28,23 @@ public final class ExcelFileGenerator { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private static final ObjectMapper objectMapper = new ObjectMapper(); + // TODO Dette må fikses før deploy til prod + private static final String VIPSWEB = "https://testvips.nibio.no"; + private static final String VIPSLOGIC = "https://logic.testvips.nibio.no"; + private enum ColumnIndex { ID(false, 0, 0, "observationId"), DATE(false, 1, 1, "timeOfObservation"), - POI_ID(false, 2, 2, "locationPointOfInterestId"), - POI_NAME(false, 3, 3, "location"), - OBSERVER_ID(true, null, 4, "observerId"), - OBSERVER_NAME(true, null, 5, "observer"), - OBSERVATION_TIME_SERIES_ID(false, 4, 6, "observationTimeSeriesId"), - OBSERVATION_TIME_SERIES_LABEL(false, 5, 7, "observationTimeSeriesLabel"), - ORGANISM(false, 6, 8, "organism"), - CROP_ORGANISM(false, 7, 9, "cropOrganismId"), - HEADING(false, 8, 10, "observationHeading"), - DESCRIPTION(false, 9, 11, "observationText"), - BROADCAST(false, 10, 12, "isBroadcast"), - POSITIVE(false, 11, 13, "isPositiveRegistration"), - INDEX_DATA(false, 12, 14, null); + POI_NAME(false, 2, 2, "location"), + OBSERVER_NAME(true, null, 3, "observer"), + OBSERVATION_TIME_SERIES_LABEL(false, 3, 4, "observationTimeSeriesLabel"), + ORGANISM(false, 4, 5, "organism"), + CROP_ORGANISM(false, 5, 6, "cropOrganismId"), + HEADING(false, 6, 7, "observationHeading"), + DESCRIPTION(false, 7, 8, "observationText"), + BROADCAST(false, 8, 9, "isBroadcast"), + POSITIVE(false, 9, 10, "isPositiveRegistration"), + INDEX_DATA(false, 10, 11, null); private final boolean isSensitive; private final Integer openIndex; @@ -101,22 +102,7 @@ public final class ExcelFileGenerator { // Create meta sheet for information about the download Sheet metaSheet = workbook.createSheet(rb.getString("downloadInfo")); - Row userRow = metaSheet.createRow(0); - userRow.createCell(0).setCellValue(rb.getString("downloadedBy")); - userRow.createCell(1).setCellValue(user != null ? user.getFullName() : rb.getString("unregisteredUser")); - Row timeRow = metaSheet.createRow(1); - timeRow.createCell(0).setCellValue(rb.getString("downloadedTime")); - timeRow.createCell(1).setCellValue(DATE_TIME_FORMATTER.format(now)); - Row fromRow = metaSheet.createRow(2); - fromRow.createCell(0).setCellValue(rb.getString("dateStart")); - fromRow.createCell(1).setCellValue(fromStr); - Row toRow = metaSheet.createRow(3); - toRow.createCell(0).setCellValue(rb.getString("dateEnd")); - toRow.createCell(1).setCellValue(toStr); - Row countRow = metaSheet.createRow(4); - countRow.createCell(0).setCellValue(rb.getString("observationCount")); - countRow.createCell(1).setCellValue(observations.size()); - autoSizeColumns(metaSheet, 0, 1); + addMetaInfo(metaSheet, user, now, fromStr, toStr, observations, headerStyle, rb); // Prepare list of observations for each type of pest Map<Integer, List<ObservationListItem>> pestObservations = getObservationsForEachPest(observations); @@ -160,6 +146,47 @@ public final class ExcelFileGenerator { } } + /** + * Add meta information to given sheet + * + * @param metaSheet The sheet in which to add content + * @param user The current user + * @param now The current timestamp + * @param fromStr The start of the period for which we have observations + * @param toStr The end of the period for which we have observations + * @param observations The list of observations + * @param headerStyle How to style the title cells + * @param rb Resource bundle with translations + */ + private static void addMetaInfo(Sheet metaSheet, VipsLogicUser user, LocalDateTime now, String fromStr, String toStr, List<ObservationListItem> observations, CellStyle headerStyle, ResourceBundle rb) { + Row userRow = metaSheet.createRow(0); + Cell downloadedByCell = userRow.createCell(0); + downloadedByCell.setCellStyle(headerStyle); + downloadedByCell.setCellValue(rb.getString("downloadedBy")); + userRow.createCell(1).setCellValue(user != null ? user.getFullName() : rb.getString("unregisteredUser")); + Row timeRow = metaSheet.createRow(1); + Cell downloadedTimeCell = timeRow.createCell(0); + downloadedTimeCell.setCellStyle(headerStyle); + downloadedTimeCell.setCellValue(rb.getString("downloadedTime")); + timeRow.createCell(1).setCellValue(DATE_TIME_FORMATTER.format(now)); + Row fromRow = metaSheet.createRow(2); + Cell dateFromCell = fromRow.createCell(0); + dateFromCell.setCellStyle(headerStyle); + dateFromCell.setCellValue(rb.getString("dateStart")); + fromRow.createCell(1).setCellValue(fromStr); + Row toRow = metaSheet.createRow(3); + Cell dateToCell = toRow.createCell(0); + dateToCell.setCellStyle(headerStyle); + dateToCell.setCellValue(rb.getString("dateEnd")); + toRow.createCell(1).setCellValue(toStr); + Row countRow = metaSheet.createRow(4); + Cell countCell = countRow.createCell(0); + countCell.setCellStyle(headerStyle); + countCell.setCellValue(rb.getString("observationCount")); + countRow.createCell(1).setCellValue(observations.size()); + autoSizeColumns(metaSheet, 0, 1); + } + /** * Create sheet name without invalid characters and within size limits * @@ -260,21 +287,23 @@ public final class ExcelFileGenerator { private static Row createItemRow(boolean isAdmin, Sheet sheet, int rowIndex, ObservationListItem item, ResourceBundle rb) throws JsonProcessingException { LocalDate localDateOfObservation = item.getTimeOfObservation().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); Row row = sheet.createRow(rowIndex); - addObservationLinkToIdCol(isAdmin, row, item.getObservationId()); + addObservationLink(row, ColumnIndex.ID.getIndex(isAdmin), item.getObservationId()); addValueToCell(row, ColumnIndex.DATE.getIndex(isAdmin), localDateOfObservation.format(DATE_FORMATTER)); if (item.getLocationPointOfInterestId() != null) { - addValueToCell(row, ColumnIndex.POI_ID.getIndex(isAdmin), item.getLocationPointOfInterestId()); - addValueToCell(row, ColumnIndex.POI_NAME.getIndex(isAdmin), item.getLocationPointOfInterestName()); + Integer poiNameIndex = ColumnIndex.POI_NAME.getIndex(isAdmin); + if(isAdmin) { + addPoiLink(row, poiNameIndex, item.getLocationPointOfInterestId(), item.getLocationPointOfInterestName()); + } else { + addValueToCell(row, poiNameIndex, item.getLocationPointOfInterestName()); + } } if (isAdmin) { - addValueToCell(row, ColumnIndex.OBSERVER_ID.getIndex(isAdmin), item.getObserverId()); - addValueToCell(row, ColumnIndex.OBSERVER_NAME.getIndex(isAdmin), item.getObserverName()); + addUserLink(row, ColumnIndex.OBSERVER_NAME.getIndex(isAdmin), item.getObserverId(), item.getObserverName()); } if (item.getObservationTimeSeriesId() != null) { - addValueToCell(row, ColumnIndex.OBSERVATION_TIME_SERIES_ID.getIndex(isAdmin), item.getObservationTimeSeriesId()); - addValueToCell(row, ColumnIndex.OBSERVATION_TIME_SERIES_LABEL.getIndex(isAdmin), item.getObservationTimeSeriesLabel()); + addTimeSeriesLink(row, ColumnIndex.OBSERVATION_TIME_SERIES_LABEL.getIndex(isAdmin), item.getObservationTimeSeriesId(), item.getObservationTimeSeriesLabel()); } addValueToCell(row, ColumnIndex.ORGANISM.getIndex(isAdmin), item.getOrganismName()); addValueToCell(row, ColumnIndex.CROP_ORGANISM.getIndex(isAdmin), item.getCropOrganismName()); @@ -330,28 +359,84 @@ public final class ExcelFileGenerator { /** * Add link to observation details in column containing the observation Id * - * @param isAdmin Whether or not the user is admin * @param row A reference to the current row + * @param colIndex The index of the column in which the link should be added * @param observationId The id of the observation */ - private static void addObservationLinkToIdCol(boolean isAdmin, Row row, Integer observationId) { - Cell cell = row.createCell(ColumnIndex.ID.getIndex(isAdmin)); + private static void addObservationLink(Row row, Integer colIndex, Integer observationId) { + Cell cell = row.createCell(colIndex); cell.setCellValue(observationId); Workbook workbook = row.getSheet().getWorkbook(); + cell.setHyperlink(createHyperlink(workbook, VIPSWEB + "/observations/" + observationId)); + cell.setCellStyle(hyperlinkCellStyle(workbook)); + } + + /** + * Add link to timeseries details in column with given index + * + * @param row A reference to the current row + * @param colIndex The index of the column in which the link should be added + * @param timeSeriesId The id of the timeseries + * @param timeSeriesLabel The text which should be displayed in the cell + */ + private static void addTimeSeriesLink(Row row, Integer colIndex, Integer timeSeriesId, String timeSeriesLabel) { + Cell cell = row.createCell(colIndex); + cell.setCellValue(timeSeriesLabel); + + Workbook workbook = row.getSheet().getWorkbook(); + cell.setHyperlink(createHyperlink(workbook, VIPSWEB + "/observations/timeseries/" + timeSeriesId)); + cell.setCellStyle(hyperlinkCellStyle(workbook)); + } + + /** + * Add link to poi details in column with given index + * + * @param row A reference to the current row + * @param colIndex The index of the column in which the link should be added + * @param poiId The id of the poi + * @param poiName The text which should be displayed in the cell + */ + private static void addPoiLink(Row row, Integer colIndex, Integer poiId, String poiName) { + Cell cell = row.createCell(colIndex); + cell.setCellValue(poiName); + + Workbook workbook = row.getSheet().getWorkbook(); + cell.setHyperlink(createHyperlink(workbook, VIPSLOGIC + "/weatherStation?pointOfInterestId=" + poiId)); + cell.setCellStyle(hyperlinkCellStyle(workbook)); + } + + /** + * Add link to user details in column with given index + * + * @param row A reference to the current row + * @param colIndex The index of the column in which the link should be added + * @param userId The id of the user + * @param userName The text which should be displayed in the cell + */ + private static void addUserLink(Row row, Integer colIndex, Integer userId, String userName) { + Cell cell = row.createCell(colIndex); + cell.setCellValue(userName); + + Workbook workbook = row.getSheet().getWorkbook(); + cell.setHyperlink(createHyperlink(workbook, VIPSLOGIC + "/user?action=viewUser&userId=" + userId)); + cell.setCellStyle(hyperlinkCellStyle(workbook)); + } + + private static Hyperlink createHyperlink(Workbook workbook, String url) { CreationHelper creationHelper = workbook.getCreationHelper(); Hyperlink hyperlink = creationHelper.createHyperlink(HyperlinkType.URL); - //hyperlink.setAddress("https://www.vips-landbruk.no/observations/" + observationId); - // TODO Dette må fikses før deploy til prod - hyperlink.setAddress("https://testvips.nibio.no/observations/" + observationId); - cell.setHyperlink(hyperlink); + hyperlink.setAddress(url); + return hyperlink; + } - CellStyle hlinkStyle = workbook.createCellStyle(); + private static CellStyle hyperlinkCellStyle(Workbook workbook) { + CellStyle hyperlinkStyle = workbook.createCellStyle(); Font hlinkFont = workbook.createFont(); hlinkFont.setUnderline(Font.U_SINGLE); hlinkFont.setColor(IndexedColors.BLUE.getIndex()); - hlinkStyle.setFont(hlinkFont); - cell.setCellStyle(hlinkStyle); + hyperlinkStyle.setFont(hlinkFont); + return hyperlinkStyle; } }