http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/chef/ChefSoloDriver.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/chef/ChefSoloDriver.java 
b/software/base/src/main/java/brooklyn/entity/chef/ChefSoloDriver.java
deleted file mode 100644
index aa97d72..0000000
--- a/software/base/src/main/java/brooklyn/entity/chef/ChefSoloDriver.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.chef;
-
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.api.mgmt.TaskAdaptable;
-import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.ConfigKeys;
-
-import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
-
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-
-import com.google.common.annotations.Beta;
-import com.google.common.reflect.TypeToken;
-
-/** Driver class to facilitate use of Chef */
-@Beta
-@Deprecated /** @deprecated since 0.7.0 use ChefEntity or 
ChefLifecycleEffectorTasks */
-public class ChefSoloDriver extends AbstractSoftwareProcessSshDriver 
implements ChefConfig {
-
-    @SuppressWarnings("serial")
-    public static final ConfigKey<TaskFactory<? extends 
TaskAdaptable<Boolean>>> IS_RUNNING_TASK = ConfigKeys.newConfigKey(
-            new TypeToken<TaskFactory<? extends TaskAdaptable<Boolean>>>() {}, 
-            "brooklyn.chef.task.driver.isRunningTask");
-    
-    @SuppressWarnings("serial")
-    public static final ConfigKey<TaskFactory<?>> STOP_TASK = 
ConfigKeys.newConfigKey(
-            new TypeToken<TaskFactory<?>>() {}, 
-            "brooklyn.chef.task.driver.stopTask");
-    
-    public ChefSoloDriver(EntityLocal entity, SshMachineLocation location) {
-        super(entity, location);
-    }
-
-    @Override
-    public void install() {
-        // TODO flag to force reinstallation
-        DynamicTasks.queue(
-                ChefSoloTasks.installChef(getInstallDir(), false), 
-                ChefSoloTasks.installCookbooks(getInstallDir(), 
getRequiredConfig(CHEF_COOKBOOKS), false));
-    }
-
-    @Override
-    public void customize() {
-        DynamicTasks.queue(ChefSoloTasks.buildChefFile(getRunDir(), 
getInstallDir(), "launch", getRequiredConfig(CHEF_RUN_LIST),
-                getEntity().getConfig(CHEF_LAUNCH_ATTRIBUTES)));
-    }
-
-    @Override
-    public void launch() {
-        DynamicTasks.queue(ChefSoloTasks.runChef(getRunDir(), "launch", 
getEntity().getConfig(CHEF_RUN_CONVERGE_TWICE)));
-    }
-
-    @Override
-    public boolean isRunning() {
-        return 
DynamicTasks.queue(getRequiredConfig(IS_RUNNING_TASK)).asTask().getUnchecked();
-    }
-
-    @Override
-    public void stop() {
-        DynamicTasks.queue(getRequiredConfig(STOP_TASK));
-    }
-
-    protected <T> T getRequiredConfig(ConfigKey<T> key) {
-        return ChefConfigs.getRequiredConfig(getEntity(), key);
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/chef/ChefSoloTasks.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/chef/ChefSoloTasks.java 
b/software/base/src/main/java/brooklyn/entity/chef/ChefSoloTasks.java
deleted file mode 100644
index 629d7a9..0000000
--- a/software/base/src/main/java/brooklyn/entity/chef/ChefSoloTasks.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.chef;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.util.ssh.BashCommands;
-
-import brooklyn.entity.software.SshEffectorTasks;
-
-import com.google.common.annotations.Beta;
-
-@Beta
-public class ChefSoloTasks {
-
-    public static TaskFactory<?> installChef(String chefDirectory, boolean 
force) {
-        // TODO check on entity whether it is chef _server_
-        String installCmd = cdAndRun(chefDirectory, 
ChefBashCommands.INSTALL_FROM_OPSCODE);
-        if (!force) installCmd = BashCommands.alternatives("which chef-solo", 
installCmd);
-        return SshEffectorTasks.ssh(installCmd).summary("install chef");
-    }
-
-    public static TaskFactory<?> installCookbooks(final String chefDirectory, 
final Map<String,String> cookbooksAndUrls, final boolean force) {
-        return ChefTasks.installCookbooks(chefDirectory, cookbooksAndUrls, 
force);
-    }
-
-    public static TaskFactory<?> installCookbook(String chefDirectory, String 
cookbookName, String cookbookArchiveUrl, boolean force) {
-        return ChefTasks.installCookbook(chefDirectory, cookbookName, 
cookbookArchiveUrl, force);
-    }
-
-    protected static String cdAndRun(String targetDirectory, String command) {
-        return BashCommands.chain("mkdir -p "+targetDirectory,
-                "cd "+targetDirectory,
-                command);
-    }
-
-    public static TaskFactory<?> buildChefFile(String runDirectory, String 
chefDirectory, String phase, Iterable<? extends String> runList,
-            Map<String, Object> optionalAttributes) {
-        return ChefTasks.buildChefFile(runDirectory, chefDirectory, phase, 
runList, optionalAttributes);
-    }
-
-    public static TaskFactory<?> runChef(String runDir, String phase) {
-        return runChef(runDir, phase, false);
-    }
-    /** see {@link ChefConfig#CHEF_RUN_CONVERGE_TWICE} for background on why 
'twice' is available */
-    public static TaskFactory<?> runChef(String runDir, String phase, Boolean 
twice) {
-        String cmd = "sudo chef-solo -c "+phase+".rb -j "+phase+".json 
-ldebug";
-        if (twice!=null && twice) cmd = BashCommands.alternatives(cmd, cmd);
-
-        return SshEffectorTasks.ssh(cdAndRun(runDir, cmd)).
-                summary("run chef for "+phase).requiringExitCodeZero();
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/chef/ChefTasks.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/chef/ChefTasks.java 
b/software/base/src/main/java/brooklyn/entity/chef/ChefTasks.java
deleted file mode 100644
index 7d5e46f..0000000
--- a/software/base/src/main/java/brooklyn/entity/chef/ChefTasks.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.chef;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.mgmt.TaskAdaptable;
-import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.effector.core.EffectorTasks;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.file.ArchiveTasks;
-import org.apache.brooklyn.util.core.file.ArchiveUtils.ArchiveType;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-import org.apache.brooklyn.util.core.task.TaskBuilder;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.net.Urls;
-import org.apache.brooklyn.util.ssh.BashCommands;
-import org.apache.brooklyn.util.text.Identifiers;
-import org.apache.brooklyn.util.text.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.entity.software.SshEffectorTasks;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-@Beta
-public class ChefTasks {
-
-    private static final Logger log = LoggerFactory.getLogger(ChefTasks.class);
-    
-    public static TaskFactory<?> installChef(String chefDirectory, boolean 
force) {
-        // TODO check on entity whether it is chef _server_
-        String installCmd = cdAndRun(chefDirectory, 
ChefBashCommands.INSTALL_FROM_OPSCODE);
-        if (!force) installCmd = BashCommands.alternatives("which chef-solo", 
installCmd);
-        return SshEffectorTasks.ssh(installCmd).summary("install chef");
-    }
-
-    public static TaskFactory<?> installCookbooks(final String chefDirectory, 
final Map<String,String> cookbooksAndUrls, final boolean force) {
-        return Tasks.<Void>builder().name("install "+(cookbooksAndUrls==null ? 
"0" : cookbooksAndUrls.size())+" cookbook"+Strings.s(cookbooksAndUrls)).body(
-                new Runnable() {
-                    public void run() {
-                        Entity e = EffectorTasks.findEntity();
-                        if (cookbooksAndUrls==null)
-                            throw new IllegalStateException("No cookbooks 
defined to install at "+e);
-                        for (String cookbook: cookbooksAndUrls.keySet())
-                            DynamicTasks.queue(installCookbook(chefDirectory, 
cookbook, cookbooksAndUrls.get(cookbook), force));
-                    }
-                }).buildFactory();
-    }
-
-    public static TaskFactory<?> installCookbook(final String chefDirectory, 
final String cookbookName, final String cookbookArchiveUrl, final boolean 
force) {
-        return new TaskFactory<TaskAdaptable<?>>() {
-            @Override
-            public TaskAdaptable<?> newTask() {
-                TaskBuilder<Void> tb = Tasks.<Void>builder().name("install 
cookbook "+cookbookName);
-                
-                String cookbookDir = Urls.mergePaths(chefDirectory, 
cookbookName);
-                String privateTmpDirContainingUnpackedCookbook = 
-                    Urls.mergePaths(chefDirectory, 
"tmp-"+Strings.makeValidFilename(cookbookName)+"-"+Identifiers.makeRandomId(4));
-
-                // TODO - skip the install earlier if it exists and isn't 
forced
-//                if (!force) {
-//                    // in builder.body, check 
-//                    // "ls "+cookbookDir
-//                    // and stop if it's zero
-//                    // remove reference to 'force' below
-//                }
-                
-                String destName = null;
-                if (ArchiveType.of(cookbookArchiveUrl)==ArchiveType.UNKNOWN) {
-                    destName = cookbookName + ".tgz";
-                    log.debug("Assuming TGZ type for chef cookbook url 
"+cookbookArchiveUrl+"; it will be downloaded as "+destName);
-                }
-                tb.add(ArchiveTasks.deploy(null, null, cookbookArchiveUrl, 
EffectorTasks.findSshMachine(), privateTmpDirContainingUnpackedCookbook,
-                    false, null, destName).newTask());
-                
-                String installCmd = BashCommands.chain(
-                    "cd "+privateTmpDirContainingUnpackedCookbook,  
-                    "COOKBOOK_EXPANDED_DIR=`ls`",
-                    BashCommands.requireTest("`ls | wc -w` -eq 1", 
-                            "The deployed archive "+cookbookArchiveUrl+" must 
contain exactly one directory"),
-                    "mv $COOKBOOK_EXPANDED_DIR '../"+cookbookName+"'",
-                    "cd ..",
-                    "rm -rf '"+privateTmpDirContainingUnpackedCookbook+"'");
-                
-                installCmd = force ? BashCommands.alternatives("rm -rf 
"+cookbookDir, installCmd) : BashCommands.alternatives("ls "+cookbookDir+" > 
/dev/null 2> /dev/null", installCmd);
-                tb.add(SshEffectorTasks.ssh(installCmd).summary("renaming 
cookbook dir").requiringExitCodeZero().newTask());
-                
-                return tb.build();
-            }
-        };
-    }
-
-    protected static String cdAndRun(String targetDirectory, String command) {
-        return BashCommands.chain("mkdir -p '"+targetDirectory+"'",
-                "cd '"+targetDirectory+"'",
-                command);
-    }
-
-    public static TaskFactory<?> buildChefFile(String runDirectory, String 
chefDirectory, String phase, Iterable<? extends String> runList,
-            Map<String, Object> optionalAttributes) {
-        // TODO if it's server, try knife first
-        // TODO configure add'l properties
-        String phaseRb = 
-            "root = "
-            + "'"+runDirectory+"'" 
-            // recommended alternate to runDir is the following, but it is not 
available in some rubies
-            //+ File.absolute_path(File.dirname(__FILE__))"+
-            + "\n"+
-            "file_cache_path root\n"+
-//            "cookbook_path root + '/cookbooks'\n";
-            "cookbook_path '"+chefDirectory+"'\n";
-
-        Map<String,Object> phaseJsonMap = MutableMap.of();
-        if (optionalAttributes!=null)
-            phaseJsonMap.putAll(optionalAttributes);
-        if (runList!=null)
-            phaseJsonMap.put("run_list", ImmutableList.copyOf(runList));
-        Gson json = new GsonBuilder().create();
-        String phaseJson = json.toJson(phaseJsonMap);
-
-        return Tasks.sequential("build chef files for "+phase,
-                    
SshEffectorTasks.put(Urls.mergePaths(runDirectory)+"/"+phase+".rb").contents(phaseRb).createDirectory(),
-                    
SshEffectorTasks.put(Urls.mergePaths(runDirectory)+"/"+phase+".json").contents(phaseJson));
-    }
-
-    public static TaskFactory<?> runChef(String runDir, String phase) {
-        // TODO chef server
-        return SshEffectorTasks.ssh(cdAndRun(runDir, "sudo chef-solo -c 
"+phase+".rb -j "+phase+".json -ldebug")).
-                summary("run chef for "+phase).requiringExitCodeZero();
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/chef/KnifeConvergeTaskFactory.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/chef/KnifeConvergeTaskFactory.java
 
b/software/base/src/main/java/brooklyn/entity/chef/KnifeConvergeTaskFactory.java
deleted file mode 100644
index f193598..0000000
--- 
a/software/base/src/main/java/brooklyn/entity/chef/KnifeConvergeTaskFactory.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.chef;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static 
org.apache.brooklyn.util.text.StringEscapes.BashStringEscapes.wrapBash;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.base.Strings;
-import com.google.common.net.HostAndPort;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.effector.core.EffectorTasks;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.collections.Jsonya;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import org.apache.brooklyn.util.ssh.BashCommands;
-
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.gson.GsonBuilder;
-
-public class KnifeConvergeTaskFactory<RET> extends KnifeTaskFactory<RET> {
-
-    private static final Logger log = 
LoggerFactory.getLogger(KnifeConvergeTaskFactory.class);
-    
-    protected Function<? super Entity,String> runList;
-    protected Map<Object, Object> knifeAttributes = new MutableMap<Object, 
Object>();
-    protected List<String> extraBootstrapParameters = MutableList.of();
-    protected Boolean sudo;
-    protected Boolean runTwice;
-    protected String nodeName;
-    protected Integer port;
-    /** null means nothing specified, use user supplied or machine default;
-     * false means use machine default (disallow user supplied);
-     * true means use knife default (omit the argument and disallow user 
supplied)
-     */
-    protected Boolean portOmittedToUseKnifeDefault;
-
-    public KnifeConvergeTaskFactory(String taskName) {
-        super(taskName);
-    }
-    
-    @Override
-    protected KnifeConvergeTaskFactory<RET> self() {
-        return this;
-    }
-    
-    /** construct the knife command, based on the settings on other methods
-     * (called when instantiating the script, after all parameters sent)
-     */
-    protected List<String> initialKnifeParameters() {
-        // runs inside the task so can detect entity/machine at runtime
-        MutableList<String> result = new MutableList<String>();
-        SshMachineLocation machine = EffectorTasks.findSshMachine();
-        
-        result.add("bootstrap");
-        result.addAll(extraBootstrapParameters);
-
-        HostAndPort hostAndPort = machine.getSshHostAndPort();
-        result.add(wrapBash(hostAndPort.getHostText()));
-        Integer whichPort = knifeWhichPort(hostAndPort);
-        if (whichPort!=null)
-            result.add("-p "+whichPort);
-
-        result.add("-x "+wrapBash(checkNotNull(machine.getUser(), "user")));
-        
-        File keyfile = ChefServerTasks.extractKeyFile(machine);
-        if (keyfile!=null) result.add("-i "+keyfile.getPath());
-        else result.add("-P "+checkNotNull(machine.findPassword(), "No 
password or private key data for "+machine));
-        
-        result.add("--no-host-key-verify");
-        
-        if (sudo != Boolean.FALSE) result.add("--sudo");
-
-        if (!Strings.isNullOrEmpty(nodeName)) {
-            result.add("--node-name");
-            result.add(nodeName);
-        }
-
-        result.add("-r "+wrapBash(runList.apply(entity())));
-        
-        if (!knifeAttributes.isEmpty())
-            result.add("-j "+wrapBash(new GsonBuilder().create()
-                    .toJson(knifeAttributes)));
-
-        return result;
-    }
-    
-    /** whether knife should attempt to run twice;
-     * see {@link ChefConfig#CHEF_RUN_CONVERGE_TWICE} */
-    public KnifeConvergeTaskFactory<RET> knifeRunTwice(boolean runTwice) {
-        this.runTwice = runTwice;
-        return self();
-    }
-    
-    /** whether to pass --sudo to knife; default true */
-    public KnifeConvergeTaskFactory<RET> knifeSudo(boolean sudo) {
-        this.sudo = sudo;
-        return self();
-    }
-
-    /** what node name to pass to knife; default = null, meaning chef-client 
will pick the node name */
-    public KnifeConvergeTaskFactory<RET> knifeNodeName(String nodeName) {
-        this.nodeName = nodeName;
-        return self();
-    }
-
-    /** tell knife to use an explicit port */
-    public KnifeConvergeTaskFactory<RET> knifePort(int port) {
-        if (portOmittedToUseKnifeDefault!=null) {
-            log.warn("Port "+port+" specified to "+this+" for when already 
explicitly told to use a default (overriding previous); see subsequent warning 
for more details");
-        }
-        this.port = port;
-        return self();
-    }
-
-    /** omit the port parameter altogether (let knife use its default) */
-    public KnifeConvergeTaskFactory<RET> knifePortUseKnifeDefault() {
-        if (port!=null) {
-            log.warn("knifePortUseKnifeDefault specified to "+this+" when 
already told to use "+port+" explicitly (overriding previous); see subsequent 
warning for more details");
-            port = -1;
-        }
-        portOmittedToUseKnifeDefault = true;
-        return self();
-    }
-    
-    /** use the default port known to brooklyn for the target machine for ssh 
*/
-    public KnifeConvergeTaskFactory<RET> knifePortUseMachineSshPort() {
-        if (port!=null) {
-            log.warn("knifePortUseMachineSshPort specified to "+this+" when 
already told to use "+port+" explicitly (overriding previous); see subsequent 
warning for more details");
-            port = -1;
-        }
-        portOmittedToUseKnifeDefault = false;
-        return self();
-    }
-    
-    protected Integer knifeWhichPort(HostAndPort hostAndPort) {
-        if (port==null) {
-            if (Boolean.TRUE.equals(portOmittedToUseKnifeDefault))
-                // user has explicitly said to use knife default, omitting 
port here
-                return null;
-            // default is to use the machine port
-            return hostAndPort.getPort();
-        }
-        if (port==-1) {
-            // port was supplied by user, then portDefault (true or false)
-            port = null;
-            Integer whichPort = knifeWhichPort(hostAndPort);
-            log.warn("knife port conflicting instructions for "+this+" at 
entity "+entity()+" on "+hostAndPort+"; using default ("+whichPort+")");
-            return whichPort;
-        }
-        if (portOmittedToUseKnifeDefault!=null) {
-            // portDefault was specified (true or false), then overridden with 
a port
-            log.warn("knife port conflicting instructions for "+this+" at 
entity "+entity()+" on "+hostAndPort+"; using supplied port "+port);
-        }
-        // port was supplied by user, use that
-        return port;
-    }
-    
-    /** parameters to pass to knife after the bootstrap command */
-    public KnifeConvergeTaskFactory<RET> 
knifeAddExtraBootstrapParameters(String extraBootstrapParameter1, String 
...extraBootstrapParameters) {
-        this.extraBootstrapParameters.add(extraBootstrapParameter1);
-        for (String p: extraBootstrapParameters)
-            this.extraBootstrapParameters.add(p);
-        return self();
-    }
-    
-    /** function supplying the run list to be passed to knife, evaluated at 
the last moment */
-    public KnifeConvergeTaskFactory<RET> knifeRunList(Function<? super Entity, 
String> runList) {
-        this.runList = runList;
-        return self();
-    }
-    public KnifeConvergeTaskFactory<RET> knifeRunList(String runList) {
-        this.runList = Functions.constant(runList);
-        return self();
-    }
-    
-    /** includes the given attributes in the attributes to be passed to chef; 
-     * when combining with other attributes, this uses {@link Jsonya} 
semantics to add 
-     * (a deep add, combining lists and maps) */
-    public KnifeConvergeTaskFactory<RET> knifeAddAttributes(Map<? extends 
Object, ? extends Object> attributes) {
-        if (attributes!=null && !attributes.isEmpty()) {
-            Jsonya.of(knifeAttributes).add(attributes);
-        }
-        return self();
-    }
-    
-    protected String buildKnifeCommand(int knifeCommandIndex) {
-        String result = super.buildKnifeCommand(knifeCommandIndex);
-        if (Boolean.TRUE.equals(runTwice))
-            result = BashCommands.alternatives(result, result);
-        return result;
-    }
-
-    @Override
-    public <T2> KnifeConvergeTaskFactory<T2> returning(ScriptReturnType type) {
-        return (KnifeConvergeTaskFactory<T2>) super.<T2>returning(type);
-    }
-
-    @Override
-    public <RET2> KnifeConvergeTaskFactory<RET2> 
returning(Function<ProcessTaskWrapper<?>, RET2> resultTransformation) {
-        return (KnifeConvergeTaskFactory<RET2>) 
super.returning(resultTransformation);
-    }
-    
-    @Override
-    public KnifeConvergeTaskFactory<Boolean> returningIsExitCodeZero() {
-        return (KnifeConvergeTaskFactory<Boolean>) 
super.returningIsExitCodeZero();
-    }
-    
-    @Override
-    public KnifeConvergeTaskFactory<String> requiringZeroAndReturningStdout() {
-        return (KnifeConvergeTaskFactory<String>) 
super.requiringZeroAndReturningStdout();
-    }
-
-    public KnifeConvergeTaskFactory<RET> knifeAddParameters(String word1, 
String ...words) {
-        super.knifeAddParameters(word1, words);
-        return self();
-    }
-
-    // TODO other methods from KnifeTaskFactory will return KTF class not KCTF;
-    // should make it generic so it returns the right type...
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java 
b/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java
deleted file mode 100644
index 80fad0e..0000000
--- a/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.chef;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.annotation.Nullable;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.core.internal.ssh.process.ProcessTool;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import 
org.apache.brooklyn.util.core.task.system.internal.SystemProcessTaskFactory;
-import org.apache.brooklyn.util.text.Strings;
-import org.apache.brooklyn.util.text.StringEscapes.BashStringEscapes;
-
-import com.google.common.base.Function;
-
-/** A factory which acts like {@link ProcessTaskFactory} with special options 
for knife.
- * Typical usage is to {@link #addKnifeParameters(String)}s for the knife 
command to be run.
- * You can also {@link #add(String...)} commands as needed; these will run 
*before* knife,
- * unless you addKnifeCommandHere().
- * <p>
- * This impl will use sensible defaults, including {@link ConfigKey}s on the 
context entity,
- * for general knife config but not specific commands etc. It supports:
- * <li> {@link ChefConfig#KNIFE_EXECUTABLE}
- * <li> {@link ChefConfig#KNIFE_CONFIG_FILE}
- * <p>
- * (Other fields will typically be used by methods calling to this factory.) 
- *  */
-// see e.g. http://docs.opscode.com/knife_bootstrap.html
-public class KnifeTaskFactory<RET> extends 
SystemProcessTaskFactory<KnifeTaskFactory<RET>, RET>{
-    
-    private static String KNIFE_PLACEHOLDER = "<knife command goes here 1234>";
-    public final String taskName;
-    protected String knifeExecutable;
-    protected List<String> knifeParameters = new ArrayList<String>();
-    protected String knifeConfigFile;
-    protected String knifeSetupCommands;
-    protected Boolean throwOnCommonKnifeErrors;
-    
-    public KnifeTaskFactory(String taskName) {
-        this.taskName = taskName;
-        summary(taskName);
-        // knife setup usually requires a login shell
-        config.put(ProcessTool.PROP_LOGIN_SHELL, true);
-    }
-    
-    @Override
-    public List<Function<ProcessTaskWrapper<?>, Void>> 
getCompletionListeners() {
-        MutableList<Function<ProcessTaskWrapper<?>, Void>> result = 
MutableList.copyOf(super.getCompletionListeners());
-        if (throwOnCommonKnifeErrors != Boolean.FALSE)
-            insertKnifeCompletionListenerIntoCompletionListenersList(result);
-        return result.asUnmodifiable();
-    }
-    
-    public KnifeTaskFactory<RET> notThrowingOnCommonKnifeErrors() {
-        throwOnCommonKnifeErrors = false;
-        return self();
-    }
-
-    protected void 
insertKnifeCompletionListenerIntoCompletionListenersList(List<Function<ProcessTaskWrapper<?>,
 Void>> listeners) {
-        // give a nice warning if chef/knife not set up correctly
-        Function<ProcessTaskWrapper<?>, Void> 
propagateIfKnifeConfigFileMissing = new Function<ProcessTaskWrapper<?>, Void>() 
{
-            public Void apply(@Nullable ProcessTaskWrapper<?> input) {
-                if (input.getExitCode()!=0 && 
input.getStderr().indexOf("WARNING: No knife configuration file found")>=0) {
-                    String myConfig = knifeConfigFileOption();
-                    if (Strings.isEmpty(myConfig))
-                        throw new IllegalStateException("Config file for Chef 
knife must be specified in "+ChefConfig.KNIFE_CONFIG_FILE+" (or valid knife 
default set up)");
-                    else
-                        throw new IllegalStateException("Error reading config 
file for Chef knife ("+myConfig+") -- does it exist?");
-                }
-                return null;
-            }
-        };
-        listeners.add(propagateIfKnifeConfigFileMissing);
-    }
-
-    
-    @Override
-    public ProcessTaskWrapper<RET> newTask() {
-        return new SystemProcessTaskWrapper("Knife");
-    }
-
-    /** Inserts the knife command at the current place in the list.
-     * Can be run multiple times. The knife command added at the end of the 
list
-     * if this is not invoked (and it is the only command if nothing is {@link 
#add(String...)}ed.
-     */
-    public KnifeTaskFactory<RET> addKnifeCommandToScript() {
-        add(KNIFE_PLACEHOLDER);
-        return self();
-    }
-    
-    @Override
-    public List<String> getCommands() {
-        MutableList<String> result = new MutableList<String>();
-        String setupCommands = knifeSetupCommands();
-        if (setupCommands != null && Strings.isNonBlank(setupCommands))
-            result.add(setupCommands);
-        int numKnifes = 0;
-        for (String c: super.getCommands()) {
-            if (c==KNIFE_PLACEHOLDER)
-                result.add(buildKnifeCommand(numKnifes++));
-            else
-                result.add(c);
-        }
-        if (numKnifes==0)
-            result.add(buildKnifeCommand(numKnifes++));
-        return result.asUnmodifiable();
-    }
-    
-    /** creates the command for running knife.
-     * in some cases knife may be added multiple times,
-     * and in that case the parameter here tells which time it is being added, 
-     * on a single run. */
-    protected String buildKnifeCommand(int knifeCommandIndex) {
-        MutableList<String> words = new MutableList<String>();
-        words.add(knifeExecutable());
-        words.addAll(initialKnifeParameters());
-        words.addAll(knifeParameters());
-        String x = knifeConfigFileOption();
-        if (Strings.isNonBlank(x)) words.add(knifeConfigFileOption());
-        return Strings.join(words, " ");
-    }
-    
-    /** allows a way for subclasses to build up parameters at the start */
-    protected List<String> initialKnifeParameters() {
-        return new MutableList<String>();
-    }
-    
-    @Nullable /** callers should allow this to be null so task can be used 
outside of an entity */
-    protected Entity entity() {
-        return BrooklynTaskTags.getTargetOrContextEntity(Tasks.current());
-    }
-    protected <T> T entityConfig(ConfigKey<T> key) {
-        Entity entity = entity();
-        if (entity!=null)
-            return entity.getConfig(key);
-        return null;
-    }
-    
-    public KnifeTaskFactory<RET> knifeExecutable(String knifeExecutable) {
-        this.knifeExecutable = knifeExecutable;
-        return this;
-    }
-    
-    protected String knifeExecutable() {
-        if (knifeExecutable!=null) return knifeExecutable;
-        
-        String knifeExecFromConfig = entityConfig(ChefConfig.KNIFE_EXECUTABLE);
-        if (knifeExecFromConfig!=null) return 
BashStringEscapes.wrapBash(knifeExecFromConfig);
-        
-        // assume on the path, if executable not set
-        return "knife";
-    }
-    
-    protected List<String> knifeParameters() {
-        return knifeParameters;
-    }
-    
-    public KnifeTaskFactory<RET> knifeAddParameters(String word1, String 
...words) {
-        knifeParameters.add(word1);
-        for (String w: words)
-            knifeParameters.add(w);
-        return self();
-    }
-
-    public KnifeTaskFactory<RET> knifeConfigFile(String knifeConfigFile) {
-        this.knifeConfigFile = knifeConfigFile;
-        return self();
-    }
-    
-    @Nullable
-    protected String knifeConfigFileOption() {
-        if (knifeConfigFile!=null) return "-c "+knifeConfigFile;
-
-        String knifeConfigFileFromConfig = 
entityConfig(ChefConfig.KNIFE_CONFIG_FILE);
-        if (knifeConfigFileFromConfig!=null) return "-c 
"+BashStringEscapes.wrapBash(knifeConfigFileFromConfig);
-
-        // if not supplied will use global config
-        return null;
-    }
-
-    public KnifeTaskFactory<RET> knifeSetupCommands(String knifeSetupCommands) 
{
-        this.knifeSetupCommands = knifeSetupCommands;
-        return self();
-    }
-    
-    @Nullable
-    protected String knifeSetupCommands() {
-        if (knifeSetupCommands!=null) return knifeSetupCommands;
-        
-        String knifeSetupCommandsFromConfig = 
entityConfig(ChefConfig.KNIFE_SETUP_COMMANDS);
-        if (knifeSetupCommandsFromConfig!=null) return 
knifeSetupCommandsFromConfig;
-        
-        // if not supplied will use global config
-        return null;
-    }
-    
-    @Override
-    public <T2> KnifeTaskFactory<T2> returning(ScriptReturnType type) {
-        return (KnifeTaskFactory<T2>) super.<T2>returning(type);
-    }
-
-    @Override
-    public <RET2> KnifeTaskFactory<RET2> 
returning(Function<ProcessTaskWrapper<?>, RET2> resultTransformation) {
-        return (KnifeTaskFactory<RET2>) super.returning(resultTransformation);
-    }
-    
-    @Override
-    public KnifeTaskFactory<Boolean> returningIsExitCodeZero() {
-        return (KnifeTaskFactory<Boolean>) super.returningIsExitCodeZero();
-    }
-    
-    @Override
-    public KnifeTaskFactory<String> requiringZeroAndReturningStdout() {
-        return (KnifeTaskFactory<String>) 
super.requiringZeroAndReturningStdout();
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/JavaAppUtils.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/java/JavaAppUtils.java 
b/software/base/src/main/java/brooklyn/entity/java/JavaAppUtils.java
deleted file mode 100644
index 42cffda..0000000
--- a/software/base/src/main/java/brooklyn/entity/java/JavaAppUtils.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.java;
-
-import static org.apache.brooklyn.util.JavaGroovyEquivalents.groovyTruth;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.MemoryUsage;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.management.openmbean.CompositeData;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.core.config.render.RendererHints;
-import org.apache.brooklyn.policy.enricher.RollingTimeWindowMeanEnricher;
-import org.apache.brooklyn.policy.enricher.TimeFractionDeltaEnricher;
-import org.apache.brooklyn.sensor.feed.http.HttpValueFunctions;
-import org.apache.brooklyn.util.math.MathFunctions;
-import org.apache.brooklyn.util.text.ByteSizeStrings;
-import org.apache.brooklyn.util.time.Duration;
-import org.apache.brooklyn.util.time.Time;
-
-import brooklyn.event.feed.jmx.JmxAttributePollConfig;
-import brooklyn.event.feed.jmx.JmxFeed;
-
-import com.google.common.base.Function;
-
-public class JavaAppUtils {
-
-    public static boolean isEntityMxBeanStatsEnabled(Entity entity) {
-        return 
groovyTruth(entity.getConfig(UsesJavaMXBeans.MXBEAN_STATS_ENABLED));
-    }
-
-    /**
-     * @see #connectJavaAppServerPolicies(EntityLocal, Duration)
-     * @see #getMxBeanSensorsBuilder(EntityLocal)
-     */
-    @Nullable
-    public static JmxFeed connectMXBeanSensors(EntityLocal entity) {
-        if (isEntityMxBeanStatsEnabled(entity)) {
-            return getMxBeanSensorsBuilder(entity).build();
-        } else {
-            return null;
-        }
-    }
-
-    /** @see #connectJavaAppServerPolicies(EntityLocal, Duration) */
-    @Nullable
-    public static JmxFeed connectMXBeanSensors(EntityLocal entity, long 
jmxPollPeriodMs) {
-        if (isEntityMxBeanStatsEnabled(entity)) {
-            return getMxBeanSensorsBuilder(entity, jmxPollPeriodMs).build();
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * @param entity The entity at which to poll
-     * @param jmxPollPeriod How often to poll
-     * @return A {@link JmxFeed} configured to poll the given entity at the 
given period,
-     *         or null if the entity is not configured for MXBEAN_STATS
-     * @see brooklyn.entity.java.UsesJavaMXBeans#MXBEAN_STATS_ENABLED
-     */
-    @Nullable
-    public static JmxFeed connectMXBeanSensors(EntityLocal entity, Duration 
jmxPollPeriod) {
-        if (isEntityMxBeanStatsEnabled(entity)) {
-            return getMxBeanSensorsBuilder(entity, jmxPollPeriod).build();
-        } else {
-            return null;
-        }
-    }
-    
-    public static void connectJavaAppServerPolicies(EntityLocal entity) {
-        connectJavaAppServerPolicies(entity, Duration.TEN_SECONDS);
-    }
-
-    public static void connectJavaAppServerPolicies(EntityLocal entity, 
Duration windowPeriod) {
-        entity.addEnricher(new TimeFractionDeltaEnricher<Double>(entity, 
UsesJavaMXBeans.PROCESS_CPU_TIME, 
-                UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST, 
TimeUnit.MILLISECONDS));
-
-        entity.addEnricher(new RollingTimeWindowMeanEnricher<Double>(entity,
-                UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST, 
UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_IN_WINDOW,
-                windowPeriod));
-    }
-
-    /**
-     * @param entity The entity at which to poll
-     * @return A {@link JmxFeed.Builder} configured to poll entity every ten 
seconds
-     * @see #getMxBeanSensorsBuilder(EntityLocal, Duration)
-     */
-    @Nonnull
-    public static JmxFeed.Builder getMxBeanSensorsBuilder(EntityLocal entity) {
-        return getMxBeanSensorsBuilder(entity, Duration.TEN_SECONDS);
-    }
-
-    /** @see #getMxBeanSensorsBuilder(EntityLocal, Duration) */
-    @Nonnull
-    public static JmxFeed.Builder getMxBeanSensorsBuilder(EntityLocal entity, 
long jmxPollPeriod) {
-        return getMxBeanSensorsBuilder(entity, Duration.millis(jmxPollPeriod));
-    }
-
-    /**
-     * @param entity The entity at which to poll
-     * @param jmxPollPeriod How often to poll
-     * @return A {@link JmxFeed.Builder} configured to poll many interesting 
MXBeans
-     *         at the given entity and to repeat according to the given poll 
period.
-     *         <p/>
-     *         If an entity does not have MXBean stats enabled (i.e. {@link 
UsesJavaMXBeans#MXBEAN_STATS_ENABLED} is
-     *         configured to false) then returns a builder configured with 
entity and duration but no polls.
-     *         <p/>
-     *         Use {@link #connectMXBeanSensors(EntityLocal, Duration)} to 
create and build in one step.
-     */
-    @Nonnull
-    @SuppressWarnings({"unchecked"})
-    public static JmxFeed.Builder getMxBeanSensorsBuilder(EntityLocal entity, 
Duration jmxPollPeriod) {
-        JmxFeed.Builder builder = JmxFeed.builder()
-                .entity(entity)
-                .period(jmxPollPeriod);
-        if (isEntityMxBeanStatsEnabled(entity)) {
-            // TODO Could we reuse the result of compositeDataToMemoryUsage?
-            builder
-                .pollAttribute(new 
JmxAttributePollConfig<Long>(UsesJavaMXBeans.USED_HEAP_MEMORY)
-                        .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
-                        .attributeName("HeapMemoryUsage")
-                        .onSuccess((Function) 
HttpValueFunctions.chain(compositeDataToMemoryUsage(), new 
Function<MemoryUsage, Long>() {
-                            @Override public Long apply(MemoryUsage input) {
-                                return (input == null) ? null : 
input.getUsed();
-                            }})))
-                .pollAttribute(new 
JmxAttributePollConfig<Long>(UsesJavaMXBeans.INIT_HEAP_MEMORY)
-                        .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
-                        .attributeName("HeapMemoryUsage")
-                        .onSuccess((Function) 
HttpValueFunctions.chain(compositeDataToMemoryUsage(), new 
Function<MemoryUsage, Long>() {
-                            @Override public Long apply(MemoryUsage input) {
-                                return (input == null) ? null : 
input.getInit();
-                            }})))
-                .pollAttribute(new 
JmxAttributePollConfig<Long>(UsesJavaMXBeans.COMMITTED_HEAP_MEMORY)
-                        .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
-                        .attributeName("HeapMemoryUsage")
-                        .onSuccess((Function) 
HttpValueFunctions.chain(compositeDataToMemoryUsage(), new 
Function<MemoryUsage, Long>() {
-                            @Override public Long apply(MemoryUsage input) {
-                                return (input == null) ? null : 
input.getCommitted();
-                            }})))
-                .pollAttribute(new 
JmxAttributePollConfig<Long>(UsesJavaMXBeans.MAX_HEAP_MEMORY)
-                        .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
-                        .attributeName("HeapMemoryUsage")
-                        .onSuccess((Function) 
HttpValueFunctions.chain(compositeDataToMemoryUsage(), new 
Function<MemoryUsage, Long>() {
-                            @Override public Long apply(MemoryUsage input) {
-                                return (input == null) ? null : input.getMax();
-                            }})))
-                .pollAttribute(new 
JmxAttributePollConfig<Long>(UsesJavaMXBeans.NON_HEAP_MEMORY_USAGE)
-                        .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
-                        .attributeName("NonHeapMemoryUsage")
-                        .onSuccess((Function) 
HttpValueFunctions.chain(compositeDataToMemoryUsage(), new 
Function<MemoryUsage, Long>() {
-                            @Override public Long apply(MemoryUsage input) {
-                                return (input == null) ? null : 
input.getUsed();
-                            }})))
-
-                .pollAttribute(new 
JmxAttributePollConfig<Integer>(UsesJavaMXBeans.CURRENT_THREAD_COUNT)
-                        .objectName(ManagementFactory.THREAD_MXBEAN_NAME)
-                        .attributeName("ThreadCount"))
-                .pollAttribute(new 
JmxAttributePollConfig<Integer>(UsesJavaMXBeans.PEAK_THREAD_COUNT)
-                        .objectName(ManagementFactory.THREAD_MXBEAN_NAME)
-                        .attributeName("PeakThreadCount"))
-
-                .pollAttribute(new 
JmxAttributePollConfig<Long>(UsesJavaMXBeans.START_TIME)
-                        .objectName(ManagementFactory.RUNTIME_MXBEAN_NAME)
-                        .period(60, TimeUnit.SECONDS)
-                        .attributeName("StartTime"))
-                .pollAttribute(new 
JmxAttributePollConfig<Long>(UsesJavaMXBeans.UP_TIME)
-                        .objectName(ManagementFactory.RUNTIME_MXBEAN_NAME)
-                        .period(60, TimeUnit.SECONDS)
-                        .attributeName("Uptime"))
-
-                .pollAttribute(new 
JmxAttributePollConfig<Double>(UsesJavaMXBeans.PROCESS_CPU_TIME)
-                        
.objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
-                        .attributeName("ProcessCpuTime")
-                        .onSuccess((Function) 
MathFunctions.times(0.001*0.001)))   // nanos to millis
-                .pollAttribute(new 
JmxAttributePollConfig<Double>(UsesJavaMXBeans.SYSTEM_LOAD_AVERAGE)
-                        
.objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
-                        .attributeName("SystemLoadAverage"))
-                .pollAttribute(new 
JmxAttributePollConfig<Integer>(UsesJavaMXBeans.AVAILABLE_PROCESSORS)
-                        
.objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
-                        .period(60, TimeUnit.SECONDS)
-                        .attributeName("AvailableProcessors"))
-                .pollAttribute(new 
JmxAttributePollConfig<Long>(UsesJavaMXBeans.TOTAL_PHYSICAL_MEMORY_SIZE)
-                        
.objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
-                        .period(60, TimeUnit.SECONDS)
-                        .attributeName("TotalPhysicalMemorySize"))
-                .pollAttribute(new 
JmxAttributePollConfig<Long>(UsesJavaMXBeans.FREE_PHYSICAL_MEMORY_SIZE)
-                        
.objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
-                        .period(60, TimeUnit.SECONDS)
-                        .attributeName("FreePhysicalMemorySize"));
-         //FIXME: need a new type of adapter that maps multiple objectNames to 
a mapping
-         // 
jmxAdapter.objectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + 
",*").with {
-         //     
attribute("SystemLoadAverage").subscribe(UsesJavaMXBeans.GARBAGE_COLLECTION_TIME,
 { def m -> log.info("XXXXXXX $m") });
-         // }
-        }
-        return builder;
-    }
-
-    /** @deprecated Since 0.7.0. Use {@link 
org.apache.brooklyn.util.math.MathFunctions#times(double)} instead */
-    @Deprecated
-    public static Function<Number, Double> times(final double x) {
-        return MathFunctions.times(x);
-    }
-
-    public static Function<CompositeData, MemoryUsage> 
compositeDataToMemoryUsage() {
-        return new Function<CompositeData, MemoryUsage>() {
-            @Override public MemoryUsage apply(CompositeData input) {
-                return (input == null) ? null : MemoryUsage.from(input);
-            }
-        };
-    }
-
-    private static final AtomicBoolean initialized = new AtomicBoolean(false);
-
-    /** Setup renderer hints for the MXBean attributes. */
-    public static void init() {
-        if (initialized.get()) return;
-        synchronized (initialized) {
-            if (initialized.get()) return;
-
-            RendererHints.register(UsesJavaMXBeans.USED_HEAP_MEMORY, 
RendererHints.displayValue(ByteSizeStrings.metric()));
-            RendererHints.register(UsesJavaMXBeans.INIT_HEAP_MEMORY, 
RendererHints.displayValue(ByteSizeStrings.metric()));
-            RendererHints.register(UsesJavaMXBeans.MAX_HEAP_MEMORY, 
RendererHints.displayValue(ByteSizeStrings.metric()));
-            RendererHints.register(UsesJavaMXBeans.COMMITTED_HEAP_MEMORY, 
RendererHints.displayValue(ByteSizeStrings.metric()));
-            RendererHints.register(UsesJavaMXBeans.NON_HEAP_MEMORY_USAGE, 
RendererHints.displayValue(ByteSizeStrings.metric()));
-            RendererHints.register(UsesJavaMXBeans.TOTAL_PHYSICAL_MEMORY_SIZE, 
RendererHints.displayValue(ByteSizeStrings.metric()));
-            RendererHints.register(UsesJavaMXBeans.FREE_PHYSICAL_MEMORY_SIZE, 
RendererHints.displayValue(ByteSizeStrings.metric()));
-
-            RendererHints.register(UsesJavaMXBeans.START_TIME, 
RendererHints.displayValue(Time.toDateString()));
-            RendererHints.register(UsesJavaMXBeans.UP_TIME, 
RendererHints.displayValue(Duration.millisToStringRounded()));
-            RendererHints.register(UsesJavaMXBeans.PROCESS_CPU_TIME, 
RendererHints.displayValue(Duration.millisToStringRounded()));
-            
RendererHints.register(UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST, 
RendererHints.displayValue(MathFunctions.percent(4)));
-            
RendererHints.register(UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_IN_WINDOW, 
RendererHints.displayValue(MathFunctions.percent(4)));
-
-            initialized.set(true);
-        }
-    }
-
-    static {
-        init();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/JavaEntityMethods.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/java/JavaEntityMethods.java 
b/software/base/src/main/java/brooklyn/entity/java/JavaEntityMethods.java
deleted file mode 100644
index a9fad73..0000000
--- a/software/base/src/main/java/brooklyn/entity/java/JavaEntityMethods.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.java;
-
-import org.apache.brooklyn.config.ConfigKey;
-
-/** DSL conveniences for Java entities. Also see {@link JavaAppUtils} for 
methods useful within Java classes. */
-public class JavaEntityMethods {
-
-    public static ConfigKey<String> javaSysProp(String propertyName) { return 
UsesJava.JAVA_SYSPROPS.subKey(propertyName); }
-    
-    // TODO javaMaxHeap javaInitialHeap javaMaxPermGen should all be supplied 
as ListConfigs on JAVA_OPTIONS
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessDriver.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessDriver.java
 
b/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessDriver.java
deleted file mode 100644
index 890403f..0000000
--- 
a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessDriver.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.java;
-
-import brooklyn.entity.basic.SoftwareProcessDriver;
-
-/**
- * A {@link SoftwareProcessDriver} for Java processes.
- */
-public interface JavaSoftwareProcessDriver extends SoftwareProcessDriver {
-
-    public boolean isJmxEnabled();
-        
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java
 
b/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java
deleted file mode 100644
index 178d48f..0000000
--- 
a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package brooklyn.entity.java;
-
-import static org.apache.brooklyn.util.JavaGroovyEquivalents.groovyTruth;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.effector.core.EffectorTasks;
-import org.apache.brooklyn.entity.core.Attributes;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.entity.core.EntityInternal;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.base.Optional;
-import com.google.common.base.Splitter;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.gson.internal.Primitives;
-
-import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
-import brooklyn.entity.software.SshEffectorTasks;
-
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.collections.MutableSet;
-import org.apache.brooklyn.util.core.flags.TypeCoercions;
-import org.apache.brooklyn.util.core.internal.ssh.ShellTool;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.core.task.ssh.SshTasks;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.ssh.BashCommands;
-import org.apache.brooklyn.util.text.Strings;
-import org.apache.brooklyn.util.text.StringEscapes.BashStringEscapes;
-
-/**
- * The SSH implementation of the {@link 
brooklyn.entity.java.JavaSoftwareProcessDriver}.
- */
-public abstract class JavaSoftwareProcessSshDriver extends 
AbstractSoftwareProcessSshDriver implements JavaSoftwareProcessDriver {
-
-    public static final Logger log = 
LoggerFactory.getLogger(JavaSoftwareProcessSshDriver.class);
-
-    public static final List<List<String>> MUTUALLY_EXCLUSIVE_OPTS = 
ImmutableList.<List<String>> of(ImmutableList.of("-client",
-            "-server"));
-
-    public static final List<String> KEY_VAL_OPT_PREFIXES = 
ImmutableList.of("-Xmx", "-Xms", "-Xss");
-
-    public JavaSoftwareProcessSshDriver(EntityLocal entity, SshMachineLocation 
machine) {
-        super(entity, machine);
-
-        entity.setAttribute(Attributes.LOG_FILE_LOCATION, 
getLogFileLocation());
-    }
-
-    protected abstract String getLogFileLocation();
-
-    public boolean isJmxEnabled() {
-        return (entity instanceof UsesJmx) && 
(entity.getConfig(UsesJmx.USE_JMX));
-    }
-
-    public boolean isJmxSslEnabled() {
-        return isJmxEnabled() && 
groovyTruth(entity.getConfig(UsesJmx.JMX_SSL_ENABLED));
-    }
-
-    /**
-     * Sets all JVM options (-X.. -D..) in an environment var JAVA_OPTS.
-     * <p>
-     * That variable is constructed from {@link #getJavaOpts()}, then wrapped 
_unescaped_ in double quotes. An
-     * error is thrown if there is an unescaped double quote in the string. 
All other unescaped
-     * characters are permitted, but unless $var expansion or `command` 
execution is desired (although
-     * this is not confirmed as supported) the generally caller should escape 
any such characters, for
-     * example using {@link 
BashStringEscapes#escapeLiteralForDoubleQuotedBash(String)}.
-     */
-    @Override
-    public Map<String, String> getShellEnvironment() {
-        List<String> javaOpts = getJavaOpts();
-
-        for (String it : javaOpts) {
-            BashStringEscapes.assertValidForDoubleQuotingInBash(it);
-        }
-        // do not double quote here; the env var is double quoted subsequently;
-        // spaces should be preceded by double-quote
-        // (if dbl quotes are needed we could pass on the command-line instead 
of in an env var)
-        String sJavaOpts = Joiner.on(' ').join(javaOpts);
-        return MutableMap.<String, 
String>builder().putAll(super.getShellEnvironment()).put("JAVA_OPTS", 
sJavaOpts).build();
-    }
-
-    /**
-     * arguments to pass to the JVM; this is the config options (e.g. 
-Xmx1024; only the contents of
-     * {@link #getCustomJavaConfigOptions()} by default) and java system 
properties (-Dk=v; add custom
-     * properties in {@link #getCustomJavaSystemProperties()})
-     * <p>
-     * See {@link #getShellEnvironment()} for discussion of quoting/escaping 
strategy.
-     **/
-    public List<String> getJavaOpts() {
-        Iterable<String> sysprops = 
Iterables.transform(getJavaSystemProperties().entrySet(),
-                new Function<Map.Entry<String, ?>, String>() {
-                    public String apply(Map.Entry<String, ?> entry) {
-                        String k = entry.getKey();
-                        Object v = entry.getValue();
-                        try {
-                            if (v != null && 
Primitives.isWrapperType(v.getClass())) {
-                                v = "" + v;
-                            } else {
-                                v = Tasks.resolveValue(v, Object.class, 
((EntityInternal)entity).getExecutionContext());
-                                if (v == null) {
-                                } else if (v instanceof CharSequence) {
-                                } else if 
(TypeCoercions.isPrimitiveOrBoxer(v.getClass())) {
-                                    v = "" + v;
-                                } else {
-                                    // could do toString, but that's likely 
not what is desired;
-                                    // probably a type mismatch,
-                                    // post-processing should be specified 
(common types are accepted
-                                    // above)
-                                    throw new IllegalArgumentException("cannot 
convert value " + v + " of type " + v.getClass()
-                                            + " to string to pass as JVM 
property; use a post-processor");
-                                }
-                            }
-                            return "-D" + k + (v != null ? "=" + v : "");
-                        } catch (Exception e) {
-                            log.warn("Error resolving java option key {}, 
propagating: {}", k, e);
-                            throw Throwables.propagate(e);
-                        }
-                    }
-                });
-
-        Set<String> result = MutableSet.<String> builder().
-                addAll(getJmxJavaConfigOptions()).
-                addAll(getCustomJavaConfigOptions()).
-                addAll(sysprops).
-            build();
-
-        for (String customOpt : entity.getConfig(UsesJava.JAVA_OPTS)) {
-            for (List<String> mutuallyExclusiveOpt : MUTUALLY_EXCLUSIVE_OPTS) {
-                if (mutuallyExclusiveOpt.contains(customOpt)) {
-                    result.removeAll(mutuallyExclusiveOpt);
-                }
-            }
-            for (String keyValOptPrefix : KEY_VAL_OPT_PREFIXES) {
-                if (customOpt.startsWith(keyValOptPrefix)) {
-                    for (Iterator<String> iter = result.iterator(); 
iter.hasNext();) {
-                        String existingOpt = iter.next();
-                        if (existingOpt.startsWith(keyValOptPrefix)) {
-                            iter.remove();
-                        }
-                    }
-                }
-            }
-            if (customOpt.contains("=")) {
-                String customOptPrefix = customOpt.substring(0, 
customOpt.indexOf("="));
-
-                for (Iterator<String> iter = result.iterator(); 
iter.hasNext();) {
-                    String existingOpt = iter.next();
-                    if (existingOpt.startsWith(customOptPrefix)) {
-                        iter.remove();
-                    }
-                }
-            }
-            result.add(customOpt);
-        }
-
-        return ImmutableList.copyOf(result);
-    }
-
-    /**
-     * Returns the complete set of Java system properties (-D defines) to set 
for the application.
-     * <p>
-     * This is exposed to the JVM as the contents of the {@code JAVA_OPTS} 
environment variable. Default
-     * set contains config key, custom system properties, and JMX defines.
-     * <p>
-     * Null value means to set -Dkey otherwise it is -Dkey=value.
-     * <p>
-     * See {@link #getShellEnvironment()} for discussion of quoting/escaping 
strategy.
-     */
-    protected Map<String,?> getJavaSystemProperties() {
-        return MutableMap.<String,Object>builder()
-                .putAll(getCustomJavaSystemProperties())
-                .putAll(isJmxEnabled() ? getJmxJavaSystemProperties() : 
Collections.<String,Object>emptyMap())
-                .putAll(entity.getConfig(UsesJava.JAVA_SYSPROPS))
-                .build();
-    }
-
-    /**
-     * Return extra Java system properties (-D defines) used by the 
application.
-     *
-     * Override as needed; default is an empty map.
-     */
-    protected Map getCustomJavaSystemProperties() {
-        return Maps.newLinkedHashMap();
-    }
-
-    /**
-     * Return extra Java config options, ie arguments starting with - which 
are passed to the JVM prior
-     * to the class name.
-     * <p>
-     * Note defines are handled separately, in {@link 
#getCustomJavaSystemProperties()}.
-     * <p>
-     * Override as needed; default is an empty list.
-     */
-    protected List<String> getCustomJavaConfigOptions() {
-        return Lists.newArrayList();
-    }
-
-    /** @deprecated since 0.6.0, the config key is always used instead of this 
*/ @Deprecated
-    public Integer getJmxPort() {
-        return !isJmxEnabled() ? Integer.valueOf(-1) : 
entity.getAttribute(UsesJmx.JMX_PORT);
-    }
-
-    /** @deprecated since 0.6.0, the config key is always used instead of this 
*/ @Deprecated
-    public Integer getRmiRegistryPort() {
-        return !isJmxEnabled() ? -1 : 
entity.getAttribute(UsesJmx.RMI_REGISTRY_PORT);
-    }
-
-    /** @deprecated since 0.6.0, the config key is always used instead of this 
*/ @Deprecated
-    public String getJmxContext() {
-        return !isJmxEnabled() ? null : 
entity.getAttribute(UsesJmx.JMX_CONTEXT);
-    }
-
-    /**
-     * Return the configuration properties required to enable JMX for a Java 
application.
-     *
-     * These should be set as properties in the {@code JAVA_OPTS} environment 
variable when calling the
-     * run script for the application.
-     */
-    protected Map<String, ?> getJmxJavaSystemProperties() {
-        MutableMap.Builder<String, Object> result = MutableMap.<String, 
Object> builder();
-
-        if (isJmxEnabled()) {
-            new JmxSupport(getEntity(), 
getRunDir()).applyJmxJavaSystemProperties(result);
-        }
-
-        return result.build();
-    }
-
-    /**
-     * Return any JVM arguments required, other than the -D defines returned 
by {@link #getJmxJavaSystemProperties()}
-     */
-    protected List<String> getJmxJavaConfigOptions() {
-        List<String> result = new ArrayList<String>();
-        if (isJmxEnabled()) {
-            result.addAll(new JmxSupport(getEntity(), 
getRunDir()).getJmxJavaConfigOptions());
-        }
-        return result;
-    }
-
-    /**
-     * Checks for the presence of Java on the entity's location, installing if 
necessary.
-     * @return true if the required version of Java was found on the machine 
or if it was installed correctly,
-     * otherwise false.
-     */
-    protected boolean checkForAndInstallJava(String requiredVersion) {
-        int requiredJavaMinor;
-        if (requiredVersion.contains(".")) {
-            List<String> requiredVersionParts = 
Splitter.on(".").splitToList(requiredVersion);
-            requiredJavaMinor = Integer.valueOf(requiredVersionParts.get(1));
-        } else if (requiredVersion.length() == 1) {
-            requiredJavaMinor = Integer.valueOf(requiredVersion);
-        } else {
-            log.error("java version required {} is not supported", 
requiredVersion);
-            throw new IllegalArgumentException("Required java version " + 
requiredVersion + " not supported");
-        }
-        Optional<String> installedJavaVersion = getInstalledJavaVersion();
-        if (installedJavaVersion.isPresent()) {
-            List<String> installedVersionParts = 
Splitter.on(".").splitToList(installedJavaVersion.get());
-            int javaMajor = Integer.valueOf(installedVersionParts.get(0));
-            int javaMinor = Integer.valueOf(installedVersionParts.get(1));
-            if (javaMajor == 1 && javaMinor >= requiredJavaMinor) {
-                log.debug("Java {} already installed at {}@{}", new 
Object[]{installedJavaVersion.get(), getEntity(), getLocation()});
-                return true;
-            }
-        }
-        return tryJavaInstall(requiredVersion, 
BashCommands.installJava(requiredJavaMinor)) == 0;
-    }
-
-    protected int tryJavaInstall(String version, String command) {
-        getLocation().acquireMutex("installing", "installing Java at " + 
getLocation());
-        try {
-            log.debug("Installing Java {} at {}@{}", new Object[]{version, 
getEntity(), getLocation()});
-            ProcessTaskFactory<Integer> taskFactory = 
SshTasks.newSshExecTaskFactory(getLocation(), command)
-                    .summary("install java ("+version+")")
-                    .configure(ShellTool.PROP_EXEC_ASYNC, true);
-            ProcessTaskWrapper<Integer> installCommand = 
Entities.submit(getEntity(), taskFactory);
-            int result = installCommand.get();
-            if (result != 0) {
-                log.warn("Installation of Java {} failed at {}@{}: {}",
-                        new Object[]{version, getEntity(), getLocation(), 
installCommand.getStderr()});
-            }
-            return result;
-        } finally {
-            getLocation().releaseMutex("installing");
-        }
-    }
-
-    /**
-    * @deprecated since 0.7.0; instead use {@link #getInstalledJavaVersion()}
-    */
-    @Deprecated
-    protected Optional<String> getCurrentJavaVersion() {
-        return getInstalledJavaVersion();
-    }
-
-    /**
-     * Checks for the version of Java installed on the entity's location over 
SSH.
-     * @return An Optional containing the version portion of `java -version`, 
or absent if no Java found.
-     */
-    protected Optional<String> getInstalledJavaVersion() {
-        log.debug("Checking Java version at {}@{}", getEntity(), 
getLocation());
-        // sed gets stdin like 'java version "1.7.0_45"'
-        ProcessTaskWrapper<Integer> versionCommand = 
Entities.submit(getEntity(), SshTasks.newSshExecTaskFactory(
-                getLocation(), "java -version 2>&1 | grep \" version\" | sed 
's/.*\"\\(.*\\).*\"/\\1/'"));
-        versionCommand.get();
-        String stdOut = versionCommand.getStdout().trim();
-        if (!Strings.isBlank(stdOut)) {
-            log.debug("Found Java version at {}@{}: {}", new Object[] 
{getEntity(), getLocation(), stdOut});
-            return Optional.of(stdOut);
-        } else {
-            log.debug("Found no Java installed at {}@{}", getEntity(), 
getLocation());
-            return Optional.absent();
-        }
-    }
-
-    /**
-     * Answers one of "OpenJDK", "Oracle", or other vendor info.
-     */
-    protected Optional<String> getCurrentJavaVendor() {
-        // TODO Also handle IBM jvm
-        log.debug("Checking Java vendor at {}@{}", getEntity(), getLocation());
-        ProcessTaskWrapper<Integer> versionCommand = 
Entities.submit(getEntity(), SshTasks.newSshExecTaskFactory(
-                getLocation(), "java -version 2>&1 | awk 'NR==2 {print $1}'"));
-        versionCommand.get();
-        String stdOut = versionCommand.getStdout().trim();
-        if (Strings.isBlank(stdOut)) {
-            log.debug("Found no Java installed at {}@{}", getEntity(), 
getLocation());
-            return Optional.absent();
-        } else if ("Java(TM)".equals(stdOut)) {
-            log.debug("Found Java version at {}@{}: {}", new Object[] 
{getEntity(), getLocation(), stdOut});
-            return Optional.of("Oracle");
-        } else {
-            return Optional.of(stdOut);
-        }
-    }
-
-    /**
-     * Checks for Java 6 or 7, installing Java 7 if neither are found. 
Override this method to
-     * check for and install specific versions of Java.
-     *
-     * @see #checkForAndInstallJava(String)
-     */
-    public boolean installJava() {
-        if (entity instanceof UsesJava) {
-            String version = entity.getConfig(UsesJava.JAVA_VERSION_REQUIRED);
-            return checkForAndInstallJava(version);
-        }
-        // by default it installs jdk7
-        return checkForAndInstallJava("1.7");
-    }
-
-    public void installJmxSupport() {
-        if (isJmxEnabled()) {
-            newScript("JMX_SETUP_PREINSTALL").body.append("mkdir -p 
"+getRunDir()).execute();
-            new JmxSupport(getEntity(), getRunDir()).install();
-        }
-    }
-
-    public void checkJavaHostnameBug() {
-        checkNoHostnameBug();
-
-        try {
-            ProcessTaskWrapper<Integer> hostnameTask = 
DynamicTasks.queue(SshEffectorTasks.ssh("echo FOREMARKER; hostname -f; echo 
AFTMARKER")).block();
-            String stdout = 
Strings.getFragmentBetween(hostnameTask.getStdout(), "FOREMARKER", "AFTMARKER");
-            if (hostnameTask.getExitCode() == 0 && Strings.isNonBlank(stdout)) 
{
-                String hostname = stdout.trim();
-                Integer len = hostname.length();
-                if (len > 63) {
-                    // likely to cause a java crash due to java bug 7089443 -- 
set a new short hostname
-                    // 
http://mail.openjdk.java.net/pipermail/net-dev/2012-July/004603.html
-                    String newHostname = 
"br-"+getEntity().getId().toLowerCase();
-                    log.info("Detected likelihood of Java hostname bug with 
hostname length "+len+" for "+getEntity()+"; renaming "+getMachine()+"  to 
hostname "+newHostname);
-                    
DynamicTasks.queue(SshEffectorTasks.ssh(BashCommands.setHostname(newHostname, 
null))).block();
-                }
-            } else {
-                log.debug("Hostname length could not be determined for 
location "+EffectorTasks.findSshMachine()+"; not doing Java hostname bug 
check");
-            }
-        } catch (Exception e) {
-            Exceptions.propagateIfFatal(e);
-            log.warn("Error checking/fixing Java hostname bug (continuing): 
"+e, e);
-        }
-    }
-
-    @Override
-    public void setup() {
-        DynamicTasks.queue("install java", new Runnable() { public void run() {
-            installJava();
-        }});
-
-        // TODO check java version
-
-        if (getEntity().getConfig(UsesJava.CHECK_JAVA_HOSTNAME_BUG)) {
-            DynamicTasks.queue("check java hostname bug", new Runnable() { 
public void run() {
-                checkJavaHostnameBug(); }});
-        }
-    }
-
-    @Override
-    public void copyRuntimeResources() {
-        super.copyRuntimeResources();
-
-        if (isJmxEnabled()) {
-            DynamicTasks.queue("install jmx", new Runnable() { public void 
run() {
-                installJmxSupport(); }});
-        }
-    }
-
-}

Reply via email to