From 23d6e022d70926041642047afd85218116b89415 Mon Sep 17 00:00:00 2001 From: RBKR Date: Wed, 19 Mar 2025 14:11:17 +0100 Subject: [PATCH 01/14] Add PillarDeleteFileApprover to ReferenceSettings --- .../resources/examples/settings/ReferenceSettings.xml | 1 + .../conf/integrityservice/ReferenceSettings.xml | 3 +++ .../src/main/resources/xsd/ReferenceSettings.xsd | 8 ++++++++ 3 files changed, 12 insertions(+) diff --git a/bitrepository-core/src/main/resources/examples/settings/ReferenceSettings.xml b/bitrepository-core/src/main/resources/examples/settings/ReferenceSettings.xml index e7b13c1b8..688cb7b05 100644 --- a/bitrepository-core/src/main/resources/examples/settings/ReferenceSettings.xml +++ b/bitrepository-core/src/main/resources/examples/settings/ReferenceSettings.xml @@ -445,6 +445,7 @@ Pillar1 Alpha FILE + Anon Anonymoose anon@kb.dk diff --git a/bitrepository-integration/src/main/resources/quickstart/conf/integrityservice/ReferenceSettings.xml b/bitrepository-integration/src/main/resources/quickstart/conf/integrityservice/ReferenceSettings.xml index e01335fc6..1db9f581d 100644 --- a/bitrepository-integration/src/main/resources/quickstart/conf/integrityservice/ReferenceSettings.xml +++ b/bitrepository-integration/src/main/resources/quickstart/conf/integrityservice/ReferenceSettings.xml @@ -113,16 +113,19 @@ checksum-pillar Alpha CHECKSUM + Anon Anonymoose anon@kb.dk file1-pillar Beta FILE + Anon Anonymoose anon@kb.dk file2-pillar Gamma FILE + Anon Anonymoose anon@kb.dk diff --git a/bitrepository-reference-settings/src/main/resources/xsd/ReferenceSettings.xsd b/bitrepository-reference-settings/src/main/resources/xsd/ReferenceSettings.xsd index d6db153a6..c376c9d6c 100644 --- a/bitrepository-reference-settings/src/main/resources/xsd/ReferenceSettings.xsd +++ b/bitrepository-reference-settings/src/main/resources/xsd/ReferenceSettings.xsd @@ -398,6 +398,14 @@ + + + + Name/email/contact-info of the person responsible for approving any deletions on this pillar prior + to running an actual DeleteFile-operation. + + + From 562a9122de4150f2f26af805d033b0115bad23f6 Mon Sep 17 00:00:00 2001 From: RBKR Date: Thu, 20 Mar 2025 16:06:46 +0100 Subject: [PATCH 02/14] Add integrity endpoint exposing pillar details --- .../common/utils/SettingsUtils.java | 43 +++++++++++-------- .../web/RestIntegrityService.java | 9 ++++ 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/utils/SettingsUtils.java b/bitrepository-core/src/main/java/org/bitrepository/common/utils/SettingsUtils.java index c97eb183e..64d853701 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/utils/SettingsUtils.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/utils/SettingsUtils.java @@ -101,6 +101,26 @@ public static String getCollectionName(String collectionID) { return name; } + public static IntegrityServiceSettings getIntegrityServiceSettings() { + return settings.getReferenceSettings().getIntegrityServiceSettings(); + } + + /** + * Grab all PillarDetails from the ReferenceSettings if any are defined and return them as a list. + * Return an empty list if not defined. + * @return List of all PillarDetails defined in the ReferenceSettings + */ + public static List getPillarIntegrityDetails() { + PillarIntegrityDetails pillarIntegrityDetails = getIntegrityServiceSettings().getPillarIntegrityDetails(); + if (pillarIntegrityDetails != null) { + List pillarDetails = pillarIntegrityDetails.getPillarDetails(); + if (pillarDetails != null) { + return pillarDetails; + } + } + return new ArrayList<>(); + } + /** * Get the human-readable pillar name for the given pillarID from the ReferenceSettings. * @@ -108,21 +128,14 @@ public static String getCollectionName(String collectionID) { * @return Returns the pillar name for the given pillar ID. */ public static String getPillarName(String pillarID) { - PillarIntegrityDetails details = settings.getReferenceSettings().getIntegrityServiceSettings().getPillarIntegrityDetails(); - if (details != null) { - for (PillarIntegrityDetails.PillarDetails d : details.getPillarDetails()) { - if (d.getPillarID().equals(pillarID)) { - return d.getPillarName(); - } + for (PillarIntegrityDetails.PillarDetails d : getPillarIntegrityDetails()) { + if (d.getPillarID().equals(pillarID)) { + return d.getPillarName(); } } return null; } - public static IntegrityServiceSettings getIntegrityServiceSettings() { - return settings.getReferenceSettings().getIntegrityServiceSettings(); - } - /** * Get the {@link PillarType} for the given Pillar ID. * @@ -130,12 +143,9 @@ public static IntegrityServiceSettings getIntegrityServiceSettings() { * @return Returns the {@link PillarType} for the given pillar ID. */ public static PillarType getPillarType(String pillarID) { - PillarIntegrityDetails details = settings.getReferenceSettings().getIntegrityServiceSettings().getPillarIntegrityDetails(); - if (details != null) { - for (PillarIntegrityDetails.PillarDetails d : details.getPillarDetails()) { - if (d.getPillarID().equals(pillarID)) { - return d.getPillarType(); - } + for (PillarIntegrityDetails.PillarDetails d : getPillarIntegrityDetails()) { + if (d.getPillarID().equals(pillarID)) { + return d.getPillarType(); } } return null; @@ -212,5 +222,4 @@ public static Set getStatusContributorsForCollection() { contributors.addAll(SettingsUtils.getAllPillarIDs()); return contributors; } - } diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java index db411deec..32d326028 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java @@ -42,6 +42,7 @@ import org.bitrepository.service.workflow.Workflow; import org.bitrepository.service.workflow.WorkflowManager; import org.bitrepository.service.workflow.WorkflowStatistic; +import org.bitrepository.settings.referencesettings.PillarIntegrityDetails; import org.bitrepository.settings.referencesettings.PillarType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -261,6 +262,14 @@ public String getIntegrityStatus(@QueryParam("collectionID") String collectionID return writer.toString(); } + @GET + @Path("/getPillarDetails") + @Produces(MediaType.APPLICATION_JSON) + // TODO consider returning a DTO instead + public List getPillarDetails() { + return SettingsUtils.getPillarIntegrityDetails(); + } + /*** * Get the current workflow’s setup as a JSON array */ From d385dcd40d53d43abb8cfcd8a6c80fa76fd3df8e Mon Sep 17 00:00:00 2001 From: RBKR Date: Thu, 20 Mar 2025 16:07:31 +0100 Subject: [PATCH 03/14] Add frontend stuff to display pillar details table --- .../src/main/webapp/dashboard.html | 16 ++++++++++- .../src/main/webapp/static/css/dashboard.css | 12 ++------- .../dashboard_components/collectionStatus.js | 18 ++++++------- .../js/dashboard_components/pillar-details.js | 27 +++++++++++++++++++ .../webapp/static/js/views/dashboard-page.js | 17 +++++++----- 5 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 bitrepository-webclient/src/main/webapp/static/js/dashboard_components/pillar-details.js diff --git a/bitrepository-webclient/src/main/webapp/dashboard.html b/bitrepository-webclient/src/main/webapp/dashboard.html index 2bcc30dea..e6abb6b45 100644 --- a/bitrepository-webclient/src/main/webapp/dashboard.html +++ b/bitrepository-webclient/src/main/webapp/dashboard.html @@ -38,7 +38,7 @@ - + @@ -52,6 +52,19 @@
Collection nameCollection name Number of files Latest Ingest Collection size
+
+ + + + + + + + + + +
Pillar IDPillar namePillar typeDeletion approver
+
@@ -106,6 +119,7 @@

Data distributed on pillars

+ diff --git a/bitrepository-webclient/src/main/webapp/static/css/dashboard.css b/bitrepository-webclient/src/main/webapp/static/css/dashboard.css index 7c0dad911..5b6684275 100644 --- a/bitrepository-webclient/src/main/webapp/static/css/dashboard.css +++ b/bitrepository-webclient/src/main/webapp/static/css/dashboard.css @@ -4,7 +4,7 @@ margin-top: 0.9em; } -.collectionStatus, .dataSizeGraph, .collectionPieBox, .legPieBox { +.collectionStatus, .pillarDetails, .dataSizeGraph, .collectionPieBox, .legPieBox { border: 1px solid #cccccc; float: left; margin: 0 0 2em; @@ -15,18 +15,10 @@ box-sizing: border-box; } -.collectionStatus, .collectionPieBox, .legPieBox { +.collectionStatus, .pillarDetails, .collectionPieBox, .legPieBox { background-color: #F9FCFF; } -.collectionStatus td, .collectionStatus th { - text-align: right; -} - -td.collectionName, th.collectionName { - text-align: left; -} - td.error { background-color: #CC0000; color: white; diff --git a/bitrepository-webclient/src/main/webapp/static/js/dashboard_components/collectionStatus.js b/bitrepository-webclient/src/main/webapp/static/js/dashboard_components/collectionStatus.js index ea7e52144..d45389f16 100644 --- a/bitrepository-webclient/src/main/webapp/static/js/dashboard_components/collectionStatus.js +++ b/bitrepository-webclient/src/main/webapp/static/js/dashboard_components/collectionStatus.js @@ -111,15 +111,15 @@ function makeCollectionRow(collection) { let id = collection.collectionID; let html = ""; html += ""; - html += "" + id + "
"; - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - html += " "; - html += " "; - html += ""; + html += "" + id + "
"; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; return html; } diff --git a/bitrepository-webclient/src/main/webapp/static/js/dashboard_components/pillar-details.js b/bitrepository-webclient/src/main/webapp/static/js/dashboard_components/pillar-details.js new file mode 100644 index 000000000..3c62b66bf --- /dev/null +++ b/bitrepository-webclient/src/main/webapp/static/js/dashboard_components/pillar-details.js @@ -0,0 +1,27 @@ +/** + * Appends the information from the pillar details JSON as rows to a table with the given ID. + * @param pillarDetails JSON containing the pillar details to build the rows from + * @param tableBodyId ID of the table to append the rows to + */ +function fillInPillarDetailsTable(pillarDetails, tableBodyId) { + pillarDetails.forEach((detail) => { + $(tableBodyId).append(makePillarDetailsRow(detail)); + }); +} + +/** + * Make a row in the pillar details table given the pillar details JSON. + * @param details Pillar details from ReferenceSettings-file as JSON + * @returns {string} HTML table row containing the pillar details + */ +function makePillarDetailsRow(details) { + let html = ""; + html += ""; + html += "" + details.pillarID + ""; + html += "" + details.pillarName + ""; + html += "" + details.pillarType + ""; + html += "" + details.pillarDeleteFileApprover + ""; + html += ""; + return html; +} + diff --git a/bitrepository-webclient/src/main/webapp/static/js/views/dashboard-page.js b/bitrepository-webclient/src/main/webapp/static/js/views/dashboard-page.js index 2c7a9e9cb..66daf2c31 100644 --- a/bitrepository-webclient/src/main/webapp/static/js/views/dashboard-page.js +++ b/bitrepository-webclient/src/main/webapp/static/js/views/dashboard-page.js @@ -4,8 +4,8 @@ let nameMapper; let dsGraph; function init() { - $.get('repo/urlservice/integrityService', {}, function (url) { - setIntegrityServiceUrl(url); + $.get('repo/urlservice/integrityService', {}, function (integrityUrlBase) { + setIntegrityServiceUrl(integrityUrlBase); $.get("repo/reposervice/getRepositoryName/", {}, function (j) { $("#pageHeader").html("Overview of " + j); }, "html"); @@ -14,11 +14,11 @@ function init() { nameMapper = new CollectionNameMapper(collections); setNameMapper(nameMapper); initiateCollectionStatus(collections, "#collectionStatusBody", 10000); - let dataUrl = url + "/integrity/Statistics/getDataSizeHistory/?collectionID="; + let dataUrl = integrityUrlBase + "/integrity/Statistics/getDataSizeHistory/?collectionID="; dsGraph = new DataSizeGraph(collections, colorMapper, new FileSizeUtils(), dataUrl, "#graphType", "#dataSizeGraphPlaceholder"); makeCollectionSelectionCheckboxes("#dataSizeGraphCollectionSelection", dsGraph, colorMapper, nameMapper); - drawPillarDataSizePieChart(url + "/integrity/Statistics/getLatestPillarDataSize/"); - drawCollectionDataSizePieChart(url + "/integrity/Statistics/getLatestcollectionDataSize/", colorMapper); + drawPillarDataSizePieChart(integrityUrlBase + "/integrity/Statistics/getLatestPillarDataSize/"); + drawCollectionDataSizePieChart(integrityUrlBase + "/integrity/Statistics/getLatestcollectionDataSize/", colorMapper); $("#graphType").on("change", function (event) { event.preventDefault(); dsGraph.graphTypeChanged(); }); @@ -26,10 +26,13 @@ function init() { // Update graphs every hour update_data_size_graph = setInterval(function () { dsGraph.updateData(); - drawPillarDataSizePieChart(url + "/integrity/Statistics/getLatestPillarDataSize/"); - drawCollectionDataSizePieChart(url + "/integrity/Statistics/getLatestcollectionDataSize/", colorMapper); + drawPillarDataSizePieChart(integrityUrlBase + "/integrity/Statistics/getLatestPillarDataSize/"); + drawCollectionDataSizePieChart(integrityUrlBase + "/integrity/Statistics/getLatestcollectionDataSize/", colorMapper); }, 3600000); }); + $.getJSON(integrityUrlBase + "/integrity/IntegrityService/getPillarDetails", {}, function (details) { + fillInPillarDetailsTable(details, "#pillarDetailsBody") + }); }, 'html'); } From 0dd053749e1898c25ffcd4271e106c8736591b9d Mon Sep 17 00:00:00 2001 From: RBKR Date: Thu, 20 Mar 2025 16:43:04 +0100 Subject: [PATCH 04/14] Add pillar details dto and a small serialization test --- .../web/PillarDetailsDTO.java | 67 +++++++++++++++++++ .../web/RestIntegrityService.java | 12 +++- .../web/PillarDetailsDTOTest.java | 24 +++++++ 3 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDTO.java create mode 100644 bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDTOTest.java diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDTO.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDTO.java new file mode 100644 index 000000000..52aae863f --- /dev/null +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDTO.java @@ -0,0 +1,67 @@ +package org.bitrepository.integrityservice.web; + +import java.io.Serializable; + +public class PillarDetailsDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + private String pillarID; + private String pillarName; + private String pillarType; + private String pillarDeleteFileApprover; + + // Constructors + public PillarDetailsDTO() {} + + public PillarDetailsDTO(String pillarID, String pillarName, String pillarType, String pillarDeleteFileApprover) { + this.pillarID = pillarID; + this.pillarName = pillarName; + this.pillarType = pillarType; + this.pillarDeleteFileApprover = pillarDeleteFileApprover; + } + + // Getters and Setters + public String getPillarID() { + return pillarID; + } + + public void setPillarID(String pillarID) { + this.pillarID = pillarID; + } + + public String getPillarName() { + return pillarName; + } + + public void setPillarName(String pillarName) { + this.pillarName = pillarName; + } + + public String getPillarType() { + return pillarType; + } + + public void setPillarType(String pillarType) { + this.pillarType = pillarType; + } + + public String getPillarDeleteFileApprover() { + return pillarDeleteFileApprover; + } + + public void setPillarDeleteFileApprover(String pillarDeleteFileApprover) { + this.pillarDeleteFileApprover = pillarDeleteFileApprover; + } + + // toString() Method + @Override + public String toString() { + return "PillarDetailsDTO{" + + "pillarID='" + pillarID + '\'' + + ", pillarName='" + pillarName + '\'' + + ", pillarType=" + pillarType + + ", pillarDeleteFileApprover='" + pillarDeleteFileApprover + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java index 32d326028..93ec01bd3 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java @@ -265,9 +265,15 @@ public String getIntegrityStatus(@QueryParam("collectionID") String collectionID @GET @Path("/getPillarDetails") @Produces(MediaType.APPLICATION_JSON) - // TODO consider returning a DTO instead - public List getPillarDetails() { - return SettingsUtils.getPillarIntegrityDetails(); + public List getPillarDetails() { + List pillarDetails = SettingsUtils.getPillarIntegrityDetails(); + List result = new ArrayList<>(pillarDetails.size()); + for (PillarIntegrityDetails.PillarDetails details : pillarDetails) { + PillarDetailsDTO detailsDTO = new PillarDetailsDTO(details.getPillarID(), details.getPillarName(), + details.getPillarType().value(), details.getPillarDeleteFileApprover()); + result.add(detailsDTO); + } + return result; } /*** diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDTOTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDTOTest.java new file mode 100644 index 000000000..862ecf84b --- /dev/null +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDTOTest.java @@ -0,0 +1,24 @@ +package org.bitrepository.integrityservice.web; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.IOException; + +import static org.testng.Assert.*; + +public class PillarDetailsDTOTest { + private final ObjectMapper objectMapper = new ObjectMapper(); // Use ObjectMapper for JSON + + @Test + void testSerialization() throws IOException { + PillarDetailsDTO dto = new PillarDetailsDTO("id", "pillar", "TYPE", "admin"); + + String jsonOutput = objectMapper.writeValueAsString(dto); + + assertTrue(jsonOutput.contains("\"pillarID\":\"id\"")); + assertTrue(jsonOutput.contains("\"pillarName\":\"pillar\"")); + assertTrue(jsonOutput.contains("\"pillarType\":\"TYPE\"")); + assertTrue(jsonOutput.contains("\"pillarDeleteFileApprover\":\"admin\"")); + } +} \ No newline at end of file From 019cbcd490a9500647803a81b56776921eaf2c1c Mon Sep 17 00:00:00 2001 From: RBKR Date: Fri, 21 Mar 2025 11:54:50 +0100 Subject: [PATCH 05/14] Small changes from PR --- .../org/bitrepository/common/utils/SettingsUtils.java | 5 +++-- .../{PillarDetailsDTO.java => PillarDetailsDto.java} | 10 +++------- .../integrityservice/web/RestIntegrityService.java | 6 +++--- ...arDetailsDTOTest.java => PillarDetailsDtoTest.java} | 4 ++-- .../src/main/resources/xsd/ReferenceSettings.xsd | 4 ++-- 5 files changed, 13 insertions(+), 16 deletions(-) rename bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/{PillarDetailsDTO.java => PillarDetailsDto.java} (87%) rename bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/{PillarDetailsDTOTest.java => PillarDetailsDtoTest.java} (88%) diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/utils/SettingsUtils.java b/bitrepository-core/src/main/java/org/bitrepository/common/utils/SettingsUtils.java index 64d853701..4a816a984 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/utils/SettingsUtils.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/utils/SettingsUtils.java @@ -29,6 +29,7 @@ import java.math.BigInteger; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -115,10 +116,10 @@ public static List getPillarIntegrityDetai if (pillarIntegrityDetails != null) { List pillarDetails = pillarIntegrityDetails.getPillarDetails(); if (pillarDetails != null) { - return pillarDetails; + return Collections.unmodifiableList(pillarDetails); } } - return new ArrayList<>(); + return List.of(); } /** diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDTO.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDto.java similarity index 87% rename from bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDTO.java rename to bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDto.java index 52aae863f..8fe4dc329 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDTO.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/PillarDetailsDto.java @@ -2,8 +2,7 @@ import java.io.Serializable; -public class PillarDetailsDTO implements Serializable { - +public class PillarDetailsDto implements Serializable { private static final long serialVersionUID = 1L; private String pillarID; @@ -11,17 +10,15 @@ public class PillarDetailsDTO implements Serializable { private String pillarType; private String pillarDeleteFileApprover; - // Constructors - public PillarDetailsDTO() {} + public PillarDetailsDto() {} - public PillarDetailsDTO(String pillarID, String pillarName, String pillarType, String pillarDeleteFileApprover) { + public PillarDetailsDto(String pillarID, String pillarName, String pillarType, String pillarDeleteFileApprover) { this.pillarID = pillarID; this.pillarName = pillarName; this.pillarType = pillarType; this.pillarDeleteFileApprover = pillarDeleteFileApprover; } - // Getters and Setters public String getPillarID() { return pillarID; } @@ -54,7 +51,6 @@ public void setPillarDeleteFileApprover(String pillarDeleteFileApprover) { this.pillarDeleteFileApprover = pillarDeleteFileApprover; } - // toString() Method @Override public String toString() { return "PillarDetailsDTO{" + diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java index 93ec01bd3..8a981a478 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java @@ -265,11 +265,11 @@ public String getIntegrityStatus(@QueryParam("collectionID") String collectionID @GET @Path("/getPillarDetails") @Produces(MediaType.APPLICATION_JSON) - public List getPillarDetails() { + public List getPillarDetails() { List pillarDetails = SettingsUtils.getPillarIntegrityDetails(); - List result = new ArrayList<>(pillarDetails.size()); + List result = new ArrayList<>(pillarDetails.size()); for (PillarIntegrityDetails.PillarDetails details : pillarDetails) { - PillarDetailsDTO detailsDTO = new PillarDetailsDTO(details.getPillarID(), details.getPillarName(), + PillarDetailsDto detailsDTO = new PillarDetailsDto(details.getPillarID(), details.getPillarName(), details.getPillarType().value(), details.getPillarDeleteFileApprover()); result.add(detailsDTO); } diff --git a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDTOTest.java b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDtoTest.java similarity index 88% rename from bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDTOTest.java rename to bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDtoTest.java index 862ecf84b..b25ef9a33 100644 --- a/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDTOTest.java +++ b/bitrepository-integrity-service/src/test/java/org/bitrepository/integrityservice/web/PillarDetailsDtoTest.java @@ -7,12 +7,12 @@ import static org.testng.Assert.*; -public class PillarDetailsDTOTest { +public class PillarDetailsDtoTest { private final ObjectMapper objectMapper = new ObjectMapper(); // Use ObjectMapper for JSON @Test void testSerialization() throws IOException { - PillarDetailsDTO dto = new PillarDetailsDTO("id", "pillar", "TYPE", "admin"); + PillarDetailsDto dto = new PillarDetailsDto("id", "pillar", "TYPE", "admin"); String jsonOutput = objectMapper.writeValueAsString(dto); diff --git a/bitrepository-reference-settings/src/main/resources/xsd/ReferenceSettings.xsd b/bitrepository-reference-settings/src/main/resources/xsd/ReferenceSettings.xsd index c376c9d6c..4fd7583af 100644 --- a/bitrepository-reference-settings/src/main/resources/xsd/ReferenceSettings.xsd +++ b/bitrepository-reference-settings/src/main/resources/xsd/ReferenceSettings.xsd @@ -401,8 +401,8 @@ - Name/email/contact-info of the person responsible for approving any deletions on this pillar prior - to running an actual DeleteFile-operation. + Free text field for name/email/contact-info of the person responsible for approving any deletions + on this pillar prior to running an actual DeleteFile-operation. From 1abd2df7894967abb9c9bb5b8c1e1b83efcdc839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20S=C3=B8by?= Date: Thu, 13 Mar 2025 12:13:48 +0100 Subject: [PATCH 06/14] Updated Jenkinsfile. --- Jenkinsfile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b39a913ec..9b65c1bc6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -8,8 +8,9 @@ pipeline { maven 'Maven' // Use the maven automatic installation configured in Jenkins } environment { - // TODO: Need to use settings: -s /etc/m2/settings.xml MVN_CMD = 'mvn -s /etc/m2/settings.xml --batch-mode' // Define the base Maven command + APP_NAME = 'bitrepository' // Application Name (Must match ArgoCD) + AUTH_TOKEN = 'TOKEN' // Authentication token for ArgoCD } options { disableConcurrentBuilds() // Prevent concurrent builds @@ -43,8 +44,8 @@ pipeline { stage('Push to Nexus (if Master)') { steps { script { - echo "Deploying '${env.BRANCH_NAME}' branch to Nexus" if (env.BRANCH_NAME == 'master') { + echo "Deploying '${env.BRANCH_NAME}' branch to Nexus" sh "${env.MVN_CMD} clean deploy -DskipTests=true" } } @@ -53,10 +54,11 @@ pipeline { } post { success { - echo 'Build succeeded.' + script { + echo 'Build succeeded, syncing application in ArgoCD.' + } } failure { - // TODO: Notify on email (possibly just use plugin) echo 'Build failed, investigate errors in the console output.' } } From 629785afc1e312d81ca8faeb48449282c8523767 Mon Sep 17 00:00:00 2001 From: RBKR Date: Tue, 11 Mar 2025 16:55:32 +0100 Subject: [PATCH 07/14] Fix workflow interval only being interpreted as 'Never' if value is -1 --- .../integrityservice/web/RestIntegrityService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java index 8a981a478..8b67a2676 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java @@ -609,7 +609,7 @@ private void writeWorkflowSetupObject(JobID workflowID, JsonGenerator jg) throws } long runInterval = workflowManager.getRunInterval(workflowID); String intervalString; - if (runInterval == -1) { + if (runInterval < 1) { intervalString = "Never"; } else { intervalString = TimeUtils.millisecondsToHuman(runInterval); From c19d9716d7d14c48a07e0c68ba2cc1ef981e886d Mon Sep 17 00:00:00 2001 From: RBKR Date: Thu, 13 Mar 2025 10:01:14 +0100 Subject: [PATCH 08/14] Change '< 1' condition to '<= 0' as suggested in PR comment --- .../integrityservice/web/RestIntegrityService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java index 8b67a2676..9a5301465 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java @@ -609,7 +609,7 @@ private void writeWorkflowSetupObject(JobID workflowID, JsonGenerator jg) throws } long runInterval = workflowManager.getRunInterval(workflowID); String intervalString; - if (runInterval < 1) { + if (runInterval <= 0) { intervalString = "Never"; } else { intervalString = TimeUtils.millisecondsToHuman(runInterval); From bb855812a6ff2b1d043947fb171e205daceaae6a Mon Sep 17 00:00:00 2001 From: "Ole V. Villumsen" Date: Wed, 16 Apr 2025 15:04:04 +0200 Subject: [PATCH 09/14] BEV-121 Fix issue with zipping large report files (not tested yet) --- .../web/RestIntegrityService.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java index 9a5301465..45d0262f7 100644 --- a/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java +++ b/bitrepository-integrity-service/src/main/java/org/bitrepository/integrityservice/web/RestIntegrityService.java @@ -63,6 +63,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.io.StringWriter; import java.nio.file.Files; @@ -372,7 +373,7 @@ public StreamingOutput getLatestIntegrityReport(@QueryParam("collectionID") Stri public Response getIntegrityReportsAsZIP(@QueryParam("collectionID") String collectionID, @QueryParam("reports") List reports) { String fileName = "IntegrityReports.zip"; - HashMap files = new HashMap<>(); + Map files = new HashMap<>(); for (String report : reports) { String[] parts = report.split("-", 2); @@ -380,23 +381,27 @@ public Response getIntegrityReportsAsZIP(@QueryParam("collectionID") String coll } StreamingOutput streamingOutput = output -> { - ZipOutputStream zipOut = new ZipOutputStream(output); // Add the full integrity report to the hashmap files.put("report", integrityReportProvider.getLatestIntegrityReportReader(collectionID).getFullReport()); - // Zip each file in the files hashmap - files.forEach((key, value) -> { - try { - zipOut.putNextEntry(new ZipEntry(key)); - zipOut.write(Files.readAllBytes(value.toPath())); - zipOut.flush(); - } catch (IOException e) { - throw new WebApplicationException(status(Status.INTERNAL_SERVER_ERROR).entity( - "Something went wrong when trying to zip the file " + key + ".").type( - MediaType.TEXT_PLAIN).build()); - } - }); - zipOut.close(); + try (ZipOutputStream zipOut = new ZipOutputStream(output)) { + // Zip each file in the files hashmap + files.forEach((key, value) -> { + try { + zipOut.putNextEntry(new ZipEntry(key)); + try (InputStream is = Files.newInputStream(value.toPath())) { + is.transferTo(zipOut); + } + zipOut.flush(); + } catch (IOException e) { + throw new WebApplicationException( + status(Status.INTERNAL_SERVER_ERROR) + .entity("Internal error when trying to zip the report file " + key + ": " + e) + .type(MediaType.TEXT_PLAIN) + .build()); + } + }); + } }; ResponseBuilder response = Response.ok(); response.type("application/zip"); From fd6bc6e02b2e79a25fd19e38a538ec4938e56bdd Mon Sep 17 00:00:00 2001 From: "Ole V. Villumsen" Date: Wed, 16 Apr 2025 15:24:16 +0200 Subject: [PATCH 10/14] Avoid vulnerability in PostgreSQL before 42.4.4 --- bitrepository-service/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitrepository-service/pom.xml b/bitrepository-service/pom.xml index b85efc600..2bed07d6a 100644 --- a/bitrepository-service/pom.xml +++ b/bitrepository-service/pom.xml @@ -39,7 +39,7 @@ org.postgresql postgresql - 42.4.1 + 42.4.5 com.mchange From ecd4bbc53d12da407c34c281ac7c81ded91c16f2 Mon Sep 17 00:00:00 2001 From: Asger Askov Blekinge Date: Tue, 3 Jun 2025 11:09:46 +0200 Subject: [PATCH 11/14] Updated Developer asga@kb.dk info --- pom.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1a5020366..d74adb031 100644 --- a/pom.xml +++ b/pom.xml @@ -65,10 +65,13 @@ - Asger Askov-Blekinge - abr@kb.dk + Asger Askov Blekinge + asga@kb.dk The Danish Royal Library https://www.kb.dk/en + + Developer + Rasmus Bohl Kristensen From 6dc4eaba67caa2af7782c58116899c6d4b598286 Mon Sep 17 00:00:00 2001 From: moth Date: Tue, 24 Jun 2025 13:49:08 +0200 Subject: [PATCH 12/14] Changed HttpFileExchangeTest --- .../org/bitrepository/protocol/http/HttpFileExchangeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitrepository-core/src/test/java/org/bitrepository/protocol/http/HttpFileExchangeTest.java b/bitrepository-core/src/test/java/org/bitrepository/protocol/http/HttpFileExchangeTest.java index ef6485025..736e463ff 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/protocol/http/HttpFileExchangeTest.java +++ b/bitrepository-core/src/test/java/org/bitrepository/protocol/http/HttpFileExchangeTest.java @@ -41,7 +41,7 @@ public void checkUrlEncodingOfFilenamesTest() throws MalformedURLException { Settings mySettings = TestSettingsProvider.reloadSettings("uploadTest"); FileExchangeSettings fileExchangeSettings = mySettings.getReferenceSettings().getFileExchangeSettings(); fileExchangeSettings.setProtocolType(ProtocolType.HTTP); - fileExchangeSettings.setServerName("http:testserver.org"); + fileExchangeSettings.setServerName("testserver.org"); fileExchangeSettings.setPort(BigInteger.valueOf(8000)); fileExchangeSettings.setPath("dav"); HttpFileExchange fe = new HttpFileExchange(fileExchangeSettings); From d59b187f0a1730a54910409c0fc627320cf50004 Mon Sep 17 00:00:00 2001 From: moth Date: Tue, 24 Jun 2025 14:09:33 +0200 Subject: [PATCH 13/14] Changed pom from 1.12-SNAPSHOT too 1.11.1-SNAPSHOT --- bitrepository-alarm-service/pom.xml | 2 +- bitrepository-audit-trail-service/pom.xml | 2 +- bitrepository-client/pom.xml | 2 +- bitrepository-core/pom.xml | 2 +- bitrepository-integration/pom.xml | 2 +- bitrepository-integrity-service/pom.xml | 2 +- bitrepository-monitoring-service/pom.xml | 2 +- bitrepository-reference-pillar/pom.xml | 2 +- bitrepository-reference-settings/pom.xml | 2 +- bitrepository-service/pom.xml | 2 +- bitrepository-webclient/pom.xml | 2 +- pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bitrepository-alarm-service/pom.xml b/bitrepository-alarm-service/pom.xml index 60c6810c9..43a3316b3 100644 --- a/bitrepository-alarm-service/pom.xml +++ b/bitrepository-alarm-service/pom.xml @@ -9,7 +9,7 @@ org.bitrepository.reference bitrepository-parent - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT diff --git a/bitrepository-audit-trail-service/pom.xml b/bitrepository-audit-trail-service/pom.xml index 4cccd3e94..1060bb1a8 100644 --- a/bitrepository-audit-trail-service/pom.xml +++ b/bitrepository-audit-trail-service/pom.xml @@ -4,7 +4,7 @@ bitrepository-parent org.bitrepository.reference - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT bitrepository-audit-trail-service diff --git a/bitrepository-client/pom.xml b/bitrepository-client/pom.xml index b8a876d54..cf2b688a2 100644 --- a/bitrepository-client/pom.xml +++ b/bitrepository-client/pom.xml @@ -3,7 +3,7 @@ bitrepository-parent org.bitrepository.reference - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT 4.0.0 diff --git a/bitrepository-core/pom.xml b/bitrepository-core/pom.xml index 7b5cd2ed4..5b16e25b5 100644 --- a/bitrepository-core/pom.xml +++ b/bitrepository-core/pom.xml @@ -4,7 +4,7 @@ org.bitrepository.reference bitrepository-parent - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT bitrepository-core Bitrepository Core diff --git a/bitrepository-integration/pom.xml b/bitrepository-integration/pom.xml index 1356936f9..06a585a82 100644 --- a/bitrepository-integration/pom.xml +++ b/bitrepository-integration/pom.xml @@ -2,7 +2,7 @@ org.bitrepository.reference bitrepository-parent - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT 4.0.0 bitrepository-integration diff --git a/bitrepository-integrity-service/pom.xml b/bitrepository-integrity-service/pom.xml index 343f25070..03aee65ff 100644 --- a/bitrepository-integrity-service/pom.xml +++ b/bitrepository-integrity-service/pom.xml @@ -2,7 +2,7 @@ org.bitrepository.reference bitrepository-parent - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT 4.0.0 diff --git a/bitrepository-monitoring-service/pom.xml b/bitrepository-monitoring-service/pom.xml index e814b7ef3..8ab4f99c9 100644 --- a/bitrepository-monitoring-service/pom.xml +++ b/bitrepository-monitoring-service/pom.xml @@ -3,7 +3,7 @@ org.bitrepository.reference bitrepository-parent - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT bitrepository-monitoring-service war diff --git a/bitrepository-reference-pillar/pom.xml b/bitrepository-reference-pillar/pom.xml index 201fa8ebc..0bca91187 100644 --- a/bitrepository-reference-pillar/pom.xml +++ b/bitrepository-reference-pillar/pom.xml @@ -4,7 +4,7 @@ org.bitrepository.reference bitrepository-parent - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT bitrepository-reference-pillar diff --git a/bitrepository-reference-settings/pom.xml b/bitrepository-reference-settings/pom.xml index 024bab749..47d0639bf 100644 --- a/bitrepository-reference-settings/pom.xml +++ b/bitrepository-reference-settings/pom.xml @@ -4,7 +4,7 @@ org.bitrepository.reference bitrepository-parent - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT bitrepository-reference-settings Bitrepository Reference Settings diff --git a/bitrepository-service/pom.xml b/bitrepository-service/pom.xml index 2bed07d6a..b869fcc9b 100644 --- a/bitrepository-service/pom.xml +++ b/bitrepository-service/pom.xml @@ -3,7 +3,7 @@ bitrepository-parent org.bitrepository.reference - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT 4.0.0 diff --git a/bitrepository-webclient/pom.xml b/bitrepository-webclient/pom.xml index e1ad24af7..20e8441f4 100644 --- a/bitrepository-webclient/pom.xml +++ b/bitrepository-webclient/pom.xml @@ -4,7 +4,7 @@ org.bitrepository.reference bitrepository-parent - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT bitrepository-webclient war diff --git a/pom.xml b/pom.xml index d74adb031..a8c845f21 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.bitrepository.reference bitrepository-parent - 1.12-SNAPSHOT + 1.11.1-SNAPSHOT org.sbforge From d5eb06ada7d3c6267e2c1622a461d23cbec3ed74 Mon Sep 17 00:00:00 2001 From: "Ole V. Villumsen" Date: Wed, 2 Jul 2025 15:49:54 +0200 Subject: [PATCH 14/14] Have failed base 16 encoding give more detailed message --- .../bitrepository/common/utils/Base16Utils.java | 3 ++- .../common/utils/Base16UtilsTest.java | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/bitrepository-core/src/main/java/org/bitrepository/common/utils/Base16Utils.java b/bitrepository-core/src/main/java/org/bitrepository/common/utils/Base16Utils.java index 512a2052c..d4c959b25 100644 --- a/bitrepository-core/src/main/java/org/bitrepository/common/utils/Base16Utils.java +++ b/bitrepository-core/src/main/java/org/bitrepository/common/utils/Base16Utils.java @@ -58,7 +58,8 @@ public static byte[] encodeBase16(String hexString) throws DecoderException { try { return Hex.decodeHex(hexString); } catch (DecoderException e) { - throw new DecoderException("The string '" + hexString + "' is not a valid hex-string."); + throw new DecoderException( + "The string '" + hexString + "' is not a valid hex-string: " + e.getMessage(), e); } } } diff --git a/bitrepository-core/src/test/java/org/bitrepository/common/utils/Base16UtilsTest.java b/bitrepository-core/src/test/java/org/bitrepository/common/utils/Base16UtilsTest.java index 8fb212024..915a1cd30 100644 --- a/bitrepository-core/src/test/java/org/bitrepository/common/utils/Base16UtilsTest.java +++ b/bitrepository-core/src/test/java/org/bitrepository/common/utils/Base16UtilsTest.java @@ -33,7 +33,7 @@ public class Base16UtilsTest extends ExtendedTestCase { private final String DECODED_CHECKSUM = "ff5aca7ae8c80c9a3aeaf9173e4dfd27"; private final byte[] ENCODED_CHECKSUM = new byte[]{-1,90,-54,122,-24,-56,12,-102,58,-22,-7,23,62,77,-3,39}; - + @Test(groups = { "regressiontest" }) public void encodeChecksum() throws Exception { addDescription("Validating the encoding of the checksums."); @@ -55,7 +55,15 @@ public void decodeChecksum() { String decodedChecksum = Base16Utils.decodeBase16(ENCODED_CHECKSUM); Assert.assertEquals(decodedChecksum, DECODED_CHECKSUM); } - + + @Test + public void decodesNull() { + addDescription("Test decoding null"); + byte[] data = null; + String decoded = Base16Utils.decodeBase16(data); + Assert.assertNull(decoded); + } + @Test(groups = { "regressiontest" }) public void badArgumentTest() { addDescription("Test bad arguments"); @@ -64,5 +72,7 @@ public void badArgumentTest() { addStep("Test with an odd number of characters.", "Should throw a decoder exception"); Assert.assertThrows(DecoderException.class, () -> Base16Utils.encodeBase16("123")); + addStep("Test with a non hex digit.", "Should throw a decoder exception"); + Assert.assertThrows(DecoderException.class, () -> Base16Utils.encodeBase16("1g")); } }