From a48071b0d489420bfdc0c2ed7254d1dba243f700 Mon Sep 17 00:00:00 2001 From: Matthew Aguirre Date: Mon, 11 May 2015 13:22:50 -0400 Subject: [PATCH 1/4] Added new addListener() method that takes a boolean for if duplicates are allowed. Added test method to make sure that duplicate listeners are not added. --- .../lang3/event/EventListenerSupport.java | 21 ++++++++++++++++++- .../lang3/event/EventListenerSupportTest.java | 20 ++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java b/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java index 0f51796fb..4f3a9a77a 100644 --- a/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java +++ b/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java @@ -179,8 +179,27 @@ public L fire() { * null. */ public void addListener(final L listener) { + addListener(listener, true); + } + + /** + * Registers an event listener. Will not add a pre-existing listener + * object to the list if allowDuplicate is false. + * + * @param listener the event listener (may not be null). + * @param allowDuplicate the flag for determining if duplicate listener + * objects are allowed to be registered. + * + * @throws NullPointerException if listener is + * null. + */ + public void addListener(final L listener, boolean allowDuplicate) { Validate.notNull(listener, "Listener object cannot be null."); - listeners.add(listener); + if (allowDuplicate) { + listeners.add(listener); + } else if (!allowDuplicate && !listeners.contains(listener)) { + listeners.add(listener); + } } /** diff --git a/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java b/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java index 5f65125f6..d8772a309 100644 --- a/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java +++ b/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java @@ -41,6 +41,26 @@ */ public class EventListenerSupportTest { + @Test + public void testAddListenerNoDuplicates() { + final EventListenerSupport listenerSupport = EventListenerSupport.create(VetoableChangeListener.class); + + final VetoableChangeListener[] listeners = listenerSupport.getListeners(); + assertEquals(0, listeners.length); + assertEquals(VetoableChangeListener.class, listeners.getClass().getComponentType()); + final VetoableChangeListener[] empty = listeners; + //for fun, show that the same empty instance is used + assertSame(empty, listenerSupport.getListeners()); + + final VetoableChangeListener listener1 = EasyMock.createNiceMock(VetoableChangeListener.class); + listenerSupport.addListener(listener1); + assertEquals(1, listenerSupport.getListeners().length); + listenerSupport.addListener(listener1, false); + assertEquals(1, listenerSupport.getListeners().length); + listenerSupport.removeListener(listener1); + assertSame(empty, listenerSupport.getListeners()); + } + @Test(expected=NullPointerException.class) public void testAddNullListener() { From 5637a5204ffd7b77f569ed28f85610eb782a159e Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 12 May 2015 08:26:25 +0200 Subject: [PATCH 2/4] Format source code --- .../lang3/event/EventListenerSupportTest.java | 53 +++++++------------ 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java b/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java index d8772a309..2f1ecf101 100644 --- a/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java +++ b/src/test/java/org/apache/commons/lang3/event/EventListenerSupportTest.java @@ -39,8 +39,8 @@ /** * @since 3.0 */ -public class EventListenerSupportTest -{ +public class EventListenerSupportTest { + @Test public void testAddListenerNoDuplicates() { final EventListenerSupport listenerSupport = EventListenerSupport.create(VetoableChangeListener.class); @@ -61,23 +61,20 @@ public void testAddListenerNoDuplicates() { assertSame(empty, listenerSupport.getListeners()); } - @Test(expected=NullPointerException.class) - public void testAddNullListener() - { + @Test(expected = NullPointerException.class) + public void testAddNullListener() { final EventListenerSupport listenerSupport = EventListenerSupport.create(VetoableChangeListener.class); listenerSupport.addListener(null); } - @Test(expected=NullPointerException.class) - public void testRemoveNullListener() - { + @Test(expected = NullPointerException.class) + public void testRemoveNullListener() { final EventListenerSupport listenerSupport = EventListenerSupport.create(VetoableChangeListener.class); listenerSupport.removeListener(null); } @Test - public void testEventDispatchOrder() throws PropertyVetoException - { + public void testEventDispatchOrder() throws PropertyVetoException { final EventListenerSupport listenerSupport = EventListenerSupport.create(VetoableChangeListener.class); final List calledListeners = new ArrayList(); @@ -91,24 +88,20 @@ public void testEventDispatchOrder() throws PropertyVetoException assertSame(calledListeners.get(1), listener2); } - @Test(expected=IllegalArgumentException.class) - public void testCreateWithNonInterfaceParameter() - { + @Test(expected = IllegalArgumentException.class) + public void testCreateWithNonInterfaceParameter() { EventListenerSupport.create(String.class); } - @Test(expected=NullPointerException.class) - public void testCreateWithNullParameter() - { + @Test(expected = NullPointerException.class) + public void testCreateWithNullParameter() { EventListenerSupport.create(null); } @Test - public void testRemoveListenerDuringEvent() throws PropertyVetoException - { + public void testRemoveListenerDuringEvent() throws PropertyVetoException { final EventListenerSupport listenerSupport = EventListenerSupport.create(VetoableChangeListener.class); - for (int i = 0; i < 10; ++i) - { + for (int i = 0; i < 10; ++i) { addDeregisterListener(listenerSupport); } assertEquals(listenerSupport.getListenerCount(), 10); @@ -143,7 +136,7 @@ public void testGetListeners() { public void testSerialization() throws IOException, ClassNotFoundException, PropertyVetoException { final EventListenerSupport listenerSupport = EventListenerSupport.create(VetoableChangeListener.class); listenerSupport.addListener(new VetoableChangeListener() { - + @Override public void vetoableChange(final PropertyChangeEvent e) { } @@ -218,25 +211,19 @@ public Object invoke(final Object proxy, final Method method, final Object[] arg EasyMock.verify(listener); } - private void addDeregisterListener(final EventListenerSupport listenerSupport) - { - listenerSupport.addListener(new VetoableChangeListener() - { + private void addDeregisterListener(final EventListenerSupport listenerSupport) { + listenerSupport.addListener(new VetoableChangeListener() { @Override - public void vetoableChange(final PropertyChangeEvent e) - { + public void vetoableChange(final PropertyChangeEvent e) { listenerSupport.removeListener(this); } }); } - private VetoableChangeListener createListener(final List calledListeners) - { - return new VetoableChangeListener() - { + private VetoableChangeListener createListener(final List calledListeners) { + return new VetoableChangeListener() { @Override - public void vetoableChange(final PropertyChangeEvent e) - { + public void vetoableChange(final PropertyChangeEvent e) { calledListeners.add(this); } }; From 0611710c619e67affe9e3b6471943d0ccdb9da73 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 12 May 2015 08:29:10 +0200 Subject: [PATCH 3/4] allowDuplicates will always be false at that point --- .../org/apache/commons/lang3/event/EventListenerSupport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java b/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java index 4f3a9a77a..475af1b27 100644 --- a/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java +++ b/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java @@ -197,7 +197,7 @@ public void addListener(final L listener, boolean allowDuplicate) { Validate.notNull(listener, "Listener object cannot be null."); if (allowDuplicate) { listeners.add(listener); - } else if (!allowDuplicate && !listeners.contains(listener)) { + } else if (!listeners.contains(listener)) { listeners.add(listener); } } From 4ccfde2b57de4093a76cd905f14501e5e7bcb878 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 12 May 2015 08:29:21 +0200 Subject: [PATCH 4/4] Add LANG-1137 to changes.xml --- src/changes/changes.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 6a7a864dc..c848755c6 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -22,6 +22,7 @@ + Add check for duplicate event listener in EventListenerSupport FastDateParser_TimeZoneStrategyTest#testTimeZoneStrategyPattern fails on Windows with German Locale Add method containsAllWords to WordUtils ReflectionToStringBuilder doesn't throw IllegalArgumentException when the constructor's object param is null