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;


Reply via email to