From 42b0e546a23c4c7ce2c3d0ed8a0a476a1807a85b Mon Sep 17 00:00:00 2001 From: Matus Kasak Date: Thu, 20 Aug 2026 15:38:45 +0200 Subject: [PATCH 1/2] Expose buildVersion on REST root (serving side of deployed-version info) (#813) The Docker build already generates dspace/config/VERSION_D.txt (docker.yml + reusable-docker-build.yml), but nothing exposed it. Add the serving side to match dtq-dev so /server/api reports which commit is deployed: - dspace.cfg: build.version.file.path points at the generated file. - RootConverter reads that file and sets RootRest.buildVersion. - RootRest gains the buildVersion field (getter/setter, equals/hashCode). - dspace/config/VERSION_D.txt committed as an empty placeholder (overwritten at build). Co-Authored-By: Claude Opus 4.8 --- .../app/rest/converter/RootConverter.java | 32 +++++++++++++++++++ .../org/dspace/app/rest/model/RootRest.java | 11 +++++++ dspace/config/VERSION_D.txt | 0 dspace/config/dspace.cfg | 4 +++ 4 files changed, 47 insertions(+) create mode 100644 dspace/config/VERSION_D.txt diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/RootConverter.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/RootConverter.java index 9655a57d6024..fc9ef1c5a264 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/RootConverter.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/RootConverter.java @@ -10,6 +10,9 @@ import static org.dspace.app.util.Util.getSourceVersion; import jakarta.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; import org.apache.commons.lang3.StringUtils; import org.dspace.app.rest.model.RootRest; import org.dspace.services.ConfigurationService; @@ -39,8 +42,37 @@ public RootRest convert(HttpServletRequest request) { rootRest.setDspaceServer(dspaceUrl); } rootRest.setDspaceVersion("DSpace " + getSourceVersion()); + rootRest.setBuildVersion(getBuildVersion()); return rootRest; } + /** + * Read the build version from the `build.version.file.path` property + * + * @return content of the version file + */ + private String getBuildVersion() { + String bVersionFilePath = configurationService.getProperty("build.version.file.path"); + if (StringUtils.isBlank(bVersionFilePath)) { + return "Unknown"; + } + + StringBuilder buildVersion = new StringBuilder(); + try { + FileReader fileReader = new FileReader(bVersionFilePath); + BufferedReader bufferedReader = new BufferedReader(fileReader); + + String line; + // Read each line from the file until the end of the file is reached + while ((line = bufferedReader.readLine()) != null) { + buildVersion.append(line); + } + + } catch (IOException e) { + // Empty - do not log anything + } + + return buildVersion.toString(); + } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/RootRest.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/RootRest.java index a4ca592cd52a..5aae5cd31304 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/RootRest.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/RootRest.java @@ -22,6 +22,7 @@ public class RootRest extends RestAddressableModel { private String dspaceName; private String dspaceServer; private String dspaceVersion; + private String buildVersion; public String getCategory() { return CATEGORY; @@ -76,6 +77,14 @@ public void setDspaceVersion(String dspaceVersion) { this.dspaceVersion = dspaceVersion; } + public String getBuildVersion() { + return buildVersion; + } + + public void setBuildVersion(String buildVersion) { + this.buildVersion = buildVersion; + } + @Override public boolean equals(Object object) { return (object instanceof RootRest && @@ -85,6 +94,7 @@ public boolean equals(Object object) { .append(this.getDspaceUI(), ((RootRest) object).getDspaceUI()) .append(this.getDspaceName(), ((RootRest) object).getDspaceName()) .append(this.getDspaceServer(), ((RootRest) object).getDspaceServer()) + .append(this.getBuildVersion(), ((RootRest) object).getBuildVersion()) .isEquals()); } @@ -97,6 +107,7 @@ public int hashCode() { .append(this.getDspaceName()) .append(this.getDspaceUI()) .append(this.getDspaceServer()) + .append(this.getBuildVersion()) .toHashCode(); } } diff --git a/dspace/config/VERSION_D.txt b/dspace/config/VERSION_D.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index 828603252f1b..db94a18b9de8 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -42,6 +42,10 @@ dspace.ui.url = http://localhost:4000 dspace.name = DSpace Jihočeské Univerzity v Českých Budějovicích dspace.shortname = DSpace +### The build version is stored in the specific file (issue #813) ### +### Exposed as `buildVersion` on the REST root endpoint (/server/api). ### +build.version.file.path = ${dspace.dir}/config/VERSION_D.txt + # Assetstore configurations have moved to config/modules/assetstore.cfg # and config/spring/api/bitstore.xml. # Additional storage options (e.g. Amazon S3) are available in `assetstore.cfg` From c829eb9a5e8660be0b20f31da65b7a35175ee609 Mon Sep 17 00:00:00 2001 From: Matus Kasak Date: Fri, 21 Aug 2026 10:04:57 +0200 Subject: [PATCH 2/2] Fix checkstyle import order in RootConverter (java.io before jakarta) (#813) Co-Authored-By: Claude Opus 4.8 --- .../main/java/org/dspace/app/rest/converter/RootConverter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/RootConverter.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/RootConverter.java index fc9ef1c5a264..b9ca03a6ecb6 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/RootConverter.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/RootConverter.java @@ -9,10 +9,11 @@ import static org.dspace.app.util.Util.getSourceVersion; -import jakarta.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; + +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.dspace.app.rest.model.RootRest; import org.dspace.services.ConfigurationService;