From 844a70c588d87a96059f57ac8659050c58898a0f Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sat, 16 May 2015 10:15:28 +0100 Subject: [PATCH] Add way to remove listener - Change Region interface and underlying listener classes so that we can unregister registered listeners. --- .../listener/AbstractCompositeListener.java | 9 ++++ .../listener/OrderedComposite.java | 14 ++++++ .../statemachine/region/Region.java | 7 +++ .../support/AbstractStateMachine.java | 5 ++ .../CompositeStateMachineListenerTests.java | 49 +++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 spring-statemachine-core/src/test/java/org/springframework/statemachine/listener/CompositeStateMachineListenerTests.java diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/listener/AbstractCompositeListener.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/listener/AbstractCompositeListener.java index ec553566..c85e7c3d 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/listener/AbstractCompositeListener.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/listener/AbstractCompositeListener.java @@ -55,6 +55,15 @@ public class AbstractCompositeListener { listeners.add(listener); } + /** + * Unregister a listener. + * + * @param listener the listener + */ + public void unregister(T listener) { + listeners.remove(listener); + } + /** * Gets the listeners. * diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/listener/OrderedComposite.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/listener/OrderedComposite.java index b94c9660..cec69c9d 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/listener/OrderedComposite.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/listener/OrderedComposite.java @@ -82,6 +82,20 @@ public class OrderedComposite { list.addAll(unordered); } + /** + * Unregister item. + * + * @param item item + */ + public void remove(S item) { + ordered.remove(item); + unordered.remove(item); + Collections.sort(ordered, comparator); + list.clear(); + list.addAll(ordered); + list.addAll(unordered); + } + /** * Public getter for the list of items. The {@link Ordered} items come * first, followed by any unordered ones. diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/region/Region.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/region/Region.java index 5e5e1218..324a2bfc 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/region/Region.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/region/Region.java @@ -96,4 +96,11 @@ public interface Region { */ void addStateListener(StateMachineListener listener); + /** + * Removes the state listener. + * + * @param listener the listener + */ + void removeStateListener(StateMachineListener listener); + } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/AbstractStateMachine.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/AbstractStateMachine.java index f2922372..ef693597 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/AbstractStateMachine.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/AbstractStateMachine.java @@ -255,6 +255,11 @@ public abstract class AbstractStateMachine extends StateMachineObjectSuppo getStateListener().register(listener); } + @Override + public void removeStateListener(StateMachineListener listener) { + getStateListener().unregister(listener); + } + @Override public boolean isComplete() { if (currentState == null) { diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/listener/CompositeStateMachineListenerTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/listener/CompositeStateMachineListenerTests.java new file mode 100644 index 00000000..dd6a5055 --- /dev/null +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/listener/CompositeStateMachineListenerTests.java @@ -0,0 +1,49 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.statemachine.listener; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import java.util.List; + +import org.junit.Test; +import org.springframework.statemachine.TestUtils; + +public class CompositeStateMachineListenerTests { + + @Test + public void testRegister() throws Exception { + CompositeStateMachineListener listener = new CompositeStateMachineListener(); + StateMachineListenerAdapter adapter1 = new StateMachineListenerAdapter(); + listener.register(adapter1); + OrderedComposite> listeners = listener.getListeners(); + List list = TestUtils.readField("list", listeners); + assertThat(list.size(), is(1)); + } + + @Test + public void testUnregister() throws Exception { + CompositeStateMachineListener listener = new CompositeStateMachineListener(); + StateMachineListenerAdapter adapter1 = new StateMachineListenerAdapter(); + listener.register(adapter1); + listener.unregister(adapter1); + OrderedComposite> listeners = listener.getListeners(); + List list = TestUtils.readField("list", listeners); + assertThat(list.size(), is(0)); + } + +}