You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by dr...@apache.org on 2017/06/12 14:47:20 UTC

[1/7] brooklyn-server git commit: Use EnricherSpec, instead of enricher constructor

Repository: brooklyn-server
Updated Branches:
  refs/heads/master ed25e5e39 -> a98357415


Use EnricherSpec, instead of enricher constructor

Prefer use of EnricherSpec (so it definitely works with yaml as well,
and so we have one consistent way of creating things!)

Deletes some enricher constructors that take Map or ConfigBag arg


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

Branch: refs/heads/master
Commit: 91c4a5d26c00460465df2825fda5996e06adffdb
Parents: 78f41f8
Author: Aled Sage <al...@gmail.com>
Authored: Sun Jun 11 13:52:31 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Sun Jun 11 14:10:05 2017 +0100

----------------------------------------------------------------------
 .../entity/lifecycle/ServiceStateLogic.java     |  1 -
 .../brooklyn/enricher/stock/UpdatingMap.java    |  6 ----
 .../core/enricher/BasicEnricherTest.java        | 16 +++++----
 .../core/enricher/EnricherConfigTest.java       | 28 ++++++++--------
 .../core/policy/basic/EnricherTypeTest.java     |  8 +++--
 .../policy/enricher/HttpLatencyDetector.java    | 34 +++++++++++++++++---
 .../policy/ha/ServiceFailureDetector.java       | 15 ++-------
 .../enricher/HttpLatencyDetectorTest.java       |  8 ++---
 .../policy/enricher/RebindEnricherTest.java     |  2 +-
 9 files changed, 66 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/91c4a5d2/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/ServiceStateLogic.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/ServiceStateLogic.java b/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/ServiceStateLogic.java
index bfde073..ba08a44 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/ServiceStateLogic.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/ServiceStateLogic.java
@@ -278,7 +278,6 @@ public class ServiceStateLogic {
         private final AtomicInteger warnCounter = new AtomicInteger();
 
         public ComputeServiceState() {}
-        public ComputeServiceState(Map<?,?> flags) { super(flags); }
 
         @Override
         public void init() {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/91c4a5d2/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 501d199..6945d50 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
@@ -38,7 +38,6 @@ 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;
 
 /**
@@ -85,11 +84,6 @@ public class UpdatingMap<S,TKey,TVal> extends AbstractEnricher implements Sensor
     protected Boolean removingIfResultIsNull;
 
     public UpdatingMap() {
-        this(Maps.newLinkedHashMap());
-    }
-
-    public UpdatingMap(Map<Object, Object> flags) {
-        super(flags);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/91c4a5d2/core/src/test/java/org/apache/brooklyn/core/enricher/BasicEnricherTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/enricher/BasicEnricherTest.java b/core/src/test/java/org/apache/brooklyn/core/enricher/BasicEnricherTest.java
index ae61d0a..98ab41c 100644
--- a/core/src/test/java/org/apache/brooklyn/core/enricher/BasicEnricherTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/enricher/BasicEnricherTest.java
@@ -19,6 +19,7 @@
 package org.apache.brooklyn.core.enricher;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
 
 import java.util.Map;
 
@@ -27,9 +28,7 @@ import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.BasicConfigKey;
-import org.apache.brooklyn.core.enricher.AbstractEnricher;
 import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.core.test.entity.TestApplicationNoEnrichersImpl;
@@ -38,6 +37,7 @@ import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
 /**
@@ -52,7 +52,7 @@ public class BasicEnricherTest extends BrooklynAppUnitTestSupport {
     protected void setUpApp() {
         EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class, TestApplicationNoEnrichersImpl.class)
                 .configure(BrooklynConfigKeys.SKIP_ON_BOX_BASE_DIR_RESOLUTION, shouldSkipOnBoxBaseDirResolution());
-        app = ApplicationBuilder.newManagedApp(appSpec, mgmt);
+        app = mgmt.getEntityManager().createEntity(appSpec);
     }
 
     public static class MyEnricher extends AbstractEnricher {
@@ -79,7 +79,9 @@ public class BasicEnricherTest extends BrooklynAppUnitTestSupport {
         enricher.setDisplayName("Bob");
         enricher.config().set(MyEnricher.STR_KEY, "aval");
         enricher.config().set(MyEnricher.INT_KEY, 2);
+        
         app.enrichers().add(enricher);
+        assertTrue(app.enrichers().asList().contains(enricher), "enrichers="+app.enrichers());
         
         assertEquals(enricher.getDisplayName(), "Bob");
         assertEquals(enricher.getConfig(MyEnricher.STR_KEY), "aval");
@@ -91,6 +93,7 @@ public class BasicEnricherTest extends BrooklynAppUnitTestSupport {
         MyEnricher enricher = app.enrichers().add(EnricherSpec.create(MyEnricher.class)
             .displayName("Bob")
             .configure(MyEnricher.STR_KEY, "aval").configure(MyEnricher.INT_KEY, 2));
+        assertTrue(app.enrichers().asList().contains(enricher), "enrichers="+app.enrichers());
         
         assertEquals(enricher.getDisplayName(), "Bob");
         assertEquals(enricher.getConfig(MyEnricher.STR_KEY), "aval");
@@ -107,11 +110,12 @@ public class BasicEnricherTest extends BrooklynAppUnitTestSupport {
 
     @Test
     public void testSameUniqueTagEnricherNotAddedTwice() throws Exception {
-        app.enrichers().add(EnricherSpec.create(MyEnricher.class).tag(99).uniqueTag("x"));
-        app.enrichers().add(EnricherSpec.create(MyEnricher.class).tag(94).uniqueTag("x"));
+        MyEnricher enricher1 = app.enrichers().add(EnricherSpec.create(MyEnricher.class).tag(99).uniqueTag("x"));
+        MyEnricher enricher2 = app.enrichers().add(EnricherSpec.create(MyEnricher.class).tag(94).uniqueTag("x"));
         
-        assertEquals(app.getEnrichers().size(), 1);
         // the more recent one should dominate
+        assertEquals(app.enrichers().asList(), ImmutableList.of(enricher2));
+        
         Enricher enricher = Iterables.getOnlyElement(app.enrichers());
         Assert.assertTrue(enricher.tags().containsTag(94));
         Assert.assertFalse(enricher.tags().containsTag(99));

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/91c4a5d2/core/src/test/java/org/apache/brooklyn/core/enricher/EnricherConfigTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/enricher/EnricherConfigTest.java b/core/src/test/java/org/apache/brooklyn/core/enricher/EnricherConfigTest.java
index fb60abd..aae382c 100644
--- a/core/src/test/java/org/apache/brooklyn/core/enricher/EnricherConfigTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/enricher/EnricherConfigTest.java
@@ -21,6 +21,7 @@ package org.apache.brooklyn.core.enricher;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.fail;
 
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.enricher.BasicEnricherTest.MyEnricher;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
@@ -79,22 +80,24 @@ public class EnricherConfigTest extends BrooklynAppUnitTestSupport {
     
     @Test
     public void testConfigSetToGroovyTruthFalseIsAvailable() throws Exception {
-        MyEnricher enricher = new MyEnricher(MutableMap.builder()
-                .put(MyEnricher.INT_KEY_WITH_DEFAULT, 0)
-                .build());
-        app.enrichers().add(enricher);
+        MyEnricher enricher = app.enrichers().add(EnricherSpec.create(MyEnricher.class)
+                .configure(MyEnricher.INT_KEY_WITH_DEFAULT, 0));
+        MyEnricher enricher2 = app.enrichers().add(EnricherSpec.create(MyEnricher.class)
+                .configure(MyEnricher.INT_KEY_WITH_DEFAULT.getName(), 0));
         
         assertEquals(enricher.getConfig(MyEnricher.INT_KEY_WITH_DEFAULT), (Integer)0);
+        assertEquals(enricher2.getConfig(MyEnricher.INT_KEY_WITH_DEFAULT), (Integer)0);
     }
     
     @Test
     public void testConfigSetToNullIsAvailable() throws Exception {
-        MyEnricher enricher = new MyEnricher(MutableMap.builder()
-                .put(MyEnricher.STR_KEY_WITH_DEFAULT, null)
-                .build());
-        app.enrichers().add(enricher);
+        MyEnricher enricher = app.enrichers().add(EnricherSpec.create(MyEnricher.class)
+                .configure(MyEnricher.STR_KEY_WITH_DEFAULT, (String)null));
+        MyEnricher enricher2 = app.enrichers().add(EnricherSpec.create(MyEnricher.class)
+                .configure(MyEnricher.STR_KEY_WITH_DEFAULT.getName(), null));
         
         assertEquals(enricher.getConfig(MyEnricher.STR_KEY_WITH_DEFAULT), null);
+        assertEquals(enricher2.getConfig(MyEnricher.STR_KEY_WITH_DEFAULT), null);
     }
     
     @Test
@@ -121,10 +124,8 @@ public class EnricherConfigTest extends BrooklynAppUnitTestSupport {
 
     @Test
     public void testConfigCannotBeSetAfterApplicationIsStarted() throws Exception {
-        MyEnricher enricher = new MyEnricher(MutableMap.builder()
-                .put(MyEnricher.STR_KEY, "origval")
-                .build());
-        app.enrichers().add(enricher);
+        MyEnricher enricher = app.enrichers().add(EnricherSpec.create(MyEnricher.class)
+                .configure(MyEnricher.STR_KEY, "origval"));
         
         try {
             enricher.config().set(MyEnricher.STR_KEY,"newval");
@@ -138,8 +139,7 @@ public class EnricherConfigTest extends BrooklynAppUnitTestSupport {
     
     @Test
     public void testConfigReturnsDefaultValueIfNotSet() throws Exception {
-        MyEnricher enricher = new MyEnricher();
-        app.enrichers().add(enricher);
+        MyEnricher enricher = app.enrichers().add(EnricherSpec.create(MyEnricher.class));
         
         assertEquals(enricher.getConfig(MyEnricher.STR_KEY_WITH_DEFAULT), "str key default");
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/91c4a5d2/core/src/test/java/org/apache/brooklyn/core/policy/basic/EnricherTypeTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/policy/basic/EnricherTypeTest.java b/core/src/test/java/org/apache/brooklyn/core/policy/basic/EnricherTypeTest.java
index 12a6bff..8a8505f 100644
--- a/core/src/test/java/org/apache/brooklyn/core/policy/basic/EnricherTypeTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/policy/basic/EnricherTypeTest.java
@@ -20,21 +20,25 @@ package org.apache.brooklyn.core.policy.basic;
 
 import static org.testng.Assert.assertEquals;
 
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.EnricherType;
 import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.enricher.AbstractEnricher;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
 
-public class EnricherTypeTest {
+public class EnricherTypeTest extends BrooklynAppUnitTestSupport {
     private MyEnricher enricher;
     
     @BeforeMethod(alwaysRun=true)
+    @Override
     public void setUp() throws Exception{
-        enricher = new MyEnricher();
+        super.setUp();
+        enricher = app.enrichers().add(EnricherSpec.create(MyEnricher.class));
     }
 
     @AfterMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/91c4a5d2/policy/src/main/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetector.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetector.java b/policy/src/main/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetector.java
index 84e9dd7..3e56c27 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetector.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetector.java
@@ -32,6 +32,7 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Enricher;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
 import org.apache.brooklyn.config.ConfigKey;
@@ -203,9 +204,11 @@ public class HttpLatencyDetector extends AbstractEnricher implements Enricher {
     protected void activateAdditionalEnrichers(EntityLocal entity) {
         Duration rollupWindowSize = getConfig(ROLLUP_WINDOW_SIZE);
         if (rollupWindowSize!=null) {
-            entity.enrichers().add(new RollingTimeWindowMeanEnricher<Double>(entity,
-                REQUEST_LATENCY_IN_SECONDS_MOST_RECENT, REQUEST_LATENCY_IN_SECONDS_IN_WINDOW,
-                rollupWindowSize));
+            entity.enrichers().add(EnricherSpec.create(RollingTimeWindowMeanEnricher.class)
+                    .configure("producer", entity)
+                    .configure("source", REQUEST_LATENCY_IN_SECONDS_MOST_RECENT)
+                    .configure("target", REQUEST_LATENCY_IN_SECONDS_IN_WINDOW)
+                    .configure("timePeriod", rollupWindowSize));
         }
     }
 
@@ -305,8 +308,13 @@ public class HttpLatencyDetector extends AbstractEnricher implements Enricher {
             return this;
         }
 
-        /** returns the detector. note that callers should then add this to the entity,
-         * typically using {@link Entity#addEnricher(Enricher)} */
+        /**
+         * Returns the detector. note that callers should then add this to the entity,
+         * typically using {@link Entity#addEnricher(Enricher)}.
+         * 
+         * @deprecated since 0.12.0; instead use {@link #buildSpec()} or directly use {@link EnricherSpec}
+         */
+        @Deprecated
         public HttpLatencyDetector build() {
             return new HttpLatencyDetector(MutableMap.builder()
                     .putIfNotNull(PERIOD, period)
@@ -317,5 +325,21 @@ public class HttpLatencyDetector extends AbstractEnricher implements Enricher {
                     .putIfNotNull(URL_POST_PROCESSING, urlPostProcessing)
                     .build());
         }
+        
+        /**
+         * Returns the detector. note that callers should then add this to the entity,
+         * typically using {@link Entity#addEnricher(EnricherSpec)}
+         * 
+         * @see {@link EnricherSpec}
+         */
+        public EnricherSpec<HttpLatencyDetector> buildSpec() {
+            return EnricherSpec.create(HttpLatencyDetector.class)
+                    .configureIfNotNull(PERIOD, period)
+                    .configureIfNotNull(ROLLUP_WINDOW_SIZE, rollupWindowSize)
+                    .configureIfNotNull(REQUIRE_SERVICE_UP, requireServiceUp)
+                    .configureIfNotNull((ConfigKey<Object>)URL, url)
+                    .configureIfNotNull(URL_SENSOR, urlSensor)
+                    .configureIfNotNull(URL_POST_PROCESSING, urlPostProcessing);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/91c4a5d2/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceFailureDetector.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceFailureDetector.java b/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceFailureDetector.java
index bc3e10a..4cc0541 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceFailureDetector.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/ha/ServiceFailureDetector.java
@@ -34,11 +34,8 @@ import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ComputeServiceState;
 import org.apache.brooklyn.core.sensor.BasicNotificationSensor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.policy.ha.HASensors.FailureDescriptor;
 import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.apache.brooklyn.util.core.task.BasicTask;
 import org.apache.brooklyn.util.core.task.ScheduledTask;
@@ -46,6 +43,8 @@ import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** 
  * Emits {@link HASensors#ENTITY_FAILED} whenever the parent's default logic ({@link ComputeServiceState}) would detect a problem,
@@ -153,16 +152,6 @@ public class ServiceFailureDetector extends ServiceStateLogic.ComputeServiceStat
     }
     
     public ServiceFailureDetector() {
-        this(new ConfigBag());
-    }
-    
-    public ServiceFailureDetector(Map<String,?> flags) {
-        this(new ConfigBag().putAll(flags));
-    }
-    
-    public ServiceFailureDetector(ConfigBag configBag) {
-        // TODO hierarchy should use ConfigBag, and not change flags
-        super(configBag.getAllConfigMutable());
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/91c4a5d2/policy/src/test/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetectorTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetectorTest.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetectorTest.java
index 5c0c09f..248891b 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetectorTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/HttpLatencyDetectorTest.java
@@ -81,7 +81,7 @@ public class HttpLatencyDetectorTest {
                 .url(baseUrl)
                 .rollup(500, TimeUnit.MILLISECONDS)
                 .period(100, TimeUnit.MILLISECONDS)
-                .build());
+                .buildSpec());
         
         assertLatencyAttributesNonNull(entity);
     }
@@ -93,7 +93,7 @@ public class HttpLatencyDetectorTest {
                 .noServiceUp()
                 .rollup(500, TimeUnit.MILLISECONDS)
                 .period(100, TimeUnit.MILLISECONDS)
-                .build());
+                .buildSpec());
         
         // nothing until url is set
         EntityAsserts.assertAttributeEqualsContinually(
@@ -114,7 +114,7 @@ public class HttpLatencyDetectorTest {
                 .noServiceUp()
                 .rollup(500, TimeUnit.MILLISECONDS)
                 .period(100, TimeUnit.MILLISECONDS)
-                .build());
+                .buildSpec());
         
         assertLatencyAttributesNonNull(entity);
     }
@@ -126,7 +126,7 @@ public class HttpLatencyDetectorTest {
         entity.enrichers().add(HttpLatencyDetector.builder()
                 .url(baseUrl)
                 .period(100, TimeUnit.MILLISECONDS)
-                .build());
+                .buildSpec());
         
         // nothing until url is set
         EntityAsserts.assertAttributeEqualsContinually(

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/91c4a5d2/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java
index f717dad..21124ae 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java
@@ -79,7 +79,7 @@ public class RebindEnricherTest extends RebindTestFixtureWithApp {
                 .rollup(Duration.of(50, TimeUnit.MILLISECONDS))
                 .period(Duration.of(10, TimeUnit.MILLISECONDS))
                 .url(baseUrl)
-                .build());
+                .buildSpec());
         origApp.sensors().set(Attributes.SERVICE_UP, true);
         
         TestApplication newApp = rebind();


[5/7] brooklyn-server git commit: Delete CustomAggregatingEnricher

Posted by dr...@apache.org.
Delete CustomAggregatingEnricher

Was deprecated in 0.7.0; did not have a constructor usable when
deserialising from persisted state, so that backwards compatibility
is not a worry!

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

Branch: refs/heads/master
Commit: 26eeb7e0f2696006a4c111b20eba5959d5537e38
Parents: 263304b
Author: Aled Sage <al...@gmail.com>
Authored: Sun Jun 11 12:44:25 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Sun Jun 11 14:57:39 2017 +0100

----------------------------------------------------------------------
 .../stock/AbstractAggregatingEnricher.java      | 175 --------
 .../stock/CustomAggregatingEnricher.java        | 352 ----------------
 ...CustomAggregatingEnricherDeprecatedTest.java | 405 -------------------
 3 files changed, 932 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/26eeb7e0/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractAggregatingEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractAggregatingEnricher.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractAggregatingEnricher.java
deleted file mode 100644
index 9dd3d30..0000000
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractAggregatingEnricher.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.enricher.stock;
-
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
-import org.apache.brooklyn.api.entity.Group;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.api.sensor.SensorEvent;
-import org.apache.brooklyn.api.sensor.SensorEventListener;
-import org.apache.brooklyn.core.enricher.AbstractEnricher;
-import org.apache.brooklyn.core.entity.trait.Changeable;
-import org.apache.brooklyn.util.groovy.GroovyJavaMethods;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableMap;
-
-
-/**
- * AggregatingEnrichers implicitly subscribes to the same sensor<S> on all entities inside an
- * {@link Group} and should emit an aggregate<T> on the target sensor
- * 
- * @deprecated since 0.7.0; use {@link Enrichers.builder()}
- * @see Aggregator if need to sub-class
- */
-@Deprecated
-public abstract class AbstractAggregatingEnricher<S,T> extends AbstractEnricher implements SensorEventListener<S> {
-    
-    private static final Logger LOG = LoggerFactory.getLogger(AbstractAggregatingEnricher.class);
-    
-    AttributeSensor<? extends S> source;
-    protected AttributeSensor<T> target;
-    protected S defaultValue;
-
-    Set<Entity> producers;
-    List<Entity> hardCodedProducers;
-    boolean allMembers;
-    Predicate<Entity> filter;
-    
-    /**
-     * Users of values should either on it synchronize when iterating over its entries or use
-     * copyOfValues to obtain an immutable copy of the map.
-     */
-    // We use a synchronizedMap over a ConcurrentHashMap for entities that store null values.
-    protected final Map<Entity, S> values = Collections.synchronizedMap(new LinkedHashMap<Entity, S>());
-
-    public AbstractAggregatingEnricher(Map<String,?> flags, AttributeSensor<? extends S> source, AttributeSensor<T> target) {
-        this(flags, source, target, null);
-    }
-    
-    @SuppressWarnings("unchecked")
-    public AbstractAggregatingEnricher(Map<String,?> flags, AttributeSensor<? extends S> source, AttributeSensor<T> target, S defaultValue) {
-        super(flags);
-        this.source = source;
-        this.target = target;
-        this.defaultValue = defaultValue;
-        hardCodedProducers = (List<Entity>) (flags.containsKey("producers") ? flags.get("producers") : Collections.emptyList());
-        allMembers = (Boolean) (flags.containsKey("allMembers") ? flags.get("allMembers") : false);
-        filter = flags.containsKey("filter") ? GroovyJavaMethods.<Entity>castToPredicate(flags.get("filter")) : Predicates.<Entity>alwaysTrue();
-    }
-
-    public void addProducer(Entity producer) {
-        if (LOG.isDebugEnabled()) LOG.debug("{} linked ({}, {}) to {}", new Object[] {this, producer, source, target});
-        subscriptions().subscribe(producer, source, this);
-        synchronized (values) {
-            S vo = values.get(producer);
-            if (vo==null) {
-                S initialVal = producer.getAttribute(source);
-                values.put(producer, initialVal != null ? initialVal : defaultValue);
-                //we might skip in onEvent in the short window while !values.containsKey(producer)
-                //but that's okay because the put which would have been done there is done here now
-            } else {
-                //vo will be null unless some weird race with addProducer+removeProducer is occuring
-                //(and that's something we can tolerate i think)
-                if (LOG.isDebugEnabled()) LOG.debug("{} already had value ({}) for producer ({}); but that producer has just been added", new Object[] {this, vo, producer});
-            }
-        }
-        onUpdated();
-    }
-    
-    // TODO If producer removed but then get (queued) event from it after this method returns,  
-    public S removeProducer(Entity producer) {
-        if (LOG.isDebugEnabled()) LOG.debug("{} unlinked ({}, {}) from {}", new Object[] {this, producer, source, target});
-        subscriptions().unsubscribe(producer);
-        S removed = values.remove(producer);
-        onUpdated();
-        return removed;
-    }
-    
-    @Override
-    public void onEvent(SensorEvent<S> event) {
-        Entity e = event.getSource();
-        synchronized (values) {
-            if (values.containsKey(e)) {
-                values.put(e, event.getValue());
-            } else {
-                if (LOG.isDebugEnabled()) LOG.debug("{} received event for unknown producer ({}); presumably that producer has recently been removed", this, e);
-            }
-        }
-        onUpdated();
-    }
-
-    /**
-     * Called whenever the values for the set of producers changes (e.g. on an event, or on a member added/removed).
-     * Defaults to no-op
-     */
-    // TODO should this be abstract?
-    protected void onUpdated() {
-        // no-op
-    }
-    
-    @Override
-    public void setEntity(EntityLocal entity) {
-        super.setEntity(entity);
-        
-        for (Entity producer : hardCodedProducers) {
-            if (filter.apply(producer)) {
-                addProducer(producer);
-            }
-        }
-        
-        if (allMembers) {
-            subscriptions().subscribe(entity, Changeable.MEMBER_ADDED, new SensorEventListener<Entity>() {
-                @Override public void onEvent(SensorEvent<Entity> it) {
-                    if (filter.apply(it.getValue())) addProducer(it.getValue());
-                }
-            });
-            subscriptions().subscribe(entity, Changeable.MEMBER_REMOVED, new SensorEventListener<Entity>() {
-                @Override public void onEvent(SensorEvent<Entity> it) {
-                    removeProducer(it.getValue());
-                }
-            });
-            
-            if (entity instanceof Group) {
-                for (Entity member : ((Group)entity).getMembers()) {
-                    if (filter.apply(member)) {
-                        addProducer(member);
-                    }
-                }
-            }
-        }
-    }
-    
-    protected Map<Entity, S> copyOfValues() {
-        synchronized (values) {
-            return ImmutableMap.copyOf(values);
-        }
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/26eeb7e0/core/src/main/java/org/apache/brooklyn/enricher/stock/CustomAggregatingEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/CustomAggregatingEnricher.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/CustomAggregatingEnricher.java
deleted file mode 100644
index 2d797da..0000000
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/CustomAggregatingEnricher.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.enricher.stock;
-
-import groovy.lang.Closure;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.api.sensor.SensorEventListener;
-import org.apache.brooklyn.util.core.flags.TypeCoercions;
-import org.apache.brooklyn.util.groovy.GroovyJavaMethods;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Function;
-import com.google.common.base.Throwables;
-import com.google.common.reflect.TypeToken;
-
-/**
- * Subscribes to events from producers with a sensor of type T, aggregates them with the 
- * provided closure and emits the result on the target sensor V.
- * @param <T>
- * 
- * @deprecated since 0.7.0; use {@link Enrichers#builder()}
- */
-@Deprecated
-public class CustomAggregatingEnricher<S,T> extends AbstractAggregatingEnricher<S,T> implements SensorEventListener<S> {
-    
-    private static final Logger LOG = LoggerFactory.getLogger(CustomAggregatingEnricher.class);
-    
-    protected final Function<Collection<S>, T> aggregator;
-    
-    /**
-     * The valid keys for the flags are:
-     * - producers: a collection of entities to be aggregated
-     * - allMembers: indicates that should track members of the entity that the aggregator is associated with,
-     *               to aggregate across all those members.
-     * - filter:     a Predicate indicating which entities to include (support for {@link groovy.lang.Closure} is deprecated)
-     * 
-     * @param flags
-     * @param source
-     * @param target
-     * @param aggregator   Aggregates a collection of values, to return a single value for the target sensor
-     * @param defaultIniitalValueForUnreportedSensors Default value to populate the collection given to aggregator, 
-     * where sensors are null or not present initially, defaults to null (note however that subsequent null reports will put an explicit null)
-     */
-    public CustomAggregatingEnricher(Map<String,?> flags, AttributeSensor<? extends S> source, AttributeSensor<T> target,
-            Function<Collection<S>, T> aggregator, S defaultIniitalValueForUnreportedSensors) {
-        super(flags, source, target, defaultIniitalValueForUnreportedSensors);
-        this.aggregator = aggregator;
-    }
-    
-    public CustomAggregatingEnricher(Map<String,?> flags, AttributeSensor<? extends S> source, AttributeSensor<T> target,
-            Function<Collection<S>, T> aggregator) {
-        this(flags, source, target, aggregator, null);
-    }
-    
-    public CustomAggregatingEnricher(AttributeSensor<? extends S> source, AttributeSensor<T> target,
-            Function<Collection<S>, T> aggregator, S defaultValue) {
-        this(Collections.<String,Object>emptyMap(), source, target, aggregator, defaultValue);
-    }
-    
-    public CustomAggregatingEnricher(AttributeSensor<? extends S> source, AttributeSensor<T> target,
-            Function<Collection<S>, T> aggregator) {
-        this(Collections.<String,Object>emptyMap(), source, target, aggregator, null);
-    }
-
-    /**
-     * @param flags
-     * @param source
-     * @param target
-     * @param aggregator   Should take a collection of values and return a single, aggregate value
-     * @param defaultValueForUnreportedSensors
-     * 
-     * @see #CustomAggregatingEnricher(Map, AttributeSensor, AttributeSensor, Function, Object)
-     * 
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
-     */
-     @Deprecated
-    @SuppressWarnings("unchecked")
-    public CustomAggregatingEnricher(Map<String,?> flags, AttributeSensor<? extends S> source, AttributeSensor<T> target,
-            Closure<?> aggregator, S defaultValueForUnreportedSensors) {
-        this(flags, source, target, GroovyJavaMethods.<Collection<S>, T>functionFromClosure((Closure<T>)aggregator), defaultValueForUnreportedSensors);
-    }
-
-    /**
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
-     */
-     @Deprecated
-    public CustomAggregatingEnricher(Map<String,?> flags, AttributeSensor<? extends S> source, AttributeSensor<T> target, Closure<?> aggregator) {
-        this(flags, source, target, aggregator, null);
-    }
-
-    /**
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
-     */
-    @Deprecated
-    public CustomAggregatingEnricher(AttributeSensor<S> source, AttributeSensor<T> target, Closure<?> aggregator, S defaultValueForUnreportedSensors) {
-        this(Collections.<String,Object>emptyMap(), source, target, aggregator, defaultValueForUnreportedSensors);
-    }
-
-    /**
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
-     */
-    @Deprecated
-    public CustomAggregatingEnricher(AttributeSensor<S> source, AttributeSensor<T> target, Closure<?> aggregator) {
-        this(Collections.<String,Object>emptyMap(), source, target, aggregator, null);
-    }
-
-    @Override
-    public void onUpdated() {
-        try {
-            entity.sensors().set(target, getAggregate());
-        } catch (Throwable t) {
-            LOG.warn("Error calculating and setting aggregate for enricher "+this, t);
-            throw Throwables.propagate(t);
-        }
-    }
-    
-    public T getAggregate() {
-        synchronized (values) {
-            return aggregator.apply(values.values());
-        }
-    }
-
-    /**
-     * Instead, consider calling:
-     * <pre>
-     * {@code
-     * Enrichers.Builder builder = Enrichers.builder()
-     *         .aggregating(source)
-     *         .publishing(target)
-     *         .computing(GroovyJavaMethods.<Collection<S>, T>functionFromClosure((Closure<T>)aggregator))
-     *         .defaultValueForUnreportedSensors(defaultValueForUnreportedSensors);
-     * 
-     * if (Boolean.TRUE.equals(allMembers)) builder.fromMembers();
-     * if (filter != null) builder.entityFilter(filter);
-     * if (hardCodedProducers != null) builder.fromHardcodedProducers(hardCodedProducers);
-     * 
-     * addEnricher(builder.build());
-     * }
-     * </pre>
-     *
-     * @deprecated since 0.7.0; use {@link Enrichers#builder()}
-     */
-    @Deprecated
-    public static <S,T> CustomAggregatingEnricher<S,T> newEnricher(
-            Map<String,?> flags, AttributeSensor<S> source, AttributeSensor<T> target, Closure<?> aggregator, S defaultVal) {
-        return new CustomAggregatingEnricher<S,T>(flags, source, target, aggregator, defaultVal);
-    }
-    /**
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
-     */
-    @Deprecated
-    public static <S,T> CustomAggregatingEnricher<S,T> newEnricher(
-            Map<String,?> flags, AttributeSensor<S> source, AttributeSensor<T> target, Closure<?> aggregator) {
-        return newEnricher(flags, source, target, aggregator, null);
-    }
-    /**
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
-     */
-    @Deprecated
-    public static <S,T> CustomAggregatingEnricher<S,T> newEnricher(
-            AttributeSensor<S> source, AttributeSensor<T> target, Closure<?> aggregator, S defaultVal) {
-        return newEnricher(Collections.<String,Object>emptyMap(), source, target, aggregator, defaultVal);
-    }
-    /**
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
-     */
-    @Deprecated
-    public static <S,T> CustomAggregatingEnricher<S,T> newEnricher(
-            AttributeSensor<S> source, AttributeSensor<T> target, Closure<?> aggregator) {
-        return newEnricher(Collections.<String,Object>emptyMap(), source, target, aggregator, null);
-    }
-    
-    /**
-     * Instead, consider calling:
-     * <pre>
-     * {@code
-     * Enrichers.Builder builder = Enrichers.builder()
-     *         .aggregating(source)
-     *         .publishing(target)
-     *         .computing(aggregator)
-     *         .defaultValueForUnreportedSensors(defaultVal);
-     * 
-     * if (Boolean.TRUE.equals(allMembers)) builder.fromMembers();
-     * if (filter != null) builder.entityFilter(filter);
-     * if (hardCodedProducers != null) builder.fromHardcodedProducers(hardCodedProducers);
-     * 
-     * addEnricher(builder.build());
-     * }
-     * </pre>
-     *
-     * @deprecated since 0.7.0; use {@link Enrichers#builder()}
-     */
-    @Deprecated
-    public static <S,T> CustomAggregatingEnricher<S,T> newEnricher(
-            Map<String,?> flags, AttributeSensor<S> source, AttributeSensor<T> target, Function<Collection<S>, T> aggregator, S defaultVal) {
-        return new CustomAggregatingEnricher<S,T>(flags, source, target, aggregator, defaultVal);
-    }
-    public static <S,T> CustomAggregatingEnricher<S,T> newEnricher(
-            Map<String,?> flags, AttributeSensor<S> source, AttributeSensor<T> target, Function<Collection<S>, T> aggregator) {
-        return newEnricher(flags, source, target, aggregator, null);
-    }
-    public static <S,T> CustomAggregatingEnricher<S,T> newEnricher(
-            AttributeSensor<S> source, AttributeSensor<T> target, Function<Collection<S>, T> aggregator, S defaultVal) {
-        return newEnricher(Collections.<String,Object>emptyMap(), source, target, aggregator, defaultVal);
-    }
-    public static <S,T> CustomAggregatingEnricher<S,T> newEnricher(
-            AttributeSensor<S> source, AttributeSensor<T> target, Function<Collection<S>, T> aggregator) {
-        return newEnricher(Collections.<String,Object>emptyMap(), source, target, aggregator, null);
-    }
-    
-    /** 
-     * creates an enricher which sums over all children/members, 
-     * defaulting to excluding sensors which have not published anything (or published null), and null if there are no sensors; 
-     * this behaviour can be customised, both default value for sensors, and what to report if no sensors
-     * 
-     * Instead, consider calling:
-     * <pre>
-     * {@code
-     * Enrichers.Builder builder = Enrichers.builder()
-     *         .aggregating(source)
-     *         .publishing(target)
-     *         .computingSum()
-     *         .defaultValueForUnreportedSensors(defaultValueForUnreportedSensors)
-     *         .valueToReportIfNoSensors(valueToReportIfNoSensors);
-     * 
-     * if (Boolean.TRUE.equals(allMembers)) builder.fromMembers();
-     * if (filter != null) builder.entityFilter(filter);
-     * if (hardCodedProducers != null) builder.fromHardcodedProducers(hardCodedProducers);
-     * 
-     * addEnricher(builder.build());
-     * }
-     * </pre>
-     *
-     * @deprecated since 0.7.0; use {@link Enrichers#builder()}
-     */
-    @Deprecated
-    public static <N extends Number, T extends Number> CustomAggregatingEnricher<N,T> newSummingEnricher(
-            Map<String,?> flags, AttributeSensor<N> source, final AttributeSensor<T> target, 
-            final N defaultValueForUnreportedSensors, final T valueToReportIfNoSensors) {
-        
-        Function<Collection<N>, T> aggregator = new Function<Collection<N>, T>() {
-                @Override public T apply(Collection<N> vals) {
-                    return sum(vals, defaultValueForUnreportedSensors, valueToReportIfNoSensors, target.getTypeToken());
-                }
-        };
-        return new CustomAggregatingEnricher<N,T>(flags, source, target, aggregator, defaultValueForUnreportedSensors);
-    }
-    
-    /** @see {@link #newSummingEnricher(Map, AttributeSensor, AttributeSensor, Number, Number)} */
-    public static <N extends Number> CustomAggregatingEnricher<N,N> newSummingEnricher(
-            AttributeSensor<N> source, AttributeSensor<N> target) {
-        return newSummingEnricher(Collections.<String,Object>emptyMap(), source, target, null, null);
-    }
-
-    /** creates an enricher which averages over all children/members, 
-     * defaulting to excluding sensors which have not published anything (or published null), and null if there are no sensors; 
-     * this behaviour can be customised, both default value for sensors, and what to report if no sensors
-     * 
-     * Instead, consider calling:
-     * <pre>
-     * {@code
-     * Enrichers.Builder builder = Enrichers.builder()
-     *         .aggregating(source)
-     *         .publishing(target)
-     *         .computingAverage()
-     *         .defaultValueForUnreportedSensors(defaultValueForUnreportedSensors)
-     *         .valueToReportIfNoSensors(valueToReportIfNoSensors);
-     * 
-     * if (Boolean.TRUE.equals(allMembers)) builder.fromMembers();
-     * if (filter != null) builder.entityFilter(filter);
-     * if (hardCodedProducers != null) builder.fromHardcodedProducers(hardCodedProducers);
-     * 
-     * addEnricher(builder.build());
-     * }
-     * </pre>
-     *
-     * @deprecated since 0.7.0; use {@link Enrichers#builder()}
-     */
-    @Deprecated
-    public static <N extends Number> CustomAggregatingEnricher<N,Double> newAveragingEnricher(
-            Map<String,?> flags, AttributeSensor<? extends N> source, final AttributeSensor<Double> target,
-            final N defaultValueForUnreportedSensors, final Double valueToReportIfNoSensors) {
-        Function<Collection<N>, Double> aggregator = new Function<Collection<N>, Double>() {
-            @Override public Double apply(Collection<N> vals) {
-                int count = count(vals, defaultValueForUnreportedSensors!=null);
-                return (count==0) ? valueToReportIfNoSensors : 
-                    (Double) ((sum(vals, defaultValueForUnreportedSensors, 0, TypeToken.of(Double.class)) / count));
-            }
-        };
-        return new CustomAggregatingEnricher<N,Double>(flags, source, target, aggregator, defaultValueForUnreportedSensors);
-    }
-
-    /** @see #newAveragingEnricher(Map, AttributeSensor, AttributeSensor, Number, Double) */
-    public static <N extends Number> CustomAggregatingEnricher<N,Double> newAveragingEnricher(
-            AttributeSensor<N> source, AttributeSensor<Double> target) {
-        return newAveragingEnricher(Collections.<String,Object>emptyMap(), source, target, null, null);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <N extends Number> N cast(Number n, TypeToken<? extends N> numberType) {
-        return (N) TypeCoercions.castPrimitive(n, numberType.getRawType());
-    }
-
-    private static <N extends Number> N sum(Iterable<? extends Number> vals, Number valueIfNull, Number valueIfNone, TypeToken<N> type) {
-        double result = 0d;
-        int count = 0;
-        if (vals!=null) {
-            for (Number val : vals) { 
-                if (val!=null) {
-                    result += val.doubleValue();
-                    count++;
-                } else if (valueIfNull!=null) {
-                    result += valueIfNull.doubleValue();
-                    count++;
-                }
-            }
-        }
-        if (count==0) return cast(valueIfNone, type);
-        return cast(result, type);
-    }
-    
-    private static int count(Iterable<? extends Object> vals, boolean includeNullValues) {
-        int result = 0;
-        if (vals!=null) 
-            for (Object val : vals) 
-                if (val!=null || includeNullValues) result++;
-        return result;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/26eeb7e0/core/src/test/java/org/apache/brooklyn/enricher/stock/CustomAggregatingEnricherDeprecatedTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/enricher/stock/CustomAggregatingEnricherDeprecatedTest.java b/core/src/test/java/org/apache/brooklyn/enricher/stock/CustomAggregatingEnricherDeprecatedTest.java
deleted file mode 100644
index c7792af..0000000
--- a/core/src/test/java/org/apache/brooklyn/enricher/stock/CustomAggregatingEnricherDeprecatedTest.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.enricher.stock;
-
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.location.SimulatedLocation;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
-import org.apache.brooklyn.core.sensor.Sensors;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.core.test.entity.TestEntity;
-import org.apache.brooklyn.entity.group.BasicGroup;
-import org.apache.brooklyn.test.Asserts;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-@SuppressWarnings("deprecation")
-public class CustomAggregatingEnricherDeprecatedTest {
-
-    public static final Logger log = LoggerFactory.getLogger(CustomAggregatingEnricherDeprecatedTest.class);
-            
-    private static final long TIMEOUT_MS = 10*1000;
-    private static final long SHORT_WAIT_MS = 250;
-    
-    TestApplication app;
-    TestEntity producer;
-    Map<String, ?> producersFlags;
-    
-    AttributeSensor<Integer> intSensor = Sensors.newIntegerSensor("int sensor");
-    AttributeSensor<Double> doubleSensor = Sensors.newDoubleSensor("double sensor");
-    AttributeSensor<Integer> target = Sensors.newIntegerSensor("target sensor");
-
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() {
-        app = TestApplication.Factory.newManagedInstanceForTests();
-        producer = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-        producersFlags = ImmutableMap.of("producers", ImmutableList.of(producer));
-        
-        app.start(ImmutableList.of(new SimulatedLocation()));
-    }
-    
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() {
-        if (app!=null) Entities.destroyAll(app.getManagementContext());
-    }
-    
-    @Test
-    public void testEnrichersWithNoProducers() {
-        CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(ImmutableMap.<String,Object>of(), intSensor, target, 11, 40);
-        producer.enrichers().add(cae);
-        assertEquals(cae.getAggregate(), 40);
-    }
-
-    @Test
-    public void testSummingEnricherWhenNoSensorValuesYet() {
-        CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(
-                producersFlags, intSensor, target, 11, 40);
-        producer.enrichers().add(cae);
-        assertEquals(cae.getAggregate(), 11);
-    }
-
-    @Test
-    public void testSingleProducerSum() {
-        CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(
-                producersFlags, intSensor, target, null, null);
-        producer.enrichers().add(cae);
-        Assert.assertEquals(cae.getAggregate(), null);
-        cae.onEvent(intSensor.newEvent(producer, 1));
-        assertEquals(cae.getAggregate(), 1);
-    }
-    
-    @Test
-    public void testSummingEnricherWhenNoAndNullSensorValue() {
-        CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(
-                producersFlags, intSensor, target, null, null);
-        producer.enrichers().add(cae);
-        Assert.assertEquals(cae.getAggregate(), null);
-        cae.onEvent(intSensor.newEvent(producer, null));
-        Assert.assertEquals(cae.getAggregate(), null);
-    }
-    
-    @Test
-    public void testSummingEnricherWhenNoAndNullSensorValueExplicitValue() {
-        CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(
-                producersFlags, intSensor, target, 3 /** if null */, 5 /** if none */);
-        producer.enrichers().add(cae);
-        assertEquals(cae.getAggregate(), 3);
-        cae.onEvent(intSensor.newEvent(producer, null));
-        assertEquals(cae.getAggregate(), 3);
-        cae.onEvent(intSensor.newEvent(producer, 1));
-        assertEquals(cae.getAggregate(), 1);
-        cae.onEvent(intSensor.newEvent(producer, 7));
-        assertEquals(cae.getAggregate(), 7);
-    }
-    
-    @Test
-    public void testMultipleProducersSum() {
-        List<TestEntity> producers = ImmutableList.of(
-                app.createAndManageChild(EntitySpec.create(TestEntity.class)), 
-                app.createAndManageChild(EntitySpec.create(TestEntity.class)),
-                app.createAndManageChild(EntitySpec.create(TestEntity.class))
-                );
-        CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(
-                ImmutableMap.of("producers", producers), intSensor, target, null, null);
-        
-        producer.enrichers().add(cae);
-        Assert.assertEquals(cae.getAggregate(), null);
-        cae.onEvent(intSensor.newEvent(producers.get(2), 1));
-        assertEquals(cae.getAggregate(), 1);
-        cae.onEvent(intSensor.newEvent(producers.get(0), 3));
-        assertEquals(cae.getAggregate(), 4);
-        cae.onEvent(intSensor.newEvent(producers.get(1), 3));
-        assertEquals(cae.getAggregate(), 7);
-
-    }
-    
-    @Test
-    public void testAveragingEnricherWhenNoAndNullSensorValues() {
-        List<TestEntity> producers = ImmutableList.of(
-                app.createAndManageChild(EntitySpec.create(TestEntity.class))
-                );
-        CustomAggregatingEnricher<Integer, Double> cae = CustomAggregatingEnricher.<Integer>newAveragingEnricher(
-                ImmutableMap.of("producers", producers), intSensor, new BasicAttributeSensor<Double>(Double.class, "target sensor"), null, null);
-        producer.enrichers().add(cae);
-        Assert.assertEquals(cae.getAggregate(), null);
-        cae.onEvent(intSensor.newEvent(producers.get(0), null));
-        Assert.assertEquals(cae.getAggregate(), null);
-    }
-
-    @Test
-    public void testAveragingEnricherWhenNoAndNullSensorValuesExplicit() {
-        List<TestEntity> producers = ImmutableList.of(
-                app.createAndManageChild(EntitySpec.create(TestEntity.class))
-                );
-        CustomAggregatingEnricher<Integer, Double> cae = CustomAggregatingEnricher.<Integer>newAveragingEnricher(
-                ImmutableMap.of("producers", producers), intSensor, new BasicAttributeSensor<Double>(Double.class, "target sensor"), 3 /** if null */, 5d /** if none */);
-        producer.enrichers().add(cae);
-        
-        assertEquals(cae.getAggregate(), 3d);
-        cae.onEvent(intSensor.newEvent(producers.get(0), null));
-        assertEquals(cae.getAggregate(), 3d);
-        cae.onEvent(intSensor.newEvent(producers.get(0), 4));
-        assertEquals(cae.getAggregate(), 4d);
-    }
-
-    @Test
-    public void testAveragingEnricherWhenNoSensors() {
-        List<TestEntity> producers = ImmutableList.of(
-                );
-        CustomAggregatingEnricher<Integer, Double> cae = CustomAggregatingEnricher.<Integer>newAveragingEnricher(
-                ImmutableMap.of("producers", producers), intSensor, new BasicAttributeSensor<Double>(Double.class, "target sensor"), 3 /** if null */, 5d /** if none */);
-        producer.enrichers().add(cae);
-        
-        assertEquals(cae.getAggregate(), 5d);
-    }
-
-    @Test
-    public void testMultipleProducersAverage() {
-        List<TestEntity> producers = ImmutableList.of(
-                app.createAndManageChild(EntitySpec.create(TestEntity.class)), 
-                app.createAndManageChild(EntitySpec.create(TestEntity.class)),
-                app.createAndManageChild(EntitySpec.create(TestEntity.class))
-                );
-        CustomAggregatingEnricher<Double, Double> cae = CustomAggregatingEnricher.<Double>newAveragingEnricher(
-                ImmutableMap.of("producers", producers),
-                doubleSensor, new BasicAttributeSensor<Double>(Double.class, "target sensor"), null, null);
-        
-        producer.enrichers().add(cae);
-        
-        Assert.assertEquals(cae.getAggregate(), null);
-        cae.onEvent(doubleSensor.newEvent(producers.get(0), 3d));
-        assertEquals(cae.getAggregate(), 3d);
-        
-        cae.onEvent(doubleSensor.newEvent(producers.get(1), 3d));
-        assertEquals(cae.getAggregate(), 3d);
-        
-        cae.onEvent(doubleSensor.newEvent(producers.get(2), 6d));
-        assertEquals(cae.getAggregate(), 4d);
-
-        // change p2's value to 7.5, average increase of 0.5.
-        cae.onEvent(doubleSensor.newEvent(producers.get(2), 7.5d));
-        assertEquals(cae.getAggregate(), 4.5d);
-    }
-    
-    @Test
-    public void testMultipleProducersAverageDefaultingZero() {
-        List<TestEntity> producers = ImmutableList.of(
-                app.createAndManageChild(EntitySpec.create(TestEntity.class)), 
-                app.createAndManageChild(EntitySpec.create(TestEntity.class)),
-                app.createAndManageChild(EntitySpec.create(TestEntity.class))
-                );
-        CustomAggregatingEnricher<Double, Double> cae = CustomAggregatingEnricher.<Double>newAveragingEnricher(
-                ImmutableMap.of("producers", producers),
-                doubleSensor, new BasicAttributeSensor<Double>(Double.class, "target sensor"), 0d, 0d);
-        
-        producer.enrichers().add(cae);
-        
-        assertEquals(cae.getAggregate(), 0d);
-        cae.onEvent(doubleSensor.newEvent(producers.get(0), 3d));
-        assertEquals(cae.getAggregate(), 1d);
-        
-        cae.onEvent(doubleSensor.newEvent(producers.get(1), 3d));
-        assertEquals(cae.getAggregate(), 2d);
-        
-        cae.onEvent(doubleSensor.newEvent(producers.get(2), 6d));
-        assertEquals(cae.getAggregate(), 4d);
-
-        // change p2's value to 7.5, average increase of 0.5.
-        cae.onEvent(doubleSensor.newEvent(producers.get(2), 7.5d));
-        assertEquals(cae.getAggregate(), 4.5d);
-    }
-    
-    @Test
-    public void testAddingAndRemovingProducers() {
-        TestEntity p1 = app.createAndManageChild(EntitySpec.create(TestEntity.class)); 
-        TestEntity p2 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-        
-        CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(
-                ImmutableMap.of("producers", ImmutableList.of(p1)),
-                intSensor, target, null, null);
-
-        producer.enrichers().add(cae);
-        Assert.assertEquals(cae.getAggregate(), null);
-        
-        // Event by initial producer
-        cae.onEvent(intSensor.newEvent(p1, 1));
-        assertEquals(cae.getAggregate(), 1);
-        
-        // Add producer and fire event
-        cae.addProducer(p2);
-        cae.onEvent(intSensor.newEvent(p2, 4));
-        assertEquals(cae.getAggregate(), 5);
-        
-        cae.removeProducer(p2);
-        assertEquals(cae.getAggregate(), 1);
-    }
-    
-    @Test
-    public void testAggregatesNewMembersOfGroup() {
-        try {
-            BasicGroup group = app.createAndManageChild(EntitySpec.create(BasicGroup.class));
-            TestEntity p1 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-            TestEntity p2 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-            log.debug("created $group and the entities it will contain $p1 $p2");
-
-            CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(
-                    ImmutableMap.of("allMembers", true),
-                    intSensor, target, 0, 0);
-            group.enrichers().add(cae);
-
-            assertEquals(cae.getAggregate(), 0);
-
-            group.addMember(p1);
-            p1.sensors().set(intSensor, 1);
-            aggregateIsEventually(cae, 1);
-
-            group.addMember(p2);
-            p2.sensors().set(intSensor, 2);
-            aggregateIsEventually(cae, 3);
-
-            group.removeMember(p2);
-            aggregateIsEventually(cae, 1);
-        } catch (Exception e) {
-            log.error("testAggregatesNewMembersOfGroup failed (now cleaning up): "+e);
-            throw e;
-        }
-    }
-    
-    @Test(groups = "Integration")
-    public void testAggregatesGroupMembersFiftyTimes() {
-        for (int i=0; i<50; i++) {
-            log.debug("testAggregatesNewMembersOfGroup $i");
-            testAggregatesNewMembersOfGroup();
-        }
-    }
-    
-    @Test
-    public void testAggregatesExistingMembersOfGroup() {
-        BasicGroup group = app.addChild(EntitySpec.create(BasicGroup.class));
-        TestEntity p1 = app.getManagementContext().getEntityManager().createEntity(EntitySpec.create(TestEntity.class).parent(group)); 
-        TestEntity p2 = app.getManagementContext().getEntityManager().createEntity(EntitySpec.create(TestEntity.class).parent(group)); 
-        group.addMember(p1);
-        group.addMember(p2);
-        p1.sensors().set(intSensor, 1);
-        Entities.manage(group);
-        
-        CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(
-                ImmutableMap.of("allMembers", true),
-                intSensor, target, null, null);
-        group.enrichers().add(cae);
-        
-        assertEquals(cae.getAggregate(), 1);
-
-        p2.sensors().set(intSensor, 2);
-        aggregateIsEventually(cae, 3);
-        
-        group.removeMember(p2);
-        aggregateIsEventually(cae, 1);
-    }
-    
-    @Test
-    public void testAppliesFilterWhenAggregatingMembersOfGroup() {
-        BasicGroup group = app.createAndManageChild(EntitySpec.create(BasicGroup.class));
-        TestEntity p1 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-        TestEntity p2 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-        TestEntity p3 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-        group.addMember(p1);
-        group.addMember(p2);
-        p1.sensors().set(intSensor, 1);
-        p2.sensors().set(intSensor, 2);
-        p3.sensors().set(intSensor, 4);
-        
-        final CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newSummingEnricher(
-                ImmutableMap.of("allMembers", true, "filter", Predicates.equalTo(p1)),
-                intSensor, target, null, null);
-        group.enrichers().add(cae);
-        
-        assertEquals(cae.getAggregate(), 1);
-        
-        group.addMember(p3);
-        Asserts.succeedsContinually(ImmutableMap.of("timeout", SHORT_WAIT_MS), new Runnable() {
-            @Override
-            public void run() {
-                assertEquals(cae.getAggregate(), 1);
-            }
-        });
-    }
-    
-    @Test
-    public void testCustomAggregatingFunction() {
-        TestEntity p1 = app.createAndManageChild(EntitySpec.create(TestEntity.class)); 
-        Function<Collection<Integer>,Integer> aggregator = new Function<Collection<Integer>, Integer>() {
-            @Override
-            public Integer apply(Collection<Integer> c) {
-                int result = 0;
-                for (Integer it : c) {
-                    result += it*it;
-                }
-                return result;
-            }
-        };
-
-        CustomAggregatingEnricher<Integer, Integer> cae = CustomAggregatingEnricher.<Integer, Integer>newEnricher(
-                ImmutableMap.of("producers", ImmutableList.of(p1)),
-                intSensor, target, aggregator, 0);
-
-        producer.enrichers().add(cae);
-        assertEquals(cae.getAggregate(), 0);
-
-        // Event by producer
-        cae.onEvent(intSensor.newEvent(p1, 2));
-        assertEquals(cae.getAggregate(), 4);
-    }
-
-
-    private void assertEquals(Integer i1, int i2) {
-        Assert.assertEquals(i1, (Integer)i2);
-     }
-    private void assertEquals(Double i1, double i2) {
-        Assert.assertEquals(i1, i2);
-    }
-
-    private void aggregateIsEventually(final CustomAggregatingEnricher<Integer, Integer> cae, final int avg) {
-        ImmutableMap<String, Long> timeout = ImmutableMap.of("timeout", TIMEOUT_MS);
-
-        Asserts.succeedsEventually(timeout, new Runnable() {
-            @Override
-            public void run() {
-                assertEquals(cae.getAggregate(), avg);
-            }
-        });
-    }
-
-}


[6/7] brooklyn-server git commit: Delete SensorTransformingEnricher

Posted by dr...@apache.org.
Delete SensorTransformingEnricher

Was deprecated in 0.7.0; did not have a constructor usable when
deserialising from persisted state, so that backwards compatibility
is not a worry!

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

Branch: refs/heads/master
Commit: a49ebc522e6ba9ec09d630f5d31e74abb5f05bb9
Parents: bbe1171
Author: Aled Sage <al...@gmail.com>
Authored: Sun Jun 11 14:03:58 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Sun Jun 11 14:57:40 2017 +0100

----------------------------------------------------------------------
 .../stock/SensorTransformingEnricher.java       | 115 -------------------
 .../TransformingEnricherDeprecatedTest.java     |  92 ---------------
 2 files changed, 207 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a49ebc52/core/src/main/java/org/apache/brooklyn/enricher/stock/SensorTransformingEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/SensorTransformingEnricher.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/SensorTransformingEnricher.java
deleted file mode 100644
index 339325b..0000000
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/SensorTransformingEnricher.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.enricher.stock;
-
-import org.apache.brooklyn.api.entity.Entity;
-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.util.groovy.GroovyJavaMethods;
-import org.apache.brooklyn.util.javalang.JavaClassNames;
-import groovy.lang.Closure;
-
-import com.google.common.base.Function;
-
-/**
- * @deprecated since 0.7.0; use {@link Enrichers.builder()}
- * @see Transformer if need to sub-class
- */
-@Deprecated
-public class SensorTransformingEnricher<T,U> extends AbstractTypeTransformingEnricher {
-
-    private Function<? super T, ? extends U> transformation;
-
-    public SensorTransformingEnricher(Entity producer, Sensor<T> source, Sensor<U> target, Function<? super T, ? extends U> transformation) {
-        super(producer, source, target);
-        this.transformation = transformation;
-        this.uniqueTag = JavaClassNames.simpleClassName(getClass())+":"+source.getName()+"*->"+target.getName();;
-    }
-
-    /**
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
-     */
-    @Deprecated
-    public SensorTransformingEnricher(Entity producer, Sensor<T> source, Sensor<U> target, Closure transformation) {
-        this(producer, source, target, GroovyJavaMethods.functionFromClosure(transformation));
-    }
-
-    public SensorTransformingEnricher(Sensor<T> source, Sensor<U> target, Function<T,U> transformation) {
-        this(null, source, target, transformation);
-    }
-
-    /**
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
-     */
-    @Deprecated
-    public SensorTransformingEnricher(Sensor<T> source, Sensor<U> target, Closure transformation) {
-        this(null, source, target, GroovyJavaMethods.functionFromClosure(transformation));
-    }
-
-    @Override
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    public void onEvent(SensorEvent event) {
-        if (accept((T)event.getValue())) {
-            if (target instanceof AttributeSensor)
-                entity.sensors().set((AttributeSensor)target, compute((T)event.getValue()));
-            else 
-                entity.sensors().emit(target, compute((T)event.getValue()));
-        }
-    }
-
-    protected boolean accept(T value) {
-        return true;
-    }
-
-    protected U compute(T value) {
-        return transformation.apply(value);
-    }
-
-    /** 
-     * creates an enricher which listens to a source (from the producer), 
-     * transforms it and publishes it under the target
-     * 
-     * Instead, consider calling:
-     * <pre>
-     * {@code
-     * addEnricher(Enrichers.builder()
-     *         .transforming(source)
-     *         .publishing(target)
-     *         .from(producer)
-     *         .computing(transformation)
-     *         .build());
-     * }
-     * </pre>
-     * 
-     * @deprecated since 0.7.0; use {@link Enrichers.builder()}
-     */
-    @Deprecated
-    public static <U,V> SensorTransformingEnricher<U,V> newInstanceTransforming(Entity producer, AttributeSensor<U> source,
-            Function<U,V> transformation, AttributeSensor<V> target) {
-        return new SensorTransformingEnricher<U,V>(producer, source, target, transformation);
-    }
-
-    /** as {@link #newInstanceTransforming(Entity, AttributeSensor, Function, AttributeSensor)}
-     * using the same sensor as the source and the target */
-    public static <T> SensorTransformingEnricher<T,T> newInstanceTransforming(Entity producer, AttributeSensor<T> sensor,
-            Function<T,T> transformation) {
-        return newInstanceTransforming(producer, sensor, transformation, sensor);
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a49ebc52/core/src/test/java/org/apache/brooklyn/enricher/stock/TransformingEnricherDeprecatedTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/enricher/stock/TransformingEnricherDeprecatedTest.java b/core/src/test/java/org/apache/brooklyn/enricher/stock/TransformingEnricherDeprecatedTest.java
deleted file mode 100644
index e52ff45..0000000
--- a/core/src/test/java/org/apache/brooklyn/enricher/stock/TransformingEnricherDeprecatedTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.enricher.stock;
-
-import java.util.Arrays;
-import java.util.concurrent.Callable;
-
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.location.SimulatedLocation;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.core.test.entity.TestEntity;
-import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import com.google.common.base.Function;
-
-@SuppressWarnings("deprecation")
-public class TransformingEnricherDeprecatedTest {
-
-    public static final Logger log = LoggerFactory.getLogger(TransformingEnricherDeprecatedTest.class);
-            
-    private static final long TIMEOUT_MS = 10*1000;
-//    private static final long SHORT_WAIT_MS = 250;
-    
-    TestApplication app;
-    TestEntity producer;
-    AttributeSensor<Integer> intSensorA;
-    AttributeSensor<Long> target;
-
-    @BeforeMethod()
-    public void before() {
-        app = TestApplication.Factory.newManagedInstanceForTests();
-        producer = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-        intSensorA = new BasicAttributeSensor<Integer>(Integer.class, "int.sensor.a");
-        target = new BasicAttributeSensor<Long>(Long.class, "long.sensor.target");
-        
-        app.start(Arrays.asList(new SimulatedLocation()));
-    }
-    
-    @AfterMethod(alwaysRun=true)
-    public void after() {
-        if (app!=null) Entities.destroyAll(app.getManagementContext());
-    }
-    
-    @Test
-    public void testTransformingEnricher() throws InterruptedException {
-        final SensorTransformingEnricher<Integer, Long> e1 = new SensorTransformingEnricher<Integer,Long>(intSensorA, target, new DoubleFn());
-        
-        producer.sensors().set(intSensorA, 3);
-        //ensure previous values get picked up
-        producer.enrichers().add(e1);
-
-        Asserts.succeedsEventually(MutableMap.of("timeout", TIMEOUT_MS), new Callable<Object>() { 
-                @Override
-                public Object call() {
-                    Assert.assertEquals(producer.getAttribute(target), (Long)((long)6));
-                    return null;
-                }});
-    }
-
-    private static class DoubleFn implements Function<Integer, Long> {
-        @Override
-        public Long apply(Integer i) {
-            return ((long)i)*2;
-        }
-    }
-}


[3/7] brooklyn-server git commit: AbstractTransformingEnricher sub-classes: use EnricherSpec

Posted by dr...@apache.org.
AbstractTransformingEnricher sub-classes: use EnricherSpec


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

Branch: refs/heads/master
Commit: 263304b2410e21d58f34c02edaa5f6b5fc58ec0a
Parents: 91c4a5d
Author: Aled Sage <al...@gmail.com>
Authored: Sun Jun 11 13:54:26 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Sun Jun 11 14:57:39 2017 +0100

----------------------------------------------------------------------
 .../stock/AbstractTransformingEnricher.java     |  4 +-
 .../stock/AbstractTypeTransformingEnricher.java |  6 +--
 .../brooklyn/policy/enricher/DeltaEnricher.java |  7 ++-
 .../policy/enricher/RollingMeanEnricher.java    | 15 +++++-
 .../enricher/RollingTimeWindowMeanEnricher.java | 22 ++++----
 .../enricher/TimeFractionDeltaEnricher.java     | 56 ++++++++++++++++++--
 .../enricher/TimeWeightedDeltaEnricher.java     | 36 +++++++++++--
 .../policy/enricher/DeltaEnrichersTests.java    | 38 +++++++++----
 .../policy/enricher/RebindEnricherTest.java     | 30 +++++++++--
 .../enricher/RollingMeanEnricherTest.java       | 22 ++++++--
 .../RollingTimeWindowMeanEnricherTest.java      | 15 ++++--
 .../enricher/TimeFractionDeltaEnricherTest.java | 52 +++++++++---------
 .../brooklyn/entity/java/JavaAppUtils.java      | 16 ++++--
 .../entity/java/VanillaJavaAppRebindTest.java   | 16 ++++--
 .../org/apache/brooklyn/util/time/Duration.java |  5 ++
 15 files changed, 258 insertions(+), 82 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTransformingEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTransformingEnricher.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTransformingEnricher.java
index 6378421..37b8b28 100644
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTransformingEnricher.java
+++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTransformingEnricher.java
@@ -29,10 +29,10 @@ import org.apache.brooklyn.api.sensor.Sensor;
 @Deprecated
 public abstract class AbstractTransformingEnricher<T> extends AbstractTypeTransformingEnricher<T,T> {
 
-    public AbstractTransformingEnricher() { // for rebinding
+    protected AbstractTransformingEnricher() { // for EnricherSpec and rebinding
     }
     
-    public AbstractTransformingEnricher(Entity producer, Sensor<T> source, Sensor<T> target) {
+    protected AbstractTransformingEnricher(Entity producer, Sensor<T> source, Sensor<T> target) {
         super(producer, source, target);
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTypeTransformingEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTypeTransformingEnricher.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTypeTransformingEnricher.java
index 47b9dcf..4c5294d 100644
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTypeTransformingEnricher.java
+++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/AbstractTypeTransformingEnricher.java
@@ -39,15 +39,15 @@ public abstract class AbstractTypeTransformingEnricher<T,U> extends AbstractEnri
     private Entity producer;
     
     @SetFromFlag
-    private Sensor<T> source;
+    protected Sensor<T> source;
     
     @SetFromFlag
     protected Sensor<U> target;
 
-    public AbstractTypeTransformingEnricher() { // for rebind
+    protected AbstractTypeTransformingEnricher() { // for EnricherSpec and rebind
     }
     
-    public AbstractTypeTransformingEnricher(Entity producer, Sensor<T> source, Sensor<U> target) {
+    protected AbstractTypeTransformingEnricher(Entity producer, Sensor<T> source, Sensor<U> target) {
         this.producer = producer;
         this.source = source;
         this.target = target;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/main/java/org/apache/brooklyn/policy/enricher/DeltaEnricher.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/enricher/DeltaEnricher.java b/policy/src/main/java/org/apache/brooklyn/policy/enricher/DeltaEnricher.java
index 1320e45..83da4ca 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/enricher/DeltaEnricher.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/enricher/DeltaEnricher.java
@@ -23,6 +23,7 @@ import static org.apache.brooklyn.util.JavaGroovyEquivalents.elvis;
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.enricher.stock.AbstractTransformingEnricher;
@@ -36,9 +37,13 @@ import org.apache.brooklyn.util.core.flags.TypeCoercions;
 public class DeltaEnricher<T extends Number> extends AbstractTransformingEnricher<T> {
     Number last = 0;
 
-    public DeltaEnricher() { // for rebinding
+    public DeltaEnricher() { // for EnricherSpec and rebinding
     }
     
+    /**
+     * @deprecated since 0.12.0; use {@link EnricherSpec}
+     */
+    @Deprecated
     public DeltaEnricher(Entity producer, Sensor<T> source, AttributeSensor<T> target) {
         super(producer, source, target);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricher.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricher.java b/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricher.java
index 082b851..c403cda 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricher.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricher.java
@@ -23,6 +23,7 @@ import java.util.LinkedList;
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.enricher.stock.AbstractTypeTransformingEnricher;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
@@ -41,9 +42,13 @@ public class RollingMeanEnricher<T extends Number> extends AbstractTypeTransform
     @SetFromFlag
     int windowSize;
 
-    public RollingMeanEnricher() { // for rebinding
+    public RollingMeanEnricher() { // for EnricherSpec and rebinding
     }
     
+    /**
+     * @deprecated since 0.12.0; use {@link EnricherSpec}
+     */
+    @Deprecated
     public RollingMeanEnricher(Entity producer, AttributeSensor<T> source, AttributeSensor<Double> target,
             int windowSize) {
         super(producer, source, target);
@@ -52,6 +57,14 @@ public class RollingMeanEnricher<T extends Number> extends AbstractTypeTransform
             this.uniqueTag = JavaClassNames.simpleClassName(getClass())+":"+source.getName()+"->"+target.getName();
     }
     
+    @Override
+    public void init() {
+        super.init();
+        if (uniqueTag == null && source != null && target != null) {
+            uniqueTag = JavaClassNames.simpleClassName(getClass())+":"+source.getName()+"->"+target.getName();
+        }
+    }
+    
     /** @returns null when no data has been received or windowSize is 0 */
     public Double getAverage() {
         pruneValues();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricher.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricher.java b/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricher.java
index cd16eaa..6a023d8 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricher.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricher.java
@@ -24,6 +24,7 @@ import java.util.LinkedList;
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.config.ConfigKey;
@@ -97,23 +98,24 @@ public class RollingTimeWindowMeanEnricher<T extends Number> extends AbstractTyp
     public RollingTimeWindowMeanEnricher() { // for rebinding
     }
 
+    /**
+     * @deprecated since 0.12.0; use {@link EnricherSpec}
+     */
+    @Deprecated
     public RollingTimeWindowMeanEnricher(Entity producer, AttributeSensor<T> source, 
         AttributeSensor<Double> target, Duration timePeriod) {
         super(producer, source, target);
         this.timePeriod = Preconditions.checkNotNull(timePeriod, "timePeriod");
-        
-        if (source!=null && target!=null)
-            this.uniqueTag = JavaClassNames.simpleClassName(getClass())+":"+source.getName()+"/"+timePeriod+"->"+target.getName();
     }
 
-    /** @deprecated since 0.6.0 use Duration parameter rather than long with millis */
-    @Deprecated
-    public RollingTimeWindowMeanEnricher(Entity producer, AttributeSensor<T> source, 
-            AttributeSensor<Double> target, long timePeriod) {
-        this(producer, source, target, Duration.millis(timePeriod));
+    @Override
+    public void init() {
+        super.init();
+        if (uniqueTag == null && source != null && target != null) {
+            uniqueTag = JavaClassNames.simpleClassName(getClass())+":"+source.getName()+"/"+timePeriod+"->"+target.getName();
+        }
     }
-
-
+    
     @Override
     public void onEvent(SensorEvent<T> event) {
         onEvent(event, event.getTimestamp());

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricher.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricher.java b/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricher.java
index e8db170..c6c0d28 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricher.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricher.java
@@ -21,16 +21,17 @@ package org.apache.brooklyn.policy.enricher;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.brooklyn.api.catalog.Catalog;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.enricher.stock.AbstractTypeTransformingEnricher;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.apache.brooklyn.util.time.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Converts an absolute measure of time into a fraction of time, based on the delta between consecutive values 
@@ -46,8 +47,16 @@ import org.apache.brooklyn.util.time.Duration;
 public class TimeFractionDeltaEnricher<T extends Number> extends AbstractTypeTransformingEnricher<T,Double> {
     private static final Logger LOG = LoggerFactory.getLogger(TimeFractionDeltaEnricher.class);
     
+    /**
+     * @deprecated since 0.12.0; use {@link #durationPerOrigUnit}
+     */
+    //Kept for backwards compatibility with persisted state.
+    @SetFromFlag
+    @Deprecated
+    private Long nanosPerOrigUnit;
+    
     @SetFromFlag
-    private long nanosPerOrigUnit;
+    private Duration durationPerOrigUnit;
     
     protected Number lastValue;
     protected long lastTimestamp = -1;
@@ -55,10 +64,18 @@ public class TimeFractionDeltaEnricher<T extends Number> extends AbstractTypeTra
     public TimeFractionDeltaEnricher() { // for rebinding
     }
     
+    /**
+     * @deprecated since 0.12.0; use {@link EnricherSpec}
+     */
+    @Deprecated
     public TimeFractionDeltaEnricher(Entity producer, Sensor<T> source, Sensor<Double> target, TimeUnit origUnits) {
         this(producer, source, target, origUnits.toNanos(1));
     }
     
+    /**
+     * @deprecated since 0.12.0; use {@link EnricherSpec}
+     */
+    @Deprecated
     public TimeFractionDeltaEnricher(Entity producer, Sensor<T> source, Sensor<Double> target, long nanosPerOrigUnit) {
         super(producer, source, target);
         this.nanosPerOrigUnit = nanosPerOrigUnit;
@@ -68,6 +85,37 @@ public class TimeFractionDeltaEnricher<T extends Number> extends AbstractTypeTra
     }
     
     @Override
+    public void init() {
+        super.init();
+        if (durationPerOrigUnit == null) {
+            if (nanosPerOrigUnit != null) {
+                durationPerOrigUnit = Duration.nanos(nanosPerOrigUnit);
+            } else {
+                durationPerOrigUnit = Duration.nanos(1);
+            }
+        }
+        nanosPerOrigUnit = null;
+        
+        if (uniqueTag == null && source != null && target != null) {
+            uniqueTag = JavaClassNames.simpleClassName(getClass())+":"+source.getName()+"*"+durationPerOrigUnit+"->"+target.getName();
+        }
+    }
+    
+    @Override
+    public void rebind() {
+        super.rebind();
+        
+        if (durationPerOrigUnit == null) {
+            if (nanosPerOrigUnit != null) {
+                durationPerOrigUnit = Duration.nanos(nanosPerOrigUnit);
+            } else {
+                durationPerOrigUnit = Duration.nanos(1);
+            }
+        }
+        nanosPerOrigUnit = null;
+    }
+    
+    @Override
     public void onEvent(SensorEvent<T> event) {
         onEvent(event, event.getTimestamp());
     }
@@ -93,7 +141,7 @@ public class TimeFractionDeltaEnricher<T extends Number> extends AbstractTypeTra
                         new Object[] {this, lastValue, lastTimestamp, current, eventTimestamp});
             } else {
                 long duration = eventTimestamp - lastTimestamp;
-                double fraction = toNanos(current.doubleValue() - lastValue.doubleValue(), nanosPerOrigUnit) / TimeUnit.MILLISECONDS.toNanos(duration);
+                double fraction = toNanos(current.doubleValue() - lastValue.doubleValue(), durationPerOrigUnit.nanos()) / TimeUnit.MILLISECONDS.toNanos(duration);
                 entity.sensors().set((AttributeSensor<Double>)target, fraction);
                 if (LOG.isTraceEnabled()) LOG.trace("set {} to {}, {} -> {} at {} (previous at {})", 
                         new Object[] {this, fraction, lastValue, current, eventTimestamp, lastTimestamp}); 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeWeightedDeltaEnricher.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeWeightedDeltaEnricher.java b/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeWeightedDeltaEnricher.java
index 3f48433..6237839 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeWeightedDeltaEnricher.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/enricher/TimeWeightedDeltaEnricher.java
@@ -18,11 +18,10 @@
  */
 package org.apache.brooklyn.policy.enricher;
 
-import groovy.lang.Closure;
-
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.enricher.stock.AbstractTypeTransformingEnricher;
@@ -38,6 +37,8 @@ import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
 import com.google.common.base.Functions;
 
+import groovy.lang.Closure;
+
 /**
  * Converts an absolute sensor into a delta sensor (i.e. the diff between the current and previous value),
  * presented as a units/timeUnit based on the event timing.
@@ -68,6 +69,10 @@ public class TimeWeightedDeltaEnricher<T extends Number> extends AbstractTypeTra
     @SetFromFlag
     Function<Double,Double> postProcessor;
     
+    /**
+     * @deprecated since 0.12.0; use {@link EnricherSpec}
+     */
+    @Deprecated
     // default 1 second
     public static <T extends Number> TimeWeightedDeltaEnricher<T> getPerSecondDeltaEnricher(Entity producer, Sensor<T> source, Sensor<Double> target) {
         return new TimeWeightedDeltaEnricher<T>(producer, source, target, 1000);
@@ -76,18 +81,26 @@ public class TimeWeightedDeltaEnricher<T extends Number> extends AbstractTypeTra
     public TimeWeightedDeltaEnricher() { // for rebind
     }
     
+    /**
+     * @deprecated since 0.12.0; use {@link EnricherSpec}
+     */
+    @Deprecated
     public TimeWeightedDeltaEnricher(Entity producer, Sensor<T> source, Sensor<Double> target, int unitMillis) {
         this(producer, source, target, unitMillis, Functions.<Double>identity());
     }
     
     /**
-     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted.
+     * @deprecated since 0.11.0; explicit groovy utilities/support will be deleted; also use {@link EnricherSpec}
      */
     @Deprecated
     public TimeWeightedDeltaEnricher(Entity producer, Sensor<T> source, Sensor<Double> target, int unitMillis, Closure<Double> postProcessor) {
         this(producer, source, target, unitMillis, GroovyJavaMethods.<Double,Double>functionFromClosure(postProcessor));
     }
     
+    /**
+     * @deprecated since 0.12.0; use {@link EnricherSpec}
+     */
+    @Deprecated
     public TimeWeightedDeltaEnricher(Entity producer, Sensor<T> source, Sensor<Double> target, int unitMillis, Function<Double,Double> postProcessor) {
         super(producer, source, target);
         this.unitMillis = unitMillis;
@@ -98,6 +111,15 @@ public class TimeWeightedDeltaEnricher<T extends Number> extends AbstractTypeTra
     }
     
     @Override
+    public void init() {
+        super.init();
+        
+        if (uniqueTag == null && source != null && target != null) {
+            uniqueTag = JavaClassNames.simpleClassName(getClass())+":"+source.getName()+"/"+Duration.millis(unitMillis)+"->"+target.getName();
+        }
+    }
+
+    @Override
     public void onEvent(SensorEvent<T> event) {
         onEvent(event, event.getTimestamp());
     }
@@ -109,7 +131,7 @@ public class TimeWeightedDeltaEnricher<T extends Number> extends AbstractTypeTra
             // Can't compute a delta; 
             // don't assume current=zero because then things like requestCount->requestsPerSecond is negative!
             // instead assume same as last time, so delta == 0
-            double deltaPostProcessed = postProcessor.apply(0d);
+            double deltaPostProcessed = getPostProcessor().apply(0d);
             entity.sensors().set((AttributeSensor<Double>)target, deltaPostProcessed);
             if (LOG.isTraceEnabled()) LOG.trace("set {} to {}, {} -> {} at {}", new Object[] {this, deltaPostProcessed, lastValue, current, eventTime});
             return;
@@ -123,7 +145,7 @@ public class TimeWeightedDeltaEnricher<T extends Number> extends AbstractTypeTra
                 double duration = (lastTime < 0) ? unitMillis : eventTime - lastTime;
                 if (eventTime == lastTime) duration = 0.1; // 0.1 of a millisecond is a relatively small number: 
                 double delta = (current.doubleValue() - lastValue.doubleValue()) / (duration / unitMillis);
-                double deltaPostProcessed = postProcessor.apply(delta);
+                double deltaPostProcessed = getPostProcessor().apply(delta);
                 entity.sensors().set((AttributeSensor<Double>)target, deltaPostProcessed);
                 if (LOG.isTraceEnabled()) LOG.trace("set {} to {}, {} -> {} at {}", new Object[] {this, deltaPostProcessed, lastValue, current, eventTime}); 
             }
@@ -134,4 +156,8 @@ public class TimeWeightedDeltaEnricher<T extends Number> extends AbstractTypeTra
             lastTime = -1;
         }
     }
+    
+    private Function<Double, Double> getPostProcessor() {
+        return (postProcessor != null) ? postProcessor : Functions.<Double>identity();
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java
index 62cdef8..4c67b96 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java
@@ -24,10 +24,12 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.SubscriptionContext;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.util.time.Duration;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -52,9 +54,12 @@ public class DeltaEnrichersTests extends BrooklynAppUnitTestSupport {
     @Test
     public void testDeltaEnricher() {
         AttributeSensor<Integer> deltaSensor = new BasicAttributeSensor<Integer>(Integer.class, "delta sensor");
-        DeltaEnricher<Integer> delta = new DeltaEnricher<Integer>(producer, intSensor, deltaSensor);
-        producer.enrichers().add(delta);
-        
+        @SuppressWarnings("unchecked")
+        DeltaEnricher<Integer> delta = producer.enrichers().add(EnricherSpec.create(DeltaEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", deltaSensor));
+
         delta.onEvent(intSensor.newEvent(producer, 0));
         delta.onEvent(intSensor.newEvent(producer, 0));
         assertEquals(producer.getAttribute(deltaSensor), (Integer)0);
@@ -69,9 +74,12 @@ public class DeltaEnrichersTests extends BrooklynAppUnitTestSupport {
     @Test
     public void testMonospaceTimeWeightedDeltaEnricher() {
         AttributeSensor<Double> deltaSensor = new BasicAttributeSensor<Double>(Double.class, "per second delta delta sensor");
-        TimeWeightedDeltaEnricher<Integer> delta =
-            TimeWeightedDeltaEnricher.<Integer>getPerSecondDeltaEnricher(producer, intSensor, deltaSensor);
-        producer.enrichers().add(delta);
+        @SuppressWarnings("unchecked")
+        TimeWeightedDeltaEnricher<Integer> delta = producer.enrichers().add(EnricherSpec.create(TimeWeightedDeltaEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", deltaSensor)
+                .configure("unitMillis", 1000));
         
         // Don't start with timestamp=0: that may be treated special 
         delta.onEvent(intSensor.newEvent(producer, 0), 1000);
@@ -89,9 +97,12 @@ public class DeltaEnrichersTests extends BrooklynAppUnitTestSupport {
     @Test
     public void testVariableTimeWeightedDeltaEnricher() {
         AttributeSensor<Double> deltaSensor = new BasicAttributeSensor<Double>(Double.class, "per second delta delta sensor");
-        TimeWeightedDeltaEnricher<Integer> delta =
-            TimeWeightedDeltaEnricher.<Integer>getPerSecondDeltaEnricher(producer, intSensor, deltaSensor);
-        producer.enrichers().add(delta);
+        @SuppressWarnings("unchecked")
+        TimeWeightedDeltaEnricher<Integer> delta = producer.enrichers().add(EnricherSpec.create(TimeWeightedDeltaEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", deltaSensor)
+                .configure("unitMillis", 1000));
         
         delta.onEvent(intSensor.newEvent(producer, 0), 1000);
         delta.onEvent(intSensor.newEvent(producer, 0), 3000);
@@ -109,8 +120,13 @@ public class DeltaEnrichersTests extends BrooklynAppUnitTestSupport {
     @Test
     public void testPostProcessorCalledForDeltaEnricher() {
         AttributeSensor<Double> deltaSensor = new BasicAttributeSensor<Double>(Double.class, "per second delta delta sensor");
-        TimeWeightedDeltaEnricher<Integer> delta = new TimeWeightedDeltaEnricher<Integer>(producer, intSensor, deltaSensor, 1000, new AddConstant(123d));
-        producer.enrichers().add(delta);
+        @SuppressWarnings("unchecked")
+        TimeWeightedDeltaEnricher<Integer> delta = producer.enrichers().add(EnricherSpec.create(TimeWeightedDeltaEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", deltaSensor)
+                .configure("unitMillis", 1000)
+                .configure("postProcessor", new AddConstant(123d)));
         
         delta.onEvent(intSensor.newEvent(producer, 0), 1000);
         delta.onEvent(intSensor.newEvent(producer, 0), 2000);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java
index 21124ae..975fd9f 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RebindEnricherTest.java
@@ -24,6 +24,7 @@ import java.net.URL;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.EntityAsserts;
 import org.apache.brooklyn.core.mgmt.rebind.RebindTestFixtureWithApp;
@@ -57,7 +58,10 @@ public class RebindEnricherTest extends RebindTestFixtureWithApp {
     
     @Test
     public void testDeltaEnricher() throws Exception {
-        origApp.enrichers().add(new DeltaEnricher<Integer>(origApp, INT_METRIC, INT_METRIC2));
+        origApp.enrichers().add(EnricherSpec.create(DeltaEnricher.class)
+                .configure("producer", origApp)
+                .configure("source", INT_METRIC)
+                .configure("target", INT_METRIC2));
         
         TestApplication newApp = rebind();
 
@@ -93,7 +97,11 @@ public class RebindEnricherTest extends RebindTestFixtureWithApp {
 
     @Test
     public void testRollingMeanEnricher() throws Exception {
-        origApp.enrichers().add(new RollingMeanEnricher<Integer>(origApp, INT_METRIC, DOUBLE_METRIC, 2));
+        origApp.enrichers().add(EnricherSpec.create(RollingMeanEnricher.class)
+                .configure("producer", origApp)
+                .configure("source", INT_METRIC)
+                .configure("target", DOUBLE_METRIC)
+                .configure("windowSize", 2));
         
         TestApplication newApp = rebind();
 
@@ -103,7 +111,11 @@ public class RebindEnricherTest extends RebindTestFixtureWithApp {
 
     @Test
     public void testRollingTimeWindowMeanEnricher() throws Exception {
-        origApp.enrichers().add(new RollingTimeWindowMeanEnricher<Integer>(origApp, INT_METRIC, DOUBLE_METRIC, Duration.of(10, TimeUnit.MILLISECONDS)));
+        origApp.enrichers().add(EnricherSpec.create(RollingTimeWindowMeanEnricher.class)
+                .configure("producer", origApp)
+                .configure("source", INT_METRIC)
+                .configure("target", DOUBLE_METRIC)
+                .configure("timePeriod", Duration.millis(10)));
         
         TestApplication newApp = rebind();
 
@@ -115,7 +127,11 @@ public class RebindEnricherTest extends RebindTestFixtureWithApp {
     
     @Test
     public void testTimeFractionDeltaEnricher() throws Exception {
-        origApp.enrichers().add(new TimeFractionDeltaEnricher<Integer>(origApp, INT_METRIC, DOUBLE_METRIC, TimeUnit.MILLISECONDS));
+        origApp.enrichers().add(EnricherSpec.create(TimeFractionDeltaEnricher.class)
+                .configure("producer", origApp)
+                .configure("source", INT_METRIC)
+                .configure("target", DOUBLE_METRIC)
+                .configure("durationPerOrigUnit", Duration.millis(1)));
         
         final TestApplication newApp = rebind();
 
@@ -132,7 +148,11 @@ public class RebindEnricherTest extends RebindTestFixtureWithApp {
     
     @Test
     public void testTimeWeightedDeltaEnricher() throws Exception {
-        origApp.enrichers().add(new TimeWeightedDeltaEnricher<Integer>(origApp, INT_METRIC, DOUBLE_METRIC, 1000));
+        origApp.enrichers().add(EnricherSpec.create(TimeWeightedDeltaEnricher.class)
+                .configure("producer", origApp)
+                .configure("source", INT_METRIC)
+                .configure("target", DOUBLE_METRIC)
+                .configure("unitMillis", 1000));
         
         final TestApplication newApp = rebind();
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java
index 4db1a6f..2286ce1 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java
@@ -23,6 +23,7 @@ import static org.testng.Assert.assertEquals;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
@@ -40,6 +41,7 @@ public class RollingMeanEnricherTest extends BrooklynAppUnitTestSupport {
     RollingMeanEnricher<Integer> averager;
 
     @BeforeMethod(alwaysRun=true)
+    @SuppressWarnings("unchecked")
     @Override
     public void setUp() throws Exception {
         super.setUp();
@@ -49,9 +51,15 @@ public class RollingMeanEnricherTest extends BrooklynAppUnitTestSupport {
         deltaSensor = new BasicAttributeSensor<Integer>(Integer.class, "delta sensor");
         avgSensor = new BasicAttributeSensor<Double>(Double.class, "avg sensor");
         
-        producer.enrichers().add(new DeltaEnricher<Integer>(producer, intSensor, deltaSensor));
-        averager = new RollingMeanEnricher<Integer>(producer, deltaSensor, avgSensor, 4);
-        producer.enrichers().add(averager);
+        producer.enrichers().add(EnricherSpec.create(DeltaEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", deltaSensor));
+        averager = producer.enrichers().add(EnricherSpec.create(RollingMeanEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", deltaSensor)
+                .configure("windowSize", 4));
     }
 
     @Test
@@ -60,9 +68,13 @@ public class RollingMeanEnricherTest extends BrooklynAppUnitTestSupport {
     }
     
     @Test
+    @SuppressWarnings("unchecked")
     public void testZeroWindowSize() {
-        averager = new RollingMeanEnricher<Integer>(producer, deltaSensor, avgSensor, 0);
-        producer.enrichers().add(averager);
+        averager = producer.enrichers().add(EnricherSpec.create(RollingMeanEnricher.class)
+                .configure("producer", producer)
+                .configure("source", deltaSensor)
+                .configure("target", avgSensor)
+                .configure("windowSize", 0));
         
         averager.onEvent(intSensor.newEvent(producer, 10));
         assertEquals(averager.getAverage(), null);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java
index 90854e7..e911fe4 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java
@@ -23,11 +23,13 @@ import static org.testng.Assert.assertEquals;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
 import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.policy.enricher.RollingTimeWindowMeanEnricher.ConfidenceQualifiedNumber;
+import org.apache.brooklyn.util.time.Duration;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -46,6 +48,7 @@ public class RollingTimeWindowMeanEnricherTest extends BrooklynAppUnitTestSuppor
     private final long timePeriod = 1000;
     
     @BeforeMethod(alwaysRun=true)
+    @SuppressWarnings("unchecked")
     @Override
     public void setUp() throws Exception {
         super.setUp();
@@ -55,9 +58,15 @@ public class RollingTimeWindowMeanEnricherTest extends BrooklynAppUnitTestSuppor
         deltaSensor = new BasicAttributeSensor<Integer>(Integer.class, "delta sensor");
         avgSensor = new BasicAttributeSensor<Double>(Double.class, "avg sensor");
         
-        producer.enrichers().add(new DeltaEnricher<Integer>(producer, intSensor, deltaSensor));
-        averager = new RollingTimeWindowMeanEnricher<Integer>(producer, deltaSensor, avgSensor, timePeriod);
-        producer.enrichers().add(averager);
+        producer.enrichers().add(EnricherSpec.create(DeltaEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", deltaSensor));
+        averager = producer.enrichers().add(EnricherSpec.create(RollingTimeWindowMeanEnricher.class)
+                .configure("producer", producer)
+                .configure("source", deltaSensor)
+                .configure("target", avgSensor)
+                .configure("timePeriod", timePeriod));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/policy/src/test/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricherTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricherTest.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricherTest.java
index 6b1dfff..cc5cde0 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricherTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/TimeFractionDeltaEnricherTest.java
@@ -20,52 +20,48 @@ package org.apache.brooklyn.policy.enricher;
 
 import static org.testng.Assert.assertEquals;
 
-import java.util.concurrent.TimeUnit;
-
-import org.apache.brooklyn.api.entity.EntityLocal;
+import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.SubscriptionContext;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
-import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.sensor.BasicSensorEvent;
 import org.apache.brooklyn.core.sensor.Sensors;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
-import org.apache.brooklyn.policy.enricher.TimeFractionDeltaEnricher;
-import org.testng.annotations.AfterMethod;
+import org.apache.brooklyn.util.time.Duration;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-public class TimeFractionDeltaEnricherTest {
+public class TimeFractionDeltaEnricherTest extends BrooklynAppUnitTestSupport {
 
     private static final double PRECISION = 0.000001;
     
-    private TestApplication app;
-    private EntityLocal producer;
+    private Entity producer;
 
     Sensor<Integer> intSensor;
     AttributeSensor<Double> fractionSensor;
     SubscriptionContext subscription;
     
     @BeforeMethod(alwaysRun=true)
-    public void before() {
-        app = TestApplication.Factory.newManagedInstanceForTests();
-        producer = app.createAndManageChild(EntitySpec.create(TestEntity.class));
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        producer = app.addChild(EntitySpec.create(TestEntity.class));
         
         intSensor = Sensors.newIntegerSensor("int sensor");
         fractionSensor = Sensors.newDoubleSensor("fraction sensor");
     }
 
-    @AfterMethod(alwaysRun=true)
-    public void after() {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
     @Test
     public void testCalculatesFractions() {
-        TimeFractionDeltaEnricher<Integer> enricher = new TimeFractionDeltaEnricher<Integer>(producer, intSensor, fractionSensor, TimeUnit.MILLISECONDS);
-        producer.enrichers().add(enricher);
+        @SuppressWarnings("unchecked")
+        TimeFractionDeltaEnricher<Integer> enricher = producer.enrichers().add(EnricherSpec.create(TimeFractionDeltaEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", fractionSensor)
+                .configure("durationPerOrigUnit", Duration.millis(1)));
         
         enricher.onEvent(new BasicSensorEvent<Integer>(intSensor, producer, 0, 1000000L));
         enricher.onEvent(new BasicSensorEvent<Integer>(intSensor, producer, 0, 1001000L));
@@ -83,8 +79,12 @@ public class TimeFractionDeltaEnricherTest {
     
     @Test
     public void testConvertsTimeUnits() {
-        TimeFractionDeltaEnricher<Integer> enricher = new TimeFractionDeltaEnricher<Integer>(producer, intSensor, fractionSensor, TimeUnit.MICROSECONDS);
-        producer.enrichers().add(enricher);
+        @SuppressWarnings("unchecked")
+        TimeFractionDeltaEnricher<Integer> enricher = producer.enrichers().add(EnricherSpec.create(TimeFractionDeltaEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", fractionSensor)
+                .configure("durationPerOrigUnit", Duration.micros(1)));
         
         enricher.onEvent(new BasicSensorEvent<Integer>(intSensor, producer, 0, 1000000L));
         enricher.onEvent(new BasicSensorEvent<Integer>(intSensor, producer, 1000000, 1001000L));
@@ -93,8 +93,12 @@ public class TimeFractionDeltaEnricherTest {
     
     @Test
     public void testConverts100NanosTimeBlocks() {
-        TimeFractionDeltaEnricher<Integer> enricher = new TimeFractionDeltaEnricher<Integer>(producer, intSensor, fractionSensor, 100);
-        producer.enrichers().add(enricher);
+        @SuppressWarnings("unchecked")
+        TimeFractionDeltaEnricher<Integer> enricher = producer.enrichers().add(EnricherSpec.create(TimeFractionDeltaEnricher.class)
+                .configure("producer", producer)
+                .configure("source", intSensor)
+                .configure("target", fractionSensor)
+                .configure("durationPerOrigUnit", Duration.nanos(100)));
         
         enricher.onEvent(new BasicSensorEvent<Integer>(intSensor, producer, 0, 1000000L));
         enricher.onEvent(new BasicSensorEvent<Integer>(intSensor, producer, 10000000, 1001000L));

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/software/base/src/main/java/org/apache/brooklyn/entity/java/JavaAppUtils.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/java/JavaAppUtils.java b/software/base/src/main/java/org/apache/brooklyn/entity/java/JavaAppUtils.java
index cde0a9e..0f44f3c 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/java/JavaAppUtils.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/java/JavaAppUtils.java
@@ -30,6 +30,7 @@ import javax.annotation.Nullable;
 import javax.management.openmbean.CompositeData;
 
 import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.core.config.render.RendererHints;
 import org.apache.brooklyn.feed.http.HttpValueFunctions;
 import org.apache.brooklyn.feed.jmx.JmxAttributePollConfig;
@@ -93,12 +94,17 @@ public class JavaAppUtils {
     }
 
     public static void connectJavaAppServerPolicies(Entity entity, Duration windowPeriod) {
-        entity.enrichers().add(new TimeFractionDeltaEnricher<Double>(entity, UsesJavaMXBeans.PROCESS_CPU_TIME, 
-                UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST, TimeUnit.MILLISECONDS));
+        entity.enrichers().add(EnricherSpec.create(TimeFractionDeltaEnricher.class)
+                .configure("producer", entity)
+                .configure("source", UsesJavaMXBeans.PROCESS_CPU_TIME)
+                .configure("target", UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST)
+                .configure("durationPerOrigUnit", Duration.millis(1)));
 
-        entity.enrichers().add(new RollingTimeWindowMeanEnricher<Double>(entity,
-                UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST, UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_IN_WINDOW,
-                windowPeriod));
+        entity.enrichers().add(EnricherSpec.create(RollingTimeWindowMeanEnricher.class)
+                .configure("producer", entity)
+                .configure("source", UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST)
+                .configure("target", UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_IN_WINDOW)
+                .configure("timePeriod", windowPeriod));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/software/base/src/test/java/org/apache/brooklyn/entity/java/VanillaJavaAppRebindTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/java/VanillaJavaAppRebindTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/java/VanillaJavaAppRebindTest.java
index a5d0fbc..35125be 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/java/VanillaJavaAppRebindTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/java/VanillaJavaAppRebindTest.java
@@ -24,6 +24,7 @@ import java.io.File;
 
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityAsserts;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
@@ -31,6 +32,7 @@ import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.entity.java.JavaOptsTest.TestingJavaOptsVanillaJavaAppImpl;
+import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 import org.apache.brooklyn.policy.enricher.RollingTimeWindowMeanEnricher;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;
@@ -41,7 +43,6 @@ import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
-import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
@@ -156,13 +157,22 @@ public class VanillaJavaAppRebindTest {
         public void onManagementStarted() {
             super.onManagementStarted();
             LOG.info("mgmt started for "+this);
-            enrichers().add(new RollingTimeWindowMeanEnricher<Double>(this, PROCESS_CPU_TIME, AVG1, Duration.TEN_SECONDS));
+            enrichers().add(EnricherSpec.create(RollingTimeWindowMeanEnricher.class)
+                    .configure("producer", this)
+                    .configure("source", PROCESS_CPU_TIME)
+                    .configure("target", AVG1)
+                    .configure("timePeriod", Duration.TEN_SECONDS));
         }
+        
         @Override
         protected void connectSensors() {
             super.connectSensors();
             LOG.info("connecting sensors for "+this);
-            enrichers().add(new RollingTimeWindowMeanEnricher<Double>(this, PROCESS_CPU_TIME, AVG2, Duration.TEN_SECONDS));
+            enrichers().add(EnricherSpec.create(RollingTimeWindowMeanEnricher.class)
+                    .configure("producer", this)
+                    .configure("source", PROCESS_CPU_TIME)
+                    .configure("target", AVG2)
+                    .configure("timePeriod", Duration.TEN_SECONDS));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/263304b2/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java b/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java
index f649bef..64ab629 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java
@@ -178,6 +178,11 @@ public class Duration implements Comparable<Duration>, Serializable {
     }
 
     /** creates new {@link Duration} instance of the given length of time */
+    public static Duration micros(Number n) {
+        return new Duration((long) (n.doubleValue() * TimeUnit.MICROSECONDS.toNanos(1)), TimeUnit.NANOSECONDS);
+    }
+
+    /** creates new {@link Duration} instance of the given length of time */
     public static Duration nanos(Number n) {
         return new Duration(n.longValue(), TimeUnit.NANOSECONDS);
     }


[2/7] brooklyn-server git commit: Delete SensorPropagatingEnricher

Posted by dr...@apache.org.
Delete SensorPropagatingEnricher

Was deprecated in 0.7.0; did not have a constructor usable when
deserialising from persisted state, so that backwards compatibility
is not a worry!


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

Branch: refs/heads/master
Commit: bbe1171d8a00b17bd5a6465755653584185700f8
Parents: f3fe15f
Author: Aled Sage <al...@gmail.com>
Authored: Sun Jun 11 14:01:56 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Sun Jun 11 14:57:39 2017 +0100

----------------------------------------------------------------------
 .../stock/SensorPropagatingEnricher.java        | 186 -------------------
 ...SensorPropagatingEnricherDeprecatedTest.java | 107 -----------
 2 files changed, 293 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/bbe1171d/core/src/main/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricher.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricher.java
deleted file mode 100644
index bb7f2ab..0000000
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricher.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.enricher.stock;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
-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.enricher.AbstractEnricher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-
-/** 
- * an enricher policy which just listens for the target sensor(s) on a child entity and passes it up.
- * now superseded by syntax such as:
- * 
- * <pre>{@code Enrichers.builder().propagating(sensor).from(source).build()}</pre>
- * 
- * @deprecated since 0.7.0; use {@link Enrichers#builder()}
- * 
- * @see Propagator if need to sub-class
- */
-@Deprecated
-public class SensorPropagatingEnricher extends AbstractEnricher implements SensorEventListener<Object> {
-    
-    public static final Logger log = LoggerFactory.getLogger(SensorPropagatingEnricher.class);
-        
-    /** the entity to listen to */
-    private final Entity source;
-    
-    /** the sensors to listen to */
-    private final Set<Sensor<?>> sensors;
-
-    /** the sensors to listen to */
-    private final Map<Sensor<?>, Sensor<?>> sensorMappings;
-
-    public static SensorPropagatingEnricher newInstanceListeningToAllSensors(Entity source) {
-        return newInstanceListeningToAllSensorsBut(source);
-    }
-    public static SensorPropagatingEnricher newInstanceListeningToAllSensorsBut(Entity source, Sensor<?>... excludes) {
-        Set<Sensor<?>> excluded = ImmutableSet.copyOf(excludes);
-        Set<Sensor<?>> includes = Sets.newLinkedHashSet();
-        
-        for (Sensor<?> it : source.getEntityType().getSensors()) {
-            if (!excluded.contains(it)) includes.add(it);
-        }
-        return new SensorPropagatingEnricher(source, includes);
-    }
-
-    public static SensorPropagatingEnricher newInstanceListeningTo(Entity source, Sensor<?>... includes) {
-        return new SensorPropagatingEnricher(source, includes);
-    }
-
-    /**
-     * listens to sensors from source, propagates them here renamed according to the map
-     * 
-     * Instead, consider calling:
-     * <pre>
-     * {@code
-     * addEnricher(Enrichers.builder()
-     *         .propagating(mapOfOldSensorNamesToNewSensorNames)
-     *         .from(source)
-     *         .build());
-     * }
-     * </pre>
-     *
-     * @deprecated since 0.7.0; use {@link Enrichers#builder()}
-     */
-    @Deprecated
-    public static SensorPropagatingEnricher newInstanceRenaming(Entity source, Map<? extends Sensor<?>, ? extends Sensor<?>> sensors) {
-        return new SensorPropagatingEnricher(source, sensors);
-    }
-
-    /**
-     * @deprecated since 0.7.0; use {@link Enrichers#builder()}
-     */
-    @Deprecated
-    public SensorPropagatingEnricher(Entity source, Sensor<?>... sensors) {
-        this(source, ImmutableList.copyOf(sensors));
-    }
-    
-    /** 
-     * Instead, consider calling:
-     * <pre>
-     * {@code
-     * addEnricher(Enrichers.builder()
-     *         .propagating(sensors)
-     *         .from(source)
-     *         .build());
-     * }
-     * </pre>
-     *
-     * @deprecated since 0.7.0; use {@link Enrichers#builder()}
-     */
-    @Deprecated
-    public SensorPropagatingEnricher(Entity source, Collection<Sensor<?>> sensors) {
-        this.source = source;
-        this.sensors = ImmutableSet.copyOf(sensors);
-        this.sensorMappings = ImmutableMap.of();
-    }
-    
-    public SensorPropagatingEnricher(Entity source, Map<? extends Sensor<?>, ? extends Sensor<?>> sensors) {
-        this.source = source;
-        this.sensors = ImmutableSet.copyOf(sensors.keySet());
-        this.sensorMappings = ImmutableMap.copyOf(sensors);
-    }
-    
-    @Override
-    public void setEntity(EntityLocal entity) {
-        super.setEntity(entity);
-        for (Sensor<?> s: sensors) {
-            subscriptions().subscribe(source, s, this);
-        }
-    }
-    
-    @Override
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    public void onEvent(SensorEvent<Object> event) {
-        // propagate upwards
-        Sensor<?> sourceSensor = event.getSensor();
-        Sensor<?> destinationSensor = getDestinationSensor(sourceSensor);
-        
-        if (log.isTraceEnabled()) log.trace("policy {} got {}, propagating via {}{}", 
-                new Object[] {this, event, entity, (sourceSensor == destinationSensor ? "" : " (as "+destinationSensor+")")});
-        
-        if (event.getSensor() instanceof AttributeSensor) {
-            entity.sensors().set((AttributeSensor)destinationSensor, event.getValue());
-        } else {
-            entity.sensors().emit((Sensor)destinationSensor, event.getValue());
-        }       
-    }
-
-    /** useful post-addition to emit current values */
-    public void emitAllAttributes() {
-        emitAllAttributes(false);
-    }
-
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    public void emitAllAttributes(boolean includeNullValues) {
-        for (Sensor s: sensors) {
-            if (s instanceof AttributeSensor) {
-                AttributeSensor destinationSensor = (AttributeSensor<?>) getDestinationSensor(s);
-                Object v = source.getAttribute((AttributeSensor)s);
-                if (v != null || includeNullValues) entity.sensors().set(destinationSensor, v);
-            }
-        }
-    }
-
-    /** convenience, to be called by the host */
-    public SensorPropagatingEnricher addToEntityAndEmitAll(Entity host) {
-        host.enrichers().add(this);
-        emitAllAttributes();
-        return this;
-    }
-    
-    private Sensor<?> getDestinationSensor(Sensor<?> sourceSensor) {
-        return sensorMappings.containsKey(sourceSensor) ? sensorMappings.get(sourceSensor): sourceSensor;
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/bbe1171d/core/src/test/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricherDeprecatedTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricherDeprecatedTest.java b/core/src/test/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricherDeprecatedTest.java
deleted file mode 100644
index 1377078..0000000
--- a/core/src/test/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricherDeprecatedTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.enricher.stock;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.api.sensor.SensorEvent;
-import org.apache.brooklyn.api.sensor.SensorEventListener;
-import org.apache.brooklyn.core.entity.EntityAsserts;
-import org.apache.brooklyn.core.sensor.Sensors;
-import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
-import org.apache.brooklyn.core.test.entity.TestEntity;
-import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.javalang.AtomicReferences;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableMap;
-
-public class SensorPropagatingEnricherDeprecatedTest extends BrooklynAppUnitTestSupport {
-
-    private TestEntity entity;
-
-    @BeforeMethod(alwaysRun=true)
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        entity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
-    }
-    
-    @Test
-    public void testPropagatesSpecificSensor() {
-        app.enrichers().add(SensorPropagatingEnricher.newInstanceListeningTo(entity, TestEntity.NAME));
-
-        // name propagated
-        entity.sensors().set(TestEntity.NAME, "foo");
-        EntityAsserts.assertAttributeEqualsEventually(app, TestEntity.NAME, "foo");
-        
-        // sequence not propagated
-        entity.sensors().set(TestEntity.SEQUENCE, 2);
-        EntityAsserts.assertAttributeEqualsContinually(MutableMap.of("timeout", 100), app, TestEntity.SEQUENCE, null);
-    }
-    
-    @Test
-    public void testPropagatesAllSensors() {
-        app.enrichers().add(SensorPropagatingEnricher.newInstanceListeningToAllSensors(entity));
-
-        // all attributes propagated
-        entity.sensors().set(TestEntity.NAME, "foo");
-        entity.sensors().set(TestEntity.SEQUENCE, 2);
-        
-        EntityAsserts.assertAttributeEqualsEventually(app, TestEntity.NAME, "foo");
-        EntityAsserts.assertAttributeEqualsEventually(app, TestEntity.SEQUENCE, 2);
-        
-        // notification-sensor propagated
-        final AtomicReference<Integer> notif = new AtomicReference<Integer>();
-        app.subscriptions().subscribe(app, TestEntity.MY_NOTIF, new SensorEventListener<Integer>() {
-                @Override public void onEvent(SensorEvent<Integer> event) {
-                    notif.set(event.getValue());
-                }});
-        entity.sensors().emit(TestEntity.MY_NOTIF, 7);
-        Asserts.eventually(AtomicReferences.supplier(notif), Predicates.equalTo(7));
-    }
-    
-    @Test
-    public void testPropagatesAllBut() {
-        app.enrichers().add(SensorPropagatingEnricher.newInstanceListeningToAllSensorsBut(entity, TestEntity.SEQUENCE)) ;
-
-        // name propagated
-        entity.sensors().set(TestEntity.NAME, "foo");
-        EntityAsserts.assertAttributeEqualsEventually(app, TestEntity.NAME, "foo");
-        
-        // sequence not propagated
-        entity.sensors().set(TestEntity.SEQUENCE, 2);
-        EntityAsserts.assertAttributeEqualsContinually(MutableMap.of("timeout", 100), app, TestEntity.SEQUENCE, null);
-    }
-    
-    @Test
-    public void testPropagatingAsDifferentSensor() {
-        final AttributeSensor<String> ANOTHER_ATTRIBUTE = Sensors.newStringSensor("another.attribute", "");
-        app.enrichers().add(SensorPropagatingEnricher.newInstanceRenaming(entity, ImmutableMap.of(TestEntity.NAME, ANOTHER_ATTRIBUTE)));
-
-        // name propagated as different attribute
-        entity.sensors().set(TestEntity.NAME, "foo");
-        EntityAsserts.assertAttributeEqualsEventually(app, ANOTHER_ATTRIBUTE, "foo");
-    }
-}


[4/7] brooklyn-server git commit: Delete AddingEnricher

Posted by dr...@apache.org.
Delete AddingEnricher

Was deprecated in 0.7.0; did not have a constructor usable when
deserialising from persisted state, so that backwards compatibility
is not a worry!


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

Branch: refs/heads/master
Commit: f3fe15f19cd4352a740acb8b49e75cab27858748
Parents: 26eeb7e
Author: Aled Sage <al...@gmail.com>
Authored: Sun Jun 11 13:56:11 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Sun Jun 11 14:57:39 2017 +0100

----------------------------------------------------------------------
 .../brooklyn/enricher/stock/AddingEnricher.java | 109 -------------------
 1 file changed, 109 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f3fe15f1/core/src/main/java/org/apache/brooklyn/enricher/stock/AddingEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/AddingEnricher.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/AddingEnricher.java
deleted file mode 100644
index 31195c0..0000000
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/AddingEnricher.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.enricher.stock;
-
-import org.apache.brooklyn.api.entity.EntityLocal;
-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.enricher.AbstractEnricher;
-import org.apache.brooklyn.core.sensor.BasicSensorEvent;
-
-/** 
- * enricher which adds multiple sensors on an entity to produce a new sensor
- * 
- * Instead, consider calling:
- * <pre>
- * {@code
- * addEnricher(Enrichers.builder()
- *         .combining(sources)
- *         .publishing(target)
- *         .computeSum()
- *         .build());
- * }
- * </pre>
- * <p>
- * 
- * @deprecated since 0.7.0; use {@link Enrichers.builder()}
- * @see Combiner if need to sub-class
- */
-@Deprecated
-public class AddingEnricher extends AbstractEnricher implements SensorEventListener {
-
-    private Sensor[] sources;
-    private Sensor<? extends Number> target;
-
-    public AddingEnricher(Sensor sources[], Sensor<? extends Number> target) {
-        this.sources = sources;
-        this.target = target;
-    }
-
-    @Override
-    public void setEntity(EntityLocal entity) {
-        super.setEntity(entity);
-        
-        for (Sensor source: sources) {
-            subscriptions().subscribe(entity, source, this);
-            if (source instanceof AttributeSensor) {
-                Object value = entity.getAttribute((AttributeSensor)source);
-                if (value!=null)
-                    onEvent(new BasicSensorEvent(source, entity, value, -1));
-            }
-        }
-    }
-
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    @Override
-    public void onEvent(SensorEvent event) {
-        Number value = recompute();
-        Number typedValue = cast(value, (Class<? extends Number>)target.getType());
-        if (target instanceof AttributeSensor) {
-            entity.sensors().set((AttributeSensor)target, typedValue);
-        } else if (typedValue!=null)
-            entity.sensors().emit((Sensor)target, typedValue);
-    }
-
-    @SuppressWarnings("unchecked")
-    public static <V> V cast(Number value, Class<V> type) {
-        if (value==null) return null;
-        if (type.isInstance(value)) return (V)value;
-        
-        if (type==Integer.class) return (V) (Integer) (int)Math.round(value.doubleValue());
-        if (type==Long.class) return (V) (Long) Math.round(value.doubleValue());
-        if (type==Double.class) return (V) (Double) value.doubleValue();
-        if (type==Float.class) return (V) (Float) value.floatValue();
-        if (type==Byte.class) return (V) (Byte) (byte)Math.round(value.doubleValue());
-        if (type==Short.class) return (V) (Short) (short)Math.round(value.doubleValue());
-        
-        throw new UnsupportedOperationException("conversion of mathematical operation to "+type+" not supported");
-    }
-
-    protected Number recompute() {
-        if (sources.length==0) return null;
-        Double result = 0d;
-        for (Sensor source: sources) {
-            Object value = entity.getAttribute((AttributeSensor) source);
-            if (value==null) return null;
-            result += ((Number)value).doubleValue();
-        }
-        return result;
-    }
-
-}


[7/7] brooklyn-server git commit: This closes #730

Posted by dr...@apache.org.
This closes #730


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

Branch: refs/heads/master
Commit: a98357415cf3d13abc779bd2df4ed116c8414435
Parents: ed25e5e a49ebc5
Author: Duncan Godwin <dr...@googlemail.com>
Authored: Mon Jun 12 15:47:06 2017 +0100
Committer: Duncan Godwin <dr...@googlemail.com>
Committed: Mon Jun 12 15:47:06 2017 +0100

----------------------------------------------------------------------
 .../entity/lifecycle/ServiceStateLogic.java     |   1 -
 .../stock/AbstractAggregatingEnricher.java      | 175 --------
 .../stock/AbstractTransformingEnricher.java     |   4 +-
 .../stock/AbstractTypeTransformingEnricher.java |   6 +-
 .../brooklyn/enricher/stock/AddingEnricher.java | 109 -----
 .../stock/CustomAggregatingEnricher.java        | 352 ----------------
 .../stock/SensorPropagatingEnricher.java        | 186 ---------
 .../stock/SensorTransformingEnricher.java       | 115 ------
 .../brooklyn/enricher/stock/UpdatingMap.java    |   6 -
 .../core/enricher/BasicEnricherTest.java        |  16 +-
 .../core/enricher/EnricherConfigTest.java       |  28 +-
 .../core/policy/basic/EnricherTypeTest.java     |   8 +-
 ...CustomAggregatingEnricherDeprecatedTest.java | 405 -------------------
 ...SensorPropagatingEnricherDeprecatedTest.java | 107 -----
 .../TransformingEnricherDeprecatedTest.java     |  92 -----
 .../brooklyn/policy/enricher/DeltaEnricher.java |   7 +-
 .../policy/enricher/HttpLatencyDetector.java    |  34 +-
 .../policy/enricher/RollingMeanEnricher.java    |  15 +-
 .../enricher/RollingTimeWindowMeanEnricher.java |  22 +-
 .../enricher/TimeFractionDeltaEnricher.java     |  56 ++-
 .../enricher/TimeWeightedDeltaEnricher.java     |  36 +-
 .../policy/ha/ServiceFailureDetector.java       |  15 +-
 .../policy/enricher/DeltaEnrichersTests.java    |  38 +-
 .../enricher/HttpLatencyDetectorTest.java       |   8 +-
 .../policy/enricher/RebindEnricherTest.java     |  32 +-
 .../enricher/RollingMeanEnricherTest.java       |  22 +-
 .../RollingTimeWindowMeanEnricherTest.java      |  15 +-
 .../enricher/TimeFractionDeltaEnricherTest.java |  52 +--
 .../brooklyn/entity/java/JavaAppUtils.java      |  16 +-
 .../entity/java/VanillaJavaAppRebindTest.java   |  16 +-
 .../org/apache/brooklyn/util/time/Duration.java |   5 +
 31 files changed, 324 insertions(+), 1675 deletions(-)
----------------------------------------------------------------------