You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/01 18:50:54 UTC
[12/51] [abbrv] [partial] brooklyn-server git commit: move subdir
from incubator up a level as it is promoted to its own repo (first
non-incubator commit!)
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/ConcurrentMapAcceptingNullVals.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/ConcurrentMapAcceptingNullVals.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/ConcurrentMapAcceptingNullVals.java
deleted file mode 100644
index c0d02c2..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/ConcurrentMapAcceptingNullVals.java
+++ /dev/null
@@ -1,272 +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.internal.storage.impl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
-
-import javax.annotation.Nullable;
-
-/**
- * A decorator for a ConcurrentMap that allows null values to be used.
- *
- * However, {@link #values()} and {@link #entrySet()} return immutable snapshots
- * of the map's contents. This may be revisited in a future version.
- *
- * @author aled
- */
-public class ConcurrentMapAcceptingNullVals<K, V> implements ConcurrentMap<K, V> {
-
- private static enum Marker {
- NULL;
- }
-
- private final ConcurrentMap<K, V> delegate;
-
- public ConcurrentMapAcceptingNullVals(ConcurrentMap<K,V> delegate) {
- this.delegate = checkNotNull(delegate, "delegate");
- }
-
- @Override
- public void clear() {
- delegate.clear();
- }
-
- @Override
- public boolean containsKey(Object key) {
- return delegate.containsKey(key);
- }
-
- @Override
- public boolean containsValue(Object value) {
- return delegate.containsValue(toNonNullValue(value));
- }
-
- @Override
- public Set<Map.Entry<K, V>> entrySet() {
- // Note that returns an immutable snapshot
- Set<Map.Entry<K, V>> result = new LinkedHashSet<Map.Entry<K, V>>(delegate.size());
- for (Map.Entry<K, V> entry : delegate.entrySet()) {
- result.add(new AbstractMap.SimpleEntry<K,V>(entry.getKey(), (V)fromNonNullValue(entry.getValue())));
- }
- return Collections.unmodifiableSet(result);
- }
-
- @Override
- public Collection<V> values() {
- // Note that returns an immutable snapshot
- List<V> result = new ArrayList<V>(delegate.size());
- for (V v : delegate.values()) {
- result.add((V)fromNonNullValue(v));
- }
- return Collections.unmodifiableCollection(result);
- }
-
- @Override
- public Set<K> keySet() {
- return delegate.keySet();
- }
-
- @Override
- public V get(Object key) {
- return (V) fromNonNullValue(delegate.get(key));
- }
-
- @Override
- public boolean isEmpty() {
- return delegate.isEmpty();
- }
-
- @Override
- public V put(K key, V value) {
- return (V) fromNonNullValue(delegate.put(key, (V) toNonNullValue(value)));
- }
-
- @Override
- public void putAll(Map<? extends K, ? extends V> vals) {
- for (Map.Entry<? extends K, ? extends V> entry : vals.entrySet()) {
- put(entry.getKey(), entry.getValue());
- }
- }
-
- @Override
- public V remove(Object key) {
- return (V) fromNonNullValue(delegate.remove(key));
- }
-
- @Override
- public int size() {
- return delegate.size();
- }
-
- @Override
- public V putIfAbsent(K key, V value) {
- return (V) fromNonNullValue(delegate.putIfAbsent(key, (V) toNonNullValue(value)));
- }
-
- @Override
- public boolean remove(Object key, Object value) {
- return delegate.remove(key, (V) toNonNullValue(value));
- }
-
- @Override
- public V replace(K key, V value) {
- return (V) fromNonNullValue(delegate.replace(key, (V) toNonNullValue(value)));
- }
-
- @Override
- public boolean replace(K key, V oldValue, V newValue) {
- return delegate.replace(key, (V) toNonNullValue(oldValue), (V) toNonNullValue(newValue));
- }
-
- private static class SetWithNullVals<T> implements Set<T> {
-
- private final Set<T> delegate;
-
- public SetWithNullVals(Set<T> delegate) {
- this.delegate = delegate;
- }
-
- @Override
- public boolean add(T e) {
- return delegate.add(e); // unsupported; let delegate give exception
- }
-
- @Override
- public boolean addAll(Collection<? extends T> c) {
- return delegate.addAll(c); // unsupported; let delegate give exception
- }
-
- @Override
- public void clear() {
- delegate.clear();
- }
-
- @Override
- public boolean contains(Object o) {
- return delegate.contains(toNonNullValue(o));
- }
-
- @Override
- public boolean containsAll(Collection<?> c) {
- for (Object e : c) {
- if (!delegate.contains(toNonNullValue(e))) return false;
- }
- return true;
- }
-
- @Override
- public boolean isEmpty() {
- return delegate.isEmpty();
- }
-
- @Override
- public Iterator<T> iterator() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean remove(Object o) {
- return delegate.remove(toNonNullValue(o));
- }
-
- @Override
- public boolean removeAll(Collection<?> c) {
- boolean result = false;
- for (Object e : c) {
- result = result & delegate.remove(toNonNullValue(e));
- }
- return result;
- }
-
- @Override
- public boolean retainAll(Collection<?> c) {
- boolean result = false;
- for (Iterator<T> iter = delegate.iterator(); iter.hasNext();) {
- T e = iter.next();
- if (!c.contains(fromNonNullValue(e))) {
- iter.remove();
- result = true;
- }
- }
- return result;
- }
-
- @Override
- public int size() {
- return delegate.size();
- }
-
- @Override
- public Object[] toArray() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public <T> T[] toArray(T[] a) {
- // TODO Auto-generated method stub
- return null;
- }
-
- }
-
- private static Object toNonNullValue(Object value) {
- return (value != null) ? value : Marker.NULL;
- }
-
- private static Object fromNonNullValue(Object value) {
- return (value == Marker.NULL) ? null : value;
- }
-
- @Override
- public boolean equals(@Nullable Object object) {
- // copied from guava's non-public method Maps.equalsImpl
- if (this == object) {
- return true;
- }
- if (object instanceof Map) {
- Map<?, ?> o = (Map<?, ?>) object;
- return entrySet().equals(o.entrySet());
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- // copied from guava's ImmutableMap.hashCode
- return entrySet().hashCode();
- }
-
- @Override
- public String toString() {
- return delegate.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/inmemory/InMemoryDataGridFactory.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/inmemory/InMemoryDataGridFactory.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/inmemory/InMemoryDataGridFactory.java
deleted file mode 100644
index 0ce0aa7..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/inmemory/InMemoryDataGridFactory.java
+++ /dev/null
@@ -1,40 +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.internal.storage.impl.inmemory;
-
-import org.apache.brooklyn.core.internal.storage.DataGrid;
-import org.apache.brooklyn.core.internal.storage.DataGridFactory;
-import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
-
-public class InMemoryDataGridFactory implements DataGridFactory {
-
- public static DataGridFactory ofInstance(final DataGrid datagrid) {
- return new DataGridFactory() {
- @Override
- public DataGrid newDataGrid(ManagementContextInternal managementContext) {
- return datagrid;
- }
- };
- }
-
- @Override
- public DataGrid newDataGrid(ManagementContextInternal managementContext) {
- return new InmemoryDatagrid();
- }
-}
\ 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/internal/storage/impl/inmemory/InmemoryDatagrid.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/inmemory/InmemoryDatagrid.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/inmemory/InmemoryDatagrid.java
deleted file mode 100644
index 48600d9..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/internal/storage/impl/inmemory/InmemoryDatagrid.java
+++ /dev/null
@@ -1,93 +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.internal.storage.impl.inmemory;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.brooklyn.core.internal.storage.DataGrid;
-import org.apache.brooklyn.core.internal.storage.impl.ConcurrentMapAcceptingNullVals;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
-
-/**
- * A simple implementation of datagrid backed by in-memory (unpersisted) maps, within a single JVM.
- *
- * @author aled
- */
-public class InmemoryDatagrid implements DataGrid {
-
- private final Map<String,Map<?,?>> maps = Maps.newLinkedHashMap();
- private final AtomicInteger creationCounter = new AtomicInteger();
-
- @SuppressWarnings("unchecked")
- @Override
- public <K, V> ConcurrentMap<K, V> getMap(String id) {
- synchronized (maps) {
- ConcurrentMap<K, V> result = (ConcurrentMap<K, V>) maps.get(id);
- if (result == null) {
- result = newMap();
- maps.put(id, result);
- creationCounter.incrementAndGet();
- }
- return result;
- }
- }
-
- // TODO Not doing Maps.newConcurrentMap() because needs to store null values.
- // Easy to avoid for Refererence<?> but harder for entity ConfigMap where the user
- // can insert null values.
- //
- // Could write a decorator that switches null values for a null marker, and back again.
- //
- private <K,V> ConcurrentMap<K,V> newMap() {
- //return Collections.synchronizedMap(new HashMap<K, V>());
- return new ConcurrentMapAcceptingNullVals<K,V>(Maps.<K,V>newConcurrentMap());
- }
-
- @Override
- public void remove(String id) {
- synchronized (maps) {
- maps.remove(id);
- }
- }
-
- @Override
- public void terminate() {
- synchronized (maps) {
- maps.clear();
- }
- }
-
- @Override
- public Map<String, Object> getDatagridMetrics() {
- synchronized (maps) {
- return ImmutableMap.<String, Object>of("size", maps.size(), "createCount", creationCounter.get());
- }
- }
-
- @Override
- public Set<String> getKeys() {
- return maps.keySet();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java
deleted file mode 100644
index dc48862..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java
+++ /dev/null
@@ -1,794 +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;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.brooklyn.util.JavaGroovyEquivalents.groovyTruth;
-import static org.apache.brooklyn.util.groovy.GroovyJavaMethods.elvis;
-
-import java.io.Closeable;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.Group;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.mgmt.ExecutionContext;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.mgmt.SubscriptionContext;
-import org.apache.brooklyn.api.mgmt.SubscriptionHandle;
-import org.apache.brooklyn.api.mgmt.Task;
-import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
-import org.apache.brooklyn.api.mgmt.rebind.mementos.LocationMemento;
-import org.apache.brooklyn.api.objs.Configurable;
-import org.apache.brooklyn.api.sensor.Sensor;
-import org.apache.brooklyn.api.sensor.SensorEventListener;
-import org.apache.brooklyn.config.ConfigInheritance;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
-import org.apache.brooklyn.core.BrooklynFeatureEnablement;
-import org.apache.brooklyn.core.config.BasicConfigKey;
-import org.apache.brooklyn.core.config.ConfigConstraints;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.internal.storage.BrooklynStorage;
-import org.apache.brooklyn.core.internal.storage.Reference;
-import org.apache.brooklyn.core.internal.storage.impl.BasicReference;
-import org.apache.brooklyn.core.location.geo.HasHostGeoInfo;
-import org.apache.brooklyn.core.location.geo.HostGeoInfo;
-import org.apache.brooklyn.core.location.internal.LocationDynamicType;
-import org.apache.brooklyn.core.location.internal.LocationInternal;
-import org.apache.brooklyn.core.mgmt.internal.LocalLocationManager;
-import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
-import org.apache.brooklyn.core.mgmt.internal.SubscriptionTracker;
-import org.apache.brooklyn.core.mgmt.rebind.BasicLocationRebindSupport;
-import org.apache.brooklyn.core.objs.AbstractBrooklynObject;
-import org.apache.brooklyn.core.objs.AbstractConfigurationSupportInternal;
-import org.apache.brooklyn.util.collections.SetFromLiveMap;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.core.flags.FlagUtils;
-import org.apache.brooklyn.util.core.flags.TypeCoercions;
-import org.apache.brooklyn.util.core.task.DeferredSupplier;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.guava.Maybe;
-import org.apache.brooklyn.util.stream.Streams;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-import com.google.common.base.Objects.ToStringHelper;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.reflect.TypeToken;
-
-/**
- * A basic implementation of the {@link Location} interface.
- *
- * This provides an implementation which works according to the requirements of
- * the interface documentation, and is ready to be extended to make more specialized locations.
- *
- * Override {@link #configure(Map)} to add special initialization logic.
- */
-public abstract class AbstractLocation extends AbstractBrooklynObject implements LocationInternal, HasHostGeoInfo, Configurable {
-
- /** @deprecated since 0.7.0 shouldn't be public */
- @Deprecated
- public static final Logger LOG = LoggerFactory.getLogger(AbstractLocation.class);
-
- public static final ConfigKey<Location> PARENT_LOCATION = new BasicConfigKey<Location>(Location.class, "parentLocation");
-
- public static final ConfigKey<Boolean> TEMPORARY_LOCATION = ConfigKeys.newBooleanConfigKey("temporaryLocation",
- "Indicates that the location is a temporary location that has been created to test connectivity, and that" +
- "the location's events should not be recorded by usage listeners", false);
-
- private final AtomicBoolean configured = new AtomicBoolean();
-
- private Reference<Long> creationTimeUtc = new BasicReference<Long>(System.currentTimeMillis());
-
- // _not_ set from flag; configured explicitly in configure, because we also need to update the parent's list of children
- private Reference<Location> parent = new BasicReference<Location>();
-
- // NB: all accesses should be synchronized
- private Set<Location> children = Sets.newLinkedHashSet();
-
- private Reference<String> name = new BasicReference<String>();
- private boolean displayNameAutoGenerated = true;
-
- private Reference<HostGeoInfo> hostGeoInfo = new BasicReference<HostGeoInfo>();
-
- private BasicConfigurationSupport config = new BasicConfigurationSupport();
-
- private BasicSubscriptionSupport subscriptions = new BasicSubscriptionSupport();
-
- private ConfigBag configBag = new ConfigBag();
-
- /** not for direct access; refer to as 'subscriptionTracker' via getter so that it is initialized */
- protected transient SubscriptionTracker _subscriptionTracker;
-
- private volatile boolean managed;
-
- private boolean inConstruction;
-
- private Reference<Map<Class<?>, Object>> extensions = new BasicReference<Map<Class<?>, Object>>(Maps.<Class<?>, Object>newConcurrentMap());
-
- private final LocationDynamicType locationType;
-
- /**
- * Construct a new instance of an AbstractLocation.
- */
- public AbstractLocation() {
- this(Maps.newLinkedHashMap());
- }
-
- /**
- * Construct a new instance of an AbstractLocation.
- *
- * The properties map recognizes the following keys:
- * <ul>
- * <li>name - a name for the location
- * <li>parentLocation - the parent {@link Location}
- * </ul>
- *
- * Other common properties (retrieved via get/findLocationProperty) include:
- * <ul>
- * <li>latitude
- * <li>longitude
- * <li>displayName
- * <li>iso3166 - list of iso3166-2 code strings
- * <li>timeZone
- * <li>abbreviatedName
- * </ul>
- */
- public AbstractLocation(Map<?,?> properties) {
- super(properties);
- inConstruction = true;
-
- // When one calls getConfig(key), we want to use the default value specified on *this* location
- // if it overrides the default config, by using the type object
- locationType = new LocationDynamicType(this);
-
- if (isLegacyConstruction()) {
- AbstractLocation checkWeGetThis = configure(properties);
- assert this.equals(checkWeGetThis) : this+" configure method does not return itself; returns "+checkWeGetThis+" instead of "+this;
-
- boolean deferConstructionChecks = (properties.containsKey("deferConstructionChecks") && TypeCoercions.coerce(properties.get("deferConstructionChecks"), Boolean.class));
- if (!deferConstructionChecks) {
- FlagUtils.checkRequiredFields(this);
- }
- }
-
- inConstruction = false;
- }
-
- protected void assertNotYetManaged() {
- if (!inConstruction && Locations.isManaged(this)) {
- LOG.warn("Configuration being made to {} after deployment; may not be supported in future versions", this);
- }
- //throw new IllegalStateException("Cannot set configuration "+key+" on active location "+this)
- }
-
- public void setManagementContext(ManagementContextInternal managementContext) {
- super.setManagementContext(managementContext);
- if (displayNameAutoGenerated && getId() != null) name.set(getClass().getSimpleName()+":"+getId().substring(0, Math.min(getId().length(),4)));
-
- if (BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_USE_BROOKLYN_LIVE_OBJECTS_DATAGRID_STORAGE)) {
- Location oldParent = parent.get();
- Set<Location> oldChildren = children;
- Map<String, Object> oldConfig = configBag.getAllConfig();
- Long oldCreationTimeUtc = creationTimeUtc.get();
- String oldDisplayName = name.get();
- HostGeoInfo oldHostGeoInfo = hostGeoInfo.get();
-
- parent = managementContext.getStorage().getReference(getId()+"-parent");
- children = SetFromLiveMap.create(managementContext.getStorage().<Location,Boolean>getMap(getId()+"-children"));
- creationTimeUtc = managementContext.getStorage().getReference(getId()+"-creationTime");
- hostGeoInfo = managementContext.getStorage().getReference(getId()+"-hostGeoInfo");
- name = managementContext.getStorage().getReference(getId()+"-displayName");
-
- // Only override stored defaults if we have actual values. We might be in setManagementContext
- // because we are reconstituting an existing entity in a new brooklyn management-node (in which
- // case believe what is already in the storage), or we might be in the middle of creating a new
- // entity. Normally for a new entity (using EntitySpec creation approach), this will get called
- // before setting the parent etc. However, for backwards compatibility we still support some
- // things calling the entity's constructor directly.
- if (oldParent != null) parent.set(oldParent);
- if (oldChildren.size() > 0) children.addAll(oldChildren);
- if (creationTimeUtc.isNull()) creationTimeUtc.set(oldCreationTimeUtc);
- if (hostGeoInfo.isNull()) hostGeoInfo.set(oldHostGeoInfo);
- if (name.isNull()) {
- name.set(oldDisplayName);
- } else {
- displayNameAutoGenerated = false;
- }
-
- configBag = ConfigBag.newLiveInstance(managementContext.getStorage().<String,Object>getMap(getId()+"-config"));
- if (oldConfig.size() > 0) {
- configBag.putAll(oldConfig);
- }
- }
- }
-
- /**
- * @deprecated since 0.7.0; only used for legacy brooklyn types where constructor is called directly;
- * see overridden method for more info
- */
- @SuppressWarnings("serial")
- @Override
- @Deprecated
- public AbstractLocation configure(Map<?,?> properties) {
- assertNotYetManaged();
-
- boolean firstTime = !configured.getAndSet(true);
-
- configBag.putAll(properties);
-
- if (properties.containsKey(PARENT_LOCATION.getName())) {
- // need to ensure parent's list of children is also updated
- setParent(configBag.get(PARENT_LOCATION));
-
- // don't include parentLocation in configBag, as breaks rebind
- configBag.remove(PARENT_LOCATION);
- }
-
- // NB: flag-setting done here must also be done in BasicLocationRebindSupport
- FlagUtils.setFieldsFromFlagsWithBag(this, properties, configBag, firstTime);
- FlagUtils.setAllConfigKeys(this, configBag, false);
-
- if (properties.containsKey("displayName")) {
- name.set((String) removeIfPossible(properties, "displayName"));
- displayNameAutoGenerated = false;
- } else if (properties.containsKey("name")) {
- name.set((String) removeIfPossible(properties, "name"));
- displayNameAutoGenerated = false;
- } else if (isLegacyConstruction()) {
- name.set(getClass().getSimpleName()+":"+getId().substring(0, Math.min(getId().length(),4)));
- displayNameAutoGenerated = true;
- }
-
- // TODO Explicitly dealing with iso3166 here because want custom splitter rule comma-separated string.
- // Is there a better way to do it (e.g. more similar to latitude, where configKey+TypeCoercion is enough)?
- if (groovyTruth(properties.get("iso3166"))) {
- Object rawCodes = removeIfPossible(properties, "iso3166");
- Set<String> codes;
- if (rawCodes instanceof CharSequence) {
- codes = ImmutableSet.copyOf(Splitter.on(",").trimResults().split((CharSequence)rawCodes));
- } else {
- codes = TypeCoercions.coerce(rawCodes, new TypeToken<Set<String>>() {});
- }
- configBag.put(LocationConfigKeys.ISO_3166, codes);
- }
-
- return this;
- }
-
- // TODO ensure no callers rely on 'remove' semantics, and don't remove;
- // or perhaps better use a config bag so we know what is used v unused
- private static Object removeIfPossible(Map<?,?> map, Object key) {
- try {
- return map.remove(key);
- } catch (Exception e) {
- return map.get(key);
- }
- }
-
- public boolean isManaged() {
- return getManagementContext() != null && managed;
- }
-
- public void onManagementStarted() {
- if (displayNameAutoGenerated) name.set(getClass().getSimpleName()+":"+getId().substring(0, Math.min(getId().length(),4)));
- this.managed = true;
- }
-
- public void onManagementStopped() {
- this.managed = false;
- if (getManagementContext().isRunning()) {
- BrooklynStorage storage = ((ManagementContextInternal)getManagementContext()).getStorage();
- storage.remove(getId()+"-parent");
- storage.remove(getId()+"-children");
- storage.remove(getId()+"-creationTime");
- storage.remove(getId()+"-hostGeoInfo");
- storage.remove(getId()+"-displayName");
- storage.remove(getId()+"-config");
- }
- }
-
- @Override
- public String getDisplayName() {
- return name.get();
- }
-
- protected boolean isDisplayNameAutoGenerated() {
- return displayNameAutoGenerated;
- }
-
- @Override
- public Location getParent() {
- return parent.get();
- }
-
- @Override
- public Collection<Location> getChildren() {
- synchronized (children) {
- return ImmutableList.copyOf(children);
- }
- }
-
- @Override
- public void setParent(Location newParent) {
- setParent(newParent, true);
- }
-
- public void setParent(Location newParent, boolean updateChildListParents) {
- if (newParent == this) {
- throw new IllegalArgumentException("Location cannot be its own parent: "+this);
- }
- if (newParent == parent.get()) {
- return; // no-op; already have desired parent
- }
-
- if (parent.get() != null) {
- Location oldParent = parent.get();
- parent.set(null);
- if (updateChildListParents)
- ((AbstractLocation)oldParent).removeChild(this);
- }
- // TODO Should we support a location changing parent? The resulting unmanage/manage might cause problems.
- // The code above suggests we do, but maybe we should warn or throw error, or at least test it!
-
- parent.set(newParent);
- if (newParent != null) {
- if (updateChildListParents)
- ((AbstractLocation)newParent).addChild(this);
- }
-
- onChanged();
- }
-
- @Override
- public ConfigurationSupportInternal config() {
- return config;
- }
-
- // the concrete type rather than an interface is returned because Groovy subclasses
- // complain (incorrectly) if we return SubscriptionSupportInternal
- // TODO revert to SubscriptionSupportInternal when groovy subclasses work without this (eg new groovy version)
- @Override
- @Beta
- public BasicSubscriptionSupport subscriptions() {
- return subscriptions;
- }
-
- private class BasicConfigurationSupport extends AbstractConfigurationSupportInternal {
-
- @Override
- public <T> T get(ConfigKey<T> key) {
- Object result = null;
- if (hasConfig(key, false)) {
- result = getLocalBag().getAllConfigRaw().get(key.getName());
-
- } else if (getParent() != null && isInherited(key)) {
- result = getParent().getConfig(key);
-
- } else {
- // In case this entity class has overridden the given key (e.g. to set default), then retrieve this entity's key
- // TODO when locations become entities, the duplication of this compared to EntityConfigMap.getConfig will disappear.
- @SuppressWarnings("unchecked")
- ConfigKey<T> ownKey = (ConfigKey<T>) elvis(locationType.getConfigKey(key.getName()), key);
- result = ownKey.getDefaultValue();
- }
-
- if (result instanceof DeferredSupplier<?>) {
- try {
- ManagementContext mgmt = AbstractLocation.this.getManagementContext();
- ExecutionContext exec = mgmt.getServerExecutionContext();
- result = Tasks.resolveValue(result, key.getType(), exec);
-
- } catch (Exception e) {
- throw Exceptions.propagate(e);
- }
- }
-
- return TypeCoercions.coerce(result, key.getTypeToken());
- }
-
- @Override
- public <T> T set(ConfigKey<T> key, T val) {
- ConfigConstraints.assertValid(AbstractLocation.this, key, val);
- T result = configBag.put(key, val);
- onChanged();
- return result;
- }
-
- @Override
- public <T> T set(ConfigKey<T> key, Task<T> val) {
- // TODO Support for locations
- throw new UnsupportedOperationException();
- }
-
- @Override
- public ConfigBag getBag() {
- ConfigBag result = ConfigBag.newInstanceExtending(configBag, ImmutableMap.of());
- Location p = getParent();
- if (p!=null) result.putIfAbsent(((LocationInternal)p).config().getBag());
- return result;
- }
-
- @Override
- public ConfigBag getLocalBag() {
- return configBag;
- }
-
- @Override
- public Maybe<Object> getRaw(ConfigKey<?> key) {
- if (hasConfig(key, false)) return Maybe.of(getLocalBag().getStringKey(key.getName()));
- if (getParent() != null && isInherited(key)) return ((LocationInternal)getParent()).config().getRaw(key);
- return Maybe.absent();
- }
-
- @Override
- public Maybe<Object> getLocalRaw(ConfigKey<?> key) {
- if (hasConfig(key, false)) return Maybe.of(getLocalBag().getStringKey(key.getName()));
- return Maybe.absent();
- }
-
- @Override
- public void addToLocalBag(Map<String, ?> vals) {
- configBag.putAll(vals);
- }
-
- @Override
- public void removeFromLocalBag(String key) {
- configBag.remove(key);
- }
-
- @Override
- public void refreshInheritedConfig() {
- // no-op for location
- }
-
- @Override
- public void refreshInheritedConfigOfChildren() {
- // no-op for location
- }
-
- private boolean hasConfig(ConfigKey<?> key, boolean includeInherited) {
- if (includeInherited && isInherited(key)) {
- return getBag().containsKey(key);
- } else {
- return getLocalBag().containsKey(key);
- }
- }
-
- private boolean isInherited(ConfigKey<?> key) {
- ConfigInheritance inheritance = key.getInheritance();
- if (inheritance==null) inheritance = getDefaultInheritance();
- return inheritance.isInherited(key, getParent(), AbstractLocation.this);
- }
-
- private ConfigInheritance getDefaultInheritance() {
- return ConfigInheritance.ALWAYS;
- }
-
- @Override
- protected ExecutionContext getContext() {
- return AbstractLocation.this.getManagementContext().getServerExecutionContext();
- }
- }
-
- public class BasicSubscriptionSupport implements SubscriptionSupportInternal {
- @Override
- public <T> SubscriptionHandle subscribe(Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
- return getSubscriptionTracker().subscribe(producer, sensor, listener);
- }
-
- @Override
- public <T> SubscriptionHandle subscribe(Map<String, ?> flags, Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
- return getSubscriptionTracker().subscribe(flags, producer, sensor, listener);
- }
-
- @Override
- public <T> SubscriptionHandle subscribeToMembers(Group producerGroup, Sensor<T> sensor, SensorEventListener<? super T> listener) {
- return getSubscriptionTracker().subscribeToMembers(producerGroup, sensor, listener);
- }
-
- @Override
- public <T> SubscriptionHandle subscribeToChildren(Entity producerParent, Sensor<T> sensor, SensorEventListener<? super T> listener) {
- return getSubscriptionTracker().subscribeToChildren(producerParent, sensor, listener);
- }
-
- @Override
- public boolean unsubscribe(Entity producer) {
- return getSubscriptionTracker().unsubscribe(producer);
- }
-
- @Override
- public boolean unsubscribe(Entity producer, SubscriptionHandle handle) {
- return getSubscriptionTracker().unsubscribe(producer, handle);
- }
-
- @Override
- public boolean unsubscribe(SubscriptionHandle handle) {
- return getSubscriptionTracker().unsubscribe(handle);
- }
-
- @Override
- public void unsubscribeAll() {
- getSubscriptionTracker().unsubscribeAll();
- }
-
- protected SubscriptionTracker getSubscriptionTracker() {
- synchronized (AbstractLocation.this) {
- if (_subscriptionTracker!=null) return _subscriptionTracker;
- _subscriptionTracker = new SubscriptionTracker(newSubscriptionContext());
- return _subscriptionTracker;
- }
- }
-
- private SubscriptionContext newSubscriptionContext() {
- synchronized (AbstractLocation.this) {
- return getManagementContext().getSubscriptionContext(AbstractLocation.this);
- }
- }
- }
-
- @Override
- public <T> T getConfig(HasConfigKey<T> key) {
- return config().get(key);
- }
-
- @Override
- public <T> T getConfig(ConfigKey<T> key) {
- return config().get(key);
- }
-
- @Override
- @Deprecated
- public boolean hasConfig(ConfigKey<?> key, boolean includeInherited) {
- return config.hasConfig(key, includeInherited);
- }
-
- @Override
- @Deprecated
- public Map<String,Object> getAllConfig(boolean includeInherited) {
- // TODO Have no information about what to include/exclude inheritance wise.
- // however few things use getAllConfigBag()
- ConfigBag bag = (includeInherited ? config().getBag() : config().getLocalBag());
- return bag.getAllConfig();
- }
-
- @Override
- @Deprecated
- public ConfigBag getAllConfigBag() {
- // TODO see comments in EntityConfigMap and on interface methods.
- // here ConfigBag is used exclusively so
- // we have no information about what to include/exclude inheritance wise.
- // however few things use getAllConfigBag()
- return config().getBag();
- }
-
- @Override
- public ConfigBag getLocalConfigBag() {
- return config().getLocalBag();
- }
-
- /**
- * @deprecated since 0.7; use {@link #getLocalConfigBag()}
- * @since 0.6
- */
- @Deprecated
- public ConfigBag getRawLocalConfigBag() {
- return config().getLocalBag();
- }
-
- @Override
- @Deprecated
- public <T> T setConfig(ConfigKey<T> key, T value) {
- return config().set(key, value);
- }
-
- /**
- * @since 0.6.0 (?) - use getDisplayName
- * @deprecated since 0.7.0; use {@link #getDisplayName()}
- */
- @Deprecated
- public void setName(String newName) {
- setDisplayName(newName);
- }
-
- public void setDisplayName(String newName) {
- name.set(newName);
- displayNameAutoGenerated = false;
- onChanged();
- }
-
- @Override
- public boolean equals(Object o) {
- if (! (o instanceof Location)) {
- return false;
- }
-
- Location l = (Location) o;
- return getId().equals(l.getId());
- }
-
- @Override
- public int hashCode() {
- return getId().hashCode();
- }
-
- @Override
- public boolean containsLocation(Location potentialDescendent) {
- Location loc = potentialDescendent;
- while (loc != null) {
- if (this == loc) return true;
- loc = loc.getParent();
- }
- return false;
- }
-
- protected <T extends Location> T addChild(LocationSpec<T> spec) {
- T child = getManagementContext().getLocationManager().createLocation(spec);
- addChild(child);
- return child;
- }
-
- @SuppressWarnings("deprecation")
- public void addChild(Location child) {
- // Previously, setParent delegated to addChildLocation and we sometimes ended up with
- // duplicate entries here. Instead this now uses a similar scheme to
- // AbstractLocation.setParent/addChild (with any weaknesses for distribution that such a
- // scheme might have...).
- //
- // We continue to use a list to allow identical-looking locations, but they must be different
- // instances.
-
- synchronized (children) {
- for (Location contender : children) {
- if (contender == child) {
- // don't re-add; no-op
- return;
- }
- }
-
- children.add(child);
- }
-
- if (isManaged()) {
- if (!getManagementContext().getLocationManager().isManaged(child)) {
- Locations.manage(child, getManagementContext());
- }
- } else if (getManagementContext() != null) {
- if (((LocalLocationManager)getManagementContext().getLocationManager()).getLocationEvenIfPreManaged(child.getId()) == null) {
- ((ManagementContextInternal)getManagementContext()).prePreManage(child);
- }
- }
-
- children.add(child);
- child.setParent(this);
-
- onChanged();
- }
-
- public boolean removeChild(Location child) {
- boolean removed;
- synchronized (children) {
- removed = children.remove(child);
- }
- if (removed) {
- if (child instanceof Closeable) {
- Streams.closeQuietly((Closeable)child);
- }
- child.setParent(null);
-
- if (isManaged()) {
- getManagementContext().getLocationManager().unmanage(child);
- }
- }
- onChanged();
- return removed;
- }
-
- protected void onChanged() {
- // currently changes simply trigger re-persistence; there is no intermediate listener as we do for EntityChangeListener
- if (isManaged()) {
- getManagementContext().getRebindManager().getChangeListener().onChanged(this);
- }
- }
-
- /** Default String representation is simplified name of class, together with selected fields. */
- @Override
- public String toString() {
- return string().toString();
- }
-
- @Override
- public String toVerboseString() {
- return toString();
- }
-
- /** override this, adding to the returned value, to supply additional fields to include in the toString */
- protected ToStringHelper string() {
- return Objects.toStringHelper(getClass()).add("id", getId()).add("name", name);
- }
-
- @Override
- public HostGeoInfo getHostGeoInfo() { return hostGeoInfo.get(); }
-
- public void setHostGeoInfo(HostGeoInfo hostGeoInfo) {
- if (hostGeoInfo!=null) {
- this.hostGeoInfo.set(hostGeoInfo);
- setConfig(LocationConfigKeys.LATITUDE, hostGeoInfo.latitude);
- setConfig(LocationConfigKeys.LONGITUDE, hostGeoInfo.longitude);
- }
- }
-
- @Override
- public RebindSupport<LocationMemento> getRebindSupport() {
- return new BasicLocationRebindSupport(this);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public RelationSupportInternal<Location> relations() {
- return (RelationSupportInternal<Location>) super.relations();
- }
-
- @Override
- public boolean hasExtension(Class<?> extensionType) {
- return extensions.get().containsKey(checkNotNull(extensionType, "extensionType"));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public <T> T getExtension(Class<T> extensionType) {
- Object extension = extensions.get().get(checkNotNull(extensionType, "extensionType"));
- if (extension == null) {
- throw new IllegalArgumentException("No extension of type "+extensionType+" registered for location "+this);
- }
- return (T) extension;
- }
-
- @Override
- public <T> void addExtension(Class<T> extensionType, T extension) {
- checkNotNull(extensionType, "extensionType");
- checkNotNull(extension, "extension");
- checkArgument(extensionType.isInstance(extension), "extension %s does not implement %s", extension, extensionType);
- extensions.get().put(extensionType, extension);
- }
-
- @Override
- public Map<String, String> toMetadataRecord() {
- ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
- if (getDisplayName() != null) builder.put("displayName", getDisplayName());
- if (getParent() != null && getParent().getDisplayName() != null) {
- builder.put("parentDisplayName", getParent().getDisplayName());
- }
- return builder.build();
- }
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocationResolver.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocationResolver.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocationResolver.java
deleted file mode 100644
index 766021e..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocationResolver.java
+++ /dev/null
@@ -1,188 +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;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationRegistry;
-import org.apache.brooklyn.api.location.LocationResolver;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.location.internal.LocationInternal;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.text.KeyValueParser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.ImmutableList;
-
-/**
- * Examples of valid specs:
- * <ul>
- * <li>byon(hosts=myhost)
- * <li>byon(hosts=myhost,myhost2)
- * <li>byon(hosts="myhost, myhost2")
- * <li>byon(hosts=myhost,myhost2, name=abc)
- * <li>byon(hosts="myhost, myhost2", name="my location name")
- * </ul>
- *
- * @author aled
- */
-@SuppressWarnings({"unchecked","rawtypes"})
-public abstract class AbstractLocationResolver implements LocationResolver {
-
- public static final Logger log = LoggerFactory.getLogger(AbstractLocationResolver.class);
-
- protected volatile ManagementContext managementContext;
-
- protected volatile SpecParser specParser;
-
- protected abstract Class<? extends Location> getLocationType();
-
- protected abstract SpecParser getSpecParser();
-
- @Override
- public void init(ManagementContext managementContext) {
- this.managementContext = checkNotNull(managementContext, "managementContext");
- this.specParser = getSpecParser();
- }
-
- @Override
- public boolean accepts(String spec, LocationRegistry registry) {
- return BasicLocationRegistry.isResolverPrefixForSpec(this, spec, true);
- }
-
- @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());
-
- if (registry != null) {
- LocationPropertiesFromBrooklynProperties.setLocalTempDir(globalProperties, config);
- }
-
- return managementContext.getLocationManager().createLocation(LocationSpec.create(getLocationType())
- .configure(config.getAllConfig())
- .configure(LocationConfigUtils.finalAndOriginalSpecs(spec, locationFlags, globalProperties, namedLocation)));
- }
-
- protected ConfigBag extractConfig(Map<?,?> locationFlags, String spec, LocationRegistry registry) {
- Map globalProperties = registry.getProperties();
- ParsedSpec parsedSpec = specParser.parse(spec);
- String namedLocation = (String) locationFlags.get(LocationInternal.NAMED_SPEC_NAME.getName());
-
- // prefer args map over location flags
- Map<String, Object> filteredProperties = getFilteredLocationProperties(getPrefix(), namedLocation, globalProperties);
- ConfigBag flags = ConfigBag.newInstance(parsedSpec.argsMap).putIfAbsent(locationFlags).putIfAbsent(filteredProperties);
-
- return flags;
- }
-
- protected Map<String, Object> getFilteredLocationProperties(String provider, String namedLocation, Map<String, ?> globalProperties) {
- return new LocationPropertiesFromBrooklynProperties().getLocationProperties(getPrefix(), namedLocation, globalProperties);
- }
-
- protected static class ParsedSpec {
- public final String spec;
- public final List<String> partsList;
- public final Map<String,String> argsMap;
-
- ParsedSpec(String spec, List<String> partsList, Map<String,String> argsMap) {
- this.spec = spec;
- this.partsList = ImmutableList.copyOf(partsList);
- this.argsMap = Collections.unmodifiableMap(MutableMap.copyOf(argsMap));
- }
- }
-
- /**
- * Parses a spec, by default of the general form "prefix:parts1:part2(arg1=val1,arg2=val2)"
- */
- protected static class SpecParser {
-
- protected final String prefix;
- protected final Pattern pattern;
- private String exampleUsage;
-
- public SpecParser(String prefix) {
- this.prefix = prefix;
- pattern = Pattern.compile("("+prefix+"|"+prefix.toLowerCase()+"|"+prefix.toUpperCase()+")" + "(:)?" + "(\\((.*)\\))?$");
- }
-
- public SpecParser(String prefix, Pattern pattern) {
- this.prefix = prefix;
- this.pattern = pattern;
- }
-
- public SpecParser setExampleUsage(String exampleUsage) {
- this.exampleUsage = exampleUsage;
- return this;
- }
-
- protected String getUsage(String spec) {
- if (exampleUsage == null) {
- return "Spec should be in the form "+pattern;
- } else {
- return "for example, "+exampleUsage;
- }
- }
-
- protected void checkParsedSpec(ParsedSpec parsedSpec) {
- // If someone tries "byon:(),byon:()" as a single spec, we get weird key-values!
- for (String key : parsedSpec.argsMap.keySet()) {
- if (key.contains(":") || key.contains("{") || key.contains("}") || key.contains("(") || key.contains(")")) {
- throw new IllegalArgumentException("Invalid byon spec: "+parsedSpec.spec+" (key="+key+")");
- }
- }
- String name = parsedSpec.argsMap.get("name");
- if (parsedSpec.argsMap.containsKey("name") && (name == null || name.isEmpty())) {
- throw new IllegalArgumentException("Invalid location '"+parsedSpec.spec+"'; if name supplied then value must be non-empty");
- }
- String displayName = parsedSpec.argsMap.get("displayName");
- if (parsedSpec.argsMap.containsKey("displayName") && (displayName == null || displayName.isEmpty())) {
- throw new IllegalArgumentException("Invalid location '"+parsedSpec.spec+"'; if displayName supplied then value must be non-empty");
- }
- }
-
- public ParsedSpec parse(String spec) {
- Matcher matcher = pattern.matcher(spec);
- if (!matcher.matches()) {
- throw new IllegalArgumentException("Invalid location '"+spec+"'; "+getUsage(spec));
- }
-
- String argsPart = matcher.group(3);
- if (argsPart != null && argsPart.startsWith("(") && argsPart.endsWith(")")) {
- // TODO Hacky; hosts("1.1.1.1") returns argsPart=("1.1.1.1")
- argsPart = argsPart.substring(1, argsPart.length()-1);
- }
- Map<String, String> argsMap = KeyValueParser.parseMap(argsPart);
- ParsedSpec result = new ParsedSpec(spec, ImmutableList.<String>of(), argsMap);
- checkParsedSpec(result);
- return result;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AggregatingMachineProvisioningLocation.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AggregatingMachineProvisioningLocation.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AggregatingMachineProvisioningLocation.java
deleted file mode 100644
index 6fc9920..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/AggregatingMachineProvisioningLocation.java
+++ /dev/null
@@ -1,139 +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;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import java.io.Closeable;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.brooklyn.api.location.MachineLocation;
-import org.apache.brooklyn.api.location.MachineProvisioningLocation;
-import org.apache.brooklyn.api.location.NoMachinesAvailableException;
-import org.apache.brooklyn.util.core.flags.SetFromFlag;
-import org.apache.brooklyn.util.stream.Streams;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-/**
- * Takes a list of other provisioners, and round-robins across them when obtaining a machine.
- */
-public class AggregatingMachineProvisioningLocation<T extends MachineLocation> extends AbstractLocation
- implements MachineProvisioningLocation<T>, Closeable {
-
- private Object lock;
-
- @SetFromFlag
- protected List<MachineProvisioningLocation<T>> provisioners;
-
- @SetFromFlag
- protected Map<T, MachineProvisioningLocation<T>> inUse;
-
- protected final AtomicInteger obtainCounter = new AtomicInteger();
-
- public AggregatingMachineProvisioningLocation() {
- this(Maps.newLinkedHashMap());
- }
-
- public AggregatingMachineProvisioningLocation(Map properties) {
- super(properties);
-
- if (isLegacyConstruction()) {
- init();
- }
- }
-
- @Override
- public void init() {
- super.init();
- }
-
- @Override
- public String toVerboseString() {
- return Objects.toStringHelper(this).omitNullValues()
- .add("id", getId()).add("name", getDisplayName())
- .add("provisioners", provisioners)
- .toString();
- }
-
- @Override
- public AbstractLocation configure(Map<?,?> properties) {
- if (lock == null) {
- lock = new Object();
- provisioners = Lists.<MachineProvisioningLocation<T>>newArrayList();
- inUse = Maps.<T, MachineProvisioningLocation<T>>newLinkedHashMap();
- }
- return super.configure(properties);
- }
-
- @Override
- public AggregatingMachineProvisioningLocation<T> newSubLocation(Map<?,?> newFlags) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void close() {
- for (MachineProvisioningLocation<?> provisioner : provisioners) {
- if (provisioner instanceof Closeable) {
- Streams.closeQuietly((Closeable)provisioner);
- }
- }
- }
-
- public T obtain() throws NoMachinesAvailableException {
- return obtain(Maps.<String,Object>newLinkedHashMap());
- }
-
- @Override
- public T obtain(Map<?,?> flags) throws NoMachinesAvailableException {
- checkState(provisioners.size() > 0, "no provisioners!");
- int index = obtainCounter.getAndIncrement();
- for (int i = 0; i < provisioners.size(); i++) {
- MachineProvisioningLocation<T> provisioner = provisioners.get(index++ % provisioners.size());
- try {
- T machine = provisioner.obtain(flags);
- inUse.put(machine, provisioner);
- return machine;
- } catch (NoMachinesAvailableException e) {
- // move on; try next
- }
- }
- throw new NoMachinesAvailableException("No machines available in "+toString());
- }
-
- @Override
- public void release(T machine) {
- MachineProvisioningLocation<T> provisioner = inUse.remove(machine);
- if (provisioner != null) {
- provisioner.release(machine);
- } else {
- throw new IllegalStateException("Request to release machine "+machine+", but this machine is not currently allocated");
- }
- }
-
- @Override
- public Map<String,Object> getProvisioningFlags(Collection<String> tags) {
- return Maps.<String,Object>newLinkedHashMap();
- }
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/BasicHardwareDetails.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/BasicHardwareDetails.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/BasicHardwareDetails.java
deleted file mode 100644
index f666268..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/BasicHardwareDetails.java
+++ /dev/null
@@ -1,56 +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;
-
-import javax.annotation.concurrent.Immutable;
-
-import com.google.common.base.Objects;
-
-import org.apache.brooklyn.api.location.HardwareDetails;
-
-@Immutable
-public class BasicHardwareDetails implements HardwareDetails {
-
- private final Integer cpuCount;
- private final Integer ram;
-
- public BasicHardwareDetails(Integer cpuCount, Integer ram) {
- this.cpuCount = cpuCount;
- this.ram = ram;
- }
-
- @Override
- public Integer getCpuCount() {
- return cpuCount;
- }
-
- @Override
- public Integer getRam() {
- return ram;
- }
-
- @Override
- public String toString() {
- return Objects.toStringHelper(HardwareDetails.class)
- .omitNullValues()
- .add("cpuCount", cpuCount)
- .add("ram", ram)
- .toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationDefinition.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationDefinition.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationDefinition.java
deleted file mode 100644
index 508a417..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationDefinition.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.core.location;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.location.LocationDefinition;
-import org.apache.brooklyn.util.text.Identifiers;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-
-public class BasicLocationDefinition implements LocationDefinition {
-
- private final String id;
- private final String name;
- private final String spec;
- private final Map<String,Object> config;
-
- public BasicLocationDefinition(String name, String spec, Map<String,? extends Object> config) {
- this(Identifiers.makeRandomId(8), name, spec, config);
- }
-
- public BasicLocationDefinition(String id, String name, String spec, Map<String,? extends Object> config) {
- this.id = Preconditions.checkNotNull(id);
- this.name = name;
- this.spec = Preconditions.checkNotNull(spec);
- this.config = config==null ? ImmutableMap.<String, Object>of() : ImmutableMap.<String, Object>copyOf(config);
- }
-
- public String getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public String getSpec() {
- return spec;
- }
-
- @Override
- public Map<String, Object> getConfig() {
- return config;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this==o) return true;
- if ((o instanceof LocationDefinition) && id.equals(((LocationDefinition)o).getId())) return true;
- return false;
- }
-
- @Override
- public int hashCode() {
- return id.hashCode();
- }
-
- @Override
- public String toString() {
- return "LocationDefinition{" +
- "id='" + getId() + '\'' +
- ", name='" + getName() + '\'' +
- ", spec='" + getSpec() + '\'' +
- ", config=" + getConfig() +
- '}';
- }
-}