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/09/21 18:05:38 UTC

[1/7] incubator-brooklyn git commit: yaml DSL: use class-renames for sensor/object

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 21b74b450 -> 3082169da


yaml DSL: use class-renames for sensor/object


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/a566d32e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/a566d32e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/a566d32e

Branch: refs/heads/master
Commit: a566d32eb8a305591c2e27c693484913fb6bfc92
Parents: b10d23b
Author: Aled Sage <al...@gmail.com>
Authored: Fri Sep 18 19:27:03 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 21 14:33:19 2015 +0100

----------------------------------------------------------------------
 .../camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java  | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a566d32e/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index 8f1483c..92dc14e 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -38,6 +38,7 @@ import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent.Scope;
 import org.apache.brooklyn.core.entity.EntityDynamicType;
 import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider;
 import org.apache.brooklyn.core.sensor.DependentConfiguration;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.config.ConfigBag;
@@ -47,6 +48,7 @@ import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.core.task.DeferredSupplier;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.Reflections;
 import org.apache.brooklyn.util.text.StringEscapes.JavaStringEscapes;
 import org.apache.brooklyn.util.text.Strings;
@@ -111,7 +113,9 @@ public class BrooklynDslCommon {
     public static Sensor<?> sensor(String clazzName, String sensorName) {
         try {
             // TODO Should use catalog's classloader, rather than Class.forName; how to get that? Should we return a future?!
-            Class<?> clazz = Class.forName(clazzName);
+            String mappedClazzName = DeserializingClassRenamesProvider.findMappedName(clazzName);
+            Class<?> clazz = Class.forName(mappedClazzName);
+            
             Sensor<?> sensor;
             if (Entity.class.isAssignableFrom(clazz)) {
                 sensor = new EntityDynamicType((Class<? extends Entity>) clazz).getSensor(sensorName);
@@ -150,7 +154,9 @@ public class BrooklynDslCommon {
         Map<String,Object> brooklynConfig = (Map<String, Object>) config.getStringKeyMaybe(BrooklynCampReservedKeys.BROOKLYN_CONFIG).or(MutableMap.of());
         try {
             // TODO Should use catalog's classloader, rather than Class.forName; how to get that? Should we return a future?!
-            Class<?> type = Class.forName(typeName);
+            String mappedTypeName = DeserializingClassRenamesProvider.findMappedName(typeName);
+            Class<?> type = Class.forName(mappedTypeName);
+            
             if (!Reflections.hasNoArgConstructor(type)) {
                 throw new IllegalStateException(String.format("Cannot construct %s bean: No public no-arg constructor available", type));
             }


[5/7] incubator-brooklyn git commit: Update deprecated code in subscription tests

Posted by al...@apache.org.
Update deprecated code in subscription tests


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/0d9b3a81
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/0d9b3a81
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/0d9b3a81

Branch: refs/heads/master
Commit: 0d9b3a810e02fad2e0fb6dad0cfda579c3fedb93
Parents: a566d32
Author: Aled Sage <al...@gmail.com>
Authored: Fri Sep 18 19:34:33 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 21 14:33:20 2015 +0100

----------------------------------------------------------------------
 .../core/entity/EntitySubscriptionTest.java     | 44 ++++++++++----------
 .../internal/LocalSubscriptionManagerTest.java  |  4 +-
 .../policy/basic/PolicySubscriptionTest.java    | 22 +++++-----
 .../SubscriptionPerformanceTest.java            |  6 +--
 4 files changed, 37 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0d9b3a81/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java
index 599d28c..8b8d244 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java
@@ -23,7 +23,6 @@ import static org.testng.Assert.assertEquals;
 import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.SubscriptionHandle;
-import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.location.SimulatedLocation;
 import org.apache.brooklyn.core.sensor.BasicSensorEvent;
 import org.apache.brooklyn.core.test.entity.TestApplication;
@@ -81,10 +80,10 @@ public class EntitySubscriptionTest {
         entity.subscribe(observedEntity, TestEntity.NAME, listener);
         entity.subscribe(observedEntity, TestEntity.MY_NOTIF, listener);
         
-        otherEntity.setAttribute(TestEntity.SEQUENCE, 123);
-        observedEntity.setAttribute(TestEntity.SEQUENCE, 123);
-        observedEntity.setAttribute(TestEntity.NAME, "myname");
-        observedEntity.emit(TestEntity.MY_NOTIF, 456);
+        otherEntity.sensors().set(TestEntity.SEQUENCE, 123);
+        observedEntity.sensors().set(TestEntity.SEQUENCE, 123);
+        observedEntity.sensors().set(TestEntity.NAME, "myname");
+        observedEntity.sensors().emit(TestEntity.MY_NOTIF, 456);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -99,8 +98,8 @@ public class EntitySubscriptionTest {
     public void testSubscriptionToAllReceivesEvents() {
         entity.subscribe(null, TestEntity.SEQUENCE, listener);
         
-        observedEntity.setAttribute(TestEntity.SEQUENCE, 123);
-        otherEntity.setAttribute(TestEntity.SEQUENCE, 456);
+        observedEntity.sensors().set(TestEntity.SEQUENCE, 123);
+        otherEntity.sensors().set(TestEntity.SEQUENCE, 456);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -114,8 +113,8 @@ public class EntitySubscriptionTest {
     public void testSubscribeToChildrenReceivesEvents() {
         entity.subscribeToChildren(observedEntity, TestEntity.SEQUENCE, listener);
         
-        observedChildEntity.setAttribute(TestEntity.SEQUENCE, 123);
-        observedEntity.setAttribute(TestEntity.SEQUENCE, 456);
+        observedChildEntity.sensors().set(TestEntity.SEQUENCE, 123);
+        observedEntity.sensors().set(TestEntity.SEQUENCE, 456);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -129,7 +128,7 @@ public class EntitySubscriptionTest {
         entity.subscribeToChildren(observedEntity, TestEntity.SEQUENCE, listener);
         
         final TestEntity observedChildEntity2 = observedEntity.createAndManageChild(EntitySpec.create(TestEntity.class));
-        observedChildEntity2.setAttribute(TestEntity.SEQUENCE, 123);
+        observedChildEntity2.sensors().set(TestEntity.SEQUENCE, 123);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -142,8 +141,8 @@ public class EntitySubscriptionTest {
     public void testSubscribeToMembersReceivesEvents() {
         entity.subscribeToMembers(observedGroup, TestEntity.SEQUENCE, listener);
         
-        observedMemberEntity.setAttribute(TestEntity.SEQUENCE, 123);
-        ((EntityLocal)observedGroup).setAttribute(TestEntity.SEQUENCE, 456);
+        observedMemberEntity.sensors().set(TestEntity.SEQUENCE, 123);
+        ((EntityLocal)observedGroup).sensors().set(TestEntity.SEQUENCE, 456);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -158,7 +157,7 @@ public class EntitySubscriptionTest {
         
         final TestEntity observedMemberEntity2 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         observedGroup.addMember(observedMemberEntity2);
-        observedMemberEntity2.setAttribute(TestEntity.SEQUENCE, 123);
+        observedMemberEntity2.sensors().set(TestEntity.SEQUENCE, 123);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -173,7 +172,7 @@ public class EntitySubscriptionTest {
         
         observedGroup.removeMember(observedMemberEntity);
         
-        observedMemberEntity.setAttribute(TestEntity.SEQUENCE, 123);
+        observedMemberEntity.sensors().set(TestEntity.SEQUENCE, 123);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -189,10 +188,10 @@ public class EntitySubscriptionTest {
         entity.subscribe(otherEntity, TestEntity.SEQUENCE, listener);
         entity.unsubscribe(observedEntity);
         
-        observedEntity.setAttribute(TestEntity.SEQUENCE, 123);
-        observedEntity.setAttribute(TestEntity.NAME, "myname");
-        observedEntity.emit(TestEntity.MY_NOTIF, 123);
-        otherEntity.setAttribute(TestEntity.SEQUENCE, 456);
+        observedEntity.sensors().set(TestEntity.SEQUENCE, 123);
+        observedEntity.sensors().set(TestEntity.NAME, "myname");
+        observedEntity.sensors().emit(TestEntity.MY_NOTIF, 123);
+        otherEntity.sensors().set(TestEntity.SEQUENCE, 456);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -209,9 +208,9 @@ public class EntitySubscriptionTest {
         
         entity.unsubscribe(observedEntity, handle2);
         
-        observedEntity.setAttribute(TestEntity.SEQUENCE, 123);
-        observedEntity.setAttribute(TestEntity.NAME, "myname");
-        otherEntity.setAttribute(TestEntity.SEQUENCE, 456);
+        observedEntity.sensors().set(TestEntity.SEQUENCE, 123);
+        observedEntity.sensors().set(TestEntity.NAME, "myname");
+        otherEntity.sensors().set(TestEntity.SEQUENCE, 456);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -227,7 +226,7 @@ public class EntitySubscriptionTest {
         entity.subscribe(observedEntity, TestEntity.MY_NOTIF, listener);
 
         for (int i = 0; i < NUM_EVENTS; i++) {
-            observedEntity.emit(TestEntity.MY_NOTIF, i);
+            observedEntity.sensors().emit(TestEntity.MY_NOTIF, i);
         }
         
         Asserts.succeedsEventually(new Runnable() {
@@ -238,5 +237,4 @@ public class EntitySubscriptionTest {
                 }
             }});
     }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0d9b3a81/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManagerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManagerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManagerTest.java
index 1e5dda1..08efee4 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManagerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManagerTest.java
@@ -128,7 +128,7 @@ public class LocalSubscriptionManagerTest extends BrooklynAppUnitTestSupport {
                 events.add(event);
                 latch.countDown();
             }});
-        member.setAttribute(TestEntity.SEQUENCE, 123);
+        member.sensors().set(TestEntity.SEQUENCE, 123);
 
         if (!latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
             fail("Timeout waiting for Event on parent TestEntity listener");
@@ -168,7 +168,7 @@ public class LocalSubscriptionManagerTest extends BrooklynAppUnitTestSupport {
         try {
             thread.start();
             for (int i = 0; i < 10000; i++) {
-                entity.setAttribute(TestEntity.SEQUENCE, i);
+                entity.sensors().set(TestEntity.SEQUENCE, i);
             }
         } finally {
             thread.interrupt();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0d9b3a81/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java b/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java
index ed4a9c0..fa7333f 100644
--- a/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java
@@ -65,10 +65,10 @@ public class PolicySubscriptionTest extends BrooklynAppUnitTestSupport {
         policy.subscribe(entity, TestEntity.NAME, listener);
         policy.subscribe(entity, TestEntity.MY_NOTIF, listener);
         
-        otherEntity.setAttribute(TestEntity.SEQUENCE, 456);
-        entity.setAttribute(TestEntity.SEQUENCE, 123);
-        entity.setAttribute(TestEntity.NAME, "myname");
-        entity.emit(TestEntity.MY_NOTIF, 789);
+        otherEntity.sensors().set(TestEntity.SEQUENCE, 456);
+        entity.sensors().set(TestEntity.SEQUENCE, 123);
+        entity.sensors().set(TestEntity.NAME, "myname");
+        entity.sensors().emit(TestEntity.MY_NOTIF, 789);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {
@@ -87,10 +87,10 @@ public class PolicySubscriptionTest extends BrooklynAppUnitTestSupport {
         policy.subscribe(otherEntity, TestEntity.SEQUENCE, listener);
         policy.unsubscribe(entity);
         
-        entity.setAttribute(TestEntity.SEQUENCE, 123);
-        entity.setAttribute(TestEntity.NAME, "myname");
-        entity.emit(TestEntity.MY_NOTIF, 456);
-        otherEntity.setAttribute(TestEntity.SEQUENCE, 789);
+        entity.sensors().set(TestEntity.SEQUENCE, 123);
+        entity.sensors().set(TestEntity.NAME, "myname");
+        entity.sensors().emit(TestEntity.MY_NOTIF, 456);
+        otherEntity.sensors().set(TestEntity.SEQUENCE, 789);
         
         Thread.sleep(SHORT_WAIT_MS);
         Asserts.succeedsEventually(new Runnable() {
@@ -108,9 +108,9 @@ public class PolicySubscriptionTest extends BrooklynAppUnitTestSupport {
         
         policy.unsubscribe(entity, handle2);
         
-        entity.setAttribute(TestEntity.SEQUENCE, 123);
-        entity.setAttribute(TestEntity.NAME, "myname");
-        otherEntity.setAttribute(TestEntity.SEQUENCE, 456);
+        entity.sensors().set(TestEntity.SEQUENCE, 123);
+        entity.sensors().set(TestEntity.NAME, "myname");
+        otherEntity.sensors().set(TestEntity.SEQUENCE, 456);
         
         Asserts.succeedsEventually(new Runnable() {
             @Override public void run() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0d9b3a81/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/SubscriptionPerformanceTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/SubscriptionPerformanceTest.java b/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/SubscriptionPerformanceTest.java
index 3c4a14d..154c0e6 100644
--- a/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/SubscriptionPerformanceTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/test/qa/performance/SubscriptionPerformanceTest.java
@@ -84,7 +84,7 @@ public class SubscriptionPerformanceTest extends AbstractPerformanceTest {
         measureAndAssert("updateAttributeWithManyPublishedOneSubscriber", numIterations, minRatePerSec,
                 new Runnable() {
                     public void run() {
-                        entity.setAttribute(TestEntity.SEQUENCE, (iter.getAndIncrement()));
+                        entity.sensors().set(TestEntity.SEQUENCE, (iter.getAndIncrement()));
                     }
                 },
                 new Runnable() {
@@ -121,7 +121,7 @@ public class SubscriptionPerformanceTest extends AbstractPerformanceTest {
         measureAndAssert("updateAttributeWithManyListeners", numIterations, minRatePerSec,
                 new Runnable() {
                     @Override public void run() {
-                        entity.setAttribute(TestEntity.SEQUENCE, (iter.getAndIncrement()));
+                        entity.sensors().set(TestEntity.SEQUENCE, (iter.getAndIncrement()));
                     }},
                 new Runnable() {
                         public void run() {
@@ -157,7 +157,7 @@ public class SubscriptionPerformanceTest extends AbstractPerformanceTest {
         
         measureAndAssert("updateAttributeWithUnrelatedListeners", numIterations, minRatePerSec, new Runnable() {
             @Override public void run() {
-                entity.setAttribute(TestEntity.SEQUENCE, (iter.incrementAndGet()));
+                entity.sensors().set(TestEntity.SEQUENCE, (iter.incrementAndGet()));
             }});
         
         if (exception.get() != null) {


[2/7] incubator-brooklyn git commit: Fix synchronization in DeserializingClassRenamesProvider

Posted by al...@apache.org.
Fix synchronization in DeserializingClassRenamesProvider

Fix bad use of double-checked locking.


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/b10d23b0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/b10d23b0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/b10d23b0

Branch: refs/heads/master
Commit: b10d23b0868625064a683048fe490e0fedbdf774
Parents: 10c6576
Author: Aled Sage <al...@gmail.com>
Authored: Fri Sep 18 19:26:41 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 21 14:33:19 2015 +0100

----------------------------------------------------------------------
 .../persist/DeserializingClassRenamesProvider.java | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b10d23b0/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java
index 9fbac01..9c8c056 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java
@@ -38,19 +38,22 @@ public class DeserializingClassRenamesProvider {
 
     public static final String DESERIALIZING_CLASS_RENAMES_PROPERTIES_PATH = "classpath://org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties";
     
-    private static Map<String, String> cache = null;
+    private static volatile Map<String, String> cache;
     
     @Beta
     public static Map<String, String> loadDeserializingClassRenames() {
-        if (cache!=null) return cache;
-        synchronized (DeserializingClassRenamesProvider.class) {
-            cache = loadDeserializingClassRenamesCache();
-            return cache;
+        // Double-checked locking - got to use volatile or some such!
+        if (cache == null) {
+            synchronized (DeserializingClassRenamesProvider.class) {
+                if (cache == null) {
+                    cache = loadDeserializingClassRenamesCache();
+                }
+            }
         }
+        return cache;
     }
     
-    private synchronized static Map<String, String> loadDeserializingClassRenamesCache() {
-        if (cache!=null) return cache;
+    private static Map<String, String> loadDeserializingClassRenamesCache() {
         InputStream resource = new ResourceUtils(DeserializingClassRenamesProvider.class).getResourceFromUrl(DESERIALIZING_CLASS_RENAMES_PROPERTIES_PATH);
         if (resource != null) {
             try {


[3/7] incubator-brooklyn git commit: Fix SoftwareProcess.ServiceNotUpDiagnosticsCollector race

Posted by al...@apache.org.
Fix SoftwareProcess.ServiceNotUpDiagnosticsCollector race

Previously we subscribed to serviceUp and then called onUpdated.
However, this meant that it could execute onUpdated in two threads
concurrently (if we very quickly got a callback of serviceUp changing).

Instead we now use “notifyOfInitialValue”, which will call us in our
event-handling thread with the initial value of the sensor as a 
pseudo-event for the subscription manager.


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/23d95802
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/23d95802
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/23d95802

Branch: refs/heads/master
Commit: 23d9580225d4481d80a808e09f0699616dcfef30
Parents: 7ee7d41
Author: Aled Sage <al...@gmail.com>
Authored: Fri Sep 18 20:00:11 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 21 14:33:20 2015 +0100

----------------------------------------------------------------------
 .../apache/brooklyn/entity/software/base/SoftwareProcessImpl.java | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/23d95802/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
index 54b7c47..33cd4f4 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
@@ -157,8 +157,7 @@ public abstract class SoftwareProcessImpl extends AbstractEntity implements Soft
             if (!(entity instanceof SoftwareProcess)) {
                 throw new IllegalArgumentException("Expected SoftwareProcess, but got entity "+entity);
             }
-            subscribe(entity, Attributes.SERVICE_UP, this);
-            onUpdated();
+            subscribe(ImmutableMap.of("notifyOfInitialValue", true), entity, Attributes.SERVICE_UP, this);
         }
 
         @Override


[6/7] incubator-brooklyn git commit: subscriptions: support notifyOfInitialValue

Posted by al...@apache.org.
subscriptions: support notifyOfInitialValue

If pass in notifyOfInitialValue=true when subscribing to a single
entity:attribute, then the listener will be called with the current
value (rather than waiting for the first change).


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/7ee7d410
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/7ee7d410
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/7ee7d410

Branch: refs/heads/master
Commit: 7ee7d41026d180aeb4cf9206f86b7b0a7eb263d4
Parents: 0d9b3a8
Author: Aled Sage <al...@gmail.com>
Authored: Fri Sep 18 19:55:29 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 21 14:33:20 2015 +0100

----------------------------------------------------------------------
 .../apache/brooklyn/api/entity/EntityLocal.java | 13 +++++-
 .../brooklyn/api/mgmt/SubscriptionContext.java  |  2 +-
 .../brooklyn/core/entity/AbstractEntity.java    |  7 ++++
 .../mgmt/internal/BasicSubscriptionContext.java |  4 +-
 .../mgmt/internal/LocalSubscriptionManager.java | 41 ++++++++++++++++++-
 .../core/mgmt/internal/SubscriptionTracker.java | 10 ++++-
 .../core/objs/AbstractEntityAdjunct.java        |  8 ++++
 .../brooklyn/enricher/stock/UpdatingMap.java    |  4 +-
 .../core/entity/EntitySubscriptionTest.java     | 43 ++++++++++++++++++++
 .../policy/basic/PolicySubscriptionTest.java    | 30 ++++++++++++++
 10 files changed, 153 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java b/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java
index 5533949..7e5e963 100644
--- a/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java
+++ b/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java
@@ -115,7 +115,18 @@ public interface EntityLocal extends Entity {
     // FIXME remove from interface?
     @Beta
     <T> SubscriptionHandle subscribe(Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener);
- 
+
+    /**
+     * Allow us to subscribe to data from a {@link Sensor} on another entity.
+     * 
+     * @return a subscription id which can be used to unsubscribe
+     *
+     * @see SubscriptionManager#subscribe(Map, Entity, Sensor, SensorEventListener)
+     */
+    // FIXME remove from interface?
+    @Beta
+    <T> SubscriptionHandle subscribe(Map<String, ?> flags, Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener);
+
     /** @see SubscriptionManager#subscribeToChildren(Map, Entity, Sensor, SensorEventListener) */
     // FIXME remove from interface?
     @Beta

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/api/src/main/java/org/apache/brooklyn/api/mgmt/SubscriptionContext.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/SubscriptionContext.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/SubscriptionContext.java
index 7b4e6e7..3328b1a 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/SubscriptionContext.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/SubscriptionContext.java
@@ -34,7 +34,7 @@ public interface SubscriptionContext {
     /**
      * As {@link SubscriptionManager#subscribe(Map, Entity, Sensor, SensorEventListener)} with default subscription parameters for this context
      */
-    <T> SubscriptionHandle subscribe(Map<String, Object> flags, Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener);
+    <T> SubscriptionHandle subscribe(Map<String, ?> flags, Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener);
  
     /** @see #subscribe(Map, Entity, Sensor, SensorEventListener) */
     <T> SubscriptionHandle subscribe(Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
index 5dc110d..03254dd 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
@@ -1337,6 +1337,13 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
         return getSubscriptionTracker().subscribe(producer, sensor, listener);
     }
 
+    /** @see EntityLocal#subscribe */
+    @Override
+    @Beta
+    public <T> SubscriptionHandle subscribe(Map<String, ?> flags, Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
+        return getSubscriptionTracker().subscribe(flags, producer, sensor, listener);
+    }
+
     /** @see EntityLocal#subscribeToChildren */
     @Override
     public <T> SubscriptionHandle subscribeToChildren(Entity parent, Sensor<T> sensor, SensorEventListener<? super T> listener) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicSubscriptionContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicSubscriptionContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicSubscriptionContext.java
index 5c38b81..d821c4e 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicSubscriptionContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicSubscriptionContext.java
@@ -70,7 +70,7 @@ public class BasicSubscriptionContext implements SubscriptionContext {
     }
     
     @SuppressWarnings("rawtypes")
-    public <T> SubscriptionHandle subscribe(Map<String, Object> newFlags, Entity producer, Sensor<T> sensor, Closure c) {
+    public <T> SubscriptionHandle subscribe(Map<String, ?> newFlags, Entity producer, Sensor<T> sensor, Closure c) {
         return subscribe(newFlags, producer, sensor, toSensorEventListener(c));        
     }
 
@@ -80,7 +80,7 @@ public class BasicSubscriptionContext implements SubscriptionContext {
     }
     
     @Override
-    public <T> SubscriptionHandle subscribe(Map<String, Object> newFlags, Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
+    public <T> SubscriptionHandle subscribe(Map<String, ?> newFlags, Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
         Map<String,Object> subscriptionFlags = Maps.newLinkedHashMap(flags);
         if (newFlags != null) subscriptionFlags.putAll(newFlags);
         return manager.subscribe(subscriptionFlags, producer, sensor, listener);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManager.java
index 6ea94a1..7743995 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManager.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManager.java
@@ -37,10 +37,13 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.ExecutionManager;
 import org.apache.brooklyn.api.mgmt.SubscriptionHandle;
 import org.apache.brooklyn.api.mgmt.SubscriptionManager;
+import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
 import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.sensor.BasicSensorEvent;
+import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.task.BasicExecutionManager;
 import org.apache.brooklyn.util.core.task.SingleThreadedScheduler;
 import org.apache.brooklyn.util.text.Identifiers;
@@ -90,7 +93,7 @@ public class LocalSubscriptionManager extends AbstractSubscriptionManager {
     }
     
     @SuppressWarnings("unchecked")
-    protected synchronized <T> SubscriptionHandle subscribe(Map<String, Object> flags, Subscription<T> s) {
+    protected synchronized <T> SubscriptionHandle subscribe(Map<String, Object> flags, final Subscription<T> s) {
         Entity producer = s.producer;
         Sensor<T> sensor= s.sensor;
         s.subscriber = getSubscriber(flags, s);
@@ -105,6 +108,7 @@ public class LocalSubscriptionManager extends AbstractSubscriptionManager {
             s.subscriberExecutionManagerTagSupplied = false;
         }
         s.eventFilter = (Predicate<SensorEvent<T>>) flags.remove("eventFilter");
+        boolean notifyOfInitialValue = Boolean.TRUE.equals(flags.remove("notifyOfInitialValue"));
         s.flags = flags;
         
         if (LOG.isDebugEnabled()) LOG.debug("Creating subscription {} for {} on {} {} in {}", new Object[] {s.id, s.subscriber, producer, sensor, this});
@@ -116,6 +120,41 @@ public class LocalSubscriptionManager extends AbstractSubscriptionManager {
         if (!s.subscriberExecutionManagerTagSupplied && s.subscriberExecutionManagerTag!=null) {
             ((BasicExecutionManager) em).setTaskSchedulerForTag(s.subscriberExecutionManagerTag, SingleThreadedScheduler.class);
         }
+
+        if (notifyOfInitialValue) {
+            if (producer == null) {
+                LOG.warn("Cannot notifyOfInitialValue for subscription with wildcard producer: "+s);
+            } else if (sensor == null) {
+                LOG.warn("Cannot notifyOfInitialValue for subscription with wilcard sensor: "+s);
+            } else if (!(sensor instanceof AttributeSensor)) {
+                LOG.warn("Cannot notifyOfInitialValue for subscription with non-attribute sensor: "+s);
+            } else {
+                if (LOG.isTraceEnabled()) LOG.trace("sending initial value of {} -> {} to {}", new Object[] {s.producer, s.sensor, s});
+                Map<String, Object> tagsMap = MutableMap.of("tag", s.subscriberExecutionManagerTag);
+                em.submit(tagsMap, new Runnable() {
+                    @Override
+                    public String toString() {
+                        return "LSM.publishInitialValue("+s.producer+", "+s.sensor+")";
+                    }
+                    public void run() {
+                        Object val = s.producer.getAttribute((AttributeSensor<?>) s.sensor);
+                        @SuppressWarnings("rawtypes") // TODO s.listener.onEvent gives compilation error if try to use <T>
+                        SensorEvent event = new BasicSensorEvent(s.sensor, s.producer, val);
+                        if (s.eventFilter!=null && !s.eventFilter.apply(event))
+                            return;
+                        try {
+                            s.listener.onEvent(event);
+                        } catch (Throwable t) {
+                            if (event!=null && event.getSource()!=null && Entities.isNoLongerManaged(event.getSource())) {
+                                LOG.debug("Error processing initial-value subscription to "+LocalSubscriptionManager.this+", after entity unmanaged: "+t, t);
+                            } else {
+                                LOG.warn("Error processing initial-value subscription to "+LocalSubscriptionManager.this+": "+t, t);
+                            }
+                        }
+                    }});
+            }
+        }
+        
         return s;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/SubscriptionTracker.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/SubscriptionTracker.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/SubscriptionTracker.java
index 2faad3a..3d5793c 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/SubscriptionTracker.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/SubscriptionTracker.java
@@ -19,6 +19,7 @@
 package org.apache.brooklyn.core.mgmt.internal;
 
 import java.util.Collection;
+import java.util.Map;
 
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.Group;
@@ -29,6 +30,7 @@ import org.apache.brooklyn.api.sensor.SensorEventListener;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.SetMultimap;
 
 /**
@@ -57,13 +59,17 @@ public class SubscriptionTracker {
     
     /** @see SubscriptionContext#subscribe(Entity, Sensor, SensorEventListener) */
     public <T> SubscriptionHandle subscribe(Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
-        SubscriptionHandle handle = context.subscribe(producer, sensor, listener);
+        return subscribe(ImmutableMap.<String, Object>of(), producer, sensor, listener);
+    }
+
+    public <T> SubscriptionHandle subscribe(Map<String, ?> flags, Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
+        SubscriptionHandle handle = context.subscribe(flags, producer, sensor, listener);
         synchronized (subscriptions) {
             subscriptions.put(producer, handle);
         }
         return handle;
     }
-    
+
     /** @see SubscriptionContext#subscribeToChildren(Entity, Sensor, SensorEventListener) */
     public <T> SubscriptionHandle subscribeToChildren(Entity parent, Sensor<T> sensor, SensorEventListener<? super T> listener) {
         SubscriptionHandle handle = context.subscribeToChildren(parent, sensor, listener);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
index e85cc73..fb71901 100644
--- a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
+++ b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
@@ -392,6 +392,14 @@ public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject imple
     }
 
     @VisibleForTesting //intended as protected, meant for subclasses
+    @Beta
+    /** @see SubscriptionContext#subscribe(Map, Entity, Sensor, SensorEventListener) */
+    public <T> SubscriptionHandle subscribe(Map<String, ?> flags, Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
+        if (!checkCanSubscribe()) return null;
+        return getSubscriptionTracker().subscribe(flags, producer, sensor, listener);
+    }
+
+    @VisibleForTesting //intended as protected, meant for subclasses
     /** @see SubscriptionContext#subscribe(Entity, Sensor, SensorEventListener) */
     public <T> SubscriptionHandle subscribeToMembers(Group producerGroup, Sensor<T> sensor, SensorEventListener<? super T> listener) {
         if (!checkCanSubscribe(producerGroup)) return null;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/core/src/main/java/org/apache/brooklyn/enricher/stock/UpdatingMap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/UpdatingMap.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/UpdatingMap.java
index b09b6d6..43aec92 100644
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/UpdatingMap.java
+++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/UpdatingMap.java
@@ -36,6 +36,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.common.reflect.TypeToken;
 
@@ -102,8 +103,7 @@ public class UpdatingMap<S,TKey,TVal> extends AbstractEnricher implements Sensor
         this.computing = (Function) getRequiredConfig(COMPUTING);
         this.removingIfResultIsNull = getConfig(REMOVING_IF_RESULT_IS_NULL);
 
-        subscribe(entity, sourceSensor, this);
-        onUpdated();
+        subscribe(ImmutableMap.of("notifyOfInitialValue", true), entity, sourceSensor, this);
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java
index 8b8d244..620d8e0 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntitySubscriptionTest.java
@@ -34,12 +34,15 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 
 public class EntitySubscriptionTest {
 
     // TODO Duplication between this and PolicySubscriptionTest
     
+    private static final long SHORT_WAIT_MS = 100;
+
     private SimulatedLocation loc;
     private TestApplication app;
     private TestEntity entity;
@@ -237,4 +240,44 @@ public class EntitySubscriptionTest {
                 }
             }});
     }
+
+    @Test
+    public void testSubscriptionReceivesInitialValueEvents() {
+        observedEntity.sensors().set(TestEntity.SEQUENCE, 123);
+        observedEntity.sensors().set(TestEntity.NAME, "myname");
+        
+        entity.subscribe(ImmutableMap.of("notifyOfInitialValue", true), observedEntity, TestEntity.SEQUENCE, listener);
+        entity.subscribe(ImmutableMap.of("notifyOfInitialValue", true), observedEntity, TestEntity.NAME, listener);
+        
+        Asserts.succeedsEventually(new Runnable() {
+            @Override public void run() {
+                assertEquals(listener.getEvents(), ImmutableList.of(
+                        new BasicSensorEvent<Integer>(TestEntity.SEQUENCE, observedEntity, 123),
+                        new BasicSensorEvent<String>(TestEntity.NAME, observedEntity, "myname")));
+            }});
+    }
+
+    
+    @Test
+    public void testSubscriptionNotReceivesInitialValueEventsByDefault() {
+        observedEntity.sensors().set(TestEntity.SEQUENCE, 123);
+        observedEntity.sensors().set(TestEntity.NAME, "myname");
+        
+        entity.subscribe(observedEntity, TestEntity.SEQUENCE, listener);
+        entity.subscribe(observedEntity, TestEntity.NAME, listener);
+        
+        Asserts.succeedsContinually(ImmutableMap.of("timeout", SHORT_WAIT_MS), new Runnable() {
+            @Override public void run() {
+                assertEquals(listener.getEvents(), ImmutableList.of());
+            }});
+    }
+
+    // TODO A visual inspection test that we get a log.warn telling us we can't get the initial-value
+    @Test
+    public void testSubscriptionForInitialValueWhenNotValid() {
+        entity.subscribe(ImmutableMap.of("notifyOfInitialValue", true), observedEntity, TestEntity.MY_NOTIF, listener);
+        entity.subscribe(ImmutableMap.of("notifyOfInitialValue", true), observedEntity, null, listener);
+        entity.subscribe(ImmutableMap.of("notifyOfInitialValue", true), null, TestEntity.NAME, listener);
+        entity.subscribe(ImmutableMap.of("notifyOfInitialValue", true), null, null, listener);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7ee7d410/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java b/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java
index fa7333f..ab5bc4a 100644
--- a/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/policy/basic/PolicySubscriptionTest.java
@@ -33,6 +33,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
 public class PolicySubscriptionTest extends BrooklynAppUnitTestSupport {
 
@@ -119,5 +120,34 @@ public class PolicySubscriptionTest extends BrooklynAppUnitTestSupport {
                         new BasicSensorEvent<Integer>(TestEntity.SEQUENCE, otherEntity, 456)));
             }});
     }
+
+    @Test
+    public void testSubscriptionReceivesInitialValueEvents() {
+        entity.sensors().set(TestEntity.SEQUENCE, 123);
+        entity.sensors().set(TestEntity.NAME, "myname");
+        
+        policy.subscribe(ImmutableMap.of("notifyOfInitialValue", true), entity, TestEntity.SEQUENCE, listener);
+        policy.subscribe(ImmutableMap.of("notifyOfInitialValue", true), entity, TestEntity.NAME, listener);
+        
+        Asserts.succeedsEventually(new Runnable() {
+            @Override public void run() {
+                assertEquals(listener.getEvents(), ImmutableList.of(
+                        new BasicSensorEvent<Integer>(TestEntity.SEQUENCE, entity, 123),
+                        new BasicSensorEvent<String>(TestEntity.NAME, entity, "myname")));
+            }});
+    }
     
+    @Test
+    public void testSubscriptionNotReceivesInitialValueEventsByDefault() {
+        entity.sensors().set(TestEntity.SEQUENCE, 123);
+        entity.sensors().set(TestEntity.NAME, "myname");
+        
+        policy.subscribe(entity, TestEntity.SEQUENCE, listener);
+        policy.subscribe(entity, TestEntity.NAME, listener);
+        
+        Asserts.succeedsContinually(ImmutableMap.of("timeout", SHORT_WAIT_MS), new Runnable() {
+            @Override public void run() {
+                assertEquals(listener.getEvents(), ImmutableList.of());
+            }});
+    }
 }


[4/7] incubator-brooklyn git commit: ServiceNotUpDiagnostics: populate properly

Posted by al...@apache.org.
ServiceNotUpDiagnostics: populate properly

Previously we only re-populated the ServiceNotUpDiagnostics when
serviceUp changed. However, this meant we did it once at the start
(where it said “no-driver”) and then not again if startup failed,
so serviceUp was left as “false”.

Now we also re-populate the ServiceNotUpDiagnostics if the serviceState
changes (and serviceUp=false), e.g. if we conclude on-fire etc.


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/9157eb9c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/9157eb9c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/9157eb9c

Branch: refs/heads/master
Commit: 9157eb9c434602d91ea6a897364026cb5844748b
Parents: 23d9580
Author: Aled Sage <al...@gmail.com>
Authored: Fri Sep 18 20:52:51 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 21 14:33:20 2015 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/software/base/SoftwareProcessImpl.java    | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9157eb9c/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
index 33cd4f4..b635242 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
@@ -157,6 +157,7 @@ public abstract class SoftwareProcessImpl extends AbstractEntity implements Soft
             if (!(entity instanceof SoftwareProcess)) {
                 throw new IllegalArgumentException("Expected SoftwareProcess, but got entity "+entity);
             }
+            subscribe(ImmutableMap.of("notifyOfInitialValue", true), entity, Attributes.SERVICE_STATE_ACTUAL, this);
             subscribe(ImmutableMap.of("notifyOfInitialValue", true), entity, Attributes.SERVICE_UP, this);
         }
 
@@ -167,8 +168,12 @@ public abstract class SoftwareProcessImpl extends AbstractEntity implements Soft
 
         protected void onUpdated() {
             Boolean up = entity.getAttribute(SERVICE_UP);
+            Lifecycle state = entity.getAttribute(SERVICE_STATE_ACTUAL);
             if (up == null || up) {
-                entity.setAttribute(ServiceStateLogic.SERVICE_NOT_UP_DIAGNOSTICS, ImmutableMap.<String, Object>of());
+                entity.sensors().set(ServiceStateLogic.SERVICE_NOT_UP_DIAGNOSTICS, ImmutableMap.<String, Object>of());
+            } else if (state == Lifecycle.STOPPING || state == Lifecycle.STOPPED || state == Lifecycle.DESTROYED) {
+                // stopping/stopped, so expect not to be up; get rid of the diagnostics.
+                entity.sensors().set(ServiceStateLogic.SERVICE_NOT_UP_DIAGNOSTICS, ImmutableMap.<String, Object>of());
             } else {
                 ((SoftwareProcess)entity).populateServiceNotUpDiagnostics();
             }


[7/7] incubator-brooklyn git commit: This closes #912

Posted by al...@apache.org.
This closes #912


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/3082169d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/3082169d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/3082169d

Branch: refs/heads/master
Commit: 3082169da39ced2a14188f2841e4e0fa365f1213
Parents: 21b74b4 9157eb9
Author: Aled Sage <al...@gmail.com>
Authored: Mon Sep 21 17:05:23 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 21 17:05:23 2015 +0100

----------------------------------------------------------------------
 .../apache/brooklyn/api/entity/EntityLocal.java | 13 ++-
 .../brooklyn/api/mgmt/SubscriptionContext.java  |  2 +-
 .../brooklyn/core/entity/AbstractEntity.java    |  7 ++
 .../mgmt/internal/BasicSubscriptionContext.java |  4 +-
 .../mgmt/internal/LocalSubscriptionManager.java | 41 +++++++++-
 .../core/mgmt/internal/SubscriptionTracker.java | 10 ++-
 .../DeserializingClassRenamesProvider.java      | 17 ++--
 .../core/objs/AbstractEntityAdjunct.java        |  8 ++
 .../brooklyn/enricher/stock/UpdatingMap.java    |  4 +-
 .../core/entity/EntitySubscriptionTest.java     | 85 +++++++++++++++-----
 .../internal/LocalSubscriptionManagerTest.java  |  4 +-
 .../policy/basic/PolicySubscriptionTest.java    | 52 +++++++++---
 .../SubscriptionPerformanceTest.java            |  6 +-
 .../software/base/SoftwareProcessImpl.java      | 10 ++-
 .../spi/dsl/methods/BrooklynDslCommon.java      | 10 ++-
 15 files changed, 214 insertions(+), 59 deletions(-)
----------------------------------------------------------------------