Prepare for the removal of the securitymanager in moxy. (#1320)

Signed-off-by: Tomas Kraus <tomas.kraus@oracle.com>
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java
index e7dc532..4b893d2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java
@@ -27,6 +27,9 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -96,6 +99,102 @@
 
     /**
      * INTERNAL
+     * A task that returns a result and shall not throw an exception.
+     * Implementors define a single {@code call()} method with no arguments.
+     *
+     * @param <T> the result type of method call
+     */
+    @FunctionalInterface
+    public interface PrivilegedCallable<T> {
+        T call();
+    }
+
+    /**
+     * INTERNAL
+     * A task that returns a result and may throw an exception.
+     * Implementors define a single {@code call()} method with no arguments.
+     *
+     * @param <T> the result type of method call
+     */
+    @FunctionalInterface
+    public interface PrivilegedExceptionCallable<T> {
+        T call() throws Exception;
+    }
+
+    /**
+     * INTERNAL
+     * Specific {@code Exception} supplier for {@link PrivilegedExceptionCallable}.
+     *
+     * @param <E> specific {@link Exception} type
+     */
+    @FunctionalInterface
+    public interface CallableExceptionSupplier<E extends Exception> {
+        E get(Exception e);
+    }
+
+    /**
+     * INTERNAL
+     * Executes provided {@link PrivilegedCallable} task using {@link AccessController#doPrivileged(PrivilegedAction)}
+     * when privileged access is enabled.
+     *
+     * @param <T> {@link PrivilegedCallable} return type
+     * @param task task to execute
+     */
+    @SuppressWarnings("removal")
+    public static <T> T callDoPrivileged(PrivilegedCallable<T> task) {
+        if (shouldUsePrivilegedAccess()) {
+            return AccessController.doPrivileged((PrivilegedAction<T>) task::call);
+        } else {
+            return task.call();
+        }
+    }
+
+    /**
+     * INTERNAL
+     * Executes provided {@link PrivilegedExceptionCallable} task using {@link AccessController#doPrivileged(PrivilegedExceptionAction)}
+     * when privileged access is enabled.
+     *
+     * @param <T> {@link PrivilegedExceptionCallable} return type
+     * @param task task to execute
+     */
+    @SuppressWarnings("removal")
+    public static <T> T callDoPrivilegedWithException(PrivilegedExceptionCallable<T> task) throws Exception {
+        if (shouldUsePrivilegedAccess()) {
+            try {
+                return AccessController.doPrivileged((PrivilegedExceptionAction<T>) task::call);
+            // AccessController.doPrivileged wraps Exception instances with PrivilegedActionException. Let's unwrap them
+            // to provide the same exception output as original callable without AccessController.doPrivileged
+            } catch (PrivilegedActionException pae) {
+                throw pae.getException();
+            }
+        } else {
+            return task.call();
+        }
+    }
+
+    /**
+     * INTERNAL
+     * Executes provided {@link PrivilegedExceptionCallable} task using {@link AccessController#doPrivileged(PrivilegedExceptionAction)}
+     * when privileged access is enabled.
+     * If {@link Exception} is thrown from task, it will be processed by provided {@link CallableExceptionSupplier}.
+     *
+     * @param <T> {@link PrivilegedExceptionCallable} return type
+     * @param <E> specific {@link Exception} type
+     * @param task task to execute
+     * @param exception specific {@link Exception} supplier
+     */
+    @SuppressWarnings("removal")
+    public static <T,E extends Exception> T callDoPrivilegedWithException(
+            PrivilegedExceptionCallable<T> task, CallableExceptionSupplier<E> exception) throws E {
+        try {
+            return callDoPrivilegedWithException(task);
+        } catch (Exception e) {
+            throw exception.get(e);
+        }
+    }
+
+    /**
+     * INTERNAL
      * It will be used to set default value of property "eclipselink.security.usedoprivileged"
      * if not passed as system property. This is used by GlassfishPlatform.
      */
diff --git a/jpa/org.eclipse.persistence.jpars.server/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapter.java b/jpa/org.eclipse.persistence.jpars.server/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapter.java
index 164bde1..af34ff8 100644
--- a/jpa/org.eclipse.persistence.jpars.server/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapter.java
+++ b/jpa/org.eclipse.persistence.jpars.server/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapter.java
@@ -19,6 +19,8 @@
 import java.util.Map;
 import java.util.Vector;
 
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
+
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.descriptors.InheritancePolicy;
 import org.eclipse.persistence.internal.descriptors.InstantiationPolicy;
@@ -31,7 +33,6 @@
 import org.eclipse.persistence.internal.jpa.rs.weaving.PersistenceWeavedRest;
 import org.eclipse.persistence.internal.jpa.rs.weaving.RestAdapterClassWriter;
 import org.eclipse.persistence.internal.queries.CollectionContainerPolicy;
-import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.jaxb.DefaultXMLNameTransformer;
 import org.eclipse.persistence.jpa.rs.exceptions.JPARSException;
 import org.eclipse.persistence.jpa.rs.util.xmladapters.RelationshipLinkAdapter;
@@ -328,7 +329,8 @@
                         xmlChoiceMapping.addChoiceElement(compositeMapping.getXPath(), Link.class);
                         xmlChoiceMapping.addChoiceElement(compositeMapping.getXPath(), refDesc.getJavaClass());
 
-                        xmlChoiceMapping.setConverter(new XMLJavaTypeConverter(Class.forName(adapterClassName, true, cl)));
+                        xmlChoiceMapping.setConverter(new XMLJavaTypeConverter(
+                                (Class<? extends XmlAdapter<?,?>>) Class.forName(adapterClassName, true, cl)));
                         jaxbDescriptor.removeMappingForAttributeName(jaxbMapping.getAttributeName());
                         jaxbDescriptor.addMapping(xmlChoiceMapping);
 
@@ -343,7 +345,8 @@
                         xmlChoiceMapping.addChoiceElement(compositeMapping.getXPath(), refDesc.getJavaClass());
 
                         xmlChoiceMapping.setContainerPolicy(jaxbMapping.getContainerPolicy());
-                        xmlChoiceMapping.setConverter(new XMLJavaTypeConverter(Class.forName(adapterClassName, true, cl)));
+                        xmlChoiceMapping.setConverter(new XMLJavaTypeConverter(
+                                (Class<? extends XmlAdapter<?,?>>) Class.forName(adapterClassName, true, cl)));
                         jaxbDescriptor.removeMappingForAttributeName(jaxbMapping.getAttributeName());
                         jaxbDescriptor.addMapping(xmlChoiceMapping);
                     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/MultiArgInstantiationPolicy.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/MultiArgInstantiationPolicy.java
index 4e5bd50..ee022db 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/MultiArgInstantiationPolicy.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/MultiArgInstantiationPolicy.java
@@ -15,15 +15,11 @@
 package org.eclipse.persistence.internal.jaxb;
 
 import java.lang.reflect.InvocationTargetException;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
 
 import org.eclipse.persistence.exceptions.DescriptorException;
 import org.eclipse.persistence.exceptions.ValidationException;
 import org.eclipse.persistence.internal.descriptors.InstantiationPolicy;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedClassForName;
-import org.eclipse.persistence.internal.security.PrivilegedMethodInvoker;
 
 /**
  * Purpose:
@@ -60,20 +56,12 @@
             if(parameterTypeNames != null) {
                 Class<?>[] values = new Class<?>[parameterTypeNames.length];
                 for(int i = 0; i < values.length; i++) {
-                    try{
-                        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                            try {
-                                values[i] = AccessController.doPrivileged(new PrivilegedClassForName<>(parameterTypeNames[i], true, loader));
-                            } catch (PrivilegedActionException exception) {
-                                throw ValidationException.classNotFoundWhileConvertingClassNames(parameterTypeNames[i], exception.getException());
-                            }
-                        } else {
-                            values[i] = org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(parameterTypeNames[i], true, loader);
-                        }
-                    } catch (ClassNotFoundException exc){
-                        throw ValidationException.classNotFoundWhileConvertingClassNames(factoryClassName, exc);
-                    }
-                }
+                    final String parameterTypeName = parameterTypeNames[i];
+                    values[i] = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                            () -> org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(parameterTypeName, true, loader),
+                            (ex) -> ValidationException.classNotFoundWhileConvertingClassNames(factoryClassName, ex)
+                    );
+                 }
                 this.parameterTypes = values;
             }
         }
@@ -102,30 +90,20 @@
      */
     @Override
     protected Object buildNewInstanceUsingFactory() throws DescriptorException {
-        try {
-            // If the method is static, the first argument is ignored and can be null
-            if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                try {
-                    return AccessController.doPrivileged(new PrivilegedMethodInvoker(getMethod(), getFactory(), this.defaultValues));
-                } catch (PrivilegedActionException exception) {
-                    Exception throwableException = exception.getException();
-                    if (throwableException instanceof IllegalAccessException) {
-                        throw DescriptorException.illegalAccessWhileMethodInstantiation(getMethod().toString(), this.getDescriptor(), throwableException);
+        return PrivilegedAccessHelper.callDoPrivilegedWithException(
+                () -> PrivilegedAccessHelper.invokeMethod(getMethod(), getFactory(), this.defaultValues),
+                (ex) -> {
+                    if (ex instanceof IllegalAccessException) {
+                        return DescriptorException.illegalAccessWhileMethodInstantiation(getMethod().toString(), this.getDescriptor(), ex);
+                    } else if (ex instanceof InvocationTargetException) {
+                        return DescriptorException.targetInvocationWhileMethodInstantiation(getMethod().toString(), this.getDescriptor(), ex);
+                    } else if (ex instanceof NullPointerException) {
+                        return DescriptorException.nullPointerWhileMethodInstantiation(this.getMethod().toString(), this.getDescriptor(), ex);
                     } else {
-                        throw DescriptorException.targetInvocationWhileMethodInstantiation(getMethod().toString(), this.getDescriptor(), throwableException);
+                        return new RuntimeException("Unexpected exception from MultiArgInstantiationPolicy.buildNewInstanceUsingFactory()", ex);
                     }
                 }
-            } else {
-                return PrivilegedAccessHelper.invokeMethod(getMethod(), getFactory(), this.defaultValues);
-            }
-        } catch (IllegalAccessException exception) {
-            throw DescriptorException.illegalAccessWhileMethodInstantiation(getMethod().toString(), this.getDescriptor(), exception);
-        } catch (InvocationTargetException exception) {
-            throw DescriptorException.targetInvocationWhileMethodInstantiation(getMethod().toString(), this.getDescriptor(), exception);
-        } catch (NullPointerException exception) {
-            // Some JVMs will throw a NULL pointer exception here
-            throw DescriptorException.nullPointerWhileMethodInstantiation(this.getMethod().toString(), this.getDescriptor(), exception);
-        }
+        );
     }
 
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/XMLJavaTypeConverter.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/XMLJavaTypeConverter.java
index b4fff8a..03b24be 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/XMLJavaTypeConverter.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/XMLJavaTypeConverter.java
@@ -16,12 +16,12 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Type;
-import java.security.AccessController;
 import java.util.HashMap;
 
-import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 import javax.xml.namespace.QName;
 
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
+
 import org.eclipse.persistence.core.mappings.converters.CoreConverter;
 import org.eclipse.persistence.exceptions.ConversionException;
 import org.eclipse.persistence.exceptions.JAXBException;
@@ -29,9 +29,6 @@
 import org.eclipse.persistence.internal.oxm.XMLConversionManager;
 import org.eclipse.persistence.internal.oxm.mappings.BinaryDataMapping;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedClassForName;
-import org.eclipse.persistence.internal.security.PrivilegedGetConstructorFor;
-import org.eclipse.persistence.internal.security.PrivilegedNewInstanceFromClass;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.jaxb.JAXBMarshaller;
 import org.eclipse.persistence.jaxb.JAXBUnmarshaller;
@@ -51,12 +48,12 @@
 public class XMLJavaTypeConverter extends org.eclipse.persistence.oxm.mappings.converters.XMLConverterAdapter {
     protected Class<?> boundType = Object.class;
     protected Class<?> valueType = Object.class;
-    protected Class<?> xmlAdapterClass;
+    protected Class<? extends XmlAdapter<?,?>> xmlAdapterClass;
     protected String xmlAdapterClassName;
-    protected XmlAdapter xmlAdapter;
+    protected XmlAdapter<?,?> xmlAdapter;
     protected QName schemaType;
     protected DatabaseMapping mapping;
-    protected CoreConverter nestedConverter;
+    protected CoreConverter<DatabaseMapping, Session> nestedConverter;
 
     /**
      * The default constructor.  This constructor should be used
@@ -71,8 +68,9 @@
      * converter.
      *
      */
+    @SuppressWarnings("unchecked")
     public XMLJavaTypeConverter(Class<?> xmlAdapterClass) {
-        setXmlAdapterClass(xmlAdapterClass);
+        setXmlAdapterClass((Class<XmlAdapter<?,?>>) xmlAdapterClass);
     }
 
     /**
@@ -92,9 +90,10 @@
      * will occur during marshal.
      *
      */
+    @SuppressWarnings("unchecked")
     public XMLJavaTypeConverter(Class<?> xmlAdapterClass, QName schemaType) {
         setSchemaType(schemaType);
-        setXmlAdapterClass(xmlAdapterClass);
+        setXmlAdapterClass((Class<XmlAdapter<?,?>>) xmlAdapterClass);
     }
 
     /**
@@ -116,11 +115,13 @@
     @Override
     public Object convertDataValueToObjectValue(Object dataValue, Session session, XMLUnmarshaller unmarshaller) {
         try {
-            XmlAdapter adapter = this.xmlAdapter;
+            XmlAdapter<?, ?> adapter = this.xmlAdapter;
             if (unmarshaller != null) {
-                HashMap adapters = (HashMap) unmarshaller.getProperty(JAXBUnmarshaller.XML_JAVATYPE_ADAPTERS);
+                @SuppressWarnings("unchecked")
+                HashMap<Class<XmlAdapter<?,?>>, XmlAdapter<?, ?>> adapters
+                        = (HashMap<Class<XmlAdapter<?,?>>, XmlAdapter<?, ?>>) unmarshaller.getProperty(JAXBUnmarshaller.XML_JAVATYPE_ADAPTERS);
                 if (adapters != null) {
-                    XmlAdapter runtimeAdapter = (XmlAdapter) adapters.get(this.xmlAdapterClass);
+                    XmlAdapter<?, ?> runtimeAdapter = adapters.get(this.xmlAdapterClass);
                     if (runtimeAdapter != null) {
                         adapter = runtimeAdapter;
                     }
@@ -143,7 +144,8 @@
                     }
                 }
             }
-            return adapter.unmarshal(toConvert);
+            //noinspection unchecked
+            return ((XmlAdapter<Object, ?>)adapter).unmarshal(toConvert);
         } catch (Exception ex) {
             if(unmarshaller == null || unmarshaller.getErrorHandler() == null){
                 throw ConversionException.couldNotBeConverted(dataValue, boundType, ex);
@@ -163,17 +165,20 @@
     @Override
     public Object convertObjectValueToDataValue(Object objectValue, Session session, XMLMarshaller marshaller) {
         try {
-            XmlAdapter adapter = this.xmlAdapter;
+            XmlAdapter<?, ?> adapter = this.xmlAdapter;
             if (marshaller != null) {
-                HashMap adapters = (HashMap) marshaller.getProperty(JAXBMarshaller.XML_JAVATYPE_ADAPTERS);
+                @SuppressWarnings("unchecked")
+                HashMap<Class<XmlAdapter<?,?>>, XmlAdapter<?,?>> adapters
+                        = (HashMap<Class<XmlAdapter<?,?>>, XmlAdapter<?,?>>) marshaller.getProperty(JAXBMarshaller.XML_JAVATYPE_ADAPTERS);
                 if (adapters != null) {
-                    XmlAdapter runtimeAdapter = (XmlAdapter) adapters.get(this.xmlAdapterClass);
+                    XmlAdapter<?,?> runtimeAdapter = adapters.get(this.xmlAdapterClass);
                     if (runtimeAdapter != null) {
                         adapter = runtimeAdapter;
                     }
                 }
             }
-            Object dataValue = adapter.marshal(objectValue);
+            @SuppressWarnings("unchecked")
+            Object dataValue = ((XmlAdapter<?, Object>) adapter).marshal(objectValue);
             if(nestedConverter != null) {
                 dataValue = nestedConverter.convertObjectValueToDataValue(dataValue, session);
             }
@@ -203,7 +208,7 @@
      *
      * @return xmlAdapterClass
      */
-    public Class<?> getXmlAdapterClass() {
+    public Class<? extends XmlAdapter<?,?>> getXmlAdapterClass() {
         return xmlAdapterClass;
     }
 
@@ -231,15 +236,10 @@
         // if the adapter class is null, try the adapter class name
         ClassLoader loader = session.getDatasourceLogin().getDatasourcePlatform().getConversionManager().getLoader();
         if (xmlAdapterClass == null) {
-            try {
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    xmlAdapterClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getXmlAdapterClassName(), true, loader));
-                } else {
-                    xmlAdapterClass = PrivilegedAccessHelper.getClassForName(getXmlAdapterClassName(), true, loader);
-                }
-            } catch (Exception e) {
-                throw JAXBException.adapterClassNotLoaded(getXmlAdapterClassName(), e);
-            }
+            xmlAdapterClass = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                    () -> PrivilegedAccessHelper.getClassForName(getXmlAdapterClassName(), true, loader),
+                    (ex) -> JAXBException.adapterClassNotLoaded(getXmlAdapterClassName(), ex)
+            );
         }
 
         // validate adapter class extends jakarta.xml.bind.annotation.adapters.XmlAdapter
@@ -248,29 +248,23 @@
         }
 
         setBoundTypeAndValueTypeInCaseOfGenericXmlAdapter();
-
         try {
-        try {
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    xmlAdapter = (XmlAdapter) AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(getXmlAdapterClass()));
-                } else {
-                    xmlAdapter = (XmlAdapter) PrivilegedAccessHelper.newInstanceFromClass(getXmlAdapterClass());
-                }
+            try {
+                xmlAdapter = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.newInstanceFromClass(getXmlAdapterClass())
+                );
             } catch (IllegalAccessException e) {
-                Constructor ctor = null;
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                        ctor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(xmlAdapterClass, new Class<?>[0], true));
-                } else {
-                    ctor = PrivilegedAccessHelper.getDeclaredConstructorFor(xmlAdapterClass, new Class<?>[0], true);
-                }
-                xmlAdapter = (XmlAdapter) PrivilegedAccessHelper.invokeConstructor(ctor, new Object[0]);
+                Constructor<? extends XmlAdapter<?,?>> ctor = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.getDeclaredConstructorFor(xmlAdapterClass, new Class<?>[0], true)
+                );
+                xmlAdapter = PrivilegedAccessHelper.invokeConstructor(ctor, new Object[0]);
             }
         } catch (Exception ex) {
             throw JAXBException.adapterClassCouldNotBeInstantiated(getXmlAdapterClassName(), ex);
         }
-        if(nestedConverter != null) {
-            if(nestedConverter instanceof ObjectTypeConverter) {
-                ((ObjectTypeConverter)nestedConverter).convertClassNamesToClasses(loader);
+        if (nestedConverter != null) {
+            if (nestedConverter instanceof ObjectTypeConverter) {
+                ((ObjectTypeConverter) nestedConverter).convertClassNamesToClasses(loader);
             }
             nestedConverter.initialize(mapping, session);
         }
@@ -315,7 +309,7 @@
      * Set the XmlAdapter class to be used with this converter.
      *
      */
-    public void setXmlAdapterClass(Class<?> xmlAdapterClass) {
+    public void setXmlAdapterClass(Class<? extends XmlAdapter<?,?>> xmlAdapterClass) {
         this.xmlAdapterClass = xmlAdapterClass;
     }
 
@@ -330,7 +324,7 @@
     /**
      * Get the nested converter to that is used in conjunction with the adapter.
      */
-    public CoreConverter getNestedConverter() {
+    public CoreConverter<DatabaseMapping, Session> getNestedConverter() {
         return nestedConverter;
     }
 
@@ -339,7 +333,7 @@
      * the nested converter is invoked after the adapter. On umarshal it is invoked before.
      * Primarily used to support enumerations with adapters.
      */
-    public void setNestedConverter(CoreConverter nestedConverter) {
+    public void setNestedConverter(CoreConverter<DatabaseMapping, Session> nestedConverter) {
         this.nestedConverter = nestedConverter;
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBBeanValidator.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBBeanValidator.java
index 10d633b..8d67c2d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBBeanValidator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBBeanValidator.java
@@ -14,9 +14,14 @@
 //     Marcel Valovy - 2.6 - initial implementation
 package org.eclipse.persistence.jaxb;
 
-import org.eclipse.persistence.exceptions.BeanValidationException;
-import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.jaxb.xmlmodel.XmlBindings;
+import java.security.CodeSource;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.concurrent.locks.ReentrantLock;
 
 import jakarta.validation.ConstraintViolation;
 import jakarta.validation.ConstraintViolationException;
@@ -26,18 +31,12 @@
 import jakarta.validation.Validator;
 import jakarta.validation.ValidatorFactory;
 import jakarta.validation.groups.Default;
-import java.security.AccessController;
-import java.security.CodeSource;
-import java.security.PrivilegedAction;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Set;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.eclipse.persistence.exceptions.BeanValidationException;
+import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
+import org.eclipse.persistence.jaxb.xmlmodel.XmlBindings;
+import org.eclipse.persistence.logging.DefaultSessionLog;
+import org.eclipse.persistence.logging.SessionLog;
 
 /**
  * INTERNAL:
@@ -52,9 +51,6 @@
  */
 class JAXBBeanValidator {
 
-    private static Logger logger =
-            Logger.getLogger(JAXBBeanValidator.class.getName());
-
     /**
      * Represents the Default validation group. Storing it in constant saves resources.
      */
@@ -130,6 +126,9 @@
      */
     private BeanValidationMode beanValidationMode = BeanValidationMode.NONE;
 
+    // Local logger instance.
+    private final SessionLog log = new DefaultSessionLog();
+
     /**
      * Private constructor. Only to be called by factory methods.
      * @param prefix differentiates between marshaller and unmarshaller during logging
@@ -281,7 +280,7 @@
      */
     Set<ConstraintViolationWrapper<Object>> getConstraintViolations() {
         Set<ConstraintViolationWrapper<Object>> result = new HashSet<>(constraintViolations.size());
-        for (ConstraintViolation cv : constraintViolations) {
+        for (ConstraintViolation<Object> cv : constraintViolations) {
             result.add(new ConstraintViolationWrapper<>(cv));
         }
         return result;
@@ -385,7 +384,6 @@
      *
      * @return BeanValidationException, containing ConstraintViolationException.
      */
-    @SuppressWarnings({"RedundantCast", "unchecked"})
     private BeanValidationException buildConstraintViolationException() {
         ConstraintViolationException cve = new ConstraintViolationException(
                 /* Do not remove the cast. */ constraintViolations);
@@ -405,7 +403,7 @@
         Iterator<? extends ConstraintViolation<?>> iterator = constraintViolations.iterator();
         assert iterator.hasNext(); // this method is to be called only if constraints violations are not empty
         ConstraintViolation<?> cv = iterator.next();
-        Collection<ConstraintViolationInfo> violatedConstraints = new LinkedList<ConstraintViolationInfo>(){
+        Collection<ConstraintViolationInfo> violatedConstraints = new LinkedList<>() {
             @Override
             public String toString() {
                 Iterator<ConstraintViolationInfo> it = iterator();
@@ -440,8 +438,8 @@
     private void printValidatorInfo() {
         if (!context.getHasLoggedValidatorInfo().getAndSet(true)) {
             CodeSource validationImplJar = getValidatorCodeSource();
-            if (logger.isLoggable(Level.FINE)) {
-                logger.fine("EclipseLink is using " + validationImplJar + " as BeanValidation implementation.");
+            if (log.shouldLog(SessionLog.FINE)) {
+                log.log(SessionLog.FINE, "EclipseLink is using " + validationImplJar + " as BeanValidation implementation.");
             }
         }
     }
@@ -453,16 +451,9 @@
      * @return Validator code source. May be null.
      */
     private CodeSource getValidatorCodeSource() {
-        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            return AccessController.doPrivileged(new PrivilegedAction<CodeSource>() {
-                @Override
-                public CodeSource run() {
-                    return validator.getClass().getProtectionDomain().getCodeSource();
-                }
-            });
-        } else {
-            return validator.getClass().getProtectionDomain().getCodeSource();
-        }
+        return PrivilegedAccessHelper.callDoPrivileged(
+                () -> validator.getClass().getProtectionDomain().getCodeSource()
+        );
     }
 
     /**
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContext.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContext.java
index 2df447b..b5b5dc1 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContext.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContext.java
@@ -16,8 +16,6 @@
 //     Dmitry Kornilov - 2.6.1 - BeanValidationHelper refactoring
 package org.eclipse.persistence.jaxb;
 
-import static org.eclipse.persistence.jaxb.javamodel.Helper.getQualifiedJavaTypeName;
-
 import java.awt.Image;
 import java.io.BufferedReader;
 import java.io.InputStream;
@@ -26,13 +24,12 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -42,6 +39,11 @@
 import java.util.Vector;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import javax.xml.namespace.QName;
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.transform.Source;
+
 import jakarta.xml.bind.JAXBElement;
 import jakarta.xml.bind.Marshaller;
 import jakarta.xml.bind.PropertyException;
@@ -49,13 +51,8 @@
 import jakarta.xml.bind.ValidationEvent;
 import jakarta.xml.bind.ValidationEventHandler;
 import jakarta.xml.bind.annotation.adapters.XmlAdapter;
-import java.util.HashSet;
-import javax.xml.namespace.QName;
-import javax.xml.stream.FactoryConfigurationError;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.transform.Source;
-import org.eclipse.persistence.Version;
 
+import org.eclipse.persistence.Version;
 import org.eclipse.persistence.core.queries.CoreAttributeGroup;
 import org.eclipse.persistence.core.sessions.CoreProject;
 import org.eclipse.persistence.descriptors.ClassDescriptor;
@@ -110,6 +107,8 @@
 import org.eclipse.persistence.sessions.Project;
 import org.eclipse.persistence.sessions.SessionEventListener;
 
+import static org.eclipse.persistence.jaxb.javamodel.Helper.getQualifiedJavaTypeName;
+
 /**
  * <p><b>Purpose:</b>Provide a EclipseLink implementation of the JAXBContext interface.</p>
  * <p><b>Responsibilities:</b><ul>
@@ -945,14 +944,9 @@
          * the binding layer for a Web Service provider.
          */
         private JAXBContextState createContextState(Class<?>[] classesToBeBound, Map<String, XmlBindings> xmlBindings) throws jakarta.xml.bind.JAXBException {
-            JaxbClassLoader loader = PrivilegedAccessHelper.shouldUsePrivilegedAccess()
-                    ? AccessController.doPrivileged(new PrivilegedAction<JaxbClassLoader>() {
-                        @Override
-                        public JaxbClassLoader run() {
-                            return new JaxbClassLoader(classLoader, classesToBeBound);
-                        }
-                    })
-                    : new JaxbClassLoader(classLoader, classesToBeBound);
+            JaxbClassLoader loader = PrivilegedAccessHelper.callDoPrivileged(
+                    () -> new JaxbClassLoader(classLoader, classesToBeBound)
+            );
             String defaultTargetNamespace = null;
             AnnotationHelper annotationHelper = null;
             boolean enableXmlAccessorFactory = false;
@@ -1143,14 +1137,9 @@
 
             final TypeMappingInfo[] types = typesToBeBound;
 
-            JaxbClassLoader loader = PrivilegedAccessHelper.shouldUsePrivilegedAccess()
-                    ? AccessController.doPrivileged(new PrivilegedAction<JaxbClassLoader>() {
-                        @Override
-                        public JaxbClassLoader run() {
-                            return new JaxbClassLoader(classLoader, types);
-                        }
-                    })
-                    : new JaxbClassLoader(classLoader, types);
+            JaxbClassLoader loader = PrivilegedAccessHelper.callDoPrivileged(
+                    () -> new JaxbClassLoader(classLoader, types)
+            );
             JavaModelImpl jModel;
             if (annotationHelper != null) {
                 jModel = new JavaModelImpl(loader, annotationHelper);
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBEnumTypeConverter.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBEnumTypeConverter.java
index 87404ae..e5a457c 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBEnumTypeConverter.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBEnumTypeConverter.java
@@ -14,17 +14,16 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.jaxb;
 
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.util.*;
-import org.eclipse.persistence.sessions.Session;
-import org.eclipse.persistence.mappings.DatabaseMapping;
-import org.eclipse.persistence.mappings.converters.ObjectTypeConverter;
+import java.util.EnumSet;
+import java.util.Iterator;
+
 import org.eclipse.persistence.exceptions.DescriptorException;
 import org.eclipse.persistence.exceptions.ValidationException;
 import org.eclipse.persistence.internal.oxm.mappings.Mapping;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedClassForName;
+import org.eclipse.persistence.mappings.DatabaseMapping;
+import org.eclipse.persistence.mappings.converters.ObjectTypeConverter;
+import org.eclipse.persistence.sessions.Session;
 
 /**
  * INTERNAL:
@@ -60,19 +59,10 @@
      */
     @Override
     public void convertClassNamesToClasses(ClassLoader classLoader){
-        try {
-            if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                try {
-                    m_enumClass = AccessController.doPrivileged(new PrivilegedClassForName<>(m_enumClassName, true, classLoader));
-                } catch (PrivilegedActionException exception) {
-                    throw ValidationException.classNotFoundWhileConvertingClassNames(m_enumClassName, exception.getException());
-                }
-            } else {
-                m_enumClass = org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(m_enumClassName, true, classLoader);
-            }
-        } catch (ClassNotFoundException exception){
-            throw ValidationException.classNotFoundWhileConvertingClassNames(m_enumClassName, exception);
-        }
+        m_enumClass = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                () -> org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(m_enumClassName, true, classLoader),
+                (ex) -> ValidationException.classNotFoundWhileConvertingClassNames(m_enumClassName, ex)
+        );
     }
 
     /**
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshalListener.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshalListener.java
index 6175085..ab5ce86 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshalListener.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshalListener.java
@@ -14,9 +14,6 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.jaxb;
 
-import java.lang.reflect.InvocationTargetException;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
 import java.util.Map;
 
 import jakarta.xml.bind.Marshaller;
@@ -24,7 +21,6 @@
 import org.eclipse.persistence.exceptions.XMLMarshalException;
 import org.eclipse.persistence.internal.oxm.Root;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedMethodInvoker;
 import org.eclipse.persistence.jaxb.compiler.MarshalCallback;
 import org.eclipse.persistence.oxm.XMLMarshalListener;
 
@@ -62,69 +58,39 @@
     }
 
     @Override
-    public void beforeMarshal(Object obj) {
+    public void beforeMarshal(final Object obj) {
         if(classBasedMarshalEvents != null) {
             MarshalCallback callback = (MarshalCallback)classBasedMarshalEvents.get(obj.getClass().getName());
             if(callback != null && callback.getBeforeMarshalCallback() != null) {
-                try {
-                    if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                        try{
-                            AccessController.doPrivileged(new PrivilegedMethodInvoker(callback.getBeforeMarshalCallback(), obj, new Object[]{marshaller}));
-                        }catch (PrivilegedActionException ex){
-                            if (ex.getCause() instanceof IllegalAccessException){
-                                throw (IllegalAccessException) ex.getCause();
-                            }
-                            if (ex.getCause() instanceof InvocationTargetException){
-                                throw (InvocationTargetException) ex.getCause();
-                            }
-                            throw (RuntimeException)ex.getCause();
-                        }
-                    }else{
-                        PrivilegedAccessHelper.invokeMethod(callback.getBeforeMarshalCallback(), obj, new Object[]{marshaller});
-                    }
-                } catch(Exception ex) {
-                    throw XMLMarshalException.marshalException(ex);
-                }
+                PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.invokeMethod(callback.getBeforeMarshalCallback(), obj, new Object[]{marshaller}),
+                        (ex) -> XMLMarshalException.marshalException(ex)
+                );
             }
         }
         if (listener != null) {
-            if(obj instanceof Root){
-                obj = jaxbContext.createJAXBElementFromXMLRoot((Root) obj, ((Root) obj).getDeclaredType());
-            }
-            listener.beforeMarshal(obj);
+            listener.beforeMarshal(
+                    obj instanceof Root
+                            ? jaxbContext.createJAXBElementFromXMLRoot((Root) obj, ((Root) obj).getDeclaredType()) : obj
+            );
         }
     }
     @Override
-    public void afterMarshal(Object obj) {
+    public void afterMarshal(final Object obj) {
         if(classBasedMarshalEvents != null) {
             MarshalCallback callback = (MarshalCallback)classBasedMarshalEvents.get(obj.getClass().getName());
             if (callback != null && callback.getAfterMarshalCallback() != null) {
-                try {
-                    if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                        try{
-                            AccessController.doPrivileged(new PrivilegedMethodInvoker(callback.getAfterMarshalCallback(), obj, new Object[]{marshaller}));
-                        }catch (PrivilegedActionException ex){
-                            if (ex.getCause() instanceof IllegalAccessException){
-                                throw (IllegalAccessException) ex.getCause();
-                            }
-                            if (ex.getCause() instanceof InvocationTargetException){
-                                throw (InvocationTargetException) ex.getCause();
-                            }
-                            throw (RuntimeException)ex.getCause();
-                        }
-                    }else{
-                        PrivilegedAccessHelper.invokeMethod(callback.getAfterMarshalCallback(), obj, new Object[]{marshaller});
-                    }
-                } catch(Exception ex) {
-                    throw XMLMarshalException.marshalException(ex);
-                }
+                PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.invokeMethod(callback.getAfterMarshalCallback(), obj, new Object[]{marshaller}),
+                        (ex) -> XMLMarshalException.marshalException(ex)
+                );
             }
         }
         if (listener != null) {
-            if(obj instanceof Root){
-                obj = jaxbContext.createJAXBElementFromXMLRoot((Root) obj, ((Root) obj).getDeclaredType());
-            }
-            listener.afterMarshal(obj);
+            listener.afterMarshal(
+                    obj instanceof Root
+                            ? jaxbContext.createJAXBElementFromXMLRoot((Root) obj, ((Root) obj).getDeclaredType()) : obj
+            );
         }
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshalListener.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshalListener.java
index ee56f34..aeb23a9 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshalListener.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshalListener.java
@@ -14,16 +14,12 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.jaxb;
 
-import java.lang.reflect.InvocationTargetException;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
 import java.util.Map;
 
 import jakarta.xml.bind.Unmarshaller;
 
 import org.eclipse.persistence.exceptions.XMLMarshalException;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedMethodInvoker;
 import org.eclipse.persistence.jaxb.compiler.UnmarshalCallback;
 import org.eclipse.persistence.oxm.XMLUnmarshalListener;
 
@@ -65,25 +61,10 @@
         if(classBasedUnmarshalEvents != null) {
             UnmarshalCallback callback = (UnmarshalCallback)classBasedUnmarshalEvents.get(target.getClass().getName());
             if(callback != null && callback.getBeforeUnmarshalCallback() != null) {
-                try {
-                    if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                        try{
-                            AccessController.doPrivileged(new PrivilegedMethodInvoker(callback.getBeforeUnmarshalCallback(), target, new Object[]{unmarshaller, parent}));
-                        }catch (PrivilegedActionException ex){
-                            if (ex.getCause() instanceof IllegalAccessException){
-                                throw (IllegalAccessException) ex.getCause();
-                            }
-                            if (ex.getCause() instanceof InvocationTargetException){
-                                throw (InvocationTargetException) ex.getCause();
-                            }
-                            throw (RuntimeException)ex.getCause();
-                        }
-                    }else{
-                        PrivilegedAccessHelper.invokeMethod(callback.getBeforeUnmarshalCallback(), target, new Object[]{unmarshaller, parent});
-                    }
-                } catch(Exception ex) {
-                    throw XMLMarshalException.unmarshalException(ex);
-                }
+                PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.invokeMethod(callback.getBeforeUnmarshalCallback(), target, new Object[]{unmarshaller, parent}),
+                        (ex) -> XMLMarshalException.unmarshalException(ex)
+                );
             }
         }
         if(listener != null) {
@@ -95,25 +76,10 @@
         if(classBasedUnmarshalEvents != null) {
             UnmarshalCallback callback = (UnmarshalCallback)classBasedUnmarshalEvents.get(target.getClass().getName());
             if(callback != null && callback.getAfterUnmarshalCallback() != null) {
-                try {
-                    if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                        try{
-                            AccessController.doPrivileged(new PrivilegedMethodInvoker(callback.getAfterUnmarshalCallback(), target, new Object[]{unmarshaller, parent}));
-                        }catch (PrivilegedActionException ex){
-                            if (ex.getCause() instanceof IllegalAccessException){
-                                throw (IllegalAccessException) ex.getCause();
-                            }
-                            if (ex.getCause() instanceof InvocationTargetException){
-                                throw (InvocationTargetException) ex.getCause();
-                            }
-                            throw (RuntimeException)ex.getCause();
-                        }
-                    }else{
-                        PrivilegedAccessHelper.invokeMethod(callback.getAfterUnmarshalCallback(), target, new Object[]{unmarshaller, parent});
-                    }
-                } catch(Exception ex) {
-                    throw XMLMarshalException.unmarshalException(ex);
-                }
+                PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.invokeMethod(callback.getAfterUnmarshalCallback(), target, new Object[]{unmarshaller, parent}),
+                        (ex) -> XMLMarshalException.unmarshalException(ex)
+                );
             }
         }
         if(listener != null) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/MOXySystemProperties.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/MOXySystemProperties.java
index aeac1a5..8cdb75b 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/MOXySystemProperties.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/MOXySystemProperties.java
@@ -14,10 +14,6 @@
 //     Martin Vojtek - 2.6.0 - initial implementation
 package org.eclipse.persistence.jaxb;
 
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
 import org.eclipse.persistence.internal.oxm.OXMSystemProperties;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 import org.eclipse.persistence.logging.AbstractSessionLog;
@@ -102,26 +98,9 @@
      * @return value of the system property
      */
     private static Boolean getBoolean(final String propertyName) {
-        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            return runDoPrivileged(propertyName);
-        } else {
-            return getSystemPropertyValue(propertyName);
-        }
+        return PrivilegedAccessHelper.callDoPrivileged(
+                () -> Boolean.getBoolean(propertyName)
+        );
     }
 
-    private static Boolean runDoPrivileged(final String propertyName) {
-        try {
-            return AccessController.doPrivileged(new PrivilegedExceptionAction<Boolean>() {
-                @Override
-                public Boolean run() throws Exception {
-                    return getSystemPropertyValue(propertyName);
-                }});
-        } catch (PrivilegedActionException e) {
-            throw (RuntimeException) e.getCause();
-        }
-    }
-
-    private static Boolean getSystemPropertyValue(final String propertyName) {
-        return Boolean.getBoolean(propertyName);
-    }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/ReflectionUtils.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/ReflectionUtils.java
index 5121e33..104f4db 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/ReflectionUtils.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/ReflectionUtils.java
@@ -17,12 +17,8 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
 
-import static java.security.AccessController.doPrivileged;
-import static org.eclipse.persistence.internal.security.PrivilegedAccessHelper.shouldUsePrivilegedAccess;
+import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 
 /**
  * Utility class for handling reflection calls and using caller sensitive actions.
@@ -43,9 +39,6 @@
 
     /**
      * Retrieves class object.
-     * <p>
-     * If security is enabled, makes {@linkplain java.security.AccessController#doPrivileged(PrivilegedAction)
-     * privileged calls}.
      *
      * @param clazz name of class to be retrieved
      * @return class object
@@ -53,343 +46,53 @@
      */
     static Class<?> forName(String clazz) throws ClassNotFoundException {
         try {
-            return shouldUsePrivilegedAccess()
-                    ? doPrivileged(ForNameIODH.PREDICATE_EXCEPTION_ACTION.with(clazz))
-                    : forNameInternal(clazz);
-        } catch (PrivilegedActionException e) {
-            throw (ClassNotFoundException) e.getException();
+            return PrivilegedAccessHelper.callDoPrivilegedWithException(
+                    () -> Class.forName(clazz)
+            );
+        } catch (ClassNotFoundException ex) {
+            throw ex;
+        } catch (Exception ex) {
+            throw new RuntimeException(String.format("Could not retrieve class %s.", clazz), ex);
         }
     }
 
     /**
      * Retrieves declared fields.
-     * <p>
-     * If security is enabled, makes {@linkplain java.security.AccessController#doPrivileged(PrivilegedAction)
-     * privileged calls}.
      *
      * @param clazz fields of that class will be returned
      * @return array of declared fields
      * @see Class#getDeclaredFields()
      */
     static Field[] getDeclaredFields(Class<?> clazz) {
-        return shouldUsePrivilegedAccess()
-                ? doPrivileged(DeclaredFieldsIODH.PREDICATE_ACTION.with(clazz))
-                : getDeclaredFieldsInternal(clazz);
+        return PrivilegedAccessHelper.callDoPrivileged(
+                clazz::getDeclaredFields
+        );
     }
 
     /**
      * Retrieves declared constructors.
      *
-     * If security is enabled, makes {@linkplain java.security.AccessController#doPrivileged(PrivilegedAction)
-     * privileged calls}.
-     *
      * @param clazz class that will be scanned
      * @return declared constructors
      * @see Class#getDeclaredConstructors()
      */
     static Constructor<?>[] getDeclaredConstructors(Class<?> clazz) {
-        return shouldUsePrivilegedAccess()
-                ? doPrivileged(DeclaredConstructorsIODH.PREDICATE_ACTION.with(clazz))
-                : getDeclaredConstructorsInternal(clazz);
+        return PrivilegedAccessHelper.callDoPrivileged(
+                clazz::getDeclaredConstructors
+        );
     }
 
     /**
      * Retrieves declared methods.
      *
-     * If security is enabled, makes {@linkplain java.security.AccessController#doPrivileged(PrivilegedAction)
-     * privileged calls}.
-     *
      * @param clazz class that will be scanned
      * @return declared methods
      * @see Class#getDeclaredMethods()
      */
     static Method[] getDeclaredMethods(Class<?> clazz) {
-        return shouldUsePrivilegedAccess()
-                ? doPrivileged(DeclaredMethodsIODH.PREDICATE_ACTION.with(clazz))
-                : getDeclaredMethodsInternal(clazz);
+        return PrivilegedAccessHelper.callDoPrivileged(
+                clazz::getDeclaredMethods
+        );
     }
 
-    /**
-     * Retrieves declared method.
-     *
-     * If security is enabled, makes {@linkplain java.security.AccessController#doPrivileged(PrivilegedAction)
-     * privileged calls}.
-     *
-     * @param clazz class that will be scanned
-     * @param name name of the method to be retrieved
-     * @param parameterTypes parameter types of the method to be retrieved
-     * @return declared method
-     * @throws NoSuchMethodException if method was not found
-     * @see Class#getDeclaredMethod(String, Class...)
-     */
-    static Method getDeclaredMethod(Class<?> clazz, String name, Class<?>... parameterTypes) throws
-            NoSuchMethodException {
-        try {
-            return shouldUsePrivilegedAccess()
-                    ? doPrivileged(DeclaredMethodIODH.PREDICATE_EXCEPTION_ACTION.with(clazz).with(name).with(parameterTypes))
-                    : getDeclaredMethodInternal(clazz, name, parameterTypes);
-        } catch (PrivilegedActionException e) {
-            throw (NoSuchMethodException) e.getException();
-        }
-    }
-
-
-    /* Internal Methods */
-    /**
-     * INTERNAL:
-     */
-    private static Class<?> forNameInternal(String clazz) throws ClassNotFoundException {
-        return Class.forName(clazz);
-    }
-
-    /**
-     * INTERNAL:
-     */
-    private static Field[] getDeclaredFieldsInternal(Class<?> clazz) {
-        return clazz.getDeclaredFields();
-    }
-
-    /**
-     * INTERNAL:
-     */
-    private static Method[] getDeclaredMethodsInternal(Class<?> clazz) {
-        return clazz.getDeclaredMethods();
-    }
-
-    /**
-     * INTERNAL:
-     */
-    private static Constructor<?>[] getDeclaredConstructorsInternal(Class<?> clazz) {
-        return clazz.getDeclaredConstructors();
-    }
-
-    /**
-     * INTERNAL:
-     */
-    private static Method getDeclaredMethodInternal(Class<?> clazz, String name, Class<?>... parameterTypes) throws
-            NoSuchMethodException {
-        return clazz.getDeclaredMethod(name, parameterTypes);
-    }
-
-
-    /* Initialization on Demand Holders */
-    /**
-     * IODH for enhanced forName privileged action with exception using predicates.
-     */
-    private static final class ForNameIODH {
-
-        /**
-         * Enhanced {@link PrivilegedExceptionAction} using predicates.
-         *  - Singleton.
-         *  - Throws {@link java.lang.ClassNotFoundException}.
-         */
-        private static final PredicateWithException<Class<?>> PREDICATE_EXCEPTION_ACTION = new
-                PredicateWithException<Class<?>>() {
-
-                    /* Predicates */
-                    private String clazz;
-
-                    @Override
-                    public PredicateWithException<Class<?>> with(String with) {
-                        this.clazz = with;
-                        return this;
-                    }
-
-                    @Override
-                    public PredicateWithException<Class<?>> with(Class<?> with) {
-                        throw new UnsupportedOperationException();
-                    }
-
-                    @Override
-                    public PredicateWithException<Class<?>> with(Class<?>[] with) {
-                        throw new UnsupportedOperationException();
-                    }
-
-                    @Override
-                    public Class<?> run() throws NoSuchMethodException, ClassNotFoundException {
-                        return forNameInternal(clazz);
-                    }
-                };
-    }
-
-    /**
-     * IODH for enhanced getDeclaredFields privileged action using predicates.
-     */
-    private static final class DeclaredFieldsIODH {
-
-        /**
-         * Enhanced {@link java.security.PrivilegedAction} using predicates.
-         *  - Singleton.
-         */
-        private static final Predicate<Field[]> PREDICATE_ACTION = new Predicate<Field[]>() {
-
-            /* Predicates */
-            private Class<?> clazz;
-
-            @Override
-            public Field[] run() {
-                return getDeclaredFieldsInternal(clazz);
-            }
-
-            @Override
-            public Predicate<Field[]> with(Class<?> clazz) {
-                this.clazz = clazz;
-                return this;
-            }
-        };
-    }
-
-    /**
-     * IODH for getDeclaredMethods privileged action using predicates.
-     */
-    private static final class DeclaredMethodsIODH {
-
-        /**
-         * Enhanced {@link PrivilegedAction} using predicates.
-         *  - Singleton.
-         */
-        private static final Predicate<Method[]> PREDICATE_ACTION = new
-                Predicate<Method[]>() {
-
-                    /* Predicates */
-                    private Class<?> clazz;
-
-                    @Override
-                    public Predicate<Method[]> with(Class<?> with) {
-                        this.clazz = with;
-                        return this;
-                    }
-
-                    @Override
-                    public Method[] run() {
-                        return getDeclaredMethodsInternal(clazz);
-                    }
-                };
-    }
-    /**
-     * IODH for getDeclaredConstructors privileged action using predicates.
-     */
-    private static final class DeclaredConstructorsIODH {
-
-        /**
-         * Enhanced {@link java.security.PrivilegedAction} using predicates.
-         *  - Singleton.
-         */
-        private static final Predicate<Constructor<?>[]> PREDICATE_ACTION = new
-                Predicate<Constructor<?>[]>() {
-
-                    /* Predicates */
-                    private Class<?> clazz;
-
-                    @Override
-                    public Predicate<Constructor<?>[]> with(Class<?> with) {
-                        this.clazz = with;
-                        return this;
-                    }
-
-                    @Override
-                    public Constructor<?>[] run() {
-                        return getDeclaredConstructorsInternal(clazz);
-                    }
-                };
-    }
-
-
-    /**
-     * IODH for getMethod predicate wrapped privileged exception action.
-     */
-    private static final class DeclaredMethodIODH {
-
-        /**
-         * Enhanced {@link PrivilegedExceptionAction} using predicates.
-         *  - Singleton.
-         *  - Throws {@link NoSuchMethodException}.
-         */
-        private static final PredicateWithException<Method> PREDICATE_EXCEPTION_ACTION = new
-                PredicateWithException<Method>() {
-
-                    /* Predicates */
-                    private Class<?> clazz;
-                    private String name;
-                    private Class<?>[] parameterTypes;
-
-                    @Override
-                    public PredicateWithException<Method> with(Class<?> with) {
-                        this.clazz = with;
-                        return this;
-                    }
-
-                    @Override
-                    public PredicateWithException<Method> with(String with) {
-                        this.name = with;
-                        return this;
-                    }
-
-                    @Override
-                    public PredicateWithException<Method> with(Class<?>[] with) {
-                        this.parameterTypes = with;
-                        return this;
-                    }
-
-                    @Override
-                    public Method run() throws NoSuchMethodException {
-                        return getDeclaredMethodInternal(clazz, name, parameterTypes);
-                    }
-                };
-    }
-
-
-    /* Inner Interfaces */
-
-    /**
-     * Predicate-providing wrapper for {@link PrivilegedAction}.
-     *
-     * @param <T> return type of {@linkplain PrivilegedAction#run() computation}
-     */
-    private interface Predicate<T> extends PrivilegedAction<T> {
-
-        /**
-         * Assigns a predicate to the underlying privileged action.
-         * Any previous predicate of the same type will be overwritten.
-         *
-         * @param with predicate
-         * @return {@code this}
-         */
-        Predicate<T> with(Class<?> with);
-    }
-
-    /**
-     * Predicate-providing wrapper for {@link PrivilegedExceptionAction}.
-     *
-     * @param <T> return type of {@linkplain PrivilegedExceptionAction#run() computation}
-     */
-    private interface PredicateWithException<T> extends PrivilegedExceptionAction<T> {
-
-        /**
-         * Assigns a predicate to the underlying privileged exception action.
-         * Any previous predicate of the same type will be overwritten.
-         *
-         * @param with predicate
-         * @return {@code this}
-         */
-        PredicateWithException<T> with(Class<?> with);
-
-        /**
-         * Assigns a predicate to the underlying privileged exception action.
-         * Any previous predicate of the same type will be overwritten.
-         *
-         * @param with predicate
-         * @return {@code this}
-         */
-        PredicateWithException<T> with(String with);
-
-        /**
-         * Assigns a predicate to the underlying privileged exception action.
-         * Any previous predicate of the same type will be overwritten.
-         *
-         * @param with predicate
-         * @return {@code this}
-         */
-        PredicateWithException<T> with(Class<?>[] with);
-    }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/ValidationXMLReader.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/ValidationXMLReader.java
index 3c0d1ee..e7e0496 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/ValidationXMLReader.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/ValidationXMLReader.java
@@ -18,8 +18,6 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -35,7 +33,6 @@
 import org.eclipse.persistence.exceptions.BeanValidationException;
 import org.eclipse.persistence.internal.helper.XMLHelper;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedGetContextClassLoader;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -46,9 +43,9 @@
  * Strategy:<br>
  * 1. Parse validation.xml, looking for a constraints-file reference.<br>
  * 2. For each reference, if file is found, parses the constraints file and puts all classes declared under
- * {@literal <bean class="clazz">} into
- * {@link org.eclipse.persistence.jaxb.BeanValidationHelper#constraintsOnClasses}
- * with value {@link Boolean#TRUE}.
+ * {@literal <bean class="clazz">} into {@code constraintsOnClasses} field
+ * of {@link org.eclipse.persistence.jaxb.BeanValidationHelper} class
+ * with {@link Boolean#TRUE} value.
  * <p>
  * This class contains resources-burdening instance fields (e.g. SAXParser) and as such was designed to be instantiated
  * once (make the instance BOUNDED) and have {@link #call()} method called on that instance once.
@@ -74,7 +71,7 @@
 
     private final List<String> constraintsFiles = new ArrayList<>(2);
 
-    private Map<Class<?>, Boolean> constraintsOnClasses = new HashMap<>();
+    private final Map<Class<?>, Boolean> constraintsOnClasses = new HashMap<>();
 
     // Created lazily
     private SAXParser saxParser;
@@ -97,12 +94,7 @@
      * Checks if validation.xml exists.
      */
     public static boolean isValidationXmlPresent() {
-        try {
-            return getThreadContextClassLoader().getResource(VALIDATION_XML) != null;
-        } catch (PrivilegedActionException ignored) {
-            LOGGER.log(Level.WARNING, "Loading of " + VALIDATION_XML + " file failed. ", ignored);
-            return false;
-        }
+        return getThreadContextClassLoader().getResource(VALIDATION_XML) != null;
     }
 
     private void parseConstraintFiles() {
@@ -134,7 +126,7 @@
             }
 
             @Override
-            public void characters(char ch[], int start, int length) throws SAXException {
+            public void characters(char[] ch, int start, int length) throws SAXException {
                 if (defaultPackageElement) {
                     defaultPackage = new String(ch, start, length);
                     defaultPackageElement = false;
@@ -171,17 +163,15 @@
             if (validationXml != null) {
                 getSaxParser().parse(validationXml, handler);
             }
-        } catch (PrivilegedActionException | SAXException | IOException ignored) {
-            LOGGER.log(Level.WARNING, "Parsing of validation.xml failed.", ignored);
+        } catch (SAXException | IOException ex) {
+            LOGGER.log(Level.WARNING, "Parsing of validation.xml failed.", ex);
         }
     }
 
-    private static ClassLoader getThreadContextClassLoader() throws PrivilegedActionException {
-        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            return AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
-        } else {
-            return Thread.currentThread().getContextClassLoader();
-        }
+    private static ClassLoader getThreadContextClassLoader() {
+        return PrivilegedAccessHelper.callDoPrivileged(
+                () -> Thread.currentThread().getContextClassLoader()
+        );
     }
 
     private final DefaultHandler validationHandler = new DefaultHandler() {
@@ -189,8 +179,7 @@
         private boolean constraintsFileElement = false;
 
         @Override
-        public void startElement(String uri, String localName, String qName,
-                                 Attributes attributes) throws SAXException {
+        public void startElement(String uri, String localName, String qName, Attributes attributes) {
 
             if (CONSTRAINT_MAPPING_QNAME.equalsIgnoreCase(qName)) {
                 constraintsFileElement = true;
@@ -198,7 +187,7 @@
         }
 
         @Override
-        public void characters(char ch[], int start, int length) throws SAXException {
+        public void characters(char[] ch, int start, int length) {
 
             if (constraintsFileElement) {
                 constraintsFiles.add(new String(ch, start, length));
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
index 7fc55f6..248913d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
@@ -16,8 +16,6 @@
 
 import java.awt.Image;
 import java.beans.Introspector;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Deque;
@@ -35,6 +33,9 @@
 import java.util.StringTokenizer;
 import java.util.TreeSet;
 
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+
 import jakarta.xml.bind.JAXBElement;
 import jakarta.xml.bind.annotation.XmlAttribute;
 import jakarta.xml.bind.annotation.XmlMixed;
@@ -42,8 +43,6 @@
 import jakarta.xml.bind.annotation.XmlValue;
 import jakarta.xml.bind.annotation.adapters.CollapsedStringAdapter;
 import jakarta.xml.bind.annotation.adapters.NormalizedStringAdapter;
-import javax.xml.namespace.QName;
-import javax.xml.transform.Source;
 
 import org.eclipse.persistence.config.DescriptorCustomizer;
 import org.eclipse.persistence.core.descriptors.CoreDescriptor;
@@ -109,7 +108,6 @@
 import org.eclipse.persistence.internal.oxm.record.XMLTransformationRecord;
 import org.eclipse.persistence.internal.queries.ContainerPolicy;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedClassForName;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.jaxb.JAXBEnumTypeConverter;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
@@ -2109,42 +2107,22 @@
                     directCollectionMapping.setAttributeAccessor(accessor);
 
                     JavaClass componentType = theType.getComponentType();
-                    try {
-                        Class<?> declaredClass;
-                        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                                try {
-                                    declaredClass = AccessController.doPrivileged(new PrivilegedClassForName<>(componentType.getRawName(), false, helper.getClassLoader()));
-                                } catch (PrivilegedActionException exception) {
-                                    throw JAXBException.classNotFoundException(componentType.getRawName());
-                                }
-                        } else {
-                            declaredClass = PrivilegedAccessHelper.getClassForName(componentType.getRawName(), false, helper.getClassLoader());
-                        }
-                        directCollectionMapping.setAttributeElementClass(declaredClass);
-                    } catch (ClassNotFoundException e) {
-                        throw JAXBException.classNotFoundException(componentType.getRawName());
-                    }
+                    Class<?> declaredClass = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                            () -> PrivilegedAccessHelper.getClassForName(componentType.getRawName(), false, helper.getClassLoader()),
+                            (ex) -> JAXBException.classNotFoundException(componentType.getRawName())
+                    );
+                    directCollectionMapping.setAttributeElementClass(declaredClass);
                 }
             } else if (helper.isCollectionType(theType)) {
                 Collection args = theType.getActualTypeArguments();
                 if (args.size() > 0) {
-                    JavaClass itemType = (JavaClass)args.iterator().next();
-                    try {
-                        Class<?> declaredClass;
-                        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                                try {
-                                    declaredClass = AccessController.doPrivileged(new PrivilegedClassForName<>(itemType.getRawName(), false, helper.getClassLoader()));
-                                } catch (PrivilegedActionException exception) {
-                                    throw JAXBException.classNotFoundException(itemType.getRawName());
-                                }
-                        } else {
-                            declaredClass = PrivilegedAccessHelper.getClassForName(itemType.getRawName(), false, helper.getClassLoader());
-                        }
-                        if(declaredClass != String.class){
-                            directCollectionMapping.setAttributeElementClass(declaredClass);
-                        }
-                    } catch (ClassNotFoundException e) {
-                        throw JAXBException.classNotFoundException(itemType.getRawName());
+                    JavaClass itemType = (JavaClass) args.iterator().next();
+                    Class<?> declaredClass = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                            () -> PrivilegedAccessHelper.getClassForName(itemType.getRawName(), false, helper.getClassLoader()),
+                            (ex) -> JAXBException.classNotFoundException(itemType.getRawName())
+                    );
+                    if (declaredClass != String.class) {
+                        directCollectionMapping.setAttributeElementClass(declaredClass);
                     }
                 }
             }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java
index 48e07a4..f8a04b5 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java
@@ -15,14 +15,12 @@
 package org.eclipse.persistence.jaxb.compiler;
 
 import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
 
 import jakarta.xml.bind.Marshaller;
 
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedClassForName;
-import org.eclipse.persistence.internal.security.PrivilegedGetMethod;
+import org.eclipse.persistence.logging.AbstractSessionLog;
+import org.eclipse.persistence.logging.SessionLog;
 
 /**
  * INTERNAL:
@@ -62,60 +60,44 @@
     }
 
     /**
+     * Initialize information about class based JAXB 2.0 Callback methods.
+     *
+     * @param loader source class loader for {@code domainClass}
      */
     public void initialize(ClassLoader loader) {
         try {
-            if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                try{
-                    domainClass = AccessController.doPrivileged(new PrivilegedClassForName<>(domainClassName, true, loader));
-                }catch (PrivilegedActionException ex){
-                    if (ex.getCause() instanceof ClassNotFoundException){
-                        throw (ClassNotFoundException) ex.getCause();
-                    }
-                    throw (RuntimeException)ex.getCause();
-                }
-            }else{
-                domainClass = PrivilegedAccessHelper.getClassForName(domainClassName, true, loader);
-            }
+            domainClass = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                    () -> PrivilegedAccessHelper.getClassForName(domainClassName, true, loader)
+            );
         } catch (ClassNotFoundException ex) {
             return;
+        } catch (Exception ex) {
+            throw new RuntimeException(String.format("Failed initialization of %s class", domainClassName), ex);
         }
         Class<?>[] params = new Class<?>[] { Marshaller.class };
         if (hasBeforeMarshalCallback) {
             try {
-                Method beforeMarshal = null;
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    try{
-                        beforeMarshal = AccessController.doPrivileged(new PrivilegedGetMethod(domainClass, "beforeMarshal", params, false));
-                    }catch (PrivilegedActionException ex){
-                        if (ex.getCause() instanceof NoSuchMethodException){
-                            throw (NoSuchMethodException) ex.getCause();
-                        }
-                        throw (RuntimeException)ex.getCause();
-                    }
-                }else{
-                    beforeMarshal = PrivilegedAccessHelper.getMethod(domainClass, "beforeMarshal", params, false);
-                }
+                Method beforeMarshal = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.getMethod(domainClass, "beforeMarshal", params, false)
+                );
                 setBeforeMarshalCallback(beforeMarshal);
-            } catch (NoSuchMethodException nsmex) {}
+            } catch (NoSuchMethodException nsmex) {
+                // Ignore this exception
+            } catch (Exception ex) {
+                throw new RuntimeException(String.format("Failed initialization of beforeMarshal method of %s class", domainClassName), ex);
+            }
         }
         if (hasAfterMarshalCallback) {
             try {
-                Method afterMarshal = null;
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    try{
-                        afterMarshal = AccessController.doPrivileged(new PrivilegedGetMethod(domainClass, "afterMarshal", params, false));
-                    }catch (PrivilegedActionException ex){
-                        if (ex.getCause() instanceof NoSuchMethodException){
-                            throw (NoSuchMethodException) ex.getCause();
-                        }
-                        throw (RuntimeException)ex.getCause();
-                    }
-                }else{
-                    afterMarshal = PrivilegedAccessHelper.getMethod(domainClass, "afterMarshal", params, false);
-                }
+                Method afterMarshal = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.getMethod(domainClass, "afterMarshal", params, false)
+                );
                 setAfterMarshalCallback(afterMarshal);
-            } catch (NoSuchMethodException nsmex) {}
+            } catch (NoSuchMethodException nsmex) {
+                // Ignore this exception
+            } catch (Exception ex) {
+                throw new RuntimeException(String.format("Failed initialization of afterMarshal method of %s class", domainClassName), ex);
+            }
         }
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java
index 1c60ccc..37dee1f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java
@@ -15,14 +15,12 @@
 package org.eclipse.persistence.jaxb.compiler;
 
 import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
 
 import jakarta.xml.bind.Unmarshaller;
 
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedClassForName;
-import org.eclipse.persistence.internal.security.PrivilegedGetMethod;
+import org.eclipse.persistence.logging.AbstractSessionLog;
+import org.eclipse.persistence.logging.SessionLog;
 
 /**
  * INTERNAL:
@@ -62,60 +60,44 @@
     }
 
     /**
+     * Initialize information about class based JAXB 2.0 Callback methods.
+     *
+     * @param loader source class loader for {@code domainClass}
      */
     public void initialize(ClassLoader loader) {
         try {
-            if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                try{
-                    domainClass = AccessController.doPrivileged(new PrivilegedClassForName<>(domainClassName, true, loader));
-                }catch (PrivilegedActionException ex){
-                    if (ex.getCause() instanceof ClassNotFoundException){
-                        throw (ClassNotFoundException) ex.getCause();
-                    }
-                    throw (RuntimeException)ex.getCause();
-                }
-            }else{
-                domainClass = PrivilegedAccessHelper.getClassForName(domainClassName, true, loader);
-            }
+            domainClass = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                    () -> PrivilegedAccessHelper.getClassForName(domainClassName, true, loader)
+            );
         } catch (ClassNotFoundException ex) {
             return;
+        } catch (Exception ex) {
+            throw new RuntimeException(String.format("Failed initialization of %s class", domainClassName), ex);
         }
         Class<?>[] params = new Class<?>[]{ Unmarshaller.class, Object.class };
         if (hasBeforeUnmarshalCallback) {
             try {
-                Method beforeUnmarshal = null;
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    try{
-                        beforeUnmarshal = AccessController.doPrivileged(new PrivilegedGetMethod(domainClass, "beforeUnmarshal", params, false));
-                    }catch (PrivilegedActionException ex){
-                        if (ex.getCause() instanceof NoSuchMethodException){
-                            throw (NoSuchMethodException) ex.getCause();
-                        }
-                        throw (RuntimeException)ex.getCause();
-                    }
-                }else{
-                    beforeUnmarshal = PrivilegedAccessHelper.getMethod(domainClass, "beforeUnmarshal", params, false);
-                }
+                Method beforeUnmarshal = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.getMethod(domainClass, "beforeUnmarshal", params, false)
+                );
                 setBeforeUnmarshalCallback(beforeUnmarshal);
-            } catch (NoSuchMethodException nsmex) {}
+            } catch (NoSuchMethodException nsmex) {
+                // Ignore this exception
+            } catch (Exception ex) {
+                throw new RuntimeException(String.format("Failed initialization of beforeMarshal method of %s class", domainClassName), ex);
+            }
         }
         if (hasAfterUnmarshalCallback) {
             try {
-                Method afterUnmarshal = null;
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    try{
-                        afterUnmarshal = AccessController.doPrivileged(new PrivilegedGetMethod(domainClass, "afterUnmarshal", params, false));
-                    }catch (PrivilegedActionException ex){
-                        if (ex.getCause() instanceof NoSuchMethodException){
-                            throw (NoSuchMethodException) ex.getCause();
-                        }
-                        throw (RuntimeException)ex.getCause();
-                    }
-                }else{
-                    afterUnmarshal = PrivilegedAccessHelper.getMethod(domainClass, "afterUnmarshal", params, false);
-                }
+                Method afterUnmarshal = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                        () -> PrivilegedAccessHelper.getMethod(domainClass, "afterUnmarshal", params, false)
+                );
                 setAfterUnmarshalCallback(afterUnmarshal);
-            } catch (NoSuchMethodException nsmex) {}
+            } catch (NoSuchMethodException nsmex) {
+                // Ignore this exception
+            } catch (Exception ex) {
+                throw new RuntimeException(String.format("Failed initialization of afterMarshal method of %s class", domainClassName), ex);
+            }
         }
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/DynamicJAXBContext.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/DynamicJAXBContext.java
index 6cd6336..a8ab555 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/DynamicJAXBContext.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/DynamicJAXBContext.java
@@ -17,17 +17,15 @@
 import java.io.InputStream;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 
-import jakarta.xml.bind.JAXBException;
 import javax.xml.transform.stream.StreamSource;
 
+import jakarta.xml.bind.JAXBException;
+
 import org.eclipse.persistence.core.sessions.CoreProject;
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.dynamic.DynamicClassLoader;
@@ -38,7 +36,6 @@
 import org.eclipse.persistence.internal.descriptors.InstantiationPolicy;
 import org.eclipse.persistence.internal.jaxb.JaxbClassLoader;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedGetContextClassLoader;
 import org.eclipse.persistence.jaxb.compiler.Generator;
 import org.eclipse.persistence.jaxb.dynamic.metadata.Metadata;
 import org.eclipse.persistence.jaxb.dynamic.metadata.OXMMetadata;
@@ -213,46 +210,30 @@
     // ========================================================================
 
     static abstract class DynamicJAXBContextInput extends org.eclipse.persistence.jaxb.JAXBContext.JAXBContextInput {
+
         public DynamicJAXBContextInput(Map properties, ClassLoader classLoader) {
             super(properties, classLoader);
-
-            DynamicClassLoader dClassLoader = null;
-
             if (classLoader == null) {
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    try {
-                        classLoader =  AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
-                    } catch (PrivilegedActionException pae) {
-                        //should not be thrown but make sure that when it does, it's properly reported
-                        throw new RuntimeException(pae);
-                    }
-                } else {
-                    classLoader = PrivilegedAccessHelper.getContextClassLoader(Thread.currentThread());
-                }
+                classLoader = PrivilegedAccessHelper.callDoPrivileged(
+                        () -> PrivilegedAccessHelper.getContextClassLoader(Thread.currentThread())
+                );
             }
+            final DynamicClassLoader dClassLoader;
             if (classLoader instanceof DynamicClassLoader) {
                dClassLoader = (DynamicClassLoader) classLoader;
             } else {
                 final ClassLoader parent = classLoader;
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    dClassLoader = AccessController.doPrivileged(new PrivilegedAction<DynamicClassLoader>() {
-                        @Override
-                        public DynamicClassLoader run() {
-                            return new DynamicClassLoader(new JaxbClassLoader(parent));
-                        }
-                    });
-                } else {
-                    ClassLoader jaxbLoader = new JaxbClassLoader(parent);
-                    dClassLoader = new DynamicClassLoader(jaxbLoader);
-                }
+                dClassLoader = PrivilegedAccessHelper.callDoPrivileged(
+                        () -> new DynamicClassLoader(new JaxbClassLoader(parent))
+                );
             }
-
             this.classLoader = dClassLoader;
         }
 
         public DynamicClassLoader getClassLoader() {
             return (DynamicClassLoader) this.classLoader;
         }
+
     }
 
     static class MetadataContextInput extends DynamicJAXBContextInput {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/plugins/BeanValidationPlugin.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/plugins/BeanValidationPlugin.java
index 3cd3d55..5056708 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/plugins/BeanValidationPlugin.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/plugins/BeanValidationPlugin.java
@@ -14,21 +14,7 @@
 //     Marcel Valovy - 2.6 - initial implementation
 package org.eclipse.persistence.jaxb.plugins;
 
-import static com.sun.xml.xsom.XSFacet.FACET_FRACTIONDIGITS;
-import static com.sun.xml.xsom.XSFacet.FACET_LENGTH;
-import static com.sun.xml.xsom.XSFacet.FACET_MAXEXCLUSIVE;
-import static com.sun.xml.xsom.XSFacet.FACET_MAXINCLUSIVE;
-import static com.sun.xml.xsom.XSFacet.FACET_MAXLENGTH;
-import static com.sun.xml.xsom.XSFacet.FACET_MINEXCLUSIVE;
-import static com.sun.xml.xsom.XSFacet.FACET_MININCLUSIVE;
-import static com.sun.xml.xsom.XSFacet.FACET_MINLENGTH;
-import static com.sun.xml.xsom.XSFacet.FACET_PATTERN;
-import static com.sun.xml.xsom.XSFacet.FACET_TOTALDIGITS;
-
 import java.io.IOException;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -45,9 +31,6 @@
 
 import jakarta.xml.bind.annotation.XmlElement;
 
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXParseException;
-
 import com.sun.codemodel.JAnnotationArrayMember;
 import com.sun.codemodel.JAnnotationUse;
 import com.sun.codemodel.JClass;
@@ -78,6 +61,20 @@
 import com.sun.xml.xsom.XSTerm;
 import com.sun.xml.xsom.XSType;
 import com.sun.xml.xsom.impl.parser.DelayedRef;
+import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXParseException;
+
+import static com.sun.xml.xsom.XSFacet.FACET_FRACTIONDIGITS;
+import static com.sun.xml.xsom.XSFacet.FACET_LENGTH;
+import static com.sun.xml.xsom.XSFacet.FACET_MAXEXCLUSIVE;
+import static com.sun.xml.xsom.XSFacet.FACET_MAXINCLUSIVE;
+import static com.sun.xml.xsom.XSFacet.FACET_MAXLENGTH;
+import static com.sun.xml.xsom.XSFacet.FACET_MINEXCLUSIVE;
+import static com.sun.xml.xsom.XSFacet.FACET_MININCLUSIVE;
+import static com.sun.xml.xsom.XSFacet.FACET_MINLENGTH;
+import static com.sun.xml.xsom.XSFacet.FACET_PATTERN;
+import static com.sun.xml.xsom.XSFacet.FACET_TOTALDIGITS;
 
 
 /**
@@ -209,7 +206,6 @@
 
     /* ######### CORE FUNCTIONALITY ######### */
     private static final String PATTERN_ANNOTATION_NOT_APPLICABLE = "Facet \"pattern\" was detected on a DOM node with non-string base type. Annotation was not generated, because it is not supported by the Bean Validation specification.";
-    private final boolean securityEnabled = System.getSecurityManager() != null;
 
     private static final JClass ANNOTATION_VALID;
     private static final JClass ANNOTATION_NOTNULL;
@@ -772,18 +768,15 @@
     /* ######### GENERAL UTILITIES ######### */
     private Class<?> loadClass(String className) {
         Class<?> clazz = null;
-        if (securityEnabled) try {
-            clazz = AccessController.doPrivileged(ForNameActionExecutor.INSTANCE.with(className));
-        } catch (PrivilegedActionException ignored) {
-            // - Can be only of type ClassNotFoundException, no check needed, see AccessController.doPrivileged().
-            /* - ClassNotFoundException for us "means" that the fieldVar is of some unknown class - not an issue to be
-             solved by this plugin. */
-        }
-        else try {
-            clazz = loadClassInternal(className);
+        try {
+            clazz = PrivilegedAccessHelper.callDoPrivilegedWithException(
+                    () -> Class.forName(className)
+            );
         } catch (ClassNotFoundException ignored) {
             /* - ClassNotFoundException for us "means" that the fieldVar is of some unknown class - not an issue to be
              solved by this plugin. */
+        } catch (Exception ex) {
+            throw new RuntimeException(String.format("Failed loading of %s class", className), ex);
         }
         return clazz;
     }
@@ -945,30 +938,4 @@
         }
     }
 
-    private static final class ForNameActionExecutor {
-
-        private interface PrivilegedExceptionActionWith<T> extends PrivilegedExceptionAction<T> {
-            PrivilegedExceptionAction<T> with(String className);
-        }
-
-        private static final PrivilegedExceptionActionWith<Class<?>> INSTANCE = new PrivilegedExceptionActionWith<Class<?>>() {
-            private String className;
-
-            @Override
-            public Class<?> run() throws ClassNotFoundException {
-                return loadClassInternal(className);
-            }
-
-            @Override
-            public PrivilegedExceptionActionWith<Class<?>> with(String className) {
-                this.className = className;
-                return this;
-            }
-        };
-    }
-
-    private static Class<?> loadClassInternal(String className) throws ClassNotFoundException {
-        return Class.forName(className);
-    }
-
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/JARClassLoader.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/JARClassLoader.java
index 1d80131..d567853 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/JARClassLoader.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/JARClassLoader.java
@@ -14,15 +14,16 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.testing.oxm.classloader;
 
-import java.io.*;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.IOException;
 import java.net.URISyntaxException;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.util.*;
-import java.util.zip.*;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedGetClassLoaderForClass;
 
 
 /**
@@ -35,7 +36,7 @@
  */
 public class JARClassLoader extends ClassLoader {
     /** Map each package name to the appropriate JAR file. */
-    private Hashtable overridePackageNames;
+    private Hashtable<String, String> overridePackageNames;
 
 /**
  * Default constructor - initialize the new instance.
@@ -64,9 +65,7 @@
 protected ZipFile buildJARFile(String jarFileName) {
     try {
         return new ZipFile(new File(Thread.currentThread().getContextClassLoader().getResource(jarFileName).toURI()));
-    } catch (IOException e) {
-        throw new RuntimeException(e);
-    } catch (URISyntaxException e) {
+    } catch (IOException | URISyntaxException e) {
         throw new RuntimeException(e);
     }
 }
@@ -80,7 +79,7 @@
  * Return the class for the specified name, leaving it "unresolved".
  */
 protected Class<?> customLoadUnresolvedClass(String className) throws ClassNotFoundException {
-    String jarFileName = (String) overridePackageNames.get(this.buildPackageName(className));
+    String jarFileName = overridePackageNames.get(this.buildPackageName(className));
     ZipFile jarFile = this.buildJARFile(jarFileName);
 
     String url = className.replace('.', '/').concat(".class");
@@ -93,7 +92,6 @@
         data = this.loadData(jarFile, jarEntry);
         jarFile.close();
     } catch (IOException e) {
-        Object[] args = {jarFileName, url};
         throw new ClassNotFoundException();
     }
     return this.defineClass(className, data, 0, data.length);
@@ -121,7 +119,7 @@
  * Initialize the newly-created instance.
  */
 protected void initialize() {
-    this.overridePackageNames = new Hashtable();
+    this.overridePackageNames = new Hashtable<>();
 }
 /**
  * Initialize
@@ -182,16 +180,9 @@
     if (this.shouldCustomLoad(className)) {
         return this.customLoadUnresolvedClass(className);
     } else {
-        ClassLoader cl = null;
-        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            try{
-                cl = AccessController.doPrivileged(new PrivilegedGetClassLoaderForClass(this.getClass()));
-            }catch (PrivilegedActionException ex){
-                throw (RuntimeException)ex.getCause();
-            }
-        }else{
-             cl = PrivilegedAccessHelper.getClassLoaderForClass(this.getClass());
-        }
+        final ClassLoader cl = PrivilegedAccessHelper.callDoPrivileged(
+                () -> PrivilegedAccessHelper.getClassLoaderForClass(this.getClass())
+        );
         if (cl == null) {
             // this should only occur under jdk1.1.x
             return this.findSystemClass(className);