Adds sensor-notifications for GROUP_ADDED/REMOVED
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/0d9372ba Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/0d9372ba Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/0d9372ba Branch: refs/heads/master Commit: 0d9372babc4ec92e9b85e351142b8ea57000850b Parents: 70dfb20 Author: Aled Sage <[email protected]> Authored: Wed May 27 11:47:19 2015 +0100 Committer: Aled Sage <[email protected]> Committed: Tue Aug 11 20:04:29 2015 +0100 ---------------------------------------------------------------------- .../brooklyn/entity/basic/AbstractEntity.java | 24 +++++--- .../brooklyn/entity/basic/EntityTypeTest.java | 5 +- .../java/brooklyn/entity/group/GroupTest.java | 58 ++++++++++++++------ .../basic/RecordingSensorEventListener.java | 2 +- 4 files changed, 62 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0d9372ba/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java index aa40158..dfc8d35 100644 --- a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java +++ b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java @@ -119,9 +119,6 @@ import com.google.common.collect.Sets; * <p> * Note that config is typically inherited by children, whereas the fields and attributes are not. * <p> - * Though currently Groovy code, this is very likely to change to pure Java in a future release of - * Brooklyn so Groovy'isms should not be relied on. - * <p> * Sub-classes should have a no-argument constructor. When brooklyn creates an entity, it will: * <ol> * <li>Construct the entity via the no-argument constructor @@ -172,6 +169,11 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E public static final BasicNotificationSensor<Entity> CHILD_REMOVED = new BasicNotificationSensor<Entity>(Entity.class, "entity.children.removed", "Child dynamically removed from entity"); + public static final BasicNotificationSensor<Group> GROUP_ADDED = new BasicNotificationSensor<Group>(Group.class, + "entity.group.added", "Group dynamically added to entity"); + public static final BasicNotificationSensor<Group> GROUP_REMOVED = new BasicNotificationSensor<Group>(Group.class, + "entity.group.removed", "Group dynamically removed from entity"); + static { RendererHints.register(Entity.class, RendererHints.displayValue(EntityFunctions.displayName())); } @@ -673,15 +675,23 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E } @Override - public void addGroup(Group e) { - groups.add(e); + public void addGroup(Group group) { + boolean changed = groups.add(group); getApplication(); + + if (changed) { + emit(AbstractEntity.GROUP_ADDED, group); + } } @Override - public void removeGroup(Group e) { - groups.remove(e); + public void removeGroup(Group group) { + boolean changed = groups.remove(group); getApplication(); + + if (changed) { + emit(AbstractEntity.GROUP_REMOVED, group); + } } @Override http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0d9372ba/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java b/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java index 7035ccd..ea27129 100644 --- a/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java +++ b/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java @@ -23,6 +23,8 @@ import static brooklyn.entity.basic.AbstractEntity.CHILD_REMOVED; import static brooklyn.entity.basic.AbstractEntity.EFFECTOR_ADDED; import static brooklyn.entity.basic.AbstractEntity.EFFECTOR_CHANGED; import static brooklyn.entity.basic.AbstractEntity.EFFECTOR_REMOVED; +import static brooklyn.entity.basic.AbstractEntity.GROUP_ADDED; +import static brooklyn.entity.basic.AbstractEntity.GROUP_REMOVED; import static brooklyn.entity.basic.AbstractEntity.LOCATION_ADDED; import static brooklyn.entity.basic.AbstractEntity.LOCATION_REMOVED; import static brooklyn.entity.basic.AbstractEntity.POLICY_ADDED; @@ -72,7 +74,8 @@ public class EntityTypeTest extends BrooklynAppUnitTestSupport { EFFECTOR_ADDED, EFFECTOR_REMOVED, EFFECTOR_CHANGED, POLICY_ADDED, POLICY_REMOVED, CHILD_ADDED, CHILD_REMOVED, - LOCATION_ADDED, LOCATION_REMOVED); + LOCATION_ADDED, LOCATION_REMOVED, + GROUP_ADDED, GROUP_REMOVED); public static class EmptyEntityForTesting extends AbstractEntity {} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0d9372ba/core/src/test/java/brooklyn/entity/group/GroupTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/entity/group/GroupTest.java b/core/src/test/java/brooklyn/entity/group/GroupTest.java index 43a31c0..013b55e 100644 --- a/core/src/test/java/brooklyn/entity/group/GroupTest.java +++ b/core/src/test/java/brooklyn/entity/group/GroupTest.java @@ -20,49 +20,43 @@ package brooklyn.entity.group; import static org.testng.Assert.assertEquals; -import org.testng.annotations.AfterMethod; +import org.apache.brooklyn.entity.basic.RecordingSensorEventListener; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; + +import brooklyn.entity.BrooklynAppUnitTestSupport; import brooklyn.entity.Entity; +import brooklyn.entity.Group; +import brooklyn.entity.basic.AbstractEntity; import brooklyn.entity.basic.BasicGroup; import brooklyn.entity.basic.Entities; import brooklyn.entity.proxying.EntitySpec; import brooklyn.location.LocationSpec; import brooklyn.location.basic.SimulatedLocation; import brooklyn.test.Asserts; -import brooklyn.test.entity.TestApplication; import brooklyn.test.entity.TestEntity; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; - -public class GroupTest { +public class GroupTest extends BrooklynAppUnitTestSupport { - private static final int TIMEOUT_MS = 2000; - - private TestApplication app; private BasicGroup group; private TestEntity entity1; private TestEntity entity2; SimulatedLocation loc; - - @BeforeMethod - public void setUp() { - app = TestApplication.Factory.newManagedInstanceForTests(); + @BeforeMethod(alwaysRun=true) + @Override + public void setUp() throws Exception { + super.setUp(); loc = app.getManagementContext().getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); group = app.createAndManageChild(EntitySpec.create(BasicGroup.class)); entity1 = app.createAndManageChild(EntitySpec.create(TestEntity.class)); entity2 = app.createAndManageChild(EntitySpec.create(TestEntity.class)); } - @AfterMethod(alwaysRun = true) - public void tearDown(){ - if (app != null) Entities.destroyAll(app.getManagementContext()); - } - @Test public void testAddRemoveMembers() throws Exception { group.addMember(entity1); @@ -115,6 +109,34 @@ public class GroupTest { Entities.unmanage(entity1); } + @Test + public void testAddingAndRemovingGroupEmitsNotification() throws Exception { + final RecordingSensorEventListener<Group> groupAddedListener = new RecordingSensorEventListener<>(); + final RecordingSensorEventListener<Group> groupRemovedListener = new RecordingSensorEventListener<>(); + mgmt.getSubscriptionManager().subscribe(entity1, AbstractEntity.GROUP_ADDED, groupAddedListener); + mgmt.getSubscriptionManager().subscribe(entity1, AbstractEntity.GROUP_REMOVED, groupRemovedListener); + + entity1.addGroup(group); + Asserts.succeedsEventually(new Runnable() { + public void run() { + String msg = "events="+groupAddedListener.getEvents(); + assertEquals(groupAddedListener.getEvents().size(), 1, msg); + assertEquals(groupAddedListener.getEvents().get(0).getSource(), entity1, msg); + assertEquals(groupAddedListener.getEvents().get(0).getSensor(), AbstractEntity.GROUP_ADDED, msg); + }}); + assertEquals(groupRemovedListener.getEvents().size(), 0, "events="+groupRemovedListener.getEvents()); + + entity1.removeGroup(group); + Asserts.succeedsEventually(new Runnable() { + public void run() { + String msg = "events="+groupRemovedListener.getEvents(); + assertEquals(groupRemovedListener.getEvents().size(), 1, msg); + assertEquals(groupRemovedListener.getEvents().get(0).getSource(), entity1, msg); + assertEquals(groupRemovedListener.getEvents().get(0).getSensor(), AbstractEntity.GROUP_REMOVED, msg); + }}); + assertEquals(groupAddedListener.getEvents().size(), 1, "events="+groupAddedListener.getEvents()); + } + private void assertGroupMembers(Entity... expectedMembers) { Asserts.assertEqualsIgnoringOrder(group.getMembers(), ImmutableList.copyOf(expectedMembers)); assertEquals(group.getAttribute(BasicGroup.GROUP_SIZE), (Integer)expectedMembers.length); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0d9372ba/core/src/test/java/org/apache/brooklyn/entity/basic/RecordingSensorEventListener.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/entity/basic/RecordingSensorEventListener.java b/core/src/test/java/org/apache/brooklyn/entity/basic/RecordingSensorEventListener.java index 067b7d4..3cfcb27 100644 --- a/core/src/test/java/org/apache/brooklyn/entity/basic/RecordingSensorEventListener.java +++ b/core/src/test/java/org/apache/brooklyn/entity/basic/RecordingSensorEventListener.java @@ -63,7 +63,7 @@ public class RecordingSensorEventListener<T> implements SensorEventListener<T>, /** * @return An immutable iterable of the recorded events. */ - public Iterable<SensorEvent<T>> getEvents() { + public List<SensorEvent<T>> getEvents() { return ImmutableList.copyOf(events); }
