You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/01 18:49:58 UTC

[01/50] [abbrv] brooklyn-server git commit: fix formatting from #709

Repository: brooklyn-server
Updated Branches:
  refs/heads/0.7.0-incubating [created] 40c93eeb1


fix formatting from #709


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

Branch: refs/heads/0.7.0-incubating
Commit: b7a290c5e4661302d3dc371d52ed85a533c04ac6
Parents: 8321bb0
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Jun 24 00:31:03 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:31:03 2015 -0700

----------------------------------------------------------------------
 usage/camp/pom.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b7a290c5/usage/camp/pom.xml
----------------------------------------------------------------------
diff --git a/usage/camp/pom.xml b/usage/camp/pom.xml
index 7df716e..00a46b7 100644
--- a/usage/camp/pom.xml
+++ b/usage/camp/pom.xml
@@ -65,7 +65,8 @@
                     <groupId>commons-logging</groupId>
                     <artifactId>commons-logging</artifactId>
                 </exclusion>
-            </exclusions>        </dependency>
+            </exclusions>
+        </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>


[40/50] [abbrv] brooklyn-server git commit: Disable intermittently-failing tests

Posted by he...@apache.org.
Disable intermittently-failing tests


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

Branch: refs/heads/0.7.0-incubating
Commit: 40c93eeb14eac281609323ffda8ae609e5bd0395
Parents: fcec988
Author: Richard Downer <ri...@apache.org>
Authored: Tue Jul 14 15:07:10 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jul 15 08:22:09 2015 +0000

----------------------------------------------------------------------
 core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java   | 2 +-
 .../DynamicClusterWithAvailabilityZonesMultiLocationTest.java      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40c93eeb/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java b/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java
index 947068d..5b02d27 100644
--- a/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java
+++ b/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.java
@@ -746,7 +746,7 @@ public class DynamicClusterTest extends BrooklynAppUnitTestSupport {
         }
     }
 
-    @Test
+    @Test(groups="WIP") // disabled for release due to spurious intermittent failures
     public void testReplacesMember() throws Exception {
         DynamicCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class)
                 .configure("initialSize", 1)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40c93eeb/software/base/src/test/java/brooklyn/entity/group/DynamicClusterWithAvailabilityZonesMultiLocationTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/group/DynamicClusterWithAvailabilityZonesMultiLocationTest.java b/software/base/src/test/java/brooklyn/entity/group/DynamicClusterWithAvailabilityZonesMultiLocationTest.java
index a8bff64..700097b 100644
--- a/software/base/src/test/java/brooklyn/entity/group/DynamicClusterWithAvailabilityZonesMultiLocationTest.java
+++ b/software/base/src/test/java/brooklyn/entity/group/DynamicClusterWithAvailabilityZonesMultiLocationTest.java
@@ -79,7 +79,7 @@ public class DynamicClusterWithAvailabilityZonesMultiLocationTest extends Brookl
                 .configure(MultiLocation.SUB_LOCATIONS, ImmutableList.<MachineProvisioningLocation<?>>of(subLoc1, subLoc2)));
     }
 
-    @Test
+    @Test(groups="WIP") // disabled for release due to spurious intermittent failures
     public void testReplacesEntityInSameZone() throws Exception {
         ((EntityLocal)cluster).config().set(DynamicCluster.ENABLE_AVAILABILITY_ZONES, true);
         cluster.start(ImmutableList.of(multiLoc));


[46/50] [abbrv] brooklyn-server git commit: Introduce a parent/pom and prepare for release

Posted by he...@apache.org.
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
new file mode 100644
index 0000000..11d08af
--- /dev/null
+++ b/parent/pom.xml
@@ -0,0 +1,1921 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.brooklyn</groupId>
+        <artifactId>brooklyn</artifactId>
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
+    </parent>
+
+    <artifactId>brooklyn-parent</artifactId>
+    <packaging>pom</packaging>
+    <name>Brooklyn Parent Project</name>
+    <description>
+        Brooklyn parent project, serving as the ancestor POM for all Apache Brooklyn modules
+    </description>
+
+    <!-- useful custom properties/defines to specify to control the build:
+
+      brooklyn.explicitModules :: only builds explicit modules (instead of default modules)
+
+      brooklyn.deployTo={apache} ::
+            :: required when deploying; specify the deployment target
+
+      javadoc :: build javadoc (adds a minute or two; enabled automatically for target deploy)
+
+      skipSources :: don't make the -sources.jar (saves a second or two, not much)
+
+      skipTests :: does the usual thing (saves a lot of time, but at some cost of build quality!)
+
+      simply activate with -Dbrooklyn.theCustomProperty on the mvn build line
+      (some of these are used to trigger profile selection, since maven activeByDefault
+      only works if _no_ profiles are triggered, see suggestion/background at:
+      http://stackoverflow.com/questions/5309379/how-to-keep-maven-profiles-which-are-activebydefault-active-even-if-another-prof )
+    -->
+
+    <properties>
+        <!-- Compilation -->
+        <java.version>1.7</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+        <!-- Testing -->
+        <cobertura.plugin.version>2.7</cobertura.plugin.version>
+        <surefire.version>2.18.1</surefire.version>
+        <plantuml.version>6121</plantuml.version>
+        <ant.version>1.8.4</ant.version>
+        <includedTestGroups />
+        <excludedTestGroups>Integration,Acceptance,Live,WIP</excludedTestGroups>
+
+        <!-- Dependencies -->
+        <brooklyn.version>0.7.0-incubating</brooklyn.version>  <!-- BROOKLYN_VERSION -->
+        <jclouds.groupId>org.apache.jclouds</jclouds.groupId>
+
+        <!-- These dependencies also appear in usage/downstream-parent/pom.xml -
+           - please synchronise versions between these two pom files -->
+        <jclouds.version>1.9.0</jclouds.version>
+        <logback.version>1.0.7</logback.version>
+        <slf4j.version>1.6.6</slf4j.version>  <!-- used for java.util.logging jul-to-slf4j interception -->
+        <guava.version>17.0</guava.version>
+        <xstream.version>1.4.7</xstream.version>
+        <jackson.version>1.9.13</jackson.version>  <!-- codehaus jackson, used by brooklyn rest server -->
+        <fasterxml.jackson.version>2.4.2</fasterxml.jackson.version>  <!-- more recent jackson, but not compatible with old annotations! -->
+        <jersey.version>1.18.1</jersey.version>
+        <httpclient.version>4.4.1</httpclient.version>
+        <commons-lang3.version>3.1</commons-lang3.version>
+        <groovy.version>2.3.4</groovy.version> <!-- Version supported by https://github.com/groovy/groovy-eclipse/wiki/Groovy-Eclipse-2.9.0-Release-Notes -->
+        <jsr305.version>2.0.1</jsr305.version>
+        <snakeyaml.version>1.11</snakeyaml.version>
+
+        <!-- Ordinary dependencies -->
+        <testng.version>6.8.8</testng.version>
+        <mockito.version>1.10.8</mockito.version>
+        <swagger.version>1.0.1</swagger.version>
+        <jansi.version>1.2.1</jansi.version>
+        <gson.version>2.3</gson.version>
+        <ivy.version>2.2.0</ivy.version>
+        <mx4j.version>3.0.1</mx4j.version>
+        <bouncycastle.version>1.49</bouncycastle.version>
+        <sshj.version>0.8.1</sshj.version>
+        <felix.framework.version>4.4.0</felix.framework.version>
+        <reflections.version>0.9.9-RC1</reflections.version>
+        <jetty.version>8.1.17.v20150415</jetty.version>
+        <airline.version>0.6</airline.version>
+        <mockwebserver.version>20121111</mockwebserver.version>
+        <freemarker.version>2.3.22</freemarker.version>
+        <commons-io.version>2.4</commons-io.version>
+        <hazelcast.version>3.0</hazelcast.version>
+        <jsonPath.version>2.0.0</jsonPath.version>
+        <commons-compress.version>1.4</commons-compress.version>
+        <qpid.version>0.20</qpid.version>
+        <mongodb.version>2.11.4</mongodb.version>
+        <riak.version>1.4.0</riak.version>
+        <maven-war-plugin.version>2.4</maven-war-plugin.version>
+        <validation-api.version>1.0.0.GA</validation-api.version>
+        <geronimo-jms_1.1_spec.version>1.1.1</geronimo-jms_1.1_spec.version>
+        <sleepycat-je.version>5.0.34</sleepycat-je.version>
+        <org.marre.smsj.version>1.0.0-20051126</org.marre.smsj.version>
+        <mysql-connector-java.version>5.1.18</mysql-connector-java.version>
+        <hadoop.version>1.0.2</hadoop.version>
+        <commons-cli.version>1.2</commons-cli.version>
+        <postgresql.version>9.1-901.jdbc4</postgresql.version>
+        <activemq.version>5.10.0</activemq.version>
+        <rabbitmq-version>2.8.7</rabbitmq-version>
+        <kafka.version>0.7.0-incubating</kafka.version>
+        <storm.version>0.8.2</storm.version>
+        <redis.version>1.5.2</redis.version>
+        <astyanax.version>1.56.24</astyanax.version>
+        <jcouchdb.version>0.11.0-1</jcouchdb.version>
+        <solr.version>4.7.0</solr.version>
+        <jtidy.version>r8-20060801</jtidy.version>
+        <opendmk_jmxremote_optional_jar.version>1.0-b01-ea</opendmk_jmxremote_optional_jar.version>
+        <resteasy.version>3.0.8.Final</resteasy.version>
+        <maven-dependency-plugin.version>2.8</maven-dependency-plugin.version>
+        <jopt.version>4.3</jopt.version>
+        <concurrentlinkedhashmap.version>1.0_jdk5</concurrentlinkedhashmap.version>
+        <maven-replacer-plugin.version>1.5.2</maven-replacer-plugin.version>
+        <nodejs-maven-plugin.version>1.0.3</nodejs-maven-plugin.version>
+        <nodejs-maven-binaries.version>0.10.25</nodejs-maven-binaries.version>
+        <jasmine-maven-plugin.version>1.3.1.5</jasmine-maven-plugin.version>
+        <requirejs-maven-plugin.version>2.0.0</requirejs-maven-plugin.version>
+        <maven-antrun-plugin.version>1.7</maven-antrun-plugin.version>
+        <jetty-orbit-javax-servlet.version>3.0.0.v201112011016</jetty-orbit-javax-servlet.version>
+        <jcommander.version>1.27</jcommander.version>
+        <xml-apis.version>1.0.b2</xml-apis.version>
+        <jsr250-api.version>1.0</jsr250-api.version>
+        <guice.version>3.0</guice.version>
+        <javax-inject.version>1</javax-inject.version>
+        <aopalliance.version>1.0</aopalliance.version>
+        <commons-configuration.version>1.7</commons-configuration.version>
+        <commons-lang.version>2.4</commons-lang.version>
+        <hamcrest.version>1.1</hamcrest.version>
+        <jsr311-api.version>1.1.1</jsr311-api.version>
+        <maxmind.version>0.8.1</maxmind.version>
+        <jna.version>4.0.0</jna.version>
+        <winrm4j.version>0.1.0</winrm4j.version>
+        <coverage.target>${working.dir}</coverage.target>
+
+        <!-- Transitive dependencies, declared explicitly to avoid version mismatch -->
+        <clojure.version>1.4.0</clojure.version>
+        <zookeeper.version>3.3.4</zookeeper.version>
+        <ring-core.version>1.1.5</ring-core.version>
+        <clj-time.version>0.4.1</clj-time.version>
+        <commons-codec.version>1.9</commons-codec.version>
+        <log4j.version>1.2.17</log4j.version>
+        <commons-logging.version>1.2</commons-logging.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-classic</artifactId>
+                <version>${logback.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.ivy</groupId>
+                <artifactId>ivy</artifactId>
+                <version>${ivy.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.thoughtworks.xstream</groupId>
+                <artifactId>xstream</artifactId>
+                <version>${xstream.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.fusesource.jansi</groupId>
+                <artifactId>jansi</artifactId>
+                <version>${jansi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.code.findbugs</groupId>
+                <artifactId>jsr305</artifactId>
+                <version>${jsr305.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.codehaus.groovy</groupId>
+                <artifactId>groovy-all</artifactId>
+                <version>${groovy.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.testng</groupId>
+                <artifactId>testng</artifactId>
+                <version>${testng.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>${jclouds.groupId}</groupId>
+                <artifactId>jclouds-allcompute</artifactId>
+                <version>${jclouds.version}</version>
+                <type>jar</type>
+            </dependency>
+            <dependency>
+                <groupId>${jclouds.groupId}.driver</groupId>
+                <artifactId>jclouds-sshj</artifactId>
+                <version>${jclouds.version}</version>
+                <type>jar</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.ant</groupId>
+                <artifactId>ant</artifactId>
+                <version>${ant.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.ant</groupId>
+                <artifactId>ant-launcher</artifactId>
+                <version>${ant.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>net.sourceforge.plantuml</groupId>
+                <artifactId>plantuml</artifactId>
+                <version>${plantuml.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>${slf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-server</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey.contribs</groupId>
+                <artifactId>jersey-multipart</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey.jersey-test-framework</groupId>
+                <artifactId>jersey-test-framework-inmemory</artifactId>
+                <version>${jersey.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons-lang3.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-server</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-servlet</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-util</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.codehaus.jackson</groupId>
+                <artifactId>jackson-core-asl</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.codehaus.jackson</groupId>
+                <artifactId>jackson-mapper-asl</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.codehaus.jackson</groupId>
+                <artifactId>jackson-jaxrs</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.codehaus.jackson</groupId>
+                <artifactId>jackson-xc</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>${fasterxml.jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.jaxrs</groupId>
+                <artifactId>jackson-jaxrs-json-provider</artifactId>
+                <version>${fasterxml.jackson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.wordnik</groupId>
+                <artifactId>swagger-core_2.9.1</artifactId>
+                <version>${swagger.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.slf4j</groupId>
+                        <artifactId>slf4j-log4j12</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>com.wordnik</groupId>
+                <artifactId>swagger-jaxrs_2.9.1</artifactId>
+                <version>${swagger.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty.orbit</groupId>
+                <artifactId>javax.servlet</artifactId>
+                <version>${jetty-orbit-javax-servlet.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-security</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-core</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.beust</groupId>
+                <artifactId>jcommander</artifactId>
+                <version>${jcommander.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpcore</artifactId>
+                <version>${httpclient.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>xml-apis</groupId>
+                <artifactId>xml-apis</artifactId>
+                <version>${xml-apis.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.annotation</groupId>
+                <artifactId>jsr250-api</artifactId>
+                <version>${jsr250-api.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.inject</groupId>
+                <artifactId>guice</artifactId>
+                <version>${guice.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.inject</groupId>
+                <artifactId>javax.inject</artifactId>
+                <version>${javax-inject.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>${commons-io.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>${httpclient.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <classifier>tests</classifier>
+                <version>${httpclient.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>aopalliance</groupId>
+                <artifactId>aopalliance</artifactId>
+                <version>${aopalliance.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcprov-ext-jdk15on</artifactId>
+                <version>${bouncycastle.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcpkix-jdk15on</artifactId>
+                <version>${bouncycastle.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.code.gson</groupId>
+                <artifactId>gson</artifactId>
+                <version>${gson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-configuration</groupId>
+                <artifactId>commons-configuration</artifactId>
+                <version>${commons-configuration.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-lang</groupId>
+                <artifactId>commons-lang</artifactId>
+                <version>${commons-lang.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.hamcrest</groupId>
+                <artifactId>hamcrest-all</artifactId>
+                <version>${hamcrest.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.yaml</groupId>
+                <artifactId>snakeyaml</artifactId>
+                <version>${snakeyaml.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.reflections</groupId>
+                <artifactId>reflections</artifactId>
+                <version>${reflections.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-client</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-webapp</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.framework</artifactId>
+                <version>${felix.framework.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-servlet</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.ws.rs</groupId>
+                <artifactId>jsr311-api</artifactId>
+                <version>${jsr311-api.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.glassfish.external</groupId>
+                <artifactId>opendmk_jmxremote_optional_jar</artifactId>
+                <version>${opendmk_jmxremote_optional_jar.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>jul-to-slf4j</artifactId>
+                <version>${slf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.jersey</groupId>
+                <artifactId>jersey-json</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jboss.resteasy</groupId>
+                <artifactId>resteasy-jaxrs</artifactId>
+                <version>${resteasy.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jboss.resteasy</groupId>
+                <artifactId>resteasy-jackson-provider</artifactId>
+                <version>${resteasy.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jboss.resteasy</groupId>
+                <artifactId>jaxrs-api</artifactId>
+                <version>${resteasy.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.validation</groupId>
+                <artifactId>validation-api</artifactId>
+                <version>${validation-api.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>net.sf.jopt-simple</groupId>
+                <artifactId>jopt-simple</artifactId>
+                <version>${jopt.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.googlecode.concurrentlinkedhashmap</groupId>
+                <artifactId>concurrentlinkedhashmap-lru</artifactId>
+                <version>${concurrentlinkedhashmap.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.airlift</groupId>
+                <artifactId>airline</artifactId>
+                <version>${airline.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.whirr</groupId>
+                <artifactId>whirr-hadoop</artifactId>
+                <version>${whirr.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.whirr</groupId>
+                <artifactId>whirr-core</artifactId>
+                <version>${whirr.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.whirr</groupId>
+                <artifactId>whirr-cli</artifactId>
+                <version>${whirr.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.whirr</groupId>
+                <artifactId>whirr-elasticsearch</artifactId>
+                <version>${whirr.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-compress</artifactId>
+                <version>${commons-compress.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>net.schmizz</groupId>
+                <artifactId>sshj</artifactId>
+                <version>${sshj.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.freemarker</groupId>
+                <artifactId>freemarker</artifactId>
+                <version>${freemarker.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>mx4j</groupId>
+                <artifactId>mx4j-tools</artifactId>
+                <version>${mx4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.mockwebserver</groupId>
+                <artifactId>mockwebserver</artifactId>
+                <version>${mockwebserver.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-core</artifactId>
+                <version>${logback.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.mockito</groupId>
+                <artifactId>mockito-all</artifactId>
+                <version>${mockito.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.mockito</groupId>
+                <artifactId>mockito-core</artifactId>
+                <version>${mockito.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.jayway.jsonpath</groupId>
+                <artifactId>json-path</artifactId>
+                <version>${jsonPath.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.maxmind.geoip2</groupId>
+                <artifactId>geoip2</artifactId>
+                <version>${maxmind.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>net.java.dev.jna</groupId>
+                <artifactId>jna</artifactId>
+                <version>${jna.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>net.java.dev.jna</groupId>
+                <artifactId>jna-platform</artifactId>
+                <version>${jna.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <testSourceDirectory>src/test/java</testSourceDirectory>
+        <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+            </testResource>
+        </testResources>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <artifactId>maven-antrun-plugin</artifactId>
+                    <version>1.8</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-archetype-plugin</artifactId>
+                    <version>2.3</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-assembly-plugin</artifactId>
+                    <version>2.5.4</version>
+                    <configuration>
+                        <tarLongFileMode>gnu</tarLongFileMode>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-clean-plugin</artifactId>
+                    <version>2.6.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>3.3</version>
+                    <configuration>
+                        <source>${java.version}</source>
+                        <target>${java.version}</target>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <version>2.8.2</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-eclipse-plugin</artifactId>
+                    <version>2.10</version>
+                    <configuration>
+                        <additionalProjectnatures>
+                            <projectnature>org.eclipse.jdt.groovy.core.groovyNature</projectnature>
+                        </additionalProjectnatures>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-enforcer-plugin</artifactId>
+                    <version>1.4</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-failsafe-plugin</artifactId>
+                    <version>2.18.1</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-gpg-plugin</artifactId>
+                    <version>1.6</version>
+                    <executions>
+                        <execution>
+                            <id>sign-artifacts</id>
+                            <phase>verify</phase>
+                            <goals>
+                                <goal>sign</goal>
+                            </goals>
+                            <configuration>
+                                <executable>gpg2</executable>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <!-- version 2.4+ seems to break eclipse integration as per https://github.com/tesla/m2eclipse-extras/issues/10
+                         but cannot find issue on GitHub any more - 404 error -->
+                    <!-- XXX if this version is changed, update the MavenArtifactTest -->
+                    <version>2.6</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>2.10.3</version>
+                    <configuration>
+                        <!-- disabling use because of NPE deploying to sonatype:
+                             http://stackoverflow.com/questions/888199/why-does-maven-install-fail-during-javadoc-generation
+                             http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=ac084ab7f47c4e7f1df2117cecd?bug_id=5101868
+                        -->
+                        <use>false</use>
+                        <links>
+                            <link>http://download.oracle.com/javaee/6/api</link>
+                        </links>
+                        <keywords>true</keywords>
+                        <author>false</author>
+                        <quiet>true</quiet>
+                        <aggregate>false</aggregate>
+                        <detectLinks />
+                        <tags>
+                            <tag>
+                                <name>todo</name>
+                                <placement>a</placement>
+                                <head>To-do:</head>
+                            </tag>
+                        </tags>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <id>attach-javadocs</id>
+                            <goals>
+                                <goal>jar</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-release-plugin</artifactId>
+                    <version>2.5.2</version>
+                    <!-- 'release' is not used; easier just to checkout, tag, `mvn deploy` manually
+                         with -Dbrooklyn.deployTo=TARGET ... and note we need to update docs and examples,
+                         which is a non-maven task!) -->
+                    <configuration>
+                        <mavenExecutorId>forked-path</mavenExecutorId>
+                        <useReleaseProfile>false</useReleaseProfile>
+                        <arguments>-Dbrooklyn.deployTo=apache</arguments>
+                        <goals>deploy</goals>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>2.7</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-shade-plugin</artifactId>
+                    <version>2.3</version>
+                    <executions>
+                        <execution>
+                            <phase>package</phase>
+                            <goals>
+                                <goal>shade</goal>
+                            </goals>
+                            <configuration>
+                                <shadedArtifactAttached>true</shadedArtifactAttached>
+                                <shadedClassifierName>with-dependencies</shadedClassifierName>
+                                <filters>
+                                    <filter>
+                                        <artifact>*:*</artifact>
+                                        <excludes>
+                                            <exclude>META-INF/*.SF</exclude>
+                                            <exclude>META-INF/*.DSA</exclude>
+                                            <exclude>META-INF/*.RSA</exclude>
+                                        </excludes>
+                                    </filter>
+                                </filters>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-site-plugin</artifactId>
+                    <version>3.4</version>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-source-plugin</artifactId>
+                    <version>2.4</version>
+                    <executions>
+                        <execution>
+                            <id>attach-sources</id>
+                            <phase>verify</phase>
+                            <goals>
+                                <goal>jar-no-fork</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>${surefire.version}</version>
+                    <configuration>
+                         <argLine>-Xms768m -Xmx768m -XX:MaxPermSize=256m -verbose:gc</argLine>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.felix</groupId>
+                    <artifactId>maven-bundle-plugin</artifactId>
+                    <version>2.5.4</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>findbugs-maven-plugin</artifactId>
+                    <version>3.0.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>build-helper-maven-plugin</artifactId>
+                    <version>1.9.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>cobertura-maven-plugin</artifactId>
+                    <version>${cobertura.plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>com.google.code.maven-replacer-plugin</groupId>
+                    <artifactId>maven-replacer-plugin</artifactId>
+                    <version>1.4.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>buildnumber-maven-plugin</artifactId>
+                    <version>1.3</version>
+                    <configuration>
+                        <getRevisionOnlyOnce>true</getRevisionOnlyOnce>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.rat</groupId>
+                    <artifactId>apache-rat-plugin</artifactId>
+                    <configuration>
+                        <excludes combine.children="append">
+                            <!-- Exclude sandbox because not part of distribution: not in tgz, and not uploaded to maven-central -->
+                            <exclude>sandbox/**</exclude>
+                            <!-- Exclude netbeans config files (not part of the project, but often on users' drives -->
+                            <exclude>**/nbactions.xml</exclude>
+                            <exclude>**/nb-configuration.xml</exclude>
+                        </excludes>
+                    </configuration>
+                </plugin>
+
+                <!-- This is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-dependency-plugin</artifactId>
+                                        <versionRange>[2.8,)</versionRange>
+                                        <goals>
+                                            <goal>copy-dependencies</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-assembly-plugin</artifactId>
+                                        <versionRange>[2.4.1,)</versionRange>
+                                        <goals>
+                                            <goal>single</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.codehaus.mojo</groupId>
+                                        <artifactId>build-helper-maven-plugin</artifactId>
+                                        <versionRange>[1.7,)</versionRange>
+                                        <goals>
+                                            <goal>attach-artifact</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-enforcer-plugin</artifactId>
+                                        <versionRange>[1.3.1,)</versionRange>
+                                        <goals>
+                                            <goal>enforce</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-remote-resources-plugin</artifactId>
+                                        <versionRange>[1.5,)</versionRange>
+                                        <goals>
+                                            <goal>process</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-dependency-plugin</artifactId>
+                                        <versionRange>[2.8,)</versionRange>
+                                        <goals>
+                                            <goal>unpack</goal>
+                                            <goal>copy</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>com.github.skwakman.nodejs-maven-plugin</groupId>
+                                        <artifactId>nodejs-maven-plugin</artifactId>
+                                        <versionRange>[1.0.3,)</versionRange>
+                                        <goals>
+                                            <goal>extract</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-war-plugin</artifactId>
+                                        <versionRange>[2.4,)</versionRange>
+                                        <goals>
+                                            <goal>exploded</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                                <pluginExecution>
+                                  <pluginExecutionFilter>
+                                    <groupId>
+                                      org.apache.maven.plugins
+                                    </groupId>
+                                    <artifactId>
+                                      maven-checkstyle-plugin
+                                    </artifactId>
+                                    <versionRange>[2.13,)</versionRange>
+                                    <goals>
+                                      <goal>check</goal>
+                                    </goals>
+                                  </pluginExecutionFilter>
+                                  <action>
+                                    <ignore />
+                                  </action>
+                                </pluginExecution>
+<!-- This is suggested if Eclipse runs too many incremental maven plugins, but it also seems to cause NPE's in maven build.
+                                <pluginExecution>
+                                  <action>
+                                    <execute>
+                                      <runOnIncremental>false</runOnIncremental>
+                                    </execute>
+                                  </action>
+                                </pluginExecution>
+-->
+                                <pluginExecution>
+                                  <pluginExecutionFilter>
+                                    <groupId>
+                                      org.apache.felix
+                                    </groupId>
+                                    <artifactId>
+                                      maven-bundle-plugin
+                                    </artifactId>
+                                    <versionRange>
+                                      [2.3.4,)
+                                    </versionRange>
+                                    <goals>
+                                      <goal>manifest</goal>
+                                    </goals>
+                                  </pluginExecutionFilter>
+                                  <action>
+                                    <ignore></ignore>
+                                  </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>.</directory>
+                            <includes>
+                                <include>brooklyn*.log</include>
+                                <include>brooklyn*.log.*</include>
+                                <include>stacktrace.log</include>
+                                <include>test-output</include>
+                                <include>prodDb.*</include>
+                            </includes>
+                        </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <version>2.13</version>
+                <executions>
+                    <execution>
+                        <id>verify-style</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>check</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <logViolationsToConsole>true</logViolationsToConsole>
+                    <checkstyleRules>
+                        <module name="Checker">
+                            <!-- Checks for whitespace                               -->
+                            <!-- See http://checkstyle.sf.net/config_whitespace.html -->
+                            <module name="FileTabCharacter">
+                                <property name="eachLine" value="true" />
+                            </module>
+                            <module name="TreeWalker">
+                                <module name="IllegalImport">
+                                    <property name="illegalPkgs" value="com.google.api.client.repackaged"/>
+                                </module>
+                            </module>
+                        </module>
+                    </checkstyleRules>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>buildnumber-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>create</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-enforcer-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>enforce</id>
+                        <phase>none</phase>
+                    </execution>
+                    <execution>
+                        <id>brooklyn-build-req</id>
+                        <goals>
+                            <goal>enforce</goal>
+                        </goals>
+                        <inherited>true</inherited>
+                        <configuration>
+                            <rules>
+                                <requireJavaVersion>
+                                    <version>${java.version}.0</version>
+                                </requireJavaVersion>
+                                <requireMavenVersion>
+                                    <version>[3.0.0,)</version>
+                                </requireMavenVersion>
+                                <dependencyConvergence/>
+                            </rules>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <inherited>true</inherited>
+                <configuration>
+                    <fork>true</fork>
+                    <verbose>false</verbose>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.codehaus.groovy</groupId>
+                        <artifactId>groovy-eclipse-compiler</artifactId>
+                        <version>2.9.0-01</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.codehaus.groovy</groupId>
+                        <artifactId>groovy-eclipse-batch</artifactId>
+                        <version>2.3.4-01</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+            <!--  workaround for src/main/resources excluding all in eclipse, as per
+                  https://issues.sonatype.org/browse/MNGECLIPSE-864
+            -->
+            <plugin>
+                <groupId>com.google.code.maven-replacer-plugin</groupId>
+                <artifactId>maven-replacer-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>fix-eclipse-dot-classpath-mangling</id>
+                        <phase>clean</phase>
+                        <goals>
+                            <goal>replace</goal>
+                        </goals>
+                        <configuration>
+                            <ignoreMissingFile>true</ignoreMissingFile>
+                            <file>.classpath</file>
+                            <regex>false</regex>
+                            <replacements>
+                                <replacement>
+                                    <xpath>/classpath/classpathentry[@path='src/main/resources' and @kind='src' and @excluding='**']/@excluding</xpath>
+                                    <token>**</token>
+                                    <value />
+                                </replacement>
+                                <replacement>
+                                    <xpath>/classpath/classpathentry[@path='src/test/resources' and @kind='src' and @excluding='**']/@excluding</xpath>
+                                    <token>**</token>
+                                    <value />
+                                </replacement>
+                            </replacements>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <!-- Needed for command-line access, e.g mvn apache-rat:rat and mvn apache-rat:check -->
+            <plugin>
+              <groupId>org.apache.rat</groupId>
+              <artifactId>apache-rat-plugin</artifactId>
+              <version>0.10</version>
+              <executions>
+                <execution>
+                  <phase>verify</phase>
+                  <goals>
+                    <goal>check</goal>
+                  </goals>
+                </execution>
+              </executions>
+              <configuration>
+                <!--
+                     If you wish to override this list in the component (child) pom, ensure you use
+                         <excludes combine.children="merge">
+                     so that the child pom entries replace the parent entries
+                 -->
+                <excludes combine.children="append">
+                  <!-- git and IDE project files -->
+                  <!-- see https://issues.apache.org/jira/browse/RAT-107 -->
+                  <exclude>**/.git/**</exclude>
+                  <exclude>**/.gitignore</exclude>
+                  <exclude>**/.repository/**</exclude>
+                  <exclude>**/.idea/**</exclude>
+                  <exclude>**/*.iml</exclude>
+                  <exclude>**/.classpath/**</exclude>
+                  <exclude>**/.project</exclude>
+                  <exclude>**/.settings/**</exclude>
+                  <exclude>**/*.log</exclude>
+                  <exclude>**/brooklyn*.log.*</exclude>
+                  <exclude>**/target/**</exclude>
+                  <!-- files not requiring licence -->
+                  <exclude>ignored/**</exclude>
+                  <exclude>LICENSE.md</exclude>
+                  <exclude>**/src/main/license/**</exclude>
+                  <exclude>**/src/test/license/**</exclude>
+                  <exclude>**/MANIFEST.MF</exclude>
+                  <exclude>**/test-output/**</exclude>
+                  <exclude>**/*.pem.pub</exclude>
+                  <exclude>**/*.pem</exclude>
+                  <exclude>**/*_rsa.pub</exclude>
+                  <exclude>**/*_rsa</exclude>
+                  <exclude>**/*.svg</exclude>
+                  <exclude>**/*.crt</exclude>
+                  <exclude>**/*.csr</exclude>
+                  <exclude>**/*.key</exclude>
+                  <exclude>**/*.key.org</exclude>
+                  <exclude>**/*.psd</exclude>
+                  <exclude>**/*.json</exclude>
+                  <exclude>**/*.plxarc</exclude>
+                  <exclude>**/services/brooklyn.location.LocationResolver</exclude>
+                  <exclude>**/src/test/resources/brooklyn/entity/basic/template_with_extra_substitutions.txt</exclude>
+                  <exclude>**/src/main/resources/banner.txt</exclude>
+                  <exclude>**/src/test/resources/ssl/certs/localhost/info.txt</exclude>
+                  <exclude>**/sandbox/examples/src/main/scripts/amis.txt</exclude>
+                  <!-- see notes in https://issues.apache.org/jira/browse/BROOKLYN-18 -->
+
+                  <!--
+                      docs are not part of the distribution: they are just used to populate
+                      https://brooklyn.incubator.apache.org
+                  -->
+                  <exclude>docs/**</exclude>
+
+                </excludes>
+              </configuration>
+            </plugin>
+
+            <!-- Add off-the-schelf LICENSE, NOTICE and DISCLAIMER to each jar. Where off-the-shelf isn't suitable
+               - for submodules, they can disable this processing and intergrate their own files. -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-remote-resources-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <resourceBundles>
+                                <resourceBundle>org.apache:apache-jar-resource-bundle:1.4</resourceBundle>
+                                <resourceBundle>org.apache:apache-incubator-disclaimer-resource-bundle:1.1</resourceBundle>
+                            </resourceBundles>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <extensions>
+            <extension>
+                <groupId>org.apache.maven.wagon</groupId>
+                <artifactId>wagon-ssh-external</artifactId>
+                <version>1.0</version>
+            </extension>
+            <extension>
+                <groupId>org.apache.maven.archetype</groupId>
+                <artifactId>archetype-packaging</artifactId>
+                <version>2.2</version>
+            </extension>
+        </extensions>
+    </build>
+
+    <profiles>
+        <!-- profile>
+            <id>Essentials</id>
+            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
+            <modules>
+                <module>utils/test-support</module>
+                <module>utils/common</module>
+                <module>utils/groovy</module>
+                <module>api</module>
+                <module>usage/test-support</module>
+                <module>camp</module>
+                <module>core</module>
+                <module>policy</module>
+                <module>storage/hazelcast</module>
+            </modules>
+        </profile -->
+        <!-- profile>
+            <id>Locations</id>
+            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
+            <modules>
+                <module>locations/jclouds</module>
+            </modules>
+        </profile -->
+        <!-- profile>
+            <id>Entities</id>
+            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
+            <modules>
+                <module>utils/jmx/jmxmp-ssl-agent</module>
+                <module>utils/jmx/jmxrmi-agent</module>
+                <module>software/base</module>
+                <module>software/network</module>
+                <module>software/osgi</module>
+                <module>software/webapp</module>
+                <module>software/messaging</module>
+                <module>software/nosql</module>
+                <module>software/database</module>
+                <module>software/monitoring</module>
+            </modules>
+        </profile -->
+        <!-- profile>
+            <id>Usage</id>
+            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
+            <modules>
+                <module>usage/logback-includes</module>
+                <module>usage/logback-xml</module>
+                <module>utils/rest-swagger</module>
+                <module>usage/camp</module>
+                <module>usage/rest-api</module>
+                <module>usage/rest-server</module>
+                <module>usage/rest-client</module>
+                <module>usage/jsgui</module>
+                <module>usage/launcher</module>
+                <module>usage/cli</module>
+                <module>usage/all</module>
+                <module>usage/dist</module>
+                <module>usage/downstream-parent</module>
+                <module>usage/archetypes/quickstart</module>
+            </modules>
+        </profile -->
+        <!-- profile>
+            <id>Examples</id>
+            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
+            <modules>
+                <module>examples</module>
+            </modules>
+        </profile -->
+        <!-- profile>
+            <id>QA</id>
+            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
+            <modules>
+                <module>usage/qa</module>
+            </modules>
+        </profile -->
+        <!-- profile>
+            <id>Sandbox</id>
+            <modules>
+                <module>sandbox/extra</module>
+                <module>sandbox/database</module>
+                <module>sandbox/web-acceptance</module>
+                <module>sandbox/nosql</module>
+                <module>sandbox/monitoring</module>
+                <module>sandbox/examples/simple-open-loop-policy</module>
+                <module>sandbox/cassandra-multicloud-snitch</module>
+                <module>sandbox/mobile-app</module>
+            </modules>
+        </profile -->
+
+        <profile>
+            <id>Documentation</id>
+            <reporting>
+                <excludeDefaults>true</excludeDefaults>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-project-info-reports-plugin</artifactId>
+                        <version>2.4</version>
+                        <reportSets>
+                            <reportSet>
+                                <reports>
+                                    <report>index</report>
+                                    <report>modules</report>
+                                </reports>
+                            </reportSet>
+                        </reportSets>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <version>2.8</version>
+                        <configuration>
+                            <links>
+                                <link>http://download.oracle.com/javaee/6/api</link>
+                            </links>
+                            <keywords>true</keywords>
+                            <author>false</author>
+                            <quiet>true</quiet>
+                            <aggregate>false</aggregate>
+                            <detectLinks />
+                            <tags>
+                                <tag>
+                                    <name>todo</name>
+                                    <placement>a</placement>
+                                    <head>To-do:</head>
+                                </tag>
+                            </tags>
+                        </configuration>
+                        <reportSets>
+                            <reportSet>
+                                <id>javadoc</id>
+                                <reports>
+                                    <report>javadoc</report>
+                                </reports>
+                            </reportSet>
+                        </reportSets>
+                    </plugin>
+                </plugins>
+            </reporting>
+        </profile>
+        <profile>
+            <id>Bundle</id>
+            <activation>
+                <file>
+                    <!-- NB - this is all the leaf projects, including logback-* (with no src);
+                         the archetype project neatly ignores this however -->
+                    <exists>${basedir}/src</exists>
+                </file>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.felix</groupId>
+                        <artifactId>maven-bundle-plugin</artifactId>
+                        <extensions>true</extensions>
+                        <!-- configure plugin to generate MANIFEST.MF
+                             adapted from http://blog.knowhowlab.org/2010/06/osgi-tutorial-from-project-structure-to.html -->
+                        <executions>
+                            <execution>
+                                <id>bundle-manifest</id>
+                                <phase>process-classes</phase>
+                                <goals>
+                                    <goal>manifest</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                        <configuration>
+                            <supportedProjectTypes>
+                                <supportedProjectType>jar</supportedProjectType>
+                            </supportedProjectTypes>
+                            <instructions>
+                                <!-- OSGi specific instruction -->
+                                <!--
+                                    By default packages containing impl and internal
+                                    are not included in the export list. Setting an
+                                    explicit wildcard will include all packages
+                                    regardless of name.
+                                    In time we should minimize our export lists to
+                                    what is really needed.
+                                -->
+                                <Export-Package>brooklyn.*</Export-Package>
+                                <Implementation-SHA-1>${buildNumber}</Implementation-SHA-1>
+                                <Implementation-Branch>${scmBranch}</Implementation-Branch>
+                            </instructions>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-jar-plugin</artifactId>
+                        <configuration>
+                            <archive>
+                                <manifestFile> ${project.build.outputDirectory}/META-INF/MANIFEST.MF </manifestFile>
+                            </archive>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>Tests</id>
+            <activation>
+                <file> <exists>${basedir}/src/test</exists> </file>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <version>${surefire.version}</version>
+                        <configuration>
+                            <properties>
+                                <property>
+                                    <name>listener</name>
+                                    <value>brooklyn.test.LoggingVerboseReporter,brooklyn.test.BrooklynLeakListener,brooklyn.test.PlatformTestSelectorListener</value>
+                                </property>
+                            </properties>
+                            <enableAssertions>true</enableAssertions>
+                            <groups>${includedTestGroups}</groups>
+                            <excludedGroups>${excludedTestGroups}</excludedGroups>
+                            <testFailureIgnore>false</testFailureIgnore>
+                            <systemPropertyVariables>
+                                <verbose>-1</verbose>
+                                <net.sourceforge.cobertura.datafile>${project.build.directory}/cobertura/cobertura.ser</net.sourceforge.cobertura.datafile>
+                                <cobertura.user.java.nio>false</cobertura.user.java.nio>
+                            </systemPropertyVariables>
+                            <printSummary>true</printSummary>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-jar-plugin</artifactId>
+                        <inherited>true</inherited>
+                        <executions>
+                            <execution>
+                                <id>test-jar-creation</id>
+                                <goals>
+                                    <goal>test-jar</goal>
+                                </goals>
+                                <configuration>
+                                    <forceCreation>true</forceCreation>
+                                    <archive combine.self="override" />
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>Integration</id>
+            <properties>
+                <includedTestGroups>Integration</includedTestGroups>
+                <excludedTestGroups>Acceptance,Live,WIP</excludedTestGroups>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <inherited>true</inherited>
+                        <executions>
+                            <execution>
+                                <id>run-tests</id>
+                                <goals>
+                                    <goal>run</goal>
+                                </goals>
+                                <phase>integration-test</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-jar-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>test-jar-creation</id>
+                                <configuration>
+                                    <skip>true</skip>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>Acceptance</id>
+            <properties>
+                <includedTestGroups>Acceptance</includedTestGroups>
+                <excludedTestGroups>Integration,Live,WIP</excludedTestGroups>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <inherited>true</inherited>
+                        <executions>
+                            <execution>
+                                <id>run-tests</id>
+                                <goals>
+                                    <goal>run</goal>
+                                </goals>
+                                <phase>integration-test</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-jar-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>test-jar-creation</id>
+                                <configuration>
+                                    <skip>true</skip>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>Live</id>
+            <properties>
+                <includedTestGroups>Live</includedTestGroups>
+                <excludedTestGroups>Acceptance,WIP</excludedTestGroups>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-jar-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>test-jar-creation</id>
+                                <configuration>
+                                    <skip>true</skip>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>Live-sanity</id>
+            <properties>
+                <includedTestGroups>Live-sanity</includedTestGroups>
+                <excludedTestGroups>Acceptance,WIP</excludedTestGroups>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-jar-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>test-jar-creation</id>
+                                <configuration>
+                                    <skip>true</skip>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>CI</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>findbugs-maven-plugin</artifactId>
+                        <configuration>
+                            <xmlOutput>true</xmlOutput>
+                            <xmlOutputDirectory>target/site</xmlOutputDirectory>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <phase>process-classes</phase>
+                                <goals>
+                                    <goal>findbugs</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-source-plugin</artifactId>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-pmd-plugin</artifactId>
+                        <version>2.5</version>
+                        <inherited>true</inherited>
+                        <configuration>
+                            <failOnViolation>false</failOnViolation>
+                            <linkXref>true</linkXref>
+                            <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
+                            <minimumTokens>100</minimumTokens>
+                            <targetJdk>${java.version}</targetJdk>
+                            <excludes>
+                                <exclude>**/*Test.java</exclude>
+                                <exclude>**/tests/**/*.java</exclude>
+                                <!-- add any more generated source code directories here -->
+                            </excludes>
+                            <excludeRoots>
+                                <excludeRoot>
+                                    ${pom.basedir}/target/generated-sources/groovy-stubs/main
+                                </excludeRoot>
+                            </excludeRoots>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <phase>process-classes</phase>
+                                <goals>
+                                    <goal>check</goal>
+                                    <goal>cpd-check</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>Coverage</id>
+            <dependencies>
+                <dependency>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>cobertura-maven-plugin</artifactId>
+                    <version>${cobertura.plugin.version}</version>
+                    <scope>test</scope>
+                </dependency>
+            </dependencies>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-source-plugin</artifactId>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <inherited>true</inherited>
+                        <executions>
+                            <execution>
+                                <id>run-tests</id>
+                            </execution>
+                            <execution>
+                                <id>instrument classes</id>
+                                <goals>
+                                    <goal>run</goal>
+                                </goals>
+                                <phase>process-test-classes</phase>
+                                <configuration>
+                                    <target>
+                                        <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
+                                        <taskdef resource="tasks.properties" classpathref="maven.plugin.classpath" />
+                                        <if>
+                                            <available property="gogocobertura" file="target/test-classes" />
+                                            <then>
+                                                <echo message="INSTRUMENTING CLASSES FOR COBERTURA" />
+                                                <!-- Ensure any and all bits of our project are copied in first -->
+                                                <copy todir="target/cobertura/coverage-classes">
+                                                    <fileset erroronmissingdir="false" dir="target/classes" />
+                                                </copy>
+                                                <cobertura-instrument datafile="target/cobertura/cobertura.ser" todir="target/test-classes">
+                                                    <fileset erroronmissingdir="false" dir="target/classes">
+                                                        <include name="brooklyn/**/*.class" />
+                                                        <exclude name="brooklyn/**/*Test.class" />
+                                                    </fileset>
+                                                    <fileset erroronmissingdir="false" dir="target/cobertura/dependency-classes">
+                                                        <include name="brooklyn/**/*.class" />
+                                                        <exclude name="brooklyn/**/*Test.class" />
+                                                    </fileset>
+                                                </cobertura-instrument>
+                                            </then>
+                                        </if>
+                                    </target>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>coverage report</id>
+                                <goals>
+                                    <goal>run</goal>
+                                </goals>
+                                <phase>post-integration-test</phase>
+                                <configuration>
+                                    <target>
+                                        <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
+                                        <taskdef resource="tasks.properties" classpathref="maven.plugin.classpath" />
+                                        <if>
+                                            <available property="gogocobertura" file="target/cobertura/cobertura.ser" />
+                                            <then>
+                                                <echo message="GENERATING COBERTURA COVERAGE REPORT" />
+                                                <cobertura-report format="xml" destdir="target/site/cobertura" datafile="target/cobertura/cobertura.ser">
+                                                    <fileset erroronmissingdir="false" dir="src/main/java" />
+                                                    <fileset erroronmissingdir="false" dir="target/cobertura/dependency-sources" />
+                                                </cobertura-report>
+                                                <cobertura-report format="html" destdir="target/site/cobertura" datafile="target/cobertura/cobertura.ser">
+                                                    <fileset erroronmissingdir="false" dir="src/main/java" />
+                                                    <fileset erroronmissingdir="false" dir="target/cobertura/dependency-sources" />
+                                                </cobertura-report>
+                                            </then>
+                                        </if>
+                                    </target>
+                                </configuration>
+                            </execution>
+                        </executions>
+                        <dependencies>
+                            <dependency>
+                                <groupId>ant-contrib</groupId>
+                                <artifactId>ant-contrib</artifactId>
+                                <version>1.0b3</version>
+                                <exclusions>
+                                    <exclusion>
+                                        <groupId>ant</groupId>
+                                        <artifactId>ant</artifactId>
+                                    </exclusion>
+                                </exclusions>
+                            </dependency>
+                            <dependency>
+                                <groupId>org.apache.ant</groupId>
+                                <artifactId>ant-launcher</artifactId>
+                                <version>${ant.version}</version>
+                            </dependency>
+                            <dependency>
+                                <groupId>org.apache.ant</groupId>
+                                <artifactId>ant</artifactId>
+                                <version>${ant.version}</version>
+                            </dependency>
+                            <dependency>
+                                <groupId>org.testng</groupId>
+                                <artifactId>testng</artifactId>
+                                <version>${testng.version}</version>
+                            </dependency>
+                            <dependency>
+                                <groupId>org.codehaus.mojo</groupId>
+                                <artifactId>cobertura-maven-plugin</artifactId>
+                                <version>${cobertura.plugin.version}</version>
+                            </dependency>
+                        </dependencies>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>unpack-coverage-sources</id>
+                                <phase>generate-sources</phase>
+                                <goals>
+                                    <goal>unpack-dependencies</goal>
+                                </goals>
+                                <configuration>
+                                    <classifier>sources</classifier>
+                                    <includeScope>compile</includeScope>
+                                    <includeGroupIds>brooklyn</includeGroupIds>
+                                    <outputDirectory>
+                                        ${project.build.directory}/cobertura/dependency-sources
+                                    </outputDirectory>
+                                    <failOnMissingClassifierArtifact>false</failOnMissingClassifierArtifact>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>unpack-coverage-classes</id>
+                                <phase>compile</phase>
+                                <goals>
+                                    <goal>unpack-dependencies</goal>
+                                </goals>
+                                <configuration>
+                                    <type>jar</type>
+                                    <includeScope>compile</includeScope>
+                                    <includeGroupIds>brooklyn</includeGroupIds>
+                                    <outputDirectory>
+                                        ${project.build.directory}/cobertura/dependency-classes
+                                    </outputDirectory>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <version>${surefire.version}</version>
+                        <inherited>true</inherited>
+                        <configuration>
+                            <reportFormat>xml</reportFormat>
+                            <classesDirectory>${project.build.directory}/cobertura/coverage-classes</classesDirectory>
+                            <systemProperties>
+                                <property>
+                                    <name>net.sourceforge.cobertura.datafile</name>
+                                    <value>${project.build.directory}/cobertura/cobertura.ser
+                                    </value>
+                                </property>
+                                <property>
+                                    <name>cobertura.user.java.nio</name>
+                                    <value>false</value>
+                                </property>
+                            </systemProperties>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-jar-plugin</artifactId>


<TRUNCATED>

[04/50] [abbrv] brooklyn-server git commit: yaml-friendly enrichers for delta and rolling avg

Posted by he...@apache.org.
yaml-friendly enrichers for delta and rolling avg


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

Branch: refs/heads/0.7.0-incubating
Commit: 1e69cc9754e22c49b502546b046380c153bd58e9
Parents: ea8da37
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Jun 19 04:56:39 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:32 2015 -0700

----------------------------------------------------------------------
 .../enricher/basic/AbstractTransformer.java     | 106 +++++++++++
 .../brooklyn/enricher/basic/Transformer.java    |  64 +------
 .../YamlRollingTimeWindowMeanEnricher.java      | 178 +++++++++++++++++++
 .../basic/YamlTimeWeightedDeltaEnricher.java    |  81 +++++++++
 .../YamlRollingTimeWindowMeanEnricherTest.java  | 178 +++++++++++++++++++
 .../YamlTimeWeightedDeltaEnricherTest.java      | 107 +++++++++++
 .../enricher/RollingTimeWindowMeanEnricher.java |   4 +-
 .../enricher/TimeWeightedDeltaEnricher.java     |   3 +
 8 files changed, 658 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e69cc97/core/src/main/java/brooklyn/enricher/basic/AbstractTransformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/AbstractTransformer.java b/core/src/main/java/brooklyn/enricher/basic/AbstractTransformer.java
new file mode 100644
index 0000000..28a6de1
--- /dev/null
+++ b/core/src/main/java/brooklyn/enricher/basic/AbstractTransformer.java
@@ -0,0 +1,106 @@
+/*
+ * 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 brooklyn.enricher.basic;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.ConfigKeys;
+import brooklyn.entity.basic.EntityLocal;
+import brooklyn.event.AttributeSensor;
+import brooklyn.event.Sensor;
+import brooklyn.event.SensorEvent;
+import brooklyn.event.SensorEventListener;
+import brooklyn.event.basic.BasicSensorEvent;
+import brooklyn.util.collections.MutableSet;
+import brooklyn.util.task.Tasks;
+import brooklyn.util.time.Duration;
+
+import com.google.common.base.Function;
+import com.google.common.reflect.TypeToken;
+
+@SuppressWarnings("serial")
+public abstract class AbstractTransformer<T,U> extends AbstractEnricher implements SensorEventListener<T> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractTransformer.class);
+
+    public static ConfigKey<Entity> PRODUCER = ConfigKeys.newConfigKey(Entity.class, "enricher.producer");
+
+    public static ConfigKey<Sensor<?>> SOURCE_SENSOR = ConfigKeys.newConfigKey(new TypeToken<Sensor<?>>() {}, "enricher.sourceSensor");
+
+    public static ConfigKey<Sensor<?>> TARGET_SENSOR = ConfigKeys.newConfigKey(new TypeToken<Sensor<?>>() {}, "enricher.targetSensor");
+    
+    protected Entity producer;
+    protected Sensor<T> sourceSensor;
+    protected Sensor<U> targetSensor;
+
+    public AbstractTransformer() {
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @Override
+    public void setEntity(EntityLocal entity) {
+        super.setEntity(entity);
+
+        Function<SensorEvent<T>, U> transformation = getTransformation();
+        this.producer = getConfig(PRODUCER) == null ? entity: getConfig(PRODUCER);
+        this.sourceSensor = (Sensor<T>) getRequiredConfig(SOURCE_SENSOR);
+        Sensor<?> targetSensorSpecified = getConfig(TARGET_SENSOR);
+        this.targetSensor = targetSensorSpecified!=null ? (Sensor<U>) targetSensorSpecified : (Sensor<U>) this.sourceSensor;
+        if (producer.equals(entity) && targetSensorSpecified==null) {
+            LOG.error("Refusing to add an enricher which reads and publishes on the same sensor: "+
+                producer+"."+sourceSensor+" (computing "+transformation+")");
+            // we don't throw because this error may manifest itself after a lengthy deployment, 
+            // and failing it at that point simply because of an enricher is not very pleasant
+            // (at least not until we have good re-run support across the board)
+            return;
+        }
+        
+        subscribe(producer, sourceSensor, this);
+        
+        if (sourceSensor instanceof AttributeSensor) {
+            Object value = producer.getAttribute((AttributeSensor<?>)sourceSensor);
+            // TODO would be useful to have a convenience to "subscribeAndThenIfItIsAlreadySetRunItOnce"
+            if (value!=null) {
+                onEvent(new BasicSensorEvent(sourceSensor, producer, value, -1));
+            }
+        }
+    }
+
+    /** returns a function for transformation, for immediate use only (not for caching, as it may change) */
+    protected abstract Function<SensorEvent<T>, U> getTransformation();
+
+    @Override
+    public void onEvent(SensorEvent<T> event) {
+        emit(targetSensor, compute(event));
+    }
+
+    protected Object compute(SensorEvent<T> event) {
+        // transformation is not going to change, but this design makes it easier to support changing config in future. 
+        // if it's an efficiency hole we can switch to populate the transformation at start.
+        U result = getTransformation().apply(event);
+        if (LOG.isTraceEnabled())
+            LOG.trace("Enricher "+this+" computed "+result+" from "+event);
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e69cc97/core/src/main/java/brooklyn/enricher/basic/Transformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/Transformer.java b/core/src/main/java/brooklyn/enricher/basic/Transformer.java
index c6c88a6..2fa85fe 100644
--- a/core/src/main/java/brooklyn/enricher/basic/Transformer.java
+++ b/core/src/main/java/brooklyn/enricher/basic/Transformer.java
@@ -24,14 +24,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.config.ConfigKey;
-import brooklyn.entity.Entity;
 import brooklyn.entity.basic.ConfigKeys;
-import brooklyn.entity.basic.EntityLocal;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.Sensor;
 import brooklyn.event.SensorEvent;
-import brooklyn.event.SensorEventListener;
-import brooklyn.event.basic.BasicSensorEvent;
 import brooklyn.util.collections.MutableSet;
 import brooklyn.util.task.Tasks;
 import brooklyn.util.time.Duration;
@@ -41,7 +35,7 @@ import com.google.common.reflect.TypeToken;
 
 //@Catalog(name="Transformer", description="Transforms attributes of an entity; see Enrichers.builder().transforming(...)")
 @SuppressWarnings("serial")
-public class Transformer<T,U> extends AbstractEnricher implements SensorEventListener<T> {
+public class Transformer<T,U> extends AbstractTransformer<T,U> {
 
     private static final Logger LOG = LoggerFactory.getLogger(Transformer.class);
 
@@ -50,50 +44,11 @@ public class Transformer<T,U> extends AbstractEnricher implements SensorEventLis
     public static ConfigKey<Function<?, ?>> TRANSFORMATION_FROM_VALUE = ConfigKeys.newConfigKey(new TypeToken<Function<?, ?>>() {}, "enricher.transformation");
     public static ConfigKey<Function<?, ?>> TRANSFORMATION_FROM_EVENT = ConfigKeys.newConfigKey(new TypeToken<Function<?, ?>>() {}, "enricher.transformation.fromevent");
     
-    public static ConfigKey<Entity> PRODUCER = ConfigKeys.newConfigKey(Entity.class, "enricher.producer");
-
-    public static ConfigKey<Sensor<?>> SOURCE_SENSOR = ConfigKeys.newConfigKey(new TypeToken<Sensor<?>>() {}, "enricher.sourceSensor");
-
-    public static ConfigKey<Sensor<?>> TARGET_SENSOR = ConfigKeys.newConfigKey(new TypeToken<Sensor<?>>() {}, "enricher.targetSensor");
-    
-    protected Entity producer;
-    protected Sensor<T> sourceSensor;
-    protected Sensor<U> targetSensor;
-
     public Transformer() {
     }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    @Override
-    public void setEntity(EntityLocal entity) {
-        super.setEntity(entity);
-
-        Function<SensorEvent<T>, U> transformation = getTransformation();
-        this.producer = getConfig(PRODUCER) == null ? entity: getConfig(PRODUCER);
-        this.sourceSensor = (Sensor<T>) getRequiredConfig(SOURCE_SENSOR);
-        Sensor<?> targetSensorSpecified = getConfig(TARGET_SENSOR);
-        this.targetSensor = targetSensorSpecified!=null ? (Sensor<U>) targetSensorSpecified : (Sensor<U>) this.sourceSensor;
-        if (producer.equals(entity) && targetSensorSpecified==null) {
-            LOG.error("Refusing to add an enricher which reads and publishes on the same sensor: "+
-                producer+"."+sourceSensor+" (computing "+transformation+")");
-            // we don't throw because this error may manifest itself after a lengthy deployment, 
-            // and failing it at that point simply because of an enricher is not very pleasant
-            // (at least not until we have good re-run support across the board)
-            return;
-        }
-        
-        subscribe(producer, sourceSensor, this);
-        
-        if (sourceSensor instanceof AttributeSensor) {
-            Object value = producer.getAttribute((AttributeSensor<?>)sourceSensor);
-            // TODO would be useful to have a convenience to "subscribeAndThenIfItIsAlreadySetRunItOnce"
-            if (value!=null) {
-                onEvent(new BasicSensorEvent(sourceSensor, producer, value, -1));
-            }
-        }
-    }
-
     /** returns a function for transformation, for immediate use only (not for caching, as it may change) */
+    @Override
     @SuppressWarnings("unchecked")
     protected Function<SensorEvent<T>, U> getTransformation() {
         MutableSet<Object> suppliers = MutableSet.of();
@@ -144,18 +99,5 @@ public class Transformer<T,U> extends AbstractEnricher implements SensorEventLis
             }
         };
     }
-
-    @Override
-    public void onEvent(SensorEvent<T> event) {
-        emit(targetSensor, compute(event));
-    }
-
-    protected Object compute(SensorEvent<T> event) {
-        // transformation is not going to change, but this design makes it easier to support changing config in future. 
-        // if it's an efficiency hole we can switch to populate the transformation at start.
-        U result = getTransformation().apply(event);
-        if (LOG.isTraceEnabled())
-            LOG.trace("Enricher "+this+" computed "+result+" from "+event);
-        return result;
-    }
+    
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e69cc97/core/src/main/java/brooklyn/enricher/basic/YamlRollingTimeWindowMeanEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/YamlRollingTimeWindowMeanEnricher.java b/core/src/main/java/brooklyn/enricher/basic/YamlRollingTimeWindowMeanEnricher.java
new file mode 100644
index 0000000..64333d4
--- /dev/null
+++ b/core/src/main/java/brooklyn/enricher/basic/YamlRollingTimeWindowMeanEnricher.java
@@ -0,0 +1,178 @@
+/*
+ * 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 brooklyn.enricher.basic;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.basic.ConfigKeys;
+import brooklyn.event.Sensor;
+import brooklyn.event.SensorEvent;
+import brooklyn.util.time.Duration;
+
+import com.google.common.base.Function;
+
+/**
+ * Transforms {@link Sensor} data into a rolling average based on a time window.
+ * 
+ * All values within the window are weighted or discarded based on the timestamps associated with
+ * them (discards occur when a new value is added or an average is requested)
+ * <p>
+ * This will not extrapolate figures - it is assumed a value is valid and correct for the entire
+ * time period between it and the previous value. Normally, the average attribute is only updated
+ * when a new value arrives so it can give a fully informed average, but there is a danger of this
+ * going stale.
+ * <p>
+ * When an average is requested, it is likely there will be a segment of the window for which there
+ * isn't a value. Instead of extrapolating a value and providing different extrapolation techniques,
+ * the average is reported with a confidence value which reflects the fraction of the time
+ * window for which the values were valid.
+ * <p>
+ * Consumers of the average may ignore the confidence value and just use the last known average.
+ * They could multiply the returned value by the confidence value to get a decay-type behavior as
+ * the window empties. A third alternative is to, at a certain confidence threshold, report that
+ * the average is no longer meaningful.
+ * <p>
+ * The default average when no data has been received is 0, with a confidence of 0
+ */
+public class YamlRollingTimeWindowMeanEnricher<T extends Number> extends AbstractTransformer<T,Double> {
+    
+    public static ConfigKey<Duration> WINDOW_DURATION = ConfigKeys.newConfigKey(Duration.class, "enricher.window.duration",
+        "Duration for which this window should store data, default one minute", Duration.ONE_MINUTE);
+
+    public static ConfigKey<Double> CONFIDENCE_REQUIRED_TO_PUBLISH = ConfigKeys.newDoubleConfigKey("enricher.window.confidenceRequired",
+        "Minimum confidence level (ie period covered) required to publish a rolling average", 0.8d);
+
+    public static class ConfidenceQualifiedNumber {
+        final Double value;
+        final double confidence;
+        
+        public ConfidenceQualifiedNumber(Double value, double confidence) {
+            this.value = value;
+            this.confidence = confidence;
+        }
+        
+        @Override
+        public String toString() {
+            return ""+value+" ("+(int)(confidence*100)+"%)";
+        } 
+        
+    }
+    
+    private final LinkedList<T> values = new LinkedList<T>();
+    private final LinkedList<Long> timestamps = new LinkedList<Long>();
+    volatile ConfidenceQualifiedNumber lastAverage = new ConfidenceQualifiedNumber(0d,0d);
+    
+    @Override
+    protected Function<SensorEvent<T>, Double> getTransformation() {
+        return new Function<SensorEvent<T>, Double>() {
+            @Override
+            public Double apply(SensorEvent<T> event) {
+                long eventTime = event.getTimestamp();
+                if (event.getValue()==null) {
+                    return null;
+                }
+                values.addLast(event.getValue());
+                timestamps.addLast(eventTime);
+                if (eventTime>0) {
+                    ConfidenceQualifiedNumber average = getAverage(eventTime, 0);
+
+                    if (average.confidence > getConfig(CONFIDENCE_REQUIRED_TO_PUBLISH)) { 
+                        // without confidence, we might publish wildly varying estimates,
+                        // causing spurious resizes, so allow it to be configured, and
+                        // by default require a high value
+
+                        // TODO would be nice to include timestamp, etc
+                        return average.value; 
+                    }
+                }
+                return null;
+            }
+        };
+    }
+    
+    public ConfidenceQualifiedNumber getAverage(long fromTime, long graceAllowed) {
+        if (timestamps.isEmpty()) {
+            return lastAverage = new ConfidenceQualifiedNumber(lastAverage.value, 0.0d);
+        }
+        
+        long firstTimestamp = -1;
+        Iterator<Long> ti = timestamps.iterator();
+        while (ti.hasNext()) {
+            firstTimestamp = ti.next();
+            if (firstTimestamp>0) break;
+        }
+        if (firstTimestamp<=0) {
+            // no values with reasonable timestamps
+            return lastAverage = new ConfidenceQualifiedNumber(values.get(values.size()-1).doubleValue(), 0.0d);
+        }
+
+        long lastTimestamp = timestamps.get(timestamps.size()-1);
+
+        long now = fromTime;
+        if (lastTimestamp > fromTime - graceAllowed) {
+            // without this, if the computation takes place X seconds after the publish,
+            // we treat X seconds as time for which we have no confidence in the data
+            now = lastTimestamp;
+        }
+        pruneValues(now);
+        
+        Duration timePeriod = getConfig(WINDOW_DURATION);
+        long windowStart = Math.max(now-timePeriod.toMilliseconds(), firstTimestamp);
+        long windowEnd = Math.max(now-timePeriod.toMilliseconds(), lastTimestamp);
+        Double confidence = ((double)(windowEnd - windowStart)) / timePeriod.toMilliseconds();
+        if (confidence <= 0.0000001d) {
+            // not enough timestamps in window 
+            double lastValue = values.get(values.size()-1).doubleValue();
+            return lastAverage = new ConfidenceQualifiedNumber(lastValue, 0.0d);
+        }
+        
+        long start = windowStart;
+        long end;
+        double weightedAverage = 0.0d;
+        
+        Iterator<T> valuesIter = values.iterator();
+        Iterator<Long> timestampsIter = timestamps.iterator();
+        while (valuesIter.hasNext()) {
+            // Ignores null and out-of-date values (and also values that are received out-of-order, but that shouldn't happen!)
+            Number val = valuesIter.next();
+            Long timestamp = timestampsIter.next();
+            if (val!=null && timestamp >= start) {
+                end = timestamp;
+                weightedAverage += ((end - start) / (confidence * timePeriod.toMilliseconds())) * val.doubleValue();
+                start = timestamp;
+            }
+        }
+        
+        return lastAverage = new ConfidenceQualifiedNumber(weightedAverage, confidence);
+    }
+    
+    /**
+     * Discards out-of-date values, but keeps at least one value.
+     */
+    private void pruneValues(long now) {
+        // keep one value from before the period, so that we can tell the window's start time
+        Duration timePeriod = getConfig(WINDOW_DURATION);
+        while(timestamps.size() > 1 && timestamps.get(1) < (now - timePeriod.toMilliseconds())) {
+            timestamps.removeFirst();
+            values.removeFirst();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e69cc97/core/src/main/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricher.java b/core/src/main/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricher.java
new file mode 100644
index 0000000..b515da4
--- /dev/null
+++ b/core/src/main/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricher.java
@@ -0,0 +1,81 @@
+/*
+ * 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 brooklyn.enricher.basic;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.enricher.basic.AbstractTransformer;
+import brooklyn.entity.basic.ConfigKeys;
+import brooklyn.event.SensorEvent;
+import brooklyn.util.flags.TypeCoercions;
+import brooklyn.util.time.Duration;
+
+import com.google.common.base.Function;
+
+/**
+ * Converts an absolute count 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.
+ * <p>
+ * For example, given a requests.count sensor, this can make a requests.per_sec sensor with {@link #DELTA_PERIOD} set to "1s" (the default).
+ * <p>
+ * Suitable for configuration from YAML.
+ */
+public class YamlTimeWeightedDeltaEnricher<T extends Number> extends AbstractTransformer<T,Double> {
+    private static final Logger LOG = LoggerFactory.getLogger(YamlTimeWeightedDeltaEnricher.class);
+    
+    Number lastValue;
+    long lastTime = -1;
+    
+    public static ConfigKey<Duration> DELTA_PERIOD = ConfigKeys.newConfigKey(Duration.class, "enricher.delta.period",
+        "Duration that this delta should compute for, default per second", Duration.ONE_SECOND);
+    
+    @Override
+    protected Function<SensorEvent<T>, Double> getTransformation() {
+        return new Function<SensorEvent<T>, Double>() {
+            @Override
+            public Double apply(SensorEvent<T> event) {
+                Number current = TypeCoercions.coerce(event.getValue(), Double.class);
+                
+                if (current == null) return null;
+
+                long eventTime = event.getTimestamp();
+                long unitMillis = getConfig(DELTA_PERIOD).toMilliseconds();
+                Double result = null;
+                
+                if (eventTime > 0 && eventTime > lastTime) {
+                    if (lastValue == null || lastTime < 0) {
+                        // cannot calculate time-based delta with a single value
+                        if (LOG.isTraceEnabled()) LOG.trace("{} received event but no last value so will not emit, null -> {} at {}", new Object[] {this, current, eventTime}); 
+                    } else {
+                        double duration = eventTime - lastTime;
+                        result = (current.doubleValue() - lastValue.doubleValue()) / (duration / unitMillis);
+                    }
+                }
+                
+                lastValue = current;
+                lastTime = eventTime;
+                
+                return result;
+            }
+        };
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e69cc97/core/src/test/java/brooklyn/enricher/basic/YamlRollingTimeWindowMeanEnricherTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/enricher/basic/YamlRollingTimeWindowMeanEnricherTest.java b/core/src/test/java/brooklyn/enricher/basic/YamlRollingTimeWindowMeanEnricherTest.java
new file mode 100644
index 0000000..45b7ec3
--- /dev/null
+++ b/core/src/test/java/brooklyn/enricher/basic/YamlRollingTimeWindowMeanEnricherTest.java
@@ -0,0 +1,178 @@
+/*
+ * 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 brooklyn.enricher.basic;
+
+import static org.testng.Assert.assertEquals;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import brooklyn.enricher.basic.YamlRollingTimeWindowMeanEnricher.ConfidenceQualifiedNumber;
+import brooklyn.entity.basic.AbstractApplication;
+import brooklyn.entity.basic.BasicEntity;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.event.AttributeSensor;
+import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.event.basic.BasicSensorEvent;
+import brooklyn.management.SubscriptionContext;
+import brooklyn.policy.EnricherSpec;
+import brooklyn.util.time.Duration;
+
+public class YamlRollingTimeWindowMeanEnricherTest {
+    
+    AbstractApplication app;
+    
+    BasicEntity producer;
+
+    AttributeSensor<Integer> intSensor;
+    AttributeSensor<Double> avgSensor, deltaSensor;
+    
+    Duration timePeriod = Duration.ONE_SECOND;
+    
+    YamlTimeWeightedDeltaEnricher<Double> delta;
+    YamlRollingTimeWindowMeanEnricher<Double> averager;
+    
+    ConfidenceQualifiedNumber average;
+    SubscriptionContext subscription;
+    
+    @SuppressWarnings("unchecked")
+    @BeforeMethod
+    public void before() {
+        app = new AbstractApplication() {};
+        Entities.startManagement(app);
+        producer = app.addChild(EntitySpec.create(BasicEntity.class));
+
+        intSensor = new BasicAttributeSensor<Integer>(Integer.class, "int sensor");
+        deltaSensor = new BasicAttributeSensor<Double>(Double.class, "delta sensor");
+        avgSensor = new BasicAttributeSensor<Double>(Double.class, "avg sensor");
+            
+        delta = producer.addEnricher(EnricherSpec.create(YamlTimeWeightedDeltaEnricher.class)
+                .configure(YamlTimeWeightedDeltaEnricher.PRODUCER, producer)
+                .configure(YamlTimeWeightedDeltaEnricher.SOURCE_SENSOR, intSensor)
+                .configure(YamlTimeWeightedDeltaEnricher.TARGET_SENSOR, deltaSensor));
+
+        averager = producer.addEnricher(EnricherSpec.create(YamlRollingTimeWindowMeanEnricher.class)
+                .configure(YamlRollingTimeWindowMeanEnricher.PRODUCER, producer)
+                .configure(YamlRollingTimeWindowMeanEnricher.SOURCE_SENSOR, deltaSensor)
+                .configure(YamlRollingTimeWindowMeanEnricher.TARGET_SENSOR, avgSensor)
+                .configure(YamlRollingTimeWindowMeanEnricher.WINDOW_DURATION, timePeriod));
+    }
+
+    @AfterMethod(alwaysRun=true)
+    public void tearDown() throws Exception {
+        if (app != null) Entities.destroyAll(app.getManagementContext());
+    }
+        
+    @Test
+    public void testDefaultAverageWhenEmpty() {
+        ConfidenceQualifiedNumber average = averager.getAverage(0, 0);
+        assertEquals(average.value, 0d);
+        assertEquals(average.confidence, 0.0d);
+    }
+    
+    protected BasicSensorEvent<Integer> newIntSensorEvent(int value, long timestamp) {
+        return new BasicSensorEvent<Integer>(intSensor, producer, value, timestamp);
+    }
+    protected BasicSensorEvent<Double> newDeltaSensorEvent(double value, long timestamp) {
+        return new BasicSensorEvent<Double>(deltaSensor, producer, value, timestamp);
+    }
+
+    @Test
+    public void testNoRecentValuesAverage() {
+        averager.onEvent(newDeltaSensorEvent(10, 0));
+        average = averager.getAverage(timePeriod.toMilliseconds()+1000, 0);
+        assertEquals(average.value, 10d);
+        assertEquals(average.confidence, 0d);
+    }
+
+    @Test
+    public void testNoRecentValuesUsesLastForAverage() {
+        averager.onEvent(newDeltaSensorEvent(10, 0));
+        averager.onEvent(newDeltaSensorEvent(20, 10));
+        average = averager.getAverage(timePeriod.toMilliseconds()+1000, 0);
+        assertEquals(average.value, 20d);
+        assertEquals(average.confidence, 0d);
+    }
+
+    @Test
+    public void testSingleValueTimeAverage() {
+        averager.onEvent(newDeltaSensorEvent(10, 1000));
+        average = averager.getAverage(1000, 0);
+        assertEquals(average.confidence, 0d);
+    }
+
+    @Test
+    public void testTwoValueAverageForPeriod() {
+        averager.onEvent(newDeltaSensorEvent(10, 1000));
+        averager.onEvent(newDeltaSensorEvent(10, 2000));
+        average = averager.getAverage(2000, 0);
+        assertEquals(average.value, 10 /1d);
+        assertEquals(average.confidence, 1d);
+    }
+
+    @Test
+    public void testMonospacedAverage() {
+        averager.onEvent(newDeltaSensorEvent(10, 1000));
+        averager.onEvent(newDeltaSensorEvent(20, 1250));
+        averager.onEvent(newDeltaSensorEvent(30, 1500));
+        averager.onEvent(newDeltaSensorEvent(40, 1750));
+        averager.onEvent(newDeltaSensorEvent(50, 2000));
+        average = averager.getAverage(2000, 0);
+        assertEquals(average.value, (20+30+40+50)/4d);
+        assertEquals(average.confidence, 1d);
+    }
+
+    @Test
+    public void testWeightedAverage() {
+        averager.onEvent(newDeltaSensorEvent(10, 1000));
+        averager.onEvent(newDeltaSensorEvent(20, 1100));
+        averager.onEvent(newDeltaSensorEvent(30, 1300));
+        averager.onEvent(newDeltaSensorEvent(40, 1600));
+        averager.onEvent(newDeltaSensorEvent(50, 2000));
+        
+        average = averager.getAverage(2000, 0);
+        assertEquals(average.value, (20*0.1d)+(30*0.2d)+(40*0.3d)+(50*0.4d));
+        assertEquals(average.confidence, 1d);
+    }
+
+    @Test
+    public void testConfidenceDecay() {
+        averager.onEvent(newDeltaSensorEvent(10, 1000));
+        averager.onEvent(newDeltaSensorEvent(20, 1250));
+        averager.onEvent(newDeltaSensorEvent(30, 1500));
+        averager.onEvent(newDeltaSensorEvent(40, 1750));
+        averager.onEvent(newDeltaSensorEvent(50, 2000));
+
+        average = averager.getAverage(2250, 0);
+        assertEquals(average.value, (30+40+50)/3d);
+        assertEquals(average.confidence, 0.75d);
+        average = averager.getAverage(2500, 0);
+        assertEquals(average.value, (40+50)/2d);
+        assertEquals(average.confidence, 0.5d);
+        average = averager.getAverage(2750, 0);
+        assertEquals(average.value, 50d);
+        assertEquals(average.confidence, 0.25d);
+        average = averager.getAverage(3000, 0);
+        assertEquals(average.value, 50d);
+        assertEquals(average.confidence, 0d);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e69cc97/core/src/test/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricherTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricherTest.java b/core/src/test/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricherTest.java
new file mode 100644
index 0000000..2a7a974
--- /dev/null
+++ b/core/src/test/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricherTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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 brooklyn.enricher.basic;
+
+import static org.testng.Assert.assertEquals;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import brooklyn.entity.basic.AbstractApplication;
+import brooklyn.entity.basic.BasicEntity;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.event.AttributeSensor;
+import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.event.basic.BasicSensorEvent;
+import brooklyn.management.SubscriptionContext;
+import brooklyn.policy.EnricherSpec;
+
+public class YamlTimeWeightedDeltaEnricherTest {
+    
+    AbstractApplication app;
+    
+    BasicEntity producer;
+
+    AttributeSensor<Integer> intSensor;
+    AttributeSensor<Double> avgSensor, deltaSensor;
+    SubscriptionContext subscription;
+    
+    @BeforeMethod
+    public void before() {
+        app = new AbstractApplication() {};
+        Entities.startManagement(app);
+        producer = app.addChild(EntitySpec.create(BasicEntity.class));
+
+        intSensor = new BasicAttributeSensor<Integer>(Integer.class, "int sensor");
+        deltaSensor = new BasicAttributeSensor<Double>(Double.class, "delta sensor");
+    }
+
+    @AfterMethod(alwaysRun=true)
+    public void tearDown() throws Exception {
+        if (app != null) Entities.destroyAll(app.getManagementContext());
+    }
+    
+    @Test
+    public void testMonospaceTimeWeightedDeltaEnricher() {
+        @SuppressWarnings("unchecked")
+        YamlTimeWeightedDeltaEnricher<Integer> delta = producer.addEnricher(EnricherSpec.create(YamlTimeWeightedDeltaEnricher.class)
+            .configure(YamlTimeWeightedDeltaEnricher.PRODUCER, producer)
+            .configure(YamlTimeWeightedDeltaEnricher.SOURCE_SENSOR, intSensor)
+            .configure(YamlTimeWeightedDeltaEnricher.TARGET_SENSOR, deltaSensor));
+        
+        delta.onEvent(newIntSensorEvent(0, 0));
+        assertEquals(producer.getAttribute(deltaSensor), null);
+        delta.onEvent(newIntSensorEvent(0, 1000));
+        assertEquals(producer.getAttribute(deltaSensor), 0d);
+        delta.onEvent(newIntSensorEvent(1, 2000));
+        assertEquals(producer.getAttribute(deltaSensor), 1d);
+        delta.onEvent(newIntSensorEvent(3, 3000));
+        assertEquals(producer.getAttribute(deltaSensor), 2d);
+        delta.onEvent(newIntSensorEvent(8, 4000));
+        assertEquals(producer.getAttribute(deltaSensor), 5d);
+    }
+    
+    protected BasicSensorEvent<Integer> newIntSensorEvent(int value, long timestamp) {
+        return new BasicSensorEvent<Integer>(intSensor, producer, value, timestamp);
+    }
+    
+    @Test
+    public void testVariableTimeWeightedDeltaEnricher() {
+        @SuppressWarnings("unchecked")
+        YamlTimeWeightedDeltaEnricher<Integer> delta = producer.addEnricher(EnricherSpec.create(YamlTimeWeightedDeltaEnricher.class)
+            .configure(YamlTimeWeightedDeltaEnricher.PRODUCER, producer)
+            .configure(YamlTimeWeightedDeltaEnricher.SOURCE_SENSOR, intSensor)
+            .configure(YamlTimeWeightedDeltaEnricher.TARGET_SENSOR, deltaSensor));
+        
+        delta.onEvent(newIntSensorEvent(0, 0));
+        delta.onEvent(newIntSensorEvent(0, 2000));
+        assertEquals(producer.getAttribute(deltaSensor), 0d);
+        delta.onEvent(newIntSensorEvent(3, 5000));
+        assertEquals(producer.getAttribute(deltaSensor), 1d);
+        delta.onEvent(newIntSensorEvent(7, 7000));
+        assertEquals(producer.getAttribute(deltaSensor), 2d);
+        delta.onEvent(newIntSensorEvent(12, 7500));
+        assertEquals(producer.getAttribute(deltaSensor), 10d);
+        delta.onEvent(newIntSensorEvent(15, 9500));
+        assertEquals(producer.getAttribute(deltaSensor), 1.5d);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e69cc97/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java b/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java
index 694977c..7c55a81 100644
--- a/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java
+++ b/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java
@@ -128,12 +128,12 @@ public class RollingTimeWindowMeanEnricher<T extends Number> extends AbstractTyp
         }
     }
     
-    @Deprecated /** @deprecatedsince 0.7.0; not used; use the 2-arg method */
+    @Deprecated /** @deprecated since 0.7.0; not used except in groovy tests; use the 2-arg method */
     public ConfidenceQualifiedNumber getAverage() {
         return getAverage(System.currentTimeMillis(), 0);
     }
     
-    @Deprecated /** @deprecated since 0.7.0; not used; use the 2-arg method */
+    @Deprecated /** @deprecated since 0.7.0; not used except in groovy tests; use the 2-arg method */
     public ConfidenceQualifiedNumber getAverage(long fromTimeExact) {
         return getAverage(fromTimeExact, 0);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e69cc97/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java b/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java
index b746edd..42e418f 100644
--- a/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java
+++ b/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java
@@ -24,6 +24,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.enricher.basic.AbstractTypeTransformingEnricher;
+import brooklyn.enricher.basic.YamlTimeWeightedDeltaEnricher;
 import brooklyn.entity.Entity;
 import brooklyn.event.AttributeSensor;
 import brooklyn.event.Sensor;
@@ -41,6 +42,8 @@ import com.google.common.base.Functions;
  * presented as a units/timeUnit based on the event timing.
  * <p>
  * NB for time (e.g. "total milliseconds consumed") use {@link TimeFractionDeltaEnricher}
+ * <p>
+ * See also {@link YamlTimeWeightedDeltaEnricher} designed for use from YAML.
  */
 //@Catalog(name="Time-weighted Delta", description="Converts an absolute sensor into a delta sensor "
 //        + "(i.e. the diff between the current and previous value), presented as a units/timeUnit "


[44/50] [abbrv] brooklyn-server git commit: Introduce a parent/pom and prepare for release

Posted by he...@apache.org.
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 5da81cf..0a27184 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,9 +17,10 @@
     specific language governing permissions and limitations
     under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
     <modelVersion>4.0.0</modelVersion>
-    <packaging>pom</packaging>
     <parent>
         <groupId>org.apache</groupId>
         <artifactId>apache</artifactId>
@@ -27,37 +28,18 @@
     </parent>
 
     <groupId>org.apache.brooklyn</groupId>
-    <artifactId>brooklyn-parent</artifactId>
+    <artifactId>brooklyn</artifactId>
     <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
+    <packaging>pom</packaging>
 
-    <name>Brooklyn Parent Project</name>
+    <name>Brooklyn Root</name>
     <description>
-        Brooklyn parent / project root,
-        serving as the ancestor POM for all projects --
+        Brooklyn project root, serving as the ancestor POM for all projects --
         declaring versions, profiles, and the modules to build
     </description>
     <url>https://brooklyn.incubator.apache.org/</url>
     <inceptionYear>2012</inceptionYear>
 
-    <!-- useful custom properties/defines to specify to control the build:
-
-      brooklyn.explicitModules :: only builds explicit modules (instead of default modules)
-
-      brooklyn.deployTo={apache} ::
-            :: required when deploying; specify the deployment target
-
-      javadoc :: build javadoc (adds a minute or two; enabled automatically for target deploy)
-
-      skipSources :: don't make the -sources.jar (saves a second or two, not much)
-
-      skipTests :: does the usual thing (saves a lot of time, but at some cost of build quality!)
-
-      simply activate with -Dbrooklyn.theCustomProperty on the mvn build line
-      (some of these are used to trigger profile selection, since maven activeByDefault
-      only works if _no_ profiles are triggered, see suggestion/background at:
-      http://stackoverflow.com/questions/5309379/how-to-keep-maven-profiles-which-are-activebydefault-active-even-if-another-prof )
-    -->
-
     <developers>
         <!-- TODO update with PMC members and committers -->
     </developers>
@@ -66,8 +48,9 @@
         <connection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-brooklyn.git</connection>
         <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-brooklyn.git</developerConnection>
         <url>https://git-wip-us.apache.org/repos/asf?p=incubator-brooklyn.git</url>
-      <tag>HEAD</tag>
-  </scm>
+        <tag>HEAD</tag>
+    </scm>
+
     <issueManagement>
         <system>JIRA</system>
         <url>https://issues.apache.org/jira/browse/BROOKLYN</url>
@@ -93,1866 +76,62 @@
         <java.version>1.7</java.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-
-        <!-- Testing -->
-        <cobertura.plugin.version>2.7</cobertura.plugin.version>
-        <surefire.version>2.18.1</surefire.version>
-        <plantuml.version>6121</plantuml.version>
-        <ant.version>1.8.4</ant.version>
-        <includedTestGroups />
-        <excludedTestGroups>Integration,Acceptance,Live,WIP</excludedTestGroups>
-
-        <!-- Dependencies -->
         <brooklyn.version>0.7.0-incubating</brooklyn.version>  <!-- BROOKLYN_VERSION -->
-        <jclouds.groupId>org.apache.jclouds</jclouds.groupId>
-
-        <!-- These dependencies also appear in usage/downstream-parent/pom.xml -
-           - please synchronise versions between these two pom files -->
-        <jclouds.version>1.9.0</jclouds.version>
-        <logback.version>1.0.7</logback.version>
-        <slf4j.version>1.6.6</slf4j.version>  <!-- used for java.util.logging jul-to-slf4j interception -->
-        <guava.version>17.0</guava.version>
-        <xstream.version>1.4.7</xstream.version>
-        <jackson.version>1.9.13</jackson.version>  <!-- codehaus jackson, used by brooklyn rest server -->
-        <fasterxml.jackson.version>2.4.2</fasterxml.jackson.version>  <!-- more recent jackson, but not compatible with old annotations! -->
-        <jersey.version>1.18.1</jersey.version>
-        <httpclient.version>4.4.1</httpclient.version>
-        <commons-lang3.version>3.1</commons-lang3.version>
-        <groovy.version>2.3.4</groovy.version> <!-- Version supported by https://github.com/groovy/groovy-eclipse/wiki/Groovy-Eclipse-2.9.0-Release-Notes -->
-        <jsr305.version>2.0.1</jsr305.version>
-        <snakeyaml.version>1.11</snakeyaml.version>
-
-        <!-- Ordinary dependencies -->
-        <testng.version>6.8.8</testng.version>
-        <mockito.version>1.10.8</mockito.version>
-        <swagger.version>1.0.1</swagger.version>
-        <jansi.version>1.2.1</jansi.version>
-        <gson.version>2.3</gson.version>
-        <ivy.version>2.2.0</ivy.version>
-        <mx4j.version>3.0.1</mx4j.version>
-        <bouncycastle.version>1.49</bouncycastle.version>
-        <sshj.version>0.8.1</sshj.version>
-        <felix.framework.version>4.4.0</felix.framework.version>
-        <reflections.version>0.9.9-RC1</reflections.version>
-        <jetty.version>8.1.17.v20150415</jetty.version>
-        <airline.version>0.6</airline.version>
-        <mockwebserver.version>20121111</mockwebserver.version>
-        <freemarker.version>2.3.22</freemarker.version>
-        <commons-io.version>2.4</commons-io.version>
-        <hazelcast.version>3.0</hazelcast.version>
-        <jsonPath.version>2.0.0</jsonPath.version>
-        <commons-compress.version>1.4</commons-compress.version>
-        <qpid.version>0.20</qpid.version>
-        <mongodb.version>2.11.4</mongodb.version>
-        <riak.version>1.4.0</riak.version>
-        <maven-war-plugin.version>2.4</maven-war-plugin.version>
-        <validation-api.version>1.0.0.GA</validation-api.version>
-        <geronimo-jms_1.1_spec.version>1.1.1</geronimo-jms_1.1_spec.version>
-        <sleepycat-je.version>5.0.34</sleepycat-je.version>
-        <org.marre.smsj.version>1.0.0-20051126</org.marre.smsj.version>
-        <mysql-connector-java.version>5.1.18</mysql-connector-java.version>
-        <hadoop.version>1.0.2</hadoop.version>
-        <commons-cli.version>1.2</commons-cli.version>
-        <postgresql.version>9.1-901.jdbc4</postgresql.version>
-        <activemq.version>5.10.0</activemq.version>
-        <rabbitmq-version>2.8.7</rabbitmq-version>
-        <kafka.version>0.7.0-incubating</kafka.version>
-        <storm.version>0.8.2</storm.version>
-        <redis.version>1.5.2</redis.version>
-        <astyanax.version>1.56.24</astyanax.version>
-        <jcouchdb.version>0.11.0-1</jcouchdb.version>
-        <solr.version>4.7.0</solr.version>
-        <jtidy.version>r8-20060801</jtidy.version>
-        <opendmk_jmxremote_optional_jar.version>1.0-b01-ea</opendmk_jmxremote_optional_jar.version>
-        <resteasy.version>3.0.8.Final</resteasy.version>
-        <maven-dependency-plugin.version>2.8</maven-dependency-plugin.version>
-        <jopt.version>4.3</jopt.version>
-        <concurrentlinkedhashmap.version>1.0_jdk5</concurrentlinkedhashmap.version>
-        <maven-replacer-plugin.version>1.5.2</maven-replacer-plugin.version>
-        <nodejs-maven-plugin.version>1.0.3</nodejs-maven-plugin.version>
-        <nodejs-maven-binaries.version>0.10.25</nodejs-maven-binaries.version>
-        <jasmine-maven-plugin.version>1.3.1.5</jasmine-maven-plugin.version>
-        <requirejs-maven-plugin.version>2.0.0</requirejs-maven-plugin.version>
-        <maven-antrun-plugin.version>1.7</maven-antrun-plugin.version>
-        <jetty-orbit-javax-servlet.version>3.0.0.v201112011016</jetty-orbit-javax-servlet.version>
-        <jcommander.version>1.27</jcommander.version>
-        <xml-apis.version>1.0.b2</xml-apis.version>
-        <jsr250-api.version>1.0</jsr250-api.version>
-        <guice.version>3.0</guice.version>
-        <javax-inject.version>1</javax-inject.version>
-        <aopalliance.version>1.0</aopalliance.version>
-        <commons-configuration.version>1.7</commons-configuration.version>
-        <commons-lang.version>2.4</commons-lang.version>
-        <hamcrest.version>1.1</hamcrest.version>
-        <jsr311-api.version>1.1.1</jsr311-api.version>
-        <maxmind.version>0.8.1</maxmind.version>
-        <jna.version>4.0.0</jna.version>
-        <winrm4j.version>0.1.0</winrm4j.version>
-        <coverage.target>${working.dir}</coverage.target>
-
-        <!-- Transitive dependencies, declared explicitly to avoid version mismatch -->
-        <clojure.version>1.4.0</clojure.version>
-        <zookeeper.version>3.3.4</zookeeper.version>
-        <ring-core.version>1.1.5</ring-core.version>
-        <clj-time.version>0.4.1</clj-time.version>
-        <commons-codec.version>1.9</commons-codec.version>
-        <log4j.version>1.2.17</log4j.version>
-        <commons-logging.version>1.2</commons-logging.version>
     </properties>
 
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>ch.qos.logback</groupId>
-                <artifactId>logback-classic</artifactId>
-                <version>${logback.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.ivy</groupId>
-                <artifactId>ivy</artifactId>
-                <version>${ivy.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.thoughtworks.xstream</groupId>
-                <artifactId>xstream</artifactId>
-                <version>${xstream.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.fusesource.jansi</groupId>
-                <artifactId>jansi</artifactId>
-                <version>${jansi.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.guava</groupId>
-                <artifactId>guava</artifactId>
-                <version>${guava.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.code.findbugs</groupId>
-                <artifactId>jsr305</artifactId>
-                <version>${jsr305.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.groovy</groupId>
-                <artifactId>groovy-all</artifactId>
-                <version>${groovy.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.testng</groupId>
-                <artifactId>testng</artifactId>
-                <version>${testng.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>${jclouds.groupId}</groupId>
-                <artifactId>jclouds-allcompute</artifactId>
-                <version>${jclouds.version}</version>
-                <type>jar</type>
-            </dependency>
-            <dependency>
-                <groupId>${jclouds.groupId}.driver</groupId>
-                <artifactId>jclouds-sshj</artifactId>
-                <version>${jclouds.version}</version>
-                <type>jar</type>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.ant</groupId>
-                <artifactId>ant</artifactId>
-                <version>${ant.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.ant</groupId>
-                <artifactId>ant-launcher</artifactId>
-                <version>${ant.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>net.sourceforge.plantuml</groupId>
-                <artifactId>plantuml</artifactId>
-                <version>${plantuml.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-api</artifactId>
-                <version>${slf4j.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-server</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey.contribs</groupId>
-                <artifactId>jersey-multipart</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey.jersey-test-framework</groupId>
-                <artifactId>jersey-test-framework-inmemory</artifactId>
-                <version>${jersey.version}</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-lang3</artifactId>
-                <version>${commons-lang3.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-server</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-servlet</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-util</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-core-asl</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-mapper-asl</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-jaxrs</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-xc</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fasterxml.jackson.core</groupId>
-                <artifactId>jackson-databind</artifactId>
-                <version>${fasterxml.jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fasterxml.jackson.jaxrs</groupId>
-                <artifactId>jackson-jaxrs-json-provider</artifactId>
-                <version>${fasterxml.jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.wordnik</groupId>
-                <artifactId>swagger-core_2.9.1</artifactId>
-                <version>${swagger.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.slf4j</groupId>
-                        <artifactId>slf4j-log4j12</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.wordnik</groupId>
-                <artifactId>swagger-jaxrs_2.9.1</artifactId>
-                <version>${swagger.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty.orbit</groupId>
-                <artifactId>javax.servlet</artifactId>
-                <version>${jetty-orbit-javax-servlet.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-security</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-core</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.beust</groupId>
-                <artifactId>jcommander</artifactId>
-                <version>${jcommander.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpcore</artifactId>
-                <version>${httpclient.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>xml-apis</groupId>
-                <artifactId>xml-apis</artifactId>
-                <version>${xml-apis.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>javax.annotation</groupId>
-                <artifactId>jsr250-api</artifactId>
-                <version>${jsr250-api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.inject</groupId>
-                <artifactId>guice</artifactId>
-                <version>${guice.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>javax.inject</groupId>
-                <artifactId>javax.inject</artifactId>
-                <version>${javax-inject.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-io</groupId>
-                <artifactId>commons-io</artifactId>
-                <version>${commons-io.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpclient</artifactId>
-                <version>${httpclient.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpclient</artifactId>
-                <classifier>tests</classifier>
-                <version>${httpclient.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>aopalliance</groupId>
-                <artifactId>aopalliance</artifactId>
-                <version>${aopalliance.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcprov-ext-jdk15on</artifactId>
-                <version>${bouncycastle.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcpkix-jdk15on</artifactId>
-                <version>${bouncycastle.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.code.gson</groupId>
-                <artifactId>gson</artifactId>
-                <version>${gson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-configuration</groupId>
-                <artifactId>commons-configuration</artifactId>
-                <version>${commons-configuration.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-lang</groupId>
-                <artifactId>commons-lang</artifactId>
-                <version>${commons-lang.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.hamcrest</groupId>
-                <artifactId>hamcrest-all</artifactId>
-                <version>${hamcrest.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.yaml</groupId>
-                <artifactId>snakeyaml</artifactId>
-                <version>${snakeyaml.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.reflections</groupId>
-                <artifactId>reflections</artifactId>
-                <version>${reflections.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-client</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-webapp</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>org.apache.felix.framework</artifactId>
-                <version>${felix.framework.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-servlet</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>javax.ws.rs</groupId>
-                <artifactId>jsr311-api</artifactId>
-                <version>${jsr311-api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.external</groupId>
-                <artifactId>opendmk_jmxremote_optional_jar</artifactId>
-                <version>${opendmk_jmxremote_optional_jar.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>jul-to-slf4j</artifactId>
-                <version>${slf4j.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-json</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jboss.resteasy</groupId>
-                <artifactId>resteasy-jaxrs</artifactId>
-                <version>${resteasy.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jboss.resteasy</groupId>
-                <artifactId>resteasy-jackson-provider</artifactId>
-                <version>${resteasy.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jboss.resteasy</groupId>
-                <artifactId>jaxrs-api</artifactId>
-                <version>${resteasy.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>javax.validation</groupId>
-                <artifactId>validation-api</artifactId>
-                <version>${validation-api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>net.sf.jopt-simple</groupId>
-                <artifactId>jopt-simple</artifactId>
-                <version>${jopt.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.googlecode.concurrentlinkedhashmap</groupId>
-                <artifactId>concurrentlinkedhashmap-lru</artifactId>
-                <version>${concurrentlinkedhashmap.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>io.airlift</groupId>
-                <artifactId>airline</artifactId>
-                <version>${airline.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.whirr</groupId>
-                <artifactId>whirr-hadoop</artifactId>
-                <version>${whirr.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.whirr</groupId>
-                <artifactId>whirr-core</artifactId>
-                <version>${whirr.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.whirr</groupId>
-                <artifactId>whirr-cli</artifactId>
-                <version>${whirr.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.whirr</groupId>
-                <artifactId>whirr-elasticsearch</artifactId>
-                <version>${whirr.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-compress</artifactId>
-                <version>${commons-compress.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>net.schmizz</groupId>
-                <artifactId>sshj</artifactId>
-                <version>${sshj.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.freemarker</groupId>
-                <artifactId>freemarker</artifactId>
-                <version>${freemarker.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>mx4j</groupId>
-                <artifactId>mx4j-tools</artifactId>
-                <version>${mx4j.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.mockwebserver</groupId>
-                <artifactId>mockwebserver</artifactId>
-                <version>${mockwebserver.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>ch.qos.logback</groupId>
-                <artifactId>logback-core</artifactId>
-                <version>${logback.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.mockito</groupId>
-                <artifactId>mockito-all</artifactId>
-                <version>${mockito.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.mockito</groupId>
-                <artifactId>mockito-core</artifactId>
-                <version>${mockito.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.jayway.jsonpath</groupId>
-                <artifactId>json-path</artifactId>
-                <version>${jsonPath.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.maxmind.geoip2</groupId>
-                <artifactId>geoip2</artifactId>
-                <version>${maxmind.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>net.java.dev.jna</groupId>
-                <artifactId>jna</artifactId>
-                <version>${jna.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>net.java.dev.jna</groupId>
-                <artifactId>jna-platform</artifactId>
-                <version>${jna.version}</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <testSourceDirectory>src/test/java</testSourceDirectory>
-        <testResources>
-            <testResource>
-                <directory>src/test/resources</directory>
-            </testResource>
-        </testResources>
-
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <artifactId>maven-antrun-plugin</artifactId>
-                    <version>1.8</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-archetype-plugin</artifactId>
-                    <version>2.3</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-assembly-plugin</artifactId>
-                    <version>2.5.4</version>
-                    <configuration>
-                        <tarLongFileMode>gnu</tarLongFileMode>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-clean-plugin</artifactId>
-                    <version>2.6.1</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>3.3</version>
-                    <configuration>
-                        <source>${java.version}</source>
-                        <target>${java.version}</target>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-deploy-plugin</artifactId>
-                    <version>2.8.2</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-eclipse-plugin</artifactId>
-                    <version>2.10</version>
-                    <configuration>
-                        <additionalProjectnatures>
-                            <projectnature>org.eclipse.jdt.groovy.core.groovyNature</projectnature>
-                        </additionalProjectnatures>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-enforcer-plugin</artifactId>
-                    <version>1.4</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-failsafe-plugin</artifactId>
-                    <version>2.18.1</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-gpg-plugin</artifactId>
-                    <version>1.6</version>
-                    <executions>
-                        <execution>
-                            <id>sign-artifacts</id>
-                            <phase>verify</phase>
-                            <goals>
-                                <goal>sign</goal>
-                            </goals>
-                            <configuration>
-                                <executable>gpg2</executable>
-                            </configuration>
-                        </execution>
-                    </executions>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-jar-plugin</artifactId>
-                    <!-- version 2.4+ seems to break eclipse integration as per https://github.com/tesla/m2eclipse-extras/issues/10
-                         but cannot find issue on GitHub any more - 404 error -->
-                    <!-- XXX if this version is changed, update the MavenArtifactTest -->
-                    <version>2.6</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-javadoc-plugin</artifactId>
-                    <version>2.10.3</version>
-                    <configuration>
-                        <!-- disabling use because of NPE deploying to sonatype:
-                             http://stackoverflow.com/questions/888199/why-does-maven-install-fail-during-javadoc-generation
-                             http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=ac084ab7f47c4e7f1df2117cecd?bug_id=5101868
-                        -->
-                        <use>false</use>
-                        <links>
-                            <link>http://download.oracle.com/javaee/6/api</link>
-                        </links>
-                        <keywords>true</keywords>
-                        <author>false</author>
-                        <quiet>true</quiet>
-                        <aggregate>false</aggregate>
-                        <detectLinks />
-                        <tags>
-                            <tag>
-                                <name>todo</name>
-                                <placement>a</placement>
-                                <head>To-do:</head>
-                            </tag>
-                        </tags>
-                    </configuration>
-                    <executions>
-                        <execution>
-                            <id>attach-javadocs</id>
-                            <goals>
-                                <goal>jar</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-release-plugin</artifactId>
-                    <version>2.5.2</version>
-                    <!-- 'release' is not used; easier just to checkout, tag, `mvn deploy` manually
-                         with -Dbrooklyn.deployTo=TARGET ... and note we need to update docs and examples,
-                         which is a non-maven task!) -->
-                    <configuration>
-                        <mavenExecutorId>forked-path</mavenExecutorId>
-                        <useReleaseProfile>false</useReleaseProfile>
-                        <arguments>-Dbrooklyn.deployTo=apache</arguments>
-                        <goals>deploy</goals>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-resources-plugin</artifactId>
-                    <version>2.7</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-shade-plugin</artifactId>
-                    <version>2.3</version>
-                    <executions>
-                        <execution>
-                            <phase>package</phase>
-                            <goals>
-                                <goal>shade</goal>
-                            </goals>
-                            <configuration>
-                                <shadedArtifactAttached>true</shadedArtifactAttached>
-                                <shadedClassifierName>with-dependencies</shadedClassifierName>
-                                <filters>
-                                    <filter>
-                                        <artifact>*:*</artifact>
-                                        <excludes>
-                                            <exclude>META-INF/*.SF</exclude>
-                                            <exclude>META-INF/*.DSA</exclude>
-                                            <exclude>META-INF/*.RSA</exclude>
-                                        </excludes>
-                                    </filter>
-                                </filters>
-                            </configuration>
-                        </execution>
-                    </executions>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-site-plugin</artifactId>
-                    <version>3.4</version>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-source-plugin</artifactId>
-                    <version>2.4</version>
-                    <executions>
-                        <execution>
-                            <id>attach-sources</id>
-                            <phase>verify</phase>
-                            <goals>
-                                <goal>jar-no-fork</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-                <plugin>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>${surefire.version}</version>
-                    <configuration>
-                         <argLine>-Xms768m -Xmx768m -XX:MaxPermSize=256m -verbose:gc</argLine>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.felix</groupId>
-                    <artifactId>maven-bundle-plugin</artifactId>
-                    <version>2.5.4</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>findbugs-maven-plugin</artifactId>
-                    <version>3.0.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>build-helper-maven-plugin</artifactId>
-                    <version>1.9.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>cobertura-maven-plugin</artifactId>
-                    <version>${cobertura.plugin.version}</version>
-                </plugin>
-                <plugin>
-                    <groupId>com.google.code.maven-replacer-plugin</groupId>
-                    <artifactId>maven-replacer-plugin</artifactId>
-                    <version>1.4.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>buildnumber-maven-plugin</artifactId>
-                    <version>1.3</version>
-                    <configuration>
-                        <getRevisionOnlyOnce>true</getRevisionOnlyOnce>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.rat</groupId>
-                    <artifactId>apache-rat-plugin</artifactId>
-                    <configuration>
-                        <excludes combine.children="append">
-                            <!-- Exclude sandbox because not part of distribution: not in tgz, and not uploaded to maven-central -->
-                            <exclude>sandbox/**</exclude>
-                            <!-- Exclude netbeans config files (not part of the project, but often on users' drives -->
-                            <exclude>**/nbactions.xml</exclude>
-                            <exclude>**/nb-configuration.xml</exclude>
-                        </excludes>
-                    </configuration>
-                </plugin>
-
-                <!-- This is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
-                <plugin>
-                    <groupId>org.eclipse.m2e</groupId>
-                    <artifactId>lifecycle-mapping</artifactId>
-                    <version>1.0.0</version>
-                    <configuration>
-                        <lifecycleMappingMetadata>
-                            <pluginExecutions>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.apache.maven.plugins</groupId>
-                                        <artifactId>maven-dependency-plugin</artifactId>
-                                        <versionRange>[2.8,)</versionRange>
-                                        <goals>
-                                            <goal>copy-dependencies</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.apache.maven.plugins</groupId>
-                                        <artifactId>maven-assembly-plugin</artifactId>
-                                        <versionRange>[2.4.1,)</versionRange>
-                                        <goals>
-                                            <goal>single</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.codehaus.mojo</groupId>
-                                        <artifactId>build-helper-maven-plugin</artifactId>
-                                        <versionRange>[1.7,)</versionRange>
-                                        <goals>
-                                            <goal>attach-artifact</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.apache.maven.plugins</groupId>
-                                        <artifactId>maven-enforcer-plugin</artifactId>
-                                        <versionRange>[1.3.1,)</versionRange>
-                                        <goals>
-                                            <goal>enforce</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.apache.maven.plugins</groupId>
-                                        <artifactId>maven-remote-resources-plugin</artifactId>
-                                        <versionRange>[1.5,)</versionRange>
-                                        <goals>
-                                            <goal>process</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.apache.maven.plugins</groupId>
-                                        <artifactId>maven-dependency-plugin</artifactId>
-                                        <versionRange>[2.8,)</versionRange>
-                                        <goals>
-                                            <goal>unpack</goal>
-                                            <goal>copy</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>com.github.skwakman.nodejs-maven-plugin</groupId>
-                                        <artifactId>nodejs-maven-plugin</artifactId>
-                                        <versionRange>[1.0.3,)</versionRange>
-                                        <goals>
-                                            <goal>extract</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.apache.maven.plugins</groupId>
-                                        <artifactId>maven-war-plugin</artifactId>
-                                        <versionRange>[2.4,)</versionRange>
-                                        <goals>
-                                            <goal>exploded</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                  <pluginExecutionFilter>
-                                    <groupId>
-                                      org.apache.maven.plugins
-                                    </groupId>
-                                    <artifactId>
-                                      maven-checkstyle-plugin
-                                    </artifactId>
-                                    <versionRange>[2.13,)</versionRange>
-                                    <goals>
-                                      <goal>check</goal>
-                                    </goals>
-                                  </pluginExecutionFilter>
-                                  <action>
-                                    <ignore />
-                                  </action>
-                                </pluginExecution>
-<!-- This is suggested if Eclipse runs too many incremental maven plugins, but it also seems to cause NPE's in maven build.
-                                <pluginExecution>
-                                  <action>
-                                    <execute>
-                                      <runOnIncremental>false</runOnIncremental>
-                                    </execute>
-                                  </action>
-                                </pluginExecution>
--->
-                                <pluginExecution>
-                                  <pluginExecutionFilter>
-                                    <groupId>
-                                      org.apache.felix
-                                    </groupId>
-                                    <artifactId>
-                                      maven-bundle-plugin
-                                    </artifactId>
-                                    <versionRange>
-                                      [2.3.4,)
-                                    </versionRange>
-                                    <goals>
-                                      <goal>manifest</goal>
-                                    </goals>
-                                  </pluginExecutionFilter>
-                                  <action>
-                                    <ignore></ignore>
-                                  </action>
-                                </pluginExecution>
-                            </pluginExecutions>
-                        </lifecycleMappingMetadata>
-                    </configuration>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-
-        <plugins>
-            <plugin>
-                <artifactId>maven-clean-plugin</artifactId>
-                <configuration>
-                    <filesets>
-                        <fileset>
-                            <directory>.</directory>
-                            <includes>
-                                <include>brooklyn*.log</include>
-                                <include>brooklyn*.log.*</include>
-                                <include>stacktrace.log</include>
-                                <include>test-output</include>
-                                <include>prodDb.*</include>
-                            </includes>
-                        </fileset>
-                    </filesets>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-checkstyle-plugin</artifactId>
-                <version>2.13</version>
-                <executions>
-                    <execution>
-                        <id>verify-style</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>check</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <logViolationsToConsole>true</logViolationsToConsole>
-                    <checkstyleRules>
-                        <module name="Checker">
-                            <!-- Checks for whitespace                               -->
-                            <!-- See http://checkstyle.sf.net/config_whitespace.html -->
-                            <module name="FileTabCharacter">
-                                <property name="eachLine" value="true" />
-                            </module>
-                            <module name="TreeWalker">
-                                <module name="IllegalImport">
-                                    <property name="illegalPkgs" value="com.google.api.client.repackaged"/>
-                                </module>
-                            </module>
-                        </module>
-                    </checkstyleRules>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>buildnumber-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>validate</phase>
-                        <goals>
-                            <goal>create</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <artifactId>maven-enforcer-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>enforce</id>
-                        <phase>none</phase>
-                    </execution>
-                    <execution>
-                        <id>brooklyn-build-req</id>
-                        <goals>
-                            <goal>enforce</goal>
-                        </goals>
-                        <inherited>true</inherited>
-                        <configuration>
-                            <rules>
-                                <requireJavaVersion>
-                                    <version>${java.version}.0</version>
-                                </requireJavaVersion>
-                                <requireMavenVersion>
-                                    <version>[3.0.0,)</version>
-                                </requireMavenVersion>
-                                <dependencyConvergence/>
-                            </rules>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <artifactId>maven-resources-plugin</artifactId>
-                <configuration>
-                    <encoding>${project.build.sourceEncoding}</encoding>
-                </configuration>
-            </plugin>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <inherited>true</inherited>
-                <configuration>
-                    <fork>true</fork>
-                    <verbose>false</verbose>
-                </configuration>
-                <dependencies>
-                    <dependency>
-                        <groupId>org.codehaus.groovy</groupId>
-                        <artifactId>groovy-eclipse-compiler</artifactId>
-                        <version>2.9.0-01</version>
-                    </dependency>
-                    <dependency>
-                        <groupId>org.codehaus.groovy</groupId>
-                        <artifactId>groovy-eclipse-batch</artifactId>
-                        <version>2.3.4-01</version>
-                    </dependency>
-                </dependencies>
-            </plugin>
-            <!--  workaround for src/main/resources excluding all in eclipse, as per
-                  https://issues.sonatype.org/browse/MNGECLIPSE-864
-            -->
-            <plugin>
-                <groupId>com.google.code.maven-replacer-plugin</groupId>
-                <artifactId>maven-replacer-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>fix-eclipse-dot-classpath-mangling</id>
-                        <phase>clean</phase>
-                        <goals>
-                            <goal>replace</goal>
-                        </goals>
-                        <configuration>
-                            <ignoreMissingFile>true</ignoreMissingFile>
-                            <file>.classpath</file>
-                            <regex>false</regex>
-                            <replacements>
-                                <replacement>
-                                    <xpath>/classpath/classpathentry[@path='src/main/resources' and @kind='src' and @excluding='**']/@excluding</xpath>
-                                    <token>**</token>
-                                    <value />
-                                </replacement>
-                                <replacement>
-                                    <xpath>/classpath/classpathentry[@path='src/test/resources' and @kind='src' and @excluding='**']/@excluding</xpath>
-                                    <token>**</token>
-                                    <value />
-                                </replacement>
-                            </replacements>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Needed for command-line access, e.g mvn apache-rat:rat and mvn apache-rat:check -->
-            <plugin>
-              <groupId>org.apache.rat</groupId>
-              <artifactId>apache-rat-plugin</artifactId>
-              <version>0.10</version>
-              <executions>
-                <execution>
-                  <phase>verify</phase>
-                  <goals>
-                    <goal>check</goal>
-                  </goals>
-                </execution>
-              </executions>
-              <configuration>
-                <!--
-                     If you wish to override this list in the component (child) pom, ensure you use
-                         <excludes combine.children="merge">
-                     so that the child pom entries replace the parent entries
-                 -->
-                <excludes combine.children="append">
-                  <!-- git and IDE project files -->
-                  <!-- see https://issues.apache.org/jira/browse/RAT-107 -->
-                  <exclude>**/.git/**</exclude>
-                  <exclude>**/.gitignore</exclude>
-                  <exclude>**/.repository/**</exclude>
-                  <exclude>**/.idea/**</exclude>
-                  <exclude>**/*.iml</exclude>
-                  <exclude>**/.classpath/**</exclude>
-                  <exclude>**/.project</exclude>
-                  <exclude>**/.settings/**</exclude>
-                  <exclude>**/*.log</exclude>
-                  <exclude>**/brooklyn*.log.*</exclude>
-                  <exclude>**/target/**</exclude>
-                  <!-- files not requiring licence -->
-                  <exclude>ignored/**</exclude>
-                  <exclude>LICENSE.md</exclude>
-                  <exclude>**/src/main/license/**</exclude>
-                  <exclude>**/src/test/license/**</exclude>
-                  <exclude>**/MANIFEST.MF</exclude>
-                  <exclude>**/test-output/**</exclude>
-                  <exclude>**/*.pem.pub</exclude>
-                  <exclude>**/*.pem</exclude>
-                  <exclude>**/*_rsa.pub</exclude>
-                  <exclude>**/*_rsa</exclude>
-                  <exclude>**/*.svg</exclude>
-                  <exclude>**/*.crt</exclude>
-                  <exclude>**/*.csr</exclude>
-                  <exclude>**/*.key</exclude>
-                  <exclude>**/*.key.org</exclude>
-                  <exclude>**/*.psd</exclude>
-                  <exclude>**/*.json</exclude>
-                  <exclude>**/*.plxarc</exclude>
-                  <exclude>**/services/brooklyn.location.LocationResolver</exclude>
-                  <exclude>**/src/test/resources/brooklyn/entity/basic/template_with_extra_substitutions.txt</exclude>
-                  <exclude>**/src/main/resources/banner.txt</exclude>
-                  <exclude>**/src/test/resources/ssl/certs/localhost/info.txt</exclude>
-                  <exclude>**/sandbox/examples/src/main/scripts/amis.txt</exclude>
-                  <!-- see notes in https://issues.apache.org/jira/browse/BROOKLYN-18 -->
-
-                  <!--
-                      docs are not part of the distribution: they are just used to populate
-                      https://brooklyn.incubator.apache.org
-                  -->
-                  <exclude>docs/**</exclude>
-
-                </excludes>
-              </configuration>
-            </plugin>
-
-            <!-- Add off-the-schelf LICENSE, NOTICE and DISCLAIMER to each jar. Where off-the-shelf isn't suitable
-               - for submodules, they can disable this processing and intergrate their own files. -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-remote-resources-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>process</goal>
-                        </goals>
-                        <configuration>
-                            <resourceBundles>
-                                <resourceBundle>org.apache:apache-jar-resource-bundle:1.4</resourceBundle>
-                                <resourceBundle>org.apache:apache-incubator-disclaimer-resource-bundle:1.1</resourceBundle>
-                            </resourceBundles>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-        <extensions>
-            <extension>
-                <groupId>org.apache.maven.wagon</groupId>
-                <artifactId>wagon-ssh-external</artifactId>
-                <version>1.0</version>
-            </extension>
-            <extension>
-                <groupId>org.apache.maven.archetype</groupId>
-                <artifactId>archetype-packaging</artifactId>
-                <version>2.2</version>
-            </extension>
-        </extensions>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>Essentials</id>
-            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
-            <modules>
-                <module>utils/test-support</module>
-                <module>utils/common</module>
-                <module>utils/groovy</module>
-                <module>api</module>
-                <module>usage/test-support</module>
-                <module>camp</module>
-                <module>core</module>
-                <module>policy</module>
-                <module>storage/hazelcast</module>
-            </modules>
-        </profile>
-        <profile>
-            <id>Locations</id>
-            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
-            <modules>
-                <module>locations/jclouds</module>
-            </modules>
-        </profile>
-        <profile>
-            <id>Entities</id>
-            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
-            <modules>
-                <module>utils/jmx/jmxmp-ssl-agent</module>
-                <module>utils/jmx/jmxrmi-agent</module>
-                <module>software/base</module>
-                <module>software/network</module>
-                <module>software/osgi</module>
-                <module>software/webapp</module>
-                <module>software/messaging</module>
-                <module>software/nosql</module>
-                <module>software/database</module>
-                <module>software/monitoring</module>
-            </modules>
-        </profile>
-        <profile>
-            <id>Usage</id>
-            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
-            <modules>
-                <module>usage/logback-includes</module>
-                <module>usage/logback-xml</module>
-                <module>utils/rest-swagger</module>
-                <module>usage/camp</module>
-                <module>usage/rest-api</module>
-                <module>usage/rest-server</module>
-                <module>usage/rest-client</module>
-                <module>usage/jsgui</module>
-                <module>usage/launcher</module>
-                <module>usage/cli</module>
-                <module>usage/all</module>
-                <module>usage/dist</module>
-                <module>usage/downstream-parent</module>
-                <module>usage/archetypes/quickstart</module>
-            </modules>
-        </profile>
-        <profile>
-            <id>Examples</id>
-            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
-            <modules>
-                <module>examples</module>
-            </modules>
-        </profile>
-        <profile>
-            <id>QA</id>
-            <activation> <property><name> !brooklyn.explicitModules </name></property> </activation>
-            <modules>
-                <module>usage/qa</module>
-            </modules>
-        </profile>
-        <profile>
-            <id>Sandbox</id>
-            <modules>
-                <module>sandbox/extra</module>
-                <module>sandbox/database</module>
-                <module>sandbox/web-acceptance</module>
-                <module>sandbox/nosql</module>
-                <module>sandbox/monitoring</module>
-                <module>sandbox/examples/simple-open-loop-policy</module>
-                <module>sandbox/cassandra-multicloud-snitch</module>
-                <module>sandbox/mobile-app</module>
-            </modules>
-        </profile>
-
-        <profile>
-            <id>Documentation</id>
-            <reporting>
-                <excludeDefaults>true</excludeDefaults>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-project-info-reports-plugin</artifactId>
-                        <version>2.4</version>
-                        <reportSets>
-                            <reportSet>
-                                <reports>
-                                    <report>index</report>
-                                    <report>modules</report>
-                                </reports>
-                            </reportSet>
-                        </reportSets>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <version>2.8</version>
-                        <configuration>
-                            <links>
-                                <link>http://download.oracle.com/javaee/6/api</link>
-                            </links>
-                            <keywords>true</keywords>
-                            <author>false</author>
-                            <quiet>true</quiet>
-                            <aggregate>false</aggregate>
-                            <detectLinks />
-                            <tags>
-                                <tag>
-                                    <name>todo</name>
-                                    <placement>a</placement>
-                                    <head>To-do:</head>
-                                </tag>
-                            </tags>
-                        </configuration>
-                        <reportSets>
-                            <reportSet>
-                                <id>javadoc</id>
-                                <reports>
-                                    <report>javadoc</report>
-                                </reports>
-                            </reportSet>
-                        </reportSets>
-                    </plugin>
-                </plugins>
-            </reporting>
-        </profile>
-        <profile>
-            <id>Bundle</id>
-            <activation>
-                <file>
-                    <!-- NB - this is all the leaf projects, including logback-* (with no src);
-                         the archetype project neatly ignores this however -->
-                    <exists>${basedir}/src</exists>
-                </file>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>maven-bundle-plugin</artifactId>
-                        <extensions>true</extensions>
-                        <!-- configure plugin to generate MANIFEST.MF
-                             adapted from http://blog.knowhowlab.org/2010/06/osgi-tutorial-from-project-structure-to.html -->
-                        <executions>
-                            <execution>
-                                <id>bundle-manifest</id>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>manifest</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <supportedProjectTypes>
-                                <supportedProjectType>jar</supportedProjectType>
-                            </supportedProjectTypes>
-                            <instructions>
-                                <!-- OSGi specific instruction -->
-                                <!--
-                                    By default packages containing impl and internal
-                                    are not included in the export list. Setting an
-                                    explicit wildcard will include all packages
-                                    regardless of name.
-                                    In time we should minimize our export lists to
-                                    what is really needed.
-                                -->
-                                <Export-Package>brooklyn.*</Export-Package>
-                                <Implementation-SHA-1>${buildNumber}</Implementation-SHA-1>
-                                <Implementation-Branch>${scmBranch}</Implementation-Branch>
-                            </instructions>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-jar-plugin</artifactId>
-                        <configuration>
-                            <archive>
-                                <manifestFile> ${project.build.outputDirectory}/META-INF/MANIFEST.MF </manifestFile>
-                            </archive>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-
-        <profile>
-            <id>Tests</id>
-            <activation>
-                <file> <exists>${basedir}/src/test</exists> </file>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <version>${surefire.version}</version>
-                        <configuration>
-                            <properties>
-                                <property>
-                                    <name>listener</name>
-                                    <value>brooklyn.test.LoggingVerboseReporter,brooklyn.test.BrooklynLeakListener,brooklyn.test.PlatformTestSelectorListener</value>
-                                </property>
-                            </properties>
-                            <enableAssertions>true</enableAssertions>
-                            <groups>${includedTestGroups}</groups>
-                            <excludedGroups>${excludedTestGroups}</excludedGroups>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <systemPropertyVariables>
-                                <verbose>-1</verbose>
-                                <net.sourceforge.cobertura.datafile>${project.build.directory}/cobertura/cobertura.ser</net.sourceforge.cobertura.datafile>
-                                <cobertura.user.java.nio>false</cobertura.user.java.nio>
-                            </systemPropertyVariables>
-                            <printSummary>true</printSummary>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-jar-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>test-jar-creation</id>
-                                <goals>
-                                    <goal>test-jar</goal>
-                                </goals>
-                                <configuration>
-                                    <forceCreation>true</forceCreation>
-                                    <archive combine.self="override" />
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>Integration</id>
-            <properties>
-                <includedTestGroups>Integration</includedTestGroups>
-                <excludedTestGroups>Acceptance,Live,WIP</excludedTestGroups>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>run-tests</id>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                                <phase>integration-test</phase>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-jar-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>test-jar-creation</id>
-                                <configuration>
-                                    <skip>true</skip>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>Acceptance</id>
-            <properties>
-                <includedTestGroups>Acceptance</includedTestGroups>
-                <excludedTestGroups>Integration,Live,WIP</excludedTestGroups>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>run-tests</id>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                                <phase>integration-test</phase>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-jar-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>test-jar-creation</id>
-                                <configuration>
-                                    <skip>true</skip>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>Live</id>
-            <properties>
-                <includedTestGroups>Live</includedTestGroups>
-                <excludedTestGroups>Acceptance,WIP</excludedTestGroups>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-jar-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>test-jar-creation</id>
-                                <configuration>
-                                    <skip>true</skip>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-
-        <profile>
-            <id>Live-sanity</id>
-            <properties>
-                <includedTestGroups>Live-sanity</includedTestGroups>
-                <excludedTestGroups>Acceptance,WIP</excludedTestGroups>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-jar-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>test-jar-creation</id>
-                                <configuration>
-                                    <skip>true</skip>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-
-        <profile>
-            <id>CI</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>findbugs-maven-plugin</artifactId>
-                        <configuration>
-                            <xmlOutput>true</xmlOutput>
-                            <xmlOutputDirectory>target/site</xmlOutputDirectory>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>findbugs</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-source-plugin</artifactId>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-pmd-plugin</artifactId>
-                        <version>2.5</version>
-                        <inherited>true</inherited>
-                        <configuration>
-                            <failOnViolation>false</failOnViolation>
-                            <linkXref>true</linkXref>
-                            <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
-                            <minimumTokens>100</minimumTokens>
-                            <targetJdk>${java.version}</targetJdk>
-                            <excludes>
-                                <exclude>**/*Test.java</exclude>
-                                <exclude>**/tests/**/*.java</exclude>
-                                <!-- add any more generated source code directories here -->
-                            </excludes>
-                            <excludeRoots>
-                                <excludeRoot>
-                                    ${pom.basedir}/target/generated-sources/groovy-stubs/main
-                                </excludeRoot>
-                            </excludeRoots>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <phase>process-classes</phase>
-                                <goals>
-                                    <goal>check</goal>
-                                    <goal>cpd-check</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>Coverage</id>
-            <dependencies>
-                <dependency>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>cobertura-maven-plugin</artifactId>
-                    <version>${cobertura.plugin.version}</version>
-                    <scope>test</scope>
-                </dependency>
-            </dependencies>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-source-plugin</artifactId>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <inherited>true</inherited>
-                        <executions>
-                            <execution>
-                                <id>run-tests</id>
-                            </execution>
-                            <execution>
-                                <id>instrument classes</id>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                                <phase>process-test-classes</phase>
-                                <configuration>
-                                    <target>
-                                        <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
-                                        <taskdef resource="tasks.properties" classpathref="maven.plugin.classpath" />
-                                        <if>
-                                            <available property="gogocobertura" file="target/test-classes" />
-                                            <then>
-                                                <echo message="INSTRUMENTING CLASSES FOR COBERTURA" />
-                                                <!-- Ensure any and all bits of our project are copied in first -->
-                                                <copy todir="target/cobertura/coverage-classes">
-                                                    <fileset erroronmissingdir="false" dir="target/classes" />
-                                                </copy>
-                                                <cobertura-instrument datafile="target/cobertura/cobertura.ser" todir="target/test-classes">
-                                                    <fileset erroronmissingdir="false" dir="target/classes">
-                                                        <include name="brooklyn/**/*.class" />
-                                                        <exclude name="brooklyn/**/*Test.class" />
-                                                    </fileset>
-                                                    <fileset erroronmissingdir="false" dir="target/cobertura/dependency-classes">
-                                                        <include name="brooklyn/**/*.class" />
-                                                        <exclude name="brooklyn/**/*Test.class" />
-                                                    </fileset>
-                                                </cobertura-instrument>
-                                            </then>
-                                        </if>
-                                    </target>
-                                </configuration>
-                            </execution>
-                            <execution>
-                                <id>coverage report</id>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                                <phase>post-integration-test</phase>
-                                <configuration>
-                                    <target>
-                                        <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
-                                        <taskdef resource="tasks.properties" classpathref="maven.plugin.classpath" />
-                                        <if>
-                                            <available property="gogocobertura" file="target/cobertura/cobertura.ser" />
-                                            <then>
-                                                <echo message="GENERATING COBERTURA COVERAGE REPORT" />
-                                                <cobertura-report format="xml" destdir="target/site/cobertura" datafile="target/cobertura/cobertura.ser">
-                                                    <fileset erroronmissingdir="false" dir="src/main/java" />
-                                                    <fileset erroronmissingdir="false" dir="target/cobertura/dependency-sources" />
-                                                </cobertura-report>
-                                                <cobertura-report format="html" destdir="target/site/cobertura" datafile="target/cobertura/cobertura.ser">
-                                                    <fileset erroronmissingdir="false" dir="src/main/java" />
-                                                    <fileset erroronmissingdir="false" dir="target/cobertura/dependency-sources" />
-                                                </cobertura-report>
-                                            </then>
-                                        </if>
-                                    </target>
-                                </configuration>
-                            </execution>
-                        </executions>
-                        <dependencies>
-                            <dependency>
-                                <groupId>ant-contrib</groupId>
-                                <artifactId>ant-contrib</artifactId>
-                                <version>1.0b3</version>
-                                <exclusions>
-                                    <exclusion>
-                                        <groupId>ant</groupId>
-                                        <artifactId>ant</artifactId>
-                                    </exclusion>
-                                </exclusions>
-                            </dependency>
-                            <dependency>
-                                <groupId>org.apache.ant</groupId>
-                                <artifactId>ant-launcher</artifactId>
-                                <version>${ant.version}</version>
-                            </dependency>
-                            <dependency>
-                                <groupId>org.apache.ant</groupId>
-                                <artifactId>ant</artifactId>
-                                <version>${ant.version}</version>
-                            </dependency>
-                            <dependency>
-                                <groupId>org.testng</groupId>
-                                <artifactId>testng</artifactId>
-                                <version>${testng.version}</version>
-                            </dependency>
-                            <dependency>
-                                <groupId>org.codehaus.mojo</groupId>
-                                <artifactId>cobertura-maven-plugin</artifactId>
-                                <version>${cobertura.plugin.version}</version>
-                            </dependency>
-                        </dependencies>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-coverage-sources</id>
-                                <phase>generate-sources</phase>
-                                <goals>
-                                    <goal>unpack-dependencies</goal>
-                                </goals>
-                                <configuration>
-                                    <classifier>sources</classifier>
-                                    <includeScope>compile</includeScope>
-                                    <includeGroupIds>brooklyn</includeGroupIds>
-                                    <outputDirectory>
-                                        ${project.build.directory}/cobertura/dependency-sources
-                                    </outputDirectory>
-                                    <failOnMissingClassifierArtifact>false</failOnMissingClassifierArtifact>
-                                </configuration>
-                            </execution>
-                            <execution>
-                                <id>unpack-coverage-classes</id>
-                                <phase>compile</phase>
-                                <goals>
-                                    <goal>unpack-dependencies</goal>
-                                </goals>
-                                <configuration>
-                                    <type>jar</type>
-                                    <includeScope>compile</includeScope>
-                                    <includeGroupIds>brooklyn</includeGroupIds>
-                                    <outputDirectory>
-                                        ${project.build.directory}/cobertura/dependency-classes
-                                    </outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <version>${surefire.version}</version>
-                        <inherited>true</inherited>
-                        <configuration>
-                            <reportFormat>xml</reportFormat>
-                            <classesDirectory>${project.build.directory}/cobertura/coverage-classes</classesDirectory>
-                            <systemProperties>
-                                <property>
-                                    <name>net.sourceforge.cobertura.datafile</name>
-                                    <value>${project.build.directory}/cobertura/cobertura.ser
-                                    </value>
-                                </property>
-                                <property>
-                                    <name>cobertura.user.java.nio</n

<TRUNCATED>

[27/50] [abbrv] brooklyn-server git commit: Merge and close #712 (reviewed by @neykov and @mikezaccardo)

Posted by he...@apache.org.
Merge and close #712 (reviewed by @neykov and @mikezaccardo)


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

Branch: refs/heads/0.7.0-incubating
Commit: b2d715cc6e40f444ca8d91265de280797338cff5
Parents: 3546541 9f40f0a
Author: Richard Downer <ri...@apache.org>
Authored: Thu Jun 25 15:22:46 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Thu Jun 25 15:22:46 2015 +0100

----------------------------------------------------------------------
 .../io/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java  | 2 +-
 .../src/test/resources/java-web-app-and-db-with-function.yaml  | 4 ++--
 .../src/test/resources/java-web-app-and-db-with-policy.yaml    | 2 +-
 usage/camp/src/test/resources/java-web-app-simple.yaml         | 6 +++---
 usage/camp/src/test/resources/visitors-creation-script.sql     | 2 +-
 5 files changed, 8 insertions(+), 8 deletions(-)
----------------------------------------------------------------------



[20/50] [abbrv] brooklyn-server git commit: Clarify operation of `templateOptions` config key

Posted by he...@apache.org.
Clarify operation of `templateOptions` config key

Resolves the ambiguity around single parameters of type list. Extracts
the bulk of the code into a new standalone class and adds tests. Adds
documentation.


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

Branch: refs/heads/0.7.0-incubating
Commit: 6023536eb9c9fda438dc3fea42d1262a1510ae19
Parents: e26c9e3
Author: Richard Downer <ri...@apache.org>
Authored: Wed Jun 24 10:58:11 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jun 24 11:03:48 2015 +0100

----------------------------------------------------------------------
 .../brooklyn/util/flags/MethodCoercions.java    | 183 +++++++++++++++++++
 .../util/flags/MethodCoercionsTest.java         | 146 +++++++++++++++
 .../location/jclouds/JcloudsLocation.java       |  43 +----
 3 files changed, 333 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6023536e/core/src/main/java/brooklyn/util/flags/MethodCoercions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/flags/MethodCoercions.java b/core/src/main/java/brooklyn/util/flags/MethodCoercions.java
new file mode 100644
index 0000000..c9f00fe
--- /dev/null
+++ b/core/src/main/java/brooklyn/util/flags/MethodCoercions.java
@@ -0,0 +1,183 @@
+/*
+ * 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 brooklyn.util.flags;
+
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.guava.Maybe;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.reflect.TypeToken;
+
+import javax.annotation.Nullable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * A way of binding a loosely-specified method call into a strongly-typed Java method call.
+ */
+public class MethodCoercions {
+
+    /**
+     * Returns a predicate that matches a method with the given name, and a single parameter that
+     * {@link brooklyn.util.flags.TypeCoercions#tryCoerce(Object, com.google.common.reflect.TypeToken)} can process
+     * from the given argument.
+     *
+     * @param methodName name of the method
+     * @param argument argument that is intended to be given
+     * @return a predicate that will match a compatible method
+     */
+    public static Predicate<Method> matchSingleParameterMethod(final String methodName, final Object argument) {
+        checkNotNull(methodName, "methodName");
+        checkNotNull(argument, "argument");
+
+        return new Predicate<Method>() {
+            @Override
+            public boolean apply(@Nullable Method input) {
+                if (input == null) return false;
+                if (!input.getName().equals(methodName)) return false;
+                Type[] parameterTypes = input.getGenericParameterTypes();
+                return parameterTypes.length == 1
+                        && TypeCoercions.tryCoerce(argument, TypeToken.of(parameterTypes[0])).isPresentAndNonNull();
+
+            }
+        };
+    }
+
+    /**
+     * Tries to find a single-parameter method with a parameter compatible with (can be coerced to) the argument, and
+     * invokes it.
+     *
+     * @param instance the object to invoke the method on
+     * @param methodName the name of the method to invoke
+     * @param argument the argument to the method's parameter.
+     * @return the result of the method call, or {@link brooklyn.util.guava.Maybe#absent()} if method could not be matched.
+     */
+    public static Maybe<?> tryFindAndInvokeSingleParameterMethod(final Object instance, final String methodName, final Object argument) {
+        Class<?> clazz = instance.getClass();
+        Iterable<Method> methods = Arrays.asList(clazz.getMethods());
+        Optional<Method> matchingMethod = Iterables.tryFind(methods, matchSingleParameterMethod(methodName, argument));
+        if (matchingMethod.isPresent()) {
+            Method method = matchingMethod.get();
+            try {
+                Type paramType = method.getGenericParameterTypes()[0];
+                Object coercedArgument = TypeCoercions.coerce(argument, TypeToken.of(paramType));
+                return Maybe.of(method.invoke(instance, coercedArgument));
+            } catch (IllegalAccessException | InvocationTargetException e) {
+                throw Exceptions.propagate(e);
+            }
+        } else {
+            return Maybe.absent();
+        }
+    }
+
+    /**
+     * Returns a predicate that matches a method with the given name, and parameters that
+     * {@link brooklyn.util.flags.TypeCoercions#tryCoerce(Object, com.google.common.reflect.TypeToken)} can process
+     * from the given list of arguments.
+     *
+     * @param methodName name of the method
+     * @param arguments arguments that is intended to be given
+     * @return a predicate that will match a compatible method
+     */
+    public static Predicate<Method> matchMultiParameterMethod(final String methodName, final List<?> arguments) {
+        checkNotNull(methodName, "methodName");
+        checkNotNull(arguments, "arguments");
+
+        return new Predicate<Method>() {
+            @Override
+            public boolean apply(@Nullable Method input) {
+                if (input == null) return false;
+                if (!input.getName().equals(methodName)) return false;
+                int numOptionParams = arguments.size();
+                Type[] parameterTypes = input.getGenericParameterTypes();
+                if (parameterTypes.length != numOptionParams) return false;
+
+                for (int paramCount = 0; paramCount < numOptionParams; paramCount++) {
+                    if (!TypeCoercions.tryCoerce(((List) arguments).get(paramCount),
+                            TypeToken.of(parameterTypes[paramCount])).isPresentAndNonNull()) return false;
+                }
+                return true;
+            }
+        };
+    }
+
+    /**
+     * Tries to find a multiple-parameter method with each parameter compatible with (can be coerced to) the
+     * corresponding argument, and invokes it.
+     *
+     * @param instance the object to invoke the method on
+     * @param methodName the name of the method to invoke
+     * @param argument a list of the arguments to the method's parameters.
+     * @return the result of the method call, or {@link brooklyn.util.guava.Maybe#absent()} if method could not be matched.
+     */
+    public static Maybe<?> tryFindAndInvokeMultiParameterMethod(final Object instance, final String methodName, final List<?> arguments) {
+        Class<?> clazz = instance.getClass();
+        Iterable<Method> methods = Arrays.asList(clazz.getMethods());
+        Optional<Method> matchingMethod = Iterables.tryFind(methods, matchMultiParameterMethod(methodName, arguments));
+        if (matchingMethod.isPresent()) {
+            Method method = matchingMethod.get();
+            try {
+                int numOptionParams = ((List)arguments).size();
+                Object[] coercedArguments = new Object[numOptionParams];
+                for (int paramCount = 0; paramCount < numOptionParams; paramCount++) {
+                    Object argument = arguments.get(paramCount);
+                    Type paramType = method.getGenericParameterTypes()[paramCount];
+                    coercedArguments[paramCount] = TypeCoercions.coerce(argument, TypeToken.of(paramType));
+                }
+                return Maybe.of(method.invoke(instance, coercedArguments));
+            } catch (IllegalAccessException | InvocationTargetException e) {
+                throw Exceptions.propagate(e);
+            }
+        } else {
+            return Maybe.absent();
+        }
+    }
+
+    /**
+     * Tries to find a method with each parameter compatible with (can be coerced to) the corresponding argument, and invokes it.
+     *
+     * @param instance the object to invoke the method on
+     * @param methodName the name of the method to invoke
+     * @param argument a list of the arguments to the method's parameters, or a single argument for a single-parameter method.
+     * @return the result of the method call, or {@link brooklyn.util.guava.Maybe#absent()} if method could not be matched.
+     */
+    public static Maybe<?> tryFindAndInvokeBestMatchingMethod(final Object instance, final String methodName, final Object argument) {
+        if (argument instanceof List) {
+            List<?> arguments = (List<?>) argument;
+
+            // ambiguous case: we can't tell if the user is using the multi-parameter syntax, or the single-parameter
+            // syntax for a method which takes a List parameter. So we try one, then fall back to the other.
+
+            Maybe<?> maybe = tryFindAndInvokeMultiParameterMethod(instance, methodName, arguments);
+            if (maybe.isAbsent())
+                maybe = tryFindAndInvokeSingleParameterMethod(instance, methodName, argument);
+
+            return maybe;
+        } else {
+            return tryFindAndInvokeSingleParameterMethod(instance, methodName, argument);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6023536e/core/src/test/java/brooklyn/util/flags/MethodCoercionsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/flags/MethodCoercionsTest.java b/core/src/test/java/brooklyn/util/flags/MethodCoercionsTest.java
new file mode 100644
index 0000000..4d06ca4
--- /dev/null
+++ b/core/src/test/java/brooklyn/util/flags/MethodCoercionsTest.java
@@ -0,0 +1,146 @@
+/*
+ * 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 brooklyn.util.flags;
+
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.guava.Maybe;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import static org.testng.Assert.*;
+
+public class MethodCoercionsTest {
+
+    private Method singleParameterMethod;
+    private Method multiParameterMethod;
+    private Method singleCollectionParameterMethod;
+
+    @BeforeClass
+    public void testFixtureSetUp() {
+        try {
+            singleParameterMethod = TestClass.class.getMethod("singleParameterMethod", int.class);
+            multiParameterMethod = TestClass.class.getMethod("multiParameterMethod", boolean.class, int.class);
+            singleCollectionParameterMethod = TestClass.class.getMethod("singleCollectionParameterMethod", List.class);
+        } catch (NoSuchMethodException e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+
+    @Test
+    public void testMatchSingleParameterMethod() throws Exception {
+        Predicate<Method> predicate = MethodCoercions.matchSingleParameterMethod("singleParameterMethod", "42");
+        assertTrue(predicate.apply(singleParameterMethod));
+        assertFalse(predicate.apply(multiParameterMethod));
+        assertFalse(predicate.apply(singleCollectionParameterMethod));
+    }
+
+    @Test
+    public void testTryFindAndInvokeSingleParameterMethod() throws Exception {
+        TestClass instance = new TestClass();
+        Maybe<?> maybe = MethodCoercions.tryFindAndInvokeSingleParameterMethod(instance, "singleParameterMethod", "42");
+        assertTrue(maybe.isPresent());
+        assertTrue(instance.wasSingleParameterMethodCalled());
+    }
+
+    @Test
+    public void testMatchMultiParameterMethod() throws Exception {
+        Predicate<Method> predicate = MethodCoercions.matchMultiParameterMethod("multiParameterMethod", ImmutableList.of("true", "42"));
+        assertFalse(predicate.apply(singleParameterMethod));
+        assertTrue(predicate.apply(multiParameterMethod));
+        assertFalse(predicate.apply(singleCollectionParameterMethod));
+    }
+
+    @Test
+    public void testTryFindAndInvokeMultiParameterMethod() throws Exception {
+        TestClass instance = new TestClass();
+        Maybe<?> maybe = MethodCoercions.tryFindAndInvokeMultiParameterMethod(instance, "multiParameterMethod", ImmutableList.of("true", "42"));
+        assertTrue(maybe.isPresent());
+        assertTrue(instance.wasMultiParameterMethodCalled());
+    }
+
+    @Test
+    public void testTryFindAndInvokeBestMatchingMethod() throws Exception {
+        TestClass instance = new TestClass();
+        Maybe<?> maybe = MethodCoercions.tryFindAndInvokeBestMatchingMethod(instance, "singleParameterMethod", "42");
+        assertTrue(maybe.isPresent());
+        assertTrue(instance.wasSingleParameterMethodCalled());
+
+        instance = new TestClass();
+        maybe = MethodCoercions.tryFindAndInvokeBestMatchingMethod(instance, "multiParameterMethod", ImmutableList.of("true", "42"));
+        assertTrue(maybe.isPresent());
+        assertTrue(instance.wasMultiParameterMethodCalled());
+
+        instance = new TestClass();
+        maybe = MethodCoercions.tryFindAndInvokeBestMatchingMethod(instance, "singleCollectionParameterMethod", ImmutableList.of("fred", "joe"));
+        assertTrue(maybe.isPresent());
+        assertTrue(instance.wasSingleCollectionParameterMethodCalled());
+    }
+/*
+    @Test
+    public void testMatchSingleCollectionParameterMethod() throws Exception {
+        Predicate<Method> predicate = MethodCoercions.matchSingleCollectionParameterMethod("singleCollectionParameterMethod", ImmutableList.of("42"));
+        assertFalse(predicate.apply(singleParameterMethod));
+        assertFalse(predicate.apply(multiParameterMethod));
+        assertTrue(predicate.apply(singleCollectionParameterMethod));
+    }
+
+    @Test
+    public void testTryFindAndInvokeSingleCollectionParameterMethod() throws Exception {
+        TestClass instance = new TestClass();
+        Maybe<?> maybe = MethodCoercions.tryFindAndInvokeSingleCollectionParameterMethod(instance, "singleCollectionParameterMethod", ImmutableList.of("42"));
+        assertTrue(maybe.isPresent());
+        assertTrue(instance.wasSingleCollectionParameterMethodCalled());
+    }
+*/
+    public static class TestClass {
+
+        private boolean singleParameterMethodCalled;
+        private boolean multiParameterMethodCalled;
+        private boolean singleCollectionParameterMethodCalled;
+
+        public void singleParameterMethod(int parameter) {
+            singleParameterMethodCalled = true;
+        }
+
+        public void multiParameterMethod(boolean parameter1, int parameter2) {
+            multiParameterMethodCalled = true;
+        }
+
+        public void singleCollectionParameterMethod(List<String> parameter) {
+            singleCollectionParameterMethodCalled = true;
+        }
+
+        public boolean wasSingleParameterMethodCalled() {
+            return singleParameterMethodCalled;
+        }
+
+        public boolean wasMultiParameterMethodCalled() {
+            return multiParameterMethodCalled;
+        }
+
+        public boolean wasSingleCollectionParameterMethodCalled() {
+            return singleCollectionParameterMethodCalled;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6023536e/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index 7797138..02b7dde 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -25,6 +25,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.jclouds.compute.options.RunScriptOptions.Builder.overrideLoginCredentials;
 import static org.jclouds.scriptbuilder.domain.Statements.exec;
+
+import brooklyn.util.flags.MethodCoercions;
 import io.cloudsoft.winrm4j.pywinrm.Session;
 import io.cloudsoft.winrm4j.pywinrm.WinRMFactory;
 
@@ -1292,45 +1294,8 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                     Class<? extends TemplateOptions> clazz = options.getClass();
                     Iterable<Method> methods = Arrays.asList(clazz.getMethods());
                     for(final Map.Entry<String, Object> option : optionsMap.entrySet()) {
-                        Optional<Method> methodOptional = Iterables.tryFind(methods, new Predicate<Method>() {
-                            @Override
-                            public boolean apply(@Nullable Method input) {
-                                // Matches a method with the expected name, and a single parameter that TypeCoercions
-                                // can coerce to
-                                if (input == null) return false;
-                                if (!input.getName().equals(option.getKey())) return false;
-                                int numOptionParams = option.getValue() instanceof List ? ((List)option.getValue()).size() : 1;
-                                Type[] parameterTypes = input.getGenericParameterTypes();
-                                if (parameterTypes.length != numOptionParams) return false;
-                                if (numOptionParams == 1 && !(option.getValue() instanceof List) && parameterTypes.length == 1) {
-                                    return true;
-                                }
-                                for (int paramCount = 0; paramCount < numOptionParams; paramCount ++) {
-                                    if (!TypeCoercions.tryCoerce(((List)option.getValue()).get(paramCount),
-                                            TypeToken.of(parameterTypes[paramCount])).isPresentAndNonNull()) return false;
-                                }
-                                return true;
-                            }
-                        });
-                        if(methodOptional.isPresent()) {
-                            try {
-                                Method method = methodOptional.get();
-                                if (option.getValue() instanceof List) {
-                                    List<Object> parameters = Lists.newArrayList();
-                                    int numOptionParams = ((List)option.getValue()).size();
-                                    for (int paramCount = 0; paramCount < numOptionParams; paramCount++) {
-                                        parameters.add(TypeCoercions.coerce(((List)option.getValue()).get(paramCount), TypeToken.of(method.getGenericParameterTypes()[paramCount])));
-                                    }
-                                    method.invoke(options, parameters.toArray());
-                                } else {
-                                    method.invoke(options, TypeCoercions.coerce(option.getValue(), TypeToken.of(method.getGenericParameterTypes()[0])));
-                                }
-                            } catch (IllegalAccessException e) {
-                                throw Exceptions.propagate(e);
-                            } catch (InvocationTargetException e) {
-                                throw Exceptions.propagate(e);
-                            }
-                        } else {
+                        Maybe<?> result = MethodCoercions.tryFindAndInvokeBestMatchingMethod(options, option.getKey(), option.getValue());
+                        if(result.isAbsent()) {
                             LOG.warn("Ignoring request to set template option {} because this is not supported by {}", new Object[] { option.getKey(), clazz.getCanonicalName() });
                         }
                     }


[25/50] [abbrv] brooklyn-server git commit: Add another test resource check for the source release

Posted by he...@apache.org.
Add another test resource check for the source release


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

Branch: refs/heads/0.7.0-incubating
Commit: edae75a794d54e1e277f6499ffc4636814db5262
Parents: 6f356e7
Author: Richard Downer <ri...@apache.org>
Authored: Thu Jun 25 14:55:08 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Thu Jun 25 15:22:12 2015 +0100

----------------------------------------------------------------------
 .../java/brooklyn/management/osgi/OsgiVersionMoreEntityTest.java | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/edae75a7/core/src/test/java/brooklyn/management/osgi/OsgiVersionMoreEntityTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/management/osgi/OsgiVersionMoreEntityTest.java b/core/src/test/java/brooklyn/management/osgi/OsgiVersionMoreEntityTest.java
index 78cebd2..6863c4c 100644
--- a/core/src/test/java/brooklyn/management/osgi/OsgiVersionMoreEntityTest.java
+++ b/core/src/test/java/brooklyn/management/osgi/OsgiVersionMoreEntityTest.java
@@ -198,13 +198,15 @@ public class OsgiVersionMoreEntityTest {
     }
 
     public static CatalogItem<?, ?> addMoreEntityV1(ManagementContext mgmt, String versionToRegister) {
-        return addCatalogItemWithNameAndType(mgmt, 
+        TestResourceUnavailableException.throwIfResourceUnavailable(OsgiVersionMoreEntityTest.class, BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
+        return addCatalogItemWithNameAndType(mgmt,
             OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
             versionToRegister,
             OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
             BROOKLYN_TEST_MORE_ENTITIES_V1_URL);
     }
     public static CatalogItem<?, ?> addMoreEntityV2(ManagementContext mgmt, String versionToRegister) {
+        TestResourceUnavailableException.throwIfResourceUnavailable(OsgiVersionMoreEntityTest.class, BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
         return addCatalogItemWithNameAndType(mgmt,
             OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
             versionToRegister,


[16/50] [abbrv] brooklyn-server git commit: set AutoScalerPolicy to have min size default of 1 not 0

Posted by he...@apache.org.
set AutoScalerPolicy to have min size default of 1 not 0

else it might scale to 0 if the metric hits 0, and then it won't usually scale back out as nothing is generating load!


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

Branch: refs/heads/0.7.0-incubating
Commit: 53656bd8528af6a44e08e514ec709143bb821b3b
Parents: 2cc241c
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Jun 22 23:11:09 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:34 2015 -0700

----------------------------------------------------------------------
 .../policy/autoscaling/AutoScalerPolicy.java    | 24 ++++++++++++++++----
 1 file changed, 19 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/53656bd8/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java b/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java
index b693955..f453aa5 100644
--- a/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java
+++ b/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java
@@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import groovy.lang.Closure;
 
 import java.util.Map;
+import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
@@ -35,6 +36,8 @@ import org.slf4j.LoggerFactory;
 import brooklyn.catalog.Catalog;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Entity;
+import brooklyn.entity.basic.BrooklynTaskTags;
+import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.entity.trait.Resizable;
 import brooklyn.entity.trait.Startable;
@@ -51,6 +54,7 @@ import brooklyn.policy.loadbalancing.LoadBalancingPolicy;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.flags.SetFromFlag;
 import brooklyn.util.flags.TypeCoercions;
+import brooklyn.util.task.Tasks;
 import brooklyn.util.time.Duration;
 
 import com.google.common.base.Function;
@@ -88,7 +92,7 @@ public class AutoScalerPolicy extends AbstractPolicy {
         private Entity entityWithMetric;
         private Number metricUpperBound;
         private Number metricLowerBound;
-        private int minPoolSize = 0;
+        private int minPoolSize = 1;
         private int maxPoolSize = Integer.MAX_VALUE;
         private Integer resizeDownIterationIncrement;
         private Integer resizeDownIterationMax;
@@ -357,7 +361,7 @@ public class AutoScalerPolicy extends AbstractPolicy {
     @SetFromFlag("minPoolSize")
     public static final ConfigKey<Integer> MIN_POOL_SIZE = BasicConfigKey.builder(Integer.class)
             .name("autoscaler.minPoolSize")
-            .defaultValue(0)
+            .defaultValue(1)
             .reconfigurable(true)
             .build();
     
@@ -1034,7 +1038,7 @@ public class AutoScalerPolicy extends AbstractPolicy {
     private void resizeNow() {
         long currentPoolSize = getCurrentSizeOperator().apply(poolEntity);
         CalculatedDesiredPoolSize calculatedDesiredPoolSize = calculateDesiredPoolSize(currentPoolSize);
-        long desiredPoolSize = calculatedDesiredPoolSize.size;
+        final long desiredPoolSize = calculatedDesiredPoolSize.size;
         boolean stable = calculatedDesiredPoolSize.stable;
         
         if (!stable) {
@@ -1054,8 +1058,18 @@ public class AutoScalerPolicy extends AbstractPolicy {
         if (LOG.isDebugEnabled()) LOG.debug("{} requesting resize to {}; current {}, min {}, max {}", 
                 new Object[] {this, desiredPoolSize, currentPoolSize, getMinPoolSize(), getMaxPoolSize()});
         
-        // TODO Should we use int throughout, rather than casting here?
-        getResizeOperator().resize(poolEntity, (int) desiredPoolSize);
+        Entities.submit(entity, Tasks.<Void>builder().name("Auto-scaler")
+            .description("Auto-scaler recommending resize from "+currentPoolSize+" to "+desiredPoolSize)
+            .tag(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG)
+            .body(new Callable<Void>() {
+                @Override
+                public Void call() throws Exception {
+                    // TODO Should we use int throughout, rather than casting here?
+                    getResizeOperator().resize(poolEntity, (int) desiredPoolSize);
+                    return null;
+                }
+            }).build())
+            .blockUntilEnded();
     }
     
     /**


[10/50] [abbrv] brooklyn-server git commit: in VanillaSoftware, look at shell.env for custom install and customize scripts

Posted by he...@apache.org.
in VanillaSoftware, look at shell.env for custom install and customize scripts


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

Branch: refs/heads/0.7.0-incubating
Commit: e57984123f52b774700e53083aa86a05ce67c2bf
Parents: 5690992
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Jun 20 14:30:33 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:33 2015 -0700

----------------------------------------------------------------------
 .../brooklyn/entity/basic/VanillaSoftwareProcessSshDriver.java    | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e5798412/software/base/src/main/java/brooklyn/entity/basic/VanillaSoftwareProcessSshDriver.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/basic/VanillaSoftwareProcessSshDriver.java b/software/base/src/main/java/brooklyn/entity/basic/VanillaSoftwareProcessSshDriver.java
index 004daa1..ac29a87 100644
--- a/software/base/src/main/java/brooklyn/entity/basic/VanillaSoftwareProcessSshDriver.java
+++ b/software/base/src/main/java/brooklyn/entity/basic/VanillaSoftwareProcessSshDriver.java
@@ -85,6 +85,7 @@ public class VanillaSoftwareProcessSshDriver extends AbstractSoftwareProcessSshD
         if (Strings.isNonBlank(installCommand)) {
             newScript(INSTALLING)
                 .failOnNonZeroResultCode()
+                .environmentVariablesReset(getShellEnvironment())
                 .body.append(installCommand)
                 .execute();
         }
@@ -106,8 +107,6 @@ public class VanillaSoftwareProcessSshDriver extends AbstractSoftwareProcessSshD
         if (Strings.isNonBlank(customizeCommand)) {
             newScript(CUSTOMIZING)
                 .failOnNonZeroResultCode()
-                // don't set vars yet -- it resolves dependencies (e.g. DB) which we don't want until we start
-                .environmentVariablesReset()
                 .body.append(customizeCommand)
                 .execute();
         }


[48/50] [abbrv] brooklyn-server git commit: Fix surefire config for release

Posted by he...@apache.org.
Fix surefire config for release

Backport of fix on master by Hadrian Zbarcea <ha...@apache.org>


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

Branch: refs/heads/0.7.0-incubating
Commit: 6b7d6002a0c0c50f73cea6cf487030d176b74d9a
Parents: 81431cc
Author: Hadrian Zbarcea <ha...@apache.org>
Authored: Sat Jul 11 20:42:09 2015 -0400
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jul 15 08:22:09 2015 +0000

----------------------------------------------------------------------
 parent/pom.xml | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6b7d6002/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 07ccb50..f723c34 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -64,6 +64,7 @@
         <ant.version>1.8.4</ant.version>
         <includedTestGroups />
         <excludedTestGroups>Integration,Acceptance,Live,WIP</excludedTestGroups>
+        <surefire.failIfNoSpecifiedTests>false</surefire.failIfNoSpecifiedTests>
 
         <!-- Dependencies -->
         <brooklyn.version>0.7.0-incubating</brooklyn.version>  <!-- BROOKLYN_VERSION -->


[31/50] [abbrv] brooklyn-server git commit: Avoid the usage of remote services, replace with local server

Posted by he...@apache.org.
Avoid the usage of remote services, replace with local server

Remote service echo.jsontest.com has low quota leading to failing tests when exceeded. Replace with a local server, returning the same repsonse. As a bonus the test can be run as a unit test.
Also remove code duplication, move common code to TestHttpServer.


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

Branch: refs/heads/0.7.0-incubating
Commit: c631e4daa58c64544040711388ecf3b1ddf52c77
Parents: 07eca7b
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Thu Jun 25 23:48:37 2015 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Jun 25 23:48:37 2015 +0300

----------------------------------------------------------------------
 .../brooklyn/test/TestHttpRequestHandler.java   |  73 ++++++++++
 .../test/java/brooklyn/test/TestHttpServer.java | 144 +++++++++++++++++++
 .../brooklyn/util/ResourceUtilsHttpTest.java    |  84 +++--------
 .../software/http/HttpRequestSensorTest.java    |  20 ++-
 .../rest/resources/CatalogResetTest.java        |  83 ++---------
 5 files changed, 261 insertions(+), 143 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c631e4da/core/src/test/java/brooklyn/test/TestHttpRequestHandler.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/test/TestHttpRequestHandler.java b/core/src/test/java/brooklyn/test/TestHttpRequestHandler.java
new file mode 100644
index 0000000..1a6c766
--- /dev/null
+++ b/core/src/test/java/brooklyn/test/TestHttpRequestHandler.java
@@ -0,0 +1,73 @@
+/*
+ * 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 brooklyn.test;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpRequestHandler;
+
+import brooklyn.util.exceptions.Exceptions;
+
+public class TestHttpRequestHandler implements HttpRequestHandler {
+    private HttpEntity entity;
+    private int responseCode = HttpStatus.SC_OK;
+    private Collection<Header> headers = new ArrayList<Header>();
+
+    public TestHttpRequestHandler response(String response) {
+        try {
+            this.entity = new StringEntity(response);
+        } catch (UnsupportedEncodingException e) {
+            throw Exceptions.propagate(e);
+        }
+        return this;
+    }
+
+    public TestHttpRequestHandler code(int responseCode) {
+        this.responseCode = responseCode;
+        return this;
+    }
+
+    public TestHttpRequestHandler header(String name, String value) {
+        headers.add(new BasicHeader(name, value));
+        return this;
+    }
+
+    @Override
+    public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
+        for (Header h : headers) {
+            response.setHeader(h);
+        }
+
+        response.setStatusCode(responseCode);
+        response.setEntity(entity);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c631e4da/core/src/test/java/brooklyn/test/TestHttpServer.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/test/TestHttpServer.java b/core/src/test/java/brooklyn/test/TestHttpServer.java
new file mode 100644
index 0000000..51e827c
--- /dev/null
+++ b/core/src/test/java/brooklyn/test/TestHttpServer.java
@@ -0,0 +1,144 @@
+/*
+ * 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 brooklyn.test;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.http.HttpRequestInterceptor;
+import org.apache.http.HttpResponseInterceptor;
+import org.apache.http.impl.bootstrap.HttpServer;
+import org.apache.http.impl.bootstrap.ServerBootstrap;
+import org.apache.http.protocol.HttpProcessor;
+import org.apache.http.protocol.HttpRequestHandler;
+import org.apache.http.protocol.ImmutableHttpProcessor;
+import org.apache.http.protocol.ResponseConnControl;
+import org.apache.http.protocol.ResponseContent;
+
+import brooklyn.util.collections.MutableList;
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.net.Networking;
+
+public class TestHttpServer {
+    private static class HandlerTuple {
+        String path;
+        HttpRequestHandler handler;
+        public HandlerTuple(String path, HttpRequestHandler handler) {
+            this.path = path;
+            this.handler = handler;
+        }
+    }
+    private HttpServer server;
+    private List<HttpRequestInterceptor> requestInterceptors = MutableList.of();
+    private List<HttpResponseInterceptor> responseInterceptors = MutableList.of(new ResponseContent(), new ResponseConnControl());
+    private int basePort = 50505;
+    private Collection<HandlerTuple> handlers = MutableList.of();
+
+    public TestHttpServer interceptor(HttpResponseInterceptor interceptor) {
+        checkNotStarted();
+        responseInterceptors.add(interceptor);
+        return this;
+    }
+
+    public TestHttpServer requestInterceptors(List<HttpResponseInterceptor> interceptors) {
+        checkNotStarted();
+        this.responseInterceptors = interceptors;
+        return this;
+    }
+
+    public TestHttpServer interceptor(HttpRequestInterceptor interceptor) {
+        checkNotStarted();
+        requestInterceptors.add(interceptor);
+        return this;
+    }
+
+    public TestHttpServer responseInterceptors(List<HttpRequestInterceptor> interceptors) {
+        checkNotStarted();
+        this.requestInterceptors = interceptors;
+        return this;
+    }
+
+    public TestHttpServer basePort(int basePort) {
+        checkNotStarted();
+        this.basePort = basePort;
+        return this;
+    }
+
+    public TestHttpServer handler(String path, HttpRequestHandler handler) {
+        checkNotStarted();
+        handlers.add(new HandlerTuple(path, handler));
+        return this;
+    }
+
+    public TestHttpServer start() {
+        checkNotStarted();
+
+        HttpProcessor httpProcessor = new ImmutableHttpProcessor(requestInterceptors, responseInterceptors);
+        int port = Networking.nextAvailablePort(basePort);
+        ServerBootstrap bootstrap = ServerBootstrap.bootstrap()
+            .setListenerPort(port)
+            .setLocalAddress(getLocalAddress())
+            .setHttpProcessor(httpProcessor);
+
+        for (HandlerTuple tuple : handlers) {
+            bootstrap.registerHandler(tuple.path, tuple.handler);
+        }
+        server = bootstrap.create();
+
+        try {
+            server.start();
+        } catch (IOException e) {
+            throw Exceptions.propagate(e);
+        }
+
+        return this;
+    }
+
+    public void stop() {
+        server.stop();
+    }
+
+    private void checkNotStarted() {
+        if (server != null) {
+            throw new IllegalStateException("Server already started");
+        }
+    }
+
+    private InetAddress getLocalAddress() {
+        try {
+            return InetAddress.getLocalHost();
+        } catch (UnknownHostException e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+
+    public String getUrl() {
+        try {
+            return new URL("http", server.getInetAddress().getHostAddress(), server.getLocalPort(), "").toExternalForm();
+        } catch (MalformedURLException e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c631e4da/core/src/test/java/brooklyn/util/ResourceUtilsHttpTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/ResourceUtilsHttpTest.java b/core/src/test/java/brooklyn/util/ResourceUtilsHttpTest.java
index 2c5da32..daac00a 100644
--- a/core/src/test/java/brooklyn/util/ResourceUtilsHttpTest.java
+++ b/core/src/test/java/brooklyn/util/ResourceUtilsHttpTest.java
@@ -24,62 +24,49 @@ import static org.testng.Assert.assertFalse;
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.apache.http.Header;
 import org.apache.http.HttpException;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
 import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.bootstrap.HttpServer;
-import org.apache.http.impl.bootstrap.ServerBootstrap;
 import org.apache.http.localserver.RequestBasicAuth;
 import org.apache.http.localserver.ResponseBasicUnauthorized;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.protocol.BasicHttpProcessor;
 import org.apache.http.protocol.HttpContext;
 import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.protocol.ResponseConnControl;
-import org.apache.http.protocol.ResponseContent;
 import org.apache.http.protocol.ResponseServer;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import brooklyn.test.TestHttpRequestHandler;
+import brooklyn.test.TestHttpServer;
 import brooklyn.util.stream.Streams;
 import brooklyn.util.text.Strings;
 
 public class ResourceUtilsHttpTest {
     private ResourceUtils utils;
-    private HttpServer server;
+    private TestHttpServer server;
     private String baseUrl;
 
     @BeforeClass(alwaysRun=true)
     public void setUp() throws Exception {
         utils = ResourceUtils.create(this, "mycontext");
-
-        BasicHttpProcessor httpProcessor = new BasicHttpProcessor();
-        httpProcessor.addInterceptor(new ResponseServer());
-        httpProcessor.addInterceptor(new ResponseContent());
-        httpProcessor.addInterceptor(new ResponseConnControl());
-        httpProcessor.addInterceptor(new RequestBasicAuth());
-        httpProcessor.addInterceptor(new ResponseBasicUnauthorized());
-
-        server = ServerBootstrap.bootstrap()
-                .setListenerPort(24266)
-                .setHttpProcessor(httpProcessor)
-                .registerHandler("/simple", new SimpleResponseHandler("OK"))
-                .registerHandler("/empty", new SimpleResponseHandler(HttpStatus.SC_NO_CONTENT, ""))
-                .registerHandler("/missing", new SimpleResponseHandler(HttpStatus.SC_NOT_FOUND, "Missing"))
-                .registerHandler("/redirect", new SimpleResponseHandler(HttpStatus.SC_MOVED_TEMPORARILY, "Redirect", new BasicHeader("Location", "/simple")))
-                .registerHandler("/cycle", new SimpleResponseHandler(HttpStatus.SC_MOVED_TEMPORARILY, "Redirect", new BasicHeader("Location", "/cycle")))
-                .registerHandler("/secure", new SimpleResponseHandler(HttpStatus.SC_MOVED_TEMPORARILY, "Redirect", new BasicHeader("Location", "https://0.0.0.0/")))
-                .registerHandler("/auth", new AuthHandler("test", "test", "OK"))
-                .registerHandler("/auth_escape", new AuthHandler("test@me:/", "test", "OK"))
-                .registerHandler("/auth_escape2", new AuthHandler("test@me:test", "", "OK"))
-                .registerHandler("/no_credentials", new CheckNoCredentials())
-                .create();
-        server.start();
-        baseUrl = "http://" + server.getInetAddress().getHostName() + ":" + server.getLocalPort();
+        server = new TestHttpServer()
+            .interceptor(new ResponseServer())
+            .interceptor(new ResponseBasicUnauthorized())
+            .interceptor(new RequestBasicAuth())
+            .handler("/simple", new TestHttpRequestHandler().response("OK"))
+            .handler("/empty", new TestHttpRequestHandler().code(HttpStatus.SC_NO_CONTENT))
+            .handler("/missing", new TestHttpRequestHandler().code(HttpStatus.SC_NOT_FOUND).response("Missing"))
+            .handler("/redirect", new TestHttpRequestHandler().code(HttpStatus.SC_MOVED_TEMPORARILY).response("Redirect").header("Location", "/simple"))
+            .handler("/cycle", new TestHttpRequestHandler().code(HttpStatus.SC_MOVED_TEMPORARILY).response("Redirect").header("Location", "/cycle"))
+            .handler("/secure", new TestHttpRequestHandler().code(HttpStatus.SC_MOVED_TEMPORARILY).response("Redirect").header("Location", "https://0.0.0.0/"))
+            .handler("/auth", new AuthHandler("test", "test", "OK"))
+            .handler("/auth_escape", new AuthHandler("test@me:/", "test", "OK"))
+            .handler("/auth_escape2", new AuthHandler("test@me:test", "", "OK"))
+            .handler("/no_credentials", new CheckNoCredentials())
+            .start();
+        baseUrl = server.getUrl();
     }
 
     @AfterClass(alwaysRun=true)
@@ -161,38 +148,6 @@ public class ResourceUtilsHttpTest {
         assertFalse(contents.contains("bit.ly"), "contents="+contents);
     }
 
-    private static class SimpleResponseHandler implements HttpRequestHandler {
-        private int statusCode = HttpStatus.SC_OK;
-        private String responseBody = "";
-        private Header[] headers;
-
-        protected SimpleResponseHandler(String response) {
-            this.responseBody = response;
-        }
-
-        protected SimpleResponseHandler(int status, String response) {
-            this.statusCode = status;
-            this.responseBody = response;
-        }
-
-        protected SimpleResponseHandler(int status, String response, Header... headers) {
-            this.statusCode = status;
-            this.responseBody = response;
-            this.headers = headers;
-        }
-
-        @Override
-        public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
-            response.setStatusCode(statusCode);
-            response.setEntity(new StringEntity(responseBody));
-            if (headers != null) {
-                for (Header header : headers) {
-                    response.setHeader(header);
-                }
-            }
-        }
-    }
-
     private static class AuthHandler implements HttpRequestHandler {
         private String username;
         private String password;
@@ -204,6 +159,7 @@ public class ResourceUtilsHttpTest {
             this.responseBody = response;
         }
 
+        @Override
         public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
             String creds = (String) context.getAttribute("creds");
             if (creds == null || !creds.equals(getExpectedCredentials())) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c631e4da/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java b/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
index db26223..de60fb1 100644
--- a/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
+++ b/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
@@ -19,7 +19,7 @@
 package brooklyn.entity.software.http;
 
 import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import brooklyn.entity.basic.Attributes;
@@ -30,6 +30,8 @@ import brooklyn.event.AttributeSensor;
 import brooklyn.event.basic.Sensors;
 import brooklyn.location.Location;
 import brooklyn.test.EntityTestUtils;
+import brooklyn.test.TestHttpRequestHandler;
+import brooklyn.test.TestHttpServer;
 import brooklyn.test.entity.TestApplication;
 import brooklyn.test.entity.TestEntity;
 import brooklyn.util.config.ConfigBag;
@@ -44,8 +46,16 @@ public class HttpRequestSensorTest {
     private TestApplication app;
     private EntityLocal entity;
 
-    @BeforeMethod(alwaysRun=true)
+    private TestHttpServer server;
+    private String serverUrl;
+
+    @BeforeClass(alwaysRun=true)
     public void setUp() throws Exception {
+        server = new TestHttpServer()
+            .handler("/myKey/myValue", new TestHttpRequestHandler().header("Content-Type", "application/json").response("{\"myKey\":\"myValue\"}"))
+            .start();
+        serverUrl = server.getUrl();
+
         app = TestApplication.Factory.newManagedInstanceForTests();
         entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
                 .location(app.newLocalhostProvisioningLocation().obtain()));
@@ -55,19 +65,21 @@ public class HttpRequestSensorTest {
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
         if (app != null) Entities.destroyAll(app.getManagementContext());
+        server.stop();
     }
 
-    @Test(groups="Integration")
+    @Test
     public void testHttpSensor() throws Exception {
         HttpRequestSensor<Integer> sensor = new HttpRequestSensor<Integer>(ConfigBag.newInstance()
                 .configure(HttpRequestSensor.SENSOR_PERIOD, Duration.millis(100))
                 .configure(HttpRequestSensor.SENSOR_NAME, SENSOR_STRING.getName())
                 .configure(HttpRequestSensor.SENSOR_TYPE, TARGET_TYPE)
                 .configure(HttpRequestSensor.JSON_PATH, "$.myKey")
-                .configure(HttpRequestSensor.SENSOR_URI, "http://echo.jsontest.com/myKey/myValue"));
+                .configure(HttpRequestSensor.SENSOR_URI, serverUrl + "/myKey/myValue"));
         sensor.apply(entity);
         entity.setAttribute(Attributes.SERVICE_UP, true);
 
         EntityTestUtils.assertAttributeEqualsEventually(entity, SENSOR_STRING, "myValue");
     }
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c631e4da/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResetTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResetTest.java b/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResetTest.java
index 1c4f6ff..e4cc015 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResetTest.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResetTest.java
@@ -20,46 +20,24 @@ package brooklyn.rest.resources;
 
 import static org.testng.Assert.assertNotNull;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.InetAddress;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-
 import javax.ws.rs.core.MediaType;
 
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.bootstrap.HttpServer;
-import org.apache.http.impl.bootstrap.ServerBootstrap;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpProcessor;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.protocol.ImmutableHttpProcessor;
-import org.apache.http.protocol.ResponseConnControl;
-import org.apache.http.protocol.ResponseContent;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import brooklyn.catalog.BrooklynCatalog;
 import brooklyn.rest.testing.BrooklynRestResourceTest;
+import brooklyn.test.TestHttpRequestHandler;
+import brooklyn.test.TestHttpServer;
 import brooklyn.util.ResourceUtils;
-import brooklyn.util.exceptions.Exceptions;
-import brooklyn.util.net.Networking;
 
 import com.sun.jersey.api.client.UniformInterfaceException;
 
 public class CatalogResetTest extends BrooklynRestResourceTest {
 
-    private HttpServer server;
+    private TestHttpServer server;
     private String serverUrl;
 
     @BeforeClass(alwaysRun=true)
@@ -67,20 +45,11 @@ public class CatalogResetTest extends BrooklynRestResourceTest {
     public void setUp() throws Exception {
         useLocalScannedCatalog();
         super.setUp();
-        HttpProcessor httpProcessor = new ImmutableHttpProcessor(
-                new ResponseContent(),
-                new ResponseConnControl());
-
-        int port = Networking.nextAvailablePort(50505);
-        server = ServerBootstrap.bootstrap()
-            .setListenerPort(port)
-            .setLocalAddress(InetAddress.getLocalHost())
-            .setHttpProcessor(httpProcessor)
-            .registerHandler("/404", new ResponseHandler().code(HttpStatus.SC_NOT_FOUND).response("Not Found"))
-            .registerHandler("/200", new ResponseHandler().response("OK"))
-            .create();
-        server.start();
-        serverUrl = new URL("http", server.getInetAddress().getHostAddress(), server.getLocalPort(), "").toExternalForm();
+        server = new TestHttpServer()
+            .handler("/404", new TestHttpRequestHandler().code(HttpStatus.SC_NOT_FOUND).response("Not Found"))
+            .handler("/200", new TestHttpRequestHandler().response("OK"))
+            .start();
+        serverUrl = server.getUrl();
     }
 
     @Override
@@ -141,40 +110,4 @@ public class CatalogResetTest extends BrooklynRestResourceTest {
         assertNotNull(catalog.getCatalogItem("brooklyn.osgi.tests.SimpleApplication", BrooklynCatalog.DEFAULT_VERSION));
     }
 
-    private static class ResponseHandler implements HttpRequestHandler {
-        private HttpEntity entity;
-        private int responseCode = HttpStatus.SC_OK;
-        private Collection<Header> headers = new ArrayList<Header>();
-
-        public ResponseHandler response(String response) {
-            try {
-                this.entity = new StringEntity(response);
-            } catch (UnsupportedEncodingException e) {
-                throw Exceptions.propagate(e);
-            }
-            return this;
-        }
-
-        public ResponseHandler code(int responseCode) {
-            this.responseCode = responseCode;
-            return this;
-        }
-
-        @SuppressWarnings("unused")
-        public ResponseHandler header(String name, String value) {
-            headers.add(new BasicHeader(name, value));
-            return this;
-        }
-
-        @Override
-        public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
-            for (Header h : headers) {
-                response.setHeader(h);
-            }
-
-            response.setStatusCode(responseCode);
-            response.setEntity(entity);
-        }
-
-    }
 }


[17/50] [abbrv] brooklyn-server git commit: expand the default catalog to have several nice example templates

Posted by he...@apache.org.
expand the default catalog to have several nice example templates


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

Branch: refs/heads/0.7.0-incubating
Commit: 2cc241cef9f7d5247b1a285b3b0ba7d99a55db69
Parents: 5eefb7b
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Jun 19 05:04:12 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:34 2015 -0700

----------------------------------------------------------------------
 .../main/resources/brooklyn/default.catalog.bom | 342 ++++++++++++++++++-
 1 file changed, 330 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2cc241ce/usage/cli/src/main/resources/brooklyn/default.catalog.bom
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/resources/brooklyn/default.catalog.bom b/usage/cli/src/main/resources/brooklyn/default.catalog.bom
index 42672ae..4da8319 100644
--- a/usage/cli/src/main/resources/brooklyn/default.catalog.bom
+++ b/usage/cli/src/main/resources/brooklyn/default.catalog.bom
@@ -17,25 +17,343 @@ brooklyn.catalog:
       type: brooklyn.entity.basic.EmptySoftwareProcess
       name: Server
 
-  - id: server-template
+  - id: vanilla-bash-server
+    description: |
+      Provision a server, with customizable provisioning.properties and credentials installed, 
+      but no other special software process or scripts executed.
+      The script should be supplied in "launch.command" as per docs on
+      brooklyn.entity.basic.VanillaSoftwareProcess.
+    item:
+      type: brooklyn.entity.basic.VanillaSoftwareProcess
+      name: Server with Launch Script (bash)
+
+  - id: load-balancer
+    description: |
+      Create a load balancer which will point at members in the group entity
+      referred to by the config key "serverPool". 
+      The sensor advertising the port can be configured with the "member.sensor.portNumber" config key,
+      defaulting to `http.port`; all member entities which have published "service.up" will then be picked up.
+    item:
+      type: brooklyn.entity.proxy.nginx.NginxController
+      name: Load Balancer (nginx)
+
+  - id: cluster
+    description: |
+      Create a cluster of entities, resizable, with starting size "initialSize",
+      and using a spec supplied in the "memberSpec" key.
+    item:
+      type: brooklyn.entity.group.DynamicCluster
+
+  - id: 1-server-template
     itemType: template
-    name: Server Template
+    name: "Template 1: Server"
     description: |
       Sample YAML to provision a server in a cloud with illustrative VM properties
     item:
-      name: My App with a single VM
+      name: Server (Brooklyn Example)
+      
+      # this basic example shows how Brooklyn can provision a single raw VM
+      # in the cloud or location of your choice
+      
       services:
-      - type: server
-        name: My VM
+      - type:           server
+        name:           My VM
+      
+      # location can be `softlayer` or `jclouds:openstack-nova:https://9.9.9.9:9999/v2.0/`,
+      # or `localhost` or `byon: { nodes: [ 10.0.0.1, 10.0.0.2, 10.0.1.{1,2} ] }` 
       location:
         jclouds:aws-ec2:
-          identity: <REPLACE>
-          credential: <REPLACE>
-          region: eu-west-1
+          # edit these to use your credential(or delete if credentials specified in brooklyn.properties)      
+          identity:     <REPLACE>
+          credential:   <REPLACE>
+          
+          region:       eu-west-1
+          
           # we want Ubuntu, with a lot of RAM
-          osFamily: ubuntu
-          minRam: 8gb
+          osFamily:     ubuntu
+          minRam:       8gb
+          
           # set up this user and password (default is to authorize a public key)
-          user: sample
-          password: s4mpl3
+          user:         sample
+          password:     s4mpl3
+
+  - id: 2-bash-web-server-template
+    itemType: template
+    name: "Template 2: Bash Web Server"
+    description: |
+      Sample YAML building on Template 1, 
+      adding bash commands to launch a Python-based web server
+      on port 8020
+    item:
+      name: Python Web Server (Brooklyn Example)
+      
+      # this example builds on the previous one, 
+      # adding some scripts to initialize the VM
+      
+      services:
+      - type:           vanilla-bash-server
+        name:           My Bash Web Server VM
+        brooklyn.config:
+          install.command: |
+            # install python if not present
+            which python || \
+              { apt-get update && apt-get install python ; } || \
+              { yum update && yum install python ; } || \
+              { echo WARNING: cannot install python && exit 1 ; }
 
+          customize.command: |
+            # create the web page to serve
+            cat > index.html << EOF
+            
+            Hello world.
+            <p>
+            I am ${ENTITY_INFO}, ${MESSAGE:-a Brooklyn sample}.
+            <p>
+            Created at: `date`
+            <p>
+            I am running at ${HOSTNAME}, with on-box IP configuration:
+            <pre>
+            `ifconfig | grep inet`
+            </pre>
+            
+            EOF
+
+          launch.command: |
+            # launch in background (ensuring no streams open), and record PID to file
+            nohup python -m SimpleHTTPServer ${PORT:-8020} < /dev/null > output.txt 2>&1 &
+            echo $! > ${PID_FILE:-pid.txt}
+            sleep 5
+            ps -p `cat ${PID_FILE:-pid.txt}`
+            if [ $? -ne 0 ] ; then
+              cat output.txt
+              echo WARNING: python web server not running
+              exit 1
+            fi
+            
+          shell.env:
+            HOSTNAME:     $brooklyn:attributeWhenReady("host.name")
+            PORT:         $brooklyn:config("my.app.port")
+            ENTITY_INFO:  $brooklyn:component("this", "")
+            MESSAGE:      $brooklyn:config("my.message")
+            
+          # custom 
+          my.app.port:  8020
+          my.message:   "good to meet you"
+        
+        brooklyn.enrichers:
+        # publish the URL as a sensor; the GUI will pick this up (main.uri)
+        - type: brooklyn.enricher.basic.Transformer
+          brooklyn.config:
+            uniqueTag: url-generator
+            enricher.sourceSensor: host.subnet.hostname
+            # use the definition from Attributes class, as it has a RendererHint so GUI makes it a link
+            enricher.targetSensor: $brooklyn:sensor("brooklyn.entity.basic.Attributes", "main.uri")
+            enricher.targetValue: 
+              $brooklyn:formatString:
+              - "http://%s:%s/" 
+              - $brooklyn:attributeWhenReady("host.subnet.hostname")
+              - $brooklyn:config("my.app.port")
+      
+      location:
+        jclouds:aws-ec2:
+          region:       eu-west-1
+          # edit these (or delete if credentials specified in brooklyn.properties)      
+          identity:     <REPLACE>
+          credential:   <REPLACE>
+        
+  - id: 3-bash-web-and-riak-template
+    itemType: template
+    name: "Template 3: Bash Web Server and Scaling Riak Cluster"
+    description: |
+      Sample YAML building on Template 2, 
+      composing that blueprint with a Riak cluster and injecting the URL
+    item:
+      name: Bash Web Server and Riak Cluster (Brooklyn Example)
+    
+      # this example *references* the previous one, 
+      # combining it with a stock blueprint for a Riak cluster,
+      # and shows how a sensor from the latter can be injected
+      
+      services:
+      
+      # reference template 2, overriding message to point at riak 
+      - type:           2-bash-web-server-template
+        brooklyn.config:
+          my.message:   $brooklyn:formatString("connected to Riak at %s",
+                            $brooklyn:entity("riak-cluster").attributeWhenReady("main.uri"))
+                            
+      # use the off-the-shelf Riak cluster
+      - type:           brooklyn.entity.nosql.riak.RiakCluster
+        id:             riak-cluster
+        initialSize:    3
+        # and add a policy to scale based on ops per minute
+        brooklyn.policies:
+        - type: brooklyn.policy.autoscaling.AutoScalerPolicy
+          brooklyn.config:
+            metric: riak.node.ops.1m.perNode
+            # more than 100 ops per second (6k/min) scales out, less than 50 scales back
+            # up to a max of 8 riak nodes here (can be changed in GUI / REST API afterwards)
+            metricLowerBound: 3000
+            metricUpperBound: 6000
+            minPoolSize: 3
+            maxPoolSize: 8
+            resizeUpStabilizationDelay: 30s
+            resizeDownStabilizationDelay: 5m
+          
+      location:
+        jclouds:aws-ec2:
+          region:       eu-west-1
+          # edit these (or delete if credentials specified in brooklyn.properties)      
+          identity:     <REPLACE>
+          credential:   <REPLACE>
+
+  - id: 4-resilient-bash-web-cluster-template
+    itemType: template
+    name: "Template 4: Resilient Load-Balanced Bash Web Cluster with Sensors"
+    description: |
+      Sample YAML to provision a cluster of the bash/python web server nodes,
+      with sensors configured, and a load balancer pointing at them,
+      and resilience policies for node replacement and scaling
+    item:
+      name: Resilient Load-Balanced Bash Web Cluster (Brooklyn Example)
+      
+      # this final example shows some of the advanced functionality:
+      # defining custom sensors, and a cluster with a "spec", 
+      # policies for resilience and scaling based on that sensor,
+      # and wiring a load balancer in front of the cluster
+      
+      # combining this with the riak cluster in the previous example
+      # is left as a suggested exercise for the user
+      
+      services:
+      
+      # define a cluster of the web nodes
+      - type:           cluster
+        name:           Cluster of Bash Web Nodes
+        id:             my-web-cluster
+        brooklyn.config:
+          initialSize:  1
+          memberSpec:
+            $brooklyn:entitySpec:
+              # template 2 is used as the spec for items in this cluster
+              # with a new message overwriting the previous,
+              # and a lot of sensors defined
+              type:           2-bash-web-server-template
+              name:           My Bash Web Server VM with Sensors
+              
+              brooklyn.config:
+                my.message:   "part of the cluster"
+              
+              brooklyn.initializers:
+              # make a simple request-count sensor, by counting the number of 200 responses in output.txt
+              - type: brooklyn.entity.software.ssh.SshCommandSensor
+                brooklyn.config:
+                  name: reqs.count
+                  targetType: int
+                  period: 5s
+                  command: "cat output.txt | grep HTTP | grep 200 | wc | awk '{print $1}'"
+              # and publish the port as a sensor so the load-balancer can pick it up
+              - type:           brooklyn.entity.software.StaticSensor
+                brooklyn.config:
+                  name:         app.port
+                  targetType:   int
+                  static.value: $brooklyn:config("my.app.port")
+              
+              brooklyn.enrichers:
+              # derive reqs.per_sec from reqs.count
+              - type: brooklyn.enricher.basic.YamlTimeWeightedDeltaEnricher
+                brooklyn.config:
+                  enricher.sourceSensor: reqs.count
+                  enricher.targetSensor: reqs.per_sec
+                  enricher.delta.period: 1s
+              # and take an average over 30s for reqs.per_sec into reqs.per_sec.windowed_30s
+              - type: brooklyn.enricher.basic.YamlRollingTimeWindowMeanEnricher
+                brooklyn.config:
+                  enricher.sourceSensor: reqs.per_sec
+                  enricher.targetSensor: reqs.per_sec.windowed_30s
+                  enricher.window.duration: 30s
+              
+              # emit failure sensor if a failure connecting to the service is sustained for 30s
+              - type: brooklyn.policy.ha.ServiceFailureDetector
+                brooklyn.config:
+                  entityFailed.stabilizationDelay: 30s
+            
+              brooklyn.policies:
+              # restart if a failure is detected (with a max of one restart in 2m, sensor will propagate otherwise) 
+              - type: brooklyn.policy.ha.ServiceRestarter
+                brooklyn.config:
+                  failOnRecurringFailuresInThisDuration: 2m
+        
+        # back at the cluster, create a total per-sec and some per-node average
+        brooklyn.enrichers:
+        - type: brooklyn.enricher.basic.Aggregator
+          brooklyn.config:
+            enricher.sourceSensor: reqs.per_sec
+            enricher.targetSensor: reqs.per_sec
+            transformation: sum
+        - type: brooklyn.enricher.basic.Aggregator
+          brooklyn.config:
+            enricher.sourceSensor: reqs.per_sec
+            enricher.targetSensor: reqs.per_sec.per_node
+            transformation: average
+        - type: brooklyn.enricher.basic.Aggregator
+          brooklyn.config:
+            enricher.sourceSensor: reqs.per_sec.windowed_30s
+            enricher.targetSensor: reqs.per_sec.windowed_30s.per_node
+            transformation: average
+              
+        brooklyn.policies:
+        # resilience: if a per-node restart policy fails,
+        # just throw that node away and create a new one
+        - type: brooklyn.policy.ha.ServiceReplacer
+        
+        # and scale based on reqs/sec
+        - type: brooklyn.policy.autoscaling.AutoScalerPolicy
+          brooklyn.config:
+            # scale based on reqs/sec (though in a real-world situation, 
+            # reqs.per_sec.windowed_30s.per_node might be a better choice) 
+            metric: reqs.per_sec.per_node
+            
+            # really low numbers, so you can trigger a scale-out just by hitting reload a lot
+            metricUpperBound: 3
+            metricLowerBound: 1
+            
+            # sustain 3 reqs/sec for 2s and it will scale out
+            resizeUpStabilizationDelay: 2s
+            # only scale down when sustained for 1m
+            resizeDownStabilizationDelay: 1m
+      
+            maxPoolSize: 10
+            
+      # and add a load-balancer pointing at the cluster
+      - type:           load-balancer
+        id:             load-bal
+        brooklyn.config:
+          # point this load balancer at the cluster, specifying port to forward to
+          loadbalancer.serverpool:  $brooklyn:entity("my-web-cluster")
+          member.sensor.portNumber: app.port
+      
+      brooklyn.enrichers:
+      # publish a few useful info sensors and KPI's to the root of the app
+      - type: brooklyn.enricher.basic.Propagator
+        brooklyn.config:
+          uniqueTag:    propagate-load-balancer-url
+          producer:     $brooklyn:entity("load-bal")
+          propagating:
+          - main.uri
+      - type: brooklyn.enricher.basic.Propagator
+        brooklyn.config:
+          uniqueTag:    propagate-reqs-per-sec
+          producer:     $brooklyn:entity("my-web-cluster")
+          propagating:
+          - reqs.per_sec
+          - reqs.per_sec.windowed_30s.per_node
+      
+      location:
+        jclouds:aws-ec2:
+          # edit these (or delete if credentials specified in brooklyn.properties)      
+          identity:     <REPLACE>
+          credential:   <REPLACE>
+          
+          region:       eu-west-1
+          minRam:       2gb


[07/50] [abbrv] brooklyn-server git commit: exclude bom files from rat check, where these are intended for the user to modify

Posted by he...@apache.org.
exclude bom files from rat check, where these are intended for the user to modify


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

Branch: refs/heads/0.7.0-incubating
Commit: b752d540d6f3df54565c9b7b26edfd7131ef69a0
Parents: d7b73df
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Jun 10 19:00:21 2015 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:32 2015 -0700

----------------------------------------------------------------------
 usage/cli/pom.xml | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b752d540/usage/cli/pom.xml
----------------------------------------------------------------------
diff --git a/usage/cli/pom.xml b/usage/cli/pom.xml
index 451b0ed..ac4f0fc 100644
--- a/usage/cli/pom.xml
+++ b/usage/cli/pom.xml
@@ -165,6 +165,7 @@
                                 i.e. by brooklyn.cli.itemlister.ItemLister
                             -->
                             <exclude>**/src/main/resources/brooklyn/item-lister/statics/style/js/**</exclude>
+                            <exclude>**/*.bom</exclude>
                         </excludes>
                     </configuration>
                 </plugin>


[50/50] [abbrv] brooklyn-server git commit: Remove unnecessary use of snapshot repositories

Posted by he...@apache.org.
Remove unnecessary use of snapshot repositories

Backport of fix on master by Hadrian Zbarcea <ha...@apache.org>


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

Branch: refs/heads/0.7.0-incubating
Commit: f43806c81a901fb7f82e9308b44b1224eb37ee95
Parents: 88a743d
Author: Hadrian Zbarcea <ha...@apache.org>
Authored: Sat Jun 27 09:43:29 2015 -0400
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jul 15 08:22:09 2015 +0000

----------------------------------------------------------------------
 pom.xml | 18 ------------------
 1 file changed, 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f43806c8/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 477817a..5da81cf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,24 +88,6 @@
         </mailingList>
     </mailingLists>
 
-    <repositories>
-        <!-- enable sonatype snapshots repo (only for snapshots) -->
-        <repository>
-            <id>sonatype-nexus-snapshots</id>
-            <name>Sonatype Nexus Snapshots</name>
-            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
-            <releases> <enabled>false</enabled> </releases>
-            <snapshots> <enabled>true</enabled> </snapshots>
-        </repository>
-        <repository>
-            <id>apache-nexus-snapshots</id>
-            <name>Apache Nexus Snapshots</name>
-            <url>https://repository.apache.org/content/repositories/snapshots</url>
-            <releases> <enabled>false</enabled> </releases>
-            <snapshots> <enabled>true</enabled> </snapshots>
-        </repository>
-    </repositories>
-
     <properties>
         <!-- Compilation -->
         <java.version>1.7</java.version>


[33/50] [abbrv] brooklyn-server git commit: Fixes issue where port was not being opened if port range was overridden

Posted by he...@apache.org.
Fixes issue where port was not being opened if port range was overridden


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

Branch: refs/heads/0.7.0-incubating
Commit: fce62e57918e6c5eca9eb8194757defa83ab88bc
Parents: 08d9b7c
Author: Martin Harris <gi...@nakomis.com>
Authored: Thu Jun 25 15:14:30 2015 +0100
Committer: Martin Harris <gi...@nakomis.com>
Committed: Fri Jun 26 12:39:43 2015 +0100

----------------------------------------------------------------------
 .../SameServerDriverLifecycleEffectorTasks.java | 25 +++++++++++++++--
 .../entity/basic/SoftwareProcessImpl.java       | 29 +++++++++++++++-----
 .../entity/basic/SoftwareProcessEntityTest.java | 20 +++++++++++++-
 3 files changed, 64 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fce62e57/software/base/src/main/java/brooklyn/entity/basic/SameServerDriverLifecycleEffectorTasks.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/basic/SameServerDriverLifecycleEffectorTasks.java b/software/base/src/main/java/brooklyn/entity/basic/SameServerDriverLifecycleEffectorTasks.java
index 34c3f04..bb3b1fd 100644
--- a/software/base/src/main/java/brooklyn/entity/basic/SameServerDriverLifecycleEffectorTasks.java
+++ b/software/base/src/main/java/brooklyn/entity/basic/SameServerDriverLifecycleEffectorTasks.java
@@ -29,6 +29,7 @@ import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import com.google.common.reflect.TypeToken;
 
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Entity;
@@ -40,6 +41,8 @@ import brooklyn.location.PortRange;
 import brooklyn.location.basic.LocationConfigKeys;
 import brooklyn.management.TaskAdaptable;
 import brooklyn.util.collections.MutableSet;
+import brooklyn.util.flags.TypeCoercions;
+import brooklyn.util.guava.Maybe;
 import brooklyn.util.task.DynamicTasks;
 
 public class SameServerDriverLifecycleEffectorTasks extends MachineLifecycleEffectorTasks {
@@ -64,9 +67,27 @@ public class SameServerDriverLifecycleEffectorTasks extends MachineLifecycleEffe
     /** @return the ports required for a specific child entity */
     protected Collection<Integer> getRequiredOpenPorts(Entity entity) {
         Set<Integer> ports = MutableSet.of(22);
+        /* TODO: This won't work if there's a port collision, which will cause the corresponding port attribute
+           to be incremented until a free port is found. In that case the entity will use the free port, but the
+           firewall will open the initial port instead. Mostly a problem for SameServerEntity, localhost location.
+        */
+        // TODO: Remove duplication between this and SoftwareProcessImpl.getRequiredOpenPorts
         for (ConfigKey<?> k: entity.getEntityType().getConfigKeys()) {
-            if (PortRange.class.isAssignableFrom(k.getType())) {
-                PortRange p = (PortRange) entity.getConfig(k);
+            Object value;
+            if (PortRange.class.isAssignableFrom(k.getType()) || k.getName().matches(".*\\.port")) {
+                value = entity.config().get(k);
+            } else {
+                // config().get() will cause this to block until all config has been resolved
+                // using config().getRaw(k) means that we won't be able to use e.g. 'http.port: $brooklyn:component("x").attributeWhenReady("foo")'
+                // but that's unlikely to be used
+                Maybe<Object> maybeValue = ((AbstractEntity.BasicConfigurationSupport)entity.config()).getRaw(k);
+                value = maybeValue.isPresent() ? maybeValue.get() : null;
+            }
+
+            Maybe<PortRange> maybePortRange = TypeCoercions.tryCoerce(value, new TypeToken<PortRange>() {});
+
+            if (maybePortRange.isPresentAndNonNull()) {
+                PortRange p = maybePortRange.get();
                 if (p != null && !p.isEmpty()) ports.add(p.iterator().next());
             }
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fce62e57/software/base/src/main/java/brooklyn/entity/basic/SoftwareProcessImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/basic/SoftwareProcessImpl.java b/software/base/src/main/java/brooklyn/entity/basic/SoftwareProcessImpl.java
index a651f65..3d5511f 100644
--- a/software/base/src/main/java/brooklyn/entity/basic/SoftwareProcessImpl.java
+++ b/software/base/src/main/java/brooklyn/entity/basic/SoftwareProcessImpl.java
@@ -18,6 +18,8 @@
  */
 package brooklyn.entity.basic;
 
+import brooklyn.util.flags.TypeCoercions;
+import brooklyn.util.guava.Maybe;
 import groovy.time.TimeDuration;
 
 import java.util.Collection;
@@ -66,6 +68,7 @@ import com.google.common.base.Functions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
+import com.google.common.reflect.TypeToken;
 
 /**
  * An {@link Entity} representing a piece of software which can be installed, run, and controlled.
@@ -448,15 +451,27 @@ public abstract class SoftwareProcessImpl extends AbstractEntity implements Soft
         Set<ConfigKey<?>> configKeys = Sets.newHashSet(allConfig.keySet());
         configKeys.addAll(getEntityType().getConfigKeys());
 
+        /* TODO: This won't work if there's a port collision, which will cause the corresponding port attribute
+           to be incremented until a free port is found. In that case the entity will use the free port, but the
+           firewall will open the initial port instead. Mostly a problem for SameServerEntity, localhost location.
+         */
         for (ConfigKey<?> k: configKeys) {
-            if (PortRange.class.isAssignableFrom(k.getType())) {
-                PortRange p = (PortRange)getConfig(k);
+            Object value;
+            if (PortRange.class.isAssignableFrom(k.getType()) || k.getName().matches(".*\\.port")) {
+                value = config().get(k);
+            } else {
+                // config().get() will cause this to block until all config has been resolved
+                // using config().getRaw(k) means that we won't be able to use e.g. 'http.port: $brooklyn:component("x").attributeWhenReady("foo")'
+                // but that's unlikely to be used
+                Maybe<Object> maybeValue = config().getRaw(k);
+                value = maybeValue.isPresent() ? maybeValue.get() : null;
+            }
+
+            Maybe<PortRange> maybePortRange = TypeCoercions.tryCoerce(value, new TypeToken<PortRange>() {});
+
+            if (maybePortRange.isPresentAndNonNull()) {
+                PortRange p = maybePortRange.get();
                 if (p != null && !p.isEmpty()) ports.add(p.iterator().next());
-            } else if(k.getName().matches(".*\\.port")){
-                Object value = getConfig(k);
-                if (value instanceof Integer){
-                    ports.add((Integer)value);
-                }
             }
         }        
         

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fce62e57/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityTest.java b/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityTest.java
index c503b84..55deb4e 100644
--- a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityTest.java
+++ b/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityTest.java
@@ -30,6 +30,7 @@ import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.proxying.ImplementedBy;
 import brooklyn.entity.software.MachineLifecycleEffectorTasksTest;
 import brooklyn.entity.trait.Startable;
+import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
 import brooklyn.location.Location;
 import brooklyn.location.LocationSpec;
 import brooklyn.location.basic.FixedListMachineProvisioningLocation;
@@ -59,6 +60,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -410,9 +412,18 @@ public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport {
         doTestReleaseEvenIfErrorDuringStop(SimulatedFailInChildOnStopDriver.class);
     }
 
+    @Test
+    public void testOpenPortsWithPortRangeConfig() throws Exception {
+        MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)
+            .configure("http.port", "9999+"));
+        Assert.assertTrue(entity.getRequiredOpenPorts().contains(9999));
+    }
+
     @ImplementedBy(MyServiceImpl.class)
     public interface MyService extends SoftwareProcess {
+        PortAttributeSensorAndConfigKey HTTP_PORT = Attributes.HTTP_PORT;
         public SoftwareProcessDriver getDriver();
+        public Collection<Integer> getRequiredOpenPorts();
     }
 
     public static class MyServiceImpl extends SoftwareProcessImpl implements MyService {
@@ -425,7 +436,14 @@ public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport {
         }
 
         @Override
-        public Class<?> getDriverInterface() { return SimulatedDriver.class; }
+        public Class<?> getDriverInterface() {
+            return SimulatedDriver.class;
+        }
+
+        @Override
+        public Collection<Integer> getRequiredOpenPorts() {
+            return super.getRequiredOpenPorts();
+        }
     }
 
     @ImplementedBy(MyServiceWithVersionImpl.class)


[35/50] [abbrv] brooklyn-server git commit: Merge and close #717

Posted by he...@apache.org.
Merge and close #717


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

Branch: refs/heads/0.7.0-incubating
Commit: 06bef271fa96e8348526780a63c8db79785b5d24
Parents: 6b83a36 fce62e5
Author: Richard Downer <ri...@apache.org>
Authored: Fri Jun 26 14:54:29 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Fri Jun 26 14:54:29 2015 +0100

----------------------------------------------------------------------
 .../SameServerDriverLifecycleEffectorTasks.java | 25 +++++++++++++++--
 .../entity/basic/SoftwareProcessImpl.java       | 29 +++++++++++++++-----
 .../entity/basic/SoftwareProcessEntityTest.java | 20 +++++++++++++-
 3 files changed, 64 insertions(+), 10 deletions(-)
----------------------------------------------------------------------



[13/50] [abbrv] brooklyn-server git commit: more enrichers ease-of-use

Posted by he...@apache.org.
more enrichers ease-of-use

aggregator doesn't require "fromMembers", instead it defaults sensibly,
plus better errors and messages around enrichers and policies


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

Branch: refs/heads/0.7.0-incubating
Commit: 6b09d03f6a147afb21571211ae3e0c1954885a57
Parents: 1e69cc9
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sun Jun 21 10:47:12 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:33 2015 -0700

----------------------------------------------------------------------
 .../enricher/basic/AbstractAggregator.java      | 32 +++++++++++++++-----
 .../enricher/basic/AbstractTransformer.java     |  5 ---
 .../brooklyn/enricher/basic/Aggregator.java     | 18 ++++++++---
 .../java/brooklyn/enricher/basic/Combiner.java  |  1 -
 .../brooklyn/enricher/basic/Transformer.java    |  1 +
 .../entity/basic/ServiceStateLogic.java         |  2 +-
 .../policy/autoscaling/AutoScalerPolicy.java    |  2 +-
 7 files changed, 41 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6b09d03f/core/src/main/java/brooklyn/enricher/basic/AbstractAggregator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/AbstractAggregator.java b/core/src/main/java/brooklyn/enricher/basic/AbstractAggregator.java
index a76a602..951a75c 100644
--- a/core/src/main/java/brooklyn/enricher/basic/AbstractAggregator.java
+++ b/core/src/main/java/brooklyn/enricher/basic/AbstractAggregator.java
@@ -58,9 +58,11 @@ public abstract class AbstractAggregator<T,U> extends AbstractEnricher implement
 
     public static final ConfigKey<Set<? extends Entity>> FROM_HARDCODED_PRODUCERS = ConfigKeys.newConfigKey(new TypeToken<Set<? extends Entity>>() {}, "enricher.aggregating.fromHardcodedProducers");
 
-    public static final ConfigKey<Boolean> FROM_MEMBERS = ConfigKeys.newBooleanConfigKey("enricher.aggregating.fromMembers");
+    public static final ConfigKey<Boolean> FROM_MEMBERS = ConfigKeys.newBooleanConfigKey("enricher.aggregating.fromMembers",
+        "Whether this enricher looks at members; only supported if a Group producer is supplier; defaults to true for Group entities");
 
-    public static final ConfigKey<Boolean> FROM_CHILDREN = ConfigKeys.newBooleanConfigKey("enricher.aggregating.fromChildren");
+    public static final ConfigKey<Boolean> FROM_CHILDREN = ConfigKeys.newBooleanConfigKey("enricher.aggregating.fromChildren",
+        "Whether this enricher looks at children; this is the default for non-Group producers");
 
     public static final ConfigKey<Predicate<? super Entity>> ENTITY_FILTER = ConfigKeys.newConfigKey(new TypeToken<Predicate<? super Entity>>() {}, "enricher.aggregating.entityFilter");
 
@@ -85,8 +87,6 @@ public abstract class AbstractAggregator<T,U> extends AbstractEnricher implement
         if (fromHardcodedProducers == null && producer == null) producer = entity;
         checkState(fromHardcodedProducers != null ^ producer != null, "must specify one of %s (%s) or %s (%s)", 
                 PRODUCER.getName(), producer, FROM_HARDCODED_PRODUCERS.getName(), fromHardcodedProducers);
-        checkState(producer == null || Boolean.TRUE.equals(fromMembers) || Boolean.TRUE.equals(fromChildren), 
-                "when specifying producer, must specify at least one of fromMembers (%s) or fromChildren (%s)", fromMembers, fromChildren);
 
         if (fromHardcodedProducers != null) {
             for (Entity producer : Iterables.filter(fromHardcodedProducers, entityFilter)) {
@@ -94,13 +94,13 @@ public abstract class AbstractAggregator<T,U> extends AbstractEnricher implement
             }
         }
         
-        if (Boolean.TRUE.equals(fromMembers)) {
+        if (isAggregatingMembers()) {
             setEntityBeforeSubscribingProducerMemberEvents(entity);
             setEntitySubscribeProducerMemberEvents();
             setEntityAfterSubscribingProducerMemberEvents();
         }
         
-        if (Boolean.TRUE.equals(fromChildren)) {
+        if (isAggregatingChildren()) {
             setEntityBeforeSubscribingProducerChildrenEvents();
             setEntitySubscribingProducerChildrenEvents();
             setEntityAfterSubscribingProducerChildrenEvents();
@@ -132,7 +132,7 @@ public abstract class AbstractAggregator<T,U> extends AbstractEnricher implement
     }
 
     protected void setEntityBeforeSubscribingProducerMemberEvents(EntityLocal entity) {
-        checkState(producer instanceof Group, "must be a group when fromMembers true: producer=%s; entity=%s; "
+        checkState(producer instanceof Group, "Producer must be a group when fromMembers true: producer=%s; entity=%s; "
                 + "hardcodedProducers=%s", getConfig(PRODUCER), entity, fromHardcodedProducers);
     }
 
@@ -187,6 +187,24 @@ public abstract class AbstractAggregator<T,U> extends AbstractEnricher implement
         }
     }
 
+    /** true if this should aggregate members */
+    protected boolean isAggregatingMembers() {
+        if (Boolean.TRUE.equals(fromMembers)) return true;
+        if (Boolean.TRUE.equals(fromChildren)) return false;
+        if (fromHardcodedProducers!=null) return false;
+        if (producer instanceof Group) return true;
+        return false;
+    }
+    
+    /** true if this should aggregate members */
+    protected boolean isAggregatingChildren() {
+        if (Boolean.TRUE.equals(fromChildren)) return true;
+        if (Boolean.TRUE.equals(fromMembers)) return false;
+        if (fromHardcodedProducers!=null) return false;
+        if (producer instanceof Group) return false;
+        return true;
+    }
+    
     protected abstract void addProducerHardcoded(Entity producer);
     protected abstract void addProducerMember(Entity producer);
     protected abstract void addProducerChild(Entity producer);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6b09d03f/core/src/main/java/brooklyn/enricher/basic/AbstractTransformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/AbstractTransformer.java b/core/src/main/java/brooklyn/enricher/basic/AbstractTransformer.java
index 28a6de1..47e3642 100644
--- a/core/src/main/java/brooklyn/enricher/basic/AbstractTransformer.java
+++ b/core/src/main/java/brooklyn/enricher/basic/AbstractTransformer.java
@@ -18,8 +18,6 @@
  */
 package brooklyn.enricher.basic;
 
-import static com.google.common.base.Preconditions.checkArgument;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,9 +30,6 @@ import brooklyn.event.Sensor;
 import brooklyn.event.SensorEvent;
 import brooklyn.event.SensorEventListener;
 import brooklyn.event.basic.BasicSensorEvent;
-import brooklyn.util.collections.MutableSet;
-import brooklyn.util.task.Tasks;
-import brooklyn.util.time.Duration;
 
 import com.google.common.base.Function;
 import com.google.common.reflect.TypeToken;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6b09d03f/core/src/main/java/brooklyn/enricher/basic/Aggregator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/Aggregator.java b/core/src/main/java/brooklyn/enricher/basic/Aggregator.java
index d7f4fca..a58d4a3 100644
--- a/core/src/main/java/brooklyn/enricher/basic/Aggregator.java
+++ b/core/src/main/java/brooklyn/enricher/basic/Aggregator.java
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,7 +61,7 @@ public class Aggregator<T,U> extends AbstractAggregator<T,U> implements SensorEv
     @SetFromFlag("transformation")
     public static final ConfigKey<Object> TRANSFORMATION_UNTYPED = ConfigKeys.newConfigKey(Object.class, "enricher.transformation.untyped",
         "Specifies a transformation, as a function from a collection to the value, or as a string matching a pre-defined named transformation, "
-        + "such as 'average' (for numbers), 'add' (for numbers), or 'list' (the default, putting any collection of items into a list)");
+        + "such as 'average' (for numbers), 'sum' (for numbers), or 'list' (the default, putting any collection of items into a list)");
     public static final ConfigKey<Function<? super Collection<?>, ?>> TRANSFORMATION = ConfigKeys.newConfigKey(new TypeToken<Function<? super Collection<?>, ?>>() {}, "enricher.transformation");
     
     public static final ConfigKey<Boolean> EXCLUDE_BLANK = ConfigKeys.newBooleanConfigKey("enricher.aggregator.excludeBlank", "Whether explicit nulls or blank strings should be excluded (default false); this only applies if no value filter set", false);
@@ -82,13 +83,20 @@ public class Aggregator<T,U> extends AbstractAggregator<T,U> implements SensorEv
         super.setEntityLoadingConfig();
         this.sourceSensor = (Sensor<T>) getRequiredConfig(SOURCE_SENSOR);
         
+        this.transformation = (Function<? super Collection<T>, ? extends U>) config().get(TRANSFORMATION);
+        
         Object t1 = config().get(TRANSFORMATION_UNTYPED);
-        if (t1 instanceof String) t1 = lookupTransformation((String)t1);
+        Function<? super Collection<?>, ?> t2 = null;
+        if (t1 instanceof String) {
+            t2 = lookupTransformation((String)t1);
+            if (t2==null) {
+                LOG.warn("Unknown transformation '"+t1+"' for "+this+"; will use default transformation");
+            }
+        }
         
-        this.transformation = (Function<? super Collection<T>, ? extends U>) config().get(TRANSFORMATION);
         if (this.transformation==null) {
-            this.transformation = (Function<? super Collection<T>, ? extends U>) t1;
-        } else if (t1!=null && !t1.equals(this.transformation)) {
+            this.transformation = (Function<? super Collection<T>, ? extends U>) t2;
+        } else if (t1!=null && !Objects.equals(t2, this.transformation)) {
             throw new IllegalStateException("Cannot supply both "+TRANSFORMATION_UNTYPED+" and "+TRANSFORMATION+" unless they are equal.");
         }
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6b09d03f/core/src/main/java/brooklyn/enricher/basic/Combiner.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/Combiner.java b/core/src/main/java/brooklyn/enricher/basic/Combiner.java
index cc37d8c..74a400c 100644
--- a/core/src/main/java/brooklyn/enricher/basic/Combiner.java
+++ b/core/src/main/java/brooklyn/enricher/basic/Combiner.java
@@ -30,7 +30,6 @@ import java.util.Set;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.catalog.Catalog;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.ConfigKeys;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6b09d03f/core/src/main/java/brooklyn/enricher/basic/Transformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/Transformer.java b/core/src/main/java/brooklyn/enricher/basic/Transformer.java
index 2fa85fe..0f6c409 100644
--- a/core/src/main/java/brooklyn/enricher/basic/Transformer.java
+++ b/core/src/main/java/brooklyn/enricher/basic/Transformer.java
@@ -37,6 +37,7 @@ import com.google.common.reflect.TypeToken;
 @SuppressWarnings("serial")
 public class Transformer<T,U> extends AbstractTransformer<T,U> {
 
+    @SuppressWarnings("unused")
     private static final Logger LOG = LoggerFactory.getLogger(Transformer.class);
 
     // exactly one of these should be supplied to set a value

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6b09d03f/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
index cfabf1b..75bf9a6 100644
--- a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
+++ b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
@@ -402,7 +402,7 @@ public class ServiceStateLogic {
             fromMembers = true;
             // above sets default
             super.setEntityLoadingConfig();
-            if (fromMembers && (!(entity instanceof Group))) {
+            if (isAggregatingMembers() && (!(entity instanceof Group))) {
                 if (fromChildren) fromMembers=false;
                 else throw new IllegalStateException("Cannot monitor only members for non-group entity "+entity+": "+this);
             }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6b09d03f/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java b/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java
index 52bb943..b693955 100644
--- a/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java
+++ b/policy/src/main/java/brooklyn/policy/autoscaling/AutoScalerPolicy.java
@@ -684,7 +684,7 @@ public class AutoScalerPolicy extends AbstractPolicy {
     @Override
     public void setEntity(EntityLocal entity) {
         if (!config().getRaw(RESIZE_OPERATOR).isPresentAndNonNull()) {
-            Preconditions.checkArgument(entity instanceof Resizable, "Provided entity must be an instance of Resizable, because no custom-resizer operator supplied");
+            Preconditions.checkArgument(entity instanceof Resizable, "Provided entity "+entity+" must be an instance of Resizable, because no custom-resizer operator supplied");
         }
         super.setEntity(entity);
         this.poolEntity = entity;


[03/50] [abbrv] brooklyn-server git commit: Merge remote-tracking branch 'apache-gh/master'

Posted by he...@apache.org.
Merge remote-tracking branch 'apache-gh/master'


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

Branch: refs/heads/0.7.0-incubating
Commit: d7b73dfb2ccbce81508f546f359b093389736a16
Parents: 8f31efa 2f5f552
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Jun 24 00:36:47 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:36:47 2015 -0700

----------------------------------------------------------------------
 .../brooklyn/entity/basic/AbstractEntity.java   |  14 ++-
 .../event/feed/function/FunctionFeedTest.java   |  33 ++++++
 .../location/jclouds/JcloudsLocation.java       |  29 +++++-
 .../ha/ConnectionFailureDetectorTest.java       |   2 +-
 .../java/brooklyn/entity/java/JmxSupport.java   |   3 +-
 .../BrooklynNodeIntegrationTest.java            |  19 +++-
 ...SoftwareProcessSshDriverIntegrationTest.java |  70 +++++--------
 .../brooklyn/util/ssh/IptablesCommands.java     |  57 ++++++++++
 .../util/ssh/IptablesCommandsFirewalldTest.java | 104 +++++++++++++++++++
 9 files changed, 277 insertions(+), 54 deletions(-)
----------------------------------------------------------------------



[24/50] [abbrv] brooklyn-server git commit: Wait all apps running in BrooklynNote test

Posted by he...@apache.org.
Wait all apps running in BrooklynNote test


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

Branch: refs/heads/0.7.0-incubating
Commit: 531159d2cbee62ce10c71b3555a1c25ffabd8a22
Parents: fc62114
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Wed Jun 24 22:03:56 2015 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Jun 25 17:20:13 2015 +0300

----------------------------------------------------------------------
 .../entity/brooklynnode/BrooklynNodeIntegrationTest.java | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/531159d2/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java b/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java
index ba6cd92..182c24a 100644
--- a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java
+++ b/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java
@@ -48,6 +48,7 @@ import brooklyn.entity.basic.BasicApplication;
 import brooklyn.entity.basic.BasicApplicationImpl;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
+import brooklyn.entity.basic.Lifecycle;
 import brooklyn.entity.basic.SoftwareProcess.StopSoftwareParameters.StopMode;
 import brooklyn.entity.brooklynnode.BrooklynNode.DeployBlueprintEffector;
 import brooklyn.entity.brooklynnode.BrooklynNode.ExistingFileBehaviour;
@@ -362,15 +363,24 @@ services:
         HttpTestUtils.assertHttpStatusCodeEventuallyEquals(webConsoleUri+"/v1/applications", 200);
     }
 
+    // TODO Should introduce startup stages and let the client select which stage it expects to be complete
     protected void waitForApps(final URI webConsoleUri, final int num) {
         waitForApps(webConsoleUri.toString());
         
         // e.g. [{"id":"UnBqPcqg","spec":{"name":"Application (UnBqPcqg)","type":"brooklyn.entity.basic.BasicApplication","locations":["pOL4NtiW"]},"status":"RUNNING","links":{"self":"/v1/applications/UnBqPcqg","entities":"/v1/applications/UnBqPcqg/entities"}}]
         Asserts.succeedsEventually(new Runnable() {
+            @Override
             public void run() {
+                //Wait all apps to become managed
                 String appsContent = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications");
                 List<String> appIds = parseJsonList(appsContent, ImmutableList.of("id"), String.class);
                 assertEquals(appIds.size(), num);
+                
+                // and then to start
+                List<String> statuses = parseJsonList(appsContent, ImmutableList.of("status"), String.class);
+                for (String status : statuses) {
+                    assertEquals(status, Lifecycle.RUNNING.toString().toUpperCase());
+                }
             }});
     }
 
@@ -541,7 +551,6 @@ services:
         File pidFile = new File(getDriver(brooklynNode).getPidFile());
         assertTrue(isPidRunning(pidFile));
         
-        Maybe<MachineLocation> l = Locations.findUniqueMachineLocation(brooklynNode.getLocations());
         brooklynNode.invoke(eff, Collections.<String, Object>emptyMap()).getUnchecked();
 
         // Note can't use driver.isRunning to check shutdown; can't invoke scripts on an unmanaged entity


[30/50] [abbrv] brooklyn-server git commit: Fix BrooklynNode unmanage - wait for parent tasks to complete

Posted by he...@apache.org.
Fix BrooklynNode unmanage - wait for parent tasks to complete


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

Branch: refs/heads/0.7.0-incubating
Commit: 07eca7ba9834901ba02190a2c8df362b5be2e997
Parents: 531159d
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Thu Jun 25 21:53:22 2015 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Jun 25 21:53:22 2015 +0300

----------------------------------------------------------------------
 .../entity/brooklynnode/BrooklynNodeImpl.java   | 22 ++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/07eca7ba/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
index e4ca6c5..017a19d 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
@@ -225,12 +225,26 @@ public class BrooklynNodeImpl extends SoftwareProcessImpl implements BrooklynNod
     protected void postStop() {
         super.postStop();
         if (isMachineStopped()) {
-            // Don't unmanage in entity's task context as it will self-cancel the task. Wait for the stop effector to complete.
+            // Don't unmanage in entity's task context as it will self-cancel the task. Wait for the stop effector to complete (and all parent entity tasks).
             // If this is not enough (still getting Caused by: java.util.concurrent.CancellationException: null) then
-            // we could search for the top most task with entity context == this and wait on it. Even stronger would be
-            // to wait for BrooklynTaskTags.getTasksInEntityContext(ExecutionManager, this).isEmpty();
+            // we could wait for BrooklynTaskTags.getTasksInEntityContext(ExecutionManager, this).isEmpty();
             Task<?> stopEffectorTask = BrooklynTaskTags.getClosestEffectorTask(Tasks.current(), Startable.STOP);
-            getManagementContext().getExecutionManager().submit(new UnmanageTask(stopEffectorTask, this));
+            Task<?> topEntityTask = getTopEntityTask(stopEffectorTask);
+            getManagementContext().getExecutionManager().submit(new UnmanageTask(topEntityTask, this));
+        }
+    }
+
+    private Task<?> getTopEntityTask(Task<?> stopEffectorTask) {
+        Entity context = BrooklynTaskTags.getContextEntity(stopEffectorTask);
+        Task<?> topTask = stopEffectorTask;
+        while (true) {
+            Task<?> parentTask = topTask.getSubmittedByTask();
+            Entity parentContext = BrooklynTaskTags.getContextEntity(parentTask);
+            if (parentTask == null || parentContext != context) {
+                return topTask;
+            } else {
+                topTask = parentTask;
+            }
         }
     }
 


[37/50] [abbrv] brooklyn-server git commit: Mark an intermittently-failing test as WIP

Posted by he...@apache.org.
Mark an intermittently-failing test as WIP


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

Branch: refs/heads/0.7.0-incubating
Commit: 88a743d3d02bbac084ea84758efa5021035703c1
Parents: 6491c6d
Author: Richard Downer <ri...@apache.org>
Authored: Fri Jun 26 10:11:10 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Fri Jun 26 14:11:55 2015 +0000

----------------------------------------------------------------------
 core/src/test/java/brooklyn/entity/rebind/RebindFeedTest.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/88a743d3/core/src/test/java/brooklyn/entity/rebind/RebindFeedTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindFeedTest.java b/core/src/test/java/brooklyn/entity/rebind/RebindFeedTest.java
index 18c1edc..a937d6e 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RebindFeedTest.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RebindFeedTest.java
@@ -180,7 +180,7 @@ public class RebindFeedTest extends RebindTestFixtureWithApp {
         EntityTestUtils.assertAttributeEqualsEventually(newEntity, SENSOR_INT, (Integer)0);
     }
 
-    @Test
+    @Test(groups="WIP") // intermittent failures
     public void testReRebindDedupesCorrectlyBasedOnTagOrContentsPersisted() throws Exception {
         doReReReRebindDedupesCorrectlyBasedOnTagOrContentsPersisted(-1, 2, false);
     }


[26/50] [abbrv] brooklyn-server git commit: Merge and close #694 (reviewed by @aledsage and @mikezaccardo)

Posted by he...@apache.org.
Merge and close #694 (reviewed by @aledsage and @mikezaccardo)


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

Branch: refs/heads/0.7.0-incubating
Commit: 3546541b015cd61bf7935e2bbc9720b24ef5cca9
Parents: edae75a f4b308e
Author: Richard Downer <ri...@apache.org>
Authored: Thu Jun 25 15:22:18 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Thu Jun 25 15:22:18 2015 +0100

----------------------------------------------------------------------
 .../JcloudsLocationSecurityGroupCustomizer.java | 119 ++++++++++++++-----
 ...oudsLocationSecurityGroupCustomizerTest.java |   9 +-
 2 files changed, 94 insertions(+), 34 deletions(-)
----------------------------------------------------------------------



[14/50] [abbrv] brooklyn-server git commit: fixes for AWS VPC issues

Posted by he...@apache.org.
fixes for AWS VPC issues

* give a detailed message if we hit the classic/vpc problem
* treat `networkName` as `subnetId` in AWS
* longer timeout for AWS security group creation
* use `eu-central-1` in the default catalog as it gives a default VPC which works best


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

Branch: refs/heads/0.7.0-incubating
Commit: c7a7928315dc6f4ab51b7bd4b3df3a7d2766439f
Parents: 53656bd
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Jun 22 23:11:20 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:34 2015 -0700

----------------------------------------------------------------------
 .../jclouds/ComputeServiceRegistryImpl.java     |  7 +++++
 .../location/jclouds/JcloudsLocation.java       | 29 ++++++++++++++++++--
 .../location/jclouds/JcloudsLocationConfig.java |  2 +-
 .../main/resources/brooklyn/default.catalog.bom | 12 ++++----
 4 files changed, 41 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c7a79283/locations/jclouds/src/main/java/brooklyn/location/jclouds/ComputeServiceRegistryImpl.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/ComputeServiceRegistryImpl.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/ComputeServiceRegistryImpl.java
index b3da5a6..a1786ec 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/ComputeServiceRegistryImpl.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/ComputeServiceRegistryImpl.java
@@ -31,6 +31,7 @@ import org.jclouds.Constants;
 import org.jclouds.ContextBuilder;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.ec2.reference.EC2Constants;
 import org.jclouds.encryption.bouncycastle.config.BouncyCastleCryptoModule;
 import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
 import org.jclouds.sshj.config.SshjSshClientModule;
@@ -40,6 +41,7 @@ import org.slf4j.LoggerFactory;
 import brooklyn.entity.basic.Sanitizer;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.config.ConfigBag;
+import brooklyn.util.time.Duration;
 
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableSet;
@@ -96,6 +98,11 @@ public class ComputeServiceRegistryImpl implements ComputeServiceRegistry, Jclou
                  * Filter.3.Name=image-type&Filter.3.Value.1=machine&
                  */
             }
+            
+            // occasionally can get com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: 
+            //     security group eu-central-1/jclouds#brooklyn-bxza-alex-eu-central-shoul-u2jy-nginx-ielm is not available after creating
+            // the default timeout was 500ms so let's raise it in case that helps
+            properties.setProperty(EC2Constants.PROPERTY_EC2_TIMEOUT_SECURITYGROUP_PRESENT, ""+Duration.seconds(30).toMilliseconds());
         }
 
         // FIXME Deprecated mechanism, should have a ConfigKey for overrides

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c7a79283/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index a0d30d4..969d41d 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -53,6 +53,7 @@ import java.util.regex.Pattern;
 
 import javax.annotation.Nullable;
 
+import org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions;
 import org.jclouds.cloudstack.compute.options.CloudStackTemplateOptions;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.RunNodesException;
@@ -979,10 +980,20 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
             // sometimes AWS nodes come up busted (eg ssh not allowed); just throw it back (and maybe try for another one)
             boolean destroyNode = (node != null) && Boolean.TRUE.equals(setup.get(DESTROY_ON_FAILURE));
 
+            if (e.toString().contains("VPCResourceNotSpecified")) {
+                LOG.error("Detected that your EC2 account is a legacy 'classic' account, but the recommended instance type requires VPC. "
+                    + "You can specify the 'eu-central-1' region to avoid this problem, or you can specify a classic-compatible instance type, "
+                    + "or you can specify a subnet to use with 'networkName' "
+                    + "(taking care that the subnet auto-assigns public IP's and allows ingress on all ports, "
+                    + "as Brooklyn does not currently configure security groups for non-default VPC's; "
+                    + "or setting up Brooklyn to be in the subnet or have a jump host or other subnet access configuration). "
+                    + "For more information on VPC vs classic see http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-vpc.html.");
+            }
+            
             LOG.error("Failed to start VM for {}{}: {}",
                     new Object[] {setup.getDescription(), (destroyNode ? " (destroying "+node+")" : ""), e.getMessage()});
             LOG.debug(Throwables.getStackTraceAsString(e));
-
+            
             if (destroyNode) {
                 if (machineLocation != null) {
                     releaseSafely(machineLocation);
@@ -1241,7 +1252,21 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                     }})
             .put(NETWORK_NAME, new CustomizeTemplateOptions() {
                     public void apply(TemplateOptions t, ConfigBag props, Object v) {
-                        t.networks((String)v);
+                        if (t instanceof AWSEC2TemplateOptions) {
+                            // subnet ID is the sensible interpretation of network name in EC2
+                            ((AWSEC2TemplateOptions)t).subnetId((String)v);
+                            
+                        } else {
+                            if (t instanceof SoftLayerTemplateOptions) {
+                                LOG.warn("networkName may not be supported in SoftLayer; use `templateOptions` with `primaryNetworkComponentNetworkVlanId` or `primaryNetworkBackendComponentNetworkVlanId`");
+                            } else if (!(t instanceof CloudStackTemplateOptions) && !(t instanceof NovaTemplateOptions)) {
+                                LOG.warn("networkName may not be supported in this cloud; only known to work in CloudStack and OpenStack");
+                            }
+                            
+                            // looks like this is only supported in Cloudstack and Openstack
+                            // should we log warning if using another cloud?
+                            t.networks((String)v);
+                        }
                     }})
             .put(DOMAIN_NAME, new CustomizeTemplateOptions() {
                     public void apply(TemplateOptions t, ConfigBag props, Object v) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c7a79283/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
index ab0007a..c37d915 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
@@ -193,7 +193,7 @@ public interface JcloudsLocationConfig extends CloudLocationConfig {
     public static final ConfigKey<Integer> OVERRIDE_RAM = ConfigKeys.newIntegerConfigKey("overrideRam", "Custom ram value");    
     
     public static final ConfigKey<String> NETWORK_NAME = ConfigKeys.newStringConfigKey(
-        "networkName", "Network name to specify as template option (e.g. GCE)");
+        "networkName", "Network name or ID where the instance should be created (e.g. the subnet ID in AWS");
 
     /**
      * CUSTOM_MACHINE_SETUP_SCRIPT_URL accepts a URL location that points to a shell script. 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c7a79283/usage/cli/src/main/resources/brooklyn/default.catalog.bom
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/resources/brooklyn/default.catalog.bom b/usage/cli/src/main/resources/brooklyn/default.catalog.bom
index 4da8319..70c7d57 100644
--- a/usage/cli/src/main/resources/brooklyn/default.catalog.bom
+++ b/usage/cli/src/main/resources/brooklyn/default.catalog.bom
@@ -59,15 +59,15 @@ brooklyn.catalog:
       - type:           server
         name:           My VM
       
-      # location can be `softlayer` or `jclouds:openstack-nova:https://9.9.9.9:9999/v2.0/`,
+      # location can be e.g. `softlayer` or `jclouds:openstack-nova:https://9.9.9.9:9999/v2.0/`,
       # or `localhost` or `byon: { nodes: [ 10.0.0.1, 10.0.0.2, 10.0.1.{1,2} ] }` 
       location:
         jclouds:aws-ec2:
-          # edit these to use your credential(or delete if credentials specified in brooklyn.properties)      
+          # edit these to use your credential (or delete if credentials specified in brooklyn.properties)      
           identity:     <REPLACE>
           credential:   <REPLACE>
           
-          region:       eu-west-1
+          region:       eu-central-1
           
           # we want Ubuntu, with a lot of RAM
           osFamily:     ubuntu
@@ -156,7 +156,7 @@ brooklyn.catalog:
       
       location:
         jclouds:aws-ec2:
-          region:       eu-west-1
+          region:       eu-central-1
           # edit these (or delete if credentials specified in brooklyn.properties)      
           identity:     <REPLACE>
           credential:   <REPLACE>
@@ -202,7 +202,7 @@ brooklyn.catalog:
           
       location:
         jclouds:aws-ec2:
-          region:       eu-west-1
+          region:       eu-central-1
           # edit these (or delete if credentials specified in brooklyn.properties)      
           identity:     <REPLACE>
           credential:   <REPLACE>
@@ -355,5 +355,5 @@ brooklyn.catalog:
           identity:     <REPLACE>
           credential:   <REPLACE>
           
-          region:       eu-west-1
+          region:       eu-central-1
           minRam:       2gb


[19/50] [abbrv] brooklyn-server git commit: better warnings and comments on use of `networkName` in JcloudsLocation

Posted by he...@apache.org.
better warnings and comments on use of `networkName` in JcloudsLocation


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

Branch: refs/heads/0.7.0-incubating
Commit: 4a6ada40b89b09f8aea2355e00542251309653a7
Parents: d5fcc34
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Jun 23 23:12:07 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 01:04:24 2015 -0700

----------------------------------------------------------------------
 .../brooklyn/location/jclouds/JcloudsLocation.java  | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4a6ada40/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index 969d41d..7797138 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -1257,14 +1257,20 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                             ((AWSEC2TemplateOptions)t).subnetId((String)v);
                             
                         } else {
-                            if (t instanceof SoftLayerTemplateOptions) {
-                                LOG.warn("networkName may not be supported in SoftLayer; use `templateOptions` with `primaryNetworkComponentNetworkVlanId` or `primaryNetworkBackendComponentNetworkVlanId`");
+                            if (t instanceof GoogleComputeEngineTemplateOptions) {
+                                // no warning needed
+                                // we think this is the only jclouds endpoint which supports this option
+                                
+                            } else if (t instanceof SoftLayerTemplateOptions) {
+                                LOG.warn("networkName is not be supported in SoftLayer; use `templateOptions` with `primaryNetworkComponentNetworkVlanId` or `primaryNetworkBackendComponentNetworkVlanId`");
                             } else if (!(t instanceof CloudStackTemplateOptions) && !(t instanceof NovaTemplateOptions)) {
-                                LOG.warn("networkName may not be supported in this cloud; only known to work in CloudStack and OpenStack");
+                                LOG.warn("networkName is experimental in many jclouds endpoints may not be supported in this cloud");
+                                // NB, from @andreaturli
+//                                Cloudstack uses custom securityGroupIds and networkIds not the generic networks
+//                                Openstack Nova uses securityGroupNames which is marked as @deprecated (suggests to use groups which is maybe even more confusing)
+//                                Azure supports the custom networkSecurityGroupName
                             }
                             
-                            // looks like this is only supported in Cloudstack and Openstack
-                            // should we log warning if using another cloud?
                             t.networks((String)v);
                         }
                     }})


[05/50] [abbrv] brooklyn-server git commit: improve ValueResolver task+timeout, and related work on tasks

Posted by he...@apache.org.
improve ValueResolver task+timeout, and related work on tasks

ValueResolver will now look if it is already in a task when computing the execution context,
so more things which need a context and/or have timeouts can be handled correctly --
esp when $brooklyn:config is passed from yaml to various places

More tasks are marked transient so don't clutter the GUI.

Cancellations are treated better, with fewer errors.

Also shell env vars where values are null are now treated as "" rather than "null",
and a few other string handling goodies


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

Branch: refs/heads/0.7.0-incubating
Commit: ea8da3793d49a7a147cc1f8f9711bd899caad3b1
Parents: 53b820e
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Jun 18 08:56:17 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:32 2015 -0700

----------------------------------------------------------------------
 api/src/main/java/brooklyn/event/Sensor.java    |  4 +-
 .../main/java/brooklyn/enricher/Enrichers.java  |  5 +-
 .../internal/LocalSubscriptionManager.java      |  4 +-
 .../java/brooklyn/util/flags/TypeCoercions.java |  2 +-
 .../java/brooklyn/util/task/ValueResolver.java  | 65 +++++++++++++++-----
 .../util/internal/TypeCoercionsTest.java        |  2 +-
 .../policy/ha/AbstractFailureDetector.java      |  4 +-
 .../brooklyn/policy/ha/ServiceRestarter.java    |  3 +-
 .../policy/ha/SshMachineFailureDetector.java    |  1 -
 .../basic/AbstractSoftwareProcessSshDriver.java |  2 +-
 .../brooklyn/entity/software/StaticSensor.java  | 19 +++++-
 .../entity/software/ssh/SshCommandEffector.java |  2 +-
 .../entity/software/ssh/SshCommandSensor.java   |  2 +-
 .../spi/dsl/methods/BrooklynDslCommon.java      | 31 +++++-----
 .../brooklyn/spi/dsl/methods/DslComponent.java  | 25 +++++---
 .../java/brooklyn/util/text/StringEscapes.java  | 20 ++++--
 .../main/java/brooklyn/util/text/Strings.java   | 28 ++++++++-
 .../main/java/brooklyn/util/time/Durations.java |  3 +
 18 files changed, 159 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/api/src/main/java/brooklyn/event/Sensor.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/event/Sensor.java b/api/src/main/java/brooklyn/event/Sensor.java
index 88b0d13..2057020 100644
--- a/api/src/main/java/brooklyn/event/Sensor.java
+++ b/api/src/main/java/brooklyn/event/Sensor.java
@@ -39,8 +39,8 @@ public interface Sensor<T> extends Serializable {
      * <p>
      * This returns a "super" of T only in the case where T is generified, 
      * and in such cases it returns the Class instance for the unadorned T ---
-     * i.e. for List<String> this returns Class<List> ---
-     * this is of course because there is no actual Class<List<String>> instance.
+     * i.e. for List&lt;String&gt; this returns Class<List> ---
+     * this is of course because there is no actual Class&lt;List&lt;String&gt;&gt; instance.
      */
     Class<? super T> getType();
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/core/src/main/java/brooklyn/enricher/Enrichers.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/Enrichers.java b/core/src/main/java/brooklyn/enricher/Enrichers.java
index d036b11..b34fc76 100644
--- a/core/src/main/java/brooklyn/enricher/Enrichers.java
+++ b/core/src/main/java/brooklyn/enricher/Enrichers.java
@@ -157,7 +157,8 @@ public class Enrichers {
             return new CombinerBuilder<S, Object>(vals);
         }
         /** as {@link #combining(Collection)} */
-        public <S> CombinerBuilder<S, Object> combining(AttributeSensor<? extends S>... vals) {
+        @SafeVarargs
+        public final <S> CombinerBuilder<S, Object> combining(AttributeSensor<? extends S>... vals) {
             return new CombinerBuilder<S, Object>(vals);
         }
         /** as {@link #combining(Collection)} but the collection of values comes from the given sensor on multiple entities */
@@ -351,6 +352,7 @@ public class Enrichers {
         // For summing/averaging
         protected Object defaultValueForUnreportedSensors;
         
+        @SafeVarargs
         public AbstractCombinerBuilder(AttributeSensor<? extends S>... vals) {
             this(ImmutableList.copyOf(vals));
         }
@@ -706,6 +708,7 @@ public class Enrichers {
     }
 
     public static class CombinerBuilder<S, T> extends AbstractCombinerBuilder<S, T, CombinerBuilder<S, T>> {
+        @SafeVarargs
         public CombinerBuilder(AttributeSensor<? extends S>... vals) {
             super(vals);
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/core/src/main/java/brooklyn/management/internal/LocalSubscriptionManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalSubscriptionManager.java b/core/src/main/java/brooklyn/management/internal/LocalSubscriptionManager.java
index 805bf85..7121fc3 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalSubscriptionManager.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalSubscriptionManager.java
@@ -200,9 +200,9 @@ public class LocalSubscriptionManager extends AbstractSubscriptionManager {
                             sAtClosureCreation.listener.onEvent(event);
                         } catch (Throwable t) {
                             if (event!=null && event.getSource()!=null && Entities.isNoLongerManaged(event.getSource())) {
-                                LOG.debug("Error in "+this+", after entity unmanaged: "+t, t);
+                                LOG.debug("Error processing subscriptions to "+this+", after entity unmanaged: "+t, t);
                             } else {
-                                LOG.warn("Error in "+this+": "+t, t);
+                                LOG.warn("Error processing subscriptions to "+this+": "+t, t);
                             }
                         }
                     }});

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/flags/TypeCoercions.java b/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
index 67011b2..55649e8 100644
--- a/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
+++ b/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
@@ -430,7 +430,7 @@ public class TypeCoercions {
         try {
             return (T) wrappedType.getMethod("valueOf", String.class).invoke(null, value);
         } catch (Exception e) {
-            ClassCoercionException tothrow = new ClassCoercionException("Cannot coerce type String to "+targetType.getCanonicalName()+" ("+value+"): adapting failed");
+            ClassCoercionException tothrow = new ClassCoercionException("Cannot coerce "+JavaStringEscapes.wrapJavaString(value)+" to "+targetType.getCanonicalName()+" ("+value+"): adapting failed");
             tothrow.initCause(e);
             throw tothrow;
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/core/src/main/java/brooklyn/util/task/ValueResolver.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/ValueResolver.java b/core/src/main/java/brooklyn/util/task/ValueResolver.java
index 3a15bbd..71b34a0 100644
--- a/core/src/main/java/brooklyn/util/task/ValueResolver.java
+++ b/core/src/main/java/brooklyn/util/task/ValueResolver.java
@@ -29,6 +29,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.Entity;
+import brooklyn.entity.basic.BrooklynTaskTags;
 import brooklyn.entity.basic.EntityInternal;
 import brooklyn.management.ExecutionContext;
 import brooklyn.management.Task;
@@ -36,6 +37,7 @@ import brooklyn.management.TaskAdaptable;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.flags.TypeCoercions;
 import brooklyn.util.guava.Maybe;
+import brooklyn.util.javalang.JavaClassNames;
 import brooklyn.util.time.CountdownTimer;
 import brooklyn.util.time.Duration;
 import brooklyn.util.time.Durations;
@@ -66,6 +68,7 @@ public class ValueResolver<T> implements DeferredSupplier<T> {
     Boolean embedResolutionInTask;
     /** timeout on execution, if possible, or if embedResolutionInTask is true */
     Duration timeout;
+    boolean isTransientTask = true;
     
     T defaultValue = null;
     boolean returnDefaultOnGet = false;
@@ -170,6 +173,12 @@ public class ValueResolver<T> implements DeferredSupplier<T> {
         return this;
     }
     
+    /** whether the task should be marked as transient; defaults true */
+    public ValueResolver<T> transientTask(boolean isTransientTask) {
+        this.isTransientTask = isTransientTask;
+        return this;
+    }
+    
     public Maybe<T> getDefault() {
         if (returnDefaultOnGet) return Maybe.of(defaultValue);
         else return Maybe.absent("No default value set");
@@ -213,13 +222,27 @@ public class ValueResolver<T> implements DeferredSupplier<T> {
         return m.get();
     }
     
-    @SuppressWarnings({ "unchecked", "rawtypes" })
     public Maybe<T> getMaybe() {
+        Maybe<T> result = getMaybeInternal();
+        if (log.isTraceEnabled()) {
+            log.trace(this+" evaluated as "+result);
+        }
+        return result;
+    }
+    
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    protected Maybe<T> getMaybeInternal() {
         if (started.getAndSet(true))
             throw new IllegalStateException("ValueResolver can only be used once");
         
         if (expired) return Maybe.absent("Nested resolution of "+getOriginalValue()+" did not complete within "+timeout);
         
+        ExecutionContext exec = this.exec;
+        if (exec==null) {
+            // if execution context not specified, take it from the current task if present
+            exec = BasicExecutionContext.getCurrentExecutionContext();
+        }
+        
         CountdownTimer timerU = parentTimer;
         if (timerU==null && timeout!=null)
             timerU = timeout.countdownTimer();
@@ -240,7 +263,6 @@ public class ValueResolver<T> implements DeferredSupplier<T> {
             if (v instanceof TaskAdaptable<?>) {
                 //if it's a task, we make sure it is submitted
                 if (!((TaskAdaptable<?>) v).asTask().isSubmitted() ) {
-                    // TODO could try to get exec context from Tasks.current() ... should we?
                     if (exec==null)
                         return Maybe.absent("Value for unsubmitted task '"+getDescription()+"' requested but no execution context available");
                     exec.submit(((TaskAdaptable<?>) v).asTask());
@@ -269,22 +291,24 @@ public class ValueResolver<T> implements DeferredSupplier<T> {
 
             } else if (v instanceof DeferredSupplier<?>) {
                 final Object vf = v;
-                Callable<Object> callable = new Callable<Object>() {
-                    public Object call() throws Exception {
-                        try {
-                            Tasks.setBlockingDetails("Retrieving "+vf);
-                            return ((DeferredSupplier<?>) vf).get();
-                        } finally {
-                            Tasks.resetBlockingDetails();
-                        }
-                    } };
-                    
-                if (Boolean.TRUE.equals(embedResolutionInTask) || timeout!=null) {
+
+                if ((!Boolean.FALSE.equals(embedResolutionInTask) && (exec!=null || timeout!=null)) || Boolean.TRUE.equals(embedResolutionInTask)) {
                     if (exec==null)
                         return Maybe.absent("Embedding in task needed for '"+getDescription()+"' but no execution context available");
                         
+                    Callable<Object> callable = new Callable<Object>() {
+                        public Object call() throws Exception {
+                            try {
+                                Tasks.setBlockingDetails("Retrieving "+vf);
+                                return ((DeferredSupplier<?>) vf).get();
+                            } finally {
+                                Tasks.resetBlockingDetails();
+                            }
+                        } };
                     String description = getDescription();
-                    Task<Object> vt = exec.submit(Tasks.<Object>builder().body(callable).name("Resolving dependent value").description(description).build());
+                    TaskBuilder<Object> vb = Tasks.<Object>builder().body(callable).name("Resolving dependent value").description(description);
+                    if (isTransientTask) vb.tag(BrooklynTaskTags.TRANSIENT_TASK_TAG);
+                    Task<Object> vt = exec.submit(vb.build());
                     // TODO to handle immediate resolution, it would be nice to be able to submit 
                     // so it executes in the current thread,
                     // or put a marker in the target thread or task while it is running that the task 
@@ -296,8 +320,12 @@ public class ValueResolver<T> implements DeferredSupplier<T> {
                     v = vm.get();
                     
                 } else {
-                    v = callable.call();
-                    
+                    try {
+                        Tasks.setBlockingDetails("Retrieving (non-task) "+vf);
+                        v = ((DeferredSupplier<?>) vf).get();
+                    } finally {
+                        Tasks.resetBlockingDetails();
+                    }
                 }
 
             } else if (v instanceof Map) {
@@ -370,4 +398,9 @@ public class ValueResolver<T> implements DeferredSupplier<T> {
         if (parentOriginalValue!=null) return parentOriginalValue;
         return value;
     }
+    
+    @Override
+    public String toString() {
+        return JavaClassNames.cleanSimpleClassName(this)+"["+JavaClassNames.cleanSimpleClassName(type)+" "+value+"]";
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java b/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java
index 9b2f6b0..66e7d2c 100644
--- a/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java
+++ b/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java
@@ -121,7 +121,7 @@ public class TypeCoercionsTest {
     public void testCoercePrimitiveFailures() {
         // error messages don't have to be this exactly, but they should include sufficient information...
         assertCoercionFailsWithErrorMatching("maybe", boolean.class, StringPredicates.containsAllLiterals("String", "boolean", "maybe"));
-        assertCoercionFailsWithErrorMatching("NaN", int.class, StringPredicates.containsAllLiterals("String", "int", "NaN"));
+        assertCoercionFailsWithErrorMatching("NaN", int.class, StringPredicates.containsAllLiterals("int", "NaN"));
         assertCoercionFailsWithErrorMatching('c', boolean.class, StringPredicates.containsAllLiterals("boolean", "(c)"));  // will say 'string' rather than 'char'
         assertCoercionFailsWithErrorMatching(0, boolean.class, StringPredicates.containsAllLiterals("Integer", "boolean", "0"));
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/policy/src/main/java/brooklyn/policy/ha/AbstractFailureDetector.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/ha/AbstractFailureDetector.java b/policy/src/main/java/brooklyn/policy/ha/AbstractFailureDetector.java
index 6a1324c..2c772b8 100644
--- a/policy/src/main/java/brooklyn/policy/ha/AbstractFailureDetector.java
+++ b/policy/src/main/java/brooklyn/policy/ha/AbstractFailureDetector.java
@@ -192,10 +192,11 @@ public abstract class AbstractFailureDetector extends AbstractPolicy {
         doStartPolling();
     }
 
+    @SuppressWarnings("unchecked")
     protected void doStartPolling() {
         if (scheduledTask == null || scheduledTask.isDone()) {
             ScheduledTask task = new ScheduledTask(MutableMap.of("period", getPollPeriod(), "displayName", getTaskName()), pollingTaskFactory);
-            scheduledTask = ((EntityInternal)entity).getExecutionContext().submit(task);;
+            scheduledTask = ((EntityInternal)entity).getExecutionContext().submit(task);
         }
     }
 
@@ -271,6 +272,7 @@ public abstract class AbstractFailureDetector extends AbstractPolicy {
         schedulePublish(0);
     }
 
+    @SuppressWarnings("unchecked")
     protected void schedulePublish(long delay) {
         if (isRunning() && executorQueued.compareAndSet(false, true)) {
             long now = System.currentTimeMillis();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/policy/src/main/java/brooklyn/policy/ha/ServiceRestarter.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/ha/ServiceRestarter.java b/policy/src/main/java/brooklyn/policy/ha/ServiceRestarter.java
index b71d6d6..02ea8e4 100644
--- a/policy/src/main/java/brooklyn/policy/ha/ServiceRestarter.java
+++ b/policy/src/main/java/brooklyn/policy/ha/ServiceRestarter.java
@@ -26,7 +26,6 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.catalog.Catalog;
 import brooklyn.config.ConfigKey;
-import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityInternal;
@@ -76,7 +75,7 @@ public class ServiceRestarter extends AbstractPolicy {
 
     /** monitors this sensor, by default ENTITY_FAILED */
     @SetFromFlag("failureSensorToMonitor")
-    @SuppressWarnings("rawtypes")
+    @SuppressWarnings({ "rawtypes", "unchecked" })
     public static final ConfigKey<Sensor<?>> FAILURE_SENSOR_TO_MONITOR = (ConfigKey) ConfigKeys.newConfigKey(Sensor.class, "failureSensorToMonitor", "", HASensors.ENTITY_FAILED); 
     
     protected final AtomicReference<Long> lastFailureTime = new AtomicReference<Long>();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/policy/src/main/java/brooklyn/policy/ha/SshMachineFailureDetector.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/policy/ha/SshMachineFailureDetector.java b/policy/src/main/java/brooklyn/policy/ha/SshMachineFailureDetector.java
index ee1c6ee..edb71b9 100644
--- a/policy/src/main/java/brooklyn/policy/ha/SshMachineFailureDetector.java
+++ b/policy/src/main/java/brooklyn/policy/ha/SshMachineFailureDetector.java
@@ -29,7 +29,6 @@ import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.event.basic.BasicNotificationSensor;
 import brooklyn.location.basic.Machines;
 import brooklyn.location.basic.SshMachineLocation;
-import brooklyn.policy.ha.AbstractFailureDetector.LastPublished;
 import brooklyn.policy.ha.HASensors.FailureDescriptor;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.guava.Maybe;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java
index 3ebad57..954b842 100644
--- a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java
+++ b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java
@@ -314,7 +314,7 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP
      * @see SoftwareProcess#SHELL_ENVIRONMENT
      */
     public Map<String, String> getShellEnvironment() {
-        return Strings.toStringMap(entity.getConfig(SoftwareProcess.SHELL_ENVIRONMENT));
+        return Strings.toStringMap(entity.getConfig(SoftwareProcess.SHELL_ENVIRONMENT), "");
     }
 
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java b/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java
index 8c20253..8688ec8 100644
--- a/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java
+++ b/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java
@@ -18,15 +18,22 @@
  */
 package brooklyn.entity.software;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.entity.effector.AddSensor;
 import brooklyn.util.config.ConfigBag;
-import brooklyn.util.flags.TypeCoercions;
+import brooklyn.util.guava.Maybe;
+import brooklyn.util.task.Tasks;
+import brooklyn.util.time.Duration;
 
 public class StaticSensor<T> extends AddSensor<T> {
 
+    private static final Logger log = LoggerFactory.getLogger(StaticSensor.class);
+    
     public static final ConfigKey<Object> STATIC_VALUE = ConfigKeys.newConfigKey(Object.class, "static.value");
 
     private final Object value;
@@ -36,9 +43,17 @@ public class StaticSensor<T> extends AddSensor<T> {
         value = params.get(STATIC_VALUE);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public void apply(EntityLocal entity) {
         super.apply(entity);
-        entity.setAttribute(sensor, (T) TypeCoercions.coerce(value, sensor.getType()));
+        
+        Maybe<T> v = Tasks.resolving(value).as((Class<T>)sensor.getType()).timeout(Duration.millis(200)).getMaybe();
+        if (v.isPresent()) {
+            log.debug(this+" setting sensor "+sensor+" to "+v.get());
+            entity.setAttribute(sensor, v.get());
+        } else {
+            log.debug(this+" not setting sensor "+sensor+"; cannot resolve "+value);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java
index 200d0ce..9a86dce 100644
--- a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java
+++ b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandEffector.java
@@ -82,7 +82,7 @@ public final class SshCommandEffector extends AddEffector {
             }
             
             // then set things from the entities defined shell environment, if applicable
-            env.putAll(Strings.toStringMap(entity().getConfig(SoftwareProcess.SHELL_ENVIRONMENT)));
+            env.putAll(Strings.toStringMap(entity().getConfig(SoftwareProcess.SHELL_ENVIRONMENT), ""));
             
             // if we wanted to resolve the surrounding environment in real time -- see above
 //            Map<String,Object> paramsResolved = (Map<String, Object>) Tasks.resolveDeepValue(effectorShellEnv, Map.class, entity().getExecutionContext());

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
index 2c918f9..2d9e88d 100644
--- a/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
+++ b/software/base/src/main/java/brooklyn/entity/software/ssh/SshCommandSensor.java
@@ -87,7 +87,7 @@ public final class SshCommandSensor<T> extends AddSensor<T> {
         Supplier<Map<String,String>> envSupplier = new Supplier<Map<String,String>>() {
             @Override
             public Map<String, String> get() {
-                return MutableMap.copyOf(Strings.toStringMap(entity.getConfig(SoftwareProcess.SHELL_ENVIRONMENT)));
+                return MutableMap.copyOf(Strings.toStringMap(entity.getConfig(SoftwareProcess.SHELL_ENVIRONMENT), ""));
             }
         };
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index 4c3f40b..f488d61 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -46,6 +46,7 @@ import brooklyn.util.flags.FlagUtils;
 import brooklyn.util.flags.TypeCoercions;
 import brooklyn.util.javalang.Reflections;
 import brooklyn.util.task.DeferredSupplier;
+import brooklyn.util.text.StringEscapes.JavaStringEscapes;
 import brooklyn.util.text.Strings;
 
 import com.google.common.base.Function;
@@ -57,27 +58,27 @@ public class BrooklynDslCommon {
 
     // Access specific entities
 
-    public static DslComponent entity(String scopeOrId) {
-        return new DslComponent(Scope.GLOBAL, scopeOrId);
+    public static DslComponent entity(String id) {
+        return new DslComponent(Scope.GLOBAL, id);
     }
     public static DslComponent parent() {
         return new DslComponent(Scope.PARENT, null);
     }
-    public static DslComponent child(String scopeOrId) {
-        return new DslComponent(Scope.CHILD, scopeOrId);
+    public static DslComponent child(String id) {
+        return new DslComponent(Scope.CHILD, id);
     }
-    public static DslComponent sibling(String scopeOrId) {
-        return new DslComponent(Scope.SIBLING, scopeOrId);
+    public static DslComponent sibling(String id) {
+        return new DslComponent(Scope.SIBLING, id);
     }
-    public static DslComponent descendant(String scopeOrId) {
-        return new DslComponent(Scope.DESCENDANT, scopeOrId);
+    public static DslComponent descendant(String id) {
+        return new DslComponent(Scope.DESCENDANT, id);
     }
-    public static DslComponent ancestor(String scopeOrId) {
-        return new DslComponent(Scope.ANCESTOR, scopeOrId);
+    public static DslComponent ancestor(String id) {
+        return new DslComponent(Scope.ANCESTOR, id);
     }
     // prefer the syntax above to the below now, but not deprecating the below
-    public static DslComponent component(String scopeOrId) {
-        return component("global", scopeOrId);
+    public static DslComponent component(String id) {
+        return component("global", id);
     }
     public static DslComponent component(String scope, String id) {
         if (!DslComponent.Scope.isValid(scope)) {
@@ -205,7 +206,9 @@ public class BrooklynDslCommon {
 
         @Override
         public String toString() {
-            return "$brooklyn:formatString("+pattern+(args==null || args.length==0 ? "" : ","+Strings.join(args, ","))+")";
+            return "$brooklyn:formatString("+
+                JavaStringEscapes.wrapJavaString(pattern)+
+                (args==null || args.length==0 ? "" : ","+Strings.join(args, ","))+")";
         }
     }
 
@@ -291,7 +294,7 @@ public class BrooklynDslCommon {
 
         @Override
         public String toString() {
-            return "$brooklyn:object("+type+")";
+            return "$brooklyn:object(\""+type.getName()+"\")";
         }
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
index 7b1ab4b..1cb52b3 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import java.util.concurrent.Callable;
 
 import brooklyn.entity.Entity;
+import brooklyn.entity.basic.BrooklynTaskTags;
 import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityInternal;
@@ -39,6 +40,7 @@ import brooklyn.management.internal.EntityManagerInternal;
 import brooklyn.util.guava.Maybe;
 import brooklyn.util.task.TaskBuilder;
 import brooklyn.util.task.Tasks;
+import brooklyn.util.text.StringEscapes.JavaStringEscapes;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -72,8 +74,8 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> {
     
     @Override
     public Task<Entity> newTask() {
-        return TaskBuilder.<Entity>builder().name("component("+componentId+")").body(
-            new EntityInScopeFinder(scopeComponent, scope, componentId)).build();
+        return TaskBuilder.<Entity>builder().name(toString()).tag(BrooklynTaskTags.TRANSIENT_TASK_TAG)
+            .body(new EntityInScopeFinder(scopeComponent, scope, componentId)).build();
     }
     
     protected static class EntityInScopeFinder implements Callable<Entity> {
@@ -197,7 +199,8 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> {
         }
         @Override
         public String toString() {
-            return component.toString()+"."+"attributeWhenReady("+sensorName+")";
+            return (component.scope==Scope.THIS ? "" : component.toString()+".") +
+                "attributeWhenReady("+JavaStringEscapes.wrapJavaString(sensorName)+")";
         }
     }
 
@@ -216,7 +219,7 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> {
 
         @Override
         public Task<Object> newTask() {
-            return Tasks.builder().name("retrieving config for "+keyName).dynamic(false).body(new Callable<Object>() {
+            return Tasks.builder().name("retrieving config for "+keyName).tag(BrooklynTaskTags.TRANSIENT_TASK_TAG).dynamic(false).body(new Callable<Object>() {
                 @Override
                 public Object call() throws Exception {
                     Entity targetEntity = component.get();
@@ -227,7 +230,8 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> {
 
         @Override
         public String toString() {
-            return component.toString()+"."+"config("+keyName+")";
+            return (component.scope==Scope.THIS ? "" : component.toString()+".") + 
+                "config("+JavaStringEscapes.wrapJavaString(keyName)+")";
         }
     }
     
@@ -262,7 +266,8 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> {
 
         @Override
         public String toString() {
-            return component.toString()+"."+"sensor("+sensorName+")";
+            return (component.scope==Scope.THIS ? "" : component.toString()+".") + 
+                "sensor("+JavaStringEscapes.wrapJavaString(sensorName)+")";
         }
     }
 
@@ -305,10 +310,10 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> {
 
     @Override
     public String toString() {
-        return "$brooklyn:component("+
-            (scopeComponent==null ? "" : scopeComponent+", ")+
-            (scope==Scope.GLOBAL ? "" : scope+", ")+
-            componentId+
+        return "$brooklyn:entity("+
+            (scopeComponent==null ? "" : JavaStringEscapes.wrapJavaString(scopeComponent.toString())+", ")+
+            (scope==Scope.GLOBAL ? "" : JavaStringEscapes.wrapJavaString(scope.toString())+", ")+
+            JavaStringEscapes.wrapJavaString(componentId)+
             ")";
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/utils/common/src/main/java/brooklyn/util/text/StringEscapes.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/text/StringEscapes.java b/utils/common/src/main/java/brooklyn/util/text/StringEscapes.java
index 6d35361..b5b4976 100644
--- a/utils/common/src/main/java/brooklyn/util/text/StringEscapes.java
+++ b/utils/common/src/main/java/brooklyn/util/text/StringEscapes.java
@@ -24,6 +24,8 @@ import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -205,6 +207,12 @@ public class StringEscapes {
             }
             return out.toString();
         }
+        public static List<String> wrapJavaStrings(Iterable<String> values) {
+            if (values==null) return null;
+            List<String> result = MutableList.of();
+            for (String v: values) result.add(wrapJavaString(v));
+            return result;
+        }
 
         /** as {@link #unwrapJavaString(String)} if the given string is wrapped in double quotes;
          * otherwise just returns the given string */
@@ -215,13 +223,17 @@ public class StringEscapes {
 
         /** converts normal string to java escaped for double-quotes and wrapped in those double quotes */
         public static void wrapJavaString(String value, Appendable out) throws IOException {
-            out.append('"');
-            escapeJavaString(value, out);
-            out.append('"');
+            if (value==null) {
+                out.append("null");
+            } else {
+                out.append('"');
+                escapeJavaString(value, out);
+                out.append('"');
+            }
         }
 
         /** converts normal string to java escaped for double-quotes (but not wrapped in double quotes) */
-        public static void escapeJavaString(String value, Appendable out) throws IOException {
+        public static void escapeJavaString(@Nonnull String value, Appendable out) throws IOException {
             for (int i=0; i<value.length(); i++) {
                 char c = value.charAt(i);
                 if (c=='\\' || c=='"') {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/utils/common/src/main/java/brooklyn/util/text/Strings.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/text/Strings.java b/utils/common/src/main/java/brooklyn/util/text/Strings.java
index cf61fad..5aa2089 100644
--- a/utils/common/src/main/java/brooklyn/util/text/Strings.java
+++ b/utils/common/src/main/java/brooklyn/util/text/Strings.java
@@ -687,7 +687,12 @@ public class Strings {
 
     /** returns toString of the object if it is not null, otherwise null */
     public static String toString(Object o) {
-        if (o==null) return null;
+        return toStringWithValueForNull(o, null);
+    }
+
+    /** returns toString of the object if it is not null, otherwise the given value */
+    public static String toStringWithValueForNull(Object o, String valueIfNull) {
+        if (o==null) return valueIfNull;
         return o.toString();
     }
 
@@ -807,15 +812,32 @@ public class Strings {
         return ies(count);
     }
 
-    /** converts a map of any objects to a map of strings, preserving nulls and invoking toString where needed */
+    /** converts a map of any objects to a map of strings, using the tostring, and returning "null" for nulls 
+     * @deprecated since 0.7.0 use {@link #toStringMap(Map, String)} to remove ambiguity about how to handle null */
+    // NB previously the javadoc here was wrong, said it returned null not "null"
+    @Deprecated
     public static Map<String, String> toStringMap(Map<?,?> map) {
+        return toStringMap(map, "null");
+    }
+    /** converts a map of any objects to a map of strings, using {@link Object#toString()},
+     * with the second argument used where a value (or key) is null */
+    public static Map<String, String> toStringMap(Map<?,?> map, String valueIfNull) {
         if (map==null) return null;
         Map<String,String> result = MutableMap.<String, String>of();
         for (Map.Entry<?,?> e: map.entrySet()) {
-            result.put(String.valueOf(e.getKey()), String.valueOf(e.getValue()));
+            result.put(toStringWithValueForNull(e.getKey(), valueIfNull), toStringWithValueForNull(e.getValue(), valueIfNull));
         }
         return result;
     }
+    
+    /** converts a list of any objects to a list of strings, using {@link Object#toString()},
+     * with the second argument used where an entry is null */
+    public static List<String> toStringList(List<?> list, String valueIfNull) {
+        if (list==null) return null;
+        List<String> result = MutableList.of();
+        for (Object v: list) result.add(toStringWithValueForNull(v, valueIfNull));
+        return result;
+    }
 
     /** returns base repeated count times */
     public static String repeat(String base, int count) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ea8da379/utils/common/src/main/java/brooklyn/util/time/Durations.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/time/Durations.java b/utils/common/src/main/java/brooklyn/util/time/Durations.java
index 3553ff4..21450a6 100644
--- a/utils/common/src/main/java/brooklyn/util/time/Durations.java
+++ b/utils/common/src/main/java/brooklyn/util/time/Durations.java
@@ -18,6 +18,7 @@
  */
 package brooklyn.util.time;
 
+import java.util.concurrent.CancellationException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -52,6 +53,8 @@ public class Durations {
             return Maybe.of(t.get(timeout.toMilliseconds(), TimeUnit.MILLISECONDS));
         } catch (TimeoutException e) {
             return Maybe.absent("Task "+t+" did not complete within "+timeout);
+        } catch (CancellationException e) {
+            return Maybe.absent("Task "+t+" was cancelled");
         } catch (Exception e) {
             throw Exceptions.propagate(e);
         }


[38/50] [abbrv] brooklyn-server git commit: More fixes to build poms in preparation for release

Posted by he...@apache.org.
More fixes to build poms in preparation for release

Backport of fix on master by Hadrian Zbarcea <ha...@apache.org>


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

Branch: refs/heads/0.7.0-incubating
Commit: cc70cc5859b105c5be6fddb902a28f913845d07b
Parents: ffedff1
Author: Hadrian Zbarcea <ha...@apache.org>
Authored: Tue Jul 7 16:51:26 2015 -0400
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jul 15 08:22:09 2015 +0000

----------------------------------------------------------------------
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/cc70cc58/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 0a27184..ae39c02 100644
--- a/pom.xml
+++ b/pom.xml
@@ -111,7 +111,7 @@
         <module>storage/hazelcast</module>
 
         <module>usage/all</module>
-        <!-- module>usage/archetypes/quickstart</module -->
+        <module>usage/archetypes/quickstart</module>
         <module>usage/camp</module>
         <module>usage/cli</module>
         <module>usage/dist</module>


[29/50] [abbrv] brooklyn-server git commit: Prevents Location Events being reported to metering for temporary locations

Posted by he...@apache.org.
Prevents Location Events being reported to metering for temporary locations


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

Branch: refs/heads/0.7.0-incubating
Commit: 392d2bc62f0900994735569a233cf0d7cf661034
Parents: 83797a2
Author: Martin Harris <gi...@nakomis.com>
Authored: Thu Jun 25 15:44:51 2015 +0100
Committer: Martin Harris <gi...@nakomis.com>
Committed: Thu Jun 25 15:46:03 2015 +0100

----------------------------------------------------------------------
 .../main/java/brooklyn/location/basic/AbstractLocation.java   | 7 ++++++-
 .../brooklyn/management/internal/LocalLocationManager.java    | 2 +-
 .../java/brooklyn/management/internal/LocalUsageManager.java  | 6 ++++++
 .../main/java/brooklyn/location/jclouds/JcloudsLocation.java  | 4 +++-
 4 files changed, 16 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/392d2bc6/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/AbstractLocation.java b/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
index 8696378..80aa804 100644
--- a/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/AbstractLocation.java
@@ -36,6 +36,7 @@ import brooklyn.basic.AbstractBrooklynObject;
 import brooklyn.config.ConfigInheritance;
 import brooklyn.config.ConfigKey;
 import brooklyn.config.ConfigKey.HasConfigKey;
+import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.rebind.BasicLocationRebindSupport;
 import brooklyn.entity.rebind.RebindSupport;
 import brooklyn.entity.trait.Configurable;
@@ -86,7 +87,11 @@ public abstract class AbstractLocation extends AbstractBrooklynObject implements
     public static final Logger LOG = LoggerFactory.getLogger(AbstractLocation.class);
 
     public static final ConfigKey<Location> PARENT_LOCATION = new BasicConfigKey<Location>(Location.class, "parentLocation");
-    
+
+    public static final ConfigKey<Boolean> TEMPORARY_LOCATION = ConfigKeys.newBooleanConfigKey("temporaryLocation",
+            "Indicates that the location is a temporary location that has been created to test connectivity, and that" +
+            "the location's events should not be recorded by usage listeners", false);
+
     private final AtomicBoolean configured = new AtomicBoolean();
     
     private Reference<Long> creationTimeUtc = new BasicReference<Long>(System.currentTimeMillis());

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/392d2bc6/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java b/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java
index 2f75120..7d179b6 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalLocationManager.java
@@ -98,7 +98,7 @@ public class LocalLocationManager implements LocationManagerInternal {
             if (createUnmanaged) {
                 spec.removeConfig(CREATE_UNMANAGED);
             }
-            
+
             T loc = locationFactory.createLocation(spec);
             if (!createUnmanaged) {
                 manage(loc);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/392d2bc6/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java b/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java
index 68f5088..305266f 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java
@@ -41,6 +41,7 @@ import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.Lifecycle;
 import brooklyn.internal.storage.BrooklynStorage;
 import brooklyn.location.Location;
+import brooklyn.location.basic.AbstractLocation;
 import brooklyn.location.basic.LocationConfigKeys;
 import brooklyn.location.basic.LocationInternal;
 import brooklyn.management.ManagementContextInjectable;
@@ -284,6 +285,10 @@ public class LocalUsageManager implements UsageManager {
         // but no strong enough feelings yet...
         
         checkNotNull(loc, "location");
+        if (loc.getConfig(AbstractLocation.TEMPORARY_LOCATION)) {
+            log.info("Ignoring location lifecycle usage event for {} (state {}), because location is a temporary location", loc, state);
+            return;
+        }
         checkNotNull(state, "state of location %s", loc);
         if (loc.getId() == null) {
             log.error("Ignoring location lifecycle usage event for {} (state {}), because location has no id", loc, state);
@@ -302,6 +307,7 @@ public class LocalUsageManager implements UsageManager {
             Entity caller = (Entity) callerContext;
             String entityTypeName = caller.getEntityType().getName();
             String appId = caller.getApplicationId();
+
             final LocationUsage.LocationEvent event = new LocationUsage.LocationEvent(state, caller.getId(), entityTypeName, appId, getUser());
             
             ConcurrentMap<String, LocationUsage> usageMap = managementContext.getStorage().<String, LocationUsage>getMap(LOCATION_USAGE_KEY);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/392d2bc6/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index 02b7dde..214f946 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -27,6 +27,7 @@ import static org.jclouds.compute.options.RunScriptOptions.Builder.overrideLogin
 import static org.jclouds.scriptbuilder.domain.Statements.exec;
 
 import brooklyn.util.flags.MethodCoercions;
+import brooklyn.location.basic.AbstractLocation;
 import io.cloudsoft.winrm4j.pywinrm.Session;
 import io.cloudsoft.winrm4j.pywinrm.WinRMFactory;
 
@@ -35,7 +36,6 @@ import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.lang.reflect.Type;
 import java.security.KeyPair;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -1479,6 +1479,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         sshProps.put("user", initialUser);
         sshProps.put("address", hostAndPort.getHostText());
         sshProps.put("port", hostAndPort.getPort());
+        sshProps.put(AbstractLocation.TEMPORARY_LOCATION.getName(), true);
         if (initialPassword.isPresent()) sshProps.put("password", initialPassword.get());
         if (initialPrivateKey.isPresent()) sshProps.put("privateKeyData", initialPrivateKey.get());
         if (initialPrivateKey.isPresent()) sshProps.put("privateKeyData", initialPrivateKey.get());
@@ -1548,6 +1549,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                 SshMachineLocation sshLoc = null;
                 try {
                     if (isManaged()) {
+                        sshProps.put(AbstractLocation.TEMPORARY_LOCATION.getName(), true);
                         sshLoc = getManagementContext().getLocationManager().createLocation(sshProps, SshMachineLocation.class);
                     } else {
                         sshLoc = new SshMachineLocation(sshProps);


[41/50] [abbrv] brooklyn-server git commit: Use proper version property for dependencies

Posted by he...@apache.org.
Use proper version property for dependencies

Backport of fix on master by Hadrian Zbarcea <ha...@apache.org>


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

Branch: refs/heads/0.7.0-incubating
Commit: 229e5fefb78522daeb9ee91522a111df6684b3c3
Parents: 6b7d600
Author: Hadrian Zbarcea <ha...@apache.org>
Authored: Mon Jul 13 13:05:51 2015 -0400
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jul 15 08:22:09 2015 +0000

----------------------------------------------------------------------
 core/pom.xml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/229e5fef/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index b336167..dd91d78 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -51,17 +51,17 @@
         <dependency>
             <groupId>org.apache.brooklyn</groupId>
             <artifactId>brooklyn-utils-groovy</artifactId>
-            <version>${brooklyn.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.brooklyn.camp</groupId>
             <artifactId>camp-base</artifactId>
-            <version>${brooklyn.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.brooklyn.camp</groupId>
             <artifactId>camp-base</artifactId>
-            <version>${brooklyn.version}</version>
+            <version>${project.version}</version>
             <classifier>tests</classifier>
             <scope>test</scope>
         </dependency>


[02/50] [abbrv] brooklyn-server git commit: This closes #704

Posted by he...@apache.org.
This closes #704


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

Branch: refs/heads/0.7.0-incubating
Commit: 8f31efa844499ebeefad11b82035ebb0b57a7c77
Parents: b7a290c 1deefdf
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Jun 24 00:34:59 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:34:59 2015 -0700

----------------------------------------------------------------------
 .../catalog/internal/BasicBrooklynCatalog.java  |  4 +++
 .../main/java/brooklyn/rest/api/CatalogApi.java | 13 ++++++++
 .../rest/resources/CatalogResource.java         |  5 +++
 .../rest/resources/LocationResource.java        | 34 ++++++++++++++++++--
 .../rest/resources/ApiDocResourceTest.java      |  2 +-
 5 files changed, 54 insertions(+), 4 deletions(-)
----------------------------------------------------------------------



[09/50] [abbrv] brooklyn-server git commit: change how freemarker logging is set to remove warning about "logging libraray"

Posted by he...@apache.org.
change how freemarker logging is set to remove warning about "logging libraray"


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

Branch: refs/heads/0.7.0-incubating
Commit: 55441e048c6466a971b0823300ec77f4ddfbc5ae
Parents: e579841
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Jun 20 14:30:55 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:33 2015 -0700

----------------------------------------------------------------------
 .../brooklyn/entity/drivers/downloads/DownloadSubstituters.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/55441e04/core/src/main/java/brooklyn/entity/drivers/downloads/DownloadSubstituters.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/drivers/downloads/DownloadSubstituters.java b/core/src/main/java/brooklyn/entity/drivers/downloads/DownloadSubstituters.java
index 4e44bc7..7ff520a 100644
--- a/core/src/main/java/brooklyn/entity/drivers/downloads/DownloadSubstituters.java
+++ b/core/src/main/java/brooklyn/entity/drivers/downloads/DownloadSubstituters.java
@@ -55,7 +55,7 @@ public class DownloadSubstituters {
         // since this is the main place it is used, let's do it here
         try {
             LOG.debug("Configuring Freemarker logging for Brooklyn to use SLF4J");
-            freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_SLF4J);
+            System.setProperty(freemarker.log.Logger.SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY, freemarker.log.Logger.LIBRARY_NAME_SLF4J);
         } catch (Exception e) {
             LOG.warn("Error setting Freemarker logging: "+e, e);
         }
@@ -124,7 +124,7 @@ public class DownloadSubstituters {
 
     public static String substitute(String basevalue, Map<String,?> substitutions) {
         try {
-            Configuration cfg = new Configuration();
+            Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
             StringTemplateLoader templateLoader = new StringTemplateLoader();
             templateLoader.putTemplate("config", basevalue);
             cfg.setTemplateLoader(templateLoader);


[42/50] [abbrv] brooklyn-server git commit: Remove references to release and gpg as they are reused from apache parent

Posted by he...@apache.org.
Remove references to release and gpg as they are reused from apache parent

Backport of fix on master by Hadrian Zbarcea <ha...@apache.org>


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

Branch: refs/heads/0.7.0-incubating
Commit: 81431ccde6ef290aec75e55b695fd645a086ec14
Parents: cc70cc5
Author: Hadrian Zbarcea <ha...@apache.org>
Authored: Sat Jul 11 12:13:00 2015 -0400
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jul 15 08:22:09 2015 +0000

----------------------------------------------------------------------
 parent/pom.xml             | 29 -----------------------------
 utils/test-support/pom.xml | 16 +++++++---------
 2 files changed, 7 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/81431ccd/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 11d08af..07ccb50 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -642,22 +642,6 @@
                     <version>2.18.1</version>
                 </plugin>
                 <plugin>
-                    <artifactId>maven-gpg-plugin</artifactId>
-                    <version>1.6</version>
-                    <executions>
-                        <execution>
-                            <id>sign-artifacts</id>
-                            <phase>verify</phase>
-                            <goals>
-                                <goal>sign</goal>
-                            </goals>
-                            <configuration>
-                                <executable>gpg2</executable>
-                            </configuration>
-                        </execution>
-                    </executions>
-                </plugin>
-                <plugin>
                     <artifactId>maven-jar-plugin</artifactId>
                     <!-- version 2.4+ seems to break eclipse integration as per https://github.com/tesla/m2eclipse-extras/issues/10
                          but cannot find issue on GitHub any more - 404 error -->
@@ -699,19 +683,6 @@
                     </executions>
                 </plugin>
                 <plugin>
-                    <artifactId>maven-release-plugin</artifactId>
-                    <version>2.5.2</version>
-                    <!-- 'release' is not used; easier just to checkout, tag, `mvn deploy` manually
-                         with -Dbrooklyn.deployTo=TARGET ... and note we need to update docs and examples,
-                         which is a non-maven task!) -->
-                    <configuration>
-                        <mavenExecutorId>forked-path</mavenExecutorId>
-                        <useReleaseProfile>false</useReleaseProfile>
-                        <arguments>-Dbrooklyn.deployTo=apache</arguments>
-                        <goals>deploy</goals>
-                    </configuration>
-                </plugin>
-                <plugin>
                     <artifactId>maven-resources-plugin</artifactId>
                     <version>2.7</version>
                 </plugin>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/81431ccd/utils/test-support/pom.xml
----------------------------------------------------------------------
diff --git a/utils/test-support/pom.xml b/utils/test-support/pom.xml
index f7cba63..d6d1d5c 100644
--- a/utils/test-support/pom.xml
+++ b/utils/test-support/pom.xml
@@ -19,15 +19,7 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <packaging>jar</packaging>
     
-    <artifactId>brooklyn-utils-test-support</artifactId>
-    <name>Brooklyn Utilities to Support Testing (listeners etc)</name>
-    
-    <description>
-        Test utility classes and methods developed for Brooklyn but not dependendent on Brooklyn or much else
-    </description>
-
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
@@ -35,6 +27,12 @@
         <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
+    <artifactId>brooklyn-utils-test-support</artifactId>
+    <name>Brooklyn Test Support Utilities</name>
+    <description>
+        Test utility classes and methods developed for Brooklyn but not dependendent on Brooklyn or much else
+    </description>
+
     <dependencies>
         <dependency>
             <groupId>com.google.guava</groupId>
@@ -53,5 +51,5 @@
             <artifactId>slf4j-api</artifactId>
         </dependency>
     </dependencies>
-    
+
 </project>


[22/50] [abbrv] brooklyn-server git commit: more code review of #705

Posted by he...@apache.org.
more code review of #705

tidy yaml time enricher,
and don't log location error message so aggressively


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

Branch: refs/heads/0.7.0-incubating
Commit: 6f356e7969866129591a7b658177081d8a1bc462
Parents: 08d9b7c
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Jun 25 14:20:20 2015 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Jun 25 14:20:20 2015 +0100

----------------------------------------------------------------------
 .../basic/YamlTimeWeightedDeltaEnricher.java    | 41 +++++++++++---------
 .../location/basic/BasicLocationRegistry.java   |  2 +-
 2 files changed, 23 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f356e79/core/src/main/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricher.java b/core/src/main/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricher.java
index b515da4..5a384e0 100644
--- a/core/src/main/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricher.java
+++ b/core/src/main/java/brooklyn/enricher/basic/YamlTimeWeightedDeltaEnricher.java
@@ -41,6 +41,7 @@ import com.google.common.base.Function;
 public class YamlTimeWeightedDeltaEnricher<T extends Number> extends AbstractTransformer<T,Double> {
     private static final Logger LOG = LoggerFactory.getLogger(YamlTimeWeightedDeltaEnricher.class);
     
+    transient Object lock = new Object();
     Number lastValue;
     long lastTime = -1;
     
@@ -52,28 +53,30 @@ public class YamlTimeWeightedDeltaEnricher<T extends Number> extends AbstractTra
         return new Function<SensorEvent<T>, Double>() {
             @Override
             public Double apply(SensorEvent<T> event) {
-                Number current = TypeCoercions.coerce(event.getValue(), Double.class);
-                
-                if (current == null) return null;
+                synchronized (lock) {
+                    Double current = TypeCoercions.coerce(event.getValue(), Double.class);
 
-                long eventTime = event.getTimestamp();
-                long unitMillis = getConfig(DELTA_PERIOD).toMilliseconds();
-                Double result = null;
-                
-                if (eventTime > 0 && eventTime > lastTime) {
-                    if (lastValue == null || lastTime < 0) {
-                        // cannot calculate time-based delta with a single value
-                        if (LOG.isTraceEnabled()) LOG.trace("{} received event but no last value so will not emit, null -> {} at {}", new Object[] {this, current, eventTime}); 
-                    } else {
-                        double duration = eventTime - lastTime;
-                        result = (current.doubleValue() - lastValue.doubleValue()) / (duration / unitMillis);
+                    if (current == null) return null;
+
+                    long eventTime = event.getTimestamp();
+                    long unitMillis = getConfig(DELTA_PERIOD).toMilliseconds();
+                    Double result = null;
+
+                    if (eventTime > 0 && eventTime > lastTime) {
+                        if (lastValue == null || lastTime < 0) {
+                            // cannot calculate time-based delta with a single value
+                            if (LOG.isTraceEnabled()) LOG.trace("{} received event but no last value so will not emit, null -> {} at {}", new Object[] {this, current, eventTime}); 
+                        } else {
+                            double duration = eventTime - lastTime;
+                            result = (current - lastValue.doubleValue()) / (duration / unitMillis);
+                        }
                     }
+
+                    lastValue = current;
+                    lastTime = eventTime;
+
+                    return result;
                 }
-                
-                lastValue = current;
-                lastTime = eventTime;
-                
-                return result;
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f356e79/core/src/main/java/brooklyn/location/basic/BasicLocationRegistry.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/BasicLocationRegistry.java b/core/src/main/java/brooklyn/location/basic/BasicLocationRegistry.java
index 2b1980c..0fc6913 100644
--- a/core/src/main/java/brooklyn/location/basic/BasicLocationRegistry.java
+++ b/core/src/main/java/brooklyn/location/basic/BasicLocationRegistry.java
@@ -344,7 +344,7 @@ public class BasicLocationRegistry implements LocationRegistry {
                             + resolvers.keySet()+" are the only available location resolvers. "
                             + "More information can be found in the logs.";
                 } else {
-                    log.warn("Location resolution failed for '"+spec+"' (will fail shortly): known resolvers are: "+resolvers.keySet());
+                    log.debug("Location resolution failed for '"+spec+"' (if this is being loaded it will fail shortly): known resolvers are: "+resolvers.keySet());
                     errmsg = "Unknown location '"+spec+"': "
                             + "either this location is not recognised or there is a problem with location resolver configuration.";
                 }


[34/50] [abbrv] brooklyn-server git commit: Update pom.xml GnuPG settings

Posted by he...@apache.org.
Update pom.xml GnuPG settings

Sets the executable to gpg2, which is the usual name for the latest gpg
versions both on Linux and MacPorts.

Removes the set-empty-passphrase property. With gpg-agent correctly set
up, this means that the signing process will prompt for the GPG
passphrase when it is first needed, and cache the value for the
remainder of the build. This is more secure than writing down a GPG
passphrase either in settings.xml, pom.xml, or anywhere where it might
up in a command line history file.

Setting up gpg-agent in 10 seconds:

- Install a pinentry package. pinentry-mac from MacPorts;
  pinentry-curses if you are remoting into a Linux machine
- Install gpg-agent if not already installed (on Ubuntu you'll need to
  apt-get install gnupg-agent; but on MacPorts it's part of the gnupg2
  package)
- Start the agent:
  - gpg-agent --daemon --write-env-file "${HOME}/.gpg-agent-info"
  - GPG_TTY=$(tty)
  - export GPG_AGENT_INFO GPG_TTY


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

Branch: refs/heads/0.7.0-incubating
Commit: 6b83a364ff07a8198c2529423c5a8dcadcd718c0
Parents: 18c800a
Author: Richard Downer <ri...@apache.org>
Authored: Thu Jun 25 16:39:49 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Fri Jun 26 13:05:23 2015 +0100

----------------------------------------------------------------------
 pom.xml | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6b83a364/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 60b8203..e007484 100644
--- a/pom.xml
+++ b/pom.xml
@@ -216,11 +216,6 @@
         <commons-codec.version>1.9</commons-codec.version>
         <log4j.version>1.2.17</log4j.version>
         <commons-logging.version>1.2</commons-logging.version>
-
-        <!-- Release -->
-        <!-- no passphrase by default, so we can do automated deploy builds;
-             you can still supply your own passphrase with -Dgpg.passphrase=XXX -->
-        <gpg.passphrase />
     </properties>
 
     <dependencyManagement>
@@ -711,6 +706,9 @@
                             <goals>
                                 <goal>sign</goal>
                             </goals>
+                            <configuration>
+                                <executable>gpg2</executable>
+                            </configuration>
                         </execution>
                     </executions>
                 </plugin>


[08/50] [abbrv] brooklyn-server git commit: expand string-to-sensor coercion to make sensors easier to write in yaml

Posted by he...@apache.org.
expand string-to-sensor coercion to make sensors easier to write in yaml


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

Branch: refs/heads/0.7.0-incubating
Commit: 5eefb7bf7094e56116968e6b0e77ee06e32d7082
Parents: 55441e0
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sun Jun 21 11:58:50 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:33 2015 -0700

----------------------------------------------------------------------
 .../brooklyn/enricher/basic/Propagator.java     |  5 ++-
 .../java/brooklyn/util/flags/TypeCoercions.java | 32 ++++++++++++++++++--
 2 files changed, 34 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/5eefb7bf/core/src/main/java/brooklyn/enricher/basic/Propagator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/Propagator.java b/core/src/main/java/brooklyn/enricher/basic/Propagator.java
index 7d6e383..86795c6 100644
--- a/core/src/main/java/brooklyn/enricher/basic/Propagator.java
+++ b/core/src/main/java/brooklyn/enricher/basic/Propagator.java
@@ -36,6 +36,8 @@ import brooklyn.event.SensorEvent;
 import brooklyn.event.SensorEventListener;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.flags.SetFromFlag;
+import brooklyn.util.task.Tasks;
+import brooklyn.util.time.Duration;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
@@ -93,7 +95,8 @@ public class Propagator extends AbstractEnricher implements SensorEventListener<
                 throw new IllegalStateException("Propagator enricher "+this+" must not have 'propagating' set at same time as either 'propagatingAll' or 'propagatingAllBut'");
             }
             
-            for (Sensor<?> sensor : getConfig(PROPAGATING)) {
+            for (Object sensorO : getConfig(PROPAGATING)) {
+                Sensor<?> sensor = Tasks.resolving(sensorO).as(Sensor.class).timeout(Duration.millis(50)).context(producer).get();
                 if (!sensorMappingTemp.containsKey(sensor)) {
                     sensorMappingTemp.put(sensor, sensor);
                 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/5eefb7bf/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/flags/TypeCoercions.java b/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
index 55649e8..c2876bd 100644
--- a/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
+++ b/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
@@ -45,11 +45,14 @@ import javax.annotation.concurrent.GuardedBy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.BrooklynTaskTags;
 import brooklyn.entity.basic.ClosureEntityFactory;
 import brooklyn.entity.basic.ConfigurableEntityFactory;
 import brooklyn.entity.basic.ConfigurableEntityFactoryFromEntityFactory;
 import brooklyn.event.AttributeSensor;
-import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.event.Sensor;
+import brooklyn.event.basic.Sensors;
 import brooklyn.internal.BrooklynInitialization;
 import brooklyn.util.JavaGroovyEquivalents;
 import brooklyn.util.collections.MutableSet;
@@ -61,6 +64,7 @@ import brooklyn.util.javalang.Enums;
 import brooklyn.util.net.Cidr;
 import brooklyn.util.net.Networking;
 import brooklyn.util.net.UserAndHostAndPort;
+import brooklyn.util.task.Tasks;
 import brooklyn.util.text.StringEscapes.JavaStringEscapes;
 import brooklyn.util.text.Strings;
 import brooklyn.util.time.Duration;
@@ -723,7 +727,31 @@ public class TypeCoercions {
         registerAdapter(String.class, AttributeSensor.class, new Function<String,AttributeSensor>() {
             @Override
             public AttributeSensor apply(final String input) {
-                return new BasicAttributeSensor<Object>(Object.class, input);
+                Entity entity = BrooklynTaskTags.getContextEntity(Tasks.current());
+                if (entity!=null) {
+                    Sensor<?> result = null;
+                    if (entity!=null) {
+                        result = entity.getEntityType().getSensor(input);
+                        if (result instanceof AttributeSensor) 
+                            return (AttributeSensor) result;
+                    }
+                }
+                return Sensors.newSensor(Object.class, input);
+            }
+        });
+        registerAdapter(String.class, Sensor.class, new Function<String,Sensor>() {
+            @Override
+            public AttributeSensor apply(final String input) {
+                Entity entity = BrooklynTaskTags.getContextEntity(Tasks.current());
+                if (entity!=null) {
+                    Sensor<?> result = null;
+                    if (entity!=null) {
+                        result = entity.getEntityType().getSensor(input);
+                        if (result != null) 
+                            return (AttributeSensor) result;
+                    }
+                }
+                return Sensors.newSensor(Object.class, input);
             }
         });
         registerAdapter(String.class, List.class, new Function<String,List>() {


[23/50] [abbrv] brooklyn-server git commit: Fix AutoScaler integration test - MIN_POOL_SIZE is 1 now.

Posted by he...@apache.org.
Fix AutoScaler integration test - MIN_POOL_SIZE is 1 now.


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

Branch: refs/heads/0.7.0-incubating
Commit: fc62114d28cff414e5c5e280e4778185153fea85
Parents: 08d9b7c
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Tue Jun 23 13:37:55 2015 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Jun 25 16:38:44 2015 +0300

----------------------------------------------------------------------
 .../brooklyn/policy/autoscaling/AutoScalerPolicyMetricTest.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fc62114d/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyMetricTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyMetricTest.java b/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyMetricTest.java
index 4120614..0af8db5 100644
--- a/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyMetricTest.java
+++ b/policy/src/test/java/brooklyn/policy/autoscaling/AutoScalerPolicyMetricTest.java
@@ -125,7 +125,7 @@ public class AutoScalerPolicyMetricTest {
         Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), currentSizeAsserter(tc, 2));
         
         tc.setAttribute(MY_ATTRIBUTE, 0);
-        Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), currentSizeAsserter(tc, 0));
+        Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), currentSizeAsserter(tc, 1));
     }
     
     @Test(groups="Integration")


[06/50] [abbrv] brooklyn-server git commit: copy the brooklyn/default.catalog.bom from the usage/cli project into the dist

Posted by he...@apache.org.
copy the brooklyn/default.catalog.bom from the usage/cli project into the dist

this allows the same default bom to be used from the IDE as included in the dist,
and changes only need to be made in a single place (in the cli project)


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

Branch: refs/heads/0.7.0-incubating
Commit: 53b820e9cd868452a34737d9367a85530e11b982
Parents: b752d54
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Jun 15 17:34:16 2015 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:32 2015 -0700

----------------------------------------------------------------------
 usage/cli/pom.xml                               | 23 ++++++++
 .../main/resources/brooklyn/default.catalog.bom | 58 +++++++++++++-------
 2 files changed, 61 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/53b820e9/usage/cli/pom.xml
----------------------------------------------------------------------
diff --git a/usage/cli/pom.xml b/usage/cli/pom.xml
index ac4f0fc..91894f1 100644
--- a/usage/cli/pom.xml
+++ b/usage/cli/pom.xml
@@ -133,6 +133,29 @@
                     </execution>
                 </executions>
             </plugin>
+            
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>attach-catalog</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>attach-artifact</goal>
+                        </goals>
+                        <configuration>
+                            <artifacts>
+                                <artifact>
+                                    <file>${project.build.directory}/classes/brooklyn/default.catalog.bom</file>
+                                    <type>bom</type>
+                                    <classifier>dist</classifier>
+                                </artifact>
+                            </artifacts>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
 
             <!-- Disable the automatic LICENSE/NOTICE placement from the upstream pom, because we need to include
                  bloodhound.js. See "resources" section below for where we include the new LICENSE/NOTICE -->

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/53b820e9/usage/cli/src/main/resources/brooklyn/default.catalog.bom
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/resources/brooklyn/default.catalog.bom b/usage/cli/src/main/resources/brooklyn/default.catalog.bom
index 0db2f20..42672ae 100644
--- a/usage/cli/src/main/resources/brooklyn/default.catalog.bom
+++ b/usage/cli/src/main/resources/brooklyn/default.catalog.bom
@@ -1,23 +1,41 @@
-# 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.
-#
 
-# this catalog bom simply scans.
-# in a dist a default.catalog.bom from the conf/ dir takes precedence.
+# this catalog bom is an illustration supplying a few useful sample items
+# and templates to get started using Brooklyn
 
 brooklyn.catalog:
-  scanJavaAnnotations: true
+  version: 0.7.0-SNAPSHOT  # BROOKLYN_VERSION
+  items:
+
+  # load everything in the classpath with a @Catalog annotation
+  - scanJavaAnnotations: true
+
+  - id: server
+    description: |
+      Provision a server, with customizable provisioning.properties and credentials installed, 
+      but no other special software process or scripts executed.
+    item:
+      type: brooklyn.entity.basic.EmptySoftwareProcess
+      name: Server
+
+  - id: server-template
+    itemType: template
+    name: Server Template
+    description: |
+      Sample YAML to provision a server in a cloud with illustrative VM properties
+    item:
+      name: My App with a single VM
+      services:
+      - type: server
+        name: My VM
+      location:
+        jclouds:aws-ec2:
+          identity: <REPLACE>
+          credential: <REPLACE>
+          region: eu-west-1
+          # we want Ubuntu, with a lot of RAM
+          osFamily: ubuntu
+          minRam: 8gb
+          # set up this user and password (default is to authorize a public key)
+          user: sample
+          password: s4mpl3
+


[45/50] [abbrv] brooklyn-server git commit: Introduce a parent/pom and prepare for release

Posted by he...@apache.org.
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/policy/pom.xml
----------------------------------------------------------------------
diff --git a/policy/pom.xml b/policy/pom.xml
index 6c42052..34c3c8e 100644
--- a/policy/pom.xml
+++ b/policy/pom.xml
@@ -30,7 +30,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../pom.xml</relativePath>
+        <relativePath>../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>


[12/50] [abbrv] brooklyn-server git commit: skip validation for "template" catalog items as that isn't always supported

Posted by he...@apache.org.
skip validation for "template" catalog items as that isn't always supported

prevents errors on startup and in log for catalog rest api calls


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

Branch: refs/heads/0.7.0-incubating
Commit: f5336d6fa5f12fbe9f227a2e4d40cf81541dbf5d
Parents: 6b09d03
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Jun 20 11:13:49 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:33 2015 -0700

----------------------------------------------------------------------
 .../catalog/internal/BasicBrooklynCatalog.java  |  3 ++-
 .../BrooklynAssemblyTemplateInstantiator.java   |  2 +-
 .../spi/creation/BrooklynEntityMatcher.java     |  6 ++---
 usage/cli/src/main/java/brooklyn/cli/Main.java  | 15 ++++++++---
 .../rest/transform/CatalogTransformer.java      | 27 ++++++++++++--------
 .../src/main/java/brooklyn/util/yaml/Yamls.java | 10 +++++++-
 .../test/java/brooklyn/util/yaml/YamlsTest.java | 20 +++++++++++++++
 7 files changed, 62 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f5336d6f/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
index 31458f5..37af858 100644
--- a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
+++ b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
@@ -325,8 +325,9 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     @SuppressWarnings("unchecked")
     @Override
     public <T, SpecT> SpecT createSpec(CatalogItem<T, SpecT> item) {
+        if (item == null) return null;
         CatalogItemDo<T,SpecT> loadedItem = (CatalogItemDo<T, SpecT>) getCatalogItemDo(item.getSymbolicName(), item.getVersion());
-        if (loadedItem == null) return null;
+        if (loadedItem == null) throw new RuntimeException(item+" not in catalog; cannot create spec");
         Class<SpecT> specType = loadedItem.getSpecType();
         if (specType==null) return null;
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f5336d6f/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
index 1519326..68136f2 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
@@ -183,7 +183,7 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateSpe
                 // TODO support https above
                 // TODO this will probably be logged if we refer to  chef:cookbook  or other service types which BCTR accepts;
                 // better would be to have BCTR supporting the calls above
-                log.warn("The reference " + brooklynType + " looks like an URL but the protocol " +
+                log.debug("The reference " + brooklynType + " looks like a URL (running the CAMP Brooklyn assembly-template instantiator) but the protocol " +
                         protocol + " isn't white listed (" + BrooklynCampConstants.YAML_URL_PROTOCOL_WHITELIST + "). " +
                         "Will try to load it as catalog item or java type.");
             }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f5336d6f/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
index aae2b19..50b57e9 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
@@ -80,7 +80,7 @@ public class BrooklynEntityMatcher implements PdpMatcher {
                 if (BrooklynCampConstants.YAML_URL_PROTOCOL_WHITELIST.contains(protocol)) {
                     return serviceType;
                 } else {
-                    log.warn("The reference '" + serviceType + "' looks like an URL but the protocol '" + 
+                    log.debug("The reference '" + serviceType + "' looks like a URL (running the CAMP Brooklyn entity-matcher) but the protocol '" + 
                             protocol + "' isn't white listed " + BrooklynCampConstants.YAML_URL_PROTOCOL_WHITELIST + ". " +
                             "Not recognized as catalog item or java item as well!");
                 }
@@ -229,9 +229,7 @@ public class BrooklynEntityMatcher implements PdpMatcher {
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
             if (e.toString().contains("Could not find")) {
-                // TODO currently we get this error if a catalog item is passed, giving stack trace is too scary;
-                // when we are doing catalog.createSpec let's remove this block
-                log.warn("Ignoring configuration attributes on "+typeName+", item probably loaded from catalog and flags are not yet supported here");
+                // normal for catalog items, there will be no java type
                 log.debug("Ignoring configuration attributes on "+typeName+", details: "+e);
             } else {
                 log.warn("Ignoring configuration attributes on "+typeName+" due to "+e, e);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f5336d6f/usage/cli/src/main/java/brooklyn/cli/Main.java
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/java/brooklyn/cli/Main.java b/usage/cli/src/main/java/brooklyn/cli/Main.java
index 0f93057..80d2b05 100644
--- a/usage/cli/src/main/java/brooklyn/cli/Main.java
+++ b/usage/cli/src/main/java/brooklyn/cli/Main.java
@@ -41,6 +41,7 @@ import brooklyn.BrooklynVersion;
 import brooklyn.basic.BrooklynTypes;
 import brooklyn.catalog.BrooklynCatalog;
 import brooklyn.catalog.CatalogItem;
+import brooklyn.catalog.CatalogItem.CatalogItemType;
 import brooklyn.catalog.internal.CatalogInitialization;
 import brooklyn.cli.CloudExplorer.BlobstoreGetBlobCommand;
 import brooklyn.cli.CloudExplorer.BlobstoreListContainerCommand;
@@ -633,11 +634,17 @@ public class Main extends AbstractMain {
             Iterable<CatalogItem<Object, Object>> items = catalog.getCatalogItems();
             for (CatalogItem<Object, Object> item: items) {
                 try {
-                    Object spec = catalog.createSpec(item);
-                    if (spec instanceof EntitySpec) {
-                        BrooklynTypes.getDefinedEntityType(((EntitySpec<?>)spec).getType());
+                    if (item.getCatalogItemType()==CatalogItemType.TEMPLATE) {
+                        // skip validation of templates, they might contain instructions,
+                        // and additionally they might contain multiple items in which case
+                        // the validation below won't work anyway (you need to go via a deployment plan)
+                    } else {
+                        Object spec = catalog.createSpec(item);
+                        if (spec instanceof EntitySpec) {
+                            BrooklynTypes.getDefinedEntityType(((EntitySpec<?>)spec).getType());
+                        }
+                        log.debug("Catalog loaded spec "+spec+" for item "+item);
                     }
-                    log.debug("Catalog loaded spec "+spec+" for item "+item);                      
                 } catch (Throwable throwable) {
                     catInit.handleException(throwable, item);
                 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f5336d6f/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java b/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java
index 053a9c3..a9f9baf 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java
@@ -59,21 +59,28 @@ public class CatalogTransformer {
     private static final org.slf4j.Logger log = LoggerFactory.getLogger(CatalogTransformer.class);
     
     public static CatalogEntitySummary catalogEntitySummary(BrooklynRestResourceUtils b, CatalogItem<? extends Entity,EntitySpec<?>> item) {
-        EntitySpec<?> spec = b.getCatalog().createSpec(item);
-        EntityDynamicType typeMap = BrooklynTypes.getDefinedEntityType(spec.getType());
-        EntityType type = typeMap.getSnapshot();
-
         Set<EntityConfigSummary> config = Sets.newTreeSet(SummaryComparators.nameComparator());
         Set<SensorSummary> sensors = Sets.newTreeSet(SummaryComparators.nameComparator());
         Set<EffectorSummary> effectors = Sets.newTreeSet(SummaryComparators.nameComparator());
 
-        for (ConfigKey<?> x: type.getConfigKeys())
-            config.add(EntityTransformer.entityConfigSummary(x, typeMap.getConfigKeyField(x.getName())));
-        for (Sensor<?> x: type.getSensors())
-            sensors.add(SensorTransformer.sensorSummaryForCatalog(x));
-        for (Effector<?> x: type.getEffectors())
-            effectors.add(EffectorTransformer.effectorSummaryForCatalog(x));
+        try {
+            EntitySpec<?> spec = b.getCatalog().createSpec(item);
+            EntityDynamicType typeMap = BrooklynTypes.getDefinedEntityType(spec.getType());
+            EntityType type = typeMap.getSnapshot();
 
+            for (ConfigKey<?> x: type.getConfigKeys())
+                config.add(EntityTransformer.entityConfigSummary(x, typeMap.getConfigKeyField(x.getName())));
+            for (Sensor<?> x: type.getSensors())
+                sensors.add(SensorTransformer.sensorSummaryForCatalog(x));
+            for (Effector<?> x: type.getEffectors())
+                effectors.add(EffectorTransformer.effectorSummaryForCatalog(x));
+            
+        } catch (Exception e) {
+            // templates with multiple entities can't have spec created in the manner above; just ignore
+            if (log.isTraceEnabled())
+                log.trace("Unable to create spec for "+item+": "+e, e);
+        }
+        
         return new CatalogEntitySummary(item.getSymbolicName(), item.getVersion(), item.getDisplayName(),
             item.getJavaType(), item.getPlanYaml(),
             item.getDescription(), tidyIconLink(b, item, item.getIconUrl()),

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f5336d6f/utils/common/src/main/java/brooklyn/util/yaml/Yamls.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/yaml/Yamls.java b/utils/common/src/main/java/brooklyn/util/yaml/Yamls.java
index 2ad9eee..b46e9d1 100644
--- a/utils/common/src/main/java/brooklyn/util/yaml/Yamls.java
+++ b/utils/common/src/main/java/brooklyn/util/yaml/Yamls.java
@@ -44,6 +44,7 @@ import org.yaml.snakeyaml.nodes.SequenceNode;
 import brooklyn.util.collections.Jsonya;
 import brooklyn.util.collections.MutableList;
 import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.exceptions.UserFacingException;
 import brooklyn.util.text.Strings;
 
 import com.google.common.annotations.Beta;
@@ -350,7 +351,11 @@ public class Yamls {
                 if (e instanceof KnownClassVersionException) {
                     log.debug("Known class version exception; no yaml text being matched for "+this+": "+e);
                 } else {
-                    log.warn("Unable to match yaml text in "+this+": "+e, e);
+                    if (e instanceof UserFacingException) {
+                        log.warn("Unable to match yaml text in "+this+": "+e.getMessage());
+                    } else {
+                        log.warn("Unable to match yaml text in "+this+": "+e, e);
+                    }
                 }
                 return null;
             }
@@ -402,6 +407,9 @@ b: 1
  */
             List<String> result = MutableList.of();
             if (includePrecedingComments) {
+                if (getEndOfPrevious() > getStartOfThis()) {
+                    throw new UserFacingException("YAML not in expected format; when scanning, previous end "+getEndOfPrevious()+" exceeds this start "+getStartOfThis());
+                }
                 String[] preceding = yaml.substring(getEndOfPrevious(), getStartOfThis()).split("\n");
                 // suppress comments which are on the same line as the previous item or indented more than firstLineIndentation,
                 // ensuring appropriate whitespace is added to preceding[0] if it starts mid-line

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f5336d6f/utils/common/src/test/java/brooklyn/util/yaml/YamlsTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/brooklyn/util/yaml/YamlsTest.java b/utils/common/src/test/java/brooklyn/util/yaml/YamlsTest.java
index 36c146b..6cd90f8 100644
--- a/utils/common/src/test/java/brooklyn/util/yaml/YamlsTest.java
+++ b/utils/common/src/test/java/brooklyn/util/yaml/YamlsTest.java
@@ -28,6 +28,8 @@ import org.testng.TestNG;
 import org.testng.annotations.Test;
 
 import brooklyn.util.collections.MutableList;
+import brooklyn.util.exceptions.UserFacingException;
+import brooklyn.util.yaml.Yamls.YamlExtract;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -162,6 +164,24 @@ public class YamlsTest {
             "x: \n   c: 1\n   d: 2");
     }
 
+    @Test
+    public void testExtractNoOOBE() {
+        // this might log a warning, as item not found, but won't throw
+        YamlExtract r1 = Yamls.getTextOfYamlAtPath(
+            "items:\n- id: sample2\n  itemType: location\n  item:\n    type: jclouds:aws-ec2\n    brooklyn.config:\n      key2: value2\n\n",
+            "item");
+        
+        // won't throw
+        r1.getMatchedYamlTextOrWarn();
+        // will throw
+        try {
+            r1.getMatchedYamlText();
+            Assert.fail();
+        } catch (UserFacingException e) {
+            // expected, it should give a vaguely explanatory exception and no trace
+        }
+    }
+    
     // convenience, since running with older TestNG IDE plugin will fail (older snakeyaml dependency);
     // if you run as a java app it doesn't bring in the IDE TestNG jar version, and it works
     public static void main(String[] args) {


[49/50] [abbrv] brooklyn-server git commit: brooklyn-launcher depends on brooklyn-jsgui

Posted by he...@apache.org.
brooklyn-launcher depends on brooklyn-jsgui


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

Branch: refs/heads/0.7.0-incubating
Commit: fcec988d819aa9093360b9cc0e0173c94e44e057
Parents: 82e2490
Author: Richard Downer <ri...@apache.org>
Authored: Tue Jul 14 15:06:04 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jul 15 08:22:09 2015 +0000

----------------------------------------------------------------------
 usage/launcher/pom.xml | 10 ++++++++++
 1 file changed, 10 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcec988d/usage/launcher/pom.xml
----------------------------------------------------------------------
diff --git a/usage/launcher/pom.xml b/usage/launcher/pom.xml
index d8dbe90..2eb0909 100644
--- a/usage/launcher/pom.xml
+++ b/usage/launcher/pom.xml
@@ -135,6 +135,16 @@
 
         <dependency>
             <groupId>org.apache.brooklyn</groupId>
+            <artifactId>brooklyn-jsgui</artifactId>
+            <version>${project.version}</version>
+            <type>war</type>
+            <!-- declare the dependency so that it is ready for when the copy-dependency step below needs it -->
+            <!-- without this, brooklyn-jsgui might get build *after* this one, so the copy-dependency fails -->
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.brooklyn</groupId>
             <artifactId>brooklyn-logback-xml</artifactId>
             <version>${project.version}</version>
             <!-- optional so that this project has logging; dependencies may redeclare or supply their own -->


[32/50] [abbrv] brooklyn-server git commit: This closes #719

Posted by he...@apache.org.
This closes #719


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

Branch: refs/heads/0.7.0-incubating
Commit: 18c800a393d60c33e79f8fc10e0c4f5763e7f63e
Parents: 392d2bc c631e4d
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Jun 26 12:19:35 2015 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Jun 26 12:19:35 2015 +0100

----------------------------------------------------------------------
 .../brooklyn/test/TestHttpRequestHandler.java   |  73 ++++++++++
 .../test/java/brooklyn/test/TestHttpServer.java | 144 +++++++++++++++++++
 .../brooklyn/util/ResourceUtilsHttpTest.java    |  84 +++--------
 .../autoscaling/AutoScalerPolicyMetricTest.java |   2 +-
 .../entity/brooklynnode/BrooklynNodeImpl.java   |  22 ++-
 .../BrooklynNodeIntegrationTest.java            |  11 +-
 .../software/http/HttpRequestSensorTest.java    |  20 ++-
 .../rest/resources/CatalogResetTest.java        |  83 ++---------
 8 files changed, 290 insertions(+), 149 deletions(-)
----------------------------------------------------------------------



[28/50] [abbrv] brooklyn-server git commit: Merge and close #714 (reviewed by @mikezaccardo)

Posted by he...@apache.org.
Merge and close #714 (reviewed by @mikezaccardo)


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

Branch: refs/heads/0.7.0-incubating
Commit: 83797a28207c5d6b124b9b3aa2e2c020f5c03c0f
Parents: b2d715c 6023536
Author: Richard Downer <ri...@apache.org>
Authored: Thu Jun 25 15:22:58 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Thu Jun 25 15:22:58 2015 +0100

----------------------------------------------------------------------
 .../brooklyn/util/flags/MethodCoercions.java    | 183 +++++++++++++++++++
 .../util/flags/MethodCoercionsTest.java         | 146 +++++++++++++++
 .../location/jclouds/JcloudsLocation.java       |  43 +----
 3 files changed, 333 insertions(+), 39 deletions(-)
----------------------------------------------------------------------



[36/50] [abbrv] brooklyn-server git commit: Change version to 0.7.0-incubating

Posted by he...@apache.org.
Change version to 0.7.0-incubating


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

Branch: refs/heads/0.7.0-incubating
Commit: 6491c6dc0143991bdef3dbebb360954f599e3884
Parents: 06bef27
Author: Richard Downer <ri...@apache.org>
Authored: Fri Jun 26 14:10:44 2015 +0000
Committer: Richard Downer <ri...@apache.org>
Committed: Fri Jun 26 14:10:44 2015 +0000

----------------------------------------------------------------------
 api/pom.xml                                                      | 2 +-
 camp/camp-base/pom.xml                                           | 2 +-
 camp/camp-server/pom.xml                                         | 2 +-
 camp/pom.xml                                                     | 2 +-
 core/pom.xml                                                     | 2 +-
 core/src/main/java/brooklyn/BrooklynVersion.java                 | 2 +-
 core/src/test/dependencies/osgi/entities/pom.xml                 | 2 +-
 core/src/test/dependencies/osgi/more-entities-v1/pom.xml         | 2 +-
 .../test/dependencies/osgi/more-entities-v2-evil-twin/pom.xml    | 2 +-
 core/src/test/dependencies/osgi/more-entities-v2/pom.xml         | 2 +-
 .../test/java/brooklyn/management/osgi/OsgiStandaloneTest.java   | 4 ++--
 locations/jclouds/pom.xml                                        | 2 +-
 policy/pom.xml                                                   | 2 +-
 pom.xml                                                          | 4 ++--
 software/base/pom.xml                                            | 2 +-
 .../src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java | 2 +-
 .../base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java | 2 +-
 .../resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml    | 2 +-
 storage/hazelcast/pom.xml                                        | 2 +-
 usage/camp/pom.xml                                               | 2 +-
 usage/cli/pom.xml                                                | 2 +-
 usage/cli/src/main/resources/brooklyn/default.catalog.bom        | 2 +-
 usage/launcher/pom.xml                                           | 2 +-
 usage/logback-includes/pom.xml                                   | 2 +-
 usage/logback-xml/pom.xml                                        | 2 +-
 usage/rest-api/pom.xml                                           | 2 +-
 usage/rest-client/pom.xml                                        | 2 +-
 usage/rest-server/pom.xml                                        | 2 +-
 usage/test-support/pom.xml                                       | 2 +-
 utils/common/pom.xml                                             | 2 +-
 .../src/test/java/brooklyn/util/maven/MavenArtifactTest.java     | 4 ++--
 utils/groovy/pom.xml                                             | 2 +-
 utils/jmx/jmxmp-ssl-agent/pom.xml                                | 2 +-
 utils/jmx/jmxrmi-agent/pom.xml                                   | 2 +-
 utils/rest-swagger/pom.xml                                       | 2 +-
 utils/test-support/pom.xml                                       | 2 +-
 36 files changed, 39 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/api/pom.xml
----------------------------------------------------------------------
diff --git a/api/pom.xml b/api/pom.xml
index 6ffb988..5065448 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -31,7 +31,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/camp/camp-base/pom.xml
----------------------------------------------------------------------
diff --git a/camp/camp-base/pom.xml b/camp/camp-base/pom.xml
index 507831f..9a709be 100644
--- a/camp/camp-base/pom.xml
+++ b/camp/camp-base/pom.xml
@@ -31,7 +31,7 @@
     <parent>
         <groupId>org.apache.brooklyn.camp</groupId>
         <artifactId>camp-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/camp/camp-server/pom.xml
----------------------------------------------------------------------
diff --git a/camp/camp-server/pom.xml b/camp/camp-server/pom.xml
index 45c4117..d6dacd0 100644
--- a/camp/camp-server/pom.xml
+++ b/camp/camp-server/pom.xml
@@ -32,7 +32,7 @@
     <parent>
         <groupId>org.apache.brooklyn.camp</groupId>
         <artifactId>camp-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/camp/pom.xml
----------------------------------------------------------------------
diff --git a/camp/pom.xml b/camp/pom.xml
index afd69eb..41e75e4 100644
--- a/camp/pom.xml
+++ b/camp/pom.xml
@@ -32,7 +32,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index fddcd0a..76c64b6 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -31,7 +31,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/core/src/main/java/brooklyn/BrooklynVersion.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/BrooklynVersion.java b/core/src/main/java/brooklyn/BrooklynVersion.java
index aac75e4..04926cf 100644
--- a/core/src/main/java/brooklyn/BrooklynVersion.java
+++ b/core/src/main/java/brooklyn/BrooklynVersion.java
@@ -69,7 +69,7 @@ public class BrooklynVersion {
     private static final String OSGI_SHA1_PROPERTY_NAME = "Implementation-SHA-1";
     private static final String OSGI_BRANCH_PROPERTY_NAME = "Implementation-Branch";
 
-    private final static String VERSION_FROM_STATIC = "0.7.0-SNAPSHOT"; // BROOKLYN_VERSION
+    private final static String VERSION_FROM_STATIC = "0.7.0-incubating"; // BROOKLYN_VERSION
     private static final AtomicReference<Boolean> IS_DEV_ENV = new AtomicReference<Boolean>();
 
     private static final String BROOKLYN_FEATURE_PREFIX = "Brooklyn-Feature-";

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/core/src/test/dependencies/osgi/entities/pom.xml
----------------------------------------------------------------------
diff --git a/core/src/test/dependencies/osgi/entities/pom.xml b/core/src/test/dependencies/osgi/entities/pom.xml
index 6fa1314..48ede77 100644
--- a/core/src/test/dependencies/osgi/entities/pom.xml
+++ b/core/src/test/dependencies/osgi/entities/pom.xml
@@ -35,7 +35,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../../../../../pom.xml</relativePath>
     </parent>
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/core/src/test/dependencies/osgi/more-entities-v1/pom.xml
----------------------------------------------------------------------
diff --git a/core/src/test/dependencies/osgi/more-entities-v1/pom.xml b/core/src/test/dependencies/osgi/more-entities-v1/pom.xml
index aab4774..433de6c 100644
--- a/core/src/test/dependencies/osgi/more-entities-v1/pom.xml
+++ b/core/src/test/dependencies/osgi/more-entities-v1/pom.xml
@@ -35,7 +35,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../../../../../pom.xml</relativePath>
     </parent>
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/core/src/test/dependencies/osgi/more-entities-v2-evil-twin/pom.xml
----------------------------------------------------------------------
diff --git a/core/src/test/dependencies/osgi/more-entities-v2-evil-twin/pom.xml b/core/src/test/dependencies/osgi/more-entities-v2-evil-twin/pom.xml
index 28655c2..1e2c0d6 100644
--- a/core/src/test/dependencies/osgi/more-entities-v2-evil-twin/pom.xml
+++ b/core/src/test/dependencies/osgi/more-entities-v2-evil-twin/pom.xml
@@ -35,7 +35,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../../../../../pom.xml</relativePath>
     </parent>
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/core/src/test/dependencies/osgi/more-entities-v2/pom.xml
----------------------------------------------------------------------
diff --git a/core/src/test/dependencies/osgi/more-entities-v2/pom.xml b/core/src/test/dependencies/osgi/more-entities-v2/pom.xml
index a29247d..831ce72 100644
--- a/core/src/test/dependencies/osgi/more-entities-v2/pom.xml
+++ b/core/src/test/dependencies/osgi/more-entities-v2/pom.xml
@@ -35,7 +35,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../../../../../pom.xml</relativePath>
     </parent>
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java b/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
index 54ecb02..990aa84 100644
--- a/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
+++ b/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java
@@ -126,7 +126,7 @@ public class OsgiStandaloneTest {
 
     @Test
     public void testDuplicateBundle() throws Exception {
-        MavenArtifact artifact = new MavenArtifact("org.apache.brooklyn", "brooklyn-api", "jar", "0.7.0-SNAPSHOT"); // BROOKLYN_VERSION
+        MavenArtifact artifact = new MavenArtifact("org.apache.brooklyn", "brooklyn-api", "jar", "0.7.0-incubating"); // BROOKLYN_VERSION
         String localUrl = MavenRetriever.localUrl(artifact);
         if ("file".equals(Urls.getProtocol(localUrl))) {
             helperDuplicateBundle(localUrl);
@@ -137,7 +137,7 @@ public class OsgiStandaloneTest {
 
     @Test(groups="Integration")
     public void testRemoteDuplicateBundle() throws Exception {
-        helperDuplicateBundle(MavenRetriever.hostedUrl(new MavenArtifact("org.apache.brooklyn", "brooklyn-api", "jar", "0.7.0-SNAPSHOT"))); // BROOKLYN_VERSION
+        helperDuplicateBundle(MavenRetriever.hostedUrl(new MavenArtifact("org.apache.brooklyn", "brooklyn-api", "jar", "0.7.0-incubating"))); // BROOKLYN_VERSION
     }
 
     public void helperDuplicateBundle(String url) throws Exception {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/locations/jclouds/pom.xml
----------------------------------------------------------------------
diff --git a/locations/jclouds/pom.xml b/locations/jclouds/pom.xml
index 2046ada..fb8ecf6 100644
--- a/locations/jclouds/pom.xml
+++ b/locations/jclouds/pom.xml
@@ -29,7 +29,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/policy/pom.xml
----------------------------------------------------------------------
diff --git a/policy/pom.xml b/policy/pom.xml
index 5e6cf85..6c42052 100644
--- a/policy/pom.xml
+++ b/policy/pom.xml
@@ -29,7 +29,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index e007484..477817a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
 
     <groupId>org.apache.brooklyn</groupId>
     <artifactId>brooklyn-parent</artifactId>
-    <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+    <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
 
     <name>Brooklyn Parent Project</name>
     <description>
@@ -121,7 +121,7 @@
         <excludedTestGroups>Integration,Acceptance,Live,WIP</excludedTestGroups>
 
         <!-- Dependencies -->
-        <brooklyn.version>0.7.0-SNAPSHOT</brooklyn.version>  <!-- BROOKLYN_VERSION -->
+        <brooklyn.version>0.7.0-incubating</brooklyn.version>  <!-- BROOKLYN_VERSION -->
         <jclouds.groupId>org.apache.jclouds</jclouds.groupId>
 
         <!-- These dependencies also appear in usage/downstream-parent/pom.xml -

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/software/base/pom.xml
----------------------------------------------------------------------
diff --git a/software/base/pom.xml b/software/base/pom.xml
index ba077ce..3315812 100644
--- a/software/base/pom.xml
+++ b/software/base/pom.xml
@@ -30,7 +30,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
index 0a95327..8a6f244 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
@@ -65,7 +65,7 @@ public interface BrooklynNode extends SoftwareProcess, UsesJava {
             new TypeToken<Map<String,String>>() {}, "brooklynnode.copytorundir", "URLs of resources to be copied across to the server, giving the path they are to be copied to", MutableMap.<String,String>of());
     
     @SetFromFlag("version")
-    public static final ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(BrooklynConfigKeys.SUGGESTED_VERSION, "0.7.0-SNAPSHOT"); // BROOKLYN_VERSION
+    public static final ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(BrooklynConfigKeys.SUGGESTED_VERSION, "0.7.0-incubating"); // BROOKLYN_VERSION
 
     // Takes precedence over downloadUrl, if non-null
     @SetFromFlag("distroUploadUrl")

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java b/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java
index 4a4faf8..b59f232 100644
--- a/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java
+++ b/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java
@@ -38,7 +38,7 @@ import com.google.common.base.Preconditions;
 
 public class JmxmpSslSupport {
 
-    final static String BROOKLYN_VERSION = "0.7.0-SNAPSHOT";  // BROOKLYN_VERSION (updated by script)
+    final static String BROOKLYN_VERSION = "0.7.0-incubating";  // BROOKLYN_VERSION (updated by script)
     
     private final JmxSupport jmxSupport;
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/software/base/src/main/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml
----------------------------------------------------------------------
diff --git a/software/base/src/main/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml b/software/base/src/main/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml
index 55d09f6..53dee50 100644
--- a/software/base/src/main/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml
+++ b/software/base/src/main/resources/brooklyn/entity/brooklynnode/brooklyn-node.yaml
@@ -23,7 +23,7 @@ services:
 - type: brooklyn.entity.brooklynnode.BrooklynNode
 
   ## to use a local file, specify something such as the following:   [BROOKLYN_VERSION_BELOW] 
-  # downloadUrl: file:///tmp/brooklyn-dist-0.7.0-SNAPSHOT-dist.tar.gz
+  # downloadUrl: file:///tmp/brooklyn-dist-0.7.0-incubating-dist.tar.gz
 
   ## if deploying to anything other than localhost you must also configure login details, e.g.:
   # managementUsername: admin

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/storage/hazelcast/pom.xml
----------------------------------------------------------------------
diff --git a/storage/hazelcast/pom.xml b/storage/hazelcast/pom.xml
index 9fa47b9..d9f2483 100644
--- a/storage/hazelcast/pom.xml
+++ b/storage/hazelcast/pom.xml
@@ -29,7 +29,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/camp/pom.xml
----------------------------------------------------------------------
diff --git a/usage/camp/pom.xml b/usage/camp/pom.xml
index 00a46b7..2a25381 100644
--- a/usage/camp/pom.xml
+++ b/usage/camp/pom.xml
@@ -29,7 +29,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/cli/pom.xml
----------------------------------------------------------------------
diff --git a/usage/cli/pom.xml b/usage/cli/pom.xml
index 07d65ab..4587dba 100644
--- a/usage/cli/pom.xml
+++ b/usage/cli/pom.xml
@@ -30,7 +30,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/cli/src/main/resources/brooklyn/default.catalog.bom
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/resources/brooklyn/default.catalog.bom b/usage/cli/src/main/resources/brooklyn/default.catalog.bom
index 70c7d57..24e81be 100644
--- a/usage/cli/src/main/resources/brooklyn/default.catalog.bom
+++ b/usage/cli/src/main/resources/brooklyn/default.catalog.bom
@@ -3,7 +3,7 @@
 # and templates to get started using Brooklyn
 
 brooklyn.catalog:
-  version: 0.7.0-SNAPSHOT  # BROOKLYN_VERSION
+  version: 0.7.0-incubating  # BROOKLYN_VERSION
   items:
 
   # load everything in the classpath with a @Catalog annotation

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/launcher/pom.xml
----------------------------------------------------------------------
diff --git a/usage/launcher/pom.xml b/usage/launcher/pom.xml
index 25f5268..0637a75 100644
--- a/usage/launcher/pom.xml
+++ b/usage/launcher/pom.xml
@@ -31,7 +31,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/logback-includes/pom.xml
----------------------------------------------------------------------
diff --git a/usage/logback-includes/pom.xml b/usage/logback-includes/pom.xml
index 538ab88..d263398 100644
--- a/usage/logback-includes/pom.xml
+++ b/usage/logback-includes/pom.xml
@@ -32,7 +32,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/logback-xml/pom.xml
----------------------------------------------------------------------
diff --git a/usage/logback-xml/pom.xml b/usage/logback-xml/pom.xml
index 9f84d1f..74cc7a5 100644
--- a/usage/logback-xml/pom.xml
+++ b/usage/logback-xml/pom.xml
@@ -38,7 +38,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/rest-api/pom.xml
----------------------------------------------------------------------
diff --git a/usage/rest-api/pom.xml b/usage/rest-api/pom.xml
index c817d53..444c72c 100644
--- a/usage/rest-api/pom.xml
+++ b/usage/rest-api/pom.xml
@@ -29,7 +29,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/rest-client/pom.xml
----------------------------------------------------------------------
diff --git a/usage/rest-client/pom.xml b/usage/rest-client/pom.xml
index 9149c30..b5b7db2 100644
--- a/usage/rest-client/pom.xml
+++ b/usage/rest-client/pom.xml
@@ -29,7 +29,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version> <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version> <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/rest-server/pom.xml
----------------------------------------------------------------------
diff --git a/usage/rest-server/pom.xml b/usage/rest-server/pom.xml
index ae09981..e5db2d0 100644
--- a/usage/rest-server/pom.xml
+++ b/usage/rest-server/pom.xml
@@ -29,7 +29,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/usage/test-support/pom.xml
----------------------------------------------------------------------
diff --git a/usage/test-support/pom.xml b/usage/test-support/pom.xml
index 47dbc60..01d56e7 100644
--- a/usage/test-support/pom.xml
+++ b/usage/test-support/pom.xml
@@ -27,7 +27,7 @@
 	<parent>
 		<groupId>org.apache.brooklyn</groupId>
 		<artifactId>brooklyn-parent</artifactId>
-		<version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+		<version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/utils/common/pom.xml
----------------------------------------------------------------------
diff --git a/utils/common/pom.xml b/utils/common/pom.xml
index 746658e..db88880 100644
--- a/utils/common/pom.xml
+++ b/utils/common/pom.xml
@@ -31,7 +31,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java b/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java
index 09d3a55..3e0bd6d 100644
--- a/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java
+++ b/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java
@@ -39,7 +39,7 @@ public class MavenArtifactTest {
     // only *integration* tests require these to be *installed*;
     // note this may vary from machine to machine so version should be aligned with that in parent pom
     final static String MAVEN_JAR_PLUGIN_COORDINATE = "org.apache.maven.plugins:maven-jar-plugin:jar:2.6";
-    final static String THIS_PROJECT_COORDINATE = "org.apache.brooklyn:brooklyn-utils-common:jar:0.7.0-SNAPSHOT";  // BROOKLYN_VERSION
+    final static String THIS_PROJECT_COORDINATE = "org.apache.brooklyn:brooklyn-utils-common:jar:0.7.0-incubating";  // BROOKLYN_VERSION
 
     // Don't need to be installed, only used as examples
     final static String RELEASED_SOURCES_COORDINATE = "io.brooklyn:brooklyn-core:jar:sources:0.6.0";
@@ -166,7 +166,7 @@ public class MavenArtifactTest {
     @Test(groups="Integration")
     public void testRetrievalHostedSnapshotIntegration() throws Exception {
         MavenArtifact m = MavenArtifact.fromCoordinate(
-                "org.apache.brooklyn:brooklyn-utils-common:jar:0.7.0-SNAPSHOT");  // BROOKLYN_VERSION
+                "org.apache.brooklyn:brooklyn-utils-common:jar:0.7.0-incubating");  // BROOKLYN_VERSION
         
         String localPath = new MavenRetriever().getLocalPath(m);
         File f = new File(localPath);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/utils/groovy/pom.xml
----------------------------------------------------------------------
diff --git a/utils/groovy/pom.xml b/utils/groovy/pom.xml
index ef71f24..501f56d 100644
--- a/utils/groovy/pom.xml
+++ b/utils/groovy/pom.xml
@@ -31,7 +31,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/utils/jmx/jmxmp-ssl-agent/pom.xml
----------------------------------------------------------------------
diff --git a/utils/jmx/jmxmp-ssl-agent/pom.xml b/utils/jmx/jmxmp-ssl-agent/pom.xml
index 4a74598..dd94ab6 100644
--- a/utils/jmx/jmxmp-ssl-agent/pom.xml
+++ b/utils/jmx/jmxmp-ssl-agent/pom.xml
@@ -32,7 +32,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/utils/jmx/jmxrmi-agent/pom.xml
----------------------------------------------------------------------
diff --git a/utils/jmx/jmxrmi-agent/pom.xml b/utils/jmx/jmxrmi-agent/pom.xml
index 3bfd993..62c72b8 100644
--- a/utils/jmx/jmxrmi-agent/pom.xml
+++ b/utils/jmx/jmxrmi-agent/pom.xml
@@ -32,7 +32,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/utils/rest-swagger/pom.xml
----------------------------------------------------------------------
diff --git a/utils/rest-swagger/pom.xml b/utils/rest-swagger/pom.xml
index fbe902d..408c6d6 100644
--- a/utils/rest-swagger/pom.xml
+++ b/utils/rest-swagger/pom.xml
@@ -31,7 +31,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6491c6dc/utils/test-support/pom.xml
----------------------------------------------------------------------
diff --git a/utils/test-support/pom.xml b/utils/test-support/pom.xml
index c57f5fb..2d77431 100644
--- a/utils/test-support/pom.xml
+++ b/utils/test-support/pom.xml
@@ -31,7 +31,7 @@
     <parent>
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.7.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 


[39/50] [abbrv] brooklyn-server git commit: Rely on project order instead of dependency

Posted by he...@apache.org.
Rely on project order instead of dependency

Backport of fix on master by Hadrian Zbarcea <ha...@apache.org>


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

Branch: refs/heads/0.7.0-incubating
Commit: 82e24902bc42bf1d3337e788a68689c18afe64f0
Parents: 229e5fe
Author: Hadrian Zbarcea <ha...@apache.org>
Authored: Mon Jul 13 17:37:06 2015 -0400
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jul 15 08:22:09 2015 +0000

----------------------------------------------------------------------
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/82e24902/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ae39c02..69f25b2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -81,6 +81,7 @@
 
     <modules>
         <module>parent</module>
+        <module>usage/downstream-parent</module>
 
         <module>api</module>
         <module>camp</module>
@@ -115,7 +116,6 @@
         <module>usage/camp</module>
         <module>usage/cli</module>
         <module>usage/dist</module>
-        <module>usage/downstream-parent</module>
         <module>usage/jsgui</module>
         <module>usage/launcher</module>
         <module>usage/logback-includes</module>


[43/50] [abbrv] brooklyn-server git commit: Introduce a parent/pom and prepare for release

Posted by he...@apache.org.
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/software/base/pom.xml
----------------------------------------------------------------------
diff --git a/software/base/pom.xml b/software/base/pom.xml
index 3315812..86f4279 100644
--- a/software/base/pom.xml
+++ b/software/base/pom.xml
@@ -31,7 +31,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/storage/hazelcast/pom.xml
----------------------------------------------------------------------
diff --git a/storage/hazelcast/pom.xml b/storage/hazelcast/pom.xml
index d9f2483..d47e953 100644
--- a/storage/hazelcast/pom.xml
+++ b/storage/hazelcast/pom.xml
@@ -30,7 +30,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/usage/camp/pom.xml
----------------------------------------------------------------------
diff --git a/usage/camp/pom.xml b/usage/camp/pom.xml
index 2a25381..d0a1ac7 100644
--- a/usage/camp/pom.xml
+++ b/usage/camp/pom.xml
@@ -30,7 +30,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/usage/cli/pom.xml
----------------------------------------------------------------------
diff --git a/usage/cli/pom.xml b/usage/cli/pom.xml
index 4587dba..28b163b 100644
--- a/usage/cli/pom.xml
+++ b/usage/cli/pom.xml
@@ -31,7 +31,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/usage/launcher/pom.xml
----------------------------------------------------------------------
diff --git a/usage/launcher/pom.xml b/usage/launcher/pom.xml
index 0637a75..d8dbe90 100644
--- a/usage/launcher/pom.xml
+++ b/usage/launcher/pom.xml
@@ -32,7 +32,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/usage/logback-includes/pom.xml
----------------------------------------------------------------------
diff --git a/usage/logback-includes/pom.xml b/usage/logback-includes/pom.xml
index d263398..9ed2987 100644
--- a/usage/logback-includes/pom.xml
+++ b/usage/logback-includes/pom.xml
@@ -33,7 +33,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/usage/logback-xml/pom.xml
----------------------------------------------------------------------
diff --git a/usage/logback-xml/pom.xml b/usage/logback-xml/pom.xml
index 74cc7a5..7c8e5e8 100644
--- a/usage/logback-xml/pom.xml
+++ b/usage/logback-xml/pom.xml
@@ -39,7 +39,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
 </project>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/usage/rest-api/pom.xml
----------------------------------------------------------------------
diff --git a/usage/rest-api/pom.xml b/usage/rest-api/pom.xml
index 444c72c..a92a858 100644
--- a/usage/rest-api/pom.xml
+++ b/usage/rest-api/pom.xml
@@ -30,7 +30,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/usage/rest-client/pom.xml
----------------------------------------------------------------------
diff --git a/usage/rest-client/pom.xml b/usage/rest-client/pom.xml
index b5b7db2..674b75d 100644
--- a/usage/rest-client/pom.xml
+++ b/usage/rest-client/pom.xml
@@ -30,7 +30,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version> <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/usage/rest-server/pom.xml
----------------------------------------------------------------------
diff --git a/usage/rest-server/pom.xml b/usage/rest-server/pom.xml
index e5db2d0..6579f9f 100644
--- a/usage/rest-server/pom.xml
+++ b/usage/rest-server/pom.xml
@@ -30,7 +30,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version><!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/usage/test-support/pom.xml
----------------------------------------------------------------------
diff --git a/usage/test-support/pom.xml b/usage/test-support/pom.xml
index 01d56e7..c572767 100644
--- a/usage/test-support/pom.xml
+++ b/usage/test-support/pom.xml
@@ -28,7 +28,7 @@
 		<groupId>org.apache.brooklyn</groupId>
 		<artifactId>brooklyn-parent</artifactId>
 		<version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-		<relativePath>../../pom.xml</relativePath>
+		<relativePath>../../parent/pom.xml</relativePath>
 	</parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/utils/common/pom.xml
----------------------------------------------------------------------
diff --git a/utils/common/pom.xml b/utils/common/pom.xml
index db88880..5b7bcd6 100644
--- a/utils/common/pom.xml
+++ b/utils/common/pom.xml
@@ -32,7 +32,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/utils/groovy/pom.xml
----------------------------------------------------------------------
diff --git a/utils/groovy/pom.xml b/utils/groovy/pom.xml
index 501f56d..f73acb9 100644
--- a/utils/groovy/pom.xml
+++ b/utils/groovy/pom.xml
@@ -32,7 +32,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/utils/jmx/jmxmp-ssl-agent/pom.xml
----------------------------------------------------------------------
diff --git a/utils/jmx/jmxmp-ssl-agent/pom.xml b/utils/jmx/jmxmp-ssl-agent/pom.xml
index dd94ab6..cfb6f9a 100644
--- a/utils/jmx/jmxmp-ssl-agent/pom.xml
+++ b/utils/jmx/jmxmp-ssl-agent/pom.xml
@@ -33,7 +33,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../../pom.xml</relativePath>
+        <relativePath>../../../parent/pom.xml</relativePath>
     </parent>
 
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/utils/jmx/jmxrmi-agent/pom.xml
----------------------------------------------------------------------
diff --git a/utils/jmx/jmxrmi-agent/pom.xml b/utils/jmx/jmxrmi-agent/pom.xml
index 62c72b8..2f590ff 100644
--- a/utils/jmx/jmxrmi-agent/pom.xml
+++ b/utils/jmx/jmxrmi-agent/pom.xml
@@ -33,7 +33,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../../pom.xml</relativePath>
+        <relativePath>../../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/utils/rest-swagger/pom.xml
----------------------------------------------------------------------
diff --git a/utils/rest-swagger/pom.xml b/utils/rest-swagger/pom.xml
index 408c6d6..e4e22c7 100644
--- a/utils/rest-swagger/pom.xml
+++ b/utils/rest-swagger/pom.xml
@@ -32,7 +32,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/utils/test-support/pom.xml
----------------------------------------------------------------------
diff --git a/utils/test-support/pom.xml b/utils/test-support/pom.xml
index 2d77431..f7cba63 100644
--- a/utils/test-support/pom.xml
+++ b/utils/test-support/pom.xml
@@ -32,7 +32,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>


[47/50] [abbrv] brooklyn-server git commit: Introduce a parent/pom and prepare for release

Posted by he...@apache.org.
Introduce a parent/pom and prepare for release

Backport of fix on master by Hadrian Zbarcea <ha...@apache.org>


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

Branch: refs/heads/0.7.0-incubating
Commit: ffedff1154d26c57cf108f9f0909a29613d6505d
Parents: f43806c
Author: Hadrian Zbarcea <ha...@apache.org>
Authored: Mon Jul 6 22:47:05 2015 -0400
Committer: Richard Downer <ri...@apache.org>
Committed: Wed Jul 15 08:22:09 2015 +0000

----------------------------------------------------------------------
 api/pom.xml                       |    2 +-
 camp/pom.xml                      |    2 +-
 core/pom.xml                      |    2 +-
 locations/jclouds/pom.xml         |    2 +-
 parent/pom.xml                    | 1921 +++++++++++++++++++++++++++++++
 policy/pom.xml                    |    2 +-
 pom.xml                           | 1949 ++------------------------------
 software/base/pom.xml             |    2 +-
 storage/hazelcast/pom.xml         |    2 +-
 usage/camp/pom.xml                |    2 +-
 usage/cli/pom.xml                 |    2 +-
 usage/launcher/pom.xml            |    2 +-
 usage/logback-includes/pom.xml    |    2 +-
 usage/logback-xml/pom.xml         |    2 +-
 usage/rest-api/pom.xml            |    2 +-
 usage/rest-client/pom.xml         |    2 +-
 usage/rest-server/pom.xml         |    2 +-
 usage/test-support/pom.xml        |    2 +-
 utils/common/pom.xml              |    2 +-
 utils/groovy/pom.xml              |    2 +-
 utils/jmx/jmxmp-ssl-agent/pom.xml |    2 +-
 utils/jmx/jmxrmi-agent/pom.xml    |    2 +-
 utils/rest-swagger/pom.xml        |    2 +-
 utils/test-support/pom.xml        |    2 +-
 24 files changed, 2007 insertions(+), 1907 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/api/pom.xml
----------------------------------------------------------------------
diff --git a/api/pom.xml b/api/pom.xml
index 5065448..cd8f07a 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -32,7 +32,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../pom.xml</relativePath>
+        <relativePath>../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/camp/pom.xml
----------------------------------------------------------------------
diff --git a/camp/pom.xml b/camp/pom.xml
index 41e75e4..017a4c0 100644
--- a/camp/pom.xml
+++ b/camp/pom.xml
@@ -33,7 +33,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../pom.xml</relativePath>
+        <relativePath>../parent/pom.xml</relativePath>
     </parent>
 
     <modules>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 76c64b6..b336167 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -32,7 +32,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../pom.xml</relativePath>
+        <relativePath>../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ffedff11/locations/jclouds/pom.xml
----------------------------------------------------------------------
diff --git a/locations/jclouds/pom.xml b/locations/jclouds/pom.xml
index fb8ecf6..014d305 100644
--- a/locations/jclouds/pom.xml
+++ b/locations/jclouds/pom.xml
@@ -30,7 +30,7 @@
         <groupId>org.apache.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
         <version>0.7.0-incubating</version>  <!-- BROOKLYN_VERSION -->
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../parent/pom.xml</relativePath>
     </parent>
 
     <dependencies>


[11/50] [abbrv] brooklyn-server git commit: treat tasks submitted by transient tasks as transient by default

Posted by he...@apache.org.
treat tasks submitted by transient tasks as transient by default


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

Branch: refs/heads/0.7.0-incubating
Commit: 56909922a3d0b0ae389e63f9441ffd1de1bea709
Parents: f5336d6
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Jun 20 16:33:41 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:33 2015 -0700

----------------------------------------------------------------------
 .../src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java | 7 ++++++-
 .../main/java/brooklyn/util/task/BasicExecutionContext.java   | 5 +++++
 2 files changed, 11 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/56909922/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java b/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java
index 41b2371..e90a014 100644
--- a/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java
+++ b/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java
@@ -267,7 +267,12 @@ public class BrooklynTaskTags extends TaskTags {
     
     public static void setInessential(Task<?> task) { addTagDynamically(task, INESSENTIAL_TASK); }
     public static void setTransient(Task<?> task) { addTagDynamically(task, TRANSIENT_TASK_TAG); }
-    public static boolean isTransient(Task<?> task) { return hasTag(task, TRANSIENT_TASK_TAG); }
+    public static boolean isTransient(Task<?> task) { 
+        if (hasTag(task, TRANSIENT_TASK_TAG)) return true;
+        if (hasTag(task, NON_TRANSIENT_TASK_TAG)) return true;
+        if (task.getSubmittedByTask()!=null) return isTransient(task.getSubmittedByTask());
+        return false;
+    }
     public static boolean isSubTask(Task<?> task) { return hasTag(task, SUB_TASK_TAG); }
     public static boolean isEffectorTask(Task<?> task) { return hasTag(task, EFFECTOR_TAG); }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/56909922/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java b/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
index bff6e2d..6346ecd 100644
--- a/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
+++ b/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
@@ -169,6 +169,11 @@ public class BasicExecutionContext extends AbstractExecutionContext {
 
         taskTags.addAll(tags);
         
+        if (Tasks.current()!=null && BrooklynTaskTags.isTransient(Tasks.current()) && !taskTags.contains(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG)) {
+            // tag as transient if submitter is transient, unless explicitly tagged as non-transient
+            taskTags.add(BrooklynTaskTags.TRANSIENT_TASK_TAG);
+        }
+        
         final Object startCallback = properties.get("newTaskStartCallback");
         properties.put("newTaskStartCallback", new Function<Object,Void>() {
             public Void apply(Object it) {


[21/50] [abbrv] brooklyn-server git commit: code review for #705, minor but important

Posted by he...@apache.org.
code review for #705, minor but important


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

Branch: refs/heads/0.7.0-incubating
Commit: 08d9b7cf569ca65f972a5c42d025bb64b1be2a19
Parents: e26c9e3
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Jun 24 13:52:51 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 13:52:51 2015 -0700

----------------------------------------------------------------------
 .../brooklyn/entity/basic/BrooklynTaskTags.java   |  2 +-
 .../java/brooklyn/util/flags/TypeCoercions.java   | 18 ++++++------------
 .../brooklyn/util/task/BasicExecutionContext.java |  3 ++-
 .../enricher/RollingTimeWindowMeanEnricher.java   |  6 ++++++
 .../enricher/TimeWeightedDeltaEnricher.java       |  5 +++++
 .../rest/transform/CatalogTransformer.java        |  9 ++++++++-
 6 files changed, 28 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/08d9b7cf/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java b/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java
index e90a014..901191a 100644
--- a/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java
+++ b/core/src/main/java/brooklyn/entity/basic/BrooklynTaskTags.java
@@ -269,7 +269,7 @@ public class BrooklynTaskTags extends TaskTags {
     public static void setTransient(Task<?> task) { addTagDynamically(task, TRANSIENT_TASK_TAG); }
     public static boolean isTransient(Task<?> task) { 
         if (hasTag(task, TRANSIENT_TASK_TAG)) return true;
-        if (hasTag(task, NON_TRANSIENT_TASK_TAG)) return true;
+        if (hasTag(task, NON_TRANSIENT_TASK_TAG)) return false;
         if (task.getSubmittedByTask()!=null) return isTransient(task.getSubmittedByTask());
         return false;
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/08d9b7cf/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/flags/TypeCoercions.java b/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
index c2876bd..3b4ec3d 100644
--- a/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
+++ b/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
@@ -729,12 +729,9 @@ public class TypeCoercions {
             public AttributeSensor apply(final String input) {
                 Entity entity = BrooklynTaskTags.getContextEntity(Tasks.current());
                 if (entity!=null) {
-                    Sensor<?> result = null;
-                    if (entity!=null) {
-                        result = entity.getEntityType().getSensor(input);
-                        if (result instanceof AttributeSensor) 
-                            return (AttributeSensor) result;
-                    }
+                    Sensor<?> result = entity.getEntityType().getSensor(input);
+                    if (result instanceof AttributeSensor) 
+                        return (AttributeSensor) result;
                 }
                 return Sensors.newSensor(Object.class, input);
             }
@@ -744,12 +741,9 @@ public class TypeCoercions {
             public AttributeSensor apply(final String input) {
                 Entity entity = BrooklynTaskTags.getContextEntity(Tasks.current());
                 if (entity!=null) {
-                    Sensor<?> result = null;
-                    if (entity!=null) {
-                        result = entity.getEntityType().getSensor(input);
-                        if (result != null) 
-                            return (AttributeSensor) result;
-                    }
+                    Sensor<?> result = entity.getEntityType().getSensor(input);
+                    if (result != null) 
+                        return (AttributeSensor) result;
                 }
                 return Sensors.newSensor(Object.class, input);
             }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/08d9b7cf/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java b/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
index 6346ecd..2e75d35 100644
--- a/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
+++ b/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
@@ -169,7 +169,8 @@ public class BasicExecutionContext extends AbstractExecutionContext {
 
         taskTags.addAll(tags);
         
-        if (Tasks.current()!=null && BrooklynTaskTags.isTransient(Tasks.current()) && !taskTags.contains(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG)) {
+        if (Tasks.current()!=null && BrooklynTaskTags.isTransient(Tasks.current()) 
+                && !taskTags.contains(BrooklynTaskTags.NON_TRANSIENT_TASK_TAG) && !taskTags.contains(BrooklynTaskTags.TRANSIENT_TASK_TAG)) {
             // tag as transient if submitter is transient, unless explicitly tagged as non-transient
             taskTags.add(BrooklynTaskTags.TRANSIENT_TASK_TAG);
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/08d9b7cf/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java b/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java
index 7c55a81..a2148e7 100644
--- a/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java
+++ b/policy/src/main/java/brooklyn/enricher/RollingTimeWindowMeanEnricher.java
@@ -23,6 +23,7 @@ import java.util.LinkedList;
 
 import brooklyn.config.ConfigKey;
 import brooklyn.enricher.basic.AbstractTypeTransformingEnricher;
+import brooklyn.enricher.basic.YamlRollingTimeWindowMeanEnricher;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.event.AttributeSensor;
@@ -32,6 +33,7 @@ import brooklyn.util.flags.SetFromFlag;
 import brooklyn.util.javalang.JavaClassNames;
 import brooklyn.util.time.Duration;
 
+import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
 
 /**
@@ -56,7 +58,11 @@ import com.google.common.base.Preconditions;
  * the average is no longer meaningful.
  * <p>
  * The default average when no data has been received is 0, with a confidence of 0
+ * <p>
+ * TODO this may end up being deprecated in favour of near-duplicate code in YAML-friendly {@link YamlRollingTimeWindowMeanEnricher},
+ * marking as @Beta in 0.7.0 timeframe 
  */
+@Beta
 //@Catalog(name="Rolling Mean in Time Window", description="Transforms a sensor's data into a rolling average "
 //        + "based on a time window.")
 public class RollingTimeWindowMeanEnricher<T extends Number> extends AbstractTypeTransformingEnricher<T,Double> {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/08d9b7cf/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java b/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java
index 42e418f..608c6eb 100644
--- a/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java
+++ b/policy/src/main/java/brooklyn/enricher/TimeWeightedDeltaEnricher.java
@@ -34,6 +34,7 @@ import brooklyn.util.flags.SetFromFlag;
 import brooklyn.util.javalang.JavaClassNames;
 import brooklyn.util.time.Duration;
 
+import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
 import com.google.common.base.Functions;
 
@@ -44,7 +45,11 @@ import com.google.common.base.Functions;
  * NB for time (e.g. "total milliseconds consumed") use {@link TimeFractionDeltaEnricher}
  * <p>
  * See also {@link YamlTimeWeightedDeltaEnricher} designed for use from YAML.
+ * <p>
+ * TODO this may end up being deprecated in favour of near-duplicate code in YAML-friendly {@link YamlTimeWeightedDeltaEnricher},
+ * marking as @Beta in 0.7.0 timeframe 
  */
+@Beta
 //@Catalog(name="Time-weighted Delta", description="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.")

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/08d9b7cf/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java b/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java
index a9f9baf..00e5144 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java
@@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.basic.BrooklynTypes;
 import brooklyn.catalog.CatalogItem;
+import brooklyn.catalog.CatalogItem.CatalogItemType;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Effector;
 import brooklyn.entity.Entity;
@@ -76,9 +77,15 @@ public class CatalogTransformer {
                 effectors.add(EffectorTransformer.effectorSummaryForCatalog(x));
             
         } catch (Exception e) {
+            Exceptions.propagateIfFatal(e);
+            
             // templates with multiple entities can't have spec created in the manner above; just ignore
-            if (log.isTraceEnabled())
+            if (item.getCatalogItemType()==CatalogItemType.ENTITY) {
+                log.warn("Unable to create spec for "+item+": "+e, e);
+            }
+            if (log.isTraceEnabled()) {
                 log.trace("Unable to create spec for "+item+": "+e, e);
+            }
         }
         
         return new CatalogEntitySummary(item.getSymbolicName(), item.getVersion(), item.getDisplayName(),


[15/50] [abbrv] brooklyn-server git commit: comments on copying BOM from cli project to dist

Posted by he...@apache.org.
comments on copying BOM from cli project to dist


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

Branch: refs/heads/0.7.0-incubating
Commit: d5fcc342cdd48366a51eda0891eb424d0e1083c7
Parents: c7a7928
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Jun 23 23:11:44 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 00:40:34 2015 -0700

----------------------------------------------------------------------
 usage/cli/pom.xml | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d5fcc342/usage/cli/pom.xml
----------------------------------------------------------------------
diff --git a/usage/cli/pom.xml b/usage/cli/pom.xml
index 91894f1..07d65ab 100644
--- a/usage/cli/pom.xml
+++ b/usage/cli/pom.xml
@@ -135,6 +135,9 @@
             </plugin>
             
             <plugin>
+                <!-- we publish the BOM in case anyone wants to access it directly.
+                     the primary consumer to begin with is the dist,
+                     though it could use use unpack goal with an includes filter. -->
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>build-helper-maven-plugin</artifactId>
                 <executions>


[18/50] [abbrv] brooklyn-server git commit: use constants for wait periods/limits in code

Posted by he...@apache.org.
use constants for wait periods/limits in code


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

Branch: refs/heads/0.7.0-incubating
Commit: e26c9e318983a124f15971000025f8971a829982
Parents: 4a6ada4
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Jun 23 23:36:06 2015 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jun 24 01:04:24 2015 -0700

----------------------------------------------------------------------
 .../brooklyn/enricher/basic/Propagator.java     |  4 ++--
 .../brooklyn/enricher/basic/Transformer.java    |  6 +++---
 .../entity/basic/ServiceStateLogic.java         |  3 ++-
 .../rebind/PeriodicDeltaChangeListener.java     |  3 ++-
 .../event/basic/DependentConfiguration.java     | 10 ++++++----
 .../src/main/java/brooklyn/util/task/Tasks.java |  2 +-
 .../java/brooklyn/util/task/ValueResolver.java  | 20 ++++++++++++++++++++
 .../effector/SelectMasterEffectorBody.java      |  2 +-
 .../brooklyn/entity/software/StaticSensor.java  | 18 ++++++++++++++++--
 .../rest/resources/EntityConfigResource.java    |  3 ++-
 .../brooklyn/rest/resources/SensorResource.java |  3 ++-
 .../rest/transform/EffectorTransformer.java     |  5 ++---
 .../java/brooklyn/util/repeat/Repeater.java     |  7 +++++++
 13 files changed, 66 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/core/src/main/java/brooklyn/enricher/basic/Propagator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/Propagator.java b/core/src/main/java/brooklyn/enricher/basic/Propagator.java
index 86795c6..06f63c4 100644
--- a/core/src/main/java/brooklyn/enricher/basic/Propagator.java
+++ b/core/src/main/java/brooklyn/enricher/basic/Propagator.java
@@ -37,7 +37,7 @@ import brooklyn.event.SensorEventListener;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.flags.SetFromFlag;
 import brooklyn.util.task.Tasks;
-import brooklyn.util.time.Duration;
+import brooklyn.util.task.ValueResolver;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
@@ -96,7 +96,7 @@ public class Propagator extends AbstractEnricher implements SensorEventListener<
             }
             
             for (Object sensorO : getConfig(PROPAGATING)) {
-                Sensor<?> sensor = Tasks.resolving(sensorO).as(Sensor.class).timeout(Duration.millis(50)).context(producer).get();
+                Sensor<?> sensor = Tasks.resolving(sensorO).as(Sensor.class).timeout(ValueResolver.REAL_QUICK_WAIT).context(producer).get();
                 if (!sensorMappingTemp.containsKey(sensor)) {
                     sensorMappingTemp.put(sensor, sensor);
                 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/core/src/main/java/brooklyn/enricher/basic/Transformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/Transformer.java b/core/src/main/java/brooklyn/enricher/basic/Transformer.java
index 0f6c409..6b2f7a8 100644
--- a/core/src/main/java/brooklyn/enricher/basic/Transformer.java
+++ b/core/src/main/java/brooklyn/enricher/basic/Transformer.java
@@ -28,7 +28,7 @@ import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.event.SensorEvent;
 import brooklyn.util.collections.MutableSet;
 import brooklyn.util.task.Tasks;
-import brooklyn.util.time.Duration;
+import brooklyn.util.task.ValueResolver;
 
 import com.google.common.base.Function;
 import com.google.common.reflect.TypeToken;
@@ -84,7 +84,7 @@ public class Transformer<T,U> extends AbstractTransformer<T,U> {
         return new Function<SensorEvent<T>, U>() {
             @Override public U apply(SensorEvent<T> input) {
                 // evaluate immediately, or return null
-                // 200ms seems a reasonable compromise for tasks which require BG evaluation
+                // PRETTY_QUICK/200ms seems a reasonable compromise for tasks which require BG evaluation
                 // but which are non-blocking
                 // TODO better would be to have a mode in which tasks are not permitted to block on
                 // external events; they can submit tasks and block on them (or even better, have a callback architecture);
@@ -92,7 +92,7 @@ public class Transformer<T,U> extends AbstractTransformer<T,U> {
                 return (U) Tasks.resolving(targetValueRaw).as(targetSensor.getType())
                     .context(entity)
                     .description("Computing sensor "+targetSensor+" from "+targetValueRaw)
-                    .timeout(Duration.millis(200))
+                    .timeout(ValueResolver.PRETTY_QUICK_WAIT)
                     .getMaybe().orNull();
             }
             public String toString() {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
index 75bf9a6..eff8e2d 100644
--- a/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
+++ b/core/src/main/java/brooklyn/entity/basic/ServiceStateLogic.java
@@ -56,6 +56,7 @@ import brooklyn.util.collections.QuorumCheck;
 import brooklyn.util.guava.Functionals;
 import brooklyn.util.guava.Maybe;
 import brooklyn.util.repeat.Repeater;
+import brooklyn.util.task.ValueResolver;
 import brooklyn.util.text.Strings;
 import brooklyn.util.time.Duration;
 
@@ -148,7 +149,7 @@ public class ServiceStateLogic {
             if (!Boolean.TRUE.equals(up) && !Boolean.TRUE.equals(Entities.isReadOnly(entity))) {
                 // pause briefly to allow any recent problem-clearing processing to complete
                 Stopwatch timer = Stopwatch.createStarted();
-                boolean nowUp = Repeater.create().every(Duration.millis(10)).limitTimeTo(Duration.millis(200)).until(entity, 
+                boolean nowUp = Repeater.create().every(ValueResolver.REAL_QUICK_PERIOD).limitTimeTo(ValueResolver.PRETTY_QUICK_WAIT).until(entity, 
                     EntityPredicates.attributeEqualTo(Attributes.SERVICE_UP, true)).run();
                 if (nowUp) {
                     log.debug("Had to wait "+Duration.of(timer)+" for "+entity+" "+Attributes.SERVICE_UP+" to be true before setting "+state);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
index 2c3271d..0d88330 100644
--- a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
+++ b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
@@ -50,6 +50,7 @@ import brooklyn.util.collections.MutableMap;
 import brooklyn.util.collections.MutableSet;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.exceptions.RuntimeInterruptedException;
+import brooklyn.util.repeat.Repeater;
 import brooklyn.util.task.ScheduledTask;
 import brooklyn.util.task.Tasks;
 import brooklyn.util.time.CountdownTimer;
@@ -279,7 +280,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
                     Duration left = timer.getDurationRemaining();
                     if (left.isPositive()) {
                         synchronized(writeCount) {
-                            writeCount.wait(left.lowerBound(Duration.millis(10)).toMilliseconds());
+                            writeCount.wait(left.lowerBound(Repeater.DEFAULT_REAL_QUICK_PERIOD).toMilliseconds());
                         }
                     } else {
                         throw new TimeoutException("Timeout waiting for independent write of rebind-periodic-delta, after "+timer.getDurationElapsed());

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java b/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java
index b462107..14a159d 100644
--- a/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java
+++ b/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java
@@ -70,6 +70,7 @@ import brooklyn.util.task.DynamicTasks;
 import brooklyn.util.task.ParallelTask;
 import brooklyn.util.task.TaskInternal;
 import brooklyn.util.task.Tasks;
+import brooklyn.util.task.ValueResolver;
 import brooklyn.util.text.Strings;
 import brooklyn.util.time.CountdownTimer;
 import brooklyn.util.time.Duration;
@@ -297,8 +298,8 @@ public class DependentConfiguration {
                 }
 
                 CountdownTimer timer = timeout!=null ? timeout.countdownTimer() : null;
-                Duration maxPeriod = Duration.millis(200);
-                Duration nextPeriod = Duration.millis(10);
+                Duration maxPeriod = ValueResolver.PRETTY_QUICK_WAIT;
+                Duration nextPeriod = ValueResolver.REAL_QUICK_PERIOD;
                 while (true) {
                     // check the source on initial run (could be done outside the loop) 
                     // and also (optionally) on each iteration in case it is more recent 
@@ -407,7 +408,7 @@ public class DependentConfiguration {
     /** Returns a task which waits for multiple other tasks (submitting if necessary)
      * and performs arbitrary computation over the List of results.
      * @see #transform(Task, Function) but note argument order is reversed (counterintuitive) to allow for varargs */
-    public static <U,T> Task<T> transformMultiple(Function<List<U>,T> transformer, TaskAdaptable<U> ...tasks) {
+    public static <U,T> Task<T> transformMultiple(Function<List<U>,T> transformer, @SuppressWarnings("unchecked") TaskAdaptable<U> ...tasks) {
         return transformMultiple(MutableMap.of("displayName", "transforming multiple"), transformer, tasks);
     }
 
@@ -425,7 +426,7 @@ public class DependentConfiguration {
     
     /** @see #transformMultiple(Function, TaskAdaptable...) */
     @SuppressWarnings({ "rawtypes" })
-    public static <U,T> Task<T> transformMultiple(Map flags, final Function<List<U>,T> transformer, TaskAdaptable<U> ...tasks) {
+    public static <U,T> Task<T> transformMultiple(Map flags, final Function<List<U>,T> transformer, @SuppressWarnings("unchecked") TaskAdaptable<U> ...tasks) {
         return transformMultiple(flags, transformer, Arrays.asList(tasks));
     }
     @SuppressWarnings({ "rawtypes" })
@@ -687,6 +688,7 @@ public class DependentConfiguration {
             validate();
             return new WaitInTaskForAttributeReady<T,V>(this).call();
         }
+        @SuppressWarnings({ "unchecked", "rawtypes" })
         private void validate() {
             checkNotNull(source, "Entity source");
             checkNotNull(sensor, "Sensor");

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/core/src/main/java/brooklyn/util/task/Tasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/Tasks.java b/core/src/main/java/brooklyn/util/task/Tasks.java
index 573b342..f59e2d1 100644
--- a/core/src/main/java/brooklyn/util/task/Tasks.java
+++ b/core/src/main/java/brooklyn/util/task/Tasks.java
@@ -421,7 +421,7 @@ public class Tasks {
             }
             if (timer.isExpired())
                 return false;
-            Time.sleep(Duration.millis(10));
+            Time.sleep(Repeater.DEFAULT_REAL_QUICK_PERIOD);
         }
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/core/src/main/java/brooklyn/util/task/ValueResolver.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/ValueResolver.java b/core/src/main/java/brooklyn/util/task/ValueResolver.java
index 71b34a0..0670ad6 100644
--- a/core/src/main/java/brooklyn/util/task/ValueResolver.java
+++ b/core/src/main/java/brooklyn/util/task/ValueResolver.java
@@ -38,6 +38,7 @@ import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.flags.TypeCoercions;
 import brooklyn.util.guava.Maybe;
 import brooklyn.util.javalang.JavaClassNames;
+import brooklyn.util.repeat.Repeater;
 import brooklyn.util.time.CountdownTimer;
 import brooklyn.util.time.Duration;
 import brooklyn.util.time.Durations;
@@ -57,6 +58,25 @@ import com.google.common.reflect.TypeToken;
  */
 public class ValueResolver<T> implements DeferredSupplier<T> {
 
+    /** 
+     * Period to wait if we're expected to return real quick 
+     * but we want fast things to have time to finish.
+     * <p>
+     * Timings are always somewhat arbitrary but this at least
+     * allows some intention to be captured in code rather than arbitrary values. */
+    public static Duration REAL_QUICK_WAIT = Duration.millis(50);
+    /** 
+     * Period to wait if we're expected to return quickly 
+     * but we want to be a bit more generous for things to finish,
+     * without letting a caller get annoyed. 
+     * <p>
+     * See {@link #REAL_QUICK_WAIT}. */
+    public static Duration PRETTY_QUICK_WAIT = Duration.millis(200);
+    
+    /** Period to wait when we have to poll but want to give the illusion of no wait.
+     * See {@link Repeater#DEFAULT_REAL_QUICK_PERIOD} */ 
+    public static Duration REAL_QUICK_PERIOD = Repeater.DEFAULT_REAL_QUICK_PERIOD;
+    
     private static final Logger log = LoggerFactory.getLogger(ValueResolver.class);
     
     final Object value;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/software/base/src/main/java/brooklyn/entity/brooklynnode/effector/SelectMasterEffectorBody.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/effector/SelectMasterEffectorBody.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/effector/SelectMasterEffectorBody.java
index 7ed3cb8..af07f3a 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/effector/SelectMasterEffectorBody.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/effector/SelectMasterEffectorBody.java
@@ -107,7 +107,7 @@ public class SelectMasterEffectorBody extends EffectorBody<Void> implements Sele
 
     private void waitMasterHandover(final Entity oldMaster, final Entity newMaster) {
         boolean masterChanged = Repeater.create()
-            .backoff(Duration.millis(50), 1.5, Duration.FIVE_SECONDS)
+            .backoff(Repeater.DEFAULT_REAL_QUICK_PERIOD, 1.5, Duration.FIVE_SECONDS)
             .limitTimeTo(Duration.ONE_MINUTE)
             .until(new Callable<Boolean>() {
                 @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java b/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java
index 8688ec8..4b7c9d6 100644
--- a/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java
+++ b/software/base/src/main/java/brooklyn/entity/software/StaticSensor.java
@@ -22,14 +22,28 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.config.ConfigKey;
+import brooklyn.enricher.basic.Propagator;
 import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.entity.effector.AddSensor;
+import brooklyn.management.Task;
 import brooklyn.util.config.ConfigBag;
 import brooklyn.util.guava.Maybe;
 import brooklyn.util.task.Tasks;
-import brooklyn.util.time.Duration;
+import brooklyn.util.task.ValueResolver;
 
+import com.google.common.base.Supplier;
+
+/** 
+ * Provides an initializer/feed which simply sets a given value.
+ * <p>
+ * {@link Task}/{@link Supplier} values are resolved when written,
+ * unlike config values which are resolved on each read.
+ * <p>
+ * This supports a {@link StaticSensor#SENSOR_PERIOD} 
+ * which can be useful if the supplied value is such a function.
+ * However when the source is another sensor,
+ * consider using {@link Propagator} which listens for changes instead. */
 public class StaticSensor<T> extends AddSensor<T> {
 
     private static final Logger log = LoggerFactory.getLogger(StaticSensor.class);
@@ -48,7 +62,7 @@ public class StaticSensor<T> extends AddSensor<T> {
     public void apply(EntityLocal entity) {
         super.apply(entity);
         
-        Maybe<T> v = Tasks.resolving(value).as((Class<T>)sensor.getType()).timeout(Duration.millis(200)).getMaybe();
+        Maybe<T> v = Tasks.resolving(value).as((Class<T>)sensor.getType()).timeout(ValueResolver.PRETTY_QUICK_WAIT).getMaybe();
         if (v.isPresent()) {
             log.debug(this+" setting sensor "+sensor+" to "+v.get());
             entity.setAttribute(sensor, v.get());

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
index 219d67a..e7104c9 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
@@ -39,6 +39,7 @@ import brooklyn.rest.filter.HaHotStateRequired;
 import brooklyn.rest.transform.EntityTransformer;
 import brooklyn.rest.util.WebResourceUtils;
 import brooklyn.util.flags.TypeCoercions;
+import brooklyn.util.task.ValueResolver;
 import brooklyn.util.text.Strings;
 import brooklyn.util.time.Duration;
 
@@ -96,7 +97,7 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
         EntityLocal entity = brooklyn().getEntity(application, entityToken);
         ConfigKey<?> ck = findConfig(entity, configKeyName);
         Object value = ((EntityInternal)entity).config().getRaw(ck).orNull();
-        return resolving(value).preferJson(preferJson).asJerseyOutermostReturnValue(true).raw(raw).context(entity).timeout(Duration.millis(100)).renderAs(ck).resolve();
+        return resolving(value).preferJson(preferJson).asJerseyOutermostReturnValue(true).raw(raw).context(entity).timeout(ValueResolver.PRETTY_QUICK_WAIT).renderAs(ck).resolve();
     }
 
     private ConfigKey<?> findConfig(EntityLocal entity, String configKeyName) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
index 6e49acc..05bf73e 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
@@ -38,6 +38,7 @@ import brooklyn.rest.domain.SensorSummary;
 import brooklyn.rest.filter.HaHotStateRequired;
 import brooklyn.rest.transform.SensorTransformer;
 import brooklyn.rest.util.WebResourceUtils;
+import brooklyn.util.task.ValueResolver;
 import brooklyn.util.text.Strings;
 import brooklyn.util.time.Duration;
 
@@ -83,7 +84,7 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
         final EntityLocal entity = brooklyn().getEntity(application, entityToken);
         AttributeSensor<?> sensor = findSensor(entity, sensorName);
         Object value = entity.getAttribute(sensor);
-        return resolving(value).preferJson(preferJson).asJerseyOutermostReturnValue(true).raw(raw).context(entity).timeout(Duration.millis(100)).renderAs(sensor).resolve();
+        return resolving(value).preferJson(preferJson).asJerseyOutermostReturnValue(true).raw(raw).context(entity).timeout(ValueResolver.PRETTY_QUICK_WAIT).renderAs(sensor).resolve();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/usage/rest-server/src/main/java/brooklyn/rest/transform/EffectorTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/transform/EffectorTransformer.java b/usage/rest-server/src/main/java/brooklyn/rest/transform/EffectorTransformer.java
index 925ed8f..c71680a 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/transform/EffectorTransformer.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/transform/EffectorTransformer.java
@@ -26,7 +26,6 @@ import javax.annotation.Nullable;
 import brooklyn.entity.Effector;
 import brooklyn.entity.Entity;
 import brooklyn.entity.ParameterType;
-import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.rest.domain.EffectorSummary;
 import brooklyn.rest.domain.EffectorSummary.ParameterSummary;
@@ -34,7 +33,7 @@ import brooklyn.rest.util.WebResourceUtils;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.guava.Maybe;
 import brooklyn.util.task.Tasks;
-import brooklyn.util.time.Duration;
+import brooklyn.util.task.ValueResolver;
 
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
@@ -76,7 +75,7 @@ public class EffectorTransformer {
     protected static EffectorSummary.ParameterSummary<?> parameterSummary(Entity entity, ParameterType<?> parameterType) {
         try {
             Maybe<?> defaultValue = Tasks.resolving(parameterType.getDefaultValue()).as(parameterType.getParameterClass())
-                .context(entity).timeout(Duration.millis(50)).getMaybe();
+                .context(entity).timeout(ValueResolver.REAL_QUICK_WAIT).getMaybe();
             return new ParameterSummary(parameterType.getName(), parameterType.getParameterClassName(), 
                 parameterType.getDescription(), 
                 WebResourceUtils.getValueForDisplay(defaultValue.orNull(), true, false));

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e26c9e31/utils/common/src/main/java/brooklyn/util/repeat/Repeater.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/repeat/Repeater.java b/utils/common/src/main/java/brooklyn/util/repeat/Repeater.java
index bd76ea8..a80bb27 100644
--- a/utils/common/src/main/java/brooklyn/util/repeat/Repeater.java
+++ b/utils/common/src/main/java/brooklyn/util/repeat/Repeater.java
@@ -83,6 +83,13 @@ public class Repeater {
 
     private static final Logger log = LoggerFactory.getLogger(Repeater.class);
 
+    /** A small initial duration that something should wait between repeats, 
+     * e.g. when doing {@link #backoffTo(Duration)}.
+     * <p>
+     * Chosen to be small enough that a user won't notice at all,
+     * but we're not going to be chewing up CPU while waiting. */  
+    public static final Duration DEFAULT_REAL_QUICK_PERIOD = Duration.millis(10);
+    
     private final String description;
     private Callable<?> body = Callables.returning(null);
     private Callable<Boolean> exitCondition;