Move download resolver and expanded install dir setup to preInstall method

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

Branch: refs/heads/master
Commit: 32e991104c7e4c37060aed05f19fa85a02f3933b
Parents: a5012ce
Author: Andrew Kennedy <[email protected]>
Authored: Thu Aug 28 22:02:36 2014 +0100
Committer: Andrew Kennedy <[email protected]>
Committed: Sat Aug 30 17:25:36 2014 +0100

----------------------------------------------------------------------
 .../nosql/infinispan/Infinispan5SshDriver.java  |  5 -----
 .../basic/AbstractSoftwareProcessDriver.java    |  9 ++++++++
 .../basic/AbstractSoftwareProcessSshDriver.java |  3 +++
 .../brooklynnode/BrooklynNodeSshDriver.java     | 16 ++++++++------
 .../database/mariadb/MariaDbSshDriver.java      | 14 +++++++-----
 .../entity/database/mysql/MySqlSshDriver.java   | 11 ++++++----
 .../database/rubyrep/RubyRepSshDriver.java      | 13 ++++++-----
 .../messaging/activemq/ActiveMQSshDriver.java   |  9 +++++---
 .../kafka/AbstractfKafkaSshDriver.java          | 11 ++++++----
 .../entity/messaging/qpid/QpidSshDriver.java    | 11 ++++++----
 .../messaging/rabbit/RabbitSshDriver.java       | 10 ++++++---
 .../entity/messaging/storm/StormSshDriver.java  | 10 +++++----
 .../entity/zookeeper/ZooKeeperSshDriver.java    |  9 +++++---
 .../entity/monitoring/monit/MonitSshDriver.java | 14 ++++++++----
 .../nosql/cassandra/CassandraNodeSshDriver.java | 12 +++++-----
 .../nosql/couchbase/CouchbaseNodeSshDriver.java | 13 ++++++-----
 .../ElasticSearchNodeSshDriver.java             | 10 +++++----
 .../nosql/mongodb/AbstractMongoDBSshDriver.java | 10 ++++++---
 .../entity/nosql/redis/RedisStoreSshDriver.java | 10 ++++++---
 .../entity/nosql/riak/RiakNodeSshDriver.java    | 23 +++++++++++---------
 .../entity/nosql/solr/SolrServerSshDriver.java  | 13 ++++++-----
 .../entity/osgi/karaf/KarafSshDriver.java       | 11 ++++++----
 .../entity/proxy/nginx/NginxSshDriver.java      | 14 ++++++++----
 .../entity/webapp/jboss/JBoss6SshDriver.java    |  9 +++++---
 .../entity/webapp/jboss/JBoss7SshDriver.java    |  9 +++++---
 .../entity/webapp/jetty/Jetty6SshDriver.java    |  9 +++++---
 .../webapp/nodejs/NodeJsWebAppSshDriver.java    |  4 ++++
 .../entity/webapp/tomcat/Tomcat7SshDriver.java  |  8 +++++--
 28 files changed, 193 insertions(+), 107 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/sandbox/nosql/src/main/java/brooklyn/entity/nosql/infinispan/Infinispan5SshDriver.java
----------------------------------------------------------------------
diff --git 
a/sandbox/nosql/src/main/java/brooklyn/entity/nosql/infinispan/Infinispan5SshDriver.java
 
b/sandbox/nosql/src/main/java/brooklyn/entity/nosql/infinispan/Infinispan5SshDriver.java
index ba595a9..361a6ab 100644
--- 
a/sandbox/nosql/src/main/java/brooklyn/entity/nosql/infinispan/Infinispan5SshDriver.java
+++ 
b/sandbox/nosql/src/main/java/brooklyn/entity/nosql/infinispan/Infinispan5SshDriver.java
@@ -24,8 +24,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.location.Location;
 import brooklyn.location.basic.SshMachineLocation;
@@ -59,11 +57,8 @@ public class Infinispan5SshDriver extends 
JavaSoftwareProcessSshDriver implement
 
     @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        // FIXME will saveAs be "infinispan-${version}-all.zip"?
-        setExpandedInstallDir(getInstallDir()); // unpacks to current 
directory, rather than sub-directory
 
         List<String> commands = ImmutableList.<String>builder()
                 .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs))

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessDriver.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessDriver.java
 
b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessDriver.java
index 18c5e06..609c624 100644
--- 
a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessDriver.java
+++ 
b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessDriver.java
@@ -79,6 +79,10 @@ public abstract class AbstractSoftwareProcessDriver 
implements SoftwareProcessDr
      */
     @Override
     public void start() {
+        DynamicTasks.queue("post-launch", new Runnable() { public void run() {
+            preInstall();
+        }});
+
         if 
(Strings.isNonBlank(entity.getConfig(BrooklynConfigKeys.PRE_INSTALL_COMMAND))) {
             DynamicTasks.queue("pre-install command", new Runnable() { public 
void run() {
                 
runPreInstallCommand(entity.getConfig(BrooklynConfigKeys.PRE_INSTALL_COMMAND));
@@ -139,6 +143,11 @@ public abstract class AbstractSoftwareProcessDriver 
implements SoftwareProcessDr
     @Override
     public abstract void stop();
 
+    /**
+     * Implement this method in child classes to add some post-launch behavior
+     */
+    public void preInstall() {}
+
     public abstract void runPreInstallCommand(String command);
     public abstract void setup();
     public abstract void install();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java
 
b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java
index eb51e7d..213fb32 100644
--- 
a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java
+++ 
b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java
@@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory;
 import brooklyn.config.BrooklynLogging;
 import brooklyn.entity.basic.lifecycle.NaiveScriptRunner;
 import brooklyn.entity.basic.lifecycle.ScriptHelper;
+import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.drivers.downloads.DownloadResolverManager;
 import brooklyn.entity.software.SshEffectorTasks;
 import brooklyn.event.feed.ConfigToAttributes;
@@ -80,6 +81,8 @@ public abstract class AbstractSoftwareProcessSshDriver 
extends AbstractSoftwareP
     private volatile String installDir;
     private volatile String runDir;
     private volatile String expandedInstallDir;
+
+    protected volatile DownloadResolver resolver;
     
     /** include this flag in newScript creation to prevent entity-level flags 
from being included;
      * any SSH-specific flags passed to newScript override flags from the 
entity,

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
 
b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
index cfdbc85..14f628c 100644
--- 
a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
+++ 
b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java
@@ -30,7 +30,6 @@ import java.util.Map;
 
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.brooklynnode.BrooklynNode.ExistingFileBehaviour;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.entity.software.SshEffectorTasks;
 import brooklyn.location.basic.SshMachineLocation;
@@ -78,7 +77,15 @@ public class BrooklynNodeSshDriver extends 
JavaSoftwareProcessSshDriver implemen
     protected String getInstallLabelExtraSalt() {
         return 
Identifiers.makeIdFromHash(Objects.hashCode(entity.getConfig(BrooklynNode.DOWNLOAD_URL),
 entity.getConfig(BrooklynNode.DISTRO_UPLOAD_URL)));
     }
-    
+
+    @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        String subpath = entity.getConfig(BrooklynNode.SUBPATH_IN_ARCHIVE);
+        if (Strings.isBlank(subpath)) subpath = format("brooklyn-%s", 
getVersion());
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(subpath)));
+    }
+
     @Override
     public void install() {
         String uploadUrl = entity.getConfig(BrooklynNode.DISTRO_UPLOAD_URL);
@@ -87,14 +94,9 @@ public class BrooklynNodeSshDriver extends 
JavaSoftwareProcessSshDriver implemen
         // This filename is used to generate the first URL to try: 
         // 
file://$HOME/.brooklyn/repository/BrooklynNode/0.6.0-SNAPSHOT/brooklyn-0.6.0-SNAPSHOT-dist.tar.gz
         // (DOWNLOAD_URL overrides this and has a default which comes from 
maven)
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
         
-        String subpath = entity.getConfig(BrooklynNode.SUBPATH_IN_ARCHIVE);
-        if (Strings.isBlank(subpath)) subpath = format("brooklyn-%s", 
getVersion());
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(subpath));
-        
         newScript("createInstallDir")
                 .body.append("mkdir -p "+getInstallDir())
                 .failOnNonZeroResultCode()

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/database/src/main/java/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/database/src/main/java/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
 
b/software/database/src/main/java/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
index e25d2f2..ca80a70 100644
--- 
a/software/database/src/main/java/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
+++ 
b/software/database/src/main/java/brooklyn/entity/database/mariadb/MariaDbSshDriver.java
@@ -19,9 +19,7 @@
 package brooklyn.entity.database.mariadb;
 
 import static brooklyn.util.JavaGroovyEquivalents.groovyTruth;
-import static brooklyn.util.ssh.BashCommands.commandsToDownloadUrlsAs;
-import static brooklyn.util.ssh.BashCommands.installPackage;
-import static brooklyn.util.ssh.BashCommands.ok;
+import static brooklyn.util.ssh.BashCommands.*;
 import static java.lang.String.format;
 
 import java.io.InputStream;
@@ -38,12 +36,12 @@ import 
brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.database.DatastoreMixins;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.software.SshEffectorTasks;
 import brooklyn.location.OsDetails;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.net.Urls;
+import brooklyn.util.os.Os;
 import brooklyn.util.ssh.BashCommands;
 import brooklyn.util.task.DynamicTasks;
 import brooklyn.util.task.system.ProcessTaskWrapper;
@@ -111,11 +109,15 @@ public class MariaDbSshDriver extends 
AbstractSoftwareProcessSshDriver implement
     }
 
     @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this, ImmutableMap.of("filename", 
getInstallFilename()));
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("mariadb-%s-%s", getVersion(), 
getOsTag()))));
+    }
+
+    @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this, 
ImmutableMap.of("filename", getInstallFilename()));
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        setExpandedInstallDir(getInstallDir() + "/" + 
resolver.getUnpackedDirectoryName(format("mariadb-%s-%s", getVersion(), 
getOsTag())));
 
         List<String> commands = new LinkedList<String>();
         commands.add(BashCommands.INSTALL_TAR);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/database/src/main/java/brooklyn/entity/database/mysql/MySqlSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/database/src/main/java/brooklyn/entity/database/mysql/MySqlSshDriver.java
 
b/software/database/src/main/java/brooklyn/entity/database/mysql/MySqlSshDriver.java
index 49dc209..da4f3b6 100644
--- 
a/software/database/src/main/java/brooklyn/entity/database/mysql/MySqlSshDriver.java
+++ 
b/software/database/src/main/java/brooklyn/entity/database/mysql/MySqlSshDriver.java
@@ -21,7 +21,6 @@ package brooklyn.entity.database.mysql;
 import static brooklyn.util.JavaGroovyEquivalents.groovyTruth;
 import static brooklyn.util.ssh.BashCommands.commandsToDownloadUrlsAs;
 import static brooklyn.util.ssh.BashCommands.installPackage;
-import static brooklyn.util.ssh.BashCommands.ok;
 import static java.lang.String.format;
 
 import java.io.InputStream;
@@ -38,13 +37,13 @@ import 
brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.database.DatastoreMixins;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.software.SshEffectorTasks;
 import brooklyn.location.OsDetails;
 import brooklyn.location.basic.BasicOsDetails.OsVersions;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.net.Urls;
+import brooklyn.util.os.Os;
 import brooklyn.util.ssh.BashCommands;
 import brooklyn.util.task.DynamicTasks;
 import brooklyn.util.task.system.ProcessTaskWrapper;
@@ -111,11 +110,15 @@ public class MySqlSshDriver extends 
AbstractSoftwareProcessSshDriver implements
     }
 
     @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this, ImmutableMap.of("filename", 
getInstallFilename()));
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("mysql-%s-%s", getVersion(), 
getOsTag()))));
+    }
+
+    @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this, 
ImmutableMap.of("filename", getInstallFilename()));
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        setExpandedInstallDir(getInstallDir() + "/" + 
resolver.getUnpackedDirectoryName(format("mysql-%s-%s", getVersion(), 
getOsTag())));
 
         List<String> commands = new LinkedList<String>();
         commands.add(BashCommands.INSTALL_TAR);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
 
b/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
index 56bec94..d1c4087 100644
--- 
a/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
+++ 
b/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepSshDriver.java
@@ -32,9 +32,9 @@ import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
+import brooklyn.util.os.Os;
 import brooklyn.util.ssh.BashCommands;
 import brooklyn.util.stream.Streams;
 
@@ -51,12 +51,17 @@ public class RubyRepSshDriver extends 
AbstractSoftwareProcessSshDriver implement
     }
 
     protected String getLogFileLocation() {
-        return getRunDir() + "/log/rubyrep.log";
+        return Os.mergePaths(getRunDir(), "log", "rubyrep.log");
+    }
+
+    @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("rubyrep-%s", getVersion()))));
     }
 
     @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
 
@@ -70,8 +75,6 @@ public class RubyRepSshDriver extends 
AbstractSoftwareProcessSshDriver implement
                 .body.append(commands)
                 .failOnNonZeroResultCode()
                 .execute();
-
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("rubyrep-%s",
 getVersion())));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/messaging/src/main/java/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
 
b/software/messaging/src/main/java/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
index 51c1418..f8c223d 100644
--- 
a/software/messaging/src/main/java/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
+++ 
b/software/messaging/src/main/java/brooklyn/entity/messaging/activemq/ActiveMQSshDriver.java
@@ -25,7 +25,6 @@ import java.util.List;
 import java.util.Map;
 
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
@@ -64,11 +63,15 @@ 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() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("apache-activemq-%s",
 getVersion())));
 
         List<String> commands = new LinkedList<String>();
         commands.addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
 
b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
index 9b50092..010c6da 100644
--- 
a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
+++ 
b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
@@ -30,7 +30,6 @@ import org.slf4j.LoggerFactory;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
@@ -58,14 +57,18 @@ public abstract class AbstractfKafkaSshDriver extends 
JavaSoftwareProcessSshDriv
     protected abstract String getProcessIdentifier();
 
     @Override
-    protected String getLogFileLocation() { return 
Os.mergePathsUnix(getRunDir(), "console.out"); }
+    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-src", getVersion()))));
+    }
 
     @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("kafka-%s-src",
 getVersion())));
 
         List<String> commands = new LinkedList<String>();
         commands.addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidSshDriver.java
 
b/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidSshDriver.java
index b336feb..2ad68be 100644
--- 
a/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidSshDriver.java
+++ 
b/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidSshDriver.java
@@ -28,7 +28,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
@@ -47,7 +46,7 @@ public class QpidSshDriver extends 
JavaSoftwareProcessSshDriver implements QpidD
     }
 
     @Override
-    protected String getLogFileLocation() { return 
Os.mergePathsUnix(getRunDir(), "log/qpid.log"); }
+    protected String getLogFileLocation() { return Os.mergePaths(getRunDir(), 
"log", "qpid.log"); }
 
     @Override
     public Integer getAmqpPort() { return 
entity.getAttribute(QpidBroker.AMQP_PORT); }
@@ -58,11 +57,15 @@ 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() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("qpid-broker-%s",
 getVersion())));
 
         List<String> commands = new LinkedList<String>();
         commands.addAll( BashCommands.commandsToDownloadUrlsAs(urls, saveAs));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/messaging/src/main/java/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
 
b/software/messaging/src/main/java/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
index 07beffc..bb8d4e2 100644
--- 
a/software/messaging/src/main/java/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
+++ 
b/software/messaging/src/main/java/brooklyn/entity/messaging/rabbit/RabbitSshDriver.java
@@ -29,11 +29,11 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.messaging.amqp.AmqpServer;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.net.Networking;
+import brooklyn.util.os.Os;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -61,13 +61,17 @@ public class RabbitSshDriver extends 
AbstractSoftwareProcessSshDriver implements
     public RabbitBrokerImpl getEntity() {
         return (RabbitBrokerImpl) super.getEntity();
     }
+
+    @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("rabbitmq_server-%s", getVersion()))));
+    }
     
     @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("rabbitmq_server-%s",
 getVersion())));
 
         List<String> commands = ImmutableList.<String>builder()
                 .add(ifExecutableElse0("zypper", chainGroup(

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/messaging/src/main/java/brooklyn/entity/messaging/storm/StormSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/brooklyn/entity/messaging/storm/StormSshDriver.java
 
b/software/messaging/src/main/java/brooklyn/entity/messaging/storm/StormSshDriver.java
index 0283929..12f73a1 100644
--- 
a/software/messaging/src/main/java/brooklyn/entity/messaging/storm/StormSshDriver.java
+++ 
b/software/messaging/src/main/java/brooklyn/entity/messaging/storm/StormSshDriver.java
@@ -31,7 +31,6 @@ import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.entity.zookeeper.ZooKeeperEnsemble;
 import brooklyn.event.basic.DependentConfiguration;
@@ -120,12 +119,15 @@ 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() {
-        log.debug("Installing {}", entity);
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        setExpandedInstallDir(getInstallDir() + "/" + 
resolver.getUnpackedDirectoryName(format("storm-%s", getVersion())));
         
         ImmutableList.Builder<String> commands= ImmutableList.<String> 
builder();
         if (!getLocation().getOsDetails().isMac()) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/messaging/src/main/java/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/messaging/src/main/java/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
 
b/software/messaging/src/main/java/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
index 7ee67e9..5fa0275 100644
--- 
a/software/messaging/src/main/java/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
+++ 
b/software/messaging/src/main/java/brooklyn/entity/zookeeper/ZooKeeperSshDriver.java
@@ -26,7 +26,6 @@ import java.util.concurrent.ExecutionException;
 
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
@@ -93,11 +92,15 @@ public class ZooKeeperSshDriver extends 
JavaSoftwareProcessSshDriver implements
     }
 
     @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("zookeeper-%s", getVersion()))));
+    }
+
+    @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("zookeeper-%s",
 getVersion())));
 
         List<String> commands = ImmutableList.<String> builder()
                 .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs))

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/monitoring/src/main/java/brooklyn/entity/monitoring/monit/MonitSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/monitoring/src/main/java/brooklyn/entity/monitoring/monit/MonitSshDriver.java
 
b/software/monitoring/src/main/java/brooklyn/entity/monitoring/monit/MonitSshDriver.java
index fbb57c3..5fd5749 100644
--- 
a/software/monitoring/src/main/java/brooklyn/entity/monitoring/monit/MonitSshDriver.java
+++ 
b/software/monitoring/src/main/java/brooklyn/entity/monitoring/monit/MonitSshDriver.java
@@ -24,12 +24,12 @@ import java.util.List;
 import java.util.Map;
 
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
-import brooklyn.entity.basic.EntityInternal;
+import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.lifecycle.ScriptHelper;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.location.OsDetails;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
+import brooklyn.util.os.Os;
 import brooklyn.util.ssh.BashCommands;
 
 import com.google.common.collect.ImmutableList;
@@ -43,12 +43,18 @@ public class MonitSshDriver extends 
AbstractSoftwareProcessSshDriver implements
     public MonitSshDriver(MonitNodeImpl entity, SshMachineLocation machine) {
         super(entity, machine);
     }
+
+    @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("monit-%s", getVersion()))));
+    }
+
     @Override
     public void install() {
-        DownloadResolver resolver = 
((EntityInternal)entity).getManagementContext().getEntityDownloadsManager().newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        expandedInstallDir = getInstallDir() + "/" + 
resolver.getUnpackedDirectoryName(format("monit-%s", getVersion()));
+
         List<String> commands = ImmutableList.<String>builder()
             .add(BashCommands.INSTALL_TAR)
             .add(BashCommands.INSTALL_CURL)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
index fc97186..65ed4a6 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java
@@ -35,7 +35,6 @@ import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.entity.database.DatastoreMixins;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.entity.java.UsesJmx;
 import brooklyn.entity.software.SshEffectorTasks;
@@ -127,14 +126,17 @@ public class CassandraNodeSshDriver extends 
JavaSoftwareProcessSshDriver impleme
             return super.installJava();
         }
     }
-    
+
+    @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(getDefaultUnpackedDirectoryName())));
+    }
+
     @Override
     public void install() {
-        log.debug("Installing {}", entity);
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(getDefaultUnpackedDirectoryName()));
 
         List<String> commands = ImmutableList.<String>builder()
                 .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs))

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
index d55f7df..ff56859 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseNodeSshDriver.java
@@ -18,17 +18,13 @@
  */
 package brooklyn.entity.nosql.couchbase;
 
-import static brooklyn.util.ssh.BashCommands.INSTALL_CURL;
-import static brooklyn.util.ssh.BashCommands.alternatives;
-import static brooklyn.util.ssh.BashCommands.chainGroup;
-import static brooklyn.util.ssh.BashCommands.sudo;
+import static brooklyn.util.ssh.BashCommands.*;
 import static java.lang.String.format;
 
 import java.util.List;
 
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.location.OsDetails;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.ssh.BashCommands;
@@ -49,11 +45,16 @@ 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)
 
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
index d8cbb03..c2a31de 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java
@@ -28,7 +28,6 @@ import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.net.Urls;
@@ -44,8 +43,13 @@ 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() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
         
@@ -56,8 +60,6 @@ public class ElasticSearchNodeSshDriver extends 
AbstractSoftwareProcessSshDriver
             .build();
         
         newScript(INSTALLING).body.append(commands).execute();
-        
-        setExpandedInstallDir(getInstallDir() + "/" + 
resolver.getUnpackedDirectoryName(format("elasticsearch-%s", getVersion())));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
index b872fde..7544f86 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java
@@ -29,11 +29,11 @@ import 
brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.entity.basic.lifecycle.ScriptHelper;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.location.OsDetails;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.net.Networking;
+import brooklyn.util.os.Os;
 import brooklyn.util.ssh.BashCommands;
 
 import com.google.common.base.Joiner;
@@ -50,11 +50,15 @@ public abstract class AbstractMongoDBSshDriver extends 
AbstractSoftwareProcessSs
     }
 
     @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(getBaseName())));
+    }
+
+    @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(getBaseName()));
     
         List<String> commands = new LinkedList<String>();
         commands.addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
index d3ea238..0d20290 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
@@ -27,10 +27,10 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.location.Location;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
+import brooklyn.util.os.Os;
 import brooklyn.util.ssh.BashCommands;
 
 import com.google.common.collect.ImmutableList;
@@ -47,11 +47,15 @@ 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() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("redis-%s",
 getVersion())));
 
         MutableMap<String, String> installGccPackageFlags = MutableMap.of(
                 "onlyifmissing", "gcc",

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
index 8b7ab1a..372b0bd 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/riak/RiakNodeSshDriver.java
@@ -27,23 +27,23 @@ import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.lifecycle.ScriptHelper;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.software.SshEffectorTasks;
 import brooklyn.location.OsDetails;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.net.Urls;
+import brooklyn.util.os.Os;
 import brooklyn.util.task.DynamicTasks;
 
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+
 // TODO: Alter -env ERL_CRASH_DUMP path in vm.args
 public class RiakNodeSshDriver extends AbstractSoftwareProcessSshDriver 
implements RiakNodeDriver {
 
@@ -71,16 +71,19 @@ public class RiakNodeSshDriver extends 
AbstractSoftwareProcessSshDriver implemen
     }
 
     @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("riak-%s", getVersion()))));
+    }
+
+    @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         String saveAs = resolver.getFilename();
-        String expandedInstallDir = getInstallDir() + "/" + 
resolver.getUnpackedDirectoryName(format("riak-%s", getVersion()));
-        setExpandedInstallDir(expandedInstallDir);
 
         OsDetails osDetails = getMachine().getMachineDetails().getOsDetails();
         List<String> commands = Lists.newLinkedList();
         if (osDetails.isLinux()) {
-            commands.addAll(installLinux(expandedInstallDir));
+            commands.addAll(installLinux(getExpandedInstallDir()));
         } else if (osDetails.isMac()) {
             commands.addAll(installMac(saveAs));
         } else if (osDetails.isWindows()) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/nosql/src/main/java/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/nosql/src/main/java/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
 
b/software/nosql/src/main/java/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
index 4a2c62e..164cc07 100644
--- 
a/software/nosql/src/main/java/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
+++ 
b/software/nosql/src/main/java/brooklyn/entity/nosql/solr/SolrServerSshDriver.java
@@ -29,13 +29,13 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.location.Location;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.file.ArchiveUtils;
 import brooklyn.util.net.Networking;
 import brooklyn.util.net.Urls;
+import brooklyn.util.os.Os;
 import brooklyn.util.ssh.BashCommands;
 import brooklyn.util.stream.Streams;
 
@@ -62,15 +62,18 @@ public class SolrServerSshDriver extends 
AbstractSoftwareProcessSshDriver implem
 
     public String getMirrorUrl() { return 
entity.getConfig(SolrServer.MIRROR_URL); }
 
-    public String getPidFile() { return String.format("%s/solr.pid", 
getRunDir()); }
+    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() {
-        log.debug("Installing {}", entity);
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("solr-%s",
 getVersion())));
 
         List<String> commands = ImmutableList.<String>builder()
                 .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs))

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java 
b/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java
index 59f09d8..0e529d9 100644
--- a/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java
+++ b/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java
@@ -25,7 +25,6 @@ import java.util.List;
 import java.util.Map;
 
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableList;
@@ -53,15 +52,19 @@ public class KarafSshDriver extends 
JavaSoftwareProcessSshDriver implements Kara
 
     @Override
     protected String getLogFileLocation() {
-        return Os.mergePathsUnix(getRunDir(), "data/karaf.out");
+        return Os.mergePaths(getRunDir(), "data", "karaf.out");
+    }
+
+    @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("apache-karaf-%s", getVersion()))));
     }
 
     @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("apache-karaf-%s",
 getVersion())));
 
         List<String> commands = ImmutableList.<String>builder()
                 .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs))

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java 
b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
index 8a3f2c6..dabdae2 100644
--- 
a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
+++ 
b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
@@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Attributes;
+import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.Lifecycle;
 import brooklyn.entity.basic.lifecycle.ScriptHelper;
@@ -38,6 +39,7 @@ import brooklyn.management.ManagementContext;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.net.Networking;
+import brooklyn.util.os.Os;
 import brooklyn.util.ssh.BashCommands;
 import brooklyn.util.stream.Streams;
 import brooklyn.util.task.DynamicTasks;
@@ -114,14 +116,18 @@ public class NginxSshDriver extends 
AbstractSoftwareProcessSshDriver implements
     }
 
     @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("nginx-%s", getVersion()))));
+    }
+
+    @Override
     public void install() {
         // inessential here, installation will fail later if it needs to sudo 
(eg if using port 80)
         
DynamicTasks.queueIfPossible(SshTasks.dontRequireTtyForSudo(getMachine(), 
OnFailingTask.WARN_OR_IF_DYNAMIC_FAIL_MARKING_INESSENTIAL)).orSubmitAndBlock();
 
-        DownloadResolver nginxResolver = 
mgmt().getEntityDownloadsManager().newDownloader(this);
-        List<String> nginxUrls = nginxResolver.getTargets();
-        String nginxSaveAs = nginxResolver.getFilename();
-        setExpandedInstallDir(getInstallDir()+"/" + 
nginxResolver.getUnpackedDirectoryName(format("nginx-%s", getVersion())));
+        List<String> nginxUrls = resolver.getTargets();
+        String nginxSaveAs = resolver.getFilename();
 
         boolean sticky = ((NginxController) entity).isSticky();
         boolean isMac = getMachine().getOsDetails().isMac();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java
 
b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java
index 5104a52..63e646d 100644
--- 
a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java
+++ 
b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss6SshDriver.java
@@ -29,7 +29,6 @@ import java.util.Map;
 
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.UsesJmx;
 import brooklyn.entity.java.UsesJmx.JmxAgentModes;
 import brooklyn.entity.webapp.JavaWebAppSshDriver;
@@ -90,11 +89,15 @@ public class JBoss6SshDriver extends JavaWebAppSshDriver 
implements JBoss6Driver
     }
 
     @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("jboss-%s", getVersion()))));
+    }
+
+    @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        setExpandedInstallDir(getInstallDir()+"/" + 
resolver.getUnpackedDirectoryName("jboss-"+getVersion()));
 
         // Note the -o option to unzip, to overwrite existing files without 
warning.
         // The JBoss zip file contains lgpl.txt (at least) twice and the 
prompt to

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7SshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7SshDriver.java
 
b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7SshDriver.java
index 9bac1a7..5b8a036 100644
--- 
a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7SshDriver.java
+++ 
b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7SshDriver.java
@@ -31,7 +31,6 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.webapp.JavaWebAppSshDriver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableList;
@@ -106,11 +105,15 @@ public class JBoss7SshDriver extends JavaWebAppSshDriver 
implements JBoss7Driver
     }
 
     @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("jboss-as-%s", getVersion()))));
+    }
+
+    @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("jboss-as-%s",
 getVersion())));
 
         List<String> commands = new LinkedList<String>();
         commands.addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/webapp/src/main/java/brooklyn/entity/webapp/jetty/Jetty6SshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/webapp/src/main/java/brooklyn/entity/webapp/jetty/Jetty6SshDriver.java
 
b/software/webapp/src/main/java/brooklyn/entity/webapp/jetty/Jetty6SshDriver.java
index 0e2d69d..33ff65d 100644
--- 
a/software/webapp/src/main/java/brooklyn/entity/webapp/jetty/Jetty6SshDriver.java
+++ 
b/software/webapp/src/main/java/brooklyn/entity/webapp/jetty/Jetty6SshDriver.java
@@ -25,7 +25,6 @@ import java.util.List;
 import java.util.Map;
 
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.webapp.JavaWebAppSshDriver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableList;
@@ -53,11 +52,15 @@ public class Jetty6SshDriver extends JavaWebAppSshDriver 
implements Jetty6Driver
     }
 
     @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName(format("jetty-%s", getVersion()))));
+    }
+
+    @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName("jetty-"+getVersion()));
 
         List<String> commands = new LinkedList<String>();
         commands.addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java
 
b/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java
index 8db6e8a..3e582fb 100644
--- 
a/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java
+++ 
b/software/webapp/src/main/java/brooklyn/entity/webapp/nodejs/NodeJsWebAppSshDriver.java
@@ -18,6 +18,8 @@
  */
 package brooklyn.entity.webapp.nodejs;
 
+import static java.lang.String.format;
+
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -27,7 +29,9 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
 import brooklyn.entity.basic.Attributes;
+import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.SoftwareProcess;
+import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.webapp.WebAppService;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.collections.MutableList;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/32e99110/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
 
b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
index 82068e0..8d1b9d3 100644
--- 
a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
+++ 
b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
@@ -52,13 +52,17 @@ public class Tomcat7SshDriver extends JavaWebAppSshDriver 
implements Tomcat7Driv
     protected Integer getShutdownPort() {
         return entity.getAttribute(TomcatServerImpl.SHUTDOWN_PORT);
     }
+    
+    @Override
+    public void preInstall() {
+        resolver = Entities.newDownloader(this);
+        setExpandedInstallDir(Os.mergePaths(getInstallDir(), 
resolver.getUnpackedDirectoryName("apache-tomcat-"+getVersion())));
+    }
 
     @Override
     public void install() {
-        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
-        
setExpandedInstallDir(getInstallDir()+"/"+resolver.getUnpackedDirectoryName("apache-tomcat-"+getVersion()));
 
         List<String> commands = new LinkedList<String>();
         commands.addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs));

Reply via email to