You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2010/08/20 00:27:05 UTC
svn commit: r987336 - in /commons/proper/lang/trunk/src:
main/java/org/apache/commons/lang3/event/EventListenerSupport.java
test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java
Author: mbenson
Date: Thu Aug 19 22:27:05 2010
New Revision: 987336
URL: http://svn.apache.org/viewvc?rev=987336&view=rev
Log:
allow subclass custom invocation handling
Modified:
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java
Modified: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java?rev=987336&r1=987335&r2=987336&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java (original)
+++ commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java Thu Aug 19 22:27:05 2010
@@ -219,17 +219,6 @@ public class EventListenerSupport<L> imp
}
/**
- * Create the proxy object.
- * @param listenerInterface
- * @param classLoader
- */
- private void createProxy(Class<L> listenerInterface, ClassLoader classLoader) {
- proxy = listenerInterface.cast(Proxy.newProxyInstance(classLoader,
- new Class[]{listenerInterface},
- new ProxyInvocationHandler()));
- }
-
- /**
* Serialize.
* @param objectOutputStream
* @throws IOException
@@ -279,16 +268,35 @@ public class EventListenerSupport<L> imp
* @param classLoader
*/
private void initializeTransientFields(Class<L> listenerInterface, ClassLoader classLoader) {
- createProxy(listenerInterface, classLoader);
@SuppressWarnings("unchecked")
L[] array = (L[]) Array.newInstance(listenerInterface, 0);
this.prototypeArray = array;
+ createProxy(listenerInterface, classLoader);
+ }
+
+ /**
+ * Create the proxy object.
+ * @param listenerInterface
+ * @param classLoader
+ */
+ private void createProxy(Class<L> listenerInterface, ClassLoader classLoader) {
+ proxy = listenerInterface.cast(Proxy.newProxyInstance(classLoader,
+ new Class[] { listenerInterface }, createInvocationHandler()));
+ }
+
+ /**
+ * Create the {@link InvocationHandler} responsible for broadcasting calls
+ * to the managed listeners. Subclasses can override to provide custom behavior.
+ * @return ProxyInvocationHandler
+ */
+ protected InvocationHandler createInvocationHandler() {
+ return new ProxyInvocationHandler();
}
/**
* An invocation handler used to dispatch the event(s) to all the listeners.
*/
- private class ProxyInvocationHandler implements InvocationHandler
+ protected class ProxyInvocationHandler implements InvocationHandler
{
/** Serialization version */
private static final long serialVersionUID = 1L;
Modified: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java?rev=987336&r1=987335&r2=987336&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java (original)
+++ commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java Thu Aug 19 22:27:05 2010
@@ -27,6 +27,7 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
@@ -180,6 +181,39 @@ public class EventListenerSupportTest ex
assertEquals(0, deserializedListenerSupport.getListeners().length);
}
+ public void testSubclassInvocationHandling() {
+
+ @SuppressWarnings("serial")
+ EventListenerSupport<ActionListener> eventListenerSupport = new EventListenerSupport<ActionListener>(
+ ActionListener.class) {
+ protected java.lang.reflect.InvocationHandler createInvocationHandler() {
+ return new ProxyInvocationHandler() {
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ return "actionPerformed".equals(method.getName())
+ && "ignore".equals(((ActionEvent) args[0]).getActionCommand()) ? null
+ : super.invoke(proxy, method, args);
+ }
+ };
+ };
+ };
+
+ ActionListener listener = EasyMock.createNiceMock(ActionListener.class);
+ eventListenerSupport.addListener(listener);
+ Object source = new Object();
+ ActionEvent ignore = new ActionEvent(source, 0, "ignore");
+ ActionEvent respond = new ActionEvent(source, 1, "respond");
+ listener.actionPerformed(respond);
+ EasyMock.replay(listener);
+ eventListenerSupport.fire().actionPerformed(ignore);
+ eventListenerSupport.fire().actionPerformed(respond);
+ EasyMock.verify(listener);
+ }
+
private void addDeregisterListener(final EventListenerSupport<ActionListener> listenerSupport)
{
listenerSupport.addListener(new ActionListener()