Backport of bug 394400
- This backport contains changes to the isOverriddenEvent() method in EntityListener to prevent a NullPointerException from occurring under load
- The backport code is unchanged from the original fix, checked into 2.4.2, and is still present in master
- Core & JPA LRG = OK
diff --git a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java
index 327bf68..2159684 100644
--- a/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java
+++ b/jpa/org.eclipse.persistence.jpa/src/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java
@@ -282,16 +282,16 @@
     public boolean isOverriddenEvent(DescriptorEvent event, Vector eventManagers) {

         int eventCode = event.getEventCode();

         String forSubclass = event.getDescriptor().getJavaClassName();

+        Hashtable<Integer, Boolean> subClassMap = m_overriddenEvents.get(forSubclass);

         

         // If we haven't built an overridden events map for this subclass, do so now.

-        if (! m_overriddenEvents.containsKey(forSubclass)) {

-            m_overriddenEvents.put(forSubclass, new Hashtable<Integer, Boolean>());

+        if (subClassMap == null) {

+            subClassMap = new Hashtable<Integer, Boolean>();

         }

         

         // Now check the individual events for this subclass.

-        if (! m_overriddenEvents.get(forSubclass).containsKey(eventCode)) {

-            m_overriddenEvents.get(forSubclass).put(eventCode, false); // default

-

+        if (! subClassMap.containsKey(eventCode)) {

+            boolean hasOverrides = false;

             if (hasEventMethods(eventCode)) {

                 List<Method> eventMethods = getEventMethods(eventCode);

                 

@@ -304,16 +304,23 @@
                             break;

                         } else {

                             if (childListener.hasOverriddenEventMethod(eventMethod, eventCode)) {

-                                m_overriddenEvents.get(forSubclass).put(eventCode, true);

-                                break; // stop looking

+                                hasOverrides = true;

+                                break;

                             }

                         }

                     }

+                    if (hasOverrides){

+                        break;

+                    }

                 }

             }

+            subClassMap.put(eventCode, hasOverrides);

+            //putting this here prevents a vm reorder from putting an unbuilt Map in the 

+            //m_overriddenEvents collection

+            m_overriddenEvents.put(forSubclass, subClassMap);

         }

         

-        return m_overriddenEvents.get(forSubclass).get(eventCode);

+        return subClassMap.get(eventCode);

     }

     

     /**