You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by gr...@apache.org on 2014/10/12 02:11:11 UTC

[1/8] git commit: Update distribution archive and add new item lister script

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master a81c53d45 -> ad435aab4


Update distribution archive and add new item lister script


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

Branch: refs/heads/master
Commit: ae336cee9e97fe0524443724d83265409689f174
Parents: d016148
Author: Andrew Kennedy <gr...@apache.org>
Authored: Wed Oct 8 01:41:02 2014 +0100
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Fri Oct 10 14:04:00 2014 +0100

----------------------------------------------------------------------
 .../main/config/build-distribution-archive.xml  | 23 +++++------
 .../src/main/config/build-distribution-dir.xml  | 24 +++++------
 usage/dist/src/main/dist/bin/brooklyn           |  2 +-
 usage/dist/src/main/dist/bin/cloud-explorer     |  7 +---
 usage/dist/src/main/dist/bin/item-lister        | 42 ++++++++++++++++++++
 5 files changed, 64 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ae336cee/usage/dist/src/main/config/build-distribution-archive.xml
----------------------------------------------------------------------
diff --git a/usage/dist/src/main/config/build-distribution-archive.xml b/usage/dist/src/main/config/build-distribution-archive.xml
index 77f6bce..06c43f4 100644
--- a/usage/dist/src/main/config/build-distribution-archive.xml
+++ b/usage/dist/src/main/config/build-distribution-archive.xml
@@ -18,8 +18,8 @@
     under the License.
 -->
 <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
-	    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
     <id>dist</id>
     <formats>
         <format>tar.gz</format>
@@ -29,6 +29,8 @@
         <fileSet>
             <directory>${project.basedir}/../..</directory>
             <outputDirectory>/</outputDirectory>
+            <fileMode>0644</fileMode>
+            <directoryMode>0755</directoryMode>
             <includes>
                 <include>README*</include>
                 <include>LICENSE*</include>
@@ -43,17 +45,9 @@
             <directoryMode>0755</directoryMode>
         </fileSet>
         <fileSet>
-            <directory>${project.basedir}/src/main/dist/lib</directory>
-            <outputDirectory>/lib</outputDirectory>
-            <includes>
-                <include>README*</include>
-            </includes>
-        </fileSet>
-        <fileSet>
             <!-- Add an empty dropins folder (so need to reference an existing dir, and exclude everything) -->
-            <directory>${project.basedir}/src/main/dist/lib</directory>
+            <directory>${project.basedir}/src/main/dist</directory>
             <outputDirectory>/lib/dropins</outputDirectory>
-            <fileMode>0755</fileMode>
             <directoryMode>0755</directoryMode>
             <excludes>
                 <exclude>**/*</exclude>
@@ -61,9 +55,8 @@
         </fileSet>
         <fileSet>
             <!-- Add an empty patch folder (so need to reference an existing dir, and exclude everything) -->
-            <directory>${project.basedir}/src/main/dist/lib</directory>
+            <directory>${project.basedir}/src/main/dist</directory>
             <outputDirectory>/lib/patch</outputDirectory>
-            <fileMode>0755</fileMode>
             <directoryMode>0755</directoryMode>
             <excludes>
                 <exclude>**/*</exclude>
@@ -72,6 +65,8 @@
         <fileSet>
             <directory>${project.basedir}/src/main/dist</directory>
             <outputDirectory>/</outputDirectory>
+            <fileMode>0644</fileMode>
+            <directoryMode>0755</directoryMode>
             <excludes>
                 <exclude>bin/*</exclude>
             </excludes>
@@ -82,6 +77,8 @@
     <dependencySets>
         <dependencySet>
             <outputDirectory>/lib/brooklyn</outputDirectory>
+            <fileMode>0644</fileMode>
+            <directoryMode>0755</directoryMode>
         </dependencySet>
     </dependencySets>
 </assembly>

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ae336cee/usage/dist/src/main/config/build-distribution-dir.xml
----------------------------------------------------------------------
diff --git a/usage/dist/src/main/config/build-distribution-dir.xml b/usage/dist/src/main/config/build-distribution-dir.xml
index 5be0d27..72b4989 100644
--- a/usage/dist/src/main/config/build-distribution-dir.xml
+++ b/usage/dist/src/main/config/build-distribution-dir.xml
@@ -18,8 +18,8 @@
     under the License.
 -->
 <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
-	    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
     <id>dist</id>
     <includeBaseDirectory>false</includeBaseDirectory>
     <formats>
@@ -29,6 +29,8 @@
         <fileSet>
             <directory>${project.basedir}/../..</directory>
             <outputDirectory>/</outputDirectory>
+            <fileMode>0644</fileMode>
+            <directoryMode>0755</directoryMode>
             <includes>
                 <include>README*</include>
                 <include>LICENSE*</include>
@@ -43,17 +45,9 @@
             <directoryMode>0755</directoryMode>
         </fileSet>
         <fileSet>
-            <directory>${project.basedir}/src/main/dist/lib</directory>
-            <outputDirectory>/lib</outputDirectory>
-            <includes>
-                <include>README*</include>
-            </includes>
-        </fileSet>
-        <fileSet>
             <!-- Add an empty dropins folder (so need to reference an existing dir, and exclude everything) -->
-            <directory>${project.basedir}/src/main/dist/lib</directory>
+            <directory>${project.basedir}/src/main/dist</directory>
             <outputDirectory>/lib/dropins</outputDirectory>
-            <fileMode>0755</fileMode>
             <directoryMode>0755</directoryMode>
             <excludes>
                 <exclude>**/*</exclude>
@@ -61,9 +55,8 @@
         </fileSet>
         <fileSet>
             <!-- Add an empty patch folder (so need to reference an existing dir, and exclude everything) -->
-            <directory>${project.basedir}/src/main/dist/lib</directory>
+            <directory>${project.basedir}/src/main/dist</directory>
             <outputDirectory>/lib/patch</outputDirectory>
-            <fileMode>0755</fileMode>
             <directoryMode>0755</directoryMode>
             <excludes>
                 <exclude>**/*</exclude>
@@ -72,17 +65,20 @@
         <fileSet>
             <directory>${project.basedir}/src/main/dist</directory>
             <outputDirectory>/</outputDirectory>
+            <fileMode>0644</fileMode>
+            <directoryMode>0755</directoryMode>
             <excludes>
                 <exclude>bin/*</exclude>
             </excludes>
         </fileSet>
-        
     </fileSets>
     <!-- TODO include documentation -->
     <!-- TODO include examples -->
     <dependencySets>
         <dependencySet>
             <outputDirectory>/lib/brooklyn</outputDirectory>
+            <fileMode>0644</fileMode>
+            <directoryMode>0755</directoryMode>
         </dependencySet>
     </dependencySets>
 </assembly>

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ae336cee/usage/dist/src/main/dist/bin/brooklyn
----------------------------------------------------------------------
diff --git a/usage/dist/src/main/dist/bin/brooklyn b/usage/dist/src/main/dist/bin/brooklyn
index c65b362..a5941b5 100755
--- a/usage/dist/src/main/dist/bin/brooklyn
+++ b/usage/dist/src/main/dist/bin/brooklyn
@@ -22,7 +22,7 @@
 
 #set -x # debug
 
-# discover BROOKLYN_HOME if not set, by attempting to resolve absolute path of this command (brooklyn)
+# discover BROOKLYN_HOME if not set, by attempting to resolve absolute path of this command
 ROOT=$(cd "$(dirname "$0")/.." && pwd -P)
 if [ -z "$BROOKLYN_HOME" ] ; then
     BROOKLYN_HOME=$(cd "$(dirname "$(readlink -f "$0" 2> /dev/null || readlink "$0" 2> /dev/null || echo "$0")")/.." && pwd)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ae336cee/usage/dist/src/main/dist/bin/cloud-explorer
----------------------------------------------------------------------
diff --git a/usage/dist/src/main/dist/bin/cloud-explorer b/usage/dist/src/main/dist/bin/cloud-explorer
index 822dbbe..fa7fb2c 100755
--- a/usage/dist/src/main/dist/bin/cloud-explorer
+++ b/usage/dist/src/main/dist/bin/cloud-explorer
@@ -21,12 +21,11 @@
 
 ROOT=$(cd "$(dirname "$0")/.." && pwd -P)
 
-# discover BROOKLYN_HOME if not set, by attempting to resolve absolute path of this command (brooklyn)
+# discover BROOKLYN_HOME if not set, by attempting to resolve absolute path of this command
 if [ -z "$BROOKLYN_HOME" ] ; then
     BROOKLYN_HOME=$(cd "$(dirname "$(readlink -f "$0" 2> /dev/null || readlink "$0" 2> /dev/null || echo "$0")")/.." && pwd)
 fi
 
-
 # use default memory settings, if not specified
 if [ -z "${JAVA_OPTS}" ] ; then
     JAVA_OPTS="-Xms256m -Xmx1g -XX:MaxPermSize=256m"
@@ -39,9 +38,5 @@ if [ ! -z "${BROOKLYN_CLASSPATH}" ]; then
     INITIAL_CLASSPATH=${BROOKLYN_CLASSPATH}:${INITIAL_CLASSPATH}
 fi
 
-# force resolution of localhost to be loopback, otherwise we hit problems
-# TODO should be changed in code
-JAVA_OPTS="-Dbrooklyn.location.localhost.address=127.0.0.1 ${JAVA_OPTS}"
-
 # run cloud-explorer
 exec java ${JAVA_OPTS} -cp "${INITIAL_CLASSPATH}" brooklyn.cli.CloudExplorer "$@"

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ae336cee/usage/dist/src/main/dist/bin/item-lister
----------------------------------------------------------------------
diff --git a/usage/dist/src/main/dist/bin/item-lister b/usage/dist/src/main/dist/bin/item-lister
new file mode 100755
index 0000000..5a5aab0
--- /dev/null
+++ b/usage/dist/src/main/dist/bin/item-lister
@@ -0,0 +1,42 @@
+#!/bin/bash
+#
+# 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.
+
+#set -x # debug
+
+ROOT=$(cd "$(dirname "$0")/.." && pwd -P)
+
+# discover BROOKLYN_HOME if not set, by attempting to resolve absolute path of this command
+if [ -z "$BROOKLYN_HOME" ] ; then
+    BROOKLYN_HOME=$(cd "$(dirname "$(readlink -f "$0" 2> /dev/null || readlink "$0" 2> /dev/null || echo "$0")")/.." && pwd)
+fi
+
+# use default memory settings, if not specified
+if [ -z "${JAVA_OPTS}" ] ; then
+    JAVA_OPTS="-Xms256m -Xmx1g -XX:MaxPermSize=256m"
+fi
+
+# set up the classpath
+INITIAL_CLASSPATH=${BROOKLYN_HOME}/conf:${BROOKLYN_HOME}/lib/patch/*:${BROOKLYN_HOME}/lib/brooklyn/*:${BROOKLYN_HOME}/lib/dropins/*
+# specify additional CP args in BROOKLYN_CLASSPATH
+if [ ! -z "${BROOKLYN_CLASSPATH}" ]; then
+    INITIAL_CLASSPATH=${BROOKLYN_CLASSPATH}:${INITIAL_CLASSPATH}
+fi
+
+# run item-lister
+exec java ${JAVA_OPTS} -cp "${INITIAL_CLASSPATH}" brooklyn.cli.itemlister.ItemLister "$@"


[2/8] git commit: Added logout link to username in console

Posted by gr...@apache.org.
Added logout link to username in console


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

Branch: refs/heads/master
Commit: d016148e6e6ba86bdf3d46d23f46f32d952027cb
Parents: a13d062
Author: Andrew Kennedy <gr...@apache.org>
Authored: Tue Oct 7 21:47:45 2014 +0100
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Fri Oct 10 14:04:00 2014 +0100

----------------------------------------------------------------------
 usage/jsgui/src/main/webapp/index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d016148e/usage/jsgui/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/usage/jsgui/src/main/webapp/index.html b/usage/jsgui/src/main/webapp/index.html
index f621f4d..ffc5722 100644
--- a/usage/jsgui/src/main/webapp/index.html
+++ b/usage/jsgui/src/main/webapp/index.html
@@ -44,7 +44,7 @@ under the License.
 
 <div class="navbar navbar-fixed-top">
     <div class="navbar-inner">
-        <div class="userName-top" id="user"></div>
+        <div class="userName-top"><a href="/logout"><span id="user"></span></a></div>
         <div class="container">
             <a class="logo" href="#" title="Brooklyn, Version 0.7.0-SNAPSHOT"><!-- Logo added via CSS --></a> <!-- BROOKLYN_VERSION -->
             <div class="menubar-top">


[5/8] git commit: Merge all CLI commands into single brooklyn script

Posted by gr...@apache.org.
Merge all CLI commands into single brooklyn script


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

Branch: refs/heads/master
Commit: f904f559dab9678058c1a9fdd457f1bb6cabcc80
Parents: 4bf1398
Author: Andrew Kennedy <gr...@apache.org>
Authored: Wed Oct 8 17:09:39 2014 +0100
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Fri Oct 10 15:03:14 2014 +0100

----------------------------------------------------------------------
 .../main/java/brooklyn/cli/CloudExplorer.java   |  49 +---
 .../src/main/java/brooklyn/cli/ItemLister.java  | 237 ++++++++++++++++++
 usage/cli/src/main/java/brooklyn/cli/Main.java  |  31 +++
 .../brooklyn/cli/itemlister/ItemLister.java     | 247 -------------------
 .../brooklyn/cli/CloudExplorerLiveTest.java     |  25 +-
 usage/dist/src/main/dist/bin/cloud-explorer     |  42 ----
 usage/dist/src/main/dist/bin/item-lister        |  42 ----
 7 files changed, 279 insertions(+), 394 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f904f559/usage/cli/src/main/java/brooklyn/cli/CloudExplorer.java
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/java/brooklyn/cli/CloudExplorer.java b/usage/cli/src/main/java/brooklyn/cli/CloudExplorer.java
index a5f4948..8f2f375 100644
--- a/usage/cli/src/main/java/brooklyn/cli/CloudExplorer.java
+++ b/usage/cli/src/main/java/brooklyn/cli/CloudExplorer.java
@@ -19,8 +19,6 @@
 package brooklyn.cli;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import io.airlift.command.Cli;
-import io.airlift.command.Cli.CliBuilder;
 import io.airlift.command.Command;
 import io.airlift.command.Option;
 import io.airlift.command.ParseException;
@@ -53,7 +51,6 @@ import brooklyn.util.stream.Streams;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
 /**
@@ -65,13 +62,9 @@ import com.google.common.collect.Lists;
  * so requires less additional credential configuration. It also gives brooklyn-specific information,
  * such as which image will be used by default in a given cloud.
  */
-public class CloudExplorer extends AbstractMain {
+public class CloudExplorer {
 
-    public static void main(String... args) {
-        new CloudExplorer().execCli(args);
-    }
-
-    public static abstract class JcloudsCommand extends BrooklynCommandCollectingArgs {
+    public static abstract class JcloudsCommand extends AbstractMain.BrooklynCommandCollectingArgs {
         @Option(name = { "--all-locations" }, title = "all locations",
                 description = "All locations (i.e. all locations in brooklyn.properties for which there are credentials)")
         public boolean allLocations;
@@ -385,42 +378,4 @@ public class CloudExplorer extends AbstractMain {
                     .add("blob", blob);
         }
     }
-
-    /** method intended for overriding when the script filename is different 
-     * @return the name of the script the user has invoked */
-    protected String cliScriptName() {
-        return "cloud-explorer";
-    }
-
-    /** method intended for overriding when a different {@link Cli} is desired,
-     * or when the subclass wishes to change any of the arguments */
-    protected CliBuilder<BrooklynCommand> cliBuilder() {
-        @SuppressWarnings({ "unchecked" })
-        CliBuilder<BrooklynCommand> builder = Cli.<BrooklynCommand>builder(cliScriptName())
-                .withDescription("Brooklyn Management Service")
-                .withCommands(
-                        HelpCommand.class,
-                        InfoCommand.class);
-
-        builder.withGroup("compute")
-                .withDescription("Access cloud-compute details of a given cloud")
-                .withDefaultCommand(HelpCommand.class)
-                .withCommands(ImmutableList.<Class<? extends BrooklynCommand>>of(
-                        ComputeListImagesCommand.class,
-                        ComputeListHardwareProfilesCommand.class,
-                        ComputeListInstancesCommand.class,
-                        ComputeGetImageCommand.class,
-                        ComputeDefaultTemplateCommand.class,
-                        ComputeTerminateInstancesCommand.class));
-
-        builder.withGroup("blobstore")
-                .withDescription("Access cloud-blobstore details of a given cloud")
-                .withDefaultCommand(HelpCommand.class)
-                .withCommands(ImmutableList.<Class<? extends BrooklynCommand>>of(
-                        BlobstoreListContainersCommand.class, 
-                        BlobstoreListContainerCommand.class,
-                        BlobstoreGetBlobCommand.class));
-
-        return builder;
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f904f559/usage/cli/src/main/java/brooklyn/cli/ItemLister.java
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/java/brooklyn/cli/ItemLister.java b/usage/cli/src/main/java/brooklyn/cli/ItemLister.java
new file mode 100644
index 0000000..9ff69e1
--- /dev/null
+++ b/usage/cli/src/main/java/brooklyn/cli/ItemLister.java
@@ -0,0 +1,237 @@
+/*
+ * 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.cli;
+
+import io.airlift.command.Command;
+import io.airlift.command.Option;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+import java.util.ServiceLoader;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.basic.BrooklynObject;
+import brooklyn.catalog.Catalog;
+import brooklyn.cli.itemlister.ClassFinder;
+import brooklyn.cli.itemlister.ItemDescriptors;
+import brooklyn.entity.Entity;
+import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.location.Location;
+import brooklyn.location.LocationResolver;
+import brooklyn.policy.Enricher;
+import brooklyn.policy.Policy;
+import brooklyn.util.ResourceUtils;
+import brooklyn.util.collections.MutableSet;
+import brooklyn.util.os.Os;
+import brooklyn.util.text.Strings;
+import brooklyn.util.text.TemplateProcessor;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Splitter;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.io.Files;
+
+public class ItemLister {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(ItemLister.class);
+
+    @Command(name = "list-objects", description = "List Brooklyn objects (Entities, Policies, Enrichers and Locations)")
+    public static class ListAllCommand extends AbstractMain.BrooklynCommandCollectingArgs {
+
+        @Option(name = { "--jars" }, title = "Jars", description = "Jars to scan. If a file (not a url) pointing at a directory, will include all files in that directory")
+        public List<String> jars = Lists.newLinkedList();
+
+        @Option(name = { "--type-regex" }, title = "Regex for types to list")
+        public String typeRegex;
+
+        @Option(name = { "--catalog-only" }, title = "Whether to only list items annotated with @Catalog")
+        public boolean catalogOnly = true;
+
+        @Option(name = { "--ignore-impls" }, title = "Ignore Entity implementations, where there is an Entity interface with @ImplementedBy")
+        public boolean ignoreImpls = false;
+
+        @Option(name = { "--headings-only" }, title = "Whether to only show name/type, and not config keys etc")
+        public boolean headingsOnly = false;
+        
+        @Option(name = { "--output-folder" }, title = "Folder to save output")
+        public String outputFolder;
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public Void call() throws Exception {
+            LOG.info("Retrieving objects");
+            List<URL> urls = getUrls();
+
+            // TODO Remove duplication from separate ListPolicyCommand etc
+            List<Class<? extends Entity>> entityTypes = getTypes(urls, Entity.class);
+            List<Class<? extends Policy>> policyTypes = getTypes(urls, Policy.class);
+            List<Class<? extends Enricher>> enricherTypes = getTypes(urls, Enricher.class);
+            List<Class<? extends Location>> locationTypes = getTypes(urls, Location.class, Boolean.FALSE);
+
+            Map<String, Object> result = ImmutableMap.<String, Object>builder()
+                    .put("entities", ItemDescriptors.toItemDescriptors(entityTypes, headingsOnly, "name"))
+                    .put("policies", ItemDescriptors.toItemDescriptors(policyTypes, headingsOnly, "name"))
+                    .put("enrichers", ItemDescriptors.toItemDescriptors(enricherTypes, headingsOnly, "name"))
+                    .put("locations", ItemDescriptors.toItemDescriptors(locationTypes, headingsOnly, "type"))
+                    .put("locationResolvers", ItemDescriptors.toItemDescriptors(ImmutableList.copyOf(ServiceLoader.load(LocationResolver.class)), true))
+                    .build();
+
+            String json = toJson(result);
+
+            if (outputFolder == null) {
+                System.out.println(json);
+            } else {
+                LOG.info("Outputting item list to " + outputFolder);
+                String outputPath = Os.mergePaths(outputFolder, "index.html");
+                String parentDir = (new File(outputPath).getParentFile()).getAbsolutePath();
+                mkdir(parentDir, "entities");
+                mkdir(parentDir, "policies");
+                mkdir(parentDir, "enrichers");
+                mkdir(parentDir, "locations");
+                mkdir(parentDir, "locationResolvers");
+                Files.write("var items = " + json, new File(Os.mergePaths(outputFolder, "items.js")), Charsets.UTF_8);
+                ResourceUtils resourceUtils = ResourceUtils.create(this);
+                String js = resourceUtils.getResourceAsString("common.js");
+                Files.write(js, new File(Os.mergePaths(outputFolder, "common.js")), Charsets.UTF_8);
+                String css = resourceUtils.getResourceAsString("items.css");
+                Files.write(css, new File(Os.mergePaths(outputFolder, "items.css")), Charsets.UTF_8);
+                String mainHtml = resourceUtils.getResourceAsString("brooklyn-object-list.html");
+                Files.write(mainHtml, new File(Os.mergePaths(outputFolder, "index.html")), Charsets.UTF_8);
+                List<Map<String, Object>> entities = (List<Map<String, Object>>) result.get("entities");
+                String entityTemplateHtml = resourceUtils.getResourceAsString("entity.html");
+                for (Map<String, Object> entity : entities) {
+                    String type = (String) entity.get("type");
+                    String name = (String) entity.get("name");
+                    String entityHtml = TemplateProcessor.processTemplateContents(entityTemplateHtml, ImmutableMap.of("type", type, "name", name));
+                    Files.write(entityHtml, new File(Os.mergePaths(outputFolder, "entities", type + ".html")), Charsets.UTF_8);
+                }
+                List<Map<String, Object>> policies = (List<Map<String, Object>>) result.get("policies");
+                String policyTemplateHtml = resourceUtils.getResourceAsString("policy.html");
+                for (Map<String, Object> policy : policies) {
+                    String type = (String) policy.get("type");
+                    String name = (String) policy.get("name");
+                    String policyHtml = TemplateProcessor.processTemplateContents(policyTemplateHtml, ImmutableMap.of("type", type, "name", name));
+                    Files.write(policyHtml, new File(Os.mergePaths(outputFolder, "policies", type + ".html")), Charsets.UTF_8);
+                }
+                List<Map<String, Object>> enrichers = (List<Map<String, Object>>) result.get("enrichers");
+                String enricherTemplateHtml = resourceUtils.getResourceAsString("enricher.html");
+                for (Map<String, Object> enricher : enrichers) {
+                    String type = (String) enricher.get("type");
+                    String name = (String) enricher.get("name");
+                    String enricherHtml = TemplateProcessor.processTemplateContents(enricherTemplateHtml, ImmutableMap.of("type", type, "name", name));
+                    Files.write(enricherHtml, new File(Os.mergePaths(outputFolder, "enrichers", type + ".html")), Charsets.UTF_8);
+                }
+                List<Map<String, Object>> locations = (List<Map<String, Object>>) result.get("locations");
+                String locationTemplateHtml = resourceUtils.getResourceAsString("location.html");
+                for (Map<String, Object> location : locations) {
+                    String type = (String) location.get("type");
+                    String locationHtml = TemplateProcessor.processTemplateContents(locationTemplateHtml, ImmutableMap.of("type", type));
+                    Files.write(locationHtml, new File(Os.mergePaths(outputFolder, "locations", type + ".html")), Charsets.UTF_8);
+                }
+                LOG.info("Finished outputting item list to " + outputFolder);
+            }
+            return null;
+        }
+
+        private void mkdir(String rootDir, String dirName) {
+            (new File(Os.mergePaths(rootDir, dirName))).mkdirs();
+        }
+
+        protected List<URL> getUrls() throws MalformedURLException {
+            List<URL> urls = Lists.newArrayList();
+            if (jars.isEmpty()) {
+                String classpath = System.getenv("INITIAL_CLASSPATH");
+                if (Strings.isNonBlank(classpath)) {
+                    List<String> entries = Splitter.on(":").omitEmptyStrings().trimResults().splitToList(classpath);
+                    for (String entry : entries) {
+                        if (entry.endsWith(".jar") || entry.endsWith("/*")) {
+                            urls.addAll(ClassFinder.toJarUrls(entry.replace("/*", "")));
+                        }
+                    }
+                } else {
+                    throw new IllegalArgumentException("No Jars to process");
+                }
+            } else {
+                for (String jar : jars) {
+                    urls.addAll(ClassFinder.toJarUrls(jar));
+                }
+            }
+            return urls;
+        }
+
+        private <T extends BrooklynObject> List<Class<? extends T>> getTypes(List<URL> urls, Class<T> type) {
+            return getTypes(urls, type, null);
+        }
+        
+        private <T extends BrooklynObject> List<Class<? extends T>> getTypes(List<URL> urls, Class<T> type, Boolean catalogOnlyOverride) {
+            FluentIterable<Class<? extends T>> fluent = FluentIterable.from(ClassFinder.findClasses(urls, type));
+            if (typeRegex != null) {
+                fluent = fluent.filter(ClassFinder.withClassNameMatching(typeRegex));
+            }
+            if (catalogOnlyOverride == null ? catalogOnly : catalogOnlyOverride) {
+                fluent = fluent.filter(ClassFinder.withAnnotation(Catalog.class));
+            }
+            ImmutableList<Class<? extends T>> result = fluent.toList();
+            if (ignoreImpls) {
+                MutableSet<Class<? extends T>> mutableResult = MutableSet.copyOf(result);
+                for (Class<? extends T> clazz : result) {
+                    ImplementedBy implementedBy = clazz.getAnnotation(ImplementedBy.class);
+                    if (implementedBy != null) {
+                        mutableResult.remove(implementedBy.value());
+                    }
+                }
+                return ImmutableList.copyOf(mutableResult);
+            } else {
+                return result;
+            }
+        }
+        
+        private String toJson(Object obj) throws JsonProcessingException {
+            ObjectMapper objectMapper = new ObjectMapper()
+                    .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
+                    .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+                    .enable(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS)
+                    .enable(SerializationFeature.INDENT_OUTPUT)
+                    .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+                    .setSerializationInclusion(JsonInclude.Include.ALWAYS)
+            
+                    // Only serialise annotated fields
+                    .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
+                    .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+            
+            return objectMapper.writeValueAsString(obj);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f904f559/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 204c63c..b3bce68 100644
--- a/usage/cli/src/main/java/brooklyn/cli/Main.java
+++ b/usage/cli/src/main/java/brooklyn/cli/Main.java
@@ -37,6 +37,16 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.catalog.BrooklynCatalog;
+import brooklyn.cli.CloudExplorer.BlobstoreGetBlobCommand;
+import brooklyn.cli.CloudExplorer.BlobstoreListContainerCommand;
+import brooklyn.cli.CloudExplorer.BlobstoreListContainersCommand;
+import brooklyn.cli.CloudExplorer.ComputeDefaultTemplateCommand;
+import brooklyn.cli.CloudExplorer.ComputeGetImageCommand;
+import brooklyn.cli.CloudExplorer.ComputeListHardwareProfilesCommand;
+import brooklyn.cli.CloudExplorer.ComputeListImagesCommand;
+import brooklyn.cli.CloudExplorer.ComputeListInstancesCommand;
+import brooklyn.cli.CloudExplorer.ComputeTerminateInstancesCommand;
+import brooklyn.cli.ItemLister.ListAllCommand;
 import brooklyn.entity.Application;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.AbstractApplication;
@@ -809,14 +819,35 @@ public class Main extends AbstractMain {
         @SuppressWarnings({ "unchecked" })
         CliBuilder<BrooklynCommand> builder = Cli.<BrooklynCommand>builder(cliScriptName())
                 .withDescription("Brooklyn Management Service")
+                .withDefaultCommand(InfoCommand.class)
                 .withCommands(
                         HelpCommand.class,
                         InfoCommand.class,
                         GeneratePasswordCommand.class,
                         CopyStateCommand.class,
+                        ListAllCommand.class,
                         cliLaunchCommand()
                 );
 
+        builder.withGroup("cloud-compute")
+                .withDescription("Access compute details of a given cloud")
+                .withDefaultCommand(HelpCommand.class)
+                .withCommands(
+                        ComputeListImagesCommand.class,
+                        ComputeListHardwareProfilesCommand.class,
+                        ComputeListInstancesCommand.class,
+                        ComputeGetImageCommand.class,
+                        ComputeDefaultTemplateCommand.class,
+                        ComputeTerminateInstancesCommand.class);
+
+        builder.withGroup("cloud-blobstore")
+                .withDescription("Access blobstore details of a given cloud")
+                .withDefaultCommand(HelpCommand.class)
+                .withCommands(
+                        BlobstoreListContainersCommand.class, 
+                        BlobstoreListContainerCommand.class,
+                        BlobstoreGetBlobCommand.class);
+
         return builder;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f904f559/usage/cli/src/main/java/brooklyn/cli/itemlister/ItemLister.java
----------------------------------------------------------------------
diff --git a/usage/cli/src/main/java/brooklyn/cli/itemlister/ItemLister.java b/usage/cli/src/main/java/brooklyn/cli/itemlister/ItemLister.java
deleted file mode 100644
index f12d31d..0000000
--- a/usage/cli/src/main/java/brooklyn/cli/itemlister/ItemLister.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.cli.itemlister;
-
-import io.airlift.command.Cli;
-import io.airlift.command.Cli.CliBuilder;
-import io.airlift.command.Command;
-import io.airlift.command.Option;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
-import java.util.Map;
-import java.util.ServiceLoader;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.basic.BrooklynObject;
-import brooklyn.catalog.Catalog;
-import brooklyn.cli.AbstractMain;
-import brooklyn.entity.Entity;
-import brooklyn.entity.proxying.ImplementedBy;
-import brooklyn.location.Location;
-import brooklyn.location.LocationResolver;
-import brooklyn.policy.Enricher;
-import brooklyn.policy.Policy;
-import brooklyn.util.ResourceUtils;
-import brooklyn.util.collections.MutableSet;
-import brooklyn.util.os.Os;
-import brooklyn.util.text.TemplateProcessor;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.google.common.base.Charsets;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import com.google.common.io.Files;
-
-public class ItemLister extends AbstractMain {
-    
-    private static final Logger LOG = LoggerFactory.getLogger(ItemLister.class);
-
-    public static void main(String... args) {
-        new ItemLister().execCli(args);
-    }
-
-    @Command(name = "all", description = "Lists everything")
-    public static class ListAllCommand extends BrooklynCommandCollectingArgs {
-
-        @Option(name = { "--jars" }, title = "Jars", description = "jars to scan. If a file (not a url) pointing at a directory, will include all files in that directory")
-        public List<String> jars;
-
-        @Option(name = { "--type-regex" }, title = "Regex for types to list")
-        public String typeRegex = null;
-
-        @Option(name = { "--catalog-only" }, title = "Whether to only list items annotated with @Catalog")
-        public boolean catalogOnly = true;
-
-        @Option(name = { "--ignore-impls" }, title = "Ignore Entity implementations, where there is an Entity interface with @ImplementedBy")
-        public boolean ignoreImpls;
-
-        @Option(name = { "--headings-only" }, title = "Whether to only show name/type, and not config keys etc")
-        public boolean headingsOnly;
-        
-        @Option(name = { "--output-folder" }, title = "Whether to only show name/type, and not config keys etc")
-        public String outputFolder;
-
-        @SuppressWarnings("unchecked")
-        @Override
-        public Void call() throws Exception {
-            LOG.info("Retrieving objects");
-            List<URL> urls = getUrls();
-            
-            // TODO Remove duplication from separate ListPolicyCommand etc
-            List<Class<? extends Entity>> entityTypes = getTypes(urls, Entity.class);
-            List<Class<? extends Policy>> policyTypes = getTypes(urls, Policy.class);
-            List<Class<? extends Enricher>> enricherTypes = getTypes(urls, Enricher.class);
-            List<Class<? extends Location>> locationTypes = getTypes(urls, Location.class, Boolean.FALSE);
-
-            Map<String, Object> result = ImmutableMap.<String, Object>builder()
-                    .put("entities", ItemDescriptors.toItemDescriptors(entityTypes, headingsOnly, "name"))
-                    .put("policies", ItemDescriptors.toItemDescriptors(policyTypes, headingsOnly, "name"))
-                    .put("enrichers", ItemDescriptors.toItemDescriptors(enricherTypes, headingsOnly, "name"))
-                    .put("locations", ItemDescriptors.toItemDescriptors(locationTypes, headingsOnly, "type"))
-                    .put("locationResolvers", ItemDescriptors.toItemDescriptors(ImmutableList.copyOf(ServiceLoader.load(LocationResolver.class)), true))
-                    .build();
-
-            String json = toJson(result);
-
-            if (outputFolder == null) {
-                System.out.println(json);
-            } else {
-                LOG.info("Outputting item list to " + outputFolder);
-                String outputPath = Os.mergePaths(outputFolder, "index.html");
-                String parentDir = (new File(outputPath).getParentFile()).getAbsolutePath();
-                mkdir(parentDir, "entities");
-                mkdir(parentDir, "policies");
-                mkdir(parentDir, "enrichers");
-                mkdir(parentDir, "locations");
-                mkdir(parentDir, "locationResolvers");
-                Files.write("var items = " + json, new File(Os.mergePaths(outputFolder, "items.js")), Charsets.UTF_8);
-                ResourceUtils resourceUtils = ResourceUtils.create(this);
-                String js = resourceUtils.getResourceAsString("common.js");
-                Files.write(js, new File(Os.mergePaths(outputFolder, "common.js")), Charsets.UTF_8);
-                String css = resourceUtils.getResourceAsString("items.css");
-                Files.write(css, new File(Os.mergePaths(outputFolder, "items.css")), Charsets.UTF_8);
-                String mainHtml = resourceUtils.getResourceAsString("brooklyn-object-list.html");
-                Files.write(mainHtml, new File(Os.mergePaths(outputFolder, "index.html")), Charsets.UTF_8);
-                List<Map<String, Object>> entities = (List<Map<String, Object>>) result.get("entities");
-                String entityTemplateHtml = resourceUtils.getResourceAsString("entity.html");
-                for (Map<String, Object> entity : entities) {
-                    String type = (String) entity.get("type");
-                    String name = (String) entity.get("name");
-                    String entityHtml = TemplateProcessor.processTemplateContents(entityTemplateHtml, ImmutableMap.of("type", type, "name", name));
-                    Files.write(entityHtml, new File(Os.mergePaths(outputFolder, "entities", type + ".html")), Charsets.UTF_8);
-                }
-                List<Map<String, Object>> policies = (List<Map<String, Object>>) result.get("policies");
-                String policyTemplateHtml = resourceUtils.getResourceAsString("policy.html");
-                for (Map<String, Object> policy : policies) {
-                    String type = (String) policy.get("type");
-                    String name = (String) policy.get("name");
-                    String policyHtml = TemplateProcessor.processTemplateContents(policyTemplateHtml, ImmutableMap.of("type", type, "name", name));
-                    Files.write(policyHtml, new File(Os.mergePaths(outputFolder, "policies", type + ".html")), Charsets.UTF_8);
-                }
-                List<Map<String, Object>> enrichers = (List<Map<String, Object>>) result.get("enrichers");
-                String enricherTemplateHtml = resourceUtils.getResourceAsString("enricher.html");
-                for (Map<String, Object> enricher : enrichers) {
-                    String type = (String) enricher.get("type");
-                    String name = (String) enricher.get("name");
-                    String enricherHtml = TemplateProcessor.processTemplateContents(enricherTemplateHtml, ImmutableMap.of("type", type, "name", name));
-                    Files.write(enricherHtml, new File(Os.mergePaths(outputFolder, "enrichers", type + ".html")), Charsets.UTF_8);
-                }
-                List<Map<String, Object>> locations = (List<Map<String, Object>>) result.get("locations");
-                String locationTemplateHtml = resourceUtils.getResourceAsString("location.html");
-                for (Map<String, Object> location : locations) {
-                    String type = (String) location.get("type");
-                    String locationHtml = TemplateProcessor.processTemplateContents(locationTemplateHtml, ImmutableMap.of("type", type));
-                    Files.write(locationHtml, new File(Os.mergePaths(outputFolder, "locations", type + ".html")), Charsets.UTF_8);
-                }
-                LOG.info("Finished outputting item list to " + outputFolder);
-            }
-            return null;
-        }
-
-        private void mkdir(String rootDir, String dirName) {
-            (new File(Os.mergePaths(rootDir, dirName))).mkdirs();
-        }
-
-        protected List<URL> getUrls() throws MalformedURLException {
-            List<URL> urls = Lists.newArrayList();
-            for (String jar : jars) {
-                urls.addAll(ClassFinder.toJarUrls(jar));
-            }
-            return urls;
-        }
-
-        private <T extends BrooklynObject> List<Class<? extends T>> getTypes(List<URL> urls, Class<T> type) {
-            return getTypes(urls, type, null);
-        }
-        
-        private <T extends BrooklynObject> List<Class<? extends T>> getTypes(List<URL> urls, Class<T> type, Boolean catalogOnlyOverride) {
-            FluentIterable<Class<? extends T>> fluent = FluentIterable.from(ClassFinder.findClasses(urls, type));
-            if (typeRegex != null) {
-                fluent = fluent.filter(ClassFinder.withClassNameMatching(typeRegex));
-            }
-            if (catalogOnlyOverride == null ? catalogOnly : catalogOnlyOverride) {
-                fluent = fluent.filter(ClassFinder.withAnnotation(Catalog.class));
-            }
-            ImmutableList<Class<? extends T>> result = fluent.toList();
-            if (ignoreImpls) {
-                MutableSet<Class<? extends T>> mutableResult = MutableSet.copyOf(result);
-                for (Class<? extends T> clazz : result) {
-                    ImplementedBy implementedBy = clazz.getAnnotation(ImplementedBy.class);
-                    if (implementedBy != null) {
-                        mutableResult.remove(implementedBy.value());
-                    }
-                }
-                return ImmutableList.copyOf(mutableResult);
-            } else {
-                return result;
-            }
-        }
-        
-        private String toJson(Object obj) throws JsonProcessingException {
-            ObjectMapper objectMapper = new ObjectMapper()
-                    .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
-                    .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
-                    .enable(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS)
-                    .enable(SerializationFeature.INDENT_OUTPUT)
-                    .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-                    .setSerializationInclusion(JsonInclude.Include.ALWAYS)
-            
-                    // Only serialise annotated fields
-                    .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
-                    .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
-            
-            return objectMapper.writeValueAsString(obj);
-        }
-    }
-
-    /** method intended for overriding when the script filename is different 
-     * @return the name of the script the user has invoked */
-    protected String cliScriptName() {
-        return "item-lister";
-    }
-
-    /** method intended for overriding when a different {@link Cli} is desired,
-     * or when the subclass wishes to change any of the arguments */
-    protected CliBuilder<BrooklynCommand> cliBuilder() {
-        @SuppressWarnings({ "unchecked" })
-        CliBuilder<BrooklynCommand> builder = Cli.<BrooklynCommand>builder(cliScriptName())
-                .withDescription("Brooklyn Management Service")
-                .withDefaultCommand(ListAllCommand.class)
-                .withCommands(
-                        HelpCommand.class,
-                        InfoCommand.class,
-                        ListAllCommand.class
-                );
-
-        return builder;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f904f559/usage/cli/src/test/java/brooklyn/cli/CloudExplorerLiveTest.java
----------------------------------------------------------------------
diff --git a/usage/cli/src/test/java/brooklyn/cli/CloudExplorerLiveTest.java b/usage/cli/src/test/java/brooklyn/cli/CloudExplorerLiveTest.java
index a79ad78..3d3b140 100644
--- a/usage/cli/src/test/java/brooklyn/cli/CloudExplorerLiveTest.java
+++ b/usage/cli/src/test/java/brooklyn/cli/CloudExplorerLiveTest.java
@@ -20,9 +20,7 @@ package brooklyn.cli;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
 import io.airlift.command.Cli;
-import io.airlift.command.ParseCommandMissingException;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -51,19 +49,14 @@ public class CloudExplorerLiveTest {
     }
 
     @Test
-    public void testNoArgsThrowsException() throws Exception {
-        try {
-            call(new String[0]);
-            fail();
-        } catch (ParseCommandMissingException e) {
-            // expected
-        }
+    public void testNoArgsReturnsInfo() throws Exception {
+        call(new String[0]);
     }
 
     // A user running these tests might not have any instances; so don't assert that there will be one
     @Test(groups={"Live", "Live-sanity"})
     public void testListInstances() throws Exception {
-        call("compute", "list-instances", "--location", "jclouds:aws-ec2:eu-west-1");
+        call("cloud-compute", "list-instances", "--location", "jclouds:aws-ec2:eu-west-1");
         
         String errmsg = "stdout="+stdout+"; stderr="+stderr;
         
@@ -75,7 +68,7 @@ public class CloudExplorerLiveTest {
 
     @Test(groups={"Live", "Live-sanity"})
     public void testListImages() throws Exception {
-        call("compute", "list-images", "--location", "jclouds:softlayer:ams01");
+        call("cloud-compute", "list-images", "--location", "jclouds:softlayer:ams01");
         
         String errmsg = "stdout="+stdout+"; stderr="+stderr;
         
@@ -92,7 +85,7 @@ public class CloudExplorerLiveTest {
 
     @Test(groups={"Live", "Live-sanity"})
     public void testListHardwareProfiles() throws Exception {
-        call("compute", "list-hardware-profiles", "--location", "jclouds:softlayer:ams01");
+        call("cloud-compute", "list-hardware-profiles", "--location", "jclouds:softlayer:ams01");
         
         String errmsg = "stdout="+stdout+"; stderr="+stderr;
         
@@ -109,7 +102,7 @@ public class CloudExplorerLiveTest {
 
     @Test(groups={"Live", "Live-sanity"})
     public void testGetImage() throws Exception {
-        call("compute", "get-image", "--location", "jclouds:softlayer:ams01", "CENTOS_6_64");
+        call("cloud-compute", "get-image", "--location", "jclouds:softlayer:ams01", "CENTOS_6_64");
         
         String errmsg = "stdout="+stdout+"; stderr="+stderr;
         
@@ -126,7 +119,7 @@ public class CloudExplorerLiveTest {
 
     @Test(groups={"Live", "Live-sanity"})
     public void testGetDefaultTemplate() throws Exception {
-        call("compute", "default-template", "--location", "jclouds:softlayer:ams01");
+        call("cloud-compute", "default-template", "--location", "jclouds:softlayer:ams01");
         
         String errmsg = "stdout="+stdout+"; stderr="+stderr;
         
@@ -152,7 +145,7 @@ public class CloudExplorerLiveTest {
      */
     @Test(groups={"Live", "Live-sanity"})
     public void testListContainers() throws Exception {
-        call("blobstore", "list-containers", "--location", "named:softlayer-swift-ams01");
+        call("cloud-blobstore", "list-containers", "--location", "named:softlayer-swift-ams01");
         
         String errmsg = "stdout="+stdout+"; stderr="+stderr;
         
@@ -171,7 +164,7 @@ public class CloudExplorerLiveTest {
         ByteArrayOutputStream stdoutStream = new ByteArrayOutputStream();
         ByteArrayOutputStream stderrStream = new ByteArrayOutputStream();
         
-        Cli<BrooklynCommand> parser = new CloudExplorer().cliBuilder().build();
+        Cli<BrooklynCommand> parser = new Main().cliBuilder().build();
         
         BrooklynCommand command = parser.parse(args);
         command.stdout = new PrintStream(stdoutStream);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f904f559/usage/dist/src/main/dist/bin/cloud-explorer
----------------------------------------------------------------------
diff --git a/usage/dist/src/main/dist/bin/cloud-explorer b/usage/dist/src/main/dist/bin/cloud-explorer
deleted file mode 100755
index fa7fb2c..0000000
--- a/usage/dist/src/main/dist/bin/cloud-explorer
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# 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.
-
-#set -x # debug
-
-ROOT=$(cd "$(dirname "$0")/.." && pwd -P)
-
-# discover BROOKLYN_HOME if not set, by attempting to resolve absolute path of this command
-if [ -z "$BROOKLYN_HOME" ] ; then
-    BROOKLYN_HOME=$(cd "$(dirname "$(readlink -f "$0" 2> /dev/null || readlink "$0" 2> /dev/null || echo "$0")")/.." && pwd)
-fi
-
-# use default memory settings, if not specified
-if [ -z "${JAVA_OPTS}" ] ; then
-    JAVA_OPTS="-Xms256m -Xmx1g -XX:MaxPermSize=256m"
-fi
-
-# set up the classpath
-INITIAL_CLASSPATH=${BROOKLYN_HOME}/conf:${BROOKLYN_HOME}/lib/patch/*:${BROOKLYN_HOME}/lib/brooklyn/*:${BROOKLYN_HOME}/lib/dropins/*
-# specify additional CP args in BROOKLYN_CLASSPATH
-if [ ! -z "${BROOKLYN_CLASSPATH}" ]; then
-    INITIAL_CLASSPATH=${BROOKLYN_CLASSPATH}:${INITIAL_CLASSPATH}
-fi
-
-# run cloud-explorer
-exec java ${JAVA_OPTS} -cp "${INITIAL_CLASSPATH}" brooklyn.cli.CloudExplorer "$@"

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f904f559/usage/dist/src/main/dist/bin/item-lister
----------------------------------------------------------------------
diff --git a/usage/dist/src/main/dist/bin/item-lister b/usage/dist/src/main/dist/bin/item-lister
deleted file mode 100755
index 5a5aab0..0000000
--- a/usage/dist/src/main/dist/bin/item-lister
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# 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.
-
-#set -x # debug
-
-ROOT=$(cd "$(dirname "$0")/.." && pwd -P)
-
-# discover BROOKLYN_HOME if not set, by attempting to resolve absolute path of this command
-if [ -z "$BROOKLYN_HOME" ] ; then
-    BROOKLYN_HOME=$(cd "$(dirname "$(readlink -f "$0" 2> /dev/null || readlink "$0" 2> /dev/null || echo "$0")")/.." && pwd)
-fi
-
-# use default memory settings, if not specified
-if [ -z "${JAVA_OPTS}" ] ; then
-    JAVA_OPTS="-Xms256m -Xmx1g -XX:MaxPermSize=256m"
-fi
-
-# set up the classpath
-INITIAL_CLASSPATH=${BROOKLYN_HOME}/conf:${BROOKLYN_HOME}/lib/patch/*:${BROOKLYN_HOME}/lib/brooklyn/*:${BROOKLYN_HOME}/lib/dropins/*
-# specify additional CP args in BROOKLYN_CLASSPATH
-if [ ! -z "${BROOKLYN_CLASSPATH}" ]; then
-    INITIAL_CLASSPATH=${BROOKLYN_CLASSPATH}:${INITIAL_CLASSPATH}
-fi
-
-# run item-lister
-exec java ${JAVA_OPTS} -cp "${INITIAL_CLASSPATH}" brooklyn.cli.itemlister.ItemLister "$@"


[4/8] git commit: Move renderer hint initialisation where its more likely to be executed

Posted by gr...@apache.org.
Move renderer hint initialisation where its more likely to be executed


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

Branch: refs/heads/master
Commit: 2b9063ba9df32a6d72e5d77f9b735046b380d01b
Parents: ae336ce
Author: Andrew Kennedy <gr...@apache.org>
Authored: Wed Oct 8 02:27:35 2014 +0100
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Fri Oct 10 14:04:01 2014 +0100

----------------------------------------------------------------------
 .../brooklyn/basic/BasicConfigurableObject.java |  5 +--
 .../api/HasBrooklynManagementContext.java       |  2 +-
 .../brooklyn/config/render/RendererHints.java   | 34 +++++++++-----------
 .../java/brooklyn/entity/basic/Attributes.java  |  4 +--
 .../java/brooklyn/entity/basic/Lifecycle.java   |  2 --
 .../main/java/brooklyn/event/basic/Sensors.java | 26 +++++++++++++--
 6 files changed, 44 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2b9063ba/core/src/main/java/brooklyn/basic/BasicConfigurableObject.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/basic/BasicConfigurableObject.java b/core/src/main/java/brooklyn/basic/BasicConfigurableObject.java
index 49766c6..f4910f1 100644
--- a/core/src/main/java/brooklyn/basic/BasicConfigurableObject.java
+++ b/core/src/main/java/brooklyn/basic/BasicConfigurableObject.java
@@ -18,6 +18,7 @@
  */
 package brooklyn.basic;
 
+import brooklyn.camp.brooklyn.api.HasBrooklynManagementContext;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.trait.Configurable;
 import brooklyn.entity.trait.Identifiable;
@@ -37,7 +38,7 @@ import brooklyn.util.text.Identifiers;
  * deferred operations are assumed to have occurred prior to calling {@link #setConfig(ConfigKey, Object)} i.e. at
  * object construction.
  */
-public class BasicConfigurableObject implements Configurable, Identifiable, ManagementContextInjectable {
+public class BasicConfigurableObject implements Configurable, Identifiable, ManagementContextInjectable, HasBrooklynManagementContext {
 
     @SetFromFlag("id")
     private String id = Identifiers.makeRandomId(8);
@@ -54,7 +55,7 @@ public class BasicConfigurableObject implements Configurable, Identifiable, Mana
         this.managementContext = managementContext;
     }
 
-    public ManagementContext getManagementContext() {
+    public ManagementContext getBrooklynManagementContext() {
         return managementContext;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2b9063ba/core/src/main/java/brooklyn/camp/brooklyn/api/HasBrooklynManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/camp/brooklyn/api/HasBrooklynManagementContext.java b/core/src/main/java/brooklyn/camp/brooklyn/api/HasBrooklynManagementContext.java
index 8acfe2d..b8c1280 100644
--- a/core/src/main/java/brooklyn/camp/brooklyn/api/HasBrooklynManagementContext.java
+++ b/core/src/main/java/brooklyn/camp/brooklyn/api/HasBrooklynManagementContext.java
@@ -1,4 +1,3 @@
-package brooklyn.camp.brooklyn.api;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -17,6 +16,7 @@ package brooklyn.camp.brooklyn.api;
  * specific language governing permissions and limitations
  * under the License.
  */
+package brooklyn.camp.brooklyn.api;
 
 import brooklyn.management.ManagementContext;
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2b9063ba/core/src/main/java/brooklyn/config/render/RendererHints.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/config/render/RendererHints.java b/core/src/main/java/brooklyn/config/render/RendererHints.java
index ea84b02..c630fce 100644
--- a/core/src/main/java/brooklyn/config/render/RendererHints.java
+++ b/core/src/main/java/brooklyn/config/render/RendererHints.java
@@ -20,6 +20,7 @@ package brooklyn.config.render;
 
 import groovy.lang.Closure;
 
+import java.net.URI;
 import java.net.URL;
 import java.util.Set;
 
@@ -239,33 +240,38 @@ public class RendererHints {
     }
 
     @Beta
-    public static <T> DisplayValue<T> displayValue(Function<T, String> transform) {
+    public static <T> DisplayValue<T> displayValue(Function<T,String> transform) {
         return new DisplayValue<T>(transform);
     }
 
     @Beta
-    public static <T> NamedActionWithUrl<T> namedActionWithUrl(String actionName, Function<T, String> transform) {
-        return new RendererHints.NamedActionWithUrl<T>(actionName, transform);
+    public static <T> NamedActionWithUrl<T> namedActionWithUrl(String actionName, Function<T,String> transform) {
+        return new NamedActionWithUrl<T>(actionName, transform);
     }
 
     @Beta
     public static <T> NamedActionWithUrl<T> namedActionWithUrl(String actionName) {
-        return new RendererHints.NamedActionWithUrl<T>(actionName);
+        return new NamedActionWithUrl<T>(actionName);
     }
 
     @Beta
-    public static <T> NamedActionWithUrl<T> namedActionWithUrl(Function<T, String> transform) {
-        return namedActionWithUrl("Open", transform);
+    public static <T> NamedActionWithUrl<T> namedActionWithUrl(Function<T,String> transform) {
+        return openWithUrl(transform);
     }
 
     @Beta
     public static <T> NamedActionWithUrl<T> namedActionWithUrl() {
-        return namedActionWithUrl((Function<T,String>)null);
+        return openWithUrl();
     }
 
     @Beta
-    public static <T> NamedActionWithUrl<T> openWithUrl(Function<T, String> transform) {
-        return new RendererHints.NamedActionWithUrl<T>("Open", transform);
+    public static <T> NamedActionWithUrl<T> openWithUrl() {
+        return openWithUrl((Function<T,String>) null);
+    }
+
+    @Beta
+    public static <T> NamedActionWithUrl<T> openWithUrl(Function<T,String> transform) {
+        return new NamedActionWithUrl<T>("Open", transform);
     }
 
     /** use with care as this makes REST access difficult */
@@ -274,14 +280,4 @@ public class RendererHints {
         return new DisplayValue<T>(Functions.constant("********"));
     }
     
-    static {
-        // apply display hints for common utility objects
-        register(Duration.class, displayValue(Time.fromDurationToTimeStringRounded()));
-        register(HostAndPort.class, displayValue(StringFunctions.toStringFunction()));
-        register(UserAndHostAndPort.class, displayValue(StringFunctions.toStringFunction()));
-        
-        register(URL.class, displayValue(StringFunctions.toStringFunction()));
-        register(URL.class, openWithUrl(StringFunctions.toStringFunction()));
-    }
-    
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2b9063ba/core/src/main/java/brooklyn/entity/basic/Attributes.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/Attributes.java b/core/src/main/java/brooklyn/entity/basic/Attributes.java
index f4f8a69..e26617e 100644
--- a/core/src/main/java/brooklyn/entity/basic/Attributes.java
+++ b/core/src/main/java/brooklyn/entity/basic/Attributes.java
@@ -49,7 +49,6 @@ public interface Attributes {
     BasicAttributeSensorAndConfigKey<Map<String,String>> DOWNLOAD_ADDON_URLS = new BasicAttributeSensorAndConfigKey(
             Map.class, "download.addon.urls", "URL patterns for downloading named add-ons (will substitute things like ${version} automatically)");
 
-
     /*
      * Port number attributes.
      */
@@ -122,6 +121,5 @@ public interface Attributes {
     
     AttributeSensor<Integer> PID = Sensors.newIntegerSensor("pid", "Process ID for the previously launched instance");
 
-    AttributeSensor<String> LOG_FILE_LOCATION = new BasicAttributeSensor<String>(
-            String.class, "log.location", "Log file location");
+    AttributeSensor<String> LOG_FILE_LOCATION = Sensors.newStringSensor("log.location", "Log file location");
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2b9063ba/core/src/main/java/brooklyn/entity/basic/Lifecycle.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/Lifecycle.java b/core/src/main/java/brooklyn/entity/basic/Lifecycle.java
index 89e469f..2c8c237 100644
--- a/core/src/main/java/brooklyn/entity/basic/Lifecycle.java
+++ b/core/src/main/java/brooklyn/entity/basic/Lifecycle.java
@@ -26,8 +26,6 @@ import java.util.regex.Pattern;
 import brooklyn.config.render.RendererHints;
 import brooklyn.util.flags.TypeCoercions;
 import brooklyn.util.text.StringFunctions;
-import brooklyn.util.time.Duration;
-import brooklyn.util.time.Time;
 
 import com.google.common.base.CaseFormat;
 import com.google.common.base.Function;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2b9063ba/core/src/main/java/brooklyn/event/basic/Sensors.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/basic/Sensors.java b/core/src/main/java/brooklyn/event/basic/Sensors.java
index 26dd964..f21dfbd 100644
--- a/core/src/main/java/brooklyn/event/basic/Sensors.java
+++ b/core/src/main/java/brooklyn/event/basic/Sensors.java
@@ -18,8 +18,17 @@
  */
 package brooklyn.event.basic;
 
+import java.net.URI;
+import java.net.URL;
+
+import brooklyn.config.render.RendererHints;
 import brooklyn.event.AttributeSensor;
+import brooklyn.util.net.UserAndHostAndPort;
+import brooklyn.util.text.StringFunctions;
+import brooklyn.util.time.Duration;
+import brooklyn.util.time.Time;
 
+import com.google.common.net.HostAndPort;
 import com.google.common.reflect.TypeToken;
 
 public class Sensors {
@@ -76,8 +85,8 @@ public class Sensors {
         return newSensor(Boolean.class, name, description);
     }
 
-    // ---- extensions to sensors
-    
+    // Extensions to sensors
+
     public static <T> AttributeSensor<T> newSensorRenamed(String newName, AttributeSensor<T> sensor) {
         return new BasicAttributeSensor<T>(sensor.getTypeToken(), newName, sensor.getDescription());
     }
@@ -86,4 +95,17 @@ public class Sensors {
         return newSensorRenamed(prefix+sensor.getName(), sensor);
     }
 
+    // Display hints for common utility objects
+
+    static {
+        RendererHints.register(Duration.class, RendererHints.displayValue(Time.fromDurationToTimeStringRounded()));
+        RendererHints.register(HostAndPort.class, RendererHints.displayValue(StringFunctions.toStringFunction()));
+        RendererHints.register(UserAndHostAndPort.class, RendererHints.displayValue(StringFunctions.toStringFunction()));
+
+        RendererHints.register(URL.class, RendererHints.displayValue(StringFunctions.toStringFunction()));
+        RendererHints.register(URL.class, RendererHints.openWithUrl(StringFunctions.toStringFunction()));
+        RendererHints.register(URI.class, RendererHints.displayValue(StringFunctions.toStringFunction()));
+        RendererHints.register(URI.class, RendererHints.openWithUrl(StringFunctions.toStringFunction()));
+    }
+
 }


[6/8] git commit: Add logout text next to username and fix issues with logout

Posted by gr...@apache.org.
Add logout text next to username and fix issues with logout


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

Branch: refs/heads/master
Commit: 0793f3b4e46e28f2259aea84779efce452154431
Parents: f904f55
Author: Andrew Kennedy <gr...@apache.org>
Authored: Wed Oct 8 17:45:28 2014 +0100
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Fri Oct 10 15:03:14 2014 +0100

----------------------------------------------------------------------
 usage/jsgui/src/main/webapp/index.html          |  4 +-
 .../BrooklynPropertiesSecurityFilter.java       | 75 ++++++++++++--------
 .../provider/AbstractSecurityProvider.java      |  4 +-
 .../provider/DelegatingSecurityProvider.java    | 15 ++--
 4 files changed, 59 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0793f3b4/usage/jsgui/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/usage/jsgui/src/main/webapp/index.html b/usage/jsgui/src/main/webapp/index.html
index ffc5722..b1436b3 100644
--- a/usage/jsgui/src/main/webapp/index.html
+++ b/usage/jsgui/src/main/webapp/index.html
@@ -44,7 +44,7 @@ under the License.
 
 <div class="navbar navbar-fixed-top">
     <div class="navbar-inner">
-        <div class="userName-top"><a href="/logout"><span id="user"></span></a></div>
+        <div class="userName-top"><span id="user"></span> | <a href="/logout">Log out</a></div>
         <div class="container">
             <a class="logo" href="#" title="Brooklyn, Version 0.7.0-SNAPSHOT"><!-- Logo added via CSS --></a> <!-- BROOKLYN_VERSION -->
             <div class="menubar-top">
@@ -62,7 +62,7 @@ under the License.
                     <li><a href="#v1/help" class="nav1 nav1_help"><b>?</b></a></li>
                 </ul>
             </div>
-		</div>
+        </div>
     </div>
 </div>
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0793f3b4/usage/rest-server/src/main/java/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java b/usage/rest-server/src/main/java/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java
index 0477044..8d9d560 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/filter/BrooklynPropertiesSecurityFilter.java
@@ -19,9 +19,11 @@
 package brooklyn.rest.filter;
 
 import java.io.IOException;
+
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
+import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
@@ -32,8 +34,6 @@ import javax.servlet.http.HttpSession;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.sun.jersey.core.util.Base64;
-
 import brooklyn.config.BrooklynServiceAttributes;
 import brooklyn.management.ManagementContext;
 import brooklyn.management.entitlement.Entitlements;
@@ -41,6 +41,8 @@ import brooklyn.management.entitlement.WebEntitlementContext;
 import brooklyn.rest.security.provider.DelegatingSecurityProvider;
 import brooklyn.util.text.Strings;
 
+import com.sun.jersey.core.util.Base64;
+
 /**
  * Provides basic HTTP authentication.
  */
@@ -61,15 +63,18 @@ public class BrooklynPropertiesSecurityFilter implements Filter {
     public static final String REMOTE_ADDRESS_SESSION_ATTRIBUTE = "request.remoteAddress";
 
     private static final Logger log = LoggerFactory.getLogger(BrooklynPropertiesSecurityFilter.class);
-    
+
     protected DelegatingSecurityProvider provider;
-    
+
     private static ThreadLocal<String> originalRequest = new ThreadLocal<String>();
 
     @Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
         HttpServletRequest httpRequest = (HttpServletRequest) request;
         HttpServletResponse httpResponse = (HttpServletResponse) response;
+        String uri = httpRequest.getRequestURI();
+        String uid = RequestTaggingFilter.getTag();
+        String user = Strings.toString(httpRequest.getSession().getAttribute(AUTHENTICATED_USER_SESSION_ATTRIBUTE));
 
         if (provider == null) {
             log.warn("No security provider available: disallowing web access to brooklyn");
@@ -77,29 +82,42 @@ public class BrooklynPropertiesSecurityFilter implements Filter {
             return;
         }
 
-        if (handleLogout(httpRequest) || !authenticate(httpRequest)) {
+        if (originalRequest.get() != null) {
+            // clear the entitlement context before setting to avoid warnings
+            Entitlements.clearEntitlementContext();
+        } else {
+            originalRequest.set(uri);
+        }
+
+        boolean authenticated = provider.isAuthenticated(httpRequest.getSession());
+        if ("/logout".equals(uri) || "/v1/logout".equals(uri)) {
+            httpResponse.setHeader("WWW-Authenticate", "Basic realm=\"brooklyn\"");
+            if (authenticated && httpRequest.getSession().getAttributeNames().hasMoreElements()) {
+                logout(httpRequest);
+                httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+            } else {
+                RequestDispatcher dispatcher = httpRequest.getRequestDispatcher("/");
+                dispatcher.forward(httpRequest, httpResponse);
+            }
+            return;
+        }
+
+        if (!(httpRequest.getSession().getAttributeNames().hasMoreElements() && provider.isAuthenticated(httpRequest.getSession())) ||
+                "/logout".equals(originalRequest.get())) {
+            authenticated = authenticate(httpRequest);
+        }
+
+        if (!authenticated) {
             httpResponse.setHeader("WWW-Authenticate", "Basic realm=\"brooklyn\"");
             httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
             return;
         }
 
-        String uri = httpRequest.getRequestURI();
-        String uid = RequestTaggingFilter.getTag();
-        String user = Strings.toString(httpRequest.getSession().getAttribute(AUTHENTICATED_USER_SESSION_ATTRIBUTE));
         try {
             WebEntitlementContext entitlementContext = new WebEntitlementContext(user, httpRequest.getRemoteAddr(), uri, uid);
-            if (originalRequest.get() == null) {
-                // initial filter application
-                originalRequest.set(uri);
-            } else {
-                // this filter is being applied *again*, probably due to forwarding (e.g. from '/' to '/index.html')
-                // clear the entitlement context before setting to avoid warnings
-                Entitlements.clearEntitlementContext();
-            }
             Entitlements.setEntitlementContext(entitlementContext);
 
             chain.doFilter(request, response);
-
         } catch (Throwable e) {
             if (!response.isCommitted()) {
                 httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
@@ -108,7 +126,6 @@ public class BrooklynPropertiesSecurityFilter implements Filter {
             originalRequest.remove();
             Entitlements.clearEntitlementContext();
         }
-
     }
 
     protected boolean authenticate(HttpServletRequest request) {
@@ -130,7 +147,7 @@ public class BrooklynPropertiesSecurityFilter implements Filter {
             }
             return true;
         }
-        
+
         return false;
     }
 
@@ -139,22 +156,18 @@ public class BrooklynPropertiesSecurityFilter implements Filter {
         ManagementContext mgmt = (ManagementContext) config.getServletContext().getAttribute(BrooklynServiceAttributes.BROOKLYN_MANAGEMENT_CONTEXT);
         provider = new DelegatingSecurityProvider(mgmt);
     }
-    
+
     @Override
     public void destroy() {
     }
 
-    protected boolean handleLogout(HttpServletRequest request) {
-        if ("/logout".equals(request.getRequestURI()) || "/v1/logout".equals(request.getRequestURI())) {
-            log.info("REST logging {} out of session {}",
-                    request.getSession().getAttribute(AUTHENTICATED_USER_SESSION_ATTRIBUTE), request.getSession().getId());
-            provider.logout(request.getSession());
-            request.getSession().removeAttribute(AUTHENTICATED_USER_SESSION_ATTRIBUTE);
-            request.getSession().removeAttribute(REMOTE_ADDRESS_SESSION_ATTRIBUTE);
-            request.getSession().invalidate();
-            return true;
-        }
-        return false;
+    protected void logout(HttpServletRequest request) {
+        log.info("REST logging {} out of session {}",
+                request.getSession().getAttribute(AUTHENTICATED_USER_SESSION_ATTRIBUTE), request.getSession().getId());
+        provider.logout(request.getSession());
+        request.getSession().removeAttribute(AUTHENTICATED_USER_SESSION_ATTRIBUTE);
+        request.getSession().removeAttribute(REMOTE_ADDRESS_SESSION_ATTRIBUTE);
+        request.getSession().invalidate();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0793f3b4/usage/rest-server/src/main/java/brooklyn/rest/security/provider/AbstractSecurityProvider.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/security/provider/AbstractSecurityProvider.java b/usage/rest-server/src/main/java/brooklyn/rest/security/provider/AbstractSecurityProvider.java
index 90b413f..6fd2f30 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/security/provider/AbstractSecurityProvider.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/security/provider/AbstractSecurityProvider.java
@@ -20,6 +20,8 @@ package brooklyn.rest.security.provider;
 
 import javax.servlet.http.HttpSession;
 
+import brooklyn.util.text.Strings;
+
 /**
  * Provides default implementations of {@link #isAuthenticated(HttpSession)} and
  * {@link #logout(HttpSession)}.
@@ -30,7 +32,7 @@ public abstract class AbstractSecurityProvider implements SecurityProvider {
     public boolean isAuthenticated(HttpSession session) {
         if (session == null) return false;
         Object value = session.getAttribute(getAuthenticationKey());
-        return value != null && Boolean.TRUE.equals(value);
+        return Strings.isNonBlank(Strings.toString(value));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0793f3b4/usage/rest-server/src/main/java/brooklyn/rest/security/provider/DelegatingSecurityProvider.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/security/provider/DelegatingSecurityProvider.java b/usage/rest-server/src/main/java/brooklyn/rest/security/provider/DelegatingSecurityProvider.java
index 567eb13..d14e582 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/security/provider/DelegatingSecurityProvider.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/security/provider/DelegatingSecurityProvider.java
@@ -106,18 +106,19 @@ public class DelegatingSecurityProvider implements SecurityProvider {
 
     @Override
     public boolean isAuthenticated(HttpSession session) {
+        if (session == null) return false;
         Object modCountWhenFirstAuthenticated = session.getAttribute(getModificationCountKey());
         boolean authenticated = getDelegate().isAuthenticated(session) &&
-                modCountWhenFirstAuthenticated != null && ((Long) modCount.get()).equals(modCountWhenFirstAuthenticated);
-        if (authenticated) {
-            session.setAttribute(getModificationCountKey(), modCount.get());
-        }
+                Long.valueOf(modCount.get()).equals(modCountWhenFirstAuthenticated);
         return authenticated;
     }
 
     @Override
     public boolean authenticate(HttpSession session, String user, String password) {
         boolean authenticated = getDelegate().authenticate(session, user, password);
+        if (authenticated) {
+            session.setAttribute(getModificationCountKey(), modCount.get());
+        }
         if (log.isTraceEnabled() && authenticated) {
             log.trace("User {} authenticated with provider {}", user, getDelegate());
         } else if (!authenticated && log.isDebugEnabled()) {
@@ -128,7 +129,11 @@ public class DelegatingSecurityProvider implements SecurityProvider {
 
     @Override
     public boolean logout(HttpSession session) { 
-        return getDelegate().logout(session);
+        boolean logout = getDelegate().logout(session);
+        if (logout) {
+            session.removeAttribute(getModificationCountKey());
+        }
+        return logout;
     }
 
     private String getModificationCountKey() {


[7/8] git commit: Move first member sensors to Group and fix InetAddress rendering

Posted by gr...@apache.org.
Move first member sensors to Group and fix InetAddress rendering


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

Branch: refs/heads/master
Commit: c78f7a5cd75800c311fde0895a6680b9e494662e
Parents: 0793f3b
Author: Andrew Kennedy <gr...@apache.org>
Authored: Fri Oct 10 08:12:51 2014 +0100
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Fri Oct 10 21:37:55 2014 +0100

----------------------------------------------------------------------
 .../main/java/brooklyn/entity/basic/AbstractGroup.java   |  7 ++++++-
 .../java/brooklyn/entity/basic/AbstractGroupImpl.java    | 11 +++++++++++
 .../main/java/brooklyn/entity/group/DynamicCluster.java  |  6 ------
 .../java/brooklyn/entity/group/DynamicClusterImpl.java   |  8 --------
 core/src/main/java/brooklyn/event/basic/Sensors.java     | 10 ++++++++++
 5 files changed, 27 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c78f7a5c/core/src/main/java/brooklyn/entity/basic/AbstractGroup.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/AbstractGroup.java b/core/src/main/java/brooklyn/entity/basic/AbstractGroup.java
index 67e4cf5..ec4ed8b 100644
--- a/core/src/main/java/brooklyn/entity/basic/AbstractGroup.java
+++ b/core/src/main/java/brooklyn/entity/basic/AbstractGroup.java
@@ -32,7 +32,6 @@ import brooklyn.event.basic.Sensors;
 import com.google.common.base.Predicate;
 import com.google.common.reflect.TypeToken;
 
-
 /**
  * Represents a group of entities - sub-classes can support dynamically changing membership, 
  * ad hoc groupings, etc.
@@ -49,6 +48,12 @@ public interface AbstractGroup extends Entity, Group, Changeable {
     AttributeSensor<Collection<Entity>> GROUP_MEMBERS = Sensors.newSensor(
             new TypeToken<Collection<Entity>>() { }, "group.members", "Members of the group");
 
+    AttributeSensor<Boolean> FIRST_MEMBER = Sensors.newBooleanSensor(
+            "cluster.first", "Set on an entity if it is the first member of a cluster");
+
+    AttributeSensor<Entity> FIRST = Sensors.newSensor(Entity.class,
+            "cluster.first.entity", "The first member of the cluster");
+
     ConfigKey<Boolean> MEMBER_DELEGATE_CHILDREN = ConfigKeys.newBooleanConfigKey(
             "group.members.delegate", "Add delegate child entities for members of the group", Boolean.FALSE);
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c78f7a5c/core/src/main/java/brooklyn/entity/basic/AbstractGroupImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/AbstractGroupImpl.java b/core/src/main/java/brooklyn/entity/basic/AbstractGroupImpl.java
index bff6e2c..7da2094 100644
--- a/core/src/main/java/brooklyn/entity/basic/AbstractGroupImpl.java
+++ b/core/src/main/java/brooklyn/entity/basic/AbstractGroupImpl.java
@@ -116,6 +116,17 @@ public abstract class AbstractGroupImpl extends AbstractEntity implements Abstra
                 log.debug("Group {} ignoring new member {}, because it is no longer managed", this, member);
                 return false;
             }
+
+            Entity first = getAttribute(FIRST);
+            if (first == null) {
+                ((EntityLocal) member).setAttribute(FIRST_MEMBER, true);
+                ((EntityLocal) member).setAttribute(FIRST, member);
+                setAttribute(FIRST, member);
+            } else {
+                ((EntityLocal) member).setAttribute(FIRST_MEMBER, false);
+                ((EntityLocal) member).setAttribute(FIRST, first);
+            }
+
             member.addGroup((Group)getProxyIfAvailable());
             boolean changed = members.add(member);
             if (changed) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c78f7a5c/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
index bf46ebb..764704e 100644
--- a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
+++ b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
@@ -169,12 +169,6 @@ public interface DynamicCluster extends AbstractGroup, Cluster, MemberReplaceabl
     AttributeSensor<Boolean> CLUSTER_MEMBER = Sensors.newBooleanSensor(
             "cluster.member", "Set on an entity if it is a member of a cluster");
 
-    AttributeSensor<Boolean> FIRST_MEMBER = Sensors.newBooleanSensor(
-            "cluster.first", "Set on an entity if it is the first member of a cluster");
-
-    AttributeSensor<Entity> FIRST = Sensors.newSensor(Entity.class,
-            "cluster.first.entity", "The first member of the cluster");
-
     AttributeSensor<Entity> CLUSTER = Sensors.newSensor(Entity.class,
             "cluster.entity", "The cluster an entity is a member of");
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c78f7a5c/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java b/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java
index 9940d6e..9cf8170 100644
--- a/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java
+++ b/core/src/main/java/brooklyn/entity/group/DynamicClusterImpl.java
@@ -741,14 +741,6 @@ public class DynamicClusterImpl extends AbstractGroupImpl implements DynamicClus
 
         ((EntityLocal) entity).setAttribute(CLUSTER_MEMBER, true);
         ((EntityLocal) entity).setAttribute(CLUSTER, this);
-        synchronized (this) {
-            if (getAttribute(FIRST) == null) {
-                setAttribute(FIRST, entity);
-                ((EntityLocal) entity).setAttribute(FIRST_MEMBER, true);
-            } else {
-                ((EntityLocal) entity).setAttribute(FIRST_MEMBER, false);
-            }
-        }
 
         Entities.manage(entity);
         addMember(entity);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c78f7a5c/core/src/main/java/brooklyn/event/basic/Sensors.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/basic/Sensors.java b/core/src/main/java/brooklyn/event/basic/Sensors.java
index f21dfbd..ac22e2c 100644
--- a/core/src/main/java/brooklyn/event/basic/Sensors.java
+++ b/core/src/main/java/brooklyn/event/basic/Sensors.java
@@ -18,9 +18,12 @@
  */
 package brooklyn.event.basic;
 
+import java.net.InetAddress;
 import java.net.URI;
 import java.net.URL;
 
+import javax.annotation.Nullable;
+
 import brooklyn.config.render.RendererHints;
 import brooklyn.event.AttributeSensor;
 import brooklyn.util.net.UserAndHostAndPort;
@@ -28,6 +31,7 @@ import brooklyn.util.text.StringFunctions;
 import brooklyn.util.time.Duration;
 import brooklyn.util.time.Time;
 
+import com.google.common.base.Function;
 import com.google.common.net.HostAndPort;
 import com.google.common.reflect.TypeToken;
 
@@ -101,6 +105,12 @@ public class Sensors {
         RendererHints.register(Duration.class, RendererHints.displayValue(Time.fromDurationToTimeStringRounded()));
         RendererHints.register(HostAndPort.class, RendererHints.displayValue(StringFunctions.toStringFunction()));
         RendererHints.register(UserAndHostAndPort.class, RendererHints.displayValue(StringFunctions.toStringFunction()));
+        RendererHints.register(InetAddress.class, RendererHints.displayValue(new Function<InetAddress,String>() {
+            @Override
+            public String apply(@Nullable InetAddress input) {
+                return input == null ? null : input.getHostAddress();
+            }
+        }));
 
         RendererHints.register(URL.class, RendererHints.displayValue(StringFunctions.toStringFunction()));
         RendererHints.register(URL.class, RendererHints.openWithUrl(StringFunctions.toStringFunction()));


[3/8] git commit: Use URI or String as attribute source for HTTP latency enricher

Posted by gr...@apache.org.
Use URI or String as attribute source for HTTP latency enricher


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

Branch: refs/heads/master
Commit: 4bf13981144c538904c8084a40658dfc7f1e2d6a
Parents: 2b9063b
Author: Andrew Kennedy <gr...@apache.org>
Authored: Wed Oct 8 16:43:03 2014 +0100
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Fri Oct 10 14:04:01 2014 +0100

----------------------------------------------------------------------
 .../brooklyn/enricher/HttpLatencyDetector.java  | 43 ++++++++++++--------
 1 file changed, 25 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4bf13981/policy/src/main/java/brooklyn/enricher/HttpLatencyDetector.java
----------------------------------------------------------------------
diff --git a/policy/src/main/java/brooklyn/enricher/HttpLatencyDetector.java b/policy/src/main/java/brooklyn/enricher/HttpLatencyDetector.java
index db6c899..5fa6718 100644
--- a/policy/src/main/java/brooklyn/enricher/HttpLatencyDetector.java
+++ b/policy/src/main/java/brooklyn/enricher/HttpLatencyDetector.java
@@ -20,6 +20,7 @@ package brooklyn.enricher;
 
 import static com.google.common.base.Preconditions.checkState;
 
+import java.net.URI;
 import java.net.URL;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -29,7 +30,6 @@ import java.util.concurrent.atomic.AtomicReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.catalog.Catalog;
 import brooklyn.config.ConfigKey;
 import brooklyn.enricher.basic.AbstractEnricher;
 import brooklyn.entity.Entity;
@@ -73,11 +73,11 @@ public class HttpLatencyDetector extends AbstractEnricher {
     public static final Duration LATENCY_WINDOW_DEFAULT_PERIOD = Duration.TEN_SECONDS;
 
     @SetFromFlag("url")
-    public static final ConfigKey<String> URL = ConfigKeys.newStringConfigKey("latencyDetector.url");
+    public static final ConfigKey<?> URL = ConfigKeys.newStringConfigKey("latencyDetector.url");
     
     @SuppressWarnings("serial")
     @SetFromFlag("urlSensor")
-    public static final ConfigKey<AttributeSensor<String>> URL_SENSOR = ConfigKeys.newConfigKey(new TypeToken<AttributeSensor<String>>() {}, "latencyDetector.urlSensor");
+    public static final ConfigKey<AttributeSensor<?>> URL_SENSOR = ConfigKeys.newConfigKey(new TypeToken<AttributeSensor<?>>() {}, "latencyDetector.urlSensor");
 
     @SuppressWarnings("serial")
     @SetFromFlag("urlPostProcessing")
@@ -132,9 +132,12 @@ public class HttpLatencyDetector extends AbstractEnricher {
                 "Must set exactly one of url or urlSensor: url=%s; urlSensor=%s", getConfig(URL), getConfig(URL_SENSOR));
         checkState(getConfig(URL_SENSOR) != null || getConfig(URL_POST_PROCESSING) == null, 
                 "Must not set urlPostProcessing without urlSensor");
-        
-        url.set(getConfig(URL));
-        
+
+        Object configValue = getConfig(URL);
+        if (configValue != null) {
+            url.set(configValue.toString());
+        }
+
         httpFeed = HttpFeed.builder()
                 .entity(entity)
                 .period(getConfig(PERIOD))
@@ -144,7 +147,7 @@ public class HttpLatencyDetector extends AbstractEnricher {
                         .setOnException(null))
                 .suspended()
                 .build();
-        
+
         if (getUniqueTag()==null) 
             uniqueTag = JavaClassNames.simpleClassName(getClass())+":"+
                 (getConfig(URL)!=null ? getConfig(URL) : getConfig(URL_SENSOR));
@@ -161,21 +164,21 @@ public class HttpLatencyDetector extends AbstractEnricher {
                     }
                 }
             });
-            
+
             // TODO would be good if subscription gave us the current value, rather than risking a race with code like this.
             Boolean currentVal = entity.getAttribute(Startable.SERVICE_UP);
             if (currentVal != null) {
                 AtomicReferences.setIfDifferent(serviceUp, currentVal);
             }
         }
-        
-        AttributeSensor<String> urlSensor = getConfig(URL_SENSOR);
+
+        AttributeSensor<?> urlSensor = getConfig(URL_SENSOR);
         if (urlSensor!=null) {
-            subscribe(entity, urlSensor, new SensorEventListener<String>() {
+            subscribe(entity, urlSensor, new SensorEventListener<Object>() {
                 @Override
-                public void onEvent(SensorEvent<String> event) {
+                public void onEvent(SensorEvent<Object> event) {
                     Function<String, String> postProcessor = getConfig(URL_POST_PROCESSING);
-                    String val = event.getValue();
+                    String val = event.getValue().toString();
                     String newVal = (postProcessor != null) ? postProcessor.apply(val) : val;
                     if (AtomicReferences.setIfDifferent(url, newVal)) {
                         log.debug(""+this+" updated on "+event+", "+"enabled="+computeEnablement());
@@ -185,10 +188,10 @@ public class HttpLatencyDetector extends AbstractEnricher {
             });
             
             // TODO would be good if subscription gave us the current value, rather than risking a race with code like this.
-            String currentVal = entity.getAttribute(urlSensor);
+            Object currentVal = entity.getAttribute(urlSensor);
             if (currentVal != null) {
                 Function<String, String> postProcessor = getConfig(URL_POST_PROCESSING);
-                String newVal = (postProcessor != null) ? postProcessor.apply(currentVal) : currentVal;
+                String newVal = (postProcessor != null) ? postProcessor.apply(currentVal.toString()) : currentVal.toString();
                 if (AtomicReferences.setIfDifferent(url, newVal)) {
                     log.debug("{} updated url on initial connectionon, to {}", this, newVal);
                 }
@@ -233,7 +236,7 @@ public class HttpLatencyDetector extends AbstractEnricher {
         boolean requireServiceUp = true;
         Duration period = Duration.ONE_SECOND;
         String url;
-        AttributeSensor<String> urlSensor;
+        AttributeSensor<?> urlSensor;
         Function<String, String> urlPostProcessing;
         Duration rollupWindowSize = LATENCY_WINDOW_DEFAULT_PERIOD;
         
@@ -265,14 +268,18 @@ public class HttpLatencyDetector extends AbstractEnricher {
         public Builder url(URL url) {
             return url(url.toString());
         }
+        /** @see #url(String) */
+        public Builder url(URI uri) {
+            return url(uri.toString());
+        }
         /** supplies a sensor which indicates the URL this should parse (e.g. ROOT_URL) */
-        public Builder url(AttributeSensor<String> sensor) {
+        public Builder url(AttributeSensor<?> sensor) {
             this.urlSensor = sensor;
             return this;
         }
         /** supplies a sensor which indicates the URL which this should parse (e.g. ROOT_URL),
          * with post-processing, e.g. {@link StringFunctions#append(String)} */
-        public Builder url(AttributeSensor<String> sensor, Function<String, String> postProcessing) {
+        public Builder url(AttributeSensor<?> sensor, Function<String, String> postProcessing) {
             this.urlSensor = sensor;
             this.urlPostProcessing = postProcessing;
             return this;


[8/8] git commit: This closes #225

Posted by gr...@apache.org.
This closes #225

* github/pr/225:
  Move first member sensors to Group and fix InetAddress rendering
  Add logout text next to username and fix issues with logout
  Merge all CLI commands into single brooklyn script
  Use URI or String as attribute source for HTTP latency enricher
  Move renderer hint initialisation where its more likely to be executed
  Update distribution archive and add new item lister script
  Added logout link to username in console


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

Branch: refs/heads/master
Commit: ad435aab4eafabacc508f0dd045b840b127d3db2
Parents: a81c53d c78f7a5
Author: Andrew Kennedy <gr...@apache.org>
Authored: Sun Oct 12 01:10:56 2014 +0100
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Sun Oct 12 01:10:56 2014 +0100

----------------------------------------------------------------------
 .../brooklyn/basic/BasicConfigurableObject.java |   5 +-
 .../api/HasBrooklynManagementContext.java       |   2 +-
 .../brooklyn/config/render/RendererHints.java   |  34 ++-
 .../brooklyn/entity/basic/AbstractGroup.java    |   7 +-
 .../entity/basic/AbstractGroupImpl.java         |  11 +
 .../java/brooklyn/entity/basic/Attributes.java  |   4 +-
 .../java/brooklyn/entity/basic/Lifecycle.java   |   2 -
 .../brooklyn/entity/group/DynamicCluster.java   |   6 -
 .../entity/group/DynamicClusterImpl.java        |   8 -
 .../main/java/brooklyn/event/basic/Sensors.java |  36 ++-
 .../brooklyn/enricher/HttpLatencyDetector.java  |  43 ++--
 .../main/java/brooklyn/cli/CloudExplorer.java   |  49 +---
 .../src/main/java/brooklyn/cli/ItemLister.java  | 237 ++++++++++++++++++
 usage/cli/src/main/java/brooklyn/cli/Main.java  |  31 +++
 .../brooklyn/cli/itemlister/ItemLister.java     | 247 -------------------
 .../brooklyn/cli/CloudExplorerLiveTest.java     |  25 +-
 .../main/config/build-distribution-archive.xml  |  23 +-
 .../src/main/config/build-distribution-dir.xml  |  24 +-
 usage/dist/src/main/dist/bin/brooklyn           |   2 +-
 usage/dist/src/main/dist/bin/cloud-explorer     |  47 ----
 usage/jsgui/src/main/webapp/index.html          |   4 +-
 .../BrooklynPropertiesSecurityFilter.java       |  75 +++---
 .../provider/AbstractSecurityProvider.java      |   4 +-
 .../provider/DelegatingSecurityProvider.java    |  15 +-
 24 files changed, 455 insertions(+), 486 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ad435aab/core/src/main/java/brooklyn/config/render/RendererHints.java
----------------------------------------------------------------------