Mercurial > hg > release > thermostat-0.11
changeset 138:90264e5705e3
Implement view action support.
author | Roman Kennke <rkennke@redhat.com> |
---|---|
date | Fri, 23 Mar 2012 22:00:26 +0100 |
parents | 09902abbe349 |
children | 09f0c7f7d73a |
files | common/src/main/java/com/redhat/thermostat/common/ActionEvent.java common/src/main/java/com/redhat/thermostat/common/ActionListener.java common/src/main/java/com/redhat/thermostat/common/ActionNotifier.java common/src/test/java/com/redhat/thermostat/common/ActionEventTest.java common/src/test/java/com/redhat/thermostat/common/ActionNotifierTest.java |
diffstat | 5 files changed, 453 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/src/main/java/com/redhat/thermostat/common/ActionEvent.java Fri Mar 23 22:00:26 2012 +0100 @@ -0,0 +1,89 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.common; + +import java.util.EventObject; + +public class ActionEvent<T extends Enum<?>> extends EventObject { + + public ActionEvent(Object source, T actionId) { + super(source); + if (actionId == null) { + throw new NullPointerException(); + } + this.actionId = actionId; + } + + private T actionId; + + public T getActionId() { + return actionId; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + actionId.hashCode(); + result = prime * result + source.hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + @SuppressWarnings("rawtypes") + ActionEvent other = (ActionEvent) obj; + if (! actionId.equals(other.actionId)) { + return false; + } + if (! source.equals(other.source)) { + return false; + } + return true; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/src/main/java/com/redhat/thermostat/common/ActionListener.java Fri Mar 23 22:00:26 2012 +0100 @@ -0,0 +1,42 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.common; + +public interface ActionListener<T extends Enum<?>> { + + void actionPerformed(ActionEvent<T> actionEvent); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/src/main/java/com/redhat/thermostat/common/ActionNotifier.java Fri Mar 23 22:00:26 2012 +0100 @@ -0,0 +1,68 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.common; + +import java.util.Collection; +import java.util.concurrent.CopyOnWriteArrayList; + +public class ActionNotifier<T extends Enum<?>> { + + public ActionNotifier(Object source) { + this.source = source; + listeners = new CopyOnWriteArrayList<ActionListener<T>>(); + } + + private final Collection<ActionListener<T>> listeners; + + private final Object source; + + public void addActionListener(ActionListener<T> listener) { + listeners.add(listener); + } + + public void removeActionListener(ActionListener<T> listener) { + listeners.remove(listener); + } + + public void fireAction(T testId1) { + ActionEvent<T> action = new ActionEvent<>(source, testId1); + for (ActionListener<T> listener : listeners) { + listener.actionPerformed(action); + } + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/src/test/java/com/redhat/thermostat/common/ActionEventTest.java Fri Mar 23 22:00:26 2012 +0100 @@ -0,0 +1,124 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.common; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class ActionEventTest { + + private enum TestId { + TEST_ID1, TEST_ID2 + } + + @Test + public void testGetActionId() { + ActionEvent<TestId> viewActionEvent = new ActionEvent<>(new Object(), TestId.TEST_ID1); + assertEquals(TestId.TEST_ID1, viewActionEvent.getActionId()); + } + + @Test(expected=NullPointerException.class) + public void verifyThatNullActionIdThrowsNPE() { + new ActionEvent<>(new Object(), null); + } + + @Test + public void testEqualsEquals() { + Object source = new Object(); + ActionEvent<TestId> action1 = new ActionEvent<>(source, TestId.TEST_ID1); + ActionEvent<TestId> action2 = new ActionEvent<>(source, TestId.TEST_ID1); + assertTrue(action1.equals(action2)); + } + + @Test + public void testEqualsDifferentSource() { + Object source1 = new Object(); + Object source2 = new Object(); + ActionEvent<TestId> action1 = new ActionEvent<>(source1, TestId.TEST_ID1); + ActionEvent<TestId> action2 = new ActionEvent<>(source2, TestId.TEST_ID1); + assertFalse(action1.equals(action2)); + } + + @Test + public void testEqualsDifferentId() { + Object source = new Object(); + ActionEvent<TestId> action1 = new ActionEvent<>(source, TestId.TEST_ID1); + ActionEvent<TestId> action2 = new ActionEvent<>(source, TestId.TEST_ID2); + assertFalse(action1.equals(action2)); + } + + @Test + public void testEqualsNull() { + Object source = new Object(); + ActionEvent<TestId> action1 = new ActionEvent<>(source, TestId.TEST_ID1); + assertFalse(action1.equals(null)); + } + + @Test + public void testEqualsSame() { + Object source = new Object(); + ActionEvent<TestId> action1 = new ActionEvent<>(source, TestId.TEST_ID1); + assertTrue(action1.equals(action1)); + } + + @Test + public void testEqualsOtherType() { + Object source = new Object(); + ActionEvent<TestId> action1 = new ActionEvent<>(source, TestId.TEST_ID1); + assertFalse(action1.equals("test")); + } + + @Test + public void testHashCodeEquals() { + Object source = new Object(); + ActionEvent<TestId> action1 = new ActionEvent<>(source, TestId.TEST_ID1); + ActionEvent<TestId> action2 = new ActionEvent<>(source, TestId.TEST_ID1); + assertTrue(action1.hashCode() == action2.hashCode()); + } + + @Test + public void testHashCodeStaysSame() { + Object source = new Object(); + ActionEvent<TestId> action1 = new ActionEvent<>(source, TestId.TEST_ID1); + int hashCode1 = action1.hashCode(); + int hashCode2 = action1.hashCode(); + assertTrue(hashCode1 == hashCode2); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/src/test/java/com/redhat/thermostat/common/ActionNotifierTest.java Fri Mar 23 22:00:26 2012 +0100 @@ -0,0 +1,130 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.common; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import org.junit.Test; + +public class ActionNotifierTest { + + private enum TestId { + TEST_ID1 + } + + + @Test + public void verifySingleListenerNotification() { + + Object source = new Object(); + ActionNotifier<TestId> viewActionSupport = new ActionNotifier<TestId>(source); + @SuppressWarnings("unchecked") + ActionListener<TestId> listener = mock(ActionListener.class); + viewActionSupport.addActionListener(listener); + + viewActionSupport.fireAction(TestId.TEST_ID1); + + verify(listener).actionPerformed(new ActionEvent<TestId>(source, TestId.TEST_ID1)); + } + + @Test + public void verifyMultiListenerNotification() { + + Object source = new Object(); + ActionNotifier<TestId> viewActionSupport = new ActionNotifier<TestId>(source); + @SuppressWarnings("unchecked") + ActionListener<TestId> listener1 = mock(ActionListener.class); + @SuppressWarnings("unchecked") + ActionListener<TestId> listener2 = mock(ActionListener.class); + @SuppressWarnings("unchecked") + ActionListener<TestId> listener3 = mock(ActionListener.class); + viewActionSupport.addActionListener(listener1); + viewActionSupport.addActionListener(listener2); + viewActionSupport.addActionListener(listener3); + + viewActionSupport.fireAction(TestId.TEST_ID1); + + verify(listener1).actionPerformed(new ActionEvent<TestId>(source, TestId.TEST_ID1)); + verify(listener2).actionPerformed(new ActionEvent<TestId>(source, TestId.TEST_ID1)); + verify(listener3).actionPerformed(new ActionEvent<TestId>(source, TestId.TEST_ID1)); + } + + @Test + public void verifyRemoveListener() { + Object source = new Object(); + ActionNotifier<TestId> viewActionSupport = new ActionNotifier<TestId>(source); + @SuppressWarnings("unchecked") + ActionListener<TestId> listener = mock(ActionListener.class); + viewActionSupport.addActionListener(listener); + viewActionSupport.removeActionListener(listener); + + viewActionSupport.fireAction(TestId.TEST_ID1); + + verify(listener, never()).actionPerformed(new ActionEvent<TestId>(source, TestId.TEST_ID1)); + } + + @Test + public void testRemoveWhileNotifying() { + Object source = new Object(); + final ActionNotifier<TestId> viewActionSupport = new ActionNotifier<TestId>(source); + final boolean[] listenerCalled = new boolean[] { false }; + + final ActionListener<TestId> listener = new ActionListener<TestId>() { + + @Override + public void actionPerformed(ActionEvent<TestId> viewActionEvent) { + viewActionSupport.removeActionListener(this); + listenerCalled[0] = true; + } + + }; + viewActionSupport.addActionListener(listener); + + viewActionSupport.fireAction(TestId.TEST_ID1); + + assertTrue(listenerCalled[0]); + + listenerCalled[0] = false; + viewActionSupport.fireAction(TestId.TEST_ID1); + assertFalse(listenerCalled[0]); + } + +}