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);
}
/**