http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerClient.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerClient.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerClient.java
deleted file mode 100644
index b0baa01..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerClient.java
+++ /dev/null
@@ -1,413 +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.core.location.access;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-
-import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import com.google.common.net.HostAndPort;
-
-/**
- * @deprecated since 0.7.0; just use the {@link PortForwardManager}, or a 
direct reference to its impl {@link PortForwardManagerImpl}
- */
-@Deprecated
-public class PortForwardManagerClient implements PortForwardManager {
-
-    protected final Supplier<PortForwardManager> delegateSupplier;
-    private transient volatile PortForwardManager _delegate;
-    
-    protected PortForwardManagerClient(Supplier<PortForwardManager> supplier) {
-        this.delegateSupplier = supplier;
-    }
-    
-    /** creates an instance given a supplier; 
-     * the supplier should be brooklyn-persistable, that is to say
-     * references should be in terms of entities/locations 
-     * which can retrieve an authoritative source even under cloning */
-    public static PortForwardManager fromSupplier(Supplier<PortForwardManager> 
supplier) {
-        return new PortForwardManagerClient(supplier);
-    }
-
-    /** creates an instance given an entity and an interface method it 
implements to retrieve the PortForwardManager */ 
-    public static PortForwardManager fromMethodOnEntity(final Entity entity, 
final String getterMethodOnEntity) {
-        Preconditions.checkNotNull(entity);
-        Preconditions.checkNotNull(getterMethodOnEntity);
-        return new PortForwardManagerClient(new Supplier<PortForwardManager>() 
{
-            @Override
-            public PortForwardManager get() {
-                PortForwardManager result;
-                try {
-                    result = (PortForwardManager) 
entity.getClass().getMethod(getterMethodOnEntity).invoke(entity);
-                } catch (Exception e) {
-                    Exceptions.propagateIfFatal(e);
-                    throw new IllegalStateException("Cannot invoke 
"+getterMethodOnEntity+" on "+entity+" ("+entity.getClass()+"): "+e, e);
-                }
-                if (result==null)
-                    throw new IllegalStateException("No PortForwardManager 
available via "+getterMethodOnEntity+" on "+entity+" (returned null)");
-                return result;
-            }
-        });
-    }
-
-    /** creates an instance given an entity and {@link AttributeSensor} to 
retrieve the PortForwardManager */ 
-    public static PortForwardManager fromAttributeOnEntity(final Entity 
entity, final AttributeSensor<PortForwardManager> attributeOnEntity) {
-        Preconditions.checkNotNull(entity);
-        Preconditions.checkNotNull(attributeOnEntity);
-        return new PortForwardManagerClient(new Supplier<PortForwardManager>() 
{
-            @Override
-            public PortForwardManager get() {
-                PortForwardManager result = 
entity.getAttribute(attributeOnEntity);
-                if (result==null)
-                    throw new IllegalStateException("No PortForwardManager 
available via "+attributeOnEntity+" on "+entity+" (returned null)");
-                return result;
-            }
-        });
-    }
-    
-    protected PortForwardManager getDelegate() {
-        if (_delegate==null) {
-            _delegate = delegateSupplier.get();
-        }
-        return _delegate;
-    }
-
-    @Override
-    public int acquirePublicPort(String publicIpId) {
-        return getDelegate().acquirePublicPort(publicIpId);
-    }
-
-    @Override
-    public void associate(String publicIpId, HostAndPort publicEndpoint, 
Location l, int privatePort) {
-        getDelegate().associate(publicIpId, publicEndpoint, l, privatePort);
-    }
-
-    @Override
-    public void associate(String publicIpId, HostAndPort publicEndpoint, int 
privatePort) {
-        getDelegate().associate(publicIpId, publicEndpoint, privatePort);
-    }
-
-    @Override
-    public HostAndPort lookup(Location l, int privatePort) {
-        return getDelegate().lookup(l, privatePort);
-    }
-
-    @Override
-    public HostAndPort lookup(String publicIpId, int privatePort) {
-        return getDelegate().lookup(publicIpId, privatePort);
-    }
-
-    @Override
-    public boolean forgetPortMapping(String publicIpId, int publicPort) {
-        return getDelegate().forgetPortMapping(publicIpId, publicPort);
-    }
-
-    @Override
-    public boolean forgetPortMappings(Location location) {
-        return getDelegate().forgetPortMappings(location);
-    }
-
-    @Override
-    public boolean forgetPortMappings(String publicIpId) {
-        return getDelegate().forgetPortMappings(publicIpId);
-    }
-
-    @Override
-    public String getId() {
-        return getDelegate().getId();
-    }
-
-    @Override
-    public String getScope() {
-        return getDelegate().getScope();
-    }
-
-    @Override
-    public void addAssociationListener(AssociationListener listener, 
Predicate<? super AssociationMetadata> filter) {
-        getDelegate().addAssociationListener(listener, filter);
-    }
-
-    @Override
-    public void removeAssociationListener(AssociationListener listener) {
-        getDelegate().removeAssociationListener(listener);
-    }
-
-    @Override
-    public String toVerboseString() {
-        return 
getClass().getName()+"[wrapping="+getDelegate().toVerboseString()+"]";
-    }
-
-    
///////////////////////////////////////////////////////////////////////////////////
-    // Deprecated
-    
///////////////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Reserves a unique public port for the purpose of forwarding to the 
given target,
-     * associated with a given location for subsequent lookup purpose.
-     * <p>
-     * If already allocated, returns the previously allocated.
-     * 
-     * @deprecated since 0.7.0; use {@link #acquirePublicPort(String)}, and 
then use {@link #associate(String, HostAndPort, int)} or {@link 
#associate(String, HostAndPort, Location, int)}
-     */
-    @Override
-    @Deprecated
-    public int acquirePublicPort(String publicIpId, Location l, int 
privatePort) {
-        return getDelegate().acquirePublicPort(publicIpId, l, privatePort);
-    }
-
-    /** 
-     * Returns old mapping if it existed, null if it is new.
-     * 
-     * @deprecated since 0.7.0; use {@link #associate(String, HostAndPort, 
int)} or {@link #associate(String, HostAndPort, Location, int)}
-     */
-    @Override
-    @Deprecated
-    public PortMapping acquirePublicPortExplicit(String publicIpId, int 
publicPort) {
-        return getDelegate().acquirePublicPortExplicit(publicIpId, publicPort);
-    }
-
-    /**
-     * Records a location and private port against a publicIp and public port,
-     * to support {@link #lookup(Location, int)}.
-     * <p>
-     * Superfluous if {@link #acquirePublicPort(String, Location, int)} was 
used,
-     * but strongly recommended if {@link #acquirePublicPortExplicit(String, 
int)} was used
-     * e.g. if the location is not known ahead of time.
-     * 
-     * @deprecated Use {@link #associate(String, HostAndPort, Location, int)}
-     */
-    @Override
-    @Deprecated
-    public void associate(String publicIpId, int publicPort, Location l, int 
privatePort) {
-        getDelegate().associate(publicIpId, publicPort, l, privatePort);
-    }
-
-    /**
-     * Records a public hostname or address to be associated with the given 
publicIpId for lookup purposes.
-     * <p>
-     * Conceivably this may have to be access-location specific.
-     * 
-     * @deprecated Use {@link #associate(String, HostAndPort, int)} or {@link 
#associate(String, HostAndPort, Location, int)}
-     */
-    @Override
-    @Deprecated
-    public void recordPublicIpHostname(String publicIpId, String 
hostnameOrPublicIpAddress) {
-        getDelegate().recordPublicIpHostname(publicIpId, 
hostnameOrPublicIpAddress);
-    }
-
-    /**
-     * Returns a recorded public hostname or address.
-     * 
-     * @deprecated Use {@link #lookup(String, int)} or {@link 
#lookup(Location, int)}
-     */
-    @Override
-    @Deprecated
-    public String getPublicIpHostname(String publicIpId) {
-        return getDelegate().getPublicIpHostname(publicIpId);
-    }
-    
-    /**
-     * Clears a previous call to {@link #recordPublicIpHostname(String, 
String)}.
-     * 
-     * @deprecated Use {@link #forgetPortMapping(String, int)} or {@link 
#forgetPortMapping(Location, int)}
-     */
-    @Override
-    @Deprecated
-    public boolean forgetPublicIpHostname(String publicIpId) {
-        return getDelegate().forgetPublicIpHostname(publicIpId);
-    }
-
-    @Override
-    @Deprecated
-    public boolean isClient() {
-        return true;
-    }
-
-
-    
///////////////////////////////////////////////////////////////////////////////////
-    // Deprecated; just internal
-    
///////////////////////////////////////////////////////////////////////////////////
-
-    /** 
-     * Returns the port mapping for a given publicIpId and public port.
-     * 
-     * @deprecated since 0.7.0; this method will be internal only
-     */
-    @Override
-    @Deprecated
-    public PortMapping getPortMappingWithPublicSide(String publicIpId, int 
publicPort) {
-        return getDelegate().getPortMappingWithPublicSide(publicIpId, 
publicPort);
-    }
-
-    /** 
-     * Returns the subset of port mappings associated with a given public IP 
ID.
-     * 
-     * @deprecated since 0.7.0; this method will be internal only
-     */
-    @Override
-    @Deprecated
-    public Collection<PortMapping> getPortMappingWithPublicIpId(String 
publicIpId) {
-        return getDelegate().getPortMappingWithPublicIpId(publicIpId);
-    }
-
-    /** 
-     * @see #forgetPortMapping(String, int)
-     * 
-     * @deprecated since 0.7.0; this method will be internal only
-     */
-    @Override
-    @Deprecated
-    public boolean forgetPortMapping(PortMapping m) {
-        return getDelegate().forgetPortMapping(m);
-    }
-
-    /**
-     * Returns the public host and port for use accessing the given mapping.
-     * <p>
-     * Conceivably this may have to be access-location specific.
-     * 
-     * @deprecated since 0.7.0; this method will be internal only
-     */
-    @Override
-    @Deprecated
-    public HostAndPort getPublicHostAndPort(PortMapping m) {
-        return getDelegate().getPublicHostAndPort(m);
-    }
-
-    /** 
-     * Returns the subset of port mappings associated with a given location.
-     * 
-     * @deprecated since 0.7.0; this method will be internal only
-     */
-    @Override
-    @Deprecated
-    public Collection<PortMapping> getLocationPublicIpIds(Location l) {
-        return getDelegate().getLocationPublicIpIds(l);
-    }
-        
-    /** 
-     * Returns the mapping to a given private port, or null if none.
-     * 
-     * @deprecated since 0.7.0; this method will be internal only
-     */
-    @Override
-    @Deprecated
-    public PortMapping getPortMappingWithPrivateSide(Location l, int 
privatePort) {
-        return getDelegate().getPortMappingWithPrivateSide(l, privatePort);
-    }
-    
-    @Override
-    public String toString() {
-        return getClass().getName()+"[id="+getId()+"]";
-    }
-
-    @Override
-    public String getDisplayName() {
-        return getDelegate().getDisplayName();
-    }
-
-    @Override
-    public Location getParent() {
-        return getDelegate().getParent();
-    }
-
-    @Override
-    public Collection<Location> getChildren() {
-        return getDelegate().getChildren();
-    }
-
-    @Override
-    public void setParent(Location newParent) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean containsLocation(Location potentialDescendent) {
-        return getDelegate().containsLocation(potentialDescendent);
-    }
-
-    @Override
-    public <T> T getConfig(ConfigKey<T> key) {
-        return getDelegate().getConfig(key);
-    }
-
-    @Override
-    public <T> T getConfig(HasConfigKey<T> key) {
-        return getDelegate().getConfig(key);
-    }
-
-    @Override
-    public boolean hasConfig(ConfigKey<?> key, boolean includeInherited) {
-        return getDelegate().hasConfig(key, includeInherited);
-    }
-
-    @Override
-    public Map<String, Object> getAllConfig(boolean includeInherited) {
-        return getDelegate().getAllConfig(includeInherited);
-    }
-
-    @Override
-    public boolean hasExtension(Class<?> extensionType) {
-        return getDelegate().hasExtension(extensionType);
-    }
-
-    @Override
-    public <T> T getExtension(Class<T> extensionType) {
-        return getDelegate().getExtension(extensionType);
-    }
-
-    @Override
-    public String getCatalogItemId() {
-        return getDelegate().getCatalogItemId();
-    }
-
-    @Override
-    public TagSupport tags() {
-        return getDelegate().tags();
-    }
-
-    @Override
-    public RelationSupport<Location> relations() {
-        return getDelegate().relations();
-    }
-    
-    @Override
-    public <T> T setConfig(ConfigKey<T> key, T val) {
-        return getDelegate().config().set(key, val);
-    }
-
-    @Override
-    public ConfigurationSupport config() {
-        return getDelegate().config();
-    }
-    
-    @Override
-    public SubscriptionSupport subscriptions() {
-        return getDelegate().subscriptions();
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerImpl.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerImpl.java
deleted file mode 100644
index 30be900..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerImpl.java
+++ /dev/null
@@ -1,505 +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.core.location.access;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.mgmt.rebind.RebindContext;
-import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
-import org.apache.brooklyn.api.mgmt.rebind.mementos.LocationMemento;
-import org.apache.brooklyn.core.location.AbstractLocation;
-import org.apache.brooklyn.core.mgmt.rebind.BasicLocationRebindSupport;
-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.Objects.ToStringHelper;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import com.google.common.net.HostAndPort;
-
-/**
- * 
- * @author aled
- *
- * TODO This implementation is not efficient, and currently has a cap of about 
50000 rules.
- * Need to improve the efficiency and scale.
- * A quick win could be to use a different portReserved counter for each 
publicIpId,
- * when calling acquirePublicPort?
- * 
- * TODO Callers need to be more careful in acquirePublicPort for which ports 
are actually in use.
- * If multiple apps sharing the same public-ip (e.g. in the same 
vcloud-director vOrg) then they 
- * must not allocate the same public port (e.g. ensure they share the same 
PortForwardManager
- * by using the same scope in 
- * {@code 
managementContext.getLocationRegistry().resolve("portForwardManager(scope=global)")}.
- * However, this still doesn't check if the port is *actually* available. For 
example, if a
- * different Brooklyn instance is also deploying there then we can get port 
conflicts, or if 
- * some ports in that range are already in use (e.g. due to earlier dev/test 
runs) then this
- * will not be respected. Callers should probably figure out the port number 
themselves, but
- * that also leads to concurrency issues.
- * 
- * TODO The publicIpId means different things to different callers:
- * <ul>
- *   <li> In acquirePublicPort() it is (often?) an identifier of the actual 
public ip.
- *   <li> In later calls to associate(), it is (often?) an identifier for the 
target machine
- *        such as the jcloudsMachine.getJcloudsId().
- * </ul>
- */
-@SuppressWarnings("serial")
-public class PortForwardManagerImpl extends AbstractLocation implements 
PortForwardManager {
-
-    private static final Logger log = 
LoggerFactory.getLogger(PortForwardManagerImpl.class);
-    
-    protected final Map<String,PortMapping> mappings = new 
LinkedHashMap<String,PortMapping>();
-
-    private final Map<AssociationListener, Predicate<? super 
AssociationMetadata>> associationListeners = new 
ConcurrentHashMap<AssociationListener, Predicate<? super 
AssociationMetadata>>();
-
-    @Deprecated
-    protected final Map<String,String> publicIpIdToHostname = new 
LinkedHashMap<String,String>();
-    
-    // horrible hack -- see javadoc above
-    private final AtomicInteger portReserved = new AtomicInteger(11000);
-
-    private final Object mutex = new Object();
-    
-    public PortForwardManagerImpl() {
-        super();
-        if (isLegacyConstruction()) {
-            log.warn("Deprecated construction of 
"+PortForwardManagerImpl.class.getName()+"; instead use location resolver");
-        }
-    }
-    
-    @Override
-    public void init() {
-        super.init();
-        Integer portStartingPoint;
-        Object rawPort = 
getAllConfigBag().getStringKey(PORT_FORWARD_MANAGER_STARTING_PORT.getName());
-        if (rawPort != null) {
-            portStartingPoint = getConfig(PORT_FORWARD_MANAGER_STARTING_PORT);
-        } else {
-            portStartingPoint = 
getManagementContext().getConfig().getConfig(PORT_FORWARD_MANAGER_STARTING_PORT);
-        }
-        portReserved.set(portStartingPoint);
-        log.debug(this+" set initial port to "+portStartingPoint);
-    }
-
-    // TODO Need to use attributes for these so they are persisted (once a 
location is an entity),
-    // rather than this deprecated approach of custom fields.
-    @Override
-    public RebindSupport<LocationMemento> getRebindSupport() {
-        return new BasicLocationRebindSupport(this) {
-            @Override public LocationMemento getMemento() {
-                Map<String, PortMapping> mappingsCopy;
-                Map<String,String> publicIpIdToHostnameCopy;
-                synchronized (mutex) {
-                    mappingsCopy = MutableMap.copyOf(mappings);
-                    publicIpIdToHostnameCopy = 
MutableMap.copyOf(publicIpIdToHostname);
-                }
-                return getMementoWithProperties(MutableMap.<String,Object>of(
-                        "mappings", mappingsCopy, 
-                        "portReserved", portReserved.get(), 
-                        "publicIpIdToHostname", publicIpIdToHostnameCopy));
-            }
-            @Override
-            protected void doReconstruct(RebindContext rebindContext, 
LocationMemento memento) {
-                super.doReconstruct(rebindContext, memento);
-                mappings.putAll( Preconditions.checkNotNull((Map<String, 
PortMapping>) memento.getCustomField("mappings"), "mappings was not serialized 
correctly"));
-                portReserved.set( 
(Integer)memento.getCustomField("portReserved"));
-                publicIpIdToHostname.putAll( 
Preconditions.checkNotNull((Map<String, 
String>)memento.getCustomField("publicIpIdToHostname"), "publicIpIdToHostname 
was not serialized correctly") );
-            }
-        };
-    }
-    
-    @Override
-    public int acquirePublicPort(String publicIpId) {
-        int port;
-        synchronized (mutex) {
-            // far too simple -- see javadoc above
-            port = getNextPort();
-            
-            // TODO When delete deprecated code, stop registering PortMapping 
until associate() is called
-            PortMapping mapping = new PortMapping(publicIpId, port, null, -1);
-            log.debug(this+" allocating public port "+port+" on "+publicIpId+" 
(no association info yet)");
-            
-            mappings.put(makeKey(publicIpId, port), mapping);
-        }
-        onChanged();
-        return port;
-    }
-
-    protected int getNextPort() {
-        // far too simple -- see javadoc above
-        return portReserved.getAndIncrement();
-    }
-    
-    @Override
-    public void associate(String publicIpId, HostAndPort publicEndpoint, 
Location l, int privatePort) {
-        associateImpl(publicIpId, publicEndpoint, l, privatePort);
-        emitAssociationCreatedEvent(publicIpId, publicEndpoint, l, 
privatePort);
-    }
-
-    @Override
-    public void associate(String publicIpId, HostAndPort publicEndpoint, int 
privatePort) {
-        associateImpl(publicIpId, publicEndpoint, null, privatePort);
-        emitAssociationCreatedEvent(publicIpId, publicEndpoint, null, 
privatePort);
-    }
-
-    protected void associateImpl(String publicIpId, HostAndPort 
publicEndpoint, Location l, int privatePort) {
-        synchronized (mutex) {
-            String publicIp = publicEndpoint.getHostText();
-            int publicPort = publicEndpoint.getPort();
-            recordPublicIpHostname(publicIpId, publicIp);
-            PortMapping mapping = new PortMapping(publicIpId, publicEndpoint, 
l, privatePort);
-            PortMapping oldMapping = getPortMappingWithPublicSide(publicIpId, 
publicPort);
-            log.debug(this+" associating public "+publicEndpoint+" on 
"+publicIpId+" with private port "+privatePort+" at "+l+" ("+mapping+")"
-                    +(oldMapping == null ? "" : " (overwriting "+oldMapping+" 
)"));
-            mappings.put(makeKey(publicIpId, publicPort), mapping);
-        }
-        onChanged();
-    }
-
-    private void emitAssociationCreatedEvent(String publicIpId, HostAndPort 
publicEndpoint, Location location, int privatePort) {
-        AssociationMetadata metadata = new AssociationMetadata(publicIpId, 
publicEndpoint, location, privatePort);
-        for (Map.Entry<AssociationListener, Predicate<? super 
AssociationMetadata>> entry : associationListeners.entrySet()) {
-            if (entry.getValue().apply(metadata)) {
-                try {
-                    entry.getKey().onAssociationCreated(metadata);
-                } catch (Exception e) {
-                    Exceptions.propagateIfFatal(e);
-                    log.warn("Exception thrown when emitting association 
creation event " + metadata, e);
-                }
-            }
-        }
-    }
-
-    @Override
-    public HostAndPort lookup(Location l, int privatePort) {
-        synchronized (mutex) {
-            for (PortMapping m: mappings.values()) {
-                if (l.equals(m.target) && privatePort == m.privatePort)
-                    return getPublicHostAndPort(m);
-            }
-        }
-        return null;
-    }
-    
-    @Override
-    public HostAndPort lookup(String publicIpId, int privatePort) {
-        synchronized (mutex) {
-            for (PortMapping m: mappings.values()) {
-                if (publicIpId.equals(m.publicIpId) && 
privatePort==m.privatePort)
-                    return getPublicHostAndPort(m);
-            }
-        }
-        return null;
-    }
-    
-    @Override
-    public boolean forgetPortMapping(String publicIpId, int publicPort) {
-        PortMapping old;
-        synchronized (mutex) {
-            old = mappings.remove(makeKey(publicIpId, publicPort));
-            if (old != null) {
-                
emitAssociationDeletedEvent(associationMetadataFromPortMapping(old));
-            }
-            log.debug("cleared port mapping for "+publicIpId+":"+publicPort+" 
- "+old);
-        }
-        if (old != null) onChanged();
-        return (old != null);
-    }
-    
-    @Override
-    public boolean forgetPortMappings(Location l) {
-        List<PortMapping> result = Lists.newArrayList();
-        synchronized (mutex) {
-            for (Iterator<PortMapping> iter = mappings.values().iterator(); 
iter.hasNext();) {
-                PortMapping m = iter.next();
-                if (l.equals(m.target)) {
-                    iter.remove();
-                    result.add(m);
-                    
emitAssociationDeletedEvent(associationMetadataFromPortMapping(m));
-                }
-            }
-        }
-        if (log.isDebugEnabled()) log.debug("cleared all port mappings for 
"+l+" - "+result);
-        if (!result.isEmpty()) {
-            onChanged();
-        }
-        return !result.isEmpty();
-    }
-    
-    @Override
-    public boolean forgetPortMappings(String publicIpId) {
-        List<PortMapping> result = Lists.newArrayList();
-        synchronized (mutex) {
-            for (Iterator<PortMapping> iter = mappings.values().iterator(); 
iter.hasNext();) {
-                PortMapping m = iter.next();
-                if (publicIpId.equals(m.publicIpId)) {
-                    iter.remove();
-                    result.add(m);
-                    
emitAssociationDeletedEvent(associationMetadataFromPortMapping(m));
-                }
-            }
-        }
-        if (log.isDebugEnabled()) log.debug("cleared all port mappings for 
"+publicIpId+" - "+result);
-        if (!result.isEmpty()) {
-            onChanged();
-        }
-        return !result.isEmpty();
-    }
-
-    private void emitAssociationDeletedEvent(AssociationMetadata metadata) {
-        for (Map.Entry<AssociationListener, Predicate<? super 
AssociationMetadata>> entry : associationListeners.entrySet()) {
-            if (entry.getValue().apply(metadata)) {
-                try {
-                    entry.getKey().onAssociationDeleted(metadata);
-                } catch (Exception e) {
-                    Exceptions.propagateIfFatal(e);
-                    log.warn("Exception thrown when emitting association 
creation event " + metadata, e);
-                }
-            }
-        }
-    }
-    
-    @Override
-    protected ToStringHelper string() {
-        int size;
-        synchronized (mutex) {
-            size = mappings.size();
-        }
-        return super.string().add("scope", getScope()).add("mappingsSize", 
size);
-    }
-
-    @Override
-    public String toVerboseString() {
-        String mappingsStr;
-        synchronized (mutex) {
-            mappingsStr = mappings.toString();
-        }
-        return string().add("mappings", mappingsStr).toString();
-    }
-
-    @Override
-    public String getScope() {
-        return checkNotNull(getConfig(SCOPE), "scope");
-    }
-
-    @Override
-    public boolean isClient() {
-        return false;
-    }
-
-    @Override
-    public void addAssociationListener(AssociationListener listener, 
Predicate<? super AssociationMetadata> filter) {
-        associationListeners.put(listener, filter);
-    }
-
-    @Override
-    public void removeAssociationListener(AssociationListener listener) {
-        associationListeners.remove(listener);
-    }
-
-    protected String makeKey(String publicIpId, int publicPort) {
-        return publicIpId+":"+publicPort;
-    }
-
-    private AssociationMetadata associationMetadataFromPortMapping(PortMapping 
portMapping) {
-        String publicIpId = portMapping.getPublicEndpoint().getHostText();
-        HostAndPort publicEndpoint = portMapping.getPublicEndpoint();
-        Location location = portMapping.getTarget();
-        int privatePort = portMapping.getPrivatePort();
-        return new AssociationMetadata(publicIpId, publicEndpoint, location, 
privatePort);
-    }
-    
-    
///////////////////////////////////////////////////////////////////////////////////
-    // Internal state, for generating memento
-    
///////////////////////////////////////////////////////////////////////////////////
-
-    public List<PortMapping> getPortMappings() {
-        synchronized (mutex) {
-            return ImmutableList.copyOf(mappings.values());
-        }
-    }
-    
-    public Map<String, Integer> getPortCounters() {
-        return ImmutableMap.of("global", portReserved.get());
-    }
-
-    
-    
///////////////////////////////////////////////////////////////////////////////////
-    // Deprecated
-    
///////////////////////////////////////////////////////////////////////////////////
-
-    @Override
-    @Deprecated
-    public PortMapping acquirePublicPortExplicit(String publicIpId, int port) {
-        PortMapping mapping = new PortMapping(publicIpId, port, null, -1);
-        log.debug("assigning explicit public port "+port+" at "+publicIpId);
-        PortMapping result;
-        synchronized (mutex) {
-            result = mappings.put(makeKey(publicIpId, port), mapping);
-        }
-        onChanged();
-        return result;
-    }
-
-    @Override
-    @Deprecated
-    public boolean forgetPortMapping(PortMapping m) {
-        return forgetPortMapping(m.publicIpId, m.publicPort);
-    }
-
-    @Override
-    @Deprecated
-    public void recordPublicIpHostname(String publicIpId, String 
hostnameOrPublicIpAddress) {
-        log.debug("recording public IP "+publicIpId+" associated with 
"+hostnameOrPublicIpAddress);
-        synchronized (mutex) {
-            String old = publicIpIdToHostname.put(publicIpId, 
hostnameOrPublicIpAddress);
-            if (old!=null && !old.equals(hostnameOrPublicIpAddress))
-                log.warn("Changing hostname recorded against public IP 
"+publicIpId+"; from "+old+" to "+hostnameOrPublicIpAddress);
-        }
-        onChanged();
-    }
-
-    @Override
-    @Deprecated
-    public String getPublicIpHostname(String publicIpId) {
-        synchronized (mutex) {
-            return publicIpIdToHostname.get(publicIpId);
-        }
-    }
-    
-    @Override
-    @Deprecated
-    public boolean forgetPublicIpHostname(String publicIpId) {
-        log.debug("forgetting public IP "+publicIpId+" association");
-        boolean result;
-        synchronized (mutex) {
-            result = (publicIpIdToHostname.remove(publicIpId) != null);
-        }
-        onChanged();
-        return result;
-    }
-
-    @Override
-    @Deprecated
-    public int acquirePublicPort(String publicIpId, Location l, int 
privatePort) {
-        int publicPort;
-        synchronized (mutex) {
-            PortMapping old = getPortMappingWithPrivateSide(l, privatePort);
-            // only works for 1 public IP ID per location (which is the norm)
-            if (old!=null && old.publicIpId.equals(publicIpId)) {
-                log.debug("request to acquire public port at "+publicIpId+" 
for "+l+":"+privatePort+", reusing old assignment "+old);
-                return old.getPublicPort();
-            }
-            
-            publicPort = acquirePublicPort(publicIpId);
-            log.debug("request to acquire public port at "+publicIpId+" for 
"+l+":"+privatePort+", allocating "+publicPort);
-            associateImpl(publicIpId, publicPort, l, privatePort);
-        }
-        onChanged();
-        return publicPort;
-    }
-
-    @Override
-    @Deprecated
-    public void associate(String publicIpId, int publicPort, Location l, int 
privatePort) {
-        synchronized (mutex) {
-            associateImpl(publicIpId, publicPort, l, privatePort);
-        }
-        onChanged();
-    }
-
-    protected void associateImpl(String publicIpId, int publicPort, Location 
l, int privatePort) {
-        synchronized (mutex) {
-            PortMapping mapping = new PortMapping(publicIpId, publicPort, l, 
privatePort);
-            PortMapping oldMapping = getPortMappingWithPublicSide(publicIpId, 
publicPort);
-            log.debug("associating public port "+publicPort+" on 
"+publicIpId+" with private port "+privatePort+" at "+l+" ("+mapping+")"
-                    +(oldMapping == null ? "" : " (overwriting "+oldMapping+" 
)"));
-            mappings.put(makeKey(publicIpId, publicPort), mapping);
-        }
-    }
-
-    
///////////////////////////////////////////////////////////////////////////////////
-    // Internal only; make protected when deprecated interface method removed
-    
///////////////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public HostAndPort getPublicHostAndPort(PortMapping m) {
-        if (m.publicEndpoint == null) {
-            String hostname = getPublicIpHostname(m.publicIpId);
-            if (hostname==null)
-                throw new IllegalStateException("No public hostname associated 
with "+m.publicIpId+" (mapping "+m+")");
-            return HostAndPort.fromParts(hostname, m.publicPort);
-        } else {
-            return m.publicEndpoint;
-        }
-    }
-
-    @Override
-    public PortMapping getPortMappingWithPublicSide(String publicIpId, int 
publicPort) {
-        synchronized (mutex) {
-            return mappings.get(makeKey(publicIpId, publicPort));
-        }
-    }
-
-    @Override
-    public Collection<PortMapping> getPortMappingWithPublicIpId(String 
publicIpId) {
-        List<PortMapping> result = new ArrayList<PortMapping>();
-        synchronized (mutex) {
-            for (PortMapping m: mappings.values())
-                if (publicIpId.equals(m.publicIpId)) result.add(m);
-        }
-        return result;
-    }
-
-    /** returns the subset of port mappings associated with a given location */
-    @Override
-    public Collection<PortMapping> getLocationPublicIpIds(Location l) {
-        List<PortMapping> result = new ArrayList<PortMapping>();
-        synchronized (mutex) {
-            for (PortMapping m: mappings.values())
-                if (l.equals(m.getTarget())) result.add(m);
-        }
-        return result;
-    }
-
-    @Override
-    public PortMapping getPortMappingWithPrivateSide(Location l, int 
privatePort) {
-        synchronized (mutex) {
-            for (PortMapping m: mappings.values())
-                if (l.equals(m.getTarget()) && privatePort==m.privatePort) 
return m;
-        }
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerLocationResolver.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerLocationResolver.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerLocationResolver.java
deleted file mode 100644
index 3a52877..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerLocationResolver.java
+++ /dev/null
@@ -1,89 +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.core.location.access;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationRegistry;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.core.location.AbstractLocationResolver;
-import org.apache.brooklyn.core.location.LocationConfigUtils;
-import org.apache.brooklyn.core.location.LocationPredicates;
-import org.apache.brooklyn.core.location.internal.LocationInternal;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Predicates;
-import com.google.common.collect.Iterables;
-
-public class PortForwardManagerLocationResolver extends 
AbstractLocationResolver {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(PortForwardManagerLocationResolver.class);
-
-    public static final String PREFIX = "portForwardManager";
-
-    @Override
-    public String getPrefix() {
-        return PREFIX;
-    }
-
-    @Override
-    public Location newLocationFromString(Map locationFlags, String spec, 
LocationRegistry registry) {
-        ConfigBag config = extractConfig(locationFlags, spec, registry);
-        Map globalProperties = registry.getProperties();
-        String namedLocation = (String) 
locationFlags.get(LocationInternal.NAMED_SPEC_NAME.getName());
-        String scope = config.get(PortForwardManager.SCOPE);
-
-        Optional<Location> result = 
Iterables.tryFind(managementContext.getLocationManager().getLocations(), 
-                Predicates.and(
-                        Predicates.instanceOf(PortForwardManager.class), 
-                        
LocationPredicates.configEqualTo(PortForwardManager.SCOPE, scope)));
-        
-        if (result.isPresent()) {
-            return result.get();
-        } else {
-            PortForwardManager loc = 
managementContext.getLocationManager().createLocation(LocationSpec.create(PortForwardManagerImpl.class)
-                    .configure(config.getAllConfig())
-                    .configure(LocationConfigUtils.finalAndOriginalSpecs(spec, 
locationFlags, globalProperties, namedLocation)));
-            
-            if (LOG.isDebugEnabled()) LOG.debug("Created "+loc+" for scope 
"+scope);
-            return loc;
-        }
-    }
-
-    @Override
-    protected Class<? extends Location> getLocationType() {
-        return PortForwardManager.class;
-    }
-
-    @Override
-    protected SpecParser getSpecParser() {
-        return new 
AbstractLocationResolver.SpecParser(getPrefix()).setExampleUsage("\"portForwardManager\"
 or \"portForwardManager(scope=global)\"");
-    }
-    
-    @Override
-    protected ConfigBag extractConfig(Map<?,?> locationFlags, String spec, 
LocationRegistry registry) {
-        ConfigBag config = super.extractConfig(locationFlags, spec, registry);
-        config.putAsStringKeyIfAbsent("name", "localhost");
-        return config;
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortMapping.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortMapping.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortMapping.java
deleted file mode 100644
index 06d92cb..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/access/PortMapping.java
+++ /dev/null
@@ -1,101 +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.core.location.access;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import javax.annotation.Nullable;
-
-import org.apache.brooklyn.api.location.Location;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-import com.google.common.net.HostAndPort;
-
-public class PortMapping {
-
-    final String publicIpId;
-    final HostAndPort publicEndpoint;
-    final int publicPort;
-
-    final Location target;
-    final int privatePort;
-    // TODO CIDR's ?
-
-    public PortMapping(String publicIpId, HostAndPort publicEndpoint, Location 
target, int privatePort) {
-        this.publicIpId = checkNotNull(publicIpId, "publicIpId");
-        this.publicEndpoint = checkNotNull(publicEndpoint, "publicEndpoint");
-        this.publicPort = publicEndpoint.getPort();
-        this.target = target;
-        this.privatePort = privatePort;
-    }
-    
-    public PortMapping(String publicIpId, int publicPort, Location target, int 
privatePort) {
-        this.publicIpId = checkNotNull(publicIpId, "publicIpId");
-        this.publicEndpoint = null;
-        this.publicPort = publicPort;
-        this.target = target;
-        this.privatePort = privatePort;
-    }
-
-    // In a release after 0.7.0, this will no longer be @Nullable
-    @Beta
-    @Nullable
-    public HostAndPort getPublicEndpoint() {
-        return publicEndpoint;
-    }
-
-    public int getPublicPort() {
-        return publicPort;
-    }
-
-    public Location getTarget() {
-        return target;
-    }
-    
-    public int getPrivatePort() {
-        return privatePort;
-    }
-    
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this)
-                .add("publicIpId", publicIpId+":"+publicPort)
-                .add("publicEndpoint", (publicEndpoint == null ? publicPort : 
publicEndpoint))
-                .add("targetLocation", target)
-                .add("targetPort", privatePort)
-                .toString();
-    }
-    
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof PortMapping)) return false;
-        PortMapping opm = (PortMapping)obj;
-        return Objects.equal(publicIpId, opm.publicIpId) &&
-            Objects.equal(publicPort, opm.publicPort) &&
-            Objects.equal(target, opm.target) &&
-            Objects.equal(privatePort, opm.privatePort);
-    }
-    
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(publicIpId, publicPort, target, privatePort);
-    }
-    
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractAvailabilityZoneExtension.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractAvailabilityZoneExtension.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractAvailabilityZoneExtension.java
deleted file mode 100644
index 267f708..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractAvailabilityZoneExtension.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.core.location.cloud;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-@Beta
-public abstract class AbstractAvailabilityZoneExtension implements 
AvailabilityZoneExtension {
-
-    protected final ManagementContext managementContext;
-    protected final AtomicReference<List<Location>> subLocations = new 
AtomicReference<List<Location>>();
-    private final Object mutex = new Object();
-    
-    public AbstractAvailabilityZoneExtension(ManagementContext 
managementContext) {
-        this.managementContext = checkNotNull(managementContext, 
"managementContext");
-    }
-
-    @Override
-    public List<Location> getSubLocations(int max) {
-        List<Location> all = getAllSubLocations();
-        return all.subList(0, Math.min(max, all.size()));
-    }
-
-    @Override
-    public List<Location> getSubLocationsByName(Predicate<? super String> 
namePredicate, int max) {
-        List<Location> result = Lists.newArrayList();
-        List<Location> all = getAllSubLocations();
-        for (Location loc : all) {
-            if (isNameMatch(loc, namePredicate)) {
-                result.add(loc);
-            }
-        }
-        return Collections.<Location>unmodifiableList(result);
-    }
-
-    @Override
-    public List<Location> getAllSubLocations() {
-        synchronized (mutex) {
-            if (subLocations.get() == null) {
-                List<Location> result = doGetAllSubLocations();
-                subLocations.set(ImmutableList.copyOf(result));
-            }
-        }
-        return subLocations.get();
-    }
-
-    /**
-     * <strong>Note</strong> this method can be called while synchronized on 
{@link #mutex}.
-     */
-    // TODO bad pattern, as this will likely call alien code (such as asking 
cloud provider?!)
-    protected abstract List<Location> doGetAllSubLocations();
-
-    protected abstract boolean isNameMatch(Location loc, Predicate<? super 
String> namePredicate);
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractCloudMachineProvisioningLocation.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractCloudMachineProvisioningLocation.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractCloudMachineProvisioningLocation.java
deleted file mode 100644
index 504033a..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractCloudMachineProvisioningLocation.java
+++ /dev/null
@@ -1,97 +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.core.location.cloud;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.location.MachineLocation;
-import org.apache.brooklyn.api.location.MachineProvisioningLocation;
-import org.apache.brooklyn.core.location.AbstractLocation;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.core.internal.ssh.SshTool;
-
-public abstract class AbstractCloudMachineProvisioningLocation extends 
AbstractLocation
-implements MachineProvisioningLocation<MachineLocation>, CloudLocationConfig
-{
-   public AbstractCloudMachineProvisioningLocation() {
-      super();
-   }
-
-    /** typically wants at least ACCESS_IDENTITY and ACCESS_CREDENTIAL */
-    public AbstractCloudMachineProvisioningLocation(Map<?,?> conf) {
-        super(conf);
-    }
-
-    /** uses reflection to create an object of the same type, assuming a Map 
constructor;
-     * subclasses can extend and downcast the result */
-    @Override
-    public AbstractCloudMachineProvisioningLocation newSubLocation(Map<?,?> 
newFlags) {
-        return newSubLocation(getClass(), newFlags);
-    }
-
-    public AbstractCloudMachineProvisioningLocation newSubLocation(Class<? 
extends AbstractCloudMachineProvisioningLocation> type, Map<?,?> newFlags) {
-        // TODO should be able to use ConfigBag.newInstanceExtending; would 
require moving stuff around to api etc
-        // TODO was previously `return 
LocationCreationUtils.newSubLocation(newFlags, this)`; need to retest on 
CloudStack etc
-        return 
getManagementContext().getLocationManager().createLocation(LocationSpec.create(type)
-                .parent(this)
-                .configure(config().getLocalBag().getAllConfig()) // FIXME 
Should this just be inherited?
-                .configure(newFlags));
-    }
-    
-    @Override
-    public Map<String, Object> getProvisioningFlags(Collection<String> tags) {
-        if (tags.size() > 0) {
-            LOG.warn("Location {}, ignoring provisioning tags {}", this, tags);
-        }
-        return MutableMap.<String, Object>of();
-    }
-
-    // ---------------- utilities --------------------
-    
-    protected ConfigBag extractSshConfig(ConfigBag setup, ConfigBag alt) {
-        ConfigBag sshConfig = new ConfigBag();
-        
-        if (setup.containsKey(PASSWORD)) {
-            sshConfig.put(SshTool.PROP_PASSWORD, setup.get(PASSWORD));
-        } else if (alt.containsKey(PASSWORD)) {
-            sshConfig.put(SshTool.PROP_PASSWORD, alt.get(PASSWORD));
-        }
-        
-        if (setup.containsKey(PRIVATE_KEY_DATA)) {
-            sshConfig.put(SshTool.PROP_PRIVATE_KEY_DATA, 
setup.get(PRIVATE_KEY_DATA));
-        } else if (setup.containsKey(PRIVATE_KEY_FILE)) {
-            sshConfig.put(SshTool.PROP_PRIVATE_KEY_FILE, 
setup.get(PRIVATE_KEY_FILE));
-        } else if (alt.containsKey(PRIVATE_KEY_DATA)) {
-            sshConfig.put(SshTool.PROP_PRIVATE_KEY_DATA, 
alt.get(PRIVATE_KEY_DATA));
-        }
-        
-        if (setup.containsKey(PRIVATE_KEY_PASSPHRASE)) {
-            // NB: not supported in jclouds (but it is by our ssh tool)
-            sshConfig.put(SshTool.PROP_PRIVATE_KEY_PASSPHRASE, 
setup.get(PRIVATE_KEY_PASSPHRASE));
-        }
-
-        // TODO extract other SshTool properties ?
-        
-        return sshConfig;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AvailabilityZoneExtension.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AvailabilityZoneExtension.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AvailabilityZoneExtension.java
deleted file mode 100644
index 657438d..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/AvailabilityZoneExtension.java
+++ /dev/null
@@ -1,54 +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.core.location.cloud;
-
-import java.util.List;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.entity.group.DynamicCluster;
-import org.apache.brooklyn.location.multi.MultiLocation;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Predicate;
-
-/**
- * For a location that has sub-zones within it (e.g. an AWS region has 
availability zones that can be
- * mapped as sub-locations), this extension interface allows those to be 
accessed and used.
- * For some well-known clouds, the availability zones are automatically set, 
although for others they may
- * have to be configured explicitly. The "multi:(locs,...)" location 
descriptor (cf {@link MultiLocation}) allows
- * this to be down at runtime.
- * <p>
- * Note that only entities which are explicitly aware of the {@link 
AvailabilityZoneExtension}
- * will use availability zone information. For example {@link DynamicCluster} 
- * <p>
- * Implementers are strongly encouraged to extend {@link 
AbstractAvailabilityZoneExtension}
- * which has useful behaviour, rather than attempt to implement this interface 
directly.
- * 
- * @since 0.6.0
- */
-@Beta
-public interface AvailabilityZoneExtension {
-
-    List<Location> getAllSubLocations();
-
-    List<Location> getSubLocations(int max);
-
-    List<Location> getSubLocationsByName(Predicate<? super String> 
namePredicate, int max);
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/CloudLocationConfig.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/CloudLocationConfig.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/CloudLocationConfig.java
deleted file mode 100644
index f749f64..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/CloudLocationConfig.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.core.location.cloud;
-
-import java.util.Collection;
-
-import com.google.common.annotations.Beta;
-import com.google.common.reflect.TypeToken;
-
-import org.apache.brooklyn.api.location.MachineLocationCustomizer;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.BasicConfigKey;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.location.LocationConfigKeys;
-import org.apache.brooklyn.util.core.flags.SetFromFlag;
-
-public interface CloudLocationConfig {
-
-    public static final ConfigKey<String> CLOUD_ENDPOINT = 
LocationConfigKeys.CLOUD_ENDPOINT;
-    public static final ConfigKey<String> CLOUD_REGION_ID = 
LocationConfigKeys.CLOUD_REGION_ID;
-    public static final ConfigKey<String> CLOUD_AVAILABILITY_ZONE_ID = 
LocationConfigKeys.CLOUD_AVAILABILITY_ZONE_ID;
-        
-    @SetFromFlag("identity")
-    public static final ConfigKey<String> ACCESS_IDENTITY = 
LocationConfigKeys.ACCESS_IDENTITY;
-    @SetFromFlag("credential")
-    public static final ConfigKey<String> ACCESS_CREDENTIAL = 
LocationConfigKeys.ACCESS_CREDENTIAL;
-
-    public static final ConfigKey<String> USER = LocationConfigKeys.USER;
-    
-    public static final ConfigKey<String> PASSWORD = 
LocationConfigKeys.PASSWORD;
-    public static final ConfigKey<String> PUBLIC_KEY_FILE = 
LocationConfigKeys.PUBLIC_KEY_FILE;
-    public static final ConfigKey<String> PUBLIC_KEY_DATA = 
LocationConfigKeys.PUBLIC_KEY_DATA;
-    public static final ConfigKey<String> PRIVATE_KEY_FILE = 
LocationConfigKeys.PRIVATE_KEY_FILE;
-    public static final ConfigKey<String> PRIVATE_KEY_DATA = 
LocationConfigKeys.PRIVATE_KEY_DATA;
-    public static final ConfigKey<String> PRIVATE_KEY_PASSPHRASE = 
LocationConfigKeys.PRIVATE_KEY_PASSPHRASE;
-
-    /** @deprecated since 0.6.0; included here so it gets picked up in 
auto-detect routines */ @Deprecated
-    public static final ConfigKey<String> LEGACY_PUBLIC_KEY_FILE = 
LocationConfigKeys.LEGACY_PUBLIC_KEY_FILE;
-    /** @deprecated since 0.6.0; included here so it gets picked up in 
auto-detect routines */ @Deprecated
-    public static final ConfigKey<String> LEGACY_PUBLIC_KEY_DATA = 
LocationConfigKeys.LEGACY_PUBLIC_KEY_DATA;
-    /** @deprecated since 0.6.0; included here so it gets picked up in 
auto-detect routines */ @Deprecated
-    public static final ConfigKey<String> LEGACY_PRIVATE_KEY_FILE = 
LocationConfigKeys.LEGACY_PRIVATE_KEY_FILE;
-    /** @deprecated since 0.6.0; included here so it gets picked up in 
auto-detect routines */ @Deprecated
-    public static final ConfigKey<String> LEGACY_PRIVATE_KEY_DATA = 
LocationConfigKeys.LEGACY_PRIVATE_KEY_DATA;
-    /** @deprecated since 0.6.0; included here so it gets picked up in 
auto-detect routines */ @Deprecated
-    public static final ConfigKey<String> LEGACY_PRIVATE_KEY_PASSPHRASE = 
LocationConfigKeys.LEGACY_PRIVATE_KEY_PASSPHRASE;
-
-    // default is just shy of common 64-char boundary, leaving 4 chars plus 
our salt allowance (default 4+1) which allows up to -12345678 by jclouds
-    public static final ConfigKey<Integer> VM_NAME_MAX_LENGTH = 
ConfigKeys.newIntegerConfigKey(
-        "vmNameMaxLength", "Maximum length of VM name", 60);
-
-    public static final ConfigKey<Integer> VM_NAME_SALT_LENGTH = 
ConfigKeys.newIntegerConfigKey(
-        "vmNameSaltLength", "Number of characters to use for a random 
identifier inserted in hostname "
-            + "to uniquely identify machines", 4);
-
-    public static final ConfigKey<String> POLL_FOR_FIRST_REACHABLE_ADDRESS = 
ConfigKeys.newStringConfigKey("pollForFirstReachableAddress", 
-            "Whether and how long to wait for reaching the VM's ip:port; "
-            + "if 'false', will default to the node's first public IP (or 
privae if no public IPs); "
-            + "if 'true' uses default duration; otherwise accepts a time 
string e.g. '5m' (the default) or a number of milliseconds", "5m");
-
-    public static final ConfigKey<String> WAIT_FOR_SSHABLE = 
ConfigKeys.newStringConfigKey("waitForSshable", 
-            "Whether and how long to wait for a newly provisioned VM to be 
accessible via ssh; " +
-            "if 'false', won't check; if 'true' uses default duration; 
otherwise accepts a time string e.g. '5m' (the default) or a number of 
milliseconds", "5m");
-
-    public static final ConfigKey<String> WAIT_FOR_WINRM_AVAILABLE = 
ConfigKeys.newStringConfigKey("waitForWinRmAvailable",
-            "Whether and how long to wait for a newly provisioned VM to be 
accessible via WinRm; " +
-                    "if 'false', won't check; if 'true' uses default duration; 
otherwise accepts a time string e.g. '30m' (the default) or a number of 
milliseconds", "30m");
-
-    public static final ConfigKey<Boolean> LOG_CREDENTIALS = 
ConfigKeys.newBooleanConfigKey(
-            "logCredentials", 
-            "Whether to log credentials of a new VM - strongly recommended 
never be used in production, as it is a big security hole!",
-            false);
-
-    public static final ConfigKey<Object> CALLER_CONTEXT = 
LocationConfigKeys.CALLER_CONTEXT;
-
-    public static final ConfigKey<Boolean> DESTROY_ON_FAILURE = 
ConfigKeys.newBooleanConfigKey("destroyOnFailure", "Whether to destroy the VM 
if provisioningLocation.obtain() fails", true);
-    
-    public static final ConfigKey<Object> INBOUND_PORTS = new 
BasicConfigKey<Object>(Object.class, "inboundPorts", 
-        "Inbound ports to be applied when creating a VM, on supported clouds " 
+
-            "(either a single port as a String, or an Iterable<Integer> or 
Integer[])", null);
-    @Beta
-    public static final ConfigKey<Object> ADDITIONAL_INBOUND_PORTS = new 
BasicConfigKey<Object>(Object.class, "required.ports", 
-            "Required additional ports to be applied when creating a VM, on 
supported clouds " +
-                    "(either a single port as an Integer, or an 
Iterable<Integer> or Integer[])", null);
-    
-    public static final ConfigKey<Boolean> OS_64_BIT = 
ConfigKeys.newBooleanConfigKey("os64Bit", 
-        "Whether to require 64-bit OS images (true), 32-bit images (false), or 
either (null)");
-    
-    public static final ConfigKey<Object> MIN_RAM = new 
BasicConfigKey<Object>(Object.class, "minRam",
-        "Minimum amount of RAM, either as string (4gb) or number of MB (4096), 
for use in selecting the machine/hardware profile", null);
-    
-    public static final ConfigKey<Integer> MIN_CORES = new 
BasicConfigKey<Integer>(Integer.class, "minCores",
-        "Minimum number of cores, for use in selecting the machine/hardware 
profile", null);
-    
-    public static final ConfigKey<Object> MIN_DISK = new 
BasicConfigKey<Object>(Object.class, "minDisk",
-        "Minimum size of disk, either as string (100gb) or number of GB (100), 
for use in selecting the machine/hardware profile", null);
-
-    public static final ConfigKey<String> DOMAIN_NAME = new 
BasicConfigKey<String>(String.class, "domainName",
-        "DNS domain where the host should be created, e.g. yourdomain.com 
(selected clouds only)", null);
-
-    @SuppressWarnings("serial")
-    public static final ConfigKey<Collection<MachineLocationCustomizer>> 
MACHINE_LOCATION_CUSTOMIZERS = ConfigKeys.newConfigKey(
-            new TypeToken<Collection<MachineLocationCustomizer>>() {},
-            "machineCustomizers", "Optional machine customizers");
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/AbstractCloudMachineNamer.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/AbstractCloudMachineNamer.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/AbstractCloudMachineNamer.java
deleted file mode 100644
index 7f38964..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/AbstractCloudMachineNamer.java
+++ /dev/null
@@ -1,150 +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.core.location.cloud.names;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.objs.HasShortName;
-import org.apache.brooklyn.core.location.cloud.CloudLocationConfig;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.text.Identifiers;
-import org.apache.brooklyn.util.text.Strings;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.CharMatcher;
-
-/** 
- * Implements <b>most</b> of {@link CloudMachineNamer},
- * leaving just one method -- {@link #generateNewIdOfLength(int)} --
- * for subclasses to provide.
- * <p>
- * {@link CloudLocationConfig#VM_NAME_MAX_LENGTH} is used to find the VM 
length, 
- * unless {@link #getCustomMaxNameLength(ConfigBag)} is overridden or
- * {@link #setDefaultMachineNameMaxLength(int)} invoked on the instance 
supplied.
- */
-public abstract class AbstractCloudMachineNamer implements CloudMachineNamer {
-
-    int defaultMachineNameMaxLength = 
CloudLocationConfig.VM_NAME_MAX_LENGTH.getDefaultValue();
-    int defaultMachineNameSaltLength = 
CloudLocationConfig.VM_NAME_SALT_LENGTH.getDefaultValue();
-    protected String separator = "-";
-
-    public String generateNewMachineUniqueName(ConfigBag setup) {
-        return generateNewIdReservingLength(setup, 0);
-    }
-    
-    public String generateNewMachineUniqueNameFromGroupId(ConfigBag setup, 
String groupId) {
-        int availSaltLength = getMaxNameLength(setup) - (groupId.length() + 
separator.length());
-        int requestedSaltLength = getLengthForMachineUniqueNameSalt(setup, 
false);
-        if (availSaltLength <= 0 || requestedSaltLength <= 0) {
-            return groupId;
-        }
-            
-        return sanitize(groupId + separator + 
Identifiers.makeRandomId(Math.min(requestedSaltLength, 
availSaltLength))).toLowerCase();
-    }
-
-    public String generateNewGroupId(ConfigBag setup) {
-        return sanitize(generateNewIdReservingLength(setup, 
getLengthForMachineUniqueNameSalt(setup, true))).toLowerCase();
-    }
-
-    protected String generateNewIdReservingLength(ConfigBag setup, int 
lengthToReserve) {
-        int len = getMaxNameLength(setup);
-        // decrement by e.g. 9 chars because jclouds adds that (dash plus 8 
for hex id)
-        len -= lengthToReserve;
-        if (len<=0) return "";
-        return Strings.maxlen(generateNewIdOfLength(setup, len), len);
-    }
-    
-    /** Method for subclasses to provide to construct the context-specific 
part of an identifier,
-     * for use in {@link #generateNewGroupId()} and {@link 
#generateNewMachineUniqueName()}.
-     * 
-     * @param maxLengthHint an indication of the maximum length permitted for 
the ID generated,
-     * supplied for implementations which wish to use this information to 
decide what to truncate.
-     * (This class will truncate any return values longer than this.) 
-     */
-    protected abstract String generateNewIdOfLength(ConfigBag setup, int 
maxLengthHint);
-
-    /** Returns the max length of a VM name for the cloud specified in setup;
-     * this value is typically decremented by 9 to make room for jclouds 
labels;
-     * delegates to {@link #getCustomMaxNameLength()} when 
-     * {@link CloudLocationConfig#VM_NAME_MAX_LENGTH} is not set */
-    public int getMaxNameLength(ConfigBag setup) {
-        if (setup.containsKey(CloudLocationConfig.VM_NAME_MAX_LENGTH)) {
-            // if a length is set explicitly, use that (but intercept default 
behaviour)
-            return setup.get(CloudLocationConfig.VM_NAME_MAX_LENGTH);
-        }
-        
-        Integer custom = getCustomMaxNameLength(setup);
-        if (custom!=null) return custom;
-        
-        // return the default
-        return defaultMachineNameMaxLength;  
-    }
-    
-    // sometimes we create salt string, sometimes jclouds does
-    public int getLengthForMachineUniqueNameSalt(ConfigBag setup, boolean 
includeSeparator) {
-        int saltLen;
-        if (setup.containsKey(CloudLocationConfig.VM_NAME_SALT_LENGTH)) {
-            saltLen = setup.get(CloudLocationConfig.VM_NAME_SALT_LENGTH);
-        } else {
-            // default value comes from key, but custom default can be set
-            saltLen = defaultMachineNameSaltLength;
-        }
-        
-        if (saltLen>0 && includeSeparator)
-            saltLen += separator.length();
-        
-        return saltLen;
-    }
-    
-    public AbstractCloudMachineNamer setDefaultMachineNameMaxLength(int 
defaultMaxLength) {
-        this.defaultMachineNameMaxLength = defaultMaxLength;
-        return this;
-    }
-
-    /** Number of chars to use or reserve for the machine identifier when 
constructing a group identifier;
-     * jclouds for instance uses "-" plus 8 */
-    public AbstractCloudMachineNamer 
setDefaultMachineNameSeparatorAndSaltLength(String separator, int 
defaultMachineUniqueNameSaltLength) {
-        this.separator = separator;
-        this.defaultMachineNameSaltLength = defaultMachineUniqueNameSaltLength;
-        return this;
-    }
-    
-    /** Method for overriding to provide custom logic when an explicit config 
key is not set for the machine length. */
-    public Integer getCustomMaxNameLength(ConfigBag setup) {
-        return null;
-    }
-
-    protected static String shortName(Object x) {
-        if (x instanceof HasShortName) {
-            return ((HasShortName)x).getShortName();
-        }
-        if (x instanceof Entity) {
-            return ((Entity)x).getDisplayName();
-        }
-        return x.toString();
-    }
-
-    @Beta //probably won't live here long-term
-    public static String sanitize(String s) {
-        return CharMatcher.inRange('A', 'Z')
-                .or(CharMatcher.inRange('a', 'z'))
-                .or(CharMatcher.inRange('0', '9'))
-                .negate()
-                .trimAndCollapseFrom(s, '-');
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/BasicCloudMachineNamer.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/BasicCloudMachineNamer.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/BasicCloudMachineNamer.java
deleted file mode 100644
index 38ecbe5..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/BasicCloudMachineNamer.java
+++ /dev/null
@@ -1,96 +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.core.location.cloud.names;
-
-import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.core.location.cloud.CloudLocationConfig;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.text.StringShortener;
-import org.apache.brooklyn.util.text.Strings;
-
-/** 
- * Standard implementation of {@link CloudMachineNamer},
- * which looks at several of the properties of the context (entity)
- * and is clever about abbreviating them. */
-public class BasicCloudMachineNamer extends AbstractCloudMachineNamer {
-
-    @Override
-    protected String generateNewIdOfLength(ConfigBag setup, int len) {
-        Object context = setup.peek(CloudLocationConfig.CALLER_CONTEXT);
-        Entity entity = null;
-        if (context instanceof Entity) entity = (Entity) context;
-        
-        StringShortener shortener = Strings.shortener().separator("-");
-        shortener.append("system", "brooklyn");
-        
-        /* timeStamp replaces the previously used randId. 
-         * 
-         * timeStamp uses the standard unix timestamp represented as a 8-char 
hex string.
-         * 
-         * It represents the moment in time when the name is constructed. 
-         * It gives the possibility to search easily for instances, security 
groups, keypairs, etc
-         * based on timestamp without complicated enumeration        
-         */ 
-        shortener.append("timeStamp", Long.toString(System.currentTimeMillis() 
/ 1000L, Character.MAX_RADIX));
-        
-        String user = System.getProperty("user.name");
-        if (!"brooklyn".equals(user))
-            // include user; unless the user is 'brooklyn', as 
'brooklyn-brooklyn-' is just silly!
-            shortener.append("user", user);
-        
-        if (entity!=null) {
-            Application app = entity.getApplication();
-            if (app!=null) {
-                shortener.append("app", shortName(app))
-                        .append("appId", app.getId());
-            }
-            shortener.append("entity", shortName(entity))
-                    .append("entityId", entity.getId());
-        } else if (context!=null) {
-            shortener.append("context", context.toString());
-        }
-        
-        shortener.truncate("user", 12)
-                .truncate("app", 16)
-                .truncate("entity", 16)
-                .truncate("appId", 4)
-                .truncate("entityId", 4)
-                .truncate("context", 12);
-        
-        shortener.canTruncate("user", 8)
-                .canTruncate("app", 5)
-                .canTruncate("entity", 5)
-                .canTruncate("system", 2)
-                .canTruncate("app", 3)
-                .canTruncate("entity", 3)
-                .canRemove("app")
-                .canTruncate("user", 4)
-                .canRemove("entity")
-                .canTruncate("context", 4)
-                .canTruncate("timeStamp", 6)
-                .canRemove("user")
-                .canTruncate("appId", 2)
-                .canRemove("appId");
-        
-        String s = shortener.getStringOfMaxLength(len);
-        return sanitize(s).toLowerCase();
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/CloudMachineNamer.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/CloudMachineNamer.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/CloudMachineNamer.java
deleted file mode 100644
index d963a4e..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/CloudMachineNamer.java
+++ /dev/null
@@ -1,61 +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.core.location.cloud.names;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.core.location.cloud.CloudLocationConfig;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-
-/**
- * Interface used to construct names for individual cloud machines and for 
groups of machines.
- * <p>
- * Implementations <b>must</b> provide a constructor which takes a single 
argument,
- * being the {@link ConfigBag} for the context where the machine is being 
created
- * (usually a {@link Location}).
- * <p>
- * With that bag, the config key {@link CloudLocationConfig#CALLER_CONTEXT}
- * typically contains the {@link Entity} for which the machine is being 
created.   
- */
-public interface CloudMachineNamer {
-
-    /**
-     * Generate a name for a new machine, based on context.
-     * <p>
-     * The name should normally be unique, as a context might produce multiple 
machines,
-     * for example basing it partially on information from the context but 
also including some random salt.
-     */
-    public String generateNewMachineUniqueName(ConfigBag setup);
-    /**
-     * Generate a name stem for a group of machines, based on context.
-     * <p>
-     * The name does not need to be unique, as uniqueness will be applied by 
{@link #generateNewMachineUniqueNameFromGroupId(String)}.
-     */
-    public String generateNewGroupId(ConfigBag setup);
-    
-    /**
-     * Generate a unique name from the given name stem.
-     * <p>
-     * The name stem is normally based on context information so the usual
-     * function of this method is to apply a suffix which helps to uniquely 
distinguish between machines
-     * in cases where the same name stem ({@link #generateNewGroupId()}) is 
used for multiple machines.
-     */
-    public String generateNewMachineUniqueNameFromGroupId(ConfigBag setup, 
String groupId);
-    
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/CustomMachineNamer.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/CustomMachineNamer.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/CustomMachineNamer.java
deleted file mode 100644
index 0111f99..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/cloud/names/CustomMachineNamer.java
+++ /dev/null
@@ -1,72 +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.core.location.cloud.names;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.entity.EntityInternal;
-import org.apache.brooklyn.core.location.cloud.CloudLocationConfig;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.core.text.TemplateProcessor;
-import org.apache.brooklyn.util.text.Strings;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.reflect.TypeToken;
-
-/** Provides a machine namer which looks at a location config key {@link 
#MACHINE_NAME_TEMPLATE}
- * to construct the hostname.
- * For instance, setting this to <code>${config.entity_hostname}</code>
- * will take the hostname from an <code>entity_hostname</code> key passed as 
entity <code>brooklyn.config</code>.
- * <p>
- * Note that this is not jclouds aware, so jclouds-specific cloud max lengths 
are not observed with this class.
- */
-public class CustomMachineNamer extends BasicCloudMachineNamer {
-    
-    public static final ConfigKey<String> MACHINE_NAME_TEMPLATE = 
ConfigKeys.newStringConfigKey("custom.machine.namer.machine", 
-            "Freemarker template format for custom machine name", 
"${entity.displayName}");
-    @SuppressWarnings("serial")
-    public static final ConfigKey<Map<String, ?>> EXTRA_SUBSTITUTIONS = 
ConfigKeys.newConfigKey(new TypeToken<Map<String, ?>>() {}, 
-            "custom.machine.namer.substitutions", "Additional substitutions to 
be used in the template", ImmutableMap.<String, Object>of());
-    
-    @Override
-    protected String generateNewIdOfLength(ConfigBag setup, int len) {
-        Object context = setup.peek(CloudLocationConfig.CALLER_CONTEXT);
-        Entity entity = null;
-        if (context instanceof Entity) {
-            entity = (Entity) context;
-        }
-        
-        String template = setup.get(MACHINE_NAME_TEMPLATE);
-        
-        String processed;
-        if (entity == null) {
-            processed = TemplateProcessor.processTemplateContents(template, 
setup.get(EXTRA_SUBSTITUTIONS));
-        } else {
-            processed = TemplateProcessor.processTemplateContents(template, 
(EntityInternal)entity, setup.get(EXTRA_SUBSTITUTIONS));
-        }
-        
-        processed = Strings.removeFromStart(processed, "#ftl\n");
-        
-        return sanitize(processed);
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/dynamic/DynamicLocation.java
----------------------------------------------------------------------
diff --git 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/dynamic/DynamicLocation.java
 
b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/dynamic/DynamicLocation.java
deleted file mode 100644
index b04ebac..0000000
--- 
a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/dynamic/DynamicLocation.java
+++ /dev/null
@@ -1,50 +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.core.location.dynamic;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.util.core.flags.SetFromFlag;
-
-import com.google.common.annotations.Beta;
-
-/**
- * A location that is created and owned by an entity at runtime.
- * <p>
- * The lifecycle of the location is managed by the owning entity.
- *
- * @param E the entity type
- * @param L the location type
- */
-@Beta
-public interface DynamicLocation<E extends Entity & LocationOwner<L, E>, L 
extends Location & DynamicLocation<E, L>> {
-
-    @SetFromFlag("owner")
-    ConfigKey<Entity> OWNER =
-            ConfigKeys.newConfigKey(Entity.class, "owner", "The entity owning 
this location");
-
-    @SetFromFlag("maxLocations")
-    ConfigKey<Integer> MAX_SUB_LOCATIONS =
-            ConfigKeys.newIntegerConfigKey("maxLocations", "The maximum number 
of sub-locations that can be created; 0 for unlimited", 0);
-
-    E getOwner();
-
-}

Reply via email to