From 6c579eb2bc12137c4417ca05322c0109a907a5af Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Wed, 12 Aug 2026 14:19:42 -0700 Subject: [PATCH 1/2] Add startup property that overrides the distribution name --- .../org/labkey/api/module/ModuleLoader.java | 13 ++++++++++ .../module/ModuleLoaderStartupProperties.java | 25 ++++++++++++++++--- .../org/labkey/api/settings/AppPropsImpl.java | 3 ++- core/src/org/labkey/core/admin/admin.jsp | 14 +++++------ 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/api/src/org/labkey/api/module/ModuleLoader.java b/api/src/org/labkey/api/module/ModuleLoader.java index 5920b0a99d2..6c5b866dfae 100644 --- a/api/src/org/labkey/api/module/ModuleLoader.java +++ b/api/src/org/labkey/api/module/ModuleLoader.java @@ -245,6 +245,9 @@ public enum ModuleState private final Set> _startupPropertyHandlers = new ConcurrentSkipListSet<>(Comparator.comparing((StartupPropertyHandler sph) -> sph.getScope(), String.CASE_INSENSITIVE_ORDER).thenComparing(StartupPropertyHandler::getStartupPropertyClassName)); private final MultiValuedMap _startupPropertyMap = new CaseInsensitiveKeyedHashSetValuedMap<>(); + // If non-null (set by a startup property), overrides the name specified in the distribution.properties file + private String _distributionName = null; + private ModuleLoader() { MemTracker.getInstance().register(this); @@ -2064,6 +2067,16 @@ public boolean isUpgradeInProgress() } } + public @Nullable String getDistributionName() + { + return _distributionName; + } + + public void setDistributionName(String distributionName) + { + _distributionName = distributionName; + } + // Did this server start up with no modules installed? If so, it's a new installation. This lets us tailor the // module upgrade UI to "install" or "upgrade," as appropriate. public boolean isNewInstall() diff --git a/api/src/org/labkey/api/module/ModuleLoaderStartupProperties.java b/api/src/org/labkey/api/module/ModuleLoaderStartupProperties.java index 67394587dee..50e119954a0 100644 --- a/api/src/org/labkey/api/module/ModuleLoaderStartupProperties.java +++ b/api/src/org/labkey/api/module/ModuleLoaderStartupProperties.java @@ -42,6 +42,14 @@ public String getDescription() { return "Comma-separated list of modules to disable during this server session. Note: Respected only when the \"startup\" modifier is specified."; } + }, + distributionName + { + @Override + public String getDescription() + { + return "Distribution name to show in the admin console and the export diagnostics zip file. This name overrides the value provided in the distribution.properties file that's bundled with the distribution."; + } }; private final LinkedList _list = new LinkedList<>(); @@ -57,10 +65,19 @@ static void populate() @Override public void handle(Map map) { - map.forEach((sp, cp)-> Arrays.stream(StringUtils.split(cp.getValue(), ",")) - .map(StringUtils::trimToNull) - .filter(Objects::nonNull) - .forEach(sp._list::add)); + map.forEach((sp, cp)-> { + if (sp == distributionName) + { + ModuleLoader.getInstance().setDistributionName(cp.getValue()); + } + else + { + Arrays.stream(StringUtils.split(cp.getValue(), ",")) + .map(StringUtils::trimToNull) + .filter(Objects::nonNull) + .forEach(sp._list::add); + } + }); } }); } diff --git a/api/src/org/labkey/api/settings/AppPropsImpl.java b/api/src/org/labkey/api/settings/AppPropsImpl.java index ac90bf67310..a3c95a42fcc 100644 --- a/api/src/org/labkey/api/settings/AppPropsImpl.java +++ b/api/src/org/labkey/api/settings/AppPropsImpl.java @@ -55,6 +55,7 @@ import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.Set; @@ -702,7 +703,7 @@ public Map getStashedStartupProp @Override public @NotNull String getDistributionName() { - return DISTRIBUTION_NAME; + return Objects.requireNonNullElse(ModuleLoader.getInstance().getDistributionName(), DISTRIBUTION_NAME); } @Override diff --git a/core/src/org/labkey/core/admin/admin.jsp b/core/src/org/labkey/core/admin/admin.jsp index 07dd6219fc4..ad911de022d 100644 --- a/core/src/org/labkey/core/admin/admin.jsp +++ b/core/src/org/labkey/core/admin/admin.jsp @@ -17,20 +17,22 @@ %> <%@ page import="org.apache.commons.lang3.ObjectUtils" %> <%@ page import="org.apache.commons.lang3.StringUtils" %> +<%@ page import="org.apache.commons.lang3.Strings" %> <%@ page import="org.labkey.api.admin.AdminBean" %> <%@ page import="org.labkey.api.data.DbScope" %> <%@ page import="org.labkey.api.data.dialect.SqlDialect" %> <%@ page import="org.labkey.api.files.FileContentService" %> <%@ page import="org.labkey.api.module.DefaultModule" %> <%@ page import="org.labkey.api.module.Module" %> -<%@ page import="org.labkey.api.module.ModuleLoader"%> +<%@ page import="org.labkey.api.module.ModuleLoader" %> <%@ page import="org.labkey.api.moduleeditor.api.ModuleEditorService" %> <%@ page import="org.labkey.api.settings.AdminConsole" %> <%@ page import="org.labkey.api.settings.AdminConsole.AdminLink" %> <%@ page import="org.labkey.api.settings.AdminConsole.SettingsLinkType" %> <%@ page import="org.labkey.api.settings.AppProps" %> +<%@ page import="org.labkey.api.util.DateUtil" %> <%@ page import="org.labkey.api.util.Formats" %> -<%@ page import="org.labkey.api.util.HtmlString"%> +<%@ page import="org.labkey.api.util.HtmlString" %> <%@ page import="org.labkey.api.util.HtmlStringBuilder" %> <%@ page import="org.labkey.api.view.NavTree" %> <%@ page import="org.labkey.core.admin.AdminController" %> @@ -41,8 +43,6 @@ <%@ page import="java.util.Comparator" %> <%@ page import="java.util.Map" %> <%@ page import="java.util.TreeMap" %> -<%@ page import="org.apache.commons.lang3.Strings" %> -<%@ page import="org.labkey.api.util.DateUtil" %> <%@ page extends="org.labkey.api.jsp.JspBase" %> <%@ taglib prefix="labkey" uri="http://www.labkey.org/taglib" %> <% @@ -101,9 +101,9 @@ { timeCellCls = "lk-server-time-warning"; warning = HtmlStringBuilder.of(" - Warning: Web and database server times differ by ") - .append(timeDifference.getSeconds()) - .append(" seconds!") - .getHtmlString(); + .append(timeDifference.getSeconds()) + .append(" seconds!") + .getHtmlString(); } %>

Runtime Information

From 5195824dcb2d13ac1b17bd2ef8bc8921151f310e Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Wed, 12 Aug 2026 14:55:47 -0700 Subject: [PATCH 2/2] Address some Claude feedback --- api/src/org/labkey/api/module/ModuleLoader.java | 13 ++++++++----- .../api/module/ModuleLoaderStartupProperties.java | 6 ++++-- api/src/org/labkey/api/settings/AppPropsImpl.java | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/api/src/org/labkey/api/module/ModuleLoader.java b/api/src/org/labkey/api/module/ModuleLoader.java index 6c5b866dfae..045f0d29491 100644 --- a/api/src/org/labkey/api/module/ModuleLoader.java +++ b/api/src/org/labkey/api/module/ModuleLoader.java @@ -246,7 +246,7 @@ public enum ModuleState private final MultiValuedMap _startupPropertyMap = new CaseInsensitiveKeyedHashSetValuedMap<>(); // If non-null (set by a startup property), overrides the name specified in the distribution.properties file - private String _distributionName = null; + private String _distributionNameOverride = null; private ModuleLoader() { @@ -2067,14 +2067,17 @@ public boolean isUpgradeInProgress() } } - public @Nullable String getDistributionName() + public @Nullable String getDistributionNameOverride() { - return _distributionName; + return _distributionNameOverride; } - public void setDistributionName(String distributionName) + void setDistributionNameOverride(String distributionNameOverride) { - _distributionName = distributionName; + if (isStartupComplete()) + throw new IllegalStateException("Distribution name override must be set during startup"); + + _distributionNameOverride = distributionNameOverride; } // Did this server start up with no modules installed? If so, it's a new installation. This lets us tailor the diff --git a/api/src/org/labkey/api/module/ModuleLoaderStartupProperties.java b/api/src/org/labkey/api/module/ModuleLoaderStartupProperties.java index 50e119954a0..a3811b94a0c 100644 --- a/api/src/org/labkey/api/module/ModuleLoaderStartupProperties.java +++ b/api/src/org/labkey/api/module/ModuleLoaderStartupProperties.java @@ -48,7 +48,9 @@ public String getDescription() @Override public String getDescription() { - return "Distribution name to show in the admin console and the export diagnostics zip file. This name overrides the value provided in the distribution.properties file that's bundled with the distribution."; + return "Distribution name to show in the admin console, include in the export diagnostics zip file, and" + + "report to mothership. This name overrides the value provided in the distribution.properties file " + + "that's bundled with the distribution. Note: Respected only when the \"startup\" modifier is specified."; } }; @@ -68,7 +70,7 @@ public void handle(Map map) map.forEach((sp, cp)-> { if (sp == distributionName) { - ModuleLoader.getInstance().setDistributionName(cp.getValue()); + ModuleLoader.getInstance().setDistributionNameOverride(StringUtils.trimToNull(cp.getValue())); } else { diff --git a/api/src/org/labkey/api/settings/AppPropsImpl.java b/api/src/org/labkey/api/settings/AppPropsImpl.java index a3c95a42fcc..d45d16b2deb 100644 --- a/api/src/org/labkey/api/settings/AppPropsImpl.java +++ b/api/src/org/labkey/api/settings/AppPropsImpl.java @@ -703,7 +703,7 @@ public Map getStashedStartupProp @Override public @NotNull String getDistributionName() { - return Objects.requireNonNullElse(ModuleLoader.getInstance().getDistributionName(), DISTRIBUTION_NAME); + return Objects.requireNonNullElse(ModuleLoader.getInstance().getDistributionNameOverride(), DISTRIBUTION_NAME); } @Override