You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jr...@apache.org on 2012/03/07 16:20:04 UTC
svn commit: r1297989 -
/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/LifecycleEventManager.java
Author: jrbauer
Date: Wed Mar 7 15:20:04 2012
New Revision: 1297989
URL: http://svn.apache.org/viewvc?rev=1297989&view=rev
Log:
OPENJPA-2143 reverting back to previous revision
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/LifecycleEventManager.java
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/LifecycleEventManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/LifecycleEventManager.java?rev=1297989&r1=1297988&r2=1297989&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/LifecycleEventManager.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/LifecycleEventManager.java Wed Mar 7 15:20:04 2012
@@ -27,9 +27,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.MetaDataDefaults;
import org.apache.openjpa.lib.util.Localizer;
@@ -67,7 +64,6 @@ public class LifecycleEventManager
private boolean _firing = false;
private boolean _fail = false;
private boolean _failFast = false;
- private ReadWriteLock _rwLock = new ReentrantReadWriteLock();
/**
* Whether to fail after first exception when firing events to listeners.
@@ -87,65 +83,55 @@ public class LifecycleEventManager
* Register a lifecycle listener for the given classes. If the classes
* array is null, register for all classes.
*/
- public void addListener(Object listener, Class<?>[] classes) {
+ public synchronized void addListener(Object listener, Class<?>[] classes) {
if (listener == null)
return;
if (classes != null && classes.length == 0)
return;
- _rwLock.writeLock().lock();
- try {
- if (_firing) {
- _addListeners.add(listener);
- _addListeners.add(classes);
- return;
- }
-
- if (classes == null) {
- if (_listeners == null)
- _listeners = new ListenerList(5);
- _listeners.add(listener);
- return;
- }
-
- if (_classListeners == null)
- _classListeners = new HashMap<Class<?>, ListenerList>();
- ListenerList listeners;
- for (int i = 0; i < classes.length; i++) {
- listeners = (ListenerList) _classListeners.get(classes[i]);
- if (listeners == null) {
- listeners = new ListenerList(3);
- _classListeners.put(classes[i], listeners);
- }
- listeners.add(listener);
+ if (_firing) {
+ _addListeners.add(listener);
+ _addListeners.add(classes);
+ return;
+ }
+
+ if (classes == null) {
+ if (_listeners == null)
+ _listeners = new ListenerList(5);
+ _listeners.add(listener);
+ return;
+ }
+
+ if (_classListeners == null)
+ _classListeners = new HashMap<Class<?>, ListenerList>();
+ ListenerList listeners;
+ for (int i = 0; i < classes.length; i++) {
+ listeners = (ListenerList) _classListeners.get(classes[i]);
+ if (listeners == null) {
+ listeners = new ListenerList(3);
+ _classListeners.put(classes[i], listeners);
}
- } finally {
- _rwLock.writeLock().unlock();
+ listeners.add(listener);
}
}
/**
* Remove the given listener.
*/
- public void removeListener(Object listener) {
- _rwLock.writeLock().lock();
- try {
- if (_firing) {
- _remListeners.add(listener);
- return;
- }
-
- if (_listeners != null && _listeners.remove(listener))
- return;
- if (_classListeners != null) {
- ListenerList listeners;
- for (Iterator<ListenerList> itr = _classListeners.values().iterator();
- itr.hasNext();) {
- listeners = (ListenerList) itr.next();
- listeners.remove(listener);
- }
+ public synchronized void removeListener(Object listener) {
+ if (_firing) {
+ _remListeners.add(listener);
+ return;
+ }
+
+ if (_listeners != null && _listeners.remove(listener))
+ return;
+ if (_classListeners != null) {
+ ListenerList listeners;
+ for (Iterator<ListenerList> itr = _classListeners.values().iterator();
+ itr.hasNext();) {
+ listeners = (ListenerList) itr.next();
+ listeners.remove(listener);
}
- } finally {
- _rwLock.writeLock().unlock();
}
}
@@ -280,68 +266,63 @@ public class LifecycleEventManager
/**
* Fire lifecycle event to all registered listeners.
*/
- public Exception[] fireEvent(Object source, Object related,
+ public synchronized Exception[] fireEvent(Object source, Object related,
ClassMetaData meta, int type) {
- _rwLock.writeLock().lock();
- try {
- boolean reentrant = _firing;
- _firing = true;
- List<Exception> exceptions = (reentrant) ? new LinkedList<Exception>() : _exceps;
- MetaDataDefaults def = meta.getRepository().getMetaDataFactory().
- getDefaults();
-
- boolean callbacks = def.getCallbacksBeforeListeners(type);
- if (callbacks)
- makeCallbacks(source, related, meta, type, exceptions);
-
- LifecycleEvent ev = (LifecycleEvent) fireEvent(null, source, related,
- type, _listeners, false, exceptions);
-
- if (_classListeners != null) {
- Class<?> c = source == null ? meta.getDescribedType() : source.getClass();
- do {
- ev = (LifecycleEvent) fireEvent(ev, source, related, type,
- (ListenerList) _classListeners.get(c), false, exceptions);
- c = c.getSuperclass();
- } while (c != null && c != Object.class);
- }
-
- // make system listeners
- if (!meta.getLifecycleMetaData().getIgnoreSystemListeners()) {
- ListenerList system = meta.getRepository().getSystemListeners();
- fireEvent(ev, source, related, type, system, false, exceptions);
- }
-
- if (!callbacks)
- makeCallbacks(source, related, meta, type, exceptions);
-
- // create return array before clearing exceptions
- Exception[] ret;
- if (exceptions.isEmpty())
- ret = EMPTY_EXCEPTIONS;
- else
- ret = (Exception[]) exceptions.toArray
- (new Exception[exceptions.size()]);
-
- // if this wasn't a reentrant call, catch up with calls to add
- // and remove listeners made while firing
- if (!reentrant) {
- _firing = false;
- _fail = false;
- if (!_addListeners.isEmpty())
- for (Iterator<Object> itr = _addListeners.iterator(); itr.hasNext();)
- addListener(itr.next(), (Class[]) itr.next());
- if (!_remListeners.isEmpty())
- for (Iterator<Object> itr = _remListeners.iterator(); itr.hasNext();)
- removeListener(itr.next());
- _addListeners.clear();
- _remListeners.clear();
- _exceps.clear();
- }
- return ret;
- } finally {
- _rwLock.writeLock().unlock();
+ boolean reentrant = _firing;
+ _firing = true;
+ List<Exception> exceptions = (reentrant) ? new LinkedList<Exception>() : _exceps;
+ MetaDataDefaults def = meta.getRepository().getMetaDataFactory().
+ getDefaults();
+
+ boolean callbacks = def.getCallbacksBeforeListeners(type);
+ if (callbacks)
+ makeCallbacks(source, related, meta, type, exceptions);
+
+ LifecycleEvent ev = (LifecycleEvent) fireEvent(null, source, related,
+ type, _listeners, false, exceptions);
+
+ if (_classListeners != null) {
+ Class<?> c = source == null ? meta.getDescribedType() : source.getClass();
+ do {
+ ev = (LifecycleEvent) fireEvent(ev, source, related, type,
+ (ListenerList) _classListeners.get(c), false, exceptions);
+ c = c.getSuperclass();
+ } while (c != null && c != Object.class);
+ }
+
+ // make system listeners
+ if (!meta.getLifecycleMetaData().getIgnoreSystemListeners()) {
+ ListenerList system = meta.getRepository().getSystemListeners();
+ fireEvent(ev, source, related, type, system, false, exceptions);
+ }
+
+ if (!callbacks)
+ makeCallbacks(source, related, meta, type, exceptions);
+
+ // create return array before clearing exceptions
+ Exception[] ret;
+ if (exceptions.isEmpty())
+ ret = EMPTY_EXCEPTIONS;
+ else
+ ret = (Exception[]) exceptions.toArray
+ (new Exception[exceptions.size()]);
+
+ // if this wasn't a reentrant call, catch up with calls to add
+ // and remove listeners made while firing
+ if (!reentrant) {
+ _firing = false;
+ _fail = false;
+ if (!_addListeners.isEmpty())
+ for (Iterator<Object> itr = _addListeners.iterator(); itr.hasNext();)
+ addListener(itr.next(), (Class[]) itr.next());
+ if (!_remListeners.isEmpty())
+ for (Iterator<Object> itr = _remListeners.iterator(); itr.hasNext();)
+ removeListener(itr.next());
+ _addListeners.clear();
+ _remListeners.clear();
+ _exceps.clear();
}
+ return ret;
}
/**
@@ -651,8 +632,8 @@ public class LifecycleEventManager
if (listener instanceof AttachListener) {
types |= 2 << LifecycleEvent.BEFORE_ATTACH;
types |= 2 << LifecycleEvent.AFTER_ATTACH;
- }
- return types;
- }
- }
+ }
+ return types;
+ }
+ }
}