You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2015/08/19 23:20:55 UTC

[21/62] [abbrv] incubator-brooklyn git commit: rename core’s o.a.b.entity to o.a.b.core.entity

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/ReflectiveEntityDriverFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/ReflectiveEntityDriverFactory.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/ReflectiveEntityDriverFactory.java
deleted file mode 100644
index 0e54806..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/ReflectiveEntityDriverFactory.java
+++ /dev/null
@@ -1,277 +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 org.apache.brooklyn.entity.drivers;
-
-import java.lang.reflect.Constructor;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.drivers.DriverDependentEntity;
-import org.apache.brooklyn.api.entity.drivers.EntityDriver;
-import org.apache.brooklyn.api.location.Location;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.paas.PaasLocation;
-import org.apache.brooklyn.location.ssh.SshMachineLocation;
-import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.exceptions.ReferenceWithError;
-import org.apache.brooklyn.util.text.Strings;
-
-/**
- * Follows a class naming convention: the driver interface typically ends in "Driver", and the implementation 
- * must match the driver interface name but with a suffix like "SshDriver" instead of "Driver".
- * Other rules can be added using {@link #addRule(String, DriverInferenceRule)} or
- * {@link #addClassFullNameMapping(String, String)}.
- * <p>
- * Reflectively instantiates and returns the driver, based on the location passed in,
- * in {@link #build(DriverDependentEntity, Location)}.
- * 
- * @author Peter Veentjer, Alex Heneveld
- */
-public class ReflectiveEntityDriverFactory {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ReflectiveEntityDriverFactory.class);
-
-    /** Rules, keyed by a unique identifier.  Executed in order of most-recently added first. */
-    protected final Map<String,DriverInferenceRule> rules = MutableMap.of();
-    
-    public ReflectiveEntityDriverFactory() {
-        addRule(DriverInferenceForSshLocation.DEFAULT_IDENTIFIER, new DriverInferenceForSshLocation());
-        addRule(DriverInferenceForPaasLocation.DEFAULT_IDENTIFIER, new DriverInferenceForPaasLocation());
-        addRule(DriverInferenceForWinRmLocation.DEFAULT_IDENTIFIER, new DriverInferenceForWinRmLocation());
-    }
-    
-    public interface DriverInferenceRule {
-        public <D extends EntityDriver> ReferenceWithError<Class<? extends D>> resolve(DriverDependentEntity<D> entity, Class<D> driverInterface, Location location);
-    }
-
-    public static abstract class AbstractDriverInferenceRule implements DriverInferenceRule {
-
-        @Override
-        public <D extends EntityDriver> ReferenceWithError<Class<? extends D>> resolve(DriverDependentEntity<D> entity, Class<D> driverInterface, Location location) {
-            try {
-                String newName = inferDriverClassName(entity, driverInterface, location);
-                if (newName==null) return null;
-
-                return loadDriverClass(newName, entity, driverInterface);
-                
-            } catch (Exception e) {
-                Exceptions.propagateIfFatal(e);
-                return ReferenceWithError.newInstanceThrowingError(null, e);
-            }
-        }
-
-        public abstract <D extends EntityDriver> String inferDriverClassName(DriverDependentEntity<D> entity, Class<D> driverInterface, Location location);
-
-        protected <D extends EntityDriver> ReferenceWithError<Class<? extends D>> loadDriverClass(String className, DriverDependentEntity<D> entity, Class<D> driverInterface) {
-            ReferenceWithError<Class<? extends D>> r1 = loadClass(className, entity.getClass().getClassLoader());
-            if (!r1.hasError()) return r1;
-            ReferenceWithError<Class<? extends D>> r2 = loadClass(className, driverInterface.getClass().getClassLoader());
-            if (!r2.hasError()) return r2;
-            return r1;
-        }
-
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        protected <D extends EntityDriver> ReferenceWithError<Class<? extends D>> loadClass(String className, ClassLoader classLoader) {
-            try {
-                return (ReferenceWithError<Class<? extends D>>)(ReferenceWithError) ReferenceWithError.newInstanceWithoutError((Class<? extends EntityDriver>)classLoader.loadClass(className));
-            } catch (Exception e) {
-                Exceptions.propagateIfFatal(e);
-                return ReferenceWithError.newInstanceThrowingError(null, e);
-            }
-        }
-    }
-    
-    public static abstract class AbstractDriverInferenceRenamingInferenceRule extends AbstractDriverInferenceRule {
-
-        protected final String expectedPattern;
-        protected final String replacement;
-
-        public AbstractDriverInferenceRenamingInferenceRule(String expectedPattern, String replacement) {
-            this.expectedPattern = expectedPattern;
-            this.replacement = replacement;
-        }
-        
-        public String getIdentifier() {
-            return getClass().getName()+"["+expectedPattern+"]";
-        }
-        
-        @Override
-        public String toString() {
-            return getClass().getName()+"["+expectedPattern+"->"+replacement+"]";
-        }
-    }
-    
-    public static class DriverInferenceByRenamingClassFullName extends AbstractDriverInferenceRenamingInferenceRule {
-
-        public DriverInferenceByRenamingClassFullName(String expectedClassFullName, String newClassFullName) {
-            super(expectedClassFullName, newClassFullName);
-        }
-        
-        @Override
-        public <D extends EntityDriver> String inferDriverClassName(DriverDependentEntity<D> entity, Class<D> driverInterface, Location location) {
-            if (driverInterface.getName().equals(expectedPattern)) {
-                return replacement;
-            }
-            return null;
-        }
-    }
-    
-    public static class DriverInferenceByRenamingClassSimpleName extends AbstractDriverInferenceRenamingInferenceRule {
-
-        public DriverInferenceByRenamingClassSimpleName(String expectedClassSimpleName, String newClassSimpleName) {
-            super(expectedClassSimpleName, newClassSimpleName);
-        }
-        
-        @Override
-        public <D extends EntityDriver> String inferDriverClassName(DriverDependentEntity<D> entity, Class<D> driverInterface, Location location) {
-            if (driverInterface.getSimpleName().equals(expectedPattern)) { 
-                // i'd like to do away with drivers altogether, but if people *really* need to use this and suppress the warning,
-                // they can use the full class rename
-                LOG.warn("Using discouraged driver simple class rename to find "+replacement+" for "+expectedPattern+"; it is recommended to set getDriverInterface() or newDriver() appropriately");
-                return Strings.removeFromEnd(driverInterface.getName(), expectedPattern)+replacement;
-            }
-            return null;
-        }
-    }
-    
-    public static class DriverInferenceForSshLocation extends AbstractDriverInferenceRule {
-
-        public static final String DEFAULT_IDENTIFIER = "ssh-location-driver-inference-rule";
-
-        @Override
-        public <D extends EntityDriver> String inferDriverClassName(DriverDependentEntity<D> entity, Class<D> driverInterface, Location location) {
-            String driverInterfaceName = driverInterface.getName();
-            if (!(location instanceof SshMachineLocation)) return null;
-            if (!driverInterfaceName.endsWith("Driver")) {
-                throw new IllegalArgumentException(String.format("Driver name [%s] doesn't end with 'Driver'; cannot auto-detect SshDriver class name", driverInterfaceName));
-            }
-            return Strings.removeFromEnd(driverInterfaceName, "Driver")+"SshDriver";
-        }
-    }
-
-    public static class DriverInferenceForPaasLocation extends AbstractDriverInferenceRule {
-
-        public static final String DEFAULT_IDENTIFIER = "paas-location-driver-inference-rule";
-
-        @Override
-        public <D extends EntityDriver> String inferDriverClassName(DriverDependentEntity<D> entity, Class<D> driverInterface, Location location) {
-            String driverInterfaceName = driverInterface.getName();
-            if (!(location instanceof PaasLocation)) return null;
-            if (!driverInterfaceName.endsWith("Driver")) {
-                throw new IllegalArgumentException(String.format("Driver name [%s] doesn't end with 'Driver'; cannot auto-detect PaasDriver class name", driverInterfaceName));
-            }
-            return Strings.removeFromEnd(driverInterfaceName, "Driver") + ((PaasLocation) location).getPaasProviderName() + "Driver";
-        }
-    }
-
-    public static class DriverInferenceForWinRmLocation extends AbstractDriverInferenceRule {
-
-        public static final String DEFAULT_IDENTIFIER = "winrm-location-driver-inference-rule";
-
-        @Override
-        public <D extends EntityDriver> String inferDriverClassName(DriverDependentEntity<D> entity, Class<D> driverInterface, Location location) {
-            String driverInterfaceName = driverInterface.getName();
-            if (!(location instanceof WinRmMachineLocation)) return null;
-            if (!driverInterfaceName.endsWith("Driver")) {
-                throw new IllegalArgumentException(String.format("Driver name [%s] doesn't end with 'Driver'; cannot auto-detect WinRmDriver class name", driverInterfaceName));
-            }
-            return Strings.removeFromEnd(driverInterfaceName, "Driver")+"WinRmDriver";
-        }
-    }
-
-    /** adds a rule; possibly replacing an old one if one exists with the given identifier. the new rule is added after all previous ones.
-     * @return the replaced rule, or null if there was no old rule */
-    public DriverInferenceRule addRule(String identifier, DriverInferenceRule rule) {
-        DriverInferenceRule oldRule = rules.remove(identifier);
-        rules.put(identifier, rule);
-        LOG.debug("Added driver mapping rule "+rule);
-        return oldRule;
-    }
-
-    public DriverInferenceRule addClassFullNameMapping(String expectedClassFullName, String newClassFullName) {
-        DriverInferenceByRenamingClassFullName rule = new DriverInferenceByRenamingClassFullName(expectedClassFullName, newClassFullName);
-        return addRule(rule.getIdentifier(), rule);
-    }
-
-    public DriverInferenceRule addClassSimpleNameMapping(String expectedClassSimpleName, String newClassSimpleName) {
-        DriverInferenceByRenamingClassSimpleName rule = new DriverInferenceByRenamingClassSimpleName(expectedClassSimpleName, newClassSimpleName);
-        return addRule(rule.getIdentifier(), rule);
-    }
-
-    public <D extends EntityDriver> D build(DriverDependentEntity<D> entity, Location location){
-        Class<D> driverInterface = entity.getDriverInterface();
-        Class<? extends D> driverClass = null;
-        List<Throwable> exceptions = MutableList.of();
-        if (driverInterface.isInterface()) {
-            List<DriverInferenceRule> ruleListInExecutionOrder = MutableList.copyOf(rules.values());
-            Collections.reverse(ruleListInExecutionOrder);
-            // above puts rules in order with most recently added first
-            for (DriverInferenceRule rule: ruleListInExecutionOrder) {
-                ReferenceWithError<Class<? extends D>> clazzR = rule.resolve(entity, driverInterface, location);
-                if (clazzR!=null) {
-                    if (!clazzR.hasError()) {
-                        Class<? extends D> clazz = clazzR.get();
-                        if (clazz!=null) {
-                            driverClass = clazz;
-                            break;
-                        }
-                    } else {
-                        exceptions.add(clazzR.getError());
-                    }
-                }
-            }
-        } else {
-            driverClass = driverInterface;
-        }
-        LOG.debug("Driver for "+driverInterface.getName()+" in "+location+" is: "+driverClass);
-
-        if (driverClass==null) {
-            if (exceptions.isEmpty())
-                throw new RuntimeException("No drivers could be found for "+driverInterface.getName()+"; "
-                    + "currently only SshMachineLocation is supported for autodetection (location "+location+")");
-            else throw Exceptions.create("No drivers could be loaded for "+driverInterface.getName()+" in "+location, exceptions);
-        }
-
-        try {
-            Constructor<? extends D> constructor = getConstructor(driverClass);
-            constructor.setAccessible(true);
-            return constructor.newInstance(entity, location);
-        } catch (Exception e) {
-            LOG.warn("Unable to instantiate "+driverClass+" (rethrowing): "+e);
-            throw Exceptions.propagate(e);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private <D extends EntityDriver> Constructor<D> getConstructor(Class<D> driverClass) {
-        for (Constructor<?> constructor : driverClass.getConstructors()) {
-            if (constructor.getParameterTypes().length == 2) {
-                return (Constructor<D>) constructor;
-            }
-        }
-
-        throw new RuntimeException(String.format("Class [%s] has no constructor with 2 arguments", driverClass.getName()));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/RegistryEntityDriverFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/RegistryEntityDriverFactory.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/RegistryEntityDriverFactory.java
deleted file mode 100644
index 5cbf4e5..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/RegistryEntityDriverFactory.java
+++ /dev/null
@@ -1,127 +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 org.apache.brooklyn.entity.drivers;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.drivers.DriverDependentEntity;
-import org.apache.brooklyn.api.entity.drivers.EntityDriver;
-import org.apache.brooklyn.api.entity.drivers.EntityDriverManager;
-import org.apache.brooklyn.api.location.Location;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Throwables;
-
-/**
- * A registry of driver classes, keyed off the driver-interface + location type it is for.
- * 
- * @author Aled Sage
- */
-public class RegistryEntityDriverFactory implements EntityDriverManager {
-
-    private final Map<DriverLocationTuple, Class<? extends EntityDriver>> registry = new LinkedHashMap<DriverLocationTuple, Class<? extends EntityDriver>>();
-
-    @Override
-    public <D extends EntityDriver> D build(DriverDependentEntity<D> entity, Location location) {
-        Class<? extends D> driverClass = lookupDriver(entity.getDriverInterface(), location);
-        return newDriverInstance(driverClass, entity, location);
-    }
-
-    public boolean hasDriver(DriverDependentEntity<?> entity, Location location) {
-        return lookupDriver(entity.getDriverInterface(), location) != null;
-    }
-
-    public <D extends EntityDriver> void registerDriver(Class<D> driverInterface, Class<? extends Location> locationClazz, Class<? extends D> driverClazz) {
-        synchronized (registry) {
-            registry.put(new DriverLocationTuple(driverInterface, locationClazz), driverClazz);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private <D extends EntityDriver> Class<? extends D> lookupDriver(Class<D> driverInterface, Location location) {
-        synchronized (registry) {
-            for (DriverLocationTuple contender : registry.keySet()) {
-                if (contender.matches(driverInterface, location)) {
-                    return (Class<? extends D>) registry.get(contender);
-                }
-            }
-        }
-        return null;
-    }
-    
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    private <D> Constructor<D> getConstructor(Class<? extends D> driverClass) {
-        for (Constructor constructor : driverClass.getConstructors()) {
-            if (constructor.getParameterTypes().length == 2) {
-                return constructor;
-            }
-        }
-
-        //TODO:
-        throw new RuntimeException(String.format("Class [%s] has no constructor with 2 arguments",driverClass.getName()));
-    }
-
-    private <D> D newDriverInstance(Class<D> driverClass, Entity entity, Location location) {
-        Constructor<D> constructor = getConstructor(driverClass);
-        try {
-            constructor.setAccessible(true);
-            return constructor.newInstance(entity, location);
-        } catch (InstantiationException e) {
-            throw Throwables.propagate(e);
-        } catch (IllegalAccessException e) {
-            throw Throwables.propagate(e);
-        } catch (InvocationTargetException e) {
-            throw Throwables.propagate(e);
-        }
-    }
-
-    private static class DriverLocationTuple {
-        private final Class<? extends EntityDriver> driverInterface;
-        private final Class<? extends Location> locationClazz;
-        
-        public DriverLocationTuple(Class<? extends EntityDriver> driverInterface, Class<? extends Location> locationClazz) {
-            this.driverInterface = checkNotNull(driverInterface, "driver interface");
-            this.locationClazz = checkNotNull(locationClazz, "location class");
-        }
-        
-        public boolean matches(Class<? extends EntityDriver> driver, Location location) {
-            return driverInterface.isAssignableFrom(driver) && locationClazz.isInstance(location);
-        }
-        
-        @Override
-        public int hashCode() {
-            return Objects.hashCode(driverInterface, locationClazz);
-        }
-        
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof DriverLocationTuple)) {
-                return false;
-            }
-            DriverLocationTuple o = (DriverLocationTuple) other;
-            return driverInterface.equals(o.driverInterface) && locationClazz.equals(o.locationClazz);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadRequirement.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadRequirement.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadRequirement.java
deleted file mode 100644
index 6bbfc94..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadRequirement.java
+++ /dev/null
@@ -1,85 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.drivers.EntityDriver;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadRequirement;
-import org.apache.brooklyn.util.collections.MutableMap;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableMap;
-
-public class BasicDownloadRequirement implements DownloadRequirement {
-
-    private final EntityDriver entityDriver;
-    private final String addonName;
-    private final Map<String, ?> properties;
-
-    /**
-     * Copies the given DownloadRequirement, but overriding the original properties with the given additional properties.
-     */
-    public static BasicDownloadRequirement copy(DownloadRequirement req, Map<String,?> additionalProperties) {
-        Map<String,?> props = MutableMap.<String,Object>builder().putAll(req.getProperties()).putAll(additionalProperties).build();
-        if (req.getAddonName() == null) {
-            return new BasicDownloadRequirement(req.getEntityDriver(), props);
-        } else {
-            return new BasicDownloadRequirement(req.getEntityDriver(), req.getAddonName(), props);
-        }
-    }
-
-    public BasicDownloadRequirement(EntityDriver driver) {
-        this(driver, ImmutableMap.<String,Object>of());
-    }
-    
-    public BasicDownloadRequirement(EntityDriver driver, Map<String, ?> properties) {
-        this.entityDriver = checkNotNull(driver, "entityDriver");
-        this.addonName = null;
-        this.properties = checkNotNull(properties, "properties");
-    }
-    
-    public BasicDownloadRequirement(EntityDriver entityDriver, String addonName, Map<String, ?> properties) {
-        this.entityDriver = checkNotNull(entityDriver, "entityDriver");
-        this.addonName = checkNotNull(addonName, "addonName");
-        this.properties = checkNotNull(properties, "properties");
-    }
-
-    @Override
-    public EntityDriver getEntityDriver() {
-        return entityDriver;
-    }
-
-    @Override
-    public String getAddonName() {
-        return addonName;
-    }
-
-    @Override
-    public Map<String, ?> getProperties() {
-        return properties;
-    }
-    
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this).add("driver", entityDriver).add("addon", addonName).omitNullValues().toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadResolver.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadResolver.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadResolver.java
deleted file mode 100644
index 21b260f..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadResolver.java
+++ /dev/null
@@ -1,66 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolver;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-
-public class BasicDownloadResolver implements DownloadResolver {
-
-    private final List<String> targets;
-    private final String filename;
-    private final String unpackDirectoryName;
-
-    public BasicDownloadResolver(Iterable<String> targets, String filename) {
-        this(targets, filename, null);
-    }
-    
-    public BasicDownloadResolver(Iterable<String> targets, String filename, String unpackDirectoryName) {
-        this.targets = ImmutableList.copyOf(checkNotNull(targets, "targets"));
-        this.filename = checkNotNull(filename, "filename");
-        this.unpackDirectoryName = unpackDirectoryName;
-    }
-    
-    @Override
-    public List<String> getTargets() {
-        return targets;
-    }
-
-    @Override
-    public String getFilename() {
-        return filename;
-    }
-
-    @Override
-    public String getUnpackedDirectoryName(String defaultVal) {
-        return unpackDirectoryName == null ? defaultVal : unpackDirectoryName;
-    }
-    
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this).add("targets", targets).add("filename", filename)
-                .add("unpackDirName", unpackDirectoryName).omitNullValues().toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadTargets.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadTargets.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadTargets.java
deleted file mode 100644
index ebce783..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadTargets.java
+++ /dev/null
@@ -1,121 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadTargets;
-import org.apache.brooklyn.util.collections.MutableList;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-public class BasicDownloadTargets implements DownloadTargets {
-
-    private static final DownloadTargets EMPTY = builder().build();
-    
-    public static DownloadTargets empty() {
-        return EMPTY;
-    }
-    
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    public static class Builder {
-        private List<String> primaries = Lists.newArrayList();
-        private List<String> fallbacks = Lists.newArrayList();
-        private boolean canContinueResolving = true;
-        
-        public Builder addAll(DownloadTargets other) {
-            addPrimaries(other.getPrimaryLocations());
-            addFallbacks(other.getFallbackLocations());
-            return this;
-        }
-        
-        public Builder addPrimary(String val) {
-            checkNotNull(val, "val");
-            if (!primaries.contains(val)) primaries.add(val);
-            return this;
-        }
-
-        public Builder addPrimaries(Iterable<String> vals) {
-            for (String val : checkNotNull(vals, "vals")) {
-                addPrimary(val);
-            }
-            return this;
-        }
-
-        public Builder addFallback(String val) {
-            checkNotNull(val, "val");
-            if (!fallbacks.contains(val)) fallbacks.add(val);
-            return this;
-        }
-
-        public Builder addFallbacks(Iterable<String> vals) {
-            for (String val : checkNotNull(vals, "vals")) {
-                addFallback(val);
-            }
-            return this;
-        }
-
-        public Builder canContinueResolving(boolean val) {
-            canContinueResolving = val;
-            return this;
-        }
-        
-        public BasicDownloadTargets build() {
-            return new BasicDownloadTargets(this);
-        }
-    }
-
-    private final List<String> primaries;
-    private final List<String> fallbacks;
-    private final boolean canContinueResolving;
-    
-    protected BasicDownloadTargets(Builder builder) {
-        primaries = ImmutableList.copyOf(builder.primaries);
-        fallbacks = MutableList.<String>builder().addAll(builder.fallbacks).removeAll(builder.primaries).build().asUnmodifiable();
-        canContinueResolving = builder.canContinueResolving;
-    }
-
-    @Override
-    public List<String> getPrimaryLocations() {
-        return primaries;
-    }
-
-    @Override
-    public List<String> getFallbackLocations() {
-        return fallbacks;
-    }
-
-    @Override
-    public boolean canContinueResolving() {
-        return canContinueResolving;
-    }
-    
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this).add("primaries", primaries).add("fallbacks", fallbacks)
-                .add("canContinueResolving", canContinueResolving).toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadsManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadsManager.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadsManager.java
deleted file mode 100644
index a52d1b9..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/BasicDownloadsManager.java
+++ /dev/null
@@ -1,161 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.brooklyn.api.entity.drivers.EntityDriver;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolver;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager;
-import org.apache.brooklyn.config.StringConfigMap;
-import org.apache.brooklyn.util.text.Strings;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
-public class BasicDownloadsManager implements DownloadResolverManager {
-
-    private final List<Function<? super DownloadRequirement, ? extends DownloadTargets>> producers = Lists.newCopyOnWriteArrayList();
-
-    private final List<Function<? super DownloadRequirement, String>> filenameProducers = Lists.newCopyOnWriteArrayList();
-
-    /**
-     * The default is (in-order) to:
-     * <ol>
-     *   <li>Use the local repo, if any (defaulting to $HOME/.brooklyn/repository)
-     *   <li>Use brooklyn properties for any download overrides defined there (see {@link DownloadProducerFromProperties}
-     *   <li>Use the entity's Attributes.DOWNLOAD_URL
-     *   <li>Use the cloudsoft fallback repo
-     * </ol>
-     * @param config
-     */
-    public static BasicDownloadsManager newDefault(StringConfigMap config) {
-        BasicDownloadsManager result = new BasicDownloadsManager();
-        
-        // In-order, will look up: local repo, overrides defined in the properties, and then 
-        // the entity's attribute to get the download URL
-        DownloadProducerFromLocalRepo localRepoProducer = new DownloadProducerFromLocalRepo(config);
-        DownloadProducerFromProperties propertiesProducer = new DownloadProducerFromProperties(config);
-        DownloadProducerFromUrlAttribute attributeProducer = new DownloadProducerFromUrlAttribute();
-        DownloadProducerFromCloudsoftRepo cloudsoftRepoProducer = new DownloadProducerFromCloudsoftRepo(config);
-        
-        result.registerProducer(localRepoProducer);
-        result.registerProducer(propertiesProducer);
-        result.registerProducer(attributeProducer);
-        result.registerProducer(cloudsoftRepoProducer);
-        
-        result.registerFilenameProducer(FilenameProducers.fromFilenameProperty());
-        result.registerFilenameProducer(FilenameProducers.firstPrimaryTargetOf(propertiesProducer));
-        result.registerFilenameProducer(FilenameProducers.firstPrimaryTargetOf(attributeProducer));
-        
-        return result;
-    }
-    
-    public static BasicDownloadsManager newEmpty() {
-        return new BasicDownloadsManager();
-    }
-    
-    @Override
-    public void registerPrimaryProducer(Function<? super DownloadRequirement, ? extends DownloadTargets> producer) {
-        producers.add(0, checkNotNull(producer, "resolver"));
-    }
-
-    @Override
-    public void registerProducer(Function<? super DownloadRequirement, ? extends DownloadTargets> producer) {
-        producers.add(checkNotNull(producer, "resolver"));
-    }
-
-    @Override
-    public void registerFilenameProducer(Function<? super DownloadRequirement, String> producer) {
-        filenameProducers.add(checkNotNull(producer, "producer"));
-    }
-
-    @Override
-    public DownloadResolver newDownloader(EntityDriver driver) {
-        return newDownloader(new BasicDownloadRequirement(driver));
-    }
-
-    @Override
-    public DownloadResolver newDownloader(EntityDriver driver, Map<String, ?> properties) {
-        return newDownloader(new BasicDownloadRequirement(driver, properties));
-    }
-
-    @Override
-    public DownloadResolver newDownloader(EntityDriver driver, String addonName, Map<String, ?> addonProperties) {
-        return newDownloader(new BasicDownloadRequirement(driver, addonName, addonProperties));
-    }
-
-    private DownloadResolver newDownloader(DownloadRequirement req) {
-        // Infer filename
-        String filename = null;
-        for (Function<? super DownloadRequirement, String> filenameProducer : filenameProducers) {
-            filename = filenameProducer.apply(req);
-            if (!Strings.isBlank(filename)) break;
-        }
-        
-        // If a filename-producer has given us the filename, then augment the DownloadRequirement with that
-        // (so that local-repo substitutions etc can use that explicit filename)
-        DownloadRequirement wrappedReq;
-        if (filename == null) {
-            wrappedReq = req;
-        } else {
-            wrappedReq = BasicDownloadRequirement.copy(req, ImmutableMap.of("filename", filename));
-        }
-        
-        // Get ordered download targets to be tried
-        List<String> primaries = Lists.newArrayList();
-        List<String> fallbacks = Lists.newArrayList();
-        for (Function<? super DownloadRequirement, ? extends DownloadTargets> producer : producers) {
-            DownloadTargets vals = producer.apply(wrappedReq);
-            primaries.addAll(vals.getPrimaryLocations());
-            fallbacks.addAll(vals.getFallbackLocations());
-            if (!vals.canContinueResolving()) {
-                break;
-            }
-        }
-
-        Set<String> result = Sets.newLinkedHashSet();
-        result.addAll(primaries);
-        result.addAll(fallbacks);
-
-        if (result.isEmpty()) {
-            throw new IllegalArgumentException("No downloads matched for "+req);
-        }
-        
-        // If filename-producers didn't give any explicit filename, then infer from download results
-        if (filename == null) {
-            for (String target : result) {
-                filename = FilenameProducers.inferFilename(target);
-                if (!Strings.isBlank(filename)) break;
-            }
-        }
-        if (Strings.isBlank(filename)) {
-            throw new IllegalArgumentException("No filenames matched for "+req+" (targets "+result+")");
-        }
-        
-        // And return the result
-        return new BasicDownloadResolver(result, filename);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromCloudsoftRepo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromCloudsoftRepo.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromCloudsoftRepo.java
deleted file mode 100644
index bf0e679..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromCloudsoftRepo.java
+++ /dev/null
@@ -1,83 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadRequirement;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadTargets;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.StringConfigMap;
-import org.apache.brooklyn.core.config.BasicConfigKey;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Function;
-
-public class DownloadProducerFromCloudsoftRepo implements Function<DownloadRequirement, DownloadTargets> {
-    
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(DownloadProducerFromCloudsoftRepo.class);
-
-    public static final ConfigKey<String> CLOUDSOFT_REPO_URL = BasicConfigKey.builder(String.class)
-            .name(DownloadProducerFromProperties.DOWNLOAD_CONF_PREFIX+"repo.cloudsoft.url")
-            .description("Whether to use the cloudsoft repo for downloading entities, during installs")
-            .defaultValue("http://downloads.cloudsoftcorp.com/brooklyn/repository")
-            .build();
-
-    public static final ConfigKey<Boolean> CLOUDSOFT_REPO_ENABLED = BasicConfigKey.builder(Boolean.class)
-            .name(DownloadProducerFromProperties.DOWNLOAD_CONF_PREFIX+"repo.cloudsoft.enabled")
-            .description("Whether to use the cloudsoft repo for downloading entities, during installs")
-            .defaultValue(true)
-            .build();
-    
-    public static final String CLOUDSOFT_REPO_URL_PATTERN = "%s/"+
-            "${simpletype}/${version}/"+
-            "<#if filename??>"+
-                "${filename}" +
-            "<#else>"+
-              "<#if addon??>"+
-                "${simpletype?lower_case}-${addon?lower_case}-${addonversion?lower_case}.${fileSuffix!\"tar.gz\"}"+
-              "<#else>"+
-                  "${simpletype?lower_case}-${version?lower_case}.${fileSuffix!\"tar.gz\"}"+
-              "</#if>"+
-            "</#if>";
-
-
-    private final StringConfigMap config;
-
-    public DownloadProducerFromCloudsoftRepo(StringConfigMap config) {
-        this.config = config;
-    }
-    
-    public DownloadTargets apply(DownloadRequirement req) {
-        Boolean enabled = config.getConfig(CLOUDSOFT_REPO_ENABLED);
-        String baseUrl = config.getConfig(CLOUDSOFT_REPO_URL);
-        String url = String.format(CLOUDSOFT_REPO_URL_PATTERN, baseUrl);
-        
-        if (enabled) {
-            Map<String, ?> subs = DownloadSubstituters.getBasicSubstitutions(req);
-            String result = DownloadSubstituters.substitute(url, subs);
-            return BasicDownloadTargets.builder().addPrimary(result).build();
-            
-        } else {
-            return BasicDownloadTargets.empty();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromLocalRepo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromLocalRepo.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromLocalRepo.java
deleted file mode 100644
index 34ab0d1..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromLocalRepo.java
+++ /dev/null
@@ -1,84 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadRequirement;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadTargets;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.StringConfigMap;
-import org.apache.brooklyn.core.config.BasicConfigKey;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Function;
-
-public class DownloadProducerFromLocalRepo implements Function<DownloadRequirement, DownloadTargets> {
-    
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(DownloadProducerFromLocalRepo.class);
-
-    public static final ConfigKey<String> LOCAL_REPO_PATH = BasicConfigKey.builder(String.class)
-            .name(DownloadProducerFromProperties.DOWNLOAD_CONF_PREFIX+"repo.local.path")
-            .description("Fully qualified path of the local repo")
-            .defaultValue("$HOME/.brooklyn/repository")
-            .build();
-
-    public static final ConfigKey<Boolean> LOCAL_REPO_ENABLED = BasicConfigKey.builder(Boolean.class)
-            .name(DownloadProducerFromProperties.DOWNLOAD_CONF_PREFIX+"repo.local.enabled")
-            .description("Whether to use the local repo for downloading entities, during installs")
-            .defaultValue(true)
-            .build();
-
-    // TODO explain why this is this in lower_case!  it's surprising
-    public static final String LOCAL_REPO_URL_PATTERN = "file://%s/"+
-            "${simpletype}/${version}/"+
-            "<#if filename??>"+
-                "${filename}" +
-            "<#else>"+
-              "<#if addon??>"+
-                "${simpletype?lower_case}-${addon?lower_case}-${addonversion?lower_case}.${fileSuffix!\"tar.gz\"}"+
-              "<#else>"+
-                  "${simpletype?lower_case}-${version?lower_case}.${fileSuffix!\"tar.gz\"}"+
-              "</#if>"+
-            "</#if>";
-
-
-    private final StringConfigMap config;
-
-    public DownloadProducerFromLocalRepo(StringConfigMap config) {
-        this.config = config;
-    }
-    
-    public DownloadTargets apply(DownloadRequirement req) {
-        Boolean enabled = config.getConfig(LOCAL_REPO_ENABLED);
-        String path = config.getConfig(LOCAL_REPO_PATH);
-        String url = String.format(LOCAL_REPO_URL_PATTERN, path);
-        
-        if (enabled) {
-            Map<String, ?> subs = DownloadSubstituters.getBasicSubstitutions(req);
-            String result = DownloadSubstituters.substitute(url, subs);
-            return BasicDownloadTargets.builder().addPrimary(result).build();
-            
-        } else {
-            return BasicDownloadTargets.empty();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromProperties.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromProperties.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromProperties.java
deleted file mode 100644
index 60c2b6b..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromProperties.java
+++ /dev/null
@@ -1,344 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.drivers.EntityDriver;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadRequirement;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadTargets;
-import org.apache.brooklyn.config.StringConfigMap;
-import org.apache.brooklyn.entity.core.Attributes;
-import org.apache.brooklyn.util.text.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-/**
- * Based on the contents of brooklyn properties, sets up rules for resolving where to
- * download artifacts from, for installing entities. 
- * 
- * By default, these rules override the DOWNLOAD_URL defined on the entities in code.
- * Global properties can be specified that apply to all entities. Entity-specific properties
- * can also be specified (which override the global properties for that entity type).
- * 
- * Below is an example of realistic configuration for an enterprise who have an in-house 
- * repository that must be used for everything, rather than going out to the public internet. 
- * <pre>
- * {@code
- * // FIXME Check format for including addonname- only if addonname is non-null?
- * // FIXME Use this in a testng test case
- * brooklyn.downloads.all.url=http://downloads.acme.com/brookyn/repository/${simpletype}/${simpletype}-${addon?? addon-}${version}.${fileSuffix!.tar.gz}
- * }
- * </pre>
- * 
- * To illustrate the features and variations one can use, below is an example of global 
- * properties that can be specified. The semicolon-separated list of URLs will be tried  in-order
- * until one succeeds. The fallback url says to use that if all other URLs fail (or no others are
- * specified). 
- * <pre>
- * {@code
- * brooklyn.downloads.all.url=http://myurl1/${simpletype}-${version}.tar.gz; http://myurl2/${simpletype}-${version}.tar.gz
- * brooklyn.downloads.all.fallbackurl=http://myurl3/${simpletype}-${version}.tar.gz
- * }
- * </pre>
- * 
- * Similarly, entity-specific properties can be defined. All "global properties" will also apply
- * to this entity type, unless explicitly overridden.
- * <pre>
- * {@code
- * brooklyn.downloads.entity.tomcatserver.url=http://mytomcaturl1/tomcat-${version}.tar.gz
- * brooklyn.downloads.entity.tomcatserver.fallbackurl=http://myurl2/tomcat-${version}.tar.gz
- * }
- * </pre>
- * 
- * Downloads for entity-specific add-ons can also be defined. All "global properties" will also apply
- * to this entity type, unless explicitly overridden.
- * <pre>
- * {@code
- * brooklyn.downloads.entity.nginxcontroller.addon.stickymodule.url=http://myurl1/nginx-stickymodule-${version}.tar.gz
- * brooklyn.downloads.entity.nginxcontroller.addon.stickymodule.fallbackurl=http://myurl2/nginx-stickymodule-${version}.tar.gz
- * }
- * </pre>
- * 
- * If no explicit URLs are supplied, then by default it will use the DOWNLOAD_URL attribute
- * of the entity  (if supplied), followed by the fallbackurl if that fails. 
- * 
- * A URL can be a "template", where things of the form ${version} will be substituted for the value
- * of "version" provided for that entity. The freemarker template engine is used to convert URLs 
- * (see <a href="http://freemarker.org">http://freemarker.org</a>). For example, one could use the URL:
- * <pre>
- * {@code
- * http://repo.acme.com/${simpletype}-${version}.${fileSuffix!tar.gz}
- * }
- * </pre>
- * The following substitutions are available automatically for a template:
- * <ul>
- *   <li>entity: the {@link Entity} instance
- *   <li>driver: the {@link EntityDriver} instance being used for the Entity
- *   <li>simpletype: the unqualified name of the entity type
- *   <li>type: the fully qualified name of the entity type
- *   <li>addon: the name of the entity add-on, or null if it's the core entity artifact
- *   <li>version: the version number of the entity to be installed (or of the add-on)
- * </ul>
- */
-public class DownloadProducerFromProperties implements Function<DownloadRequirement, DownloadTargets> {
-    
-    /* FIXME: expose config for canContinueResolving.
-     * ... then it uses only the overrides in the properties file. This, in combination with
-     * setting something like {@code brooklyn.downloads.all.url=http://acme.com/repo/${simpletype}/${simpletype}-${version}.tar.gz},
-     * allows an enterprise to ensure that entities never go to the public internet during installation.
-     * 
-     * But also need to override things like nginx downlaod url for the stick module and pcre.
-     */
-
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(DownloadProducerFromProperties.class);
-
-    public static final String DOWNLOAD_CONF_PREFIX = "brooklyn.downloads.";
-
-    private final StringConfigMap config;
-
-    public DownloadProducerFromProperties(StringConfigMap config) {
-        this.config = config;
-    }
-    
-    public DownloadTargets apply(DownloadRequirement downloadRequirement) {
-        List<Rule> rules = generateRules();
-        BasicDownloadTargets.Builder result = BasicDownloadTargets.builder();
-        for (Rule rule : rules) {
-            if (rule.matches(downloadRequirement.getEntityDriver(), downloadRequirement.getAddonName())) {
-                result.addAll(rule.resolve(downloadRequirement));
-            }
-        }
-        
-        return result.build();
-    }
-    
-    /**
-     * Produces a set of URL-generating rules, based on the brooklyn properties. These
-     * rules will be applied in-order until one of them returns a non-empty result.
-     */
-    private List<Rule> generateRules() {
-        List<Rule> result = Lists.newArrayList();
-        Map<String, String> subconfig = filterAndStripPrefix(config.asMapWithStringKeys(), DOWNLOAD_CONF_PREFIX);
-
-        // If exists, use things like:
-        //   brooklyn.downloads.all.fallbackurl=...
-        //   brooklyn.downloads.all.url=...
-        // But only if not overridden by more entity-specify value
-        Map<String, String> forall = filterAndStripPrefix(subconfig, "all.");
-        String fallbackUrlForAll = forall.get("fallbackurl");
-        String urlForAll = forall.get("url");
-        
-        // If exists, use things like:
-        //   brooklyn.downloads.entity.JBoss7Server.url=...
-        Map<String, String> forSpecificEntities = filterAndStripPrefix(subconfig, "entity.");
-        Map<String, Map<String,String>> splitBySpecificEntity = splitByPrefix(forSpecificEntities);
-        for (Map.Entry<String, Map<String,String>> entry : splitBySpecificEntity.entrySet()) {
-            String entityType = entry.getKey();
-            Map<String, String> forentity = entry.getValue();
-            String urlForEntity = forentity.get("url");
-            if (urlForEntity == null) urlForEntity = urlForAll;
-            String fallbackUrlForEntity = forentity.get("fallbackurl");
-            if (fallbackUrlForEntity == null) fallbackUrlForEntity = fallbackUrlForAll;
-            
-            result.add(new EntitySpecificRule(entityType, urlForEntity, fallbackUrlForEntity));
-            
-            // If exists, use things like:
-            //   brooklyn.downloads.entity.nginxcontroller.addon.stickymodule.url=...
-            Map<String, String> forSpecificAddons = filterAndStripPrefix(forentity, "addon.");
-            Map<String, Map<String,String>> splitBySpecificAddon = splitByPrefix(forSpecificAddons);
-            for (Map.Entry<String, Map<String,String>> entry2 : splitBySpecificAddon.entrySet()) {
-                String addonName = entry2.getKey();
-                Map<String, String> foraddon = entry2.getValue();
-                String urlForAddon = foraddon.get("url");
-                if (urlForAddon == null) urlForAddon = urlForEntity;
-                String fallbackUrlForAddon = foraddon.get("fallbackurl");
-                if (fallbackUrlForEntity == null) fallbackUrlForAddon = fallbackUrlForEntity;
-                
-                result.add(new EntityAddonSpecificRule(entityType, addonName, urlForAddon, fallbackUrlForAddon));
-            }
-        }
-
-        if (!forall.isEmpty()) {
-            result.add(new UniversalRule(urlForAll, fallbackUrlForAll));
-        }
-        
-        return result;
-    }
-
-    /**
-     * Returns a sub-map of config for keys that started with the given prefix, but where the returned
-     * map's keys do not include the prefix.
-     */
-    private static Map<String,String> filterAndStripPrefix(Map<String,?> config, String prefix) {
-        Map<String,String> result = Maps.newLinkedHashMap();
-        for (Map.Entry<String,?> entry : config.entrySet()) {
-            String key = entry.getKey();
-            if (key.startsWith(prefix)) {
-                Object value = entry.getValue();
-                result.put(key.substring(prefix.length()), (value == null) ? null : value.toString());
-            }
-        }
-        return result;
-    }
-    
-    /**
-     * Splits the map up into multiple maps, using the key's prefix up to the first dot to 
-     * tell which map to include it in. This prefix is used as the key in the map-of-maps, and
-     * is omitted in the contained map.
-     * 
-     * For example, given [a.b:v1, a.c:v2, d.e:v3], it will return [ a:[b:v1, c:v2], d:[e:v3] ]
-     */
-    private static Map<String,Map<String,String>> splitByPrefix(Map<String,String> config) {
-        Map<String,Map<String,String>> result = Maps.newLinkedHashMap();
-        
-        for (Map.Entry<String,String> entry : config.entrySet()) {
-            String key = entry.getKey();
-            String keysuffix = key.substring(key.indexOf(".")+1);
-            String keyprefix = key.substring(0, key.length()-keysuffix.length()-1);
-            String value = entry.getValue();
-            
-            Map<String,String> submap = result.get(keyprefix);
-            if (submap == null) {
-                submap = Maps.newLinkedHashMap();
-                result.put(keyprefix, submap);
-            }
-            submap.put(keysuffix, value);
-        }
-        return result;
-    }
-    
-    /**
-     * Resolves the download url, given an EntityDriver, with the following rules:
-     * <ol>
-     *   <li>If url is not null, split and trim it on ";" and use
-     *   <li>If url is null, retrive entity's Attributes.DOWNLOAD_URL and use if non-null
-     *   <li>If fallbackUrl is not null, split and trim it on ";" and use
-     * <ol>
-     * 
-     * For each of the resulting Strings, transforms them (using freemarker syntax for
-     * substitutions). Returns the list.
-     */
-    private static abstract class Rule {
-        private final String url;
-        private final String fallbackUrl;
-        
-        Rule(String url, String fallbackUrl) {
-            this.url = url;
-            this.fallbackUrl = fallbackUrl;
-        }
-        
-        abstract boolean matches(EntityDriver driver, String addon);
-        
-        DownloadTargets resolve(DownloadRequirement req) {
-            EntityDriver driver = req.getEntityDriver();
-            
-            List<String> primaries = Lists.newArrayList();
-            List<String> fallbacks = Lists.newArrayList();
-            if (Strings.isEmpty(url)) {
-                String defaulturl = driver.getEntity().getAttribute(Attributes.DOWNLOAD_URL);
-                if (defaulturl != null) primaries.add(defaulturl);
-            } else {
-                String[] parts = url.split(";");
-                for (String part : parts) {
-                    if (!part.isEmpty()) primaries.add(part.trim());
-                }
-            }
-            if (fallbackUrl != null) {
-                String[] parts = fallbackUrl.split(";");
-                for (String part : parts) {
-                    if (!part.isEmpty()) fallbacks.add(part.trim());
-                }
-            }
-
-            BasicDownloadTargets.Builder result = BasicDownloadTargets.builder();
-            for (String baseurl : primaries) {
-                result.addPrimary(DownloadSubstituters.substitute(req, baseurl));
-            }
-            for (String baseurl : fallbacks) {
-                result.addFallback(DownloadSubstituters.substitute(req, baseurl));
-            }
-            return result.build();
-        }
-    }
-
-    /**
-     * Rule for generating URLs that applies to all entities, if a more specific rule 
-     * did not exist or failed to find a match.
-     */
-    private static class UniversalRule extends Rule {
-        UniversalRule(String url, String fallbackUrl) {
-            super(url, fallbackUrl);
-        }
-        
-        @Override
-        boolean matches(EntityDriver driver, String addon) {
-            return true;
-        }
-    }
-    
-    /**
-     * Rule for generating URLs that applies to only the entity of the given type.
-     */
-    private static class EntitySpecificRule extends Rule {
-        private final String entityType;
-
-        EntitySpecificRule(String entityType, String url, String fallbackUrl) {
-            super(url, fallbackUrl);
-            this.entityType = checkNotNull(entityType, "entityType");
-        }
-        
-        @Override
-        boolean matches(EntityDriver driver, String addon) {
-            String actualType = driver.getEntity().getEntityType().getName();
-            String actualSimpleType = actualType.substring(actualType.lastIndexOf(".")+1);
-            return addon == null && entityType.equalsIgnoreCase(actualSimpleType);
-        }
-    }
-    
-    /**
-     * Rule for generating URLs that applies to only the entity of the given type.
-     */
-    private static class EntityAddonSpecificRule extends Rule {
-        private final String entityType;
-        private final String addonName;
-
-        EntityAddonSpecificRule(String entityType, String addonName, String url, String fallbackUrl) {
-            super(url, fallbackUrl);
-            this.entityType = checkNotNull(entityType, "entityType");
-            this.addonName = checkNotNull(addonName, "addonName");
-        }
-        
-        @Override
-        boolean matches(EntityDriver driver, String addon) {
-            String actualType = driver.getEntity().getEntityType().getName();
-            String actualSimpleType = actualType.substring(actualType.lastIndexOf(".")+1);
-            return addonName.equals(addon) && entityType.equalsIgnoreCase(actualSimpleType);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromUrlAttribute.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromUrlAttribute.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromUrlAttribute.java
deleted file mode 100644
index 4e218b9..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadProducerFromUrlAttribute.java
+++ /dev/null
@@ -1,63 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadRequirement;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadTargets;
-import org.apache.brooklyn.entity.core.Attributes;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Maps;
-
-/**
- * Retrieves the DOWNLOAD_URL or DOWNLOAD_ADDON_URLS attribute of a given entity, and performs the
- * template substitutions to generate the download URL.
- * 
- * @author aled
- */
-public class DownloadProducerFromUrlAttribute extends DownloadSubstituters.Substituter implements Function<DownloadRequirement, DownloadTargets> {
-    public DownloadProducerFromUrlAttribute() {
-        super(
-            new Function<DownloadRequirement, String>() {
-                @Override public String apply(DownloadRequirement input) {
-                    if (input.getAddonName() == null) {
-                        return input.getEntityDriver().getEntity().getAttribute(Attributes.DOWNLOAD_URL);
-                    } else {
-                        String addon = input.getAddonName();
-                        Map<String, String> addonUrls = input.getEntityDriver().getEntity().getAttribute(Attributes.DOWNLOAD_ADDON_URLS);
-                        return (addonUrls != null) ? addonUrls.get(addon) : null;
-                    }
-                }
-            },
-            new Function<DownloadRequirement, Map<String,?>>() {
-                @Override public Map<String,?> apply(DownloadRequirement input) {
-                    Map<String,Object> result = Maps.newLinkedHashMap();
-                    if (input.getAddonName() == null) {
-                        result.putAll(DownloadSubstituters.getBasicEntitySubstitutions(input.getEntityDriver()));
-                    } else {
-                        result.putAll(DownloadSubstituters.getBasicAddonSubstitutions(input.getEntityDriver(), input.getAddonName()));
-                    }
-                    result.putAll(input.getProperties());
-                    return result;
-                }
-            });
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadSubstituters.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadSubstituters.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadSubstituters.java
deleted file mode 100644
index f12f343..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/DownloadSubstituters.java
+++ /dev/null
@@ -1,172 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.drivers.EntityDriver;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadRequirement;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadTargets;
-import org.apache.brooklyn.entity.core.BrooklynConfigKeys;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
-
-import freemarker.cache.StringTemplateLoader;
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateException;
-
-public class DownloadSubstituters {
-
-    private static final Logger LOG = LoggerFactory.getLogger(DownloadSubstituters.class);
-
-    static {
-        // TODO in Freemarker 2.4 SLF4J may be auto-selected and we can remove this;
-        // for now, we need it somewhere, else we get j.u.l logging; 
-        // since this is the main place it is used, let's do it here
-        try {
-            LOG.debug("Configuring Freemarker logging for Brooklyn to use SLF4J");
-            System.setProperty(freemarker.log.Logger.SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY, freemarker.log.Logger.LIBRARY_NAME_SLF4J);
-        } catch (Exception e) {
-            LOG.warn("Error setting Freemarker logging: "+e, e);
-        }
-    }
-    
-    private DownloadSubstituters() {}
-    
-    /**
-     * Converts the basevalue by substituting things in the form ${key} for values specific
-     * to a given entity driver. The keys used are:
-     * <ul>
-     *   <li>driver: the driver instance (e.g. can do freemarker.org stuff like ${driver.osTag} to call {@code driver.getOsTag()})
-     *   <li>entity: the entity instance
-     *   <li>type: the fully qualified type name of the entity
-     *   <li>simpletype: the unqualified type name of the entity
-     *   <li>addon: the name of the add-on, or null if for the entity's main artifact
-     *   <li>version: the version for this entity (or of the add-on), or not included if null
-     * </ul>
-     * 
-     * Additional substitution keys (and values) can be defined using {@link DownloadRequirement#getProperties()}; these
-     * override the default substitutions listed above.
-     */
-    public static String substitute(DownloadRequirement req, String basevalue) {
-        return substitute(basevalue, getBasicSubstitutions(req));
-    }
-
-    public static Map<String,Object> getBasicSubstitutions(DownloadRequirement req) {
-        EntityDriver driver = req.getEntityDriver();
-        String addon = req.getAddonName();
-        Map<String, ?> props = req.getProperties();
-        
-        if (addon == null) {
-            return MutableMap.<String,Object>builder()
-                    .putAll(getBasicEntitySubstitutions(driver))
-                    .putAll(props)
-                    .build();
-        } else {
-            return MutableMap.<String,Object>builder()
-                    .putAll(getBasicAddonSubstitutions(driver, addon))
-                    .putAll(props)
-                    .build();
-        }
-    }
-    
-    public static Map<String,Object> getBasicEntitySubstitutions(EntityDriver driver) {
-        Entity entity = driver.getEntity();
-        String type = entity.getEntityType().getName();
-        String simpleType = type.substring(type.lastIndexOf(".")+1);
-        String version = entity.getConfig(BrooklynConfigKeys.SUGGESTED_VERSION);
-        
-        return MutableMap.<String,Object>builder()
-                .put("entity", entity)
-                .put("driver", driver)
-                .put("type", type)
-                .put("simpletype", simpleType)
-                .putIfNotNull("version", version)
-                .build();
-    }
-
-    public static Map<String,Object> getBasicAddonSubstitutions(EntityDriver driver, String addon) {
-        return MutableMap.<String,Object>builder()
-                .putAll(getBasicEntitySubstitutions(driver))
-                .put("addon", addon)
-                .build();
-    }
-
-    public static String substitute(String basevalue, Map<String,?> substitutions) {
-        try {
-            Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
-            StringTemplateLoader templateLoader = new StringTemplateLoader();
-            templateLoader.putTemplate("config", basevalue);
-            cfg.setTemplateLoader(templateLoader);
-            Template template = cfg.getTemplate("config");
-            
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            Writer out = new OutputStreamWriter(baos);
-            template.process(substitutions, out);
-            out.flush();
-            
-            return new String(baos.toByteArray());
-        } catch (IOException e) {
-            LOG.warn("Error processing template '"+basevalue+"'", e);
-            throw Exceptions.propagate(e);
-        } catch (TemplateException e) {
-            throw new IllegalArgumentException("Failed to process driver download '"+basevalue+"'", e);
-        }
-    }
-
-    public static Function<DownloadRequirement, DownloadTargets> substituter(Function<? super DownloadRequirement, String> basevalueProducer, Function<? super DownloadRequirement, ? extends Map<String,?>> subsProducer) {
-        // FIXME Also need default subs (entity, driver, simpletype, etc)
-        return new Substituter(basevalueProducer, subsProducer);
-    }
-
-    protected static class Substituter implements Function<DownloadRequirement, DownloadTargets> {
-        private final Function<? super DownloadRequirement, String> basevalueProducer;
-        private final Function<? super DownloadRequirement, ? extends Map<String,?>> subsProducer;
-        
-        Substituter(Function<? super DownloadRequirement, String> baseValueProducer, Function<? super DownloadRequirement, ? extends Map<String,?>> subsProducer) {
-            this.basevalueProducer = checkNotNull(baseValueProducer, "basevalueProducer");
-            this.subsProducer = checkNotNull(subsProducer, "subsProducer");
-        }
-        
-        @Override
-        public DownloadTargets apply(DownloadRequirement input) {
-            String basevalue = basevalueProducer.apply(input);
-            Map<String, ?> subs = subsProducer.apply(input);
-            String result = (basevalue != null) ? substitute(basevalue, subs) : null;
-            return (result != null) ? BasicDownloadTargets.builder().addPrimary(result).build() : BasicDownloadTargets.empty();
-        }
-        
-        @Override public String toString() {
-            return Objects.toStringHelper(this).add("basevalue", basevalueProducer).add("subs", subsProducer).toString();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/FilenameProducers.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/FilenameProducers.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/FilenameProducers.java
deleted file mode 100644
index 11aa537..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/downloads/FilenameProducers.java
+++ /dev/null
@@ -1,64 +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 org.apache.brooklyn.entity.drivers.downloads;
-
-import java.util.List;
-
-import javax.annotation.Nullable;
-
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadRequirement;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager.DownloadTargets;
-import org.apache.brooklyn.util.text.Strings;
-
-import com.google.common.base.Function;
-
-public class FilenameProducers {
-
-    public static String inferFilename(String target) {
-        String result = target.substring(target.lastIndexOf("/")+1);
-        result = result.contains("?") ? result.substring(0, result.indexOf("?")) : result;
-        if (!result.contains("."))
-            // require a full stop, else assume it isn't a filename
-            return null;
-        return result;
-    }
-
-    public static Function<DownloadRequirement, String> fromFilenameProperty() {
-        return new Function<DownloadRequirement, String>() {
-            @Override public String apply(@Nullable DownloadRequirement req) {
-                Object filename = req.getProperties().get("filename");
-                return (filename != null) ? filename.toString() : null;
-            }
-        };
-    }
-    
-    public static Function<DownloadRequirement, String> firstPrimaryTargetOf(final Function<DownloadRequirement, DownloadTargets> producer) {
-        return new Function<DownloadRequirement, String>() {
-            @Override public String apply(@Nullable DownloadRequirement req) {
-                DownloadTargets targets = producer.apply(req);
-                List<String> primaryTargets = targets.getPrimaryLocations();
-                for (String primaryTarget : primaryTargets) {
-                    String result = inferFilename(primaryTarget);
-                    if (!Strings.isBlank(result)) return result;
-                }
-                return null;
-            }
-        };
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c27cf1d0/core/src/main/java/org/apache/brooklyn/entity/factory/AbstractConfigurableEntityFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/factory/AbstractConfigurableEntityFactory.java b/core/src/main/java/org/apache/brooklyn/entity/factory/AbstractConfigurableEntityFactory.java
deleted file mode 100644
index a4249ba..0000000
--- a/core/src/main/java/org/apache/brooklyn/entity/factory/AbstractConfigurableEntityFactory.java
+++ /dev/null
@@ -1,82 +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 org.apache.brooklyn.entity.factory;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.config.ConfigKey;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class AbstractConfigurableEntityFactory<T extends Entity> implements ConfigurableEntityFactory<T>, Serializable {
-    private static final Logger log = LoggerFactory.getLogger(AbstractConfigurableEntityFactory.class);
-    
-    protected final Map config = new LinkedHashMap();
-
-    public AbstractConfigurableEntityFactory(){
-        this(new HashMap());
-    }
-
-    public AbstractConfigurableEntityFactory(Map flags) {
-        this.config.putAll(flags);
-
-    }
-    public AbstractConfigurableEntityFactory<T> configure(Map flags) {
-        config.putAll(flags);
-        return this;
-    }
-
-    public AbstractConfigurableEntityFactory<T> configure(ConfigKey key, Object value) {
-        config.put(key, value);
-        return this;
-    }
-
-    public AbstractConfigurableEntityFactory<T> configure(ConfigKey.HasConfigKey key, Object value) {
-        return setConfig(key.getConfigKey(), value);
-    }
-
-    public AbstractConfigurableEntityFactory<T> setConfig(ConfigKey key, Object value) {
-        return configure(key, value);
-    }
-
-    public AbstractConfigurableEntityFactory<T> setConfig(ConfigKey.HasConfigKey key, Object value) {
-        return configure(key.getConfigKey(), value);
-    }
-
-    public T newEntity(Entity parent){
-        return newEntity(new HashMap(),parent);
-    }
-
-    public T newEntity(Map flags, Entity parent) {
-        Map flags2 = new HashMap();
-        flags2.putAll(config);
-        flags2.putAll(flags);
-        T result = newEntity2(flags2, parent);
-        // we rely increasingly on init, which factory doesn't call; really should remove factories!
-        log.warn("Deprecated legacy compatibility, using factory (init will not be invoked): "+result);
-        return result;
-    }
-
-    public abstract T newEntity2(Map flags, Entity parent);
-}
-