You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2015/08/11 22:42:48 UTC

[10/18] incubator-brooklyn git commit: Adds sensor-notifications for GROUP_ADDED/REMOVED

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 <al...@gmail.com>
Authored: Wed May 27 11:47:19 2015 +0100
Committer: Aled Sage <al...@gmail.com>
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);
     }