Fixed #23616 generateAndLoad cleanup

- stop using deprecated methods
- synchronization moved to method level and loading to one single caller which
  didn't do that yet -> reduced duplicit actions
diff --git a/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/EJBUtils.java b/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/EJBUtils.java
index 88f9859..ec4daf1 100644
--- a/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/EJBUtils.java
+++ b/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/EJBUtils.java
@@ -436,84 +436,49 @@
 
     }
 
-    public static Class loadGeneratedSerializableClass(ClassLoader loader, String className)
-        throws Exception {
+
+    public static Class loadGeneratedSerializableClass(ClassLoader loader, String className) throws Exception {
         String generatedSerializableClassName = getGeneratedSerializableClassName(className);
-
         Class developerClass = loader.loadClass(className);
-        AsmSerializableBeanGenerator gen = new AsmSerializableBeanGenerator
-                (loader, developerClass, generatedSerializableClassName);
-
-        Class serializableClass = gen.generateSerializableSubclass();
-
-        return serializableClass;
+        AsmSerializableBeanGenerator gen = new AsmSerializableBeanGenerator(loader, developerClass,
+            generatedSerializableClassName);
+        return gen.generateSerializableSubclass();
     }
 
-    public static void loadGeneratedRemoteBusinessClasses
-        (String businessInterfaceName) throws Exception {
 
-        ClassLoader appClassLoader =
-            getBusinessIntfClassLoader(businessInterfaceName);
-
-        loadGeneratedRemoteBusinessClasses(appClassLoader,
-                                           businessInterfaceName);
+    public static void loadGeneratedRemoteBusinessClasses(String businessInterfaceName) throws Exception {
+        ClassLoader appClassLoader = getBusinessIntfClassLoader(businessInterfaceName);
+        loadGeneratedRemoteBusinessClasses(appClassLoader, businessInterfaceName);
     }
 
-    public static void loadGeneratedRemoteBusinessClasses
-        (ClassLoader appClassLoader, String businessInterfaceName)
+
+    public static void loadGeneratedRemoteBusinessClasses(ClassLoader appClassLoader, String businessInterfaceName)
         throws Exception {
-
-        String generatedRemoteIntfName = EJBUtils.
-            getGeneratedRemoteIntfName(businessInterfaceName);
-
-        String wrapperClassName = EJBUtils.
-            getGeneratedRemoteWrapperName(businessInterfaceName);
-
-        Class generatedRemoteIntf = null;
-        try {
-            generatedRemoteIntf =
-                appClassLoader.loadClass(generatedRemoteIntfName);
-        } catch(Exception e) {
-        }
-
-        Class generatedRemoteWrapper = null;
-        try {
-            generatedRemoteWrapper =
-                appClassLoader.loadClass(wrapperClassName);
-        } catch(Exception e) {
-        }
-
-        if( (generatedRemoteIntf != null) &&
-            (generatedRemoteWrapper != null) ) {
+        String generatedRemoteIntfName = EJBUtils.getGeneratedRemoteIntfName(businessInterfaceName);
+        String wrapperClassName = EJBUtils.getGeneratedRemoteWrapperName(businessInterfaceName);
+        Class<?> generatedRemoteIntf = loadClassIgnoringExceptions(appClassLoader, generatedRemoteIntfName);
+        Class<?> generatedRemoteWrapper = loadClassIgnoringExceptions(appClassLoader, wrapperClassName);
+        if (generatedRemoteIntf != null && generatedRemoteWrapper != null) {
             return;
         }
 
         Wrapper._setClassLoader(appClassLoader);
-
         try {
-            if( generatedRemoteIntf == null ) {
-
-                RemoteGenerator gen = new RemoteGenerator(appClassLoader,
-                                                          businessInterfaceName);
-
-                Class developerClass = appClassLoader.loadClass(businessInterfaceName);
+            if (generatedRemoteIntf == null) {
+                RemoteGenerator gen = new RemoteGenerator(appClassLoader, businessInterfaceName);
+                Class<?> developerClass = appClassLoader.loadClass(businessInterfaceName);
                 generateAndLoad(gen, generatedRemoteIntfName, appClassLoader, developerClass);
 
             }
+            if (generatedRemoteWrapper == null) {
+                Remote30WrapperGenerator gen = new Remote30WrapperGenerator(appClassLoader, businessInterfaceName,
+                    generatedRemoteIntfName);
 
-            if( generatedRemoteWrapper == null ) {
-
-                Remote30WrapperGenerator gen = new Remote30WrapperGenerator
-                    (appClassLoader, businessInterfaceName,
-                     generatedRemoteIntfName);
-
-                Class developerClass = appClassLoader.loadClass(businessInterfaceName);
+                Class<?> developerClass = appClassLoader.loadClass(businessInterfaceName);
                 generateAndLoad(gen, wrapperClassName, appClassLoader, developerClass);
             }
-
         } finally {
-            // Fix for 7075: Make sure no classloader is bound to threadlocal:
-            // avoid possible classloader leak.
+            // Make sure no classloader is bound to threadlocal: avoid possible classloader leak.
             Wrapper._setClassLoader(null) ;
         }
     }
@@ -530,81 +495,46 @@
     }
 
 
-    public static Class generateSEI(ClassGeneratorFactory cgf,
-                                    final ClassLoader loader,
-                                    final Class beanClass) {
+    public static Class generateSEI(ClassGeneratorFactory cgf, ClassLoader loader, Class beanClass) {
+        Class<?> clazz = loadClassIgnoringExceptions(loader, cgf.className());
+        if (clazz != null) {
+            return clazz;
+        }
         return generateAndLoad(cgf, cgf.className(), loader, beanClass);
-
     }
 
 
-    private static Class generateAndLoad(ClassGeneratorFactory cgf,
-            final String actualClassName,
-            final ClassLoader loader,
-            final Class protectionDomainBase) {
-        Class clazz = loadClassIgnoringExceptions(loader, actualClassName);
+    private synchronized static Class<?> generateAndLoad(
+        final ClassGeneratorFactory factory, final String requestedClassName,
+        final ClassLoader loader, final Class<?> anchorClass) {
+
+        Class<?> clazz = loadClassIgnoringExceptions(loader, requestedClassName);
         if (clazz != null) {
             return clazz;
         }
 
-        synchronized (EJBUtils.class) {
-            clazz = loadClassIgnoringExceptions(loader, actualClassName);
-            if (clazz != null) {
-                return clazz;
-            }
+        factory.evaluate();
 
-            cgf.evaluate();
-
-            final Properties props = new Properties();
-            if (_logger.isLoggable(Level.FINE)) {
-
-                props.put(DUMP_AFTER_SETUP_VISITOR, "true");
-                props.put(TRACE_BYTE_CODE_GENERATION, "true");
-                props.put(USE_ASM_VERIFIER, "true");
-
-                try {
-
-                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                    PrintStream ps = new PrintStream(baos);
-
-                    _sourceCode(ps, props);
-                    _logger.fine(baos.toString());
-
-                } catch (Exception e) {
-                    _logger.log(Level.FINE, "exception generating src", e);
-                }
-
-            }
-
-            Class result = null;
+        final Properties props = new Properties();
+        if (_logger.isLoggable(Level.FINEST)) {
+            props.put(DUMP_AFTER_SETUP_VISITOR, "true");
+            props.put(TRACE_BYTE_CODE_GENERATION, "true");
+            props.put(USE_ASM_VERIFIER, "true");
             try {
-                if (System.getSecurityManager() == null) {
-                    result = _generate(loader, protectionDomainBase.getProtectionDomain(),
-                            props);
-                } else {
-                    result = (Class) java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() {
-                        public java.lang.Object run() {
-                            return _generate(loader, protectionDomainBase.getProtectionDomain(),
-                                    props);
-                        }
-                    });
-                }
-            } catch (RuntimeException runEx) {
-                // We would have got this exception if there were two (or more)
-                // concurrent threads that attempted to define the same class
-                // Lets try to load the class and if we are able to load it
-                // then we can ignore the exception. Else throw the original exception
-                try {
-                    result = loader.loadClass(actualClassName);
-                    _logger.log(Level.FINE, "[EJBUtils] Got exception ex: " + runEx
-                            + " but loaded class: " + result.getName());
-                } catch (ClassNotFoundException cnfEx) {
-                    throw runEx;
-                }
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                PrintStream ps = new PrintStream(baos);
+                Wrapper._sourceCode(ps, props);
+                _logger.fine(baos.toString());
+            } catch (Exception e) {
+                _logger.log(Level.SEVERE, "Exception generating src for logs", e);
             }
-
-            return result;
         }
+
+        if (System.getSecurityManager() == null) {
+            return Wrapper._generate(anchorClass, props);
+        }
+        PrivilegedAction<Class<?>> action = () -> Wrapper._generate(anchorClass, props);
+        return AccessController.doPrivileged(action);
     }
 
     private static Class<?> loadClassIgnoringExceptions(ClassLoader classLoader, String className) {