Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 20 additions & 6 deletions api/src/org/labkey/api/module/JavaVersion.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@
public enum JavaVersion
{
JAVA_UNSUPPORTED(-1, true, false, null),
JAVA_17(17, false, true, "https://docs.oracle.com/en/java/javase/17/docs/api/java.base/"),
JAVA_FUTURE(Integer.MAX_VALUE, false, false, "https://docs.oracle.com/en/java/javase/17/docs/api/java.base/");
JAVA_17(17, true, true, "https://docs.oracle.com/en/java/javase/17/docs/api/java.base/"),
JAVA_25(25, false, true, "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/"),
JAVA_FUTURE(Integer.MAX_VALUE, false, false, "https://docs.oracle.com/en/java/javase/25/docs/api/java.base/");

private final int _version;
private final boolean _deprecated;
Expand Down Expand Up @@ -73,7 +74,7 @@ public String getJavaDocBaseURL()

public static JavaVersion get()
{
// Determine current Java specification version, normalized to an int (e.g., 17, 18, 19, 20...).
// Determine current Java specification version, normalized to an int (e.g., 17, 20, 25, 31...).
// Commons lang methods like SystemUtils.isJavaVersionAtLeast() aren't an option because that library isn't
// released often enough to keep up with the Java rapid release cadence.
String[] versionArray = SystemUtils.JAVA_SPECIFICATION_VERSION.split("\\.");
Expand Down Expand Up @@ -109,7 +110,7 @@ public static String getJavaVersionDescription()

public static String getRecommendedJavaVersion()
{
return "Eclipse Temurin 17 64-bit with HotSpot JVM";
return "Eclipse Temurin 25 64-bit with HotSpot JVM";
}

public static class TestCase extends Assert
Expand All @@ -131,12 +132,25 @@ public void test()
test(15, JAVA_UNSUPPORTED);
test(16, JAVA_UNSUPPORTED);

test(18, JAVA_UNSUPPORTED);
test(19, JAVA_UNSUPPORTED);
test(20, JAVA_UNSUPPORTED);
test(21, JAVA_UNSUPPORTED);
test(22, JAVA_UNSUPPORTED);
test(23, JAVA_UNSUPPORTED);
test(24, JAVA_UNSUPPORTED);

// Good
test(17, JAVA_17);
test(25, JAVA_25);

// Future
test(18, JAVA_FUTURE);
test(19, JAVA_FUTURE);
test(26, JAVA_FUTURE);
test(27, JAVA_FUTURE);
test(28, JAVA_FUTURE);
test(29, JAVA_FUTURE);
test(30, JAVA_FUTURE);
test(31, JAVA_FUTURE);
}

private void test(int version, JavaVersion expectedVersion)
Expand Down
9 changes: 8 additions & 1 deletion api/src/org/labkey/api/module/ModuleLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -1387,7 +1387,14 @@ private void setJavaVersion()
_javaVersion = JavaVersion.get();

if (!_javaVersion.isTested())
_log.warn("LabKey Server has not been tested against Java runtime version {}.", JavaVersion.getJavaVersionDescription());
logJavaWarning("has not been tested with LabKey Server");
else if (_javaVersion.isDeprecated())
logJavaWarning("is no longer supported");
}

private void logJavaWarning(String message)
{
_log.warn("The deployed version of Java, {}, {}. We recommend installing {}.", JavaVersion.getJavaVersionDescription(), message, JavaVersion.getRecommendedJavaVersion());
}

public JavaVersion getJavaVersion()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,13 @@ public void addStaticWarnings(@NotNull Warnings warnings, boolean showAllWarning
DbScope labkeyScope = DbScope.getLabKeyScope();
labkeyScope.getSqlDialect().addAdminWarningMessages(warnings, showAllWarnings);

getHeapSizeWarnings(warnings, showAllWarnings);
addHeapSizeWarnings(warnings, showAllWarnings);

getConnectionPoolSizeWarnings(warnings, labkeyScope, showAllWarnings);
addConnectionPoolSizeWarnings(warnings, labkeyScope, showAllWarnings);

getJavaWarnings(warnings, showAllWarnings);
addJavaWarnings(warnings, showAllWarnings);

getTomcatWarnings(warnings, showAllWarnings);
addTomcatWarnings(warnings, showAllWarnings);
}

@Override
Expand All @@ -131,19 +131,19 @@ public void addDynamicWarnings(@NotNull Warnings warnings, @Nullable ViewContext

if (context == null || context.getUser().hasRootPermission(TroubleshooterPermission.class))
{
getUserRequestedAdminOnlyModeWarnings(warnings, showAllWarnings, context == null || context.getUser().hasSiteAdminPermission());
addUserRequestedAdminOnlyModeWarnings(warnings, showAllWarnings, context == null || context.getUser().hasSiteAdminPermission());

getModuleErrorWarnings(warnings, showAllWarnings);
addModuleErrorWarnings(warnings, showAllWarnings);

getProbableLeakCountWarnings(warnings, showAllWarnings);
addProbableLeakCountWarnings(warnings, showAllWarnings);

getWebSocketConnectionWarnings(warnings, showAllWarnings);
addWebSocketConnectionWarnings(warnings, showAllWarnings);

getDbSchemaWarnings(warnings, showAllWarnings);
addDbSchemaWarnings(warnings, showAllWarnings);

getPasswordRuleWarnings(warnings, showAllWarnings);
addPasswordRuleWarnings(warnings, showAllWarnings);

getDeprecatedFeatureWarnings(warnings, showAllWarnings);
addDeprecatedFeatureWarnings(warnings, showAllWarnings);
}

// Issue 50015 - only show upgrade message to full site admins
Expand Down Expand Up @@ -185,7 +185,7 @@ else if (showAllWarnings)

private static final int MAX_SCHEMA_PROBLEMS_TO_SHOW = 3;

private void getDbSchemaWarnings(Warnings warnings, boolean showAllWarnings)
private void addDbSchemaWarnings(Warnings warnings, boolean showAllWarnings)
{
Map<String, List<SiteValidationResult>> schemaProblems = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
schemaProblems.putAll(_dbSchemaWarnings);
Expand Down Expand Up @@ -216,13 +216,13 @@ private void getDbSchemaWarnings(Warnings warnings, boolean showAllWarnings)
}
}

private void getPasswordRuleWarnings(Warnings warnings, boolean showAllWarnings)
private void addPasswordRuleWarnings(Warnings warnings, boolean showAllWarnings)
{
if (showAllWarnings || (!AppProps.getInstance().isDevMode() && DbLoginService.get().getPasswordRule().isDeprecated()))
warnings.add(HtmlString.of("Database authentication is configured with \"" + DbLoginService.get().getPasswordRule().name() + "\" strength, which is not appropriate for production deployments. This option will be removed in the next major release."));
}

private void getHeapSizeWarnings(Warnings warnings, boolean showAllWarnings)
private void addHeapSizeWarnings(Warnings warnings, boolean showAllWarnings)
{
// Issue 9683 - show admins warning about inadequate heap size (< 2GB)
MemoryMXBean membean = ManagementFactory.getMemoryMXBean();
Expand All @@ -239,7 +239,7 @@ private void getHeapSizeWarnings(Warnings warnings, boolean showAllWarnings)
}

// Warn if running in production mode with an inadequate labkey db connection pool size
private void getConnectionPoolSizeWarnings(Warnings warnings, DbScope labkeyScope, boolean showAllWarnings)
private void addConnectionPoolSizeWarnings(Warnings warnings, DbScope labkeyScope, boolean showAllWarnings)
{
if (showAllWarnings || !AppProps.getInstance().isDevMode())
{
Expand All @@ -256,7 +256,7 @@ else if (showAllWarnings || maxTotal < 20)
}
}

private void getJavaWarnings(Warnings warnings, boolean showAllWarnings)
private void addJavaWarnings(Warnings warnings, boolean showAllWarnings)
{
if (showAllWarnings || ModuleLoader.getInstance().getJavaVersion().isDeprecated())
{
Expand Down Expand Up @@ -294,7 +294,7 @@ public static Set<String> collectAllDeployedApps()
return _deployedApps;
}

private void getTomcatWarnings(Warnings warnings, boolean showAllWarnings)
private void addTomcatWarnings(Warnings warnings, boolean showAllWarnings)
{
if (showAllWarnings || ModuleLoader.getInstance().getTomcatVersion().isDeprecated())
{
Expand Down Expand Up @@ -322,7 +322,7 @@ private void getTomcatWarnings(Warnings warnings, boolean showAllWarnings)
}
}

private void getModuleErrorWarnings(Warnings warnings, boolean showAllWarnings)
private void addModuleErrorWarnings(Warnings warnings, boolean showAllWarnings)
{
//module failures during startup--show to admins
Map<String, Throwable> moduleFailures = ModuleLoader.getInstance().getModuleFailures();
Expand All @@ -347,13 +347,13 @@ private void getModuleErrorWarnings(Warnings warnings, boolean showAllWarnings)
"schemas should be deleted via the ", "Module Details page", PageFlowUtil.urlProvider(AdminUrls.class).getModulesDetailsURL());
}

private void getWebSocketConnectionWarnings(Warnings warnings, boolean showAllWarnings)
private void addWebSocketConnectionWarnings(Warnings warnings, boolean showAllWarnings)
{
if (showAllWarnings || WebSocketConnectionManager.getInstance().showWarning())
addStandardWarning(warnings, "The WebSocket connection failed. LabKey Server uses WebSockets to send notifications and alert users when their session ends.", "configTomcat#websocket", "Tomcat Configuration");
}

private void getUserRequestedAdminOnlyModeWarnings(Warnings warnings, boolean showAllWarnings, boolean isSiteAdmin)
private void addUserRequestedAdminOnlyModeWarnings(Warnings warnings, boolean showAllWarnings, boolean isSiteAdmin)
{
//admin-only mode--show to admins
if (showAllWarnings || AppProps.getInstance().isUserRequestedAdminOnlyMode())
Expand All @@ -363,7 +363,7 @@ private void getUserRequestedAdminOnlyModeWarnings(Warnings warnings, boolean sh
}
}

private void getProbableLeakCountWarnings(Warnings warnings, boolean showAllWarnings)
private void addProbableLeakCountWarnings(Warnings warnings, boolean showAllWarnings)
{
if (AppProps.getInstance().isDevMode())
{
Expand All @@ -378,7 +378,7 @@ private void getProbableLeakCountWarnings(Warnings warnings, boolean showAllWarn
}
}

private void getDeprecatedFeatureWarnings(Warnings warnings, boolean showAllWarnings)
private void addDeprecatedFeatureWarnings(Warnings warnings, boolean showAllWarnings)
{
Collection<OptionalFeatureFlag> flags = OptionalFeatureService.get().getOptionalFeatureFlags(OptionalFeatureService.FeatureType.Deprecated);
List<String> deprecated = flags.stream()
Expand Down