diff --git a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/DynamicInstrumentation.java b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/DynamicInstrumentation.java index f41f4355b8fa4..5f0b18b471f83 100644 --- a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/DynamicInstrumentation.java +++ b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/DynamicInstrumentation.java @@ -44,8 +44,6 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -import static org.elasticsearch.entitlement.initialization.EntitlementInitialization.getVersionSpecificCheckerClass; - class DynamicInstrumentation { interface InstrumentationInfoFactory { @@ -191,7 +189,7 @@ public InstrumentationService.InstrumentationInfo of(String methodName, Class ); if (Runtime.version().feature() >= 20) { - var java20EntitlementCheckerClass = getVersionSpecificCheckerClass(EntitlementChecker.class, 20); + var java20EntitlementCheckerClass = EntitlementCheckerUtils.getVersionSpecificCheckerClass(EntitlementChecker.class, 20); var java20Methods = Stream.of( INSTRUMENTATION_SERVICE.lookupImplementationMethod( FileSystemProvider.class, diff --git a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementCheckerUtils.java b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementCheckerUtils.java new file mode 100644 index 0000000000000..385b685c91319 --- /dev/null +++ b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementCheckerUtils.java @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.entitlement.initialization; + +class EntitlementCheckerUtils { + /** + * Returns the "most recent" checker class compatible with the provided runtime Java version. + * For checkers, we have (optionally) version specific classes, each with a prefix (e.g. Java23). + * The mapping cannot be automatic, as it depends on the actual presence of these classes in the final Jar (see + * the various mainXX source sets). + */ + static Class getVersionSpecificCheckerClass(Class baseClass, int javaVersion) { + String packageName = baseClass.getPackageName(); + String baseClassName = baseClass.getSimpleName(); + + final String classNamePrefix; + if (javaVersion < 19) { + // For older Java versions, the basic EntitlementChecker interface and implementation contains all the supported checks + classNamePrefix = ""; + } else if (javaVersion < 23) { + classNamePrefix = "Java" + javaVersion; + } else { + // All Java version from 23 onwards will be able to use che checks in the Java23EntitlementChecker interface and implementation + classNamePrefix = "Java23"; + } + + final String className = packageName + "." + classNamePrefix + baseClassName; + Class clazz; + try { + clazz = Class.forName(className); + } catch (ClassNotFoundException e) { + throw new AssertionError("entitlement lib cannot find entitlement class " + className, e); + } + return clazz; + } +} diff --git a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementInitialization.java b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementInitialization.java index 5d66651c22949..90232e32d0170 100644 --- a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementInitialization.java +++ b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementInitialization.java @@ -63,16 +63,16 @@ public static EntitlementChecker checker() { public static void initialize(Instrumentation inst) throws Exception { manager = initChecker(); + var latestCheckerInterface = EntitlementCheckerUtils.getVersionSpecificCheckerClass( + EntitlementChecker.class, + Runtime.version().feature() + ); var verifyBytecode = Booleans.parseBoolean(System.getProperty("es.entitlements.verify_bytecode", "false")); if (verifyBytecode) { ensureClassesSensitiveToVerificationAreInitialized(); } - DynamicInstrumentation.initialize( - inst, - getVersionSpecificCheckerClass(EntitlementChecker.class, Runtime.version().feature()), - verifyBytecode - ); + DynamicInstrumentation.initialize(inst, latestCheckerInterface, verifyBytecode); } private static PolicyManager createPolicyManager() { @@ -116,41 +116,13 @@ private static void ensureClassesSensitiveToVerificationAreInitialized() { } } - /** - * Returns the "most recent" checker class compatible with the current runtime Java version. - * For checkers, we have (optionally) version specific classes, each with a prefix (e.g. Java23). - * The mapping cannot be automatic, as it depends on the actual presence of these classes in the final Jar (see - * the various mainXX source sets). - */ - static Class getVersionSpecificCheckerClass(Class baseClass, int javaVersion) { - String packageName = baseClass.getPackageName(); - String baseClassName = baseClass.getSimpleName(); - - final String classNamePrefix; - if (javaVersion < 19) { - // For older Java versions, the basic EntitlementChecker interface and implementation contains all the supported checks - classNamePrefix = ""; - } else if (javaVersion < 23) { - classNamePrefix = "Java" + javaVersion; - } else { - // All Java version from 23 onwards will be able to use che checks in the Java23EntitlementChecker interface and implementation - classNamePrefix = "Java23"; - } - - final String className = packageName + "." + classNamePrefix + baseClassName; - Class clazz; - try { - clazz = Class.forName(className); - } catch (ClassNotFoundException e) { - throw new AssertionError("entitlement lib cannot find entitlement class " + className, e); - } - return clazz; - } - private static ElasticsearchEntitlementChecker initChecker() { final PolicyManager policyManager = createPolicyManager(); - final Class clazz = getVersionSpecificCheckerClass(ElasticsearchEntitlementChecker.class, Runtime.version().feature()); + final Class clazz = EntitlementCheckerUtils.getVersionSpecificCheckerClass( + ElasticsearchEntitlementChecker.class, + Runtime.version().feature() + ); Constructor constructor; try {