Repository: incubator-brooklyn Updated Branches: refs/heads/master 4d0bbce7c -> 5dfe944e5
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/basic/BrooklynDynamicType.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/basic/BrooklynDynamicType.java b/core/src/main/java/org/apache/brooklyn/basic/BrooklynDynamicType.java new file mode 100644 index 0000000..368b035 --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/basic/BrooklynDynamicType.java @@ -0,0 +1,284 @@ +/* + * 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 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/org/apache/brooklyn/basic/BrooklynObjectInternal.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/basic/BrooklynObjectInternal.java b/core/src/main/java/org/apache/brooklyn/basic/BrooklynObjectInternal.java new file mode 100644 index 0000000..8109b78 --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/basic/BrooklynObjectInternal.java @@ -0,0 +1,104 @@ +/* + * 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.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/org/apache/brooklyn/basic/BrooklynTypeSnapshot.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/basic/BrooklynTypeSnapshot.java b/core/src/main/java/org/apache/brooklyn/basic/BrooklynTypeSnapshot.java new file mode 100644 index 0000000..f7b0577 --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/basic/BrooklynTypeSnapshot.java @@ -0,0 +1,102 @@ +/* + * 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.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/org/apache/brooklyn/basic/BrooklynTypes.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/basic/BrooklynTypes.java b/core/src/main/java/org/apache/brooklyn/basic/BrooklynTypes.java new file mode 100644 index 0000000..f64c8f9 --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/basic/BrooklynTypes.java @@ -0,0 +1,132 @@ +/* + * 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.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/org/apache/brooklyn/basic/internal/ApiObjectsFactoryImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/basic/internal/ApiObjectsFactoryImpl.java b/core/src/main/java/org/apache/brooklyn/basic/internal/ApiObjectsFactoryImpl.java new file mode 100644 index 0000000..d200a3c --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/basic/internal/ApiObjectsFactoryImpl.java @@ -0,0 +1,42 @@ +/* + * 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.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/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java index 0e8ec80..39ab22e 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java @@ -38,7 +38,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.Yaml; -import brooklyn.basic.BrooklynObjectInternal.ConfigurationSupportInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal.ConfigurationSupportInternal; import brooklyn.camp.brooklyn.api.AssemblyTemplateSpecInstantiator; import org.apache.brooklyn.api.basic.AbstractBrooklynObjectSpec; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java index 3914427..1949238 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java @@ -23,7 +23,7 @@ import java.util.Collection; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.entity.rebind.RebindSupport; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java index 5aa073b..f5fc329 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java @@ -29,7 +29,7 @@ import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.AbstractBrooklynObject; +import org.apache.brooklyn.basic.AbstractBrooklynObject; import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.entity.rebind.RebindSupport; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java index 378e450..f8db025 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java @@ -25,7 +25,7 @@ import javax.annotation.Nullable; 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.BrooklynCatalog; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogXmlSerializer.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogXmlSerializer.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogXmlSerializer.java index 462e00e..ede8bde 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogXmlSerializer.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogXmlSerializer.java @@ -25,7 +25,7 @@ import java.util.Map; import org.apache.brooklyn.core.catalog.internal.CatalogClasspathDo.CatalogScanningModes; -import brooklyn.basic.AbstractBrooklynObject; +import org.apache.brooklyn.basic.AbstractBrooklynObject; import brooklyn.util.xstream.EnumCaseForgivingSingleValueConverter; import brooklyn.util.xstream.XmlSerializer; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocation.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocation.java b/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocation.java index 554a781..70d8da1 100644 --- a/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocation.java +++ b/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocation.java @@ -41,7 +41,7 @@ import org.apache.brooklyn.core.management.internal.ManagementContextInternal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.AbstractBrooklynObject; +import org.apache.brooklyn.basic.AbstractBrooklynObject; import brooklyn.config.ConfigInheritance; 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/org/apache/brooklyn/location/basic/LocationDynamicType.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/location/basic/LocationDynamicType.java b/core/src/main/java/org/apache/brooklyn/location/basic/LocationDynamicType.java index f13be4e..80fd851 100644 --- a/core/src/main/java/org/apache/brooklyn/location/basic/LocationDynamicType.java +++ b/core/src/main/java/org/apache/brooklyn/location/basic/LocationDynamicType.java @@ -18,7 +18,7 @@ */ package org.apache.brooklyn.location.basic; -import brooklyn.basic.BrooklynDynamicType; +import org.apache.brooklyn.basic.BrooklynDynamicType; import org.apache.brooklyn.api.location.Location; import org.apache.brooklyn.api.location.LocationType; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/location/basic/LocationInternal.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/location/basic/LocationInternal.java b/core/src/main/java/org/apache/brooklyn/location/basic/LocationInternal.java index de3e9a0..0082b9a 100644 --- a/core/src/main/java/org/apache/brooklyn/location/basic/LocationInternal.java +++ b/core/src/main/java/org/apache/brooklyn/location/basic/LocationInternal.java @@ -25,7 +25,7 @@ import org.apache.brooklyn.api.location.Location; import org.apache.brooklyn.api.management.ManagementContext; import org.apache.brooklyn.api.mementos.LocationMemento; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import brooklyn.config.ConfigInheritance; import brooklyn.config.ConfigKey; import brooklyn.entity.basic.ConfigKeys; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/java/org/apache/brooklyn/location/basic/LocationTypeSnapshot.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/location/basic/LocationTypeSnapshot.java b/core/src/main/java/org/apache/brooklyn/location/basic/LocationTypeSnapshot.java index 3f14ba7..1199ded 100644 --- a/core/src/main/java/org/apache/brooklyn/location/basic/LocationTypeSnapshot.java +++ b/core/src/main/java/org/apache/brooklyn/location/basic/LocationTypeSnapshot.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 LocationTypeSnapshot extends BrooklynTypeSnapshot implements EnricherType { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.basic.internal.ApiObjectsFactoryInterface ---------------------------------------------------------------------- diff --git a/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.basic.internal.ApiObjectsFactoryInterface b/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.basic.internal.ApiObjectsFactoryInterface index 4af251f..9bc602a 100644 --- a/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.basic.internal.ApiObjectsFactoryInterface +++ b/core/src/main/resources/META-INF/services/org.apache.brooklyn.api.basic.internal.ApiObjectsFactoryInterface @@ -16,4 +16,4 @@ # specific language governing permissions and limitations # under the License. # -brooklyn.basic.internal.ApiObjectsFactoryImpl +org.apache.brooklyn.basic.internal.ApiObjectsFactoryImpl http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java index 66fee85..407a325 100644 --- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java +++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java @@ -25,7 +25,7 @@ import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.annotations.Test; -import brooklyn.basic.BrooklynTypes; +import org.apache.brooklyn.basic.BrooklynTypes; import org.apache.brooklyn.api.catalog.BrooklynCatalog; import org.apache.brooklyn.api.catalog.CatalogItem; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/usage/cli/src/main/java/org/apache/brooklyn/cli/Main.java ---------------------------------------------------------------------- diff --git a/usage/cli/src/main/java/org/apache/brooklyn/cli/Main.java b/usage/cli/src/main/java/org/apache/brooklyn/cli/Main.java index 8d3ed07..8cce298 100644 --- a/usage/cli/src/main/java/org/apache/brooklyn/cli/Main.java +++ b/usage/cli/src/main/java/org/apache/brooklyn/cli/Main.java @@ -31,7 +31,6 @@ import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicBoolean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +44,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import brooklyn.BrooklynVersion; -import brooklyn.basic.BrooklynTypes; +import org.apache.brooklyn.basic.BrooklynTypes; import org.apache.brooklyn.api.catalog.BrooklynCatalog; import org.apache.brooklyn.api.catalog.CatalogItem; @@ -66,16 +65,6 @@ import org.apache.brooklyn.cli.CloudExplorer.ComputeListImagesCommand; import org.apache.brooklyn.cli.CloudExplorer.ComputeListInstancesCommand; import org.apache.brooklyn.cli.CloudExplorer.ComputeTerminateInstancesCommand; import org.apache.brooklyn.cli.ItemLister.ListAllCommand; -import org.apache.brooklyn.cli.CloudExplorer.BlobstoreGetBlobCommand; -import org.apache.brooklyn.cli.CloudExplorer.BlobstoreListContainerCommand; -import org.apache.brooklyn.cli.CloudExplorer.BlobstoreListContainersCommand; -import org.apache.brooklyn.cli.CloudExplorer.ComputeDefaultTemplateCommand; -import org.apache.brooklyn.cli.CloudExplorer.ComputeGetImageCommand; -import org.apache.brooklyn.cli.CloudExplorer.ComputeListHardwareProfilesCommand; -import org.apache.brooklyn.cli.CloudExplorer.ComputeListImagesCommand; -import org.apache.brooklyn.cli.CloudExplorer.ComputeListInstancesCommand; -import org.apache.brooklyn.cli.CloudExplorer.ComputeTerminateInstancesCommand; -import org.apache.brooklyn.cli.ItemLister.ListAllCommand; import org.apache.brooklyn.core.catalog.internal.CatalogInitialization; import org.apache.brooklyn.core.management.ha.OsgiManager; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/usage/cli/src/main/java/org/apache/brooklyn/cli/lister/ItemDescriptors.java ---------------------------------------------------------------------- diff --git a/usage/cli/src/main/java/org/apache/brooklyn/cli/lister/ItemDescriptors.java b/usage/cli/src/main/java/org/apache/brooklyn/cli/lister/ItemDescriptors.java index 9cef866..abbccde 100644 --- a/usage/cli/src/main/java/org/apache/brooklyn/cli/lister/ItemDescriptors.java +++ b/usage/cli/src/main/java/org/apache/brooklyn/cli/lister/ItemDescriptors.java @@ -27,8 +27,8 @@ import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.BrooklynDynamicType; -import brooklyn.basic.BrooklynTypes; +import org.apache.brooklyn.basic.BrooklynDynamicType; +import org.apache.brooklyn.basic.BrooklynTypes; import org.apache.brooklyn.api.basic.BrooklynObject; import org.apache.brooklyn.api.basic.BrooklynType; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/usage/qa/src/test/java/org/apache/brooklyn/qa/brooklynnode/SoftlayerObtainPrivateLiveTest.java ---------------------------------------------------------------------- diff --git a/usage/qa/src/test/java/org/apache/brooklyn/qa/brooklynnode/SoftlayerObtainPrivateLiveTest.java b/usage/qa/src/test/java/org/apache/brooklyn/qa/brooklynnode/SoftlayerObtainPrivateLiveTest.java index 59c5b0b..2656429 100644 --- a/usage/qa/src/test/java/org/apache/brooklyn/qa/brooklynnode/SoftlayerObtainPrivateLiveTest.java +++ b/usage/qa/src/test/java/org/apache/brooklyn/qa/brooklynnode/SoftlayerObtainPrivateLiveTest.java @@ -32,7 +32,7 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import brooklyn.basic.BrooklynObjectInternal.ConfigurationSupportInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal.ConfigurationSupportInternal; import brooklyn.entity.basic.Attributes; import brooklyn.entity.basic.Entities; import brooklyn.entity.basic.Lifecycle; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java index 655c20c..a96fe82 100644 --- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java +++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java @@ -23,7 +23,7 @@ import java.util.Map; import javax.ws.rs.core.Response; -import brooklyn.basic.BrooklynObjectInternal; +import org.apache.brooklyn.basic.BrooklynObjectInternal; import brooklyn.config.ConfigKey; import org.apache.brooklyn.api.entity.Entity; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/CatalogTransformer.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/CatalogTransformer.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/CatalogTransformer.java index 2afd4c3..32c32d4 100644 --- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/CatalogTransformer.java +++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/CatalogTransformer.java @@ -24,7 +24,7 @@ import java.util.Set; import org.slf4j.LoggerFactory; -import brooklyn.basic.BrooklynTypes; +import org.apache.brooklyn.basic.BrooklynTypes; import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e1a2d668/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java index d09d05b..e5cccd5 100644 --- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java +++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java @@ -38,7 +38,7 @@ import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import brooklyn.basic.BrooklynTypes; +import org.apache.brooklyn.basic.BrooklynTypes; import org.apache.brooklyn.api.catalog.BrooklynCatalog; import org.apache.brooklyn.api.catalog.CatalogItem;
