[BROOKLYN-162] Renaming package brooklyn.basic at ./core
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/e1a2d668 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/e1a2d668 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/e1a2d668 Branch: refs/heads/master Commit: e1a2d6686ed007077ef32876c15a74db1738f16f Parents: 5ef0b61 Author: Ivana Yovcheva <[email protected]> Authored: Mon Aug 17 15:54:46 2015 +0300 Committer: Ivana Yovcheva <[email protected]> Committed: Mon Aug 17 15:54:46 2015 +0300 ---------------------------------------------------------------------- .../brooklyn/basic/AbstractBrooklynObject.java | 249 ---------------- .../brooklyn/basic/BasicConfigurableObject.java | 120 -------- .../brooklyn/basic/BrooklynDynamicType.java | 284 ------------------- .../brooklyn/basic/BrooklynObjectInternal.java | 104 ------- .../brooklyn/basic/BrooklynTypeSnapshot.java | 102 ------- .../main/java/brooklyn/basic/BrooklynTypes.java | 132 --------- .../basic/internal/ApiObjectsFactoryImpl.java | 42 --- .../enricher/basic/EnricherDynamicType.java | 2 +- .../enricher/basic/EnricherTypeSnapshot.java | 2 +- .../brooklyn/entity/basic/AbstractEntity.java | 2 +- .../java/brooklyn/entity/basic/Entities.java | 2 +- .../entity/basic/EntityDynamicType.java | 2 +- .../brooklyn/entity/basic/EntityInternal.java | 2 +- .../entity/basic/EntityTypeSnapshot.java | 2 +- .../java/brooklyn/entity/basic/EntityTypes.java | 2 +- .../AbstractBrooklynObjectRebindSupport.java | 2 +- .../rebind/ActivePartialRebindIteration.java | 2 +- .../rebind/ImmediateDeltaChangeListener.java | 2 +- .../rebind/PeriodicDeltaChangeListener.java | 2 +- .../brooklyn/entity/rebind/RebindIteration.java | 4 +- .../entity/rebind/dto/BasicEntityMemento.java | 3 +- .../entity/rebind/dto/MementosGenerators.java | 2 +- .../persister/BrooklynPersistenceUtils.java | 2 +- .../policy/basic/AbstractEntityAdjunct.java | 4 +- .../policy/basic/PolicyDynamicType.java | 2 +- .../policy/basic/PolicyTypeSnapshot.java | 2 +- .../brooklyn/basic/AbstractBrooklynObject.java | 249 ++++++++++++++++ .../brooklyn/basic/BasicConfigurableObject.java | 120 ++++++++ .../brooklyn/basic/BrooklynDynamicType.java | 284 +++++++++++++++++++ .../brooklyn/basic/BrooklynObjectInternal.java | 104 +++++++ .../brooklyn/basic/BrooklynTypeSnapshot.java | 102 +++++++ .../apache/brooklyn/basic/BrooklynTypes.java | 132 +++++++++ .../basic/internal/ApiObjectsFactoryImpl.java | 42 +++ .../catalog/internal/BasicBrooklynCatalog.java | 2 +- .../core/catalog/internal/CatalogItemDo.java | 2 +- .../internal/CatalogItemDtoAbstract.java | 2 +- .../core/catalog/internal/CatalogUtils.java | 2 +- .../catalog/internal/CatalogXmlSerializer.java | 2 +- .../location/basic/AbstractLocation.java | 2 +- .../location/basic/LocationDynamicType.java | 2 +- .../location/basic/LocationInternal.java | 2 +- .../location/basic/LocationTypeSnapshot.java | 2 +- ...pi.basic.internal.ApiObjectsFactoryInterface | 2 +- .../CatalogOsgiVersionMoreEntityTest.java | 2 +- .../main/java/org/apache/brooklyn/cli/Main.java | 13 +- .../brooklyn/cli/lister/ItemDescriptors.java | 4 +- .../SoftlayerObtainPrivateLiveTest.java | 2 +- .../rest/resources/PolicyConfigResource.java | 2 +- .../rest/transform/CatalogTransformer.java | 2 +- .../rest/util/BrooklynRestResourceUtils.java | 2 +- 50 files changed, 1072 insertions(+), 1084 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java b/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java deleted file mode 100644 index c990ed9..0000000 --- a/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.basic; - -import java.util.Collections; -import java.util.Map; -import java.util.Set; - -import org.apache.brooklyn.api.basic.internal.ApiObjectsFactory; -import org.apache.brooklyn.api.management.ManagementContext; -import org.apache.brooklyn.core.management.internal.ManagementContextInternal; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.basic.AbstractEntity; -import brooklyn.entity.proxying.InternalFactory; -import brooklyn.entity.rebind.RebindManagerImpl; -import brooklyn.util.config.ConfigBag; -import brooklyn.util.flags.SetFromFlag; -import brooklyn.util.text.Identifiers; - -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - -public abstract class AbstractBrooklynObject implements BrooklynObjectInternal { - - private static final Logger log = LoggerFactory.getLogger(AbstractBrooklynObject.class); - - private boolean _legacyConstruction; - private boolean hasWarnedOfNoManagementContextWhenPersistRequested; - - @SetFromFlag(value = "id") - private String id = Identifiers.makeRandomId(8); - - private String catalogItemId; - - /** subclasses should synchronize on this for all access */ - @SetFromFlag(value = "tags") - private final Set<Object> tags = Sets.newLinkedHashSet(); - - private volatile ManagementContext managementContext; - - public abstract void setDisplayName(String newName); - - public AbstractBrooklynObject() { - this(Maps.newLinkedHashMap()); - } - - public AbstractBrooklynObject(Map<?, ?> properties) { - _legacyConstruction = !InternalFactory.FactoryConstructionTracker.isConstructing(); - - if (!_legacyConstruction && properties != null && !properties.isEmpty()) { - log.warn("Forcing use of deprecated old-style construction for {} because properties were " + - "specified ({}); instead use specs (e.g. LocationSpec, EntitySpec, etc)", - getClass().getName(), properties); - if (log.isDebugEnabled()) - log.debug("Source of use of old-style construction", new Throwable("Source of use of old-style construction")); - _legacyConstruction = true; - } - - catalogItemId = ApiObjectsFactory.get().getCatalogItemIdFromContext(); - - // rely on sub-class to call configure(properties), because otherwise its fields will not have been initialised - } - - /** - * See {@link #configure(Map)} - * - * @deprecated since 0.7.0; only used for legacy brooklyn types where constructor is called directly - */ - @Deprecated - protected AbstractBrooklynObject configure() { - return configure(Collections.emptyMap()); - } - - /** - * Will set fields from flags, and put the remaining ones into the 'leftovers' map. - * For some types, you can find unused config via {@link ConfigBag#getUnusedConfig()}. - * <p> - * To be overridden by AbstractEntity, AbstractLoation, AbstractPolicy, AbstractEnricher, etc. - * <p> - * But should not be overridden by specific entity types. If you do, the entity may break in - * subsequent releases. Also note that if you require fields to be initialized you must do that - * in this method. You must *not* rely on field initializers because they may not run until *after* - * this method (this method is invoked by the constructor in this class, so initializers - * in subclasses will not have run when this overridden method is invoked.) - * - * @deprecated since 0.7.0; only used for legacy brooklyn types where constructor is called directly - */ - @Deprecated - protected abstract AbstractBrooklynObject configure(Map<?, ?> flags); - - protected boolean isLegacyConstruction() { - return _legacyConstruction; - } - - /** - * Called by framework (in new-style instances where spec was used) after configuring etc, - * but before a reference to this instance is shared. - * <p> - * To preserve backwards compatibility for if the instance is constructed directly, one - * can call the code below, but that means it will be called after references to this - * policy have been shared with other entities. - * <pre> - * {@code - * if (isLegacyConstruction()) { - * init(); - * } - * } - * </pre> - */ - public void init() { - // no-op - } - - /** - * Called by framework on rebind (in new-style instances): - * <ul> - * <li> after configuring, but - * <li> before the instance is managed, and - * <li> before adjuncts are attached to entities, and - * <li> before a reference to an object is shared. - * </ul> - * Note that {@link #init()} will not be called on rebind. - * <p> - * If you need to intercept behaviour <i>after</i> adjuncts are attached, - * consider {@link AbstractEntity#onManagementStarting()} - * (but probably worth raising a discussion on the mailing list!) - */ - public void rebind() { - // no-op - } - - public void setManagementContext(ManagementContextInternal managementContext) { - this.managementContext = managementContext; - } - - public ManagementContext getManagementContext() { - return managementContext; - } - - protected boolean isRebinding() { - return RebindManagerImpl.RebindTracker.isRebinding(); - } - - protected void requestPersist() { - if (getManagementContext() != null) { - getManagementContext().getRebindManager().getChangeListener().onChanged(this); - } else { - // Might be nice to log this at debug but it gets hit a lot of times as locations - // are created and destroyed for the API. It also might not be an error - the - // management context might be null if the object is being recreated by persistence. - if (log.isTraceEnabled() && !hasWarnedOfNoManagementContextWhenPersistRequested) { - log.trace("Cannot fulfil request to persist {} because it has no management context. " + - "This warning will not be logged for this object again.", this); - hasWarnedOfNoManagementContextWhenPersistRequested = true; - } - } - } - - @Override - public String getId() { - return id; - } - - @Override - public void setCatalogItemId(String id) { - this.catalogItemId = id; - } - - @Override - public String getCatalogItemId() { - return catalogItemId; - } - - protected void onTagsChanged() { - requestPersist(); - } - - @Override - public TagSupport tags() { - return new BasicTagSupport(); - } - - protected class BasicTagSupport implements TagSupport { - @Override - public Set<Object> getTags() { - synchronized (tags) { - return ImmutableSet.copyOf(tags); - } - } - - @Override - public boolean containsTag(Object tag) { - synchronized (tags) { - return tags.contains(tag); - } - } - - @Override - public boolean addTag(Object tag) { - boolean result; - synchronized (tags) { - result = tags.add(tag); - } - onTagsChanged(); - return result; - } - - @Override - public boolean addTags(Iterable<?> newTags) { - boolean result; - synchronized (tags) { - result = Iterables.addAll(tags, newTags); - } - onTagsChanged(); - return result; - } - - @Override - public boolean removeTag(Object tag) { - boolean result; - synchronized (tags) { - result = tags.remove(tag); - } - onTagsChanged(); - return result; - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/basic/BasicConfigurableObject.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/basic/BasicConfigurableObject.java b/core/src/main/java/brooklyn/basic/BasicConfigurableObject.java deleted file mode 100644 index d02f1bd..0000000 --- a/core/src/main/java/brooklyn/basic/BasicConfigurableObject.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.basic; - -import org.apache.brooklyn.api.entity.trait.Configurable; -import org.apache.brooklyn.api.entity.trait.Identifiable; -import org.apache.brooklyn.api.management.ManagementContext; -import org.apache.brooklyn.api.management.Task; -import org.apache.brooklyn.core.management.ManagementContextInjectable; - -import brooklyn.camp.brooklyn.api.HasBrooklynManagementContext; -import brooklyn.config.ConfigKey; -import brooklyn.config.ConfigKey.HasConfigKey; -import brooklyn.config.ConfigMap; -import brooklyn.util.config.ConfigBag; -import brooklyn.util.flags.SetFromFlag; -import brooklyn.util.text.Identifiers; - -/** - * A parent class for ancilliary objects that do not require the full heavy lifting of {@link AbstractBrooklynObject} - * or similar, but wish to use {@link ConfigKey} and {@link Configurable} in their construction, via the - * {@code $brooklyn:object} method of the CAMP DSL. - * <p> - * Type coercion of values will occur when the {@link ConfigMap} is accessed, but resolving of {@link Task tasks} and other - * deferred operations are assumed to have occurred prior to calling {@link #setConfig(ConfigKey, Object)} i.e. at - * object construction. - */ -public class BasicConfigurableObject implements Configurable, Identifiable, ManagementContextInjectable, HasBrooklynManagementContext { - - @SetFromFlag("id") - private String id = Identifiers.makeRandomId(8); - - private volatile ManagementContext managementContext; - private BasicConfigurationSupport config; - - public BasicConfigurableObject() { - config = new BasicConfigurationSupport(); - } - - @Override - public void injectManagementContext(ManagementContext managementContext) { - this.managementContext = managementContext; - } - - public ManagementContext getBrooklynManagementContext() { - return managementContext; - } - - @Override - public String getId() { - return id; - } - - @Override - public ConfigurationSupport config() { - return config; - } - - @Override - @Deprecated - public <T> T setConfig(ConfigKey<T> key, T value) { - return config().set(key, value); - } - - public <T> T getConfig(ConfigKey<T> key) { - return config().get(key); - } - - private static class BasicConfigurationSupport implements ConfigurationSupport { - private final ConfigBag config = ConfigBag.newInstance(); - - @Override - public <T> T get(ConfigKey<T> key) { - return config.get(key); - } - - @Override - public <T> T get(HasConfigKey<T> key) { - return get(key.getConfigKey()); - } - - @Override - public <T> T set(ConfigKey<T> key, T val) { - T old = config.get(key); - config.configure(key, val); - return old; - } - - @Override - public <T> T set(HasConfigKey<T> key, T val) { - return set(key.getConfigKey(), val); - } - - @Override - public <T> T set(ConfigKey<T> key, Task<T> val) { - throw new UnsupportedOperationException(); - } - - @Override - public <T> T set(HasConfigKey<T> key, Task<T> val) { - return set(key.getConfigKey(), val); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/basic/BrooklynDynamicType.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/basic/BrooklynDynamicType.java b/core/src/main/java/brooklyn/basic/BrooklynDynamicType.java deleted file mode 100644 index dbf8bbc..0000000 --- a/core/src/main/java/brooklyn/basic/BrooklynDynamicType.java +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.basic; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicBoolean; - -import org.apache.brooklyn.api.basic.BrooklynObject; -import org.apache.brooklyn.api.basic.BrooklynType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.config.ConfigKey; -import brooklyn.config.ConfigKey.HasConfigKey; -import brooklyn.event.basic.BasicConfigKey.BasicConfigKeyOverwriting; -import brooklyn.util.flags.FlagUtils; -import brooklyn.util.javalang.Reflections; -import brooklyn.util.text.Strings; - -import com.google.common.base.Joiner; -import com.google.common.base.Objects; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ListMultimap; -import com.google.common.collect.Lists; - -/** - * This is the actual type of a brooklyn object instance at runtime, - * which can change from the static {@link BrooklynType}, and can change over time; - * for this reason it does *not* implement BrooklynType, but - * callers can call {@link #getSnapshot()} to get a snapshot such instance. - */ -public abstract class BrooklynDynamicType<T extends BrooklynObject, AbstractT extends AbstractBrooklynObject> { - - private static final Logger LOG = LoggerFactory.getLogger(BrooklynDynamicType.class); - - protected final Class<? extends T> brooklynClass; - protected final AbstractT instance; - protected volatile String name; - - /** - * Map of config keys (and their fields) on this instance, by name. - */ - protected final Map<String,FieldAndValue<ConfigKey<?>>> configKeys = new ConcurrentHashMap<String, FieldAndValue<ConfigKey<?>>>(); - - private volatile BrooklynTypeSnapshot snapshot; - private final AtomicBoolean snapshotValid = new AtomicBoolean(false); - - @SuppressWarnings("unchecked") - public BrooklynDynamicType(AbstractT instance) { - this((Class<? extends T>) instance.getClass(), instance); - } - public BrooklynDynamicType(Class<? extends T> clazz) { - this(clazz, null); - } - protected BrooklynDynamicType(Class<? extends T> clazz, AbstractT instance) { - this.brooklynClass = checkNotNull(clazz, "brooklyn class"); - this.instance = instance; - // NB: official name is usually injected later, e.g. from AbstractEntity.setManagementContext - this.name = (clazz.getCanonicalName() == null) ? clazz.getName() : clazz.getCanonicalName(); - - buildConfigKeys(clazz, null, configKeys); - if (LOG.isTraceEnabled()) - LOG.trace("Entity {} config keys: {}", (instance==null ? clazz.getName() : instance.getId()), Joiner.on(", ").join(configKeys.keySet())); - } - - protected abstract BrooklynTypeSnapshot newSnapshot(); - - protected void invalidateSnapshot() { - snapshotValid.set(false); - } - - public void setName(String name) { - if (Strings.isBlank(name)) { - throw new IllegalArgumentException("Invalid name "+(name == null ? "null" : "'"+name+"'")+"; name must be non-empty and not just white space"); - } - this.name = name; - invalidateSnapshot(); - } - - public synchronized BrooklynType getSnapshot() { - return refreshSnapshot(); - } - - public Class<? extends T> getBrooklynClass() { - return brooklynClass; - } - - // -------------------------------------------------- - - /** - * ConfigKeys available on this entity. - */ - public Map<String,ConfigKey<?>> getConfigKeys() { - return Collections.unmodifiableMap(value(configKeys)); - } - - /** - * ConfigKeys available on this entity. - */ - public ConfigKey<?> getConfigKey(String keyName) { - return value(configKeys.get(keyName)); - } - - /** field where a config key is defined, for use getting annotations. note annotations are not inherited. */ - public Field getConfigKeyField(String keyName) { - return field(configKeys.get(keyName)); - } - - protected BrooklynTypeSnapshot refreshSnapshot() { - if (snapshotValid.compareAndSet(false, true)) { - snapshot = newSnapshot(); - } - return snapshot; - } - - /** - * Finds the config keys defined on the entity's class, statics and optionally any non-static (discouraged). - * Prefers keys which overwrite other keys, and prefers keys which are lower in the hierarchy; - * logs warnings if there are two conflicting keys which don't have an overwriting relationship. - */ - protected static void buildConfigKeys(Class<? extends BrooklynObject> clazz, AbstractBrooklynObject optionalInstance, - Map<String, FieldAndValue<ConfigKey<?>>> configKeys) { - ListMultimap<String,FieldAndValue<ConfigKey<?>>> configKeysAll = - ArrayListMultimap.<String, FieldAndValue<ConfigKey<?>>>create(); - - for (Field f : FlagUtils.getAllFields(clazz)) { - boolean isConfigKey = ConfigKey.class.isAssignableFrom(f.getType()); - if (!isConfigKey) { - if (!HasConfigKey.class.isAssignableFrom(f.getType())) { - // neither ConfigKey nor HasConfigKey - continue; - } - } - if (!Modifier.isStatic(f.getModifiers())) { - // require it to be static or we have an instance - LOG.warn("Discouraged use of non-static config key "+f+" defined in " + (optionalInstance!=null ? optionalInstance : clazz)); - if (optionalInstance==null) continue; - } - try { - Object v = f.get(optionalInstance); - - if (v == null) { - LOG.warn("no value defined for config key field (skipping): "+f); - } else { - ConfigKey<?> k = isConfigKey ? (ConfigKey<?>) v : ((HasConfigKey<?>) v).getConfigKey(); - configKeysAll.put(k.getName(), new FieldAndValue<ConfigKey<?>>(f, k)); - } - } catch (IllegalAccessException e) { - LOG.warn("cannot access config key (skipping): "+f); - } - } - LinkedHashSet<String> keys = new LinkedHashSet<String>(configKeysAll.keys()); - for (String kn: keys) { - List<FieldAndValue<ConfigKey<?>>> kk = Lists.newArrayList(configKeysAll.get(kn)); - if (kk.size()>1) { - // remove anything which extends another value in the list - for (FieldAndValue<ConfigKey<?>> k: kk) { - ConfigKey<?> key = value(k); - if (key instanceof BasicConfigKeyOverwriting) { - ConfigKey<?> parent = ((BasicConfigKeyOverwriting<?>)key).getParentKey(); - // find and remove the parent from consideration - for (FieldAndValue<ConfigKey<?>> k2: kk) { - if (value(k2) == parent) - configKeysAll.remove(kn, k2); - } - } - } - kk = Lists.newArrayList(configKeysAll.get(kn)); - } - // multiple keys, not overwriting; if their values are the same then we don't mind - FieldAndValue<ConfigKey<?>> best = null; - for (FieldAndValue<ConfigKey<?>> k: kk) { - if (best==null) { - best=k; - } else { - Field lower = Reflections.inferSubbestField(k.field, best.field); - ConfigKey<? extends Object> lowerV = lower==null ? null : lower.equals(k.field) ? k.value : best.value; - if (best.value == k.value) { - // same value doesn't matter which we take (but take lower if there is one) - if (LOG.isTraceEnabled()) - LOG.trace("multiple definitions for config key {} on {}; same value {}; " + - "from {} and {}, preferring {}", - new Object[] { - best.value.getName(), optionalInstance!=null ? optionalInstance : clazz, - best.value.getDefaultValue(), - k.field, best.field, lower}); - best = new FieldAndValue<ConfigKey<?>>(lower!=null ? lower : best.field, best.value); - } else if (lower!=null) { - // different value, but one clearly lower (in type hierarchy) - if (LOG.isTraceEnabled()) - LOG.trace("multiple definitions for config key {} on {}; " + - "from {} and {}, preferring lower {}, value {}", - new Object[] { - best.value.getName(), optionalInstance!=null ? optionalInstance : clazz, - k.field, best.field, lower, - lowerV.getDefaultValue() }); - best = new FieldAndValue<ConfigKey<?>>(lower, lowerV); - } else { - // different value, neither one lower than another in hierarchy - LOG.warn("multiple ambiguous definitions for config key {} on {}; " + - "from {} and {}, values {} and {}; " + - "keeping latter (arbitrarily)", - new Object[] { - best.value.getName(), optionalInstance!=null ? optionalInstance : clazz, - k.field, best.field, - k.value.getDefaultValue(), best.value.getDefaultValue() }); - // (no change) - } - } - } - if (best==null) { - // shouldn't happen - LOG.error("Error - no matching config key from "+kk+" in class "+clazz+", even though had config key name "+kn); - continue; - } else { - configKeys.put(best.value.getName(), best); - } - } - } - - protected static class FieldAndValue<V> { - public final Field field; - public final V value; - public FieldAndValue(Field field, V value) { - this.field = field; - this.value = value; - } - @Override - public String toString() { - return Objects.toStringHelper(this).add("field", field).add("value", value).toString(); - } - } - - protected static <V> V value(FieldAndValue<V> fv) { - if (fv==null) return null; - return fv.value; - } - - protected static Field field(FieldAndValue<?> fv) { - if (fv==null) return null; - return fv.field; - } - - protected static <V> Collection<V> value(Collection<FieldAndValue<V>> fvs) { - List<V> result = new ArrayList<V>(); - for (FieldAndValue<V> fv: fvs) result.add(value(fv)); - return result; - } - - protected static <K,V> Map<K,V> value(Map<K,FieldAndValue<V>> fvs) { - Map<K,V> result = new LinkedHashMap<K,V>(); - for (K key: fvs.keySet()) - result.put(key, value(fvs.get(key))); - return result; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/basic/BrooklynObjectInternal.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/basic/BrooklynObjectInternal.java b/core/src/main/java/brooklyn/basic/BrooklynObjectInternal.java deleted file mode 100644 index 038013f..0000000 --- a/core/src/main/java/brooklyn/basic/BrooklynObjectInternal.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.basic; - -import java.util.Map; - -import org.apache.brooklyn.api.basic.BrooklynObject; -import org.apache.brooklyn.api.entity.rebind.RebindSupport; -import org.apache.brooklyn.api.entity.rebind.Rebindable; -import org.apache.brooklyn.api.entity.trait.Configurable; - -import brooklyn.config.ConfigKey; -import brooklyn.config.ConfigKey.HasConfigKey; -import brooklyn.util.config.ConfigBag; -import brooklyn.util.guava.Maybe; - -import com.google.common.annotations.Beta; - -public interface BrooklynObjectInternal extends BrooklynObject, Rebindable { - - void setCatalogItemId(String id); - - @SuppressWarnings("rawtypes") // subclasses typically apply stronger typing - RebindSupport getRebindSupport(); - - ConfigurationSupportInternal config(); - - @Beta - public interface ConfigurationSupportInternal extends Configurable.ConfigurationSupport { - - /** - * Returns a read-only view of all the config key/value pairs on this entity, backed by a string-based map, - * including config names that did not match anything on this entity. - * - * TODO This method gives no information about which config is inherited versus local; - * this means {@link ConfigKey#getInheritance()} cannot be respected. This is an unsolvable problem - * for "config names that did not match anything on this entity". Therefore consider using - * alternative getters. - */ - @Beta - ConfigBag getBag(); - - /** - * Returns a read-only view of the local (i.e. not inherited) config key/value pairs on this entity, - * backed by a string-based map, including config names that did not match anything on this entity. - */ - @Beta - ConfigBag getLocalBag(); - - /** - * Returns the uncoerced value for this config key, if available, not taking any default. - * If there is no local value and there is an explicit inherited value, will return the inherited. - */ - @Beta - Maybe<Object> getRaw(ConfigKey<?> key); - - /** - * @see {@link #getConfigRaw(ConfigKey)} - */ - @Beta - Maybe<Object> getRaw(HasConfigKey<?> key); - - /** - * Returns the uncoerced value for this config key, if available, - * not following any inheritance chains and not taking any default. - */ - @Beta - Maybe<Object> getLocalRaw(ConfigKey<?> key); - - /** - * @see {@link #getLocalConfigRaw(ConfigKey)} - */ - @Beta - Maybe<Object> getLocalRaw(HasConfigKey<?> key); - - @Beta - void addToLocalBag(Map<String, ?> vals); - - @Beta - void removeFromLocalBag(String key); - - @Beta - void refreshInheritedConfig(); - - @Beta - void refreshInheritedConfigOfChildren(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/basic/BrooklynTypeSnapshot.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/basic/BrooklynTypeSnapshot.java b/core/src/main/java/brooklyn/basic/BrooklynTypeSnapshot.java deleted file mode 100644 index 1d0ba73..0000000 --- a/core/src/main/java/brooklyn/basic/BrooklynTypeSnapshot.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.basic; - -import java.util.Map; -import java.util.Set; - -import org.apache.brooklyn.api.basic.BrooklynType; - -import brooklyn.config.ConfigKey; -import brooklyn.util.text.Strings; - -import com.google.common.base.Objects; -import com.google.common.base.Objects.ToStringHelper; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; - -public class BrooklynTypeSnapshot implements BrooklynType { - private static final long serialVersionUID = 4670930188951106009L; - - private final String name; - private transient volatile String simpleName; - private final Map<String, ConfigKey<?>> configKeys; - private final Set<ConfigKey<?>> configKeysSet; - - protected BrooklynTypeSnapshot(String name, Map<String, ConfigKey<?>> configKeys) { - this.name = name; - this.configKeys = ImmutableMap.copyOf(configKeys); - this.configKeysSet = ImmutableSet.copyOf(this.configKeys.values()); - } - - @Override - public String getName() { - return name; - } - - private String toSimpleName(String name) { - String simpleName = name.substring(name.lastIndexOf(".")+1); - if (Strings.isBlank(simpleName)) simpleName = name.trim(); - return Strings.makeValidFilename(simpleName); - } - - @Override - public String getSimpleName() { - String sn = simpleName; - if (sn==null) { - sn = toSimpleName(getName()); - simpleName = sn; - } - return sn; - } - - @Override - public Set<ConfigKey<?>> getConfigKeys() { - return configKeysSet; - } - - @Override - public ConfigKey<?> getConfigKey(String name) { - return configKeys.get(name); - } - - @Override - public int hashCode() { - return Objects.hashCode(name, configKeys); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (!(obj instanceof BrooklynTypeSnapshot)) return false; - BrooklynTypeSnapshot o = (BrooklynTypeSnapshot) obj; - - return Objects.equal(name, o.name) && Objects.equal(configKeys, o.configKeys); - } - - @Override - public String toString() { - return toStringHelper().toString(); - } - - protected ToStringHelper toStringHelper() { - return Objects.toStringHelper(name) - .add("configKeys", configKeys); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/basic/BrooklynTypes.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/basic/BrooklynTypes.java b/core/src/main/java/brooklyn/basic/BrooklynTypes.java deleted file mode 100644 index 64dbcd0..0000000 --- a/core/src/main/java/brooklyn/basic/BrooklynTypes.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.basic; - -import java.util.Map; - -import org.apache.brooklyn.api.basic.BrooklynObject; -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.event.Sensor; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.policy.Enricher; -import org.apache.brooklyn.api.policy.Policy; - -import brooklyn.config.ConfigKey; -import brooklyn.enricher.basic.EnricherDynamicType; -import brooklyn.entity.basic.EntityDynamicType; -import brooklyn.policy.basic.PolicyDynamicType; -import brooklyn.util.exceptions.Exceptions; - -import com.google.common.collect.Maps; - -public class BrooklynTypes { - - private static class ImmutableEntityType extends EntityDynamicType { - public ImmutableEntityType(Class<? extends Entity> clazz) { - super(clazz); - } - @Override - public void setName(String name) { - throw new UnsupportedOperationException(); - } - @Override - public void addSensor(Sensor<?> newSensor) { - throw new UnsupportedOperationException(); - } - @Override - public void addSensorIfAbsent(Sensor<?> newSensor) { - throw new UnsupportedOperationException(); - } - @Override - public Sensor<?> addSensorIfAbsentWithoutPublishing(Sensor<?> newSensor) { - throw new UnsupportedOperationException(); - } - @Override - public void addSensors(Iterable<? extends Sensor<?>> newSensors) { - throw new UnsupportedOperationException(); - } - @Override - public boolean removeSensor(Sensor<?> sensor) { - throw new UnsupportedOperationException(); - } - @Override - public Sensor<?> removeSensor(String sensorName) { - throw new UnsupportedOperationException(); - } - } - - @SuppressWarnings("rawtypes") - private static final Map<Class,BrooklynDynamicType<?,?>> cache = Maps.newConcurrentMap(); - - public static EntityDynamicType getDefinedEntityType(Class<? extends Entity> entityClass) { - return (EntityDynamicType) BrooklynTypes.getDefinedBrooklynType(entityClass); - } - - public static BrooklynDynamicType<?,?> getDefinedBrooklynType(Class<? extends BrooklynObject> brooklynClass) { - BrooklynDynamicType<?,?> t = cache.get(brooklynClass); - if (t!=null) return t; - return loadDefinedBrooklynType(brooklynClass); - } - - @SuppressWarnings("unchecked") - private static synchronized BrooklynDynamicType<?,?> loadDefinedBrooklynType(Class<? extends BrooklynObject> brooklynClass) { - BrooklynDynamicType<?,?> type = cache.get(brooklynClass); - if (type != null) return type; - - if (Entity.class.isAssignableFrom(brooklynClass)) { - type = new ImmutableEntityType((Class<? extends Entity>)brooklynClass); - } else if (Location.class.isAssignableFrom(brooklynClass)) { - type = new ImmutableEntityType((Class<? extends Entity>)brooklynClass); - } else if (Policy.class.isAssignableFrom(brooklynClass)) { - type = new PolicyDynamicType((Class<? extends Policy>)brooklynClass); // TODO immutable? - } else if (Enricher.class.isAssignableFrom(brooklynClass)) { - type = new EnricherDynamicType((Class<? extends Enricher>)brooklynClass); // TODO immutable? - } else { - throw new IllegalStateException("Invalid brooklyn type "+brooklynClass); - } - cache.put(brooklynClass, type); - return type; - } - - public static Map<String, ConfigKey<?>> getDefinedConfigKeys(Class<? extends BrooklynObject> brooklynClass) { - return getDefinedBrooklynType(brooklynClass).getConfigKeys(); - } - - @SuppressWarnings("unchecked") - public static Map<String, ConfigKey<?>> getDefinedConfigKeys(String brooklynTypeName) { - try { - return getDefinedConfigKeys((Class<? extends BrooklynObject>) Class.forName(brooklynTypeName)); - } catch (ClassNotFoundException e) { - throw Exceptions.propagate(e); - } - } - - public static Map<String, Sensor<?>> getDefinedSensors(Class<? extends Entity> entityClass) { - return getDefinedEntityType(entityClass).getSensors(); - } - - @SuppressWarnings("unchecked") - public static Map<String, Sensor<?>> getDefinedSensors(String entityTypeName) { - try { - return getDefinedSensors((Class<? extends Entity>) Class.forName(entityTypeName)); - } catch (ClassNotFoundException e) { - throw Exceptions.propagate(e); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/basic/internal/ApiObjectsFactoryImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/basic/internal/ApiObjectsFactoryImpl.java b/core/src/main/java/brooklyn/basic/internal/ApiObjectsFactoryImpl.java deleted file mode 100644 index 8e0f5a4..0000000 --- a/core/src/main/java/brooklyn/basic/internal/ApiObjectsFactoryImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.basic.internal; - -import org.apache.brooklyn.api.basic.internal.ApiObjectsFactoryInterface; -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.management.Task; - -import brooklyn.entity.basic.BrooklynTaskTags; -import brooklyn.util.task.Tasks; - -public class ApiObjectsFactoryImpl implements ApiObjectsFactoryInterface { - - @Override - public String getCatalogItemIdFromContext() { - Task<?> currentTask = Tasks.current(); - if (currentTask != null) { - Entity contextEntity = BrooklynTaskTags.getContextEntity(currentTask); - if (contextEntity != null) { - return contextEntity.getCatalogItemId(); - } - } - return null; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/enricher/basic/EnricherDynamicType.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/enricher/basic/EnricherDynamicType.java b/core/src/main/java/brooklyn/enricher/basic/EnricherDynamicType.java index 0604941..1645a23 100644 --- a/core/src/main/java/brooklyn/enricher/basic/EnricherDynamicType.java +++ b/core/src/main/java/brooklyn/enricher/basic/EnricherDynamicType.java @@ -21,7 +21,7 @@ package brooklyn.enricher.basic; import org.apache.brooklyn.api.policy.Enricher; import org.apache.brooklyn.api.policy.EnricherType; -import brooklyn.basic.BrooklynDynamicType; +import org.apache.brooklyn.basic.BrooklynDynamicType; public class EnricherDynamicType extends BrooklynDynamicType<Enricher, AbstractEnricher> { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/enricher/basic/EnricherTypeSnapshot.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/enricher/basic/EnricherTypeSnapshot.java b/core/src/main/java/brooklyn/enricher/basic/EnricherTypeSnapshot.java index a8d240d..547831a 100644 --- a/core/src/main/java/brooklyn/enricher/basic/EnricherTypeSnapshot.java +++ b/core/src/main/java/brooklyn/enricher/basic/EnricherTypeSnapshot.java @@ -22,7 +22,7 @@ import java.util.Map; import org.apache.brooklyn.api.policy.EnricherType; -import brooklyn.basic.BrooklynTypeSnapshot; +import org.apache.brooklyn.basic.BrooklynTypeSnapshot; import brooklyn.config.ConfigKey; public class EnricherTypeSnapshot extends BrooklynTypeSnapshot implements EnricherType { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java index 1d21a7e..ee429b2 100644 --- a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java +++ b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java @@ -64,7 +64,7 @@ import org.apache.commons.lang3.builder.EqualsBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.AbstractBrooklynObject; +import org.apache.brooklyn.basic.AbstractBrooklynObject; import brooklyn.config.BrooklynLogging; import brooklyn.config.ConfigKey; import brooklyn.config.ConfigKey.HasConfigKey; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/basic/Entities.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/basic/Entities.java b/core/src/main/java/brooklyn/entity/basic/Entities.java index c768726..00aabd7 100644 --- a/core/src/main/java/brooklyn/entity/basic/Entities.java +++ b/core/src/main/java/brooklyn/entity/basic/Entities.java @@ -67,7 +67,7 @@ import org.apache.brooklyn.core.management.internal.NonDeploymentManagementConte import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import brooklyn.config.BrooklynProperties; import brooklyn.config.ConfigKey; import brooklyn.config.ConfigKey.HasConfigKey; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java b/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java index 6477485..794fdaf 100644 --- a/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java +++ b/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java @@ -33,7 +33,7 @@ import org.apache.brooklyn.api.event.Sensor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.BrooklynDynamicType; +import org.apache.brooklyn.basic.BrooklynDynamicType; import brooklyn.config.ConfigKey.HasConfigKey; import brooklyn.entity.effector.EffectorAndBody; import brooklyn.entity.effector.EffectorBody; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/basic/EntityInternal.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/basic/EntityInternal.java b/core/src/main/java/brooklyn/entity/basic/EntityInternal.java index 085079f..f7fa53f 100644 --- a/core/src/main/java/brooklyn/entity/basic/EntityInternal.java +++ b/core/src/main/java/brooklyn/entity/basic/EntityInternal.java @@ -34,7 +34,7 @@ import org.apache.brooklyn.api.management.SubscriptionContext; import org.apache.brooklyn.api.mementos.EntityMemento; import org.apache.brooklyn.core.management.internal.EntityManagementSupport; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import brooklyn.config.ConfigKey; import brooklyn.util.config.ConfigBag; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/basic/EntityTypeSnapshot.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/basic/EntityTypeSnapshot.java b/core/src/main/java/brooklyn/entity/basic/EntityTypeSnapshot.java index ab6b239..dddecf6 100644 --- a/core/src/main/java/brooklyn/entity/basic/EntityTypeSnapshot.java +++ b/core/src/main/java/brooklyn/entity/basic/EntityTypeSnapshot.java @@ -29,7 +29,7 @@ import org.apache.brooklyn.api.entity.EntityType; import org.apache.brooklyn.api.entity.ParameterType; import org.apache.brooklyn.api.event.Sensor; -import brooklyn.basic.BrooklynTypeSnapshot; +import org.apache.brooklyn.basic.BrooklynTypeSnapshot; import brooklyn.config.ConfigKey; import brooklyn.util.guava.Maybe; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/basic/EntityTypes.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/basic/EntityTypes.java b/core/src/main/java/brooklyn/entity/basic/EntityTypes.java index 9970538..77620f8 100644 --- a/core/src/main/java/brooklyn/entity/basic/EntityTypes.java +++ b/core/src/main/java/brooklyn/entity/basic/EntityTypes.java @@ -18,7 +18,7 @@ */ package brooklyn.entity.basic; -import brooklyn.basic.BrooklynTypes; +import org.apache.brooklyn.basic.BrooklynTypes; /** * @deprecated since 0.7.0; use {@link BrooklynTypes} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/rebind/AbstractBrooklynObjectRebindSupport.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/AbstractBrooklynObjectRebindSupport.java b/core/src/main/java/brooklyn/entity/rebind/AbstractBrooklynObjectRebindSupport.java index 19a6cd6..f3eca47 100644 --- a/core/src/main/java/brooklyn/entity/rebind/AbstractBrooklynObjectRebindSupport.java +++ b/core/src/main/java/brooklyn/entity/rebind/AbstractBrooklynObjectRebindSupport.java @@ -25,7 +25,7 @@ import org.apache.brooklyn.api.policy.EntityAdjunct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.AbstractBrooklynObject; +import org.apache.brooklyn.basic.AbstractBrooklynObject; import brooklyn.entity.rebind.dto.MementosGenerators; import brooklyn.policy.basic.AbstractEntityAdjunct.AdjunctTagSupport; import brooklyn.util.text.Strings; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java b/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java index c1d2576..f0a0d25 100644 --- a/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java +++ b/core/src/main/java/brooklyn/entity/rebind/ActivePartialRebindIteration.java @@ -37,7 +37,7 @@ import org.apache.brooklyn.api.mementos.BrooklynMementoRawData.Builder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import brooklyn.entity.basic.EntityInternal; import brooklyn.entity.rebind.persister.BrooklynMementoPersisterToObjectStore; import brooklyn.entity.rebind.persister.PersistenceActivityMetrics; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/rebind/ImmediateDeltaChangeListener.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/ImmediateDeltaChangeListener.java b/core/src/main/java/brooklyn/entity/rebind/ImmediateDeltaChangeListener.java index 5a0a97a..bb1241e 100644 --- a/core/src/main/java/brooklyn/entity/rebind/ImmediateDeltaChangeListener.java +++ b/core/src/main/java/brooklyn/entity/rebind/ImmediateDeltaChangeListener.java @@ -21,7 +21,7 @@ package brooklyn.entity.rebind; import java.util.Collection; import java.util.Map; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import org.apache.brooklyn.api.basic.BrooklynObject; import org.apache.brooklyn.api.catalog.CatalogItem; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java index d204ecc..6e1e09f 100644 --- a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java +++ b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java @@ -30,7 +30,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import org.apache.brooklyn.api.basic.BrooklynObject; import org.apache.brooklyn.api.catalog.CatalogItem; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/rebind/RebindIteration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindIteration.java b/core/src/main/java/brooklyn/entity/rebind/RebindIteration.java index 1164fff..f2ddfb2 100644 --- a/core/src/main/java/brooklyn/entity/rebind/RebindIteration.java +++ b/core/src/main/java/brooklyn/entity/rebind/RebindIteration.java @@ -33,8 +33,8 @@ import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.AbstractBrooklynObject; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.AbstractBrooklynObject; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import org.apache.brooklyn.api.basic.BrooklynObject; import org.apache.brooklyn.api.catalog.BrooklynCatalog; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java b/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java index 2e80444..204148d 100644 --- a/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java +++ b/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java @@ -35,11 +35,10 @@ import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.BrooklynTypes; +import org.apache.brooklyn.basic.BrooklynTypes; import brooklyn.config.ConfigKey; import brooklyn.entity.basic.AbstractEntity; import brooklyn.entity.basic.ConfigKeys; -import brooklyn.entity.basic.Entities; import brooklyn.entity.basic.Sanitizer; import brooklyn.event.basic.Sensors; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java b/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java index dbe6e26..5399159 100644 --- a/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java +++ b/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java @@ -25,7 +25,7 @@ import java.lang.reflect.Proxy; import java.util.Map; import java.util.Set; -import brooklyn.basic.BrooklynTypes; +import org.apache.brooklyn.basic.BrooklynTypes; import org.apache.brooklyn.api.basic.BrooklynObject; import org.apache.brooklyn.api.catalog.CatalogItem; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynPersistenceUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynPersistenceUtils.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynPersistenceUtils.java index 68074e9..63945c3 100644 --- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynPersistenceUtils.java +++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynPersistenceUtils.java @@ -23,7 +23,7 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import org.apache.brooklyn.api.basic.BrooklynObject; import org.apache.brooklyn.api.catalog.CatalogItem; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java index ab303a0..96be1af 100644 --- a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java +++ b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java @@ -44,8 +44,8 @@ import org.apache.brooklyn.core.management.internal.SubscriptionTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.AbstractBrooklynObject; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.AbstractBrooklynObject; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import brooklyn.config.ConfigKey; import brooklyn.config.ConfigKey.HasConfigKey; import brooklyn.config.ConfigMap; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/policy/basic/PolicyDynamicType.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/policy/basic/PolicyDynamicType.java b/core/src/main/java/brooklyn/policy/basic/PolicyDynamicType.java index b6d3c6d..98e334a 100644 --- a/core/src/main/java/brooklyn/policy/basic/PolicyDynamicType.java +++ b/core/src/main/java/brooklyn/policy/basic/PolicyDynamicType.java @@ -21,7 +21,7 @@ package brooklyn.policy.basic; import org.apache.brooklyn.api.policy.Policy; import org.apache.brooklyn.api.policy.PolicyType; -import brooklyn.basic.BrooklynDynamicType; +import org.apache.brooklyn.basic.BrooklynDynamicType; public class PolicyDynamicType extends BrooklynDynamicType<Policy, AbstractPolicy> { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/brooklyn/policy/basic/PolicyTypeSnapshot.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/policy/basic/PolicyTypeSnapshot.java b/core/src/main/java/brooklyn/policy/basic/PolicyTypeSnapshot.java index b6d2f33..66f8194 100644 --- a/core/src/main/java/brooklyn/policy/basic/PolicyTypeSnapshot.java +++ b/core/src/main/java/brooklyn/policy/basic/PolicyTypeSnapshot.java @@ -22,7 +22,7 @@ import java.util.Map; import org.apache.brooklyn.api.policy.PolicyType; -import brooklyn.basic.BrooklynTypeSnapshot; +import org.apache.brooklyn.basic.BrooklynTypeSnapshot; import brooklyn.config.ConfigKey; public class PolicyTypeSnapshot extends BrooklynTypeSnapshot implements PolicyType { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/basic/AbstractBrooklynObject.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/basic/AbstractBrooklynObject.java b/core/src/main/java/org/apache/brooklyn/basic/AbstractBrooklynObject.java new file mode 100644 index 0000000..260c91b --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/basic/AbstractBrooklynObject.java @@ -0,0 +1,249 @@ +/* + * 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.basic; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import org.apache.brooklyn.api.basic.internal.ApiObjectsFactory; +import org.apache.brooklyn.api.management.ManagementContext; +import org.apache.brooklyn.core.management.internal.ManagementContextInternal; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import brooklyn.entity.basic.AbstractEntity; +import brooklyn.entity.proxying.InternalFactory; +import brooklyn.entity.rebind.RebindManagerImpl; +import brooklyn.util.config.ConfigBag; +import brooklyn.util.flags.SetFromFlag; +import brooklyn.util.text.Identifiers; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + +public abstract class AbstractBrooklynObject implements BrooklynObjectInternal { + + private static final Logger log = LoggerFactory.getLogger(AbstractBrooklynObject.class); + + private boolean _legacyConstruction; + private boolean hasWarnedOfNoManagementContextWhenPersistRequested; + + @SetFromFlag(value = "id") + private String id = Identifiers.makeRandomId(8); + + private String catalogItemId; + + /** subclasses should synchronize on this for all access */ + @SetFromFlag(value = "tags") + private final Set<Object> tags = Sets.newLinkedHashSet(); + + private volatile ManagementContext managementContext; + + public abstract void setDisplayName(String newName); + + public AbstractBrooklynObject() { + this(Maps.newLinkedHashMap()); + } + + public AbstractBrooklynObject(Map<?, ?> properties) { + _legacyConstruction = !InternalFactory.FactoryConstructionTracker.isConstructing(); + + if (!_legacyConstruction && properties != null && !properties.isEmpty()) { + log.warn("Forcing use of deprecated old-style construction for {} because properties were " + + "specified ({}); instead use specs (e.g. LocationSpec, EntitySpec, etc)", + getClass().getName(), properties); + if (log.isDebugEnabled()) + log.debug("Source of use of old-style construction", new Throwable("Source of use of old-style construction")); + _legacyConstruction = true; + } + + catalogItemId = ApiObjectsFactory.get().getCatalogItemIdFromContext(); + + // rely on sub-class to call configure(properties), because otherwise its fields will not have been initialised + } + + /** + * See {@link #configure(Map)} + * + * @deprecated since 0.7.0; only used for legacy brooklyn types where constructor is called directly + */ + @Deprecated + protected AbstractBrooklynObject configure() { + return configure(Collections.emptyMap()); + } + + /** + * Will set fields from flags, and put the remaining ones into the 'leftovers' map. + * For some types, you can find unused config via {@link ConfigBag#getUnusedConfig()}. + * <p> + * To be overridden by AbstractEntity, AbstractLoation, AbstractPolicy, AbstractEnricher, etc. + * <p> + * But should not be overridden by specific entity types. If you do, the entity may break in + * subsequent releases. Also note that if you require fields to be initialized you must do that + * in this method. You must *not* rely on field initializers because they may not run until *after* + * this method (this method is invoked by the constructor in this class, so initializers + * in subclasses will not have run when this overridden method is invoked.) + * + * @deprecated since 0.7.0; only used for legacy brooklyn types where constructor is called directly + */ + @Deprecated + protected abstract AbstractBrooklynObject configure(Map<?, ?> flags); + + protected boolean isLegacyConstruction() { + return _legacyConstruction; + } + + /** + * Called by framework (in new-style instances where spec was used) after configuring etc, + * but before a reference to this instance is shared. + * <p> + * To preserve backwards compatibility for if the instance is constructed directly, one + * can call the code below, but that means it will be called after references to this + * policy have been shared with other entities. + * <pre> + * {@code + * if (isLegacyConstruction()) { + * init(); + * } + * } + * </pre> + */ + public void init() { + // no-op + } + + /** + * Called by framework on rebind (in new-style instances): + * <ul> + * <li> after configuring, but + * <li> before the instance is managed, and + * <li> before adjuncts are attached to entities, and + * <li> before a reference to an object is shared. + * </ul> + * Note that {@link #init()} will not be called on rebind. + * <p> + * If you need to intercept behaviour <i>after</i> adjuncts are attached, + * consider {@link AbstractEntity#onManagementStarting()} + * (but probably worth raising a discussion on the mailing list!) + */ + public void rebind() { + // no-op + } + + public void setManagementContext(ManagementContextInternal managementContext) { + this.managementContext = managementContext; + } + + public ManagementContext getManagementContext() { + return managementContext; + } + + protected boolean isRebinding() { + return RebindManagerImpl.RebindTracker.isRebinding(); + } + + protected void requestPersist() { + if (getManagementContext() != null) { + getManagementContext().getRebindManager().getChangeListener().onChanged(this); + } else { + // Might be nice to log this at debug but it gets hit a lot of times as locations + // are created and destroyed for the API. It also might not be an error - the + // management context might be null if the object is being recreated by persistence. + if (log.isTraceEnabled() && !hasWarnedOfNoManagementContextWhenPersistRequested) { + log.trace("Cannot fulfil request to persist {} because it has no management context. " + + "This warning will not be logged for this object again.", this); + hasWarnedOfNoManagementContextWhenPersistRequested = true; + } + } + } + + @Override + public String getId() { + return id; + } + + @Override + public void setCatalogItemId(String id) { + this.catalogItemId = id; + } + + @Override + public String getCatalogItemId() { + return catalogItemId; + } + + protected void onTagsChanged() { + requestPersist(); + } + + @Override + public TagSupport tags() { + return new BasicTagSupport(); + } + + protected class BasicTagSupport implements TagSupport { + @Override + public Set<Object> getTags() { + synchronized (tags) { + return ImmutableSet.copyOf(tags); + } + } + + @Override + public boolean containsTag(Object tag) { + synchronized (tags) { + return tags.contains(tag); + } + } + + @Override + public boolean addTag(Object tag) { + boolean result; + synchronized (tags) { + result = tags.add(tag); + } + onTagsChanged(); + return result; + } + + @Override + public boolean addTags(Iterable<?> newTags) { + boolean result; + synchronized (tags) { + result = Iterables.addAll(tags, newTags); + } + onTagsChanged(); + return result; + } + + @Override + public boolean removeTag(Object tag) { + boolean result; + synchronized (tags) { + result = tags.remove(tag); + } + onTagsChanged(); + return result; + } + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/basic/BasicConfigurableObject.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/basic/BasicConfigurableObject.java b/core/src/main/java/org/apache/brooklyn/basic/BasicConfigurableObject.java new file mode 100644 index 0000000..f376d74 --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/basic/BasicConfigurableObject.java @@ -0,0 +1,120 @@ +/* + * 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.basic; + +import org.apache.brooklyn.api.entity.trait.Configurable; +import org.apache.brooklyn.api.entity.trait.Identifiable; +import org.apache.brooklyn.api.management.ManagementContext; +import org.apache.brooklyn.api.management.Task; +import org.apache.brooklyn.core.management.ManagementContextInjectable; + +import brooklyn.camp.brooklyn.api.HasBrooklynManagementContext; +import brooklyn.config.ConfigKey; +import brooklyn.config.ConfigKey.HasConfigKey; +import brooklyn.config.ConfigMap; +import brooklyn.util.config.ConfigBag; +import brooklyn.util.flags.SetFromFlag; +import brooklyn.util.text.Identifiers; + +/** + * A parent class for ancilliary objects that do not require the full heavy lifting of {@link AbstractBrooklynObject} + * or similar, but wish to use {@link ConfigKey} and {@link Configurable} in their construction, via the + * {@code $brooklyn:object} method of the CAMP DSL. + * <p> + * Type coercion of values will occur when the {@link ConfigMap} is accessed, but resolving of {@link Task tasks} and other + * deferred operations are assumed to have occurred prior to calling {@link #setConfig(ConfigKey, Object)} i.e. at + * object construction. + */ +public class BasicConfigurableObject implements Configurable, Identifiable, ManagementContextInjectable, HasBrooklynManagementContext { + + @SetFromFlag("id") + private String id = Identifiers.makeRandomId(8); + + private volatile ManagementContext managementContext; + private BasicConfigurationSupport config; + + public BasicConfigurableObject() { + config = new BasicConfigurationSupport(); + } + + @Override + public void injectManagementContext(ManagementContext managementContext) { + this.managementContext = managementContext; + } + + public ManagementContext getBrooklynManagementContext() { + return managementContext; + } + + @Override + public String getId() { + return id; + } + + @Override + public ConfigurationSupport config() { + return config; + } + + @Override + @Deprecated + public <T> T setConfig(ConfigKey<T> key, T value) { + return config().set(key, value); + } + + public <T> T getConfig(ConfigKey<T> key) { + return config().get(key); + } + + private static class BasicConfigurationSupport implements ConfigurationSupport { + private final ConfigBag config = ConfigBag.newInstance(); + + @Override + public <T> T get(ConfigKey<T> key) { + return config.get(key); + } + + @Override + public <T> T get(HasConfigKey<T> key) { + return get(key.getConfigKey()); + } + + @Override + public <T> T set(ConfigKey<T> key, T val) { + T old = config.get(key); + config.configure(key, val); + return old; + } + + @Override + public <T> T set(HasConfigKey<T> key, T val) { + return set(key.getConfigKey(), val); + } + + @Override + public <T> T set(ConfigKey<T> key, Task<T> val) { + throw new UnsupportedOperationException(); + } + + @Override + public <T> T set(HasConfigKey<T> key, Task<T> val) { + return set(key.getConfigKey(), val); + } + } +}
