Adds prepare method and ARCHIVE_DIRECTORY_NAME_FORMAT and tidies up interfaces


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

Branch: refs/heads/master
Commit: 3352bfab0787e4ec4f6fcb27a2f4f4cc124df768
Parents: cbb58b9
Author: Andrew Donald Kennedy <andrew.kenn...@cloudsoftcorp.com>
Authored: Thu Mar 3 16:35:17 2016 +0000
Committer: Andrew Donald Kennedy <andrew.kenn...@cloudsoftcorp.com>
Committed: Tue Mar 8 10:37:30 2016 -0500

----------------------------------------------------------------------
 .../entity/database/crate/CrateNode.java        |   3 +
 .../database/crate/CrateNodeSshDriver.java      |  16 +--
 .../database/mariadb/MariaDbSshDriver.java      |   2 +-
 .../entity/database/mysql/MySqlSshDriver.java   |  11 +-
 .../entity/database/rubyrep/RubyRepNode.java    |   3 +
 .../database/rubyrep/RubyRepSshDriver.java      |  16 +--
 .../messaging/activemq/ActiveMQBroker.java      |   3 +
 .../messaging/activemq/ActiveMQSshDriver.java   |  11 +-
 .../kafka/AbstractfKafkaSshDriver.java          |  12 +--
 .../brooklyn/entity/messaging/kafka/Kafka.java  |   3 +
 .../entity/messaging/qpid/QpidBroker.java       |  43 ++++----
 .../entity/messaging/qpid/QpidSshDriver.java    |  12 +--
 .../entity/messaging/rabbit/RabbitBroker.java   |  35 +++----
 .../messaging/rabbit/RabbitSshDriver.java       |   6 --
 .../brooklyn/entity/messaging/storm/Storm.java  |  21 ++--
 .../entity/messaging/storm/StormSshDriver.java  |   6 --
 .../entity/zookeeper/ZooKeeperNode.java         |  33 +++---
 .../entity/zookeeper/ZooKeeperSshDriver.java    |   8 +-
 .../entity/monitoring/monit/MonitNode.java      |  26 ++---
 .../entity/monitoring/monit/MonitSshDriver.java |  14 +--
 .../entity/nosql/cassandra/CassandraNode.java   |  43 ++++----
 .../nosql/cassandra/CassandraNodeSshDriver.java |  10 --
 .../nosql/couchbase/CouchbaseNodeSshDriver.java |  37 ++++---
 .../nosql/elasticsearch/ElasticSearchNode.java  |  14 ++-
 .../ElasticSearchNodeSshDriver.java             |  13 +--
 .../nosql/hazelcast/HazelcastNodeSshDriver.java |   5 -
 .../nosql/mongodb/AbstractMongoDBSshDriver.java |  25 ++---
 .../brooklyn/entity/nosql/redis/RedisStore.java |  11 +-
 .../entity/nosql/redis/RedisStoreSshDriver.java |   6 --
 .../brooklyn/entity/nosql/riak/RiakNode.java    |   3 +
 .../entity/nosql/riak/RiakNodeSshDriver.java    |   5 +-
 .../brooklyn/entity/nosql/solr/SolrServer.java  |  17 ++--
 .../entity/nosql/solr/SolrServerSshDriver.java  |   6 --
 .../entity/osgi/karaf/KarafContainer.java       | 100 +++++++++----------
 .../entity/osgi/karaf/KarafSshDriver.java       |   6 --
 .../entity/proxy/nginx/NginxController.java     |  36 ++++---
 .../entity/proxy/nginx/NginxSshDriver.java      |   6 --
 .../entity/webapp/jboss/JBoss6Server.java       |  22 ++--
 .../entity/webapp/jboss/JBoss6SshDriver.java    |   7 --
 .../entity/webapp/jboss/JBoss7Server.java       |  33 +++---
 .../entity/webapp/jboss/JBoss7SshDriver.java    |   2 +-
 .../entity/webapp/jetty/Jetty6Server.java       |   9 +-
 .../entity/webapp/jetty/Jetty6SshDriver.java    |   7 --
 .../webapp/nodejs/NodeJsWebAppService.java      |  10 +-
 .../webapp/nodejs/NodeJsWebAppSshDriver.java    |  22 ++--
 .../entity/webapp/tomcat/Tomcat8Server.java     |   9 +-
 .../entity/webapp/tomcat/TomcatServer.java      |  13 ++-
 .../entity/webapp/tomcat/TomcatSshDriver.java   |  11 +-
 48 files changed, 337 insertions(+), 435 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNode.java
----------------------------------------------------------------------
diff --git 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNode.java
 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNode.java
index f22381a..5c38035 100644
--- 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNode.java
+++ 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNode.java
@@ -42,6 +42,9 @@ public interface CrateNode extends SoftwareProcess, 
UsesJava,UsesJmx, UsesJavaMX
     ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION,
             "0.45.7");
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "crate-%s");
+
     @SetFromFlag("downloadUrl")
     AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = new 
BasicAttributeSensorAndConfigKey.StringAttributeSensorAndConfigKey(
             Attributes.DOWNLOAD_URL,

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNodeSshDriver.java
 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNodeSshDriver.java
index f972570..768ebd3 100644
--- 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNodeSshDriver.java
+++ 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/crate/CrateNodeSshDriver.java
@@ -18,20 +18,15 @@
  */
 package org.apache.brooklyn.entity.database.crate;
 
-import static java.lang.String.format;
-
 import java.util.List;
 
-import org.apache.brooklyn.api.entity.EntityLocal;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.entity.java.JavaSoftwareProcessSshDriver;
-
 import com.google.common.collect.ImmutableList;
 
+import org.apache.brooklyn.api.entity.EntityLocal;
+import org.apache.brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.net.Urls;
-import org.apache.brooklyn.util.os.Os;
 import org.apache.brooklyn.util.ssh.BashCommands;
 
 public class CrateNodeSshDriver extends JavaSoftwareProcessSshDriver {
@@ -41,13 +36,6 @@ public class CrateNodeSshDriver extends 
JavaSoftwareProcessSshDriver {
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(),
-                resolver.getUnpackedDirectoryName(format("crate-%s", 
getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/database/src/main/java/org/apache/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
index dedba55..9ef298c 100644
--- 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
+++ 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
@@ -110,7 +110,7 @@ public class MariaDbSshDriver extends 
AbstractSoftwareProcessSshDriver implement
     }
 
     @Override
-    public void preInstall() {
+    public void prepare() {
         resolver = Entities.newDownloader(this, ImmutableMap.of("filename", 
getInstallFilename()));
         setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("mariadb-%s-%s", getVersion(), 
getOsTag()))));
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/database/src/main/java/org/apache/brooklyn/entity/database/mysql/MySqlSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/mysql/MySqlSshDriver.java
 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/mysql/MySqlSshDriver.java
index 868d158..0697d2a 100644
--- 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/mysql/MySqlSshDriver.java
+++ 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/mysql/MySqlSshDriver.java
@@ -33,6 +33,11 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableMap;
+
 import org.apache.brooklyn.api.location.OsDetails;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.core.effector.EffectorTasks;
@@ -59,10 +64,6 @@ import org.apache.brooklyn.util.text.Identifiers;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.CountdownTimer;
 import org.apache.brooklyn.util.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.ImmutableMap;
 
 /**
  * The SSH implementation of the {@link MySqlDriver}.
@@ -121,7 +122,7 @@ public class MySqlSshDriver extends 
AbstractSoftwareProcessSshDriver implements
     }
 
     @Override
-    public void preInstall() {
+    public void prepare() {
         resolver = Entities.newDownloader(this);
         String unpackedDirectoryName = 
resolver.getUnpackedDirectoryName(getDefaultUnpackedDirectoryName());
         setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
unpackedDirectoryName));

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepNode.java
----------------------------------------------------------------------
diff --git 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepNode.java
 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepNode.java
index e6580bb..cb05ff6 100644
--- 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepNode.java
+++ 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepNode.java
@@ -39,6 +39,9 @@ public interface RubyRepNode extends SoftwareProcess {
     @SetFromFlag("version")
     ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "1.2.0");
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "rubyrep-%s");
+
     @SetFromFlag("downloadUrl")
     public static final BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL 
= new StringAttributeSensorAndConfigKey(
             Attributes.DOWNLOAD_URL, 
"http://files.rubyforge.vm.bytemark.co.uk/rubyrep/rubyrep-${version}.zip";);

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
index 4d0a9ef..2a88b43 100644
--- 
a/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
+++ 
b/software/database/src/main/java/org/apache/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
@@ -25,20 +25,20 @@ import java.net.URISyntaxException;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableList;
+
 import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.core.entity.Attributes;
-import org.apache.brooklyn.core.entity.Entities;
 import 
org.apache.brooklyn.entity.software.base.AbstractSoftwareProcessSshDriver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.os.Os;
 import org.apache.brooklyn.util.ssh.BashCommands;
 import org.apache.brooklyn.util.stream.Streams;
 
-import com.google.common.collect.ImmutableList;
-
 public class RubyRepSshDriver extends AbstractSoftwareProcessSshDriver 
implements RubyRepDriver {
 
     public static final Logger log = 
LoggerFactory.getLogger(RubyRepSshDriver.class);
@@ -54,12 +54,6 @@ public class RubyRepSshDriver extends 
AbstractSoftwareProcessSshDriver implement
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("rubyrep-%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQBroker.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQBroker.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQBroker.java
index aa79613..d9110f7 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQBroker.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQBroker.java
@@ -47,6 +47,9 @@ public interface ActiveMQBroker extends SoftwareProcess, 
MessageBroker, UsesJmx,
     @SetFromFlag("version")
     public static final ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "5.10.2");
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "apache-activemq-%s");
+
     @SetFromFlag("downloadUrl")
     public static final AttributeSensorAndConfigKey<String,String> 
DOWNLOAD_URL = new StringAttributeSensorAndConfigKey(
             Attributes.DOWNLOAD_URL, 
"${driver.mirrorUrl}/${version}/apache-activemq-${version}-bin.tar.gz");

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
index 65b67b6..4b9a35a 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
@@ -24,7 +24,8 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.brooklyn.core.entity.Entities;
+import com.google.common.collect.ImmutableMap;
+
 import org.apache.brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
@@ -32,8 +33,6 @@ import org.apache.brooklyn.util.net.Networking;
 import org.apache.brooklyn.util.os.Os;
 import org.apache.brooklyn.util.ssh.BashCommands;
 
-import com.google.common.collect.ImmutableMap;
-
 public class ActiveMQSshDriver extends JavaSoftwareProcessSshDriver implements 
ActiveMQDriver {
 
     public ActiveMQSshDriver(ActiveMQBrokerImpl entity, SshMachineLocation 
machine) {
@@ -68,12 +67,6 @@ public class ActiveMQSshDriver extends 
JavaSoftwareProcessSshDriver implements A
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("apache-activemq-%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
index 2e6ec43..a2e5ce4 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
@@ -24,12 +24,12 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.entity.java.JavaSoftwareProcessSshDriver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.net.Networking;
@@ -61,12 +61,6 @@ public abstract class AbstractfKafkaSshDriver extends 
JavaSoftwareProcessSshDriv
     protected String getLogFileLocation() { return Os.mergePaths(getRunDir(), 
"console.out"); }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("kafka_%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/Kafka.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/Kafka.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/Kafka.java
index 6a2322c..575ccae 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/Kafka.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/kafka/Kafka.java
@@ -41,4 +41,7 @@ public interface Kafka {
 //    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new 
BasicAttributeSensorAndConfigKey<String>(
 //            Attributes.DOWNLOAD_URL, 
"http://mirror.catn.com/pub/apache/kafka/${version}/kafka-${version}-src.tgz";);
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "kafka_%s");
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidBroker.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidBroker.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidBroker.java
index 89189f7..7a3c9ae 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidBroker.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidBroker.java
@@ -18,15 +18,11 @@
  */
 package org.apache.brooklyn.entity.messaging.qpid;
 
-import java.util.Map;
-
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.entity.Attributes;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
 import org.apache.brooklyn.entity.java.UsesJmx;
 import org.apache.brooklyn.entity.messaging.MessageBroker;
@@ -44,35 +40,30 @@ public interface QpidBroker extends SoftwareProcess, 
MessageBroker, UsesJmx, Amq
 
     /* Qpid runtime file locations for convenience. */
 
-    public static final String CONFIG_XML = "etc/config.xml";
-    public static final String VIRTUALHOSTS_XML = "etc/virtualhosts.xml";
-    public static final String PASSWD = "etc/passwd";
+    String CONFIG_XML = "etc/config.xml";
+    String VIRTUALHOSTS_XML = "etc/virtualhosts.xml";
+    String PASSWD = "etc/passwd";
 
     @SetFromFlag("version")
-    public static final ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "0.20");
-    
-    @SetFromFlag("downloadUrl")
-    public static final BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL 
= new BasicAttributeSensorAndConfigKey<String>(
-            Attributes.DOWNLOAD_URL, 
"http://download.nextag.com/apache/qpid/${version}/qpid-java-broker-${version}.tar.gz";);
+    ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "0.20");
 
-    @SetFromFlag("amqpPort")
-    public static final PortAttributeSensorAndConfigKey AMQP_PORT = 
AmqpServer.AMQP_PORT;
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "qpid-broker-%s");
 
-    @SetFromFlag("virtualHost")
-    public static final BasicAttributeSensorAndConfigKey<String> 
VIRTUAL_HOST_NAME = AmqpServer.VIRTUAL_HOST_NAME;
+    @SetFromFlag("downloadUrl")
+    AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = 
ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
+            
"http://download.nextag.com/apache/qpid/${version}/qpid-java-broker-${version}.tar.gz";);
 
     @SetFromFlag("amqpVersion")
-    public static final BasicAttributeSensorAndConfigKey<String> AMQP_VERSION 
= new BasicAttributeSensorAndConfigKey<String>(
-            AmqpServer.AMQP_VERSION, AmqpServer.AMQP_0_10);
-    
+    AttributeSensorAndConfigKey<String, String> AMQP_VERSION = 
ConfigKeys.newSensorAndConfigKeyWithDefault(AmqpServer.AMQP_VERSION, 
AmqpServer.AMQP_0_10);
+
     @SetFromFlag("httpManagementPort")
-    public static final PortAttributeSensorAndConfigKey HTTP_MANAGEMENT_PORT = 
new PortAttributeSensorAndConfigKey("qpid.http-management.port", "Qpid HTTP 
management plugin port");
+    PortAttributeSensorAndConfigKey HTTP_MANAGEMENT_PORT = 
ConfigKeys.newPortSensorAndConfigKey(
+            "qpid.http-management.port", "Qpid HTTP management plugin port");
 
     @SetFromFlag("jmxUser")
-    public static final BasicAttributeSensorAndConfigKey<String> JMX_USER = 
new BasicAttributeSensorAndConfigKey<String>(
-            UsesJmx.JMX_USER, "admin");
-    
+    AttributeSensorAndConfigKey<String, String> JMX_USER = 
ConfigKeys.newSensorAndConfigKeyWithDefault(UsesJmx.JMX_USER, "admin");
+
     @SetFromFlag("jmxPassword")
-    public static final BasicAttributeSensorAndConfigKey<String> JMX_PASSWORD 
= new BasicAttributeSensorAndConfigKey<String>(
-            UsesJmx.JMX_PASSWORD, "admin");
+    AttributeSensorAndConfigKey<String, String> JMX_PASSWORD = 
ConfigKeys.newSensorAndConfigKeyWithDefault(UsesJmx.JMX_PASSWORD, "admin");
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidSshDriver.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidSshDriver.java
index 3d1bc8f..b24e650 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidSshDriver.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/qpid/QpidSshDriver.java
@@ -26,7 +26,9 @@ import java.util.Map;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.core.entity.Entities;
+
+import com.google.common.collect.ImmutableMap;
+
 import org.apache.brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
@@ -34,8 +36,6 @@ import org.apache.brooklyn.util.net.Networking;
 import org.apache.brooklyn.util.os.Os;
 import org.apache.brooklyn.util.ssh.BashCommands;
 
-import com.google.common.collect.ImmutableMap;
-
 public class QpidSshDriver extends JavaSoftwareProcessSshDriver implements 
QpidDriver{
 
     private static final Logger log = 
LoggerFactory.getLogger(QpidSshDriver.class);
@@ -56,12 +56,6 @@ public class QpidSshDriver extends 
JavaSoftwareProcessSshDriver implements QpidD
     public Integer getHttpManagementPort() { return 
entity.getAttribute(QpidBroker.HTTP_MANAGEMENT_PORT); }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("qpid-broker-%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitBroker.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitBroker.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitBroker.java
index 874bed8..a1a977b 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitBroker.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitBroker.java
@@ -26,9 +26,8 @@ import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.entity.messaging.MessageBroker;
@@ -44,17 +43,20 @@ import org.apache.brooklyn.util.core.flags.SetFromFlag;
 public interface RabbitBroker extends SoftwareProcess, MessageBroker, 
AmqpServer {
 
     @SetFromFlag("version")
-    public static final ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "3.6.0");
+    ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "3.6.0");
+
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "rabbitmq_server-%s");
 
     @SetFromFlag("downloadUrl")
-    public static final BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL 
= new BasicAttributeSensorAndConfigKey<String>(
-            SoftwareProcess.DOWNLOAD_URL, 
"http://www.rabbitmq.com/releases/rabbitmq-server/v${version}/rabbitmq-server-generic-unix-${version}.tar.xz";);
-    
+    AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = 
ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
+            
"http://www.rabbitmq.com/releases/rabbitmq-server/v${version}/rabbitmq-server-generic-unix-${version}.tar.xz";);
+
     @SetFromFlag("erlangVersion")
-    public static final BasicConfigKey<String> ERLANG_VERSION = new 
BasicConfigKey<String>(String.class, "erlang.version", "Erlang runtime 
version", "18.2");
+    ConfigKey<String> ERLANG_VERSION = 
ConfigKeys.newStringConfigKey("erlang.version", "Erlang runtime version", 
"18.2");
 
     @SetFromFlag("erlangDebRepoUrl")
-    public static final BasicConfigKey<String> ERLANG_DEB_REPO_URL = new 
BasicConfigKey<String>(String.class, "erlang.deb.repo.url", 
+    ConfigKey<String> ERLANG_DEB_REPO_URL = 
ConfigKeys.newStringConfigKey("erlang.deb.repo.url", 
             "Deb file used to configure an external Erlang repository which 
provides up to date packages for Ubuntu/Debian", 
             
"http://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb";);
 
@@ -63,25 +65,18 @@ public interface RabbitBroker extends SoftwareProcess, 
MessageBroker, AmqpServer
             "rabbitmq.templateUrl", "Template file (in freemarker format) for 
the rabbitmq.config config file",
             
"classpath://org/apache/brooklyn/entity/messaging/rabbit/rabbitmq.config");
 
-    @SetFromFlag("amqpPort")
-    public static final PortAttributeSensorAndConfigKey AMQP_PORT = 
AmqpServer.AMQP_PORT;
-
-    @SetFromFlag("virtualHost")
-    public static final BasicAttributeSensorAndConfigKey<String> 
VIRTUAL_HOST_NAME = AmqpServer.VIRTUAL_HOST_NAME;
-
     @SetFromFlag("amqpVersion")
-    public static final BasicAttributeSensorAndConfigKey<String> AMQP_VERSION 
= new BasicAttributeSensorAndConfigKey<String>(
-            AmqpServer.AMQP_VERSION, AmqpServer.AMQP_0_9_1);
+    AttributeSensorAndConfigKey<String, String> AMQP_VERSION = 
ConfigKeys.newSensorAndConfigKeyWithDefault(AmqpServer.AMQP_VERSION, 
AmqpServer.AMQP_0_9_1);
 
     @SetFromFlag("managmentPort")
-    public static final PortAttributeSensorAndConfigKey MANAGEMENT_PORT = new 
PortAttributeSensorAndConfigKey(
+    PortAttributeSensorAndConfigKey MANAGEMENT_PORT = 
ConfigKeys.newPortSensorAndConfigKey(
             "rabbitmq.management.port", "Port on which management interface 
will be available", "15672+");
 
-    public static AttributeSensor<String> MANAGEMENT_URL = 
Sensors.newStringSensor(
+    AttributeSensor<String> MANAGEMENT_URL = Sensors.newStringSensor(
             "rabbitmq.management.url", "Management URL is only available if 
management plugin flag is true");
 
     @SetFromFlag("enableManagementPlugin")
-    public static final ConfigKey<Boolean> ENABLE_MANAGEMENT_PLUGIN = 
ConfigKeys.newBooleanConfigKey(
+    ConfigKey<Boolean> ENABLE_MANAGEMENT_PLUGIN = 
ConfigKeys.newBooleanConfigKey(
             "rabbitmq.management.plugin", "Management plugin will be enabled", 
false);
 
     RabbitQueue createQueue(Map properties);
@@ -89,7 +84,7 @@ public interface RabbitBroker extends SoftwareProcess, 
MessageBroker, AmqpServer
     // TODO required by RabbitDestination due to close-coupling between that 
and RabbitBroker; how best to improve?
     @Beta
     Map<String, String> getShellEnvironment();
-    
+
     @Beta
     String getRunDir();
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
index ad04d55..5e76991 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
@@ -72,12 +72,6 @@ public class RabbitSshDriver extends 
AbstractSoftwareProcessSshDriver implements
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("rabbitmq_server-%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/Storm.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/Storm.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/Storm.java
index 9b927cd..14c1419 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/Storm.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/Storm.java
@@ -25,7 +25,7 @@ import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.config.render.RendererHints;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.entity.java.UsesJmx;
@@ -45,15 +45,18 @@ public interface Storm extends SoftwareProcess, UsesJmx {
     @SetFromFlag("version")
     ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "0.8.2");
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "storm-%s");
+
     @SetFromFlag("nimbusHostname")
     ConfigKey<String> NIMBUS_HOSTNAME = 
ConfigKeys.newStringConfigKey("storm.nimbus.hostname");
-    
+
     @SetFromFlag("nimbusEntity")
     ConfigKey<Entity> NIMBUS_ENTITY = ConfigKeys.newConfigKey(Entity.class, 
"storm.nimbus.entity");
 
     @SetFromFlag("downloadUrl")
-    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new 
BasicAttributeSensorAndConfigKey<String>(
-            SoftwareProcess.DOWNLOAD_URL, 
"https://dl.dropboxusercontent.com/s/fl4kr7w0oc8ihdw/storm-${version}.zip";);
+    AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = 
ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
+            
"https://dl.dropboxusercontent.com/s/fl4kr7w0oc8ihdw/storm-${version}.zip";);
 
     ConfigKey<Object> START_MUTEX = ConfigKeys.newConfigKey(Object.class, 
"storm.start.mutex");
 
@@ -62,12 +65,12 @@ public interface Storm extends SoftwareProcess, UsesJmx {
 
     @SetFromFlag("localDir")
     ConfigKey<String> LOCAL_DIR = 
ConfigKeys.newStringConfigKey("storm.local.dir", "Setting for Storm local dir");
-    
+
     @SetFromFlag("uiPort")
-    PortAttributeSensorAndConfigKey UI_PORT = new 
PortAttributeSensorAndConfigKey("storm.ui.port", "Storm UI port", "8080+");
+    PortAttributeSensorAndConfigKey UI_PORT = 
ConfigKeys.newPortSensorAndConfigKey("storm.ui.port", "Storm UI port", "8080+");
 
     @SetFromFlag("thriftPort")
-    PortAttributeSensorAndConfigKey THRIFT_PORT = new 
PortAttributeSensorAndConfigKey("storm.thrift.port", "Storm Thrift port", 
"6627");
+    PortAttributeSensorAndConfigKey THRIFT_PORT = 
ConfigKeys.newPortSensorAndConfigKey("storm.thrift.port", "Storm Thrift port", 
"6627");
 
     @SetFromFlag("zookeeperEnsemble")
     ConfigKey<ZooKeeperEnsemble> ZOOKEEPER_ENSEMBLE = 
ConfigKeys.newConfigKey(ZooKeeperEnsemble.class,
@@ -88,11 +91,11 @@ public interface Storm extends SoftwareProcess, UsesJmx {
     String getHostname();
 
     Role getRole();
-    
+
     enum Role { NIMBUS, SUPERVISOR, UI }
 
     AttributeSensor<String> STORM_UI_URL = StormUiUrl.STORM_UI_URL;
-    
+
     class StormUiUrl {
         public static final AttributeSensor<String> STORM_UI_URL = 
Sensors.newStringSensor("storm.ui.url", "URL");
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/StormSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/StormSshDriver.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/StormSshDriver.java
index 66578e6..f06c0bc 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/StormSshDriver.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/messaging/storm/StormSshDriver.java
@@ -118,12 +118,6 @@ public class StormSshDriver extends 
JavaSoftwareProcessSshDriver implements Stor
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("storm-%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperNode.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperNode.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperNode.java
index 18cb6c6..0dce3b7 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperNode.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperNode.java
@@ -23,9 +23,9 @@ import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
+import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.entity.software.base.SoftwareProcess;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 
@@ -39,15 +39,23 @@ public interface ZooKeeperNode extends SoftwareProcess {
 
     @SetFromFlag("version")
     ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "3.4.5");
+
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "zookeeper-%s");
+
+    @SetFromFlag("downloadUrl")
+    AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = 
ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
+            
"http://apache.fastbull.org/zookeeper/zookeeper-${version}/zookeeper-${version}.tar.gz";);
+
     @SetFromFlag("zookeeperPort")
-    PortAttributeSensorAndConfigKey ZOOKEEPER_PORT = new 
PortAttributeSensorAndConfigKey("zookeeper.port", "Zookeeper port", "2181+");
+    PortAttributeSensorAndConfigKey ZOOKEEPER_PORT = 
ConfigKeys.newPortSensorAndConfigKey("zookeeper.port", "Zookeeper port", 
"2181+");
+
     @SetFromFlag("zookeeperLeaderPort")
-    PortAttributeSensorAndConfigKey ZOOKEEPER_LEADER_PORT = new 
PortAttributeSensorAndConfigKey("zookeeper.leader.port", "Zookeeper leader 
ports", "2888+");
+    PortAttributeSensorAndConfigKey ZOOKEEPER_LEADER_PORT = 
ConfigKeys.newPortSensorAndConfigKey("zookeeper.leader.port", "Zookeeper leader 
ports", "2888+");
+
     @SetFromFlag("zookeeperElectionPort")
-    PortAttributeSensorAndConfigKey ZOOKEEPER_ELECTION_PORT = new 
PortAttributeSensorAndConfigKey("zookeeper.election.port", "Zookeeper election 
ports", "3888+");
-    @SetFromFlag("downloadUrl")
-    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new 
BasicAttributeSensorAndConfigKey<String>(
-            SoftwareProcess.DOWNLOAD_URL, 
"http://apache.fastbull.org/zookeeper/zookeeper-${version}/zookeeper-${version}.tar.gz";);
+    PortAttributeSensorAndConfigKey ZOOKEEPER_ELECTION_PORT = 
ConfigKeys.newPortSensorAndConfigKey("zookeeper.election.port", "Zookeeper 
election ports", "3888+");
+
     /**
      * Location of the ZK configuration file template to be copied to the 
server.
      */
@@ -55,10 +63,11 @@ public interface ZooKeeperNode extends SoftwareProcess {
     ConfigKey<String> ZOOKEEPER_CONFIG_TEMPLATE = 
ConfigKeys.newStringConfigKey(
             "zookeeper.configTemplate", "Zookeeper configuration template (in 
freemarker format)",
             
"classpath://org/apache/brooklyn/entity/messaging/zookeeper/zoo.cfg");
-    AttributeSensor<Long> OUTSTANDING_REQUESTS = new 
BasicAttributeSensor<Long>(Long.class, "zookeeper.outstandingRequests", 
"Outstanding request count");
-    AttributeSensor<Long> PACKETS_RECEIVED = new 
BasicAttributeSensor<Long>(Long.class, "zookeeper.packets.received", "Total 
packets received");
-    AttributeSensor<Long> PACKETS_SENT = new 
BasicAttributeSensor<Long>(Long.class, "zookeeper.packets.sent", "Total packets 
sent");
-    AttributeSensor<Integer> MY_ID = new 
BasicAttributeSensor<Integer>(Integer.class, "zookeeper.myid", "ZooKeeper 
node's myId");
+
+    AttributeSensor<Long> OUTSTANDING_REQUESTS = 
Sensors.newLongSensor("zookeeper.outstandingRequests", "Outstanding request 
count");
+    AttributeSensor<Long> PACKETS_RECEIVED = 
Sensors.newLongSensor("zookeeper.packets.received", "Total packets received");
+    AttributeSensor<Long> PACKETS_SENT = 
Sensors.newLongSensor("zookeeper.packets.sent", "Total packets sent");
+    AttributeSensor<Integer> MY_ID = 
Sensors.newIntegerSensor("zookeeper.myid", "ZooKeeper node's myId");
 
     Integer getZookeeperPort();
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
index fd1ba0b..87bf3ff 100644
--- 
a/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
+++ 
b/software/messaging/src/main/java/org/apache/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
@@ -91,13 +91,7 @@ public class ZooKeeperSshDriver extends 
JavaSoftwareProcessSshDriver implements
         newScript(ImmutableMap.of(USE_PID_FILE, getPidFile()), 
STOPPING).execute();     
     }
 
-    @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("zookeeper-%s", getVersion()))));
-    }
-
-    @Override
+   @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitNode.java
----------------------------------------------------------------------
diff --git 
a/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitNode.java
 
b/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitNode.java
index 2e3798c..b74c338 100644
--- 
a/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitNode.java
+++ 
b/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitNode.java
@@ -20,33 +20,35 @@ package org.apache.brooklyn.entity.monitoring.monit;
 
 import java.util.Map;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.reflect.TypeToken;
+
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.api.objs.HasShortName;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.entity.Attributes;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.Sensors;
-import 
org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey.StringAttributeSensorAndConfigKey;
 import org.apache.brooklyn.entity.software.base.SoftwareProcess;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 
-import com.google.common.collect.ImmutableMap;
-import com.google.common.reflect.TypeToken;
-
 @Catalog(name="Monit Node", description="Monit is a free open source utility 
for managing and monitoring, processes, programs, files, directories and 
filesystems on a UNIX system")
 @ImplementedBy(MonitNodeImpl.class)
 public interface MonitNode extends SoftwareProcess, HasShortName {
-    // e.g. https://mmonit.com/monit/dist/binary/5.6/monit-5.6-linux-x64.tar.gz
-    @SetFromFlag("downloadUrl")
-    public static final BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL 
= new StringAttributeSensorAndConfigKey(
-            Attributes.DOWNLOAD_URL, 
"https://mmonit.com/monit/dist/binary/${version}/monit-${version}-${driver.osTag}.tar.gz";);
-    
+
     @SetFromFlag("version")
     public static final ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "5.9");
-    
+
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "monit-%s");
+
+    @SetFromFlag("downloadUrl")
+    AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = 
ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
+            
"https://mmonit.com/monit/dist/binary/${version}/monit-${version}-${driver.osTag}.tar.gz";);
+            // e.g. 
https://mmonit.com/monit/dist/binary/5.6/monit-5.6-linux-x64.tar.gz
+
     @SetFromFlag("controlFileUrl")
     public static final ConfigKey<String> CONTROL_FILE_URL = 
ConfigKeys.newStringConfigKey("monit.control.url", "URL where monit control 
(.monitrc) file can be found", "");
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitSshDriver.java
 
b/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitSshDriver.java
index e89ce90..4803ba0 100644
--- 
a/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitSshDriver.java
+++ 
b/software/monitoring/src/main/java/org/apache/brooklyn/entity/monitoring/monit/MonitSshDriver.java
@@ -23,18 +23,16 @@ import static java.lang.String.format;
 import java.util.List;
 import java.util.Map;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
 import org.apache.brooklyn.api.location.OsDetails;
-import org.apache.brooklyn.core.entity.Entities;
 import 
org.apache.brooklyn.entity.software.base.AbstractSoftwareProcessSshDriver;
 import org.apache.brooklyn.entity.software.base.lifecycle.ScriptHelper;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.os.Os;
 import org.apache.brooklyn.util.ssh.BashCommands;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
 public class MonitSshDriver extends AbstractSoftwareProcessSshDriver 
implements MonitDriver {
     
     private String remoteControlFilePath;
@@ -44,12 +42,6 @@ public class MonitSshDriver extends 
AbstractSoftwareProcessSshDriver implements
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("monit-%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
index fb937ae..daa14d5 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNode.java
@@ -21,16 +21,18 @@ package org.apache.brooklyn.entity.nosql.cassandra;
 import java.math.BigInteger;
 import java.util.Set;
 
+import com.google.common.reflect.TypeToken;
+
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.effector.Effector;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
 import org.apache.brooklyn.core.location.PortRanges;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.Sensors;
@@ -41,8 +43,6 @@ import 
org.apache.brooklyn.entity.software.base.SoftwareProcess;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.apache.brooklyn.util.time.Duration;
 
-import com.google.common.reflect.TypeToken;
-
 /**
  * An {@link org.apache.brooklyn.api.entity.Entity} that represents a 
Cassandra node in a {@link CassandraDatacenter}.
  */
@@ -57,20 +57,23 @@ public interface CassandraNode extends 
DatastoreMixins.DatastoreCommon, Software
     // when this changes remember to put a copy under 
releng2:/var/www/developer/brooklyn/repository/ !
     // TODO experiment with supporting 2.0.x
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "apache-cassandra-%s");
+
     @SetFromFlag("downloadUrl")
-    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new 
BasicAttributeSensorAndConfigKey<String>(
-            SoftwareProcess.DOWNLOAD_URL, 
"${driver.mirrorUrl}/${version}/apache-cassandra-${version}-bin.tar.gz");
+    AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = 
ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
+            
"${driver.mirrorUrl}/${version}/apache-cassandra-${version}-bin.tar.gz");
 
     /** download mirror, if desired */
     @SetFromFlag("mirrorUrl")
-    ConfigKey<String> MIRROR_URL = new BasicConfigKey<String>(String.class, 
"cassandra.install.mirror.url", "URL of mirror", 
+    ConfigKey<String> MIRROR_URL = 
ConfigKeys.newStringConfigKey("cassandra.install.mirror.url", "URL of mirror", 
         "http://www.mirrorservice.org/sites/ftp.apache.org/cassandra";
         // for older versions, but slower:
 //        "http://archive.apache.org/dist/cassandra/";
         );
 
     @SetFromFlag("tgzUrl")
-    ConfigKey<String> TGZ_URL = new BasicConfigKey<String>(String.class, 
"cassandra.install.tgzUrl", "URL of TGZ download file");
+    ConfigKey<String> TGZ_URL = 
ConfigKeys.newStringConfigKey("cassandra.install.tgzUrl", "URL of TGZ download 
file");
 
     @SetFromFlag("clusterName")
     BasicAttributeSensorAndConfigKey<String> CLUSTER_NAME = 
CassandraDatacenter.CLUSTER_NAME;
@@ -79,20 +82,20 @@ public interface CassandraNode extends 
DatastoreMixins.DatastoreCommon, Software
     ConfigKey<String> ENDPOINT_SNITCH_NAME = 
CassandraDatacenter.ENDPOINT_SNITCH_NAME;
 
     @SetFromFlag("gossipPort")
-    PortAttributeSensorAndConfigKey GOSSIP_PORT = new 
PortAttributeSensorAndConfigKey("cassandra.gossip.port", "Cassandra Gossip 
communications port", PortRanges.fromString("7000+"));
+    PortAttributeSensorAndConfigKey GOSSIP_PORT = 
ConfigKeys.newPortSensorAndConfigKey("cassandra.gossip.port", "Cassandra Gossip 
communications port", PortRanges.fromString("7000+"));
 
     @SetFromFlag("sslGgossipPort")
-    PortAttributeSensorAndConfigKey SSL_GOSSIP_PORT = new 
PortAttributeSensorAndConfigKey("cassandra.ssl-gossip.port", "Cassandra Gossip 
SSL communications port", PortRanges.fromString("7001+"));
+    PortAttributeSensorAndConfigKey SSL_GOSSIP_PORT = 
ConfigKeys.newPortSensorAndConfigKey("cassandra.ssl-gossip.port", "Cassandra 
Gossip SSL communications port", PortRanges.fromString("7001+"));
 
     @SetFromFlag("thriftPort")
-    PortAttributeSensorAndConfigKey THRIFT_PORT = new 
PortAttributeSensorAndConfigKey("cassandra.thrift.port", "Cassandra Thrift RPC 
port", PortRanges.fromString("9160+"));
+    PortAttributeSensorAndConfigKey THRIFT_PORT = 
ConfigKeys.newPortSensorAndConfigKey("cassandra.thrift.port", "Cassandra Thrift 
RPC port", PortRanges.fromString("9160+"));
 
     @SetFromFlag("nativePort")
-    PortAttributeSensorAndConfigKey NATIVE_TRANSPORT_PORT = new 
PortAttributeSensorAndConfigKey("cassandra.native.port", "Cassandra Native 
Transport port", PortRanges.fromString("9042+"));
+    PortAttributeSensorAndConfigKey NATIVE_TRANSPORT_PORT = 
ConfigKeys.newPortSensorAndConfigKey("cassandra.native.port", "Cassandra Native 
Transport port", PortRanges.fromString("9042+"));
 
     @SetFromFlag("rmiRegistryPort")
     // cassandra nodetool and others want 7199 - not required, but useful
-    PortAttributeSensorAndConfigKey RMI_REGISTRY_PORT = new 
PortAttributeSensorAndConfigKey(UsesJmx.RMI_REGISTRY_PORT, 
+    PortAttributeSensorAndConfigKey RMI_REGISTRY_PORT = 
ConfigKeys.newPortSensorAndConfigKeyWithDefault(UsesJmx.RMI_REGISTRY_PORT, 
         PortRanges.fromInteger(7199));
 
     // some of the cassandra tooing (eg nodetool) use RMI, but we want JMXMP, 
so do both!
@@ -123,14 +126,12 @@ public interface CassandraNode extends 
DatastoreMixins.DatastoreCommon, Software
             "cassandra.config.rackdc.fileName", "Name for the copied rackdc 
config file (used for configuring replication, when a suitable snitch is 
used)", "cassandra-rackdc.properties");
     
     @SetFromFlag("datacenterName")
-    BasicAttributeSensorAndConfigKey<String> DATACENTER_NAME = new 
BasicAttributeSensorAndConfigKey<String>(
-            String.class, "cassandra.replication.datacenterName", "Datacenter 
name (used for configuring replication, when a suitable snitch is used)", 
-            null);
+    AttributeSensorAndConfigKey<String, String> DATACENTER_NAME = 
ConfigKeys.newStringSensorAndConfigKey(
+            "cassandra.replication.datacenterName", "Datacenter name (used for 
configuring replication, when a suitable snitch is used)");
 
     @SetFromFlag("rackName")
-    BasicAttributeSensorAndConfigKey<String> RACK_NAME = new 
BasicAttributeSensorAndConfigKey<String>(
-            String.class, "cassandra.replication.rackName", "Rack name (used 
for configuring replication, when a suitable snitch is used)", 
-            null);
+    AttributeSensorAndConfigKey<String, String> RACK_NAME = 
ConfigKeys.newStringSensorAndConfigKey(
+            "cassandra.replication.rackName", "Rack name (used for configuring 
replication, when a suitable snitch is used)");
 
     ConfigKey<Integer> NUM_TOKENS_PER_NODE = 
ConfigKeys.newIntegerConfigKey("cassandra.numTokensPerNode",
             "Number of tokens per node; if using vnodes, should set this to a 
value like 256",
@@ -138,15 +139,15 @@ public interface CassandraNode extends 
DatastoreMixins.DatastoreCommon, Software
     
     @SetFromFlag("tokens")
     @SuppressWarnings("serial")
-    BasicAttributeSensorAndConfigKey<Set<BigInteger>> TOKENS = new 
BasicAttributeSensorAndConfigKey<Set<BigInteger>>(
+    AttributeSensorAndConfigKey<Set<BigInteger>, Set<BigInteger>> TOKENS = 
ConfigKeys.newSensorAndConfigKey(
             new TypeToken<Set<BigInteger>>() {}, "cassandra.tokens", 
"Cassandra Tokens");
 
     @SetFromFlag("useThriftMonitoring")
     ConfigKey<Boolean> USE_THRIFT_MONITORING = 
ConfigKeys.newConfigKey("thriftMonitoring.enabled", "Thrift-port monitoring 
enabled", Boolean.TRUE);
 
-    AttributeSensor<Integer> PEERS = Sensors.newIntegerSensor( 
"cassandra.peers", "Number of peers in cluster");
+    AttributeSensor<Integer> PEERS = 
Sensors.newIntegerSensor("cassandra.peers", "Number of peers in cluster");
 
-    AttributeSensor<Integer> LIVE_NODE_COUNT = Sensors.newIntegerSensor( 
"cassandra.liveNodeCount", "Number of live nodes in cluster");
+    AttributeSensor<Integer> LIVE_NODE_COUNT = 
Sensors.newIntegerSensor("cassandra.liveNodeCount", "Number of live nodes in 
cluster");
 
     /* Metrics for read/write performance. */
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
index d3230f9..1c72ab4 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
@@ -113,10 +113,6 @@ public class CassandraNodeSshDriver extends 
JavaSoftwareProcessSshDriver impleme
 
     public String getMirrorUrl() { return 
entity.getConfig(CassandraNode.MIRROR_URL); }
 
-    protected String getDefaultUnpackedDirectoryName() {
-        return "apache-cassandra-"+getVersion();
-    }
-
     protected boolean isV2() {
         String version = getVersion();
         return version.startsWith("2.");
@@ -132,12 +128,6 @@ public class CassandraNodeSshDriver extends 
JavaSoftwareProcessSshDriver impleme
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(getDefaultUnpackedDirectoryName())));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
index 915f06a..4e89c3e 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
@@ -19,7 +19,12 @@
 package org.apache.brooklyn.entity.nosql.couchbase;
 
 import static java.lang.String.format;
-import static org.apache.brooklyn.util.ssh.BashCommands.*;
+import static org.apache.brooklyn.util.ssh.BashCommands.INSTALL_CURL;
+import static org.apache.brooklyn.util.ssh.BashCommands.alternatives;
+import static org.apache.brooklyn.util.ssh.BashCommands.chainGroup;
+import static org.apache.brooklyn.util.ssh.BashCommands.installPackage;
+import static org.apache.brooklyn.util.ssh.BashCommands.ok;
+import static org.apache.brooklyn.util.ssh.BashCommands.sudo;
 
 import java.net.URI;
 import java.util.Arrays;
@@ -29,13 +34,21 @@ import java.util.concurrent.Callable;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import org.apache.http.auth.UsernamePasswordCredentials;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.net.HostAndPort;
+
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.Group;
 import org.apache.brooklyn.api.location.OsDetails;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.core.effector.ssh.SshEffectorTasks;
 import org.apache.brooklyn.core.entity.Attributes;
-import org.apache.brooklyn.core.entity.Entities;
 import 
org.apache.brooklyn.core.entity.drivers.downloads.BasicDownloadRequirement;
 import 
org.apache.brooklyn.core.entity.drivers.downloads.DownloadProducerFromUrlAttribute;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
@@ -43,29 +56,21 @@ import 
org.apache.brooklyn.core.location.access.BrooklynAccessUtils;
 import org.apache.brooklyn.core.sensor.DependentConfiguration;
 import 
org.apache.brooklyn.entity.software.base.AbstractSoftwareProcessSshDriver;
 import org.apache.brooklyn.feed.http.HttpValueFunctions;
-import org.apache.http.auth.UsernamePasswordCredentials;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.http.HttpTool;
-import org.apache.brooklyn.util.http.HttpToolResponse;
 import org.apache.brooklyn.util.core.task.DynamicTasks;
 import org.apache.brooklyn.util.core.task.TaskBuilder;
 import org.apache.brooklyn.util.core.task.TaskTags;
 import org.apache.brooklyn.util.core.task.Tasks;
+import org.apache.brooklyn.util.http.HttpTool;
+import org.apache.brooklyn.util.http.HttpToolResponse;
 import org.apache.brooklyn.util.repeat.Repeater;
 import org.apache.brooklyn.util.ssh.BashCommands;
 import org.apache.brooklyn.util.text.NaturalOrderComparator;
-import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.text.StringEscapes.BashStringEscapes;
+import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
 
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.net.HostAndPort;
-
 public class CouchbaseNodeSshDriver extends AbstractSoftwareProcessSshDriver 
implements CouchbaseNodeDriver {
 
     public CouchbaseNodeSshDriver(final CouchbaseNodeImpl entity, final 
SshMachineLocation machine) {
@@ -77,12 +82,6 @@ public class CouchbaseNodeSshDriver extends 
AbstractSoftwareProcessSshDriver imp
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(getInstallDir());
-    }
-
-    @Override
     public void install() {
         //for reference 
https://github.com/urbandecoder/couchbase/blob/master/recipes/server.rb
         //installation instructions 
(http://docs.couchbase.com/couchbase-manual-2.5/cb-install/#preparing-to-install)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java
index 1687bf1..9e5f8ba 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java
@@ -24,13 +24,13 @@ import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.location.PortRanges;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
+import 
org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey.StringAttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.Sensors;
-import 
org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey.StringAttributeSensorAndConfigKey;
+import org.apache.brooklyn.entity.database.DatastoreMixins;
 import org.apache.brooklyn.entity.software.base.SoftwareProcess;
 import org.apache.brooklyn.entity.webapp.WebAppServiceConstants;
-import org.apache.brooklyn.entity.database.DatastoreMixins;
 import org.apache.brooklyn.util.core.ResourcePredicates;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 
@@ -42,12 +42,16 @@ import org.apache.brooklyn.util.core.flags.SetFromFlag;
         + "schema-free JSON documents.")
 @ImplementedBy(ElasticSearchNodeImpl.class)
 public interface ElasticSearchNode extends SoftwareProcess, 
DatastoreMixins.HasDatastoreUrl {
+
     @SetFromFlag("version")
     ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "1.2.1");
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "elasticsearch-%s");
+
     @SetFromFlag("downloadUrl")
-    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new 
BasicAttributeSensorAndConfigKey<String>(
-            SoftwareProcess.DOWNLOAD_URL, 
"https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-${version}.tar.gz";);
+    AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = 
ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
+            
"https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-${version}.tar.gz";);
 
     @SetFromFlag("dataDir")
     ConfigKey<String> DATA_DIR = 
ConfigKeys.newStringConfigKey("elasticsearch.node.data.dir", "Directory for 
writing data files", null);

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
index 6e35e8b..4380d04 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
@@ -18,15 +18,14 @@
  */
 package org.apache.brooklyn.entity.nosql.elasticsearch;
 
-import static java.lang.String.format;
-
 import java.io.Reader;
 import java.io.StringReader;
 import java.util.List;
 
+import com.google.common.collect.ImmutableList;
+
 import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.entity.Entities;
 import 
org.apache.brooklyn.entity.software.base.AbstractSoftwareProcessSshDriver;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
@@ -34,8 +33,6 @@ import org.apache.brooklyn.util.net.Urls;
 import org.apache.brooklyn.util.os.Os;
 import org.apache.brooklyn.util.ssh.BashCommands;
 
-import com.google.common.collect.ImmutableList;
-
 public class ElasticSearchNodeSshDriver extends 
AbstractSoftwareProcessSshDriver implements ElasticSearchNodeDriver {
 
     public ElasticSearchNodeSshDriver(EntityLocal entity, SshMachineLocation 
machine) {
@@ -43,12 +40,6 @@ public class ElasticSearchNodeSshDriver extends 
AbstractSoftwareProcessSshDriver
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("elasticsearch-%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeSshDriver.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeSshDriver.java
index 2a9b9c5..0e48328 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/hazelcast/HazelcastNodeSshDriver.java
@@ -48,11 +48,6 @@ public class HazelcastNodeSshDriver extends 
JavaSoftwareProcessSshDriver impleme
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
index ccbe470..acfe9dc 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
@@ -22,9 +22,16 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
 import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.location.OsDetails;
-import org.apache.brooklyn.core.entity.Entities;
 import 
org.apache.brooklyn.entity.software.base.AbstractSoftwareProcessSshDriver;
 import org.apache.brooklyn.entity.software.base.lifecycle.ScriptHelper;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
@@ -35,13 +42,6 @@ import org.apache.brooklyn.util.net.Networking;
 import org.apache.brooklyn.util.os.Os;
 import org.apache.brooklyn.util.ssh.BashCommands;
 import org.apache.brooklyn.util.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 
 public abstract class AbstractMongoDBSshDriver extends 
AbstractSoftwareProcessSshDriver {
 
@@ -52,9 +52,8 @@ public abstract class AbstractMongoDBSshDriver extends 
AbstractSoftwareProcessSs
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(getBaseName())));
+    public String getArchiveNameFormat() {
+        return getOsTag() + "-%s";
     }
 
     @Override
@@ -150,10 +149,6 @@ public abstract class AbstractMongoDBSshDriver extends 
AbstractSoftwareProcessSs
                 .execute();
     }
 
-    protected String getBaseName() {
-        return getOsTag() + "-" + 
entity.getConfig(AbstractMongoDBServer.SUGGESTED_VERSION);
-    }
-
     // IDE note: This is used by MongoDBServer.DOWNLOAD_URL
     public String getOsDir() {
         return (getLocation().getOsDetails().isMac()) ? "osx" : "linux";

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStore.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStore.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStore.java
index 64c0344..01a7a92 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStore.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStore.java
@@ -23,7 +23,7 @@ import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.entity.software.base.SoftwareProcess;
@@ -41,12 +41,15 @@ public interface RedisStore extends SoftwareProcess {
     ConfigKey<String> SUGGESTED_VERSION =
             
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "2.8.4");
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "redis-%s");
+
     @SetFromFlag("downloadUrl")
-    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new 
BasicAttributeSensorAndConfigKey<String>(
-            SoftwareProcess.DOWNLOAD_URL, 
"http://download.redis.io/releases/redis-${version}.tar.gz";);
+    AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = 
ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
+            "http://download.redis.io/releases/redis-${version}.tar.gz";);
 
     @SetFromFlag("redisPort")
-    PortAttributeSensorAndConfigKey REDIS_PORT = new 
PortAttributeSensorAndConfigKey("redis.port", "Redis port number", "6379+");
+    PortAttributeSensorAndConfigKey REDIS_PORT = 
ConfigKeys.newPortSensorAndConfigKey("redis.port", "Redis port number", 
"6379+");
 
     @SetFromFlag("redisConfigTemplateUrl")
     ConfigKey<String> REDIS_CONFIG_TEMPLATE_URL = 
ConfigKeys.builder(String.class)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
index 81ebfe3..a46b1b0 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
@@ -48,12 +48,6 @@ public class RedisStoreSshDriver extends 
AbstractSoftwareProcessSshDriver implem
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("redis-%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNode.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNode.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNode.java
index e21260a..13de43d 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNode.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNode.java
@@ -49,6 +49,9 @@ public interface RiakNode extends SoftwareProcess, UsesJava {
     ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION,
             "Version to install (Default 2.0.5)", "2.0.5");
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "riak-%s");
+
     @SetFromFlag("optimizeNetworking")
     ConfigKey<Boolean> OPTIMIZE_HOST_NETWORKING  = 
ConfigKeys.newBooleanConfigKey("riak.networking.optimize", "Optimize host 
networking when running in a VM", Boolean.TRUE);
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
index 65879a7..7888831 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
@@ -93,9 +93,8 @@ public class RiakNodeSshDriver extends 
JavaSoftwareProcessSshDriver implements R
     }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("riak-%s", getVersion()))));
+    public void prepare() {
+        super.prepare();
 
         // Set package install attribute
         OsDetails osDetails = getMachine().getMachineDetails().getOsDetails();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServer.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServer.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServer.java
index 702d595..e703b56 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServer.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServer.java
@@ -20,13 +20,16 @@ package org.apache.brooklyn.entity.nosql.solr;
 
 import java.util.Map;
 
+import com.google.common.collect.Maps;
+import com.google.common.reflect.TypeToken;
+
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
 import org.apache.brooklyn.core.location.PortRanges;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
 import org.apache.brooklyn.entity.java.UsesJava;
 import org.apache.brooklyn.entity.java.UsesJavaMXBeans;
@@ -35,9 +38,6 @@ import 
org.apache.brooklyn.entity.software.base.SoftwareProcess;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.apache.brooklyn.util.time.Duration;
 
-import com.google.common.collect.Maps;
-import com.google.common.reflect.TypeToken;
-
 /**
  * An {@link org.apache.brooklyn.api.entity.Entity} that represents a Solr 
node.
  */
@@ -49,9 +49,12 @@ public interface SolrServer extends SoftwareProcess, 
UsesJava, UsesJmx, UsesJava
     @SetFromFlag("version")
     ConfigKey<String> SUGGESTED_VERSION = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "4.7.2");
 
+    @SetFromFlag("archiveNameFormat")
+    ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = 
ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT,
 "solr-%s");
+
     @SetFromFlag("downloadUrl")
-    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new 
BasicAttributeSensorAndConfigKey<String>(
-            SoftwareProcess.DOWNLOAD_URL, 
"${driver.mirrorUrl}/${version}/solr-${version}.tgz");
+    AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = 
ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
+            "${driver.mirrorUrl}/${version}/solr-${version}.tgz");
 
     /** download mirror, if desired */
     @SetFromFlag("mirrorUrl")
@@ -59,7 +62,7 @@ public interface SolrServer extends SoftwareProcess, 
UsesJava, UsesJmx, UsesJava
             "http://mirrors.ukfast.co.uk/sites/ftp.apache.org/lucene/solr/";);
 
     @SetFromFlag("solrPort")
-    PortAttributeSensorAndConfigKey SOLR_PORT = new 
PortAttributeSensorAndConfigKey("solr.http.port", "Solr HTTP communications 
port",
+    PortAttributeSensorAndConfigKey SOLR_PORT = 
ConfigKeys.newPortSensorAndConfigKey("solr.http.port", "Solr HTTP 
communications port",
             PortRanges.fromString("8983+"));
 
     @SetFromFlag("solrConfigTemplateUrl")

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3352bfab/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
index 773083e..0b14bf6 100644
--- 
a/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
+++ 
b/software/nosql/src/main/java/org/apache/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
@@ -65,12 +65,6 @@ public class SolrServerSshDriver extends 
JavaSoftwareProcessSshDriver implements
     public String getPidFile() { return Os.mergePaths(getRunDir(), 
"solr.pid"); }
 
     @Override
-    public void preInstall() {
-        resolver = Entities.newDownloader(this);
-        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("solr-%s", getVersion()))));
-    }
-
-    @Override
     public void install() {
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();

Reply via email to