From 23df3d391e821a920c46bb7ebd9711814dd5d4f6 Mon Sep 17 00:00:00 2001
From: Theresa Mammarella <Theresa.T.Mammarella@ibm.com>
Date: Wed, 29 Jan 2025 09:22:42 -0500
Subject: [PATCH] JDK24 remove System.getSecurityManager part 3

Signed-off-by: Theresa Mammarella <Theresa.T.Mammarella@ibm.com>
---
 .../spi/SharedClassProvider.java              |  4 +++
 .../management/internal/MemoryMXBeanImpl.java |  4 +++
 .../ibm/oti/shared/SharedAbstractHelper.java  | 18 ++++++++--
 .../shared/SharedAbstractHelperFactory.java   |  4 +++
 .../oti/shared/SharedClassAbstractHelper.java |  4 +++
 .../shared/SharedClassHelperFactoryImpl.java  | 36 +++++++++++++++++++
 .../ibm/oti/shared/SharedClassPermission.java |  2 +-
 .../SharedClassPermissionCollection.java      |  2 +-
 .../oti/shared/SharedClassTokenHelper.java    |  4 +++
 .../shared/SharedClassTokenHelperImpl.java    | 11 ++++++
 .../shared/SharedClassURLClasspathHelper.java |  4 +++
 .../SharedClassURLClasspathHelperImpl.java    | 22 ++++++++++++
 .../ibm/oti/shared/SharedClassURLHelper.java  |  4 +++
 .../oti/shared/SharedClassURLHelperImpl.java  | 11 ++++++
 .../ibm/oti/shared/SharedClassUtilities.java  |  8 +++++
 .../com/ibm/oti/shared/SharedDataHelper.java  |  6 ++++
 .../shared/SharedDataHelperFactoryImpl.java   |  6 ++++
 .../ibm/oti/shared/SharedDataHelperImpl.java  | 10 ++++++
 .../provider/SharedClassProviderImpl.java     |  6 ++++
 19 files changed, 162 insertions(+), 4 deletions(-)

diff --git a/jcl/src/java.base/share/classes/com/ibm/sharedclasses/spi/SharedClassProvider.java b/jcl/src/java.base/share/classes/com/ibm/sharedclasses/spi/SharedClassProvider.java
index 012401189fa..432ecde7475 100644
--- a/jcl/src/java.base/share/classes/com/ibm/sharedclasses/spi/SharedClassProvider.java
+++ b/jcl/src/java.base/share/classes/com/ibm/sharedclasses/spi/SharedClassProvider.java
@@ -23,7 +23,9 @@
 package com.ibm.sharedclasses.spi;
 
 import java.net.URL;
+/*[IF JAVA_SPEC_VERSION < 24]*/
 import java.security.BasicPermission;
+/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 import java.util.function.IntConsumer;
 
 /**
@@ -216,6 +218,7 @@ public interface SharedClassProvider {
 	 */
 	public long getFreeSpace();
 
+	/*[IF JAVA_SPEC_VERSION < 24]*/
 	/**
 	 * <p>Constructs a new instance of SharedClassPermission which is a sub-class of BasicPermission.</p>
 	 *
@@ -227,4 +230,5 @@ public interface SharedClassProvider {
 	 * 					A new instance of SharedClassPermission which is a sub-class of BasicPermission, or null if shared classes are not enabled.
 	 */
 	public BasicPermission createPermission(String classLoaderClassName, String actions);
+	/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 }
diff --git a/jcl/src/java.management/share/classes/com/ibm/java/lang/management/internal/MemoryMXBeanImpl.java b/jcl/src/java.management/share/classes/com/ibm/java/lang/management/internal/MemoryMXBeanImpl.java
index 082d26b89a2..1fca0403866 100644
--- a/jcl/src/java.management/share/classes/com/ibm/java/lang/management/internal/MemoryMXBeanImpl.java
+++ b/jcl/src/java.management/share/classes/com/ibm/java/lang/management/internal/MemoryMXBeanImpl.java
@@ -41,7 +41,9 @@
 /*[IF JAVA_SPEC_VERSION >= 9]*/
 import com.ibm.sharedclasses.spi.SharedClassProvider;
 import java.net.URL;
+/*[IF JAVA_SPEC_VERSION < 24]*/
 import java.security.BasicPermission;
+/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 import java.util.ServiceLoader;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.IntConsumer;
@@ -106,10 +108,12 @@ private static final class DisabledSharedClassProvider implements SharedClassPro
 			super();
 		}
 
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		@Override
 		public BasicPermission createPermission(String classLoaderClassName, String actions) {
 			return null;
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 
 		@Override
 		public byte[] findSharedClassURL(URL path, String className) {
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedAbstractHelper.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedAbstractHelper.java
index 4243285582f..0a5a6abee30 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedAbstractHelper.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedAbstractHelper.java
@@ -23,7 +23,9 @@
 package com.ibm.oti.shared;
 
 import java.lang.ref.WeakReference;
+/*[IF JAVA_SPEC_VERSION < 24]*/
 import java.security.AccessControlException;
+/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 
 import com.ibm.oti.util.Msg;
 
@@ -36,11 +38,12 @@
 public abstract class SharedAbstractHelper implements SharedHelper {
 	private Boolean verbose;
 	private WeakReference<ClassLoader> loaderRef;
+	/*[IF JAVA_SPEC_VERSION < 24]*/
 	private SharedClassPermission readPerm;
 	private SharedClassPermission writePerm;
-
 	boolean canFind;
 	boolean canStore;
+	/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 	int id;
 
 	/**
@@ -50,14 +53,23 @@ public SharedAbstractHelper() {
 		super();
 	}
 
+	/*[IF JAVA_SPEC_VERSION >= 24]*/
+	void initialize(ClassLoader loader, int loaderId) {
+		this.id = loaderId;
+		this.loaderRef = new WeakReference<>(loader);
+		/*[MSG "K0591", "Created {0} with id {1}"]*/
+		printVerboseInfo(Msg.getString("K0591", getHelperType(), Integer.valueOf(id))); //$NON-NLS-1$
+	}
+	/*[ELSE] JAVA_SPEC_VERSION >= 24 */
 	void initialize(ClassLoader loader, int loaderId, boolean canLoaderFind, boolean canLoaderStore) {
 		this.id = loaderId;
 		this.canFind = canLoaderFind;
 		this.canStore = canLoaderStore;
-		loaderRef = new WeakReference<>(loader);
+		this.loaderRef = new WeakReference<>(loader);
 		/*[MSG "K0591", "Created {0} with id {1}"]*/
 		printVerboseInfo(Msg.getString("K0591", getHelperType(), Integer.valueOf(id))); //$NON-NLS-1$
 	}
+	/*[ENDIF] JAVA_SPEC_VERSION >= 24 */
 
 	/**
 	 * Utility function. Returns the ClassLoader that owns this SharedHelper.
@@ -73,6 +85,7 @@ public ClassLoader getClassLoader() {
 
 	private native boolean getIsVerboseImpl();
 
+	/*[IF JAVA_SPEC_VERSION < 24]*/
 	/* Do not cache the permission objects, else classloader references will prevent class GC */
 	@SuppressWarnings("removal")
 	private static boolean checkPermission(SecurityManager sm, ClassLoader loader, String type) {
@@ -103,6 +116,7 @@ static boolean checkWritePermission(ClassLoader loader) {
 		}
 		return true; // no security manager means the check is successful
 	}
+	/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 
 	private boolean isVerbose() {
 		if (verbose == null) {
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedAbstractHelperFactory.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedAbstractHelperFactory.java
index 25f34971b85..186824aaeae 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedAbstractHelperFactory.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedAbstractHelperFactory.java
@@ -22,7 +22,9 @@
  */
 package com.ibm.oti.shared;
 
+/*[IF JAVA_SPEC_VERSION < 24]*/
 import java.security.AccessControlException;
+/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -36,6 +38,7 @@ public abstract class SharedAbstractHelperFactory {
 	 */
 	private static final AtomicInteger idCount = new AtomicInteger(1);
 
+	/*[IF JAVA_SPEC_VERSION < 24]*/
 	@SuppressWarnings("removal")
 	static boolean checkPermission(ClassLoader loader, String type) {
 		boolean result = true;
@@ -57,6 +60,7 @@ static boolean canFind(ClassLoader loader) {
 	static boolean canStore(ClassLoader loader) {
 		return checkPermission(loader, "write"); //$NON-NLS-1$
 	}
+	/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 
 	static int getNewID() {
 		return idCount.getAndIncrement();
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassAbstractHelper.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassAbstractHelper.java
index d1733f01494..847e814d62b 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassAbstractHelper.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassAbstractHelper.java
@@ -223,8 +223,11 @@ public Integer run() {
 	 * @param filter the filter to use when finding and storing classes
 	 */
 	@Override
+	/*[IF JAVA_SPEC_VERSION < 24]*/
 	@SuppressWarnings("removal")
+	/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 	public synchronized void setSharingFilter(SharedClassFilter filter) {
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		if (System.getSecurityManager() != null) {
 			ClassLoader loader = getClassLoader();
 			if (loader == null) {
@@ -243,6 +246,7 @@ public synchronized void setSharingFilter(SharedClassFilter filter) {
 				return;
 			}
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 		this.sharedClassFilter = filter;
 	}
 
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassHelperFactoryImpl.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassHelperFactoryImpl.java
index b1a478cf991..63d7649f095 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassHelperFactoryImpl.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassHelperFactoryImpl.java
@@ -149,6 +149,15 @@ public SharedClassTokenHelper getTokenHelper(ClassLoader loader)
 				throw new HelperAlreadyDefinedException(Msg.getString("K059d")); //$NON-NLS-1$
 			/*[ENDIF] JAVA_SPEC_VERSION >= 9 */
 			} else {
+				/*[IF JAVA_SPEC_VERSION >= 24]*/
+				SharedClassTokenHelper result = new SharedClassTokenHelperImpl(loader, getNewID());
+				SharedClassFilter filter = getGlobalSharingFilter();
+				if (filter != null) {
+					result.setSharingFilter(filter);
+				}
+				helpers.put(loader, result);
+				return result;
+				/*[ELSE] JAVA_SPEC_VERSION >= 24 */
 				boolean canFind = canFind(loader);
 				boolean canStore = canStore(loader);
 
@@ -161,9 +170,12 @@ public SharedClassTokenHelper getTokenHelper(ClassLoader loader)
 					helpers.put(loader, result);
 					return result;
 				}
+				/*[ENDIF] JAVA_SPEC_VERSION >= 24 */
 			}
 		}
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		return null;
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 	}
 
 	@Override
@@ -207,6 +219,15 @@ public SharedClassURLHelper getURLHelper(ClassLoader loader)
 				throw new HelperAlreadyDefinedException(Msg.getString("K059d")); //$NON-NLS-1$
 			/*[ENDIF] JAVA_SPEC_VERSION >= 9 */
 			} else {
+				/*[IF JAVA_SPEC_VERSION >= 24]*/
+				SharedClassURLHelper result = new SharedClassURLHelperImpl(loader, getNewID());
+				SharedClassFilter filter = getGlobalSharingFilter();
+				if (filter != null) {
+					result.setSharingFilter(filter);
+				}
+				helpers.put(loader, result);
+				return result;
+				/*[ELSE] JAVA_SPEC_VERSION >= 24 */
 				boolean canFind = canFind(loader);
 				boolean canStore = canStore(loader);
 
@@ -219,9 +240,12 @@ public SharedClassURLHelper getURLHelper(ClassLoader loader)
 					helpers.put(loader, result);
 					return result;
 				}
+				/*[ENDIF] JAVA_SPEC_VERSION >= 24 */
 			}
 		}
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		return null;
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 	}
 
 	@Override
@@ -277,6 +301,15 @@ public SharedClassURLClasspathHelper getURLClasspathHelper(
 				}
 				/*[ENDIF] JAVA_SPEC_VERSION == 8 */
 			} else {
+				/*[IF JAVA_SPEC_VERSION >= 24]*/
+				result = new SharedClassURLClasspathHelperImpl(loader, classpath, getNewID());
+				SharedClassFilter filter = getGlobalSharingFilter();
+				if (filter != null) {
+					result.setSharingFilter(filter);
+				}
+				helpers.put(loader, result);
+				return result;
+				/*[ELSE] JAVA_SPEC_VERSION >= 24 */
 				boolean canFind = canFind(loader);
 				boolean canStore = canStore(loader);
 
@@ -289,9 +322,12 @@ public SharedClassURLClasspathHelper getURLClasspathHelper(
 					helpers.put(loader, result);
 					return result;
 				}
+				/*[ENDIF] JAVA_SPEC_VERSION >= 24 */
 			}
 		}
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		return null;
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 	}
 
 }
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassPermission.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassPermission.java
index db54d92c2aa..5ff81f1d149 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassPermission.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassPermission.java
@@ -1,4 +1,4 @@
-/*[INCLUDE-IF SharedClasses]*/
+/*[INCLUDE-IF SharedClasses & (JAVA_SPEC_VERSION < 24)]*/
 /*
  * Copyright IBM Corp. and others 1998
  *
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassPermissionCollection.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassPermissionCollection.java
index 800b4af2148..fcf1e33700e 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassPermissionCollection.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassPermissionCollection.java
@@ -1,4 +1,4 @@
-/*[INCLUDE-IF SharedClasses]*/
+/*[INCLUDE-IF SharedClasses & (JAVA_SPEC_VERSION < 24)]*/
 /*
  * Copyright IBM Corp. and others 1998
  *
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassTokenHelper.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassTokenHelper.java
index 66f12a768c6..133e3de6c54 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassTokenHelper.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassTokenHelper.java
@@ -40,8 +40,10 @@
  * <p>If a ClassLoader stores multiple versions of the same class by using the same token, only the most recent will be returned by findSharedClass. </p>
  * <h2>Security</h2>
  * <p>A SharedClassHelper will only allow classes to be stored in the cache which were defined by the ClassLoader that owns the SharedClassHelper.</p>
+/*[IF JAVA_SPEC_VERSION < 24]
  * <p>If a SecurityManager is installed, SharedClassPermissions must be used to permit read/write access to the shared class cache.
  * Permissions are granted by ClassLoader classname in the java.policy file and are fixed when the SharedClassHelper is created.</p>
+/*[ENDIF] JAVA_SPEC_VERSION < 24
  * <p>Note also that if the createClassLoader RuntimePermission is not granted, ClassLoaders cannot be created,
  * which in turn means that SharedClassHelpers cannot be created.</p>
  * <h2>Compatibility with other SharedClassHelpers</h2>
@@ -49,7 +51,9 @@
  *
  * @see SharedClassHelper
  * @see SharedClassHelperFactory
+/*[IF JAVA_SPEC_VERSION < 24]
  * @see SharedClassPermission
+/*[ENDIF] JAVA_SPEC_VERSION < 24
  */
 public interface SharedClassTokenHelper extends SharedClassHelper {
 
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassTokenHelperImpl.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassTokenHelperImpl.java
index 1b0953aa2a4..4ba3502bbb9 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassTokenHelperImpl.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassTokenHelperImpl.java
@@ -33,10 +33,17 @@
  */
 final class SharedClassTokenHelperImpl extends SharedClassAbstractHelper implements SharedClassTokenHelper {
 	/* Not public - should only be created by factory */
+	/*[IF JAVA_SPEC_VERSION >= 24]*/
+	SharedClassTokenHelperImpl(ClassLoader loader, int id) {
+		initialize(loader, id);
+		initializeShareableClassloader(loader);
+	}
+	/*[ELSE] JAVA_SPEC_VERSION >= 24 */
 	SharedClassTokenHelperImpl(ClassLoader loader, int id, boolean canFind, boolean canStore) {
 		initialize(loader, id, canFind, canStore);
 		initializeShareableClassloader(loader);
 	}
+	/*[ENDIF] JAVA_SPEC_VERSION >= 24 */
 
 	private native boolean findSharedClassImpl2(int loaderId, String className, ClassLoader loader, String token,
 			boolean doFind, boolean doStore, byte[] romClassCookie);
@@ -51,9 +58,11 @@ public byte[] findSharedClass(String token, String className) {
 			printVerboseInfo(Msg.getString("K059f")); //$NON-NLS-1$
 			return null;
 		}
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		if (!canFind) {
 			return null;
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 		if (token==null) {
 			/*[MSG "K05a0", "Cannot call findSharedClass with null token. Returning null."]*/
 			printVerboseError(Msg.getString("K05a0")); //$NON-NLS-1$
@@ -90,9 +99,11 @@ public byte[] findSharedClass(String token, String className) {
 
 	@Override
 	public boolean storeSharedClass(String token, Class<?> clazz) {
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		if (!canStore) {
 			return false;
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 		if (token==null) {
 			/*[MSG "K05a2", "Cannot call storeSharedClass with null token. Returning false."]*/
 			printVerboseError(Msg.getString("K05a2")); //$NON-NLS-1$
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLClasspathHelper.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLClasspathHelper.java
index aebaa21a4a0..c7126fd38c8 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLClasspathHelper.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLClasspathHelper.java
@@ -113,8 +113,10 @@
  * <p>If findSharedClass returns null, then load the class from disk, cache the metadata from the entry anyway, define the class, and store it.</p>
  * <h2>Security</h2>
  * <p>A SharedClassHelper will only allow classes that were defined by the ClassLoader that owns the SharedClassHelper to be stored in the cache.</p>
+/*[IF JAVA_SPEC_VERSION < 24]
  * <p>If a SecurityManager is installed, SharedClassPermissions must be used to permit read/write access to the shared class cache.
  * Permissions are granted by ClassLoader classname in the java.policy file and are fixed when the SharedClassHelper is created.</p>
+/*[ENDIF] JAVA_SPEC_VERSION < 24
  * <p>Note also that if the createClassLoader RuntimePermission is not granted, ClassLoaders cannot be created,
  * which in turn means that SharedClassHelpers cannot be created.</p>
  * <h2>Efficient use of the SharedClassURLClasspathHelper</h2>
@@ -131,7 +133,9 @@
  *
  * @see SharedClassURLClasspathHelper
  * @see SharedClassHelperFactory
+/*[IF JAVA_SPEC_VERSION < 24]
  * @see SharedClassPermission
+/*[ENDIF] JAVA_SPEC_VERSION < 24
  */
 public interface SharedClassURLClasspathHelper extends SharedClassHelper {
 
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLClasspathHelperImpl.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLClasspathHelperImpl.java
index c48862aa475..aed2fa5e0f1 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLClasspathHelperImpl.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLClasspathHelperImpl.java
@@ -49,6 +49,23 @@ final class SharedClassURLClasspathHelperImpl extends SharedClassAbstractHelper
 	}
 
 	/* Not public - should only be created by factory */
+	/*[IF JAVA_SPEC_VERSION >= 24]*/
+	SharedClassURLClasspathHelperImpl(ClassLoader loader, URL[] classpath, int id) {
+		this.origurls = classpath;
+		this.urls = new URL[classpath.length];
+		this.urlCount = classpath.length;
+		this.validated = new boolean[classpath.length];
+		this.confirmedCount = 0;
+		this.invalidURLExists = false;
+		urlcpReadWriteLock = new ReentrantReadWriteLock();
+		initialize(loader, id);
+		initializeShareableClassloader(loader);
+		initializeURLs();
+		if (!invalidURLExists) {
+			notifyClasspathChange3(id, loader, this.urls, 0, this.urlCount, true);
+		}
+	}
+	/*[ELSE] JAVA_SPEC_VERSION >= 24 */
 	SharedClassURLClasspathHelperImpl(ClassLoader loader, URL[] classpath, int id, boolean canFind, boolean canStore) {
 		this.origurls = classpath;
 		this.urls = new URL[classpath.length];
@@ -64,6 +81,7 @@ final class SharedClassURLClasspathHelperImpl extends SharedClassAbstractHelper
 			notifyClasspathChange3(id, loader, this.urls, 0, this.urlCount, true);
 		}
 	}
+	/*[ENDIF] JAVA_SPEC_VERSION >= 24 */
 
 	private void initializeURLs() {
 		for (int i=0; i<urlCount; i++) {
@@ -102,9 +120,11 @@ public byte[] findSharedClass(String partition, String className, IndexHolder in
 			printVerboseInfo(Msg.getString("K059f")); //$NON-NLS-1$
 			return null;
 		}
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		if (!canFind) {
 			return null;
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 		if (className==null) {
 			/*[MSG "K05a1", "Cannot call findSharedClass with null class name. Returning null."]*/
 			printVerboseError(Msg.getString("K05a1")); //$NON-NLS-1$
@@ -168,9 +188,11 @@ public boolean storeSharedClass(Class<?> clazz, int foundAtIndex) {
 
 	@Override
 	public boolean storeSharedClass(String partition, Class<?> clazz, int foundAtIndex) {
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		if (!canStore) {
 			return false;
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 		if (clazz==null) {
 			/*[MSG "K05a3", "Cannot call storeSharedClass with null Class. Returning false."]*/
 			printVerboseError(Msg.getString("K05a3")); //$NON-NLS-1$
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLHelper.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLHelper.java
index 6000a5923e6..b5866247408 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLHelper.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLHelper.java
@@ -61,8 +61,10 @@
  *   any metadata that it needs from disk before defining the classes.</p>
  * <h2>Security</h2>
  * <p>A SharedClassHelper will only allow classes that were defined by the ClassLoader that owns the SharedClassHelper to be stored in the cache.</p>
+/*[IF JAVA_SPEC_VERSION < 24]
  * <p>If a SecurityManager is installed, SharedClassPermissions must be used to permit read/write access to the shared class cache.
  * Permissions are granted by ClassLoader classname in the java.policy file and are fixed when the SharedClassHelper is created.</p>
+/*[ENDIF] JAVA_SPEC_VERSION < 24
  * <p>Note also that if the createClassLoader RuntimePermission is not granted, ClassLoaders cannot be created,
  * which in turn means that SharedClassHelpers cannot be created.</p>
  * <h2>Compatibility with other SharedClassHelpers</h2>
@@ -71,7 +73,9 @@
  *
  * @see SharedClassURLHelper
  * @see SharedClassHelperFactory
+/*[IF JAVA_SPEC_VERSION < 24]
  * @see SharedClassPermission
+/*[ENDIF] JAVA_SPEC_VERSION < 24
  */
 public interface SharedClassURLHelper extends SharedClassHelper {
 
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLHelperImpl.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLHelperImpl.java
index 2e35c2a914c..2fa4b06bd6e 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLHelperImpl.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassURLHelperImpl.java
@@ -47,10 +47,17 @@ final class SharedClassURLHelperImpl extends SharedClassAbstractHelper implement
 	// This field is examined using the CDS adaptor
 	public static final boolean MINIMIZE_ENABLED = true;
 
+	/*[IF JAVA_SPEC_VERSION >= 24]*/
+	SharedClassURLHelperImpl(ClassLoader loader, int id) {
+		initialize(loader, id);
+		initializeShareableClassloader(loader);
+	}
+	/*[ELSE] JAVA_SPEC_VERSION >= 24 */
 	SharedClassURLHelperImpl(ClassLoader loader, int id, boolean canFind, boolean canStore) {
 		initialize(loader, id, canFind, canStore);
 		initializeShareableClassloader(loader);
 	}
+	/*[ENDIF] JAVA_SPEC_VERSION >= 24 */
 
 	private static native void init();
 
@@ -109,9 +116,11 @@ public byte[] findSharedClass(String partition, URL path, String className) {
 			printVerboseInfo(Msg.getString("K059f")); //$NON-NLS-1$
 			return null;
 		}
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		if (!canFind) {
 			return null;
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 		if (path==null) {
 			/*[MSG "K05b3", "Cannot call findSharedClass with null URL. Returning null."]*/
 			printVerboseError(Msg.getString("K05b3")); //$NON-NLS-1$
@@ -160,9 +169,11 @@ public boolean storeSharedClass(URL path, Class<?> clazz) {
 
 	@Override
 	public boolean storeSharedClass(String partition, URL path, Class<?> clazz) {
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		if (!canStore) {
 			return false;
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 		if (path==null) {
 			/*[MSG "K05b4", "Cannot call storeSharedClass with null URL. Returning false."]*/
 			printVerboseError(Msg.getString("K05b4")); //$NON-NLS-1$
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassUtilities.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassUtilities.java
index a1b96726ade..97877952240 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassUtilities.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedClassUtilities.java
@@ -119,16 +119,20 @@ public class SharedClassUtilities {
 	 * 					If shared classes is disabled for this JVM (that is -Xshareclasses:none is present).
 	 * @throws		IllegalArgumentException
 	 * 					If <code>flags</code> is not a valid value.
+	/*[IF JAVA_SPEC_VERSION < 24]
 	 * @throws		SecurityException
 	 * 					If a security manager is enabled and the calling thread does not
 	 * 					have SharedClassesNamedPermission("getSharedCacheInfo")
+	/*[ENDIF] JAVA_SPEC_VERSION < 24
 	 */
 	public static List<SharedClassCacheInfo> getSharedCacheInfo(String cacheDir, int flags, boolean useCommandLineValues) {
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		@SuppressWarnings("removal")
 		SecurityManager sm = System.getSecurityManager();
 		if (sm != null) {
 			sm.checkPermission(SharedPermissions.getSharedCacheInfo);
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 
 		if (flags != NO_FLAGS) {
 			/*[MSG "K0553", "parameter {0} has invalid value"]*/
@@ -191,16 +195,20 @@ public static List<SharedClassCacheInfo> getSharedCacheInfo(String cacheDir, int
 	 * 					If shared classes is disabled for this JVM (that is -Xshareclasses:none is present).
 	 * @throws		IllegalArgumentException
 	 * 					If <code>cacheType</code> is not a valid value.
+	/*[IF JAVA_SPEC_VERSION < 24]
 	 * @throws		SecurityException
 	 * 					If a security manager is enabled and the calling thread does not
 	 * 					have SharedClassesNamedPermission("destroySharedCache")
+	/*[ENDIF] JAVA_SPEC_VERSION < 24
 	 */
 	public static int destroySharedCache(String cacheDir, int cacheType, String cacheName, boolean useCommandLineValues) {
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		@SuppressWarnings("removal")
 		SecurityManager sm = System.getSecurityManager();
 		if (sm != null) {
 			sm.checkPermission(SharedPermissions.destroySharedCache);
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 
 		/*
 		 * check if cacheType has a valid value only if we are not using command line values.
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelper.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelper.java
index f2afeb4dcca..ac484e1ee61 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelper.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelper.java
@@ -47,7 +47,9 @@
  *
  * @see SharedHelper
  * @see SharedDataHelperFactory
+/*[IF JAVA_SPEC_VERSION < 24]
  * @see SharedClassPermission
+/*[ENDIF] JAVA_SPEC_VERSION < 24
  */
 public interface SharedDataHelper extends SharedHelper {
 
@@ -55,8 +57,10 @@ public interface SharedDataHelper extends SharedHelper {
 	 * Find data in the shared cache using a specific token.<p>
 	 * Data will be returned only for an exact String match of the token. Otherwise, null is returned.<br>
 	 * The ByteBuffer returned is read-only and cannot be modified.<br>
+	/*[IF JAVA_SPEC_VERSION < 24]
 	 * If a SecurityManager is installed, findSharedData can only be called by code whose caller-classloader
 	 * has been granted <q>read</q> permissions to the shared class cache.
+	/*[ENDIF] JAVA_SPEC_VERSION < 24
 	 *
 	 * @param token a token to be used as a key
 	 *
@@ -70,8 +74,10 @@ public interface SharedDataHelper extends SharedHelper {
 	 * If data already exists for the token specified, the old data is marked <q>stale</q> in the cache and is replaced by the new data.<br>
 	 * If the exact same data already exists in the cache under the same token, the data is not duplicated and the cached version is returned.<br>
 	 * If null is passed as the data argument, the data currently stored against that token is marked <q>stale</q> and null is returned.<br>
+	/*[IF JAVA_SPEC_VERSION < 24]
 	 * If a SecurityManager is installed, storeSharedData can only be called by code whose caller-classloader
 	 * has been granted <q>write</q> permissions to the shared class cache.
+	/*[ENDIF] JAVA_SPEC_VERSION < 24
 	 *
 	 * @param token a token to be used as a key
 	 * @param data a ByteBuffer of data to copy to the cache
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelperFactoryImpl.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelperFactoryImpl.java
index e7b5ee4c08f..622d9493980 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelperFactoryImpl.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelperFactoryImpl.java
@@ -52,6 +52,11 @@ public SharedDataHelper getDataHelper(ClassLoader owner) {
 					return (SharedDataHelper)helper;
 				}
 			} else {
+				/*[IF JAVA_SPEC_VERSION >= 24]*/
+				SharedDataHelper result = new SharedDataHelperImpl(owner, getNewID());
+				helpers.put(owner, result);
+				return result;
+				/*[ELSE] JAVA_SPEC_VERSION >= 24 */
 				boolean canFind = canFind(owner);
 				boolean canStore = canStore(owner);
 
@@ -60,6 +65,7 @@ public SharedDataHelper getDataHelper(ClassLoader owner) {
 					helpers.put(owner, result);
 					return result;
 				}
+				/*[ENDIF] JAVA_SPEC_VERSION >= 24 */
 			}
 		}
 		return null;
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelperImpl.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelperImpl.java
index d7b4b5c68c1..de649e0572c 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelperImpl.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/SharedDataHelperImpl.java
@@ -35,9 +35,15 @@
  */
 final class SharedDataHelperImpl extends SharedAbstractHelper implements SharedDataHelper {
 	/* Not public - should only be created by factory */
+	/*[IF JAVA_SPEC_VERSION >= 24]*/
+	SharedDataHelperImpl(ClassLoader loader, int id) {
+		initialize(loader, id);
+	}
+	/*[ELSE] JAVA_SPEC_VERSION >= 24 */
 	SharedDataHelperImpl(ClassLoader loader, int id, boolean canFind, boolean canStore) {
 		initialize(loader, id, canFind, canStore);
 	}
+	/*[ENDIF] JAVA_SPEC_VERSION >= 24 */
 
 	private native ByteBuffer findSharedDataImpl(int loaderId, String token);
 
@@ -51,6 +57,7 @@ public ByteBuffer findSharedData(String token) {
 			printVerboseInfo(Msg.getString("K059f")); //$NON-NLS-1$
 			return null;
 		}
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		if (!canFind) {
 			return null;
 		}
@@ -59,6 +66,7 @@ public ByteBuffer findSharedData(String token) {
 			printVerboseError(Msg.getString("K05b5")); //$NON-NLS-1$
 			return null;
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 		if (token==null) {
 			/*[MSG "K05b6", "Cannot call findSharedData with null token. Returning null."]*/
 			printVerboseError(Msg.getString("K05b6")); //$NON-NLS-1$
@@ -75,6 +83,7 @@ public ByteBuffer storeSharedData(String token, ByteBuffer data) {
 			printVerboseInfo(Msg.getString("K059f")); //$NON-NLS-1$
 			return null;
 		}
+		/*[IF JAVA_SPEC_VERSION < 24]*/
 		if (!canStore) {
 			return null;
 		}
@@ -83,6 +92,7 @@ public ByteBuffer storeSharedData(String token, ByteBuffer data) {
 			printVerboseError(Msg.getString("K05b7")); //$NON-NLS-1$
 			return null;
 		}
+		/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 		if (token==null) {
 			/*[MSG "K05b8", "Cannot call storeSharedData with null token. Returning null."]*/
 			printVerboseError(Msg.getString("K05b8")); //$NON-NLS-1$
diff --git a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/provider/SharedClassProviderImpl.java b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/provider/SharedClassProviderImpl.java
index e5bd52cedfe..4d3dbfd3018 100644
--- a/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/provider/SharedClassProviderImpl.java
+++ b/jcl/src/openj9.sharedclasses/share/classes/com/ibm/oti/shared/provider/SharedClassProviderImpl.java
@@ -24,14 +24,18 @@
 package com.ibm.oti.shared.provider;
 
 import java.net.URL;
+/*[IF JAVA_SPEC_VERSION < 24]*/
 import java.security.BasicPermission;
+/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 import java.util.function.IntConsumer;
 import com.ibm.sharedclasses.spi.SharedClassProvider;
 import com.ibm.oti.shared.CannotSetClasspathException;
 import com.ibm.oti.shared.HelperAlreadyDefinedException;
 import com.ibm.oti.shared.Shared;
 import com.ibm.oti.shared.SharedClassHelperFactory;
+/*[IF JAVA_SPEC_VERSION < 24]*/
 import com.ibm.oti.shared.SharedClassPermission;
+/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 import com.ibm.oti.shared.SharedClassStatistics;
 import com.ibm.oti.shared.SharedClassURLClasspathHelper;
 import com.ibm.oti.shared.SharedClassURLHelper;
@@ -196,6 +200,7 @@ public long getFreeSpace() {
 			return 0;
 		}
 	}
+	/*[IF JAVA_SPEC_VERSION < 24]*/
 	@Override
 	public BasicPermission createPermission(String classLoaderClassName, String actions) {
 		if (!isSharedClassEnabled()) {
@@ -203,4 +208,5 @@ public BasicPermission createPermission(String classLoaderClassName, String acti
 		}
 		return new SharedClassPermission(classLoaderClassName, actions);
 	}
+	/*[ENDIF] JAVA_SPEC_VERSION < 24 */
 }