You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/11/04 15:30:05 UTC

[11/18] git commit: Catalog Item ID field renaming and ApiObjectsFactory tweaks

Catalog Item ID field renaming and ApiObjectsFactory tweaks

* catalogItemId rather than contextCatalogItemId
* ApiObjectsFactory moved to internal package, inner class promoted so services file is nicer
* safer initialization of ApiObjectsFactory


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/72ac1296
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/72ac1296
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/72ac1296

Branch: refs/heads/master
Commit: 72ac1296dde17d5a80a5496d8f81273e07bd3bf1
Parents: e832ee4
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Oct 31 10:19:57 2014 -0500
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Nov 3 18:57:19 2014 +0000

----------------------------------------------------------------------
 .../basic/AbstractBrooklynObjectSpec.java       | 13 +++--
 .../java/brooklyn/basic/ApiObjectsFactory.java  | 41 -------------
 .../java/brooklyn/basic/BrooklynObject.java     | 10 +++-
 .../basic/internal/ApiObjectsFactory.java       | 60 ++++++++++++++++++++
 .../internal/ApiObjectsFactoryInterface.java    | 29 ++++++++++
 .../main/java/brooklyn/catalog/CatalogItem.java |  9 ++-
 .../mementos/BrooklynMementoManifest.java       |  2 +-
 .../main/java/brooklyn/mementos/Memento.java    |  2 +-
 .../brooklyn/basic/AbstractBrooklynObject.java  | 13 +++--
 .../brooklyn/basic/ApiObjectsFactoryImpl.java   | 41 -------------
 .../basic/internal/ApiObjectsFactoryImpl.java   | 41 +++++++++++++
 .../catalog/internal/BasicBrooklynCatalog.java  |  2 +-
 .../brooklyn/catalog/internal/CatalogDo.java    |  3 +-
 .../catalog/internal/CatalogItemDo.java         |  2 +-
 .../brooklyn/catalog/internal/CatalogUtils.java |  5 +-
 .../brooklyn/entity/basic/AbstractEntity.java   |  4 +-
 .../entity/proxying/InternalEntityFactory.java  |  4 +-
 .../proxying/InternalLocationFactory.java       |  4 +-
 .../entity/proxying/InternalPolicyFactory.java  |  8 +--
 .../AbstractBrooklynObjectRebindSupport.java    |  2 +-
 .../entity/rebind/RebindManagerImpl.java        | 14 ++---
 .../entity/rebind/dto/AbstractMemento.java      | 16 +++---
 .../rebind/dto/EntityMementoManifestImpl.java   | 10 ++--
 .../entity/rebind/dto/MementosGenerators.java   |  2 +-
 .../AbstractBrooklynMementoPersister.java       |  2 +-
 .../BrooklynMementoPersisterToMultiFile.java    |  4 +-
 .../BrooklynMementoPersisterToObjectStore.java  |  4 +-
 .../OsgiBrooklynClassLoadingContext.java        | 12 ++--
 .../policy/basic/AbstractEntityAdjunct.java     |  4 +-
 ...ApiObjectsFactory$ApiObjectsFactoryInterface | 19 -------
 ...yn.basic.internal.ApiObjectsFactoryInterface | 19 +++++++
 .../BrooklynAssemblyTemplateInstantiator.java   |  2 +-
 .../BrooklynComponentTemplateResolver.java      |  4 +-
 33 files changed, 236 insertions(+), 171 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/api/src/main/java/brooklyn/basic/AbstractBrooklynObjectSpec.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/basic/AbstractBrooklynObjectSpec.java b/api/src/main/java/brooklyn/basic/AbstractBrooklynObjectSpec.java
index 867b509..c0a4ccc 100644
--- a/api/src/main/java/brooklyn/basic/AbstractBrooklynObjectSpec.java
+++ b/api/src/main/java/brooklyn/basic/AbstractBrooklynObjectSpec.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.lang.reflect.Modifier;
 import java.util.Set;
 
+import brooklyn.basic.internal.ApiObjectsFactory;
 import brooklyn.util.collections.MutableSet;
 import brooklyn.util.exceptions.Exceptions;
 
@@ -35,13 +36,13 @@ public abstract class AbstractBrooklynObjectSpec<T,K extends AbstractBrooklynObj
     
     private final Class<? extends T> type;
     private String displayName;
-    private String contextCatalogItemId;
+    private String catalogItemId;
     private Set<Object> tags = MutableSet.of();
 
     protected AbstractBrooklynObjectSpec(Class<? extends T> type) {
         checkValidType(type);
         this.type = type;
-        this.contextCatalogItemId = ApiObjectsFactory.get().getContextCatalogItemId();
+        this.catalogItemId = ApiObjectsFactory.get().getCatalogItemIdFromContext();
     }
     
     @SuppressWarnings("unchecked")
@@ -61,8 +62,8 @@ public abstract class AbstractBrooklynObjectSpec<T,K extends AbstractBrooklynObj
         return self();
     }
     
-    public K contextCatalogItemId(String val) {
-        contextCatalogItemId = val;
+    public K catalogItemId(String val) {
+        catalogItemId = val;
         return self();
     }
     
@@ -91,8 +92,8 @@ public abstract class AbstractBrooklynObjectSpec<T,K extends AbstractBrooklynObj
         return displayName;
     }
     
-    public final String getContextCatalogItemId() {
-        return contextCatalogItemId;
+    public final String getCatalogItemId() {
+        return catalogItemId;
     }
 
     public final Set<Object> getTags() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/api/src/main/java/brooklyn/basic/ApiObjectsFactory.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/basic/ApiObjectsFactory.java b/api/src/main/java/brooklyn/basic/ApiObjectsFactory.java
deleted file mode 100644
index f85e9c7..0000000
--- a/api/src/main/java/brooklyn/basic/ApiObjectsFactory.java
+++ /dev/null
@@ -1,41 +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.ServiceLoader;
-
-public class ApiObjectsFactory {
-    public interface ApiObjectsFactoryInterface {
-        public String getContextCatalogItemId();
-    }
-
-    private static ApiObjectsFactoryInterface INSTANCE = getFactoryInstance();
-
-    private static ApiObjectsFactoryInterface getFactoryInstance() {
-        ServiceLoader<ApiObjectsFactoryInterface> LOADER = ServiceLoader.load(ApiObjectsFactoryInterface.class);
-        for (ApiObjectsFactoryInterface item : LOADER) {
-            return item;
-        }
-        throw new IllegalStateException("Implementation of " + ApiObjectsFactoryInterface.class + " not found on classpath");
-    }
-
-    public static ApiObjectsFactoryInterface get() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/api/src/main/java/brooklyn/basic/BrooklynObject.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/basic/BrooklynObject.java b/api/src/main/java/brooklyn/basic/BrooklynObject.java
index a31fbf8..4698780 100644
--- a/api/src/main/java/brooklyn/basic/BrooklynObject.java
+++ b/api/src/main/java/brooklyn/basic/BrooklynObject.java
@@ -38,8 +38,16 @@ public interface BrooklynObject extends Identifiable {
 
     /**
      * The catalog item ID this object was loaded from.
+     * <p>
+     * This can be used to understand the appropriate classloading context,
+     * such as for versioning purposes, as well as meta-information such as 
+     * branding (maybe you can even get an icon) and 
+     * potentially things like resource lifecycle (if a software version is being sunsetted).
+     * <p>
+     * In some cases this may be set heuristically from context and so may not be accurate.
+     * Callers can set an explicit catalog item ID if inferencing is not correct.
      */
-    String getContextCatalogItemId();
+    String getCatalogItemId();
     
     /** 
      * Tags are arbitrary objects which can be attached to an entity for subsequent reference.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/api/src/main/java/brooklyn/basic/internal/ApiObjectsFactory.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/basic/internal/ApiObjectsFactory.java b/api/src/main/java/brooklyn/basic/internal/ApiObjectsFactory.java
new file mode 100644
index 0000000..ecbb7fb
--- /dev/null
+++ b/api/src/main/java/brooklyn/basic/internal/ApiObjectsFactory.java
@@ -0,0 +1,60 @@
+/*
+ * 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 java.util.ServiceLoader;
+
+import brooklyn.util.guava.Maybe;
+
+import com.google.common.annotations.Beta;
+
+/** 
+ * This class grants access to implementations in core for operations needed in API classes.
+ * The majority of the API classes are interfaces or have minimal behaviour, but there are a
+ * few instances where more complex behaviour from core is desired.
+ * <p>
+ * This class acts as a bridge for those instances. See the concrete implementation of the
+ * {@link ApiObjectsFactoryInterface} in brooklyn-core class ApiObjectsFactoryImpl.
+ */
+@Beta
+public class ApiObjectsFactory {
+    
+    private static Maybe<ApiObjectsFactoryInterface> INSTANCE;
+
+    private static synchronized ApiObjectsFactoryInterface getFactoryInstance() {
+        // defer initialization to allow any other static initialization to complete,
+        // and use maybe so we (1) don't check multiple times, but (2) do throw error in the caller's stack
+        if (INSTANCE!=null) return INSTANCE.get();
+        
+        ServiceLoader<ApiObjectsFactoryInterface> LOADER = ServiceLoader.load(ApiObjectsFactoryInterface.class);
+        for (ApiObjectsFactoryInterface item : LOADER) {
+            INSTANCE = Maybe.of(item);
+            return INSTANCE.get();
+        }
+        INSTANCE = Maybe.absent("Implementation of " + ApiObjectsFactoryInterface.class + " not found on classpath");
+        return INSTANCE.get();
+    }
+
+    /**
+     * Create (if necessary) and return the concrete implementation from core for the
+     * methods exposed here. */
+    public static ApiObjectsFactoryInterface get() {
+        return getFactoryInstance();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/api/src/main/java/brooklyn/basic/internal/ApiObjectsFactoryInterface.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/basic/internal/ApiObjectsFactoryInterface.java b/api/src/main/java/brooklyn/basic/internal/ApiObjectsFactoryInterface.java
new file mode 100644
index 0000000..275e102
--- /dev/null
+++ b/api/src/main/java/brooklyn/basic/internal/ApiObjectsFactoryInterface.java
@@ -0,0 +1,29 @@
+/*
+ * 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;
+
+/** 
+ * Methods from downstream projects used in API classes at runtime. 
+ * See {@link ApiObjectsFactory}. 
+ */
+public interface ApiObjectsFactoryInterface {
+    
+    public String getCatalogItemIdFromContext();
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/api/src/main/java/brooklyn/catalog/CatalogItem.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/catalog/CatalogItem.java b/api/src/main/java/brooklyn/catalog/CatalogItem.java
index 3a6c2fb..409bd7e 100644
--- a/api/src/main/java/brooklyn/catalog/CatalogItem.java
+++ b/api/src/main/java/brooklyn/catalog/CatalogItem.java
@@ -77,5 +77,12 @@ public interface CatalogItem<T,SpecT> extends BrooklynObject, Rebindable {
 
     @Override
     RebindSupport<CatalogItemMemento> getRebindSupport();
-}
+    
+    /** Built up from {@link #getId()} and {@link #getVersion()}.
+     * 
+     * (It is a bit self-referential having this method on this type of {@link BrooklynObject},
+     * but it is easier this than making the interface hierarchy more complicated.) */
+    @Override
+    public String getCatalogItemId();
 
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java b/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java
index 418c59b..6187e29 100644
--- a/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java
+++ b/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java
@@ -34,7 +34,7 @@ public interface BrooklynMementoManifest extends Serializable {
         public String getId();
         public String getType();
         public String getParent();
-        public String getContextCatalogItemId();
+        public String getCatalogItemId();
     }
 
     public Map<String, EntityMementoManifest> getEntityIdToManifest();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/api/src/main/java/brooklyn/mementos/Memento.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/mementos/Memento.java b/api/src/main/java/brooklyn/mementos/Memento.java
index 6ab36b0..bb6f8b1 100644
--- a/api/src/main/java/brooklyn/mementos/Memento.java
+++ b/api/src/main/java/brooklyn/mementos/Memento.java
@@ -42,7 +42,7 @@ public interface Memento extends Serializable {
     
     public String getType();
     
-    public String getContextCatalogItemId();
+    public String getCatalogItemId();
     
     public String getDisplayName();
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/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
index 8ff8776..9d1cd88 100644
--- a/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java
+++ b/core/src/main/java/brooklyn/basic/AbstractBrooklynObject.java
@@ -25,6 +25,7 @@ import java.util.Set;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.basic.internal.ApiObjectsFactory;
 import brooklyn.entity.proxying.InternalFactory;
 import brooklyn.entity.rebind.RebindManagerImpl;
 import brooklyn.management.ManagementContext;
@@ -48,7 +49,7 @@ public abstract class AbstractBrooklynObject implements BrooklynObjectInternal {
     @SetFromFlag(value = "id")
     private String id = Identifiers.makeRandomId(8);
 
-    private String contextCatalogItemId;
+    private String catalogItemId;
 
     /** subclasses should synchronize on this for all access */
     @SetFromFlag(value = "tags")
@@ -74,7 +75,7 @@ public abstract class AbstractBrooklynObject implements BrooklynObjectInternal {
             _legacyConstruction = true;
         }
 
-        contextCatalogItemId = ApiObjectsFactory.get().getContextCatalogItemId();
+        catalogItemId = ApiObjectsFactory.get().getCatalogItemIdFromContext();
 
         // rely on sub-class to call configure(properties), because otherwise its fields will not have been initialised
     }
@@ -171,13 +172,13 @@ public abstract class AbstractBrooklynObject implements BrooklynObjectInternal {
         return id;
     }
 
-    public void setContextCatalogItemId(String id) {
-        this.contextCatalogItemId = id;
+    public void setCatalogItemId(String id) {
+        this.catalogItemId = id;
     }
 
     @Override
-    public String getContextCatalogItemId() {
-        return contextCatalogItemId;
+    public String getCatalogItemId() {
+        return catalogItemId;
     }
 
     protected void onTagsChanged() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/basic/ApiObjectsFactoryImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/basic/ApiObjectsFactoryImpl.java b/core/src/main/java/brooklyn/basic/ApiObjectsFactoryImpl.java
deleted file mode 100644
index 8c95442..0000000
--- a/core/src/main/java/brooklyn/basic/ApiObjectsFactoryImpl.java
+++ /dev/null
@@ -1,41 +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 brooklyn.basic.ApiObjectsFactory.ApiObjectsFactoryInterface;
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.BrooklynTaskTags;
-import brooklyn.management.Task;
-import brooklyn.util.task.Tasks;
-
-public class ApiObjectsFactoryImpl implements ApiObjectsFactoryInterface {
-
-    @Override
-    public String getContextCatalogItemId() {
-        Task<?> currentTask = Tasks.current();
-        if (currentTask != null) {
-            Entity contextEntity = BrooklynTaskTags.getContextEntity(currentTask);
-            if (contextEntity != null) {
-                return contextEntity.getContextCatalogItemId();
-            }
-        }
-        return null;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/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
new file mode 100644
index 0000000..f705494
--- /dev/null
+++ b/core/src/main/java/brooklyn/basic/internal/ApiObjectsFactoryImpl.java
@@ -0,0 +1,41 @@
+/*
+ * 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 brooklyn.basic.internal.ApiObjectsFactoryInterface;
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.BrooklynTaskTags;
+import brooklyn.management.Task;
+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/72ac1296/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
index bdb73d7..53cb2de 100644
--- a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
+++ b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
@@ -256,7 +256,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
                     break;
                 default: throw new RuntimeException("Only entity & policy catalog items are supported. Unsupported catalog item type " + item.getCatalogItemType());
             }
-            ((AbstractBrooklynObjectSpec<?, ?>)spec).contextCatalogItemId(item.getId());
+            ((AbstractBrooklynObjectSpec<?, ?>)spec).catalogItemId(item.getId());
             return spec;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java b/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java
index cb40839..749c275 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogDo.java
@@ -20,6 +20,7 @@ package brooklyn.catalog.internal;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -233,7 +234,7 @@ public class CatalogDo {
             mgmt.getRebindManager().getChangeListener().onManaged(entry);
         }
    }
-
+    
     /**
      * Removes the given entry from the catalog.
      */

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
index cb409fa..7bcf9ec 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
@@ -59,7 +59,7 @@ public class CatalogItemDo<T,SpecT> implements CatalogItem<T,SpecT> {
     }
 
     @Override
-    public String getContextCatalogItemId() {
+    public String getCatalogItemId() {
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java b/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
index c32d913..f5bf6bc 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
@@ -97,9 +97,10 @@ public class CatalogUtils {
         }
     }
 
-    public static String getContextCatalogItemIdFromLoader(BrooklynClassLoadingContext loader) {
+    /** Scans the given {@link BrooklynClassLoadingContext} to detect what catalog item id is in effect. */
+    public static String getCatalogItemIdFromLoader(BrooklynClassLoadingContext loader) {
         if (loader instanceof OsgiBrooklynClassLoadingContext) {
-            return ((OsgiBrooklynClassLoadingContext)loader).getContextCatalogId();
+            return ((OsgiBrooklynClassLoadingContext)loader).getCatalogItemId();
         } else {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/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 1474c1b..d97255b 100644
--- a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
+++ b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
@@ -556,8 +556,8 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
         
         getApplication();
         
-        if (getContextCatalogItemId() == null) {
-            setContextCatalogItemId(entity.getContextCatalogItemId());
+        if (getCatalogItemId() == null) {
+            setCatalogItemId(entity.getCatalogItemId());
         }
         
         return this;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
index b831651..50e15e6 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
@@ -241,8 +241,8 @@ public class InternalEntityFactory extends InternalFactory {
             if (spec.getDisplayName()!=null)
                 ((AbstractEntity)entity).setDisplayName(spec.getDisplayName());
             
-            if (spec.getContextCatalogItemId()!=null) {
-                ((AbstractEntity)entity).setContextCatalogItemId(spec.getContextCatalogItemId());
+            if (spec.getCatalogItemId()!=null) {
+                ((AbstractEntity)entity).setCatalogItemId(spec.getCatalogItemId());
             }
             
             entity.tags().addTags(spec.getTags());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
index 14ea05f..4e6c0d7 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalLocationFactory.java
@@ -105,8 +105,8 @@ public class InternalLocationFactory extends InternalFactory {
             if (spec.getDisplayName()!=null)
                 ((AbstractLocation)loc).setDisplayName(spec.getDisplayName());
             
-            if (spec.getContextCatalogItemId()!=null) {
-                ((AbstractLocation)loc).setContextCatalogItemId(spec.getContextCatalogItemId());
+            if (spec.getCatalogItemId()!=null) {
+                ((AbstractLocation)loc).setCatalogItemId(spec.getCatalogItemId());
             }
             
             loc.tags().addTags(spec.getTags());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
index c5785ca..618a691 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
@@ -107,8 +107,8 @@ public class InternalPolicyFactory extends InternalFactory {
             if (spec.getDisplayName()!=null)
                 ((AbstractPolicy)pol).setDisplayName(spec.getDisplayName());
             
-            if (spec.getContextCatalogItemId()!=null) {
-                ((AbstractPolicy)pol).setContextCatalogItemId(spec.getContextCatalogItemId());
+            if (spec.getCatalogItemId()!=null) {
+                ((AbstractPolicy)pol).setCatalogItemId(spec.getCatalogItemId());
             }
             
             pol.tags().addTags(spec.getTags());
@@ -148,8 +148,8 @@ public class InternalPolicyFactory extends InternalFactory {
             if (spec.getDisplayName()!=null)
                 ((AbstractEnricher)enricher).setDisplayName(spec.getDisplayName());
             
-            if (spec.getContextCatalogItemId()!=null) {
-                ((AbstractEnricher)enricher).setContextCatalogItemId(spec.getContextCatalogItemId());
+            if (spec.getCatalogItemId()!=null) {
+                ((AbstractEnricher)enricher).setCatalogItemId(spec.getCatalogItemId());
             }
             
             enricher.tags().addTags(spec.getTags());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/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 3eb6c96..5d8bcd6 100644
--- a/core/src/main/java/brooklyn/entity/rebind/AbstractBrooklynObjectRebindSupport.java
+++ b/core/src/main/java/brooklyn/entity/rebind/AbstractBrooklynObjectRebindSupport.java
@@ -48,7 +48,7 @@ public abstract class AbstractBrooklynObjectRebindSupport<T extends Memento> imp
         if (LOG.isTraceEnabled()) LOG.trace("Reconstructing: {}", memento.toVerboseString());
 
         instance.setDisplayName(memento.getDisplayName());
-        instance.setContextCatalogItemId(memento.getContextCatalogItemId());
+        instance.setCatalogItemId(memento.getCatalogItemId());
         addConfig(rebindContext, memento);
         addTags(rebindContext, memento);
         addCustoms(rebindContext, memento);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
index 6d6d6a1..9f15404 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -641,11 +641,11 @@ public class RebindManagerImpl implements RebindManager {
             for (Map.Entry<String, EntityMementoManifest> entry : mementoManifest.getEntityIdToManifest().entrySet()) {
                 String entityId = entry.getKey();
                 EntityMementoManifest entityManifest = entry.getValue();
-                String contextCatalogItemId = findContextCatalogItemId(mementoManifest.getEntityIdToManifest(), entityManifest);
+                String catalogItemId = findCatalogItemId(mementoManifest.getEntityIdToManifest(), entityManifest);
                 if (LOG.isTraceEnabled()) LOG.trace("RebindManager instantiating entity {}", entityId);
                 
                 try {
-                    Entity entity = newEntity(entityId, entityManifest.getType(), getLoadingContextFromCatalogItemId(contextCatalogItemId, classLoader, rebindContext));
+                    Entity entity = newEntity(entityId, entityManifest.getType(), getLoadingContextFromCatalogItemId(catalogItemId, classLoader, rebindContext));
                     rebindContext.registerEntity(entityId, entity);
                 } catch (Exception e) {
                     exceptionHandler.onCreateFailed(BrooklynObjectType.ENTITY, entityId, entityManifest.getType(), e);
@@ -671,7 +671,7 @@ public class RebindManagerImpl implements RebindManager {
                     if (LOG.isDebugEnabled()) LOG.debug("RebindManager instantiating policy {}", policyMemento);
                     
                     try {
-                        Policy policy = newPolicy(policyMemento, getLoadingContextFromCatalogItemId(policyMemento.getContextCatalogItemId(), classLoader, rebindContext));
+                        Policy policy = newPolicy(policyMemento, getLoadingContextFromCatalogItemId(policyMemento.getCatalogItemId(), classLoader, rebindContext));
                         rebindContext.registerPolicy(policyMemento.getId(), policy);
                     } catch (Exception e) {
                         exceptionHandler.onCreateFailed(BrooklynObjectType.POLICY, policyMemento.getId(), policyMemento.getType(), e);
@@ -933,11 +933,11 @@ public class RebindManagerImpl implements RebindManager {
         }
     }
     
-    private String findContextCatalogItemId(Map<String, EntityMementoManifest> entityIdToManifest, EntityMementoManifest entityManifest) {
+    private String findCatalogItemId(Map<String, EntityMementoManifest> entityIdToManifest, EntityMementoManifest entityManifest) {
         EntityMementoManifest ptr = entityManifest;
         while (ptr != null) {
-            if (ptr.getContextCatalogItemId() != null) {
-                return ptr.getContextCatalogItemId();
+            if (ptr.getCatalogItemId() != null) {
+                return ptr.getCatalogItemId();
             }
             if (ptr.getParent() != null) {
                 ptr = entityIdToManifest.get(ptr.getParent());
@@ -957,7 +957,7 @@ public class RebindManagerImpl implements RebindManager {
                 throw new IllegalStateException("Failed to load catalog item " + catalogItemId + " required for rebinding.");
             }
         } else {
-            return new JavaBrooklynClassLoadingContext(managementContext, classLoader);
+            return JavaBrooklynClassLoadingContext.create(managementContext, classLoader);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/entity/rebind/dto/AbstractMemento.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/AbstractMemento.java b/core/src/main/java/brooklyn/entity/rebind/dto/AbstractMemento.java
index c07b991..c7ec1d9 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/AbstractMemento.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/AbstractMemento.java
@@ -43,7 +43,7 @@ public abstract class AbstractMemento implements Memento, Serializable {
         protected String type;
         protected Class<?> typeClass;
         protected String displayName;
-        protected String contextCatalogItemId;
+        protected String catalogItemId;
         protected Map<String, Object> fields = Maps.newLinkedHashMap();
         protected List<Object> tags = Lists.newArrayList();
 
@@ -57,7 +57,7 @@ public abstract class AbstractMemento implements Memento, Serializable {
             type = other.getType();
             typeClass = other.getTypeClass();
             displayName = other.getDisplayName();
-            contextCatalogItemId = other.getContextCatalogItemId();
+            catalogItemId = other.getCatalogItemId();
             fields.putAll(other.getCustomFields());
             tags.addAll(other.getTags());
             return self();
@@ -77,8 +77,8 @@ public abstract class AbstractMemento implements Memento, Serializable {
         public B displayName(String val) {
             displayName = val; return self();
         }
-        public B contextCatalogItemId(String val) {
-            contextCatalogItemId = val; return self();
+        public B catalogItemId(String val) {
+            catalogItemId = val; return self();
         }
         /**
          * @deprecated since 0.7.0; use config/attributes so generic persistence will work, rather than requiring "custom fields"
@@ -93,7 +93,7 @@ public abstract class AbstractMemento implements Memento, Serializable {
     private String type;
     private String id;
     private String displayName;
-    private String contextCatalogItemId;
+    private String catalogItemId;
     private List<Object> tags;
 
     private transient Class<?> typeClass;
@@ -109,7 +109,7 @@ public abstract class AbstractMemento implements Memento, Serializable {
         type = builder.type;
         typeClass = builder.typeClass;
         displayName = builder.displayName;
-        contextCatalogItemId = builder.contextCatalogItemId;
+        catalogItemId = builder.catalogItemId;
         setCustomFields(builder.fields);
         tags = toPersistedList(builder.tags);
     }
@@ -149,8 +149,8 @@ public abstract class AbstractMemento implements Memento, Serializable {
     }
 
     @Override
-    public String getContextCatalogItemId() {
-        return contextCatalogItemId;
+    public String getCatalogItemId() {
+        return catalogItemId;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/entity/rebind/dto/EntityMementoManifestImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/EntityMementoManifestImpl.java b/core/src/main/java/brooklyn/entity/rebind/dto/EntityMementoManifestImpl.java
index bfec2ca..05b1dd7 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/EntityMementoManifestImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/EntityMementoManifestImpl.java
@@ -24,13 +24,13 @@ public class EntityMementoManifestImpl implements EntityMementoManifest {
     private String id;
     private String type;
     private String parentId;
-    private String contextCatalogItemId;
+    private String catalogItemId;
 
-    public EntityMementoManifestImpl(String id, String type, String parentId, String contextCatalogItemId) {
+    public EntityMementoManifestImpl(String id, String type, String parentId, String catalogItemId) {
         this.id = id;
         this.type = type;
         this.parentId = parentId;
-        this.contextCatalogItemId = contextCatalogItemId;
+        this.catalogItemId = catalogItemId;
     }
 
     @Override
@@ -49,8 +49,8 @@ public class EntityMementoManifestImpl implements EntityMementoManifest {
     }
 
     @Override
-    public String getContextCatalogItemId() {
-        return contextCatalogItemId;
+    public String getCatalogItemId() {
+        return catalogItemId;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/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 8888f5c..d5a5172 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java
@@ -378,7 +378,7 @@ public class MementosGenerators {
     private static void populateBrooklynObjectMementoBuilder(BrooklynObject instance, AbstractMemento.Builder<?> builder) {
         builder.id = instance.getId();
         builder.displayName = instance.getDisplayName();
-        builder.contextCatalogItemId = instance.getContextCatalogItemId();
+        builder.catalogItemId = instance.getCatalogItemId();
         builder.type = instance.getClass().getName();
         builder.typeClass = instance.getClass();
         

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java b/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
index d185ab5..91baa26 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
@@ -51,7 +51,7 @@ public abstract class AbstractBrooklynMementoPersister implements BrooklynMement
     public BrooklynMementoManifest loadMementoManifest(RebindExceptionHandler exceptionHandler) {
         BrooklynMementoManifestImpl.Builder builder = BrooklynMementoManifestImpl.builder();
         for (EntityMemento entity : memento.getEntityMementos().values()) {
-            builder.entity(entity.getId(), entity.getType(), entity.getParent(), entity.getContextCatalogItemId());
+            builder.entity(entity.getId(), entity.getType(), entity.getParent(), entity.getCatalogItemId());
         }
         for (LocationMemento entity : memento.getLocationMementos().values()) {
             builder.location(entity.getId(), entity.getType());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
index 7e13d62..2d0fe99 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
@@ -194,8 +194,8 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
                     String id = (String) XmlUtil.xpath(contents, "/entity/id");
                     String type = (String) XmlUtil.xpath(contents, "/entity/type");
                     String parentId = (String) XmlUtil.xpath(contents, "/entity/parent");
-                    String contextCatalogItemId = (String) XmlUtil.xpath(contents, "/entity/contextCatalogItemId");
-                    builder.entity(id, type, Strings.emptyToNull(parentId), Strings.emptyToNull(contextCatalogItemId));
+                    String catalogItemId = (String) XmlUtil.xpath(contents, "/entity/catalogItemId");
+                    builder.entity(id, type, Strings.emptyToNull(parentId), Strings.emptyToNull(catalogItemId));
                 } catch (Exception e) {
                     exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENTITY, "File "+file, e);
                 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
index cf03958..6ab8a7c 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
@@ -253,8 +253,8 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
                         String id = (String) XmlUtil.xpath(contents, "/entity/id");
                         String objType = (String) XmlUtil.xpath(contents, "/entity/type");
                         String parentId = (String) XmlUtil.xpath(contents, "/entity/parent");
-                        String contextCatalogItemId = (String) XmlUtil.xpath(contents, "/entity/contextCatalogItemId");
-                        builder.entity(id, objType, Strings.emptyToNull(parentId), Strings.emptyToNull(contextCatalogItemId));
+                        String catalogItemId = (String) XmlUtil.xpath(contents, "/entity/catalogItemId");
+                        builder.entity(id, objType, Strings.emptyToNull(parentId), Strings.emptyToNull(catalogItemId));
                         break;
                     case LOCATION:
                         id = (String) XmlUtil.xpath(contents, "/location/id");

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java b/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java
index 498d440..7dbc037 100644
--- a/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java
+++ b/core/src/main/java/brooklyn/management/classloading/OsgiBrooklynClassLoadingContext.java
@@ -31,12 +31,12 @@ import com.google.common.base.Objects;
 public class OsgiBrooklynClassLoadingContext extends AbstractBrooklynClassLoadingContext {
 
     private final List<String> bundles;
-    private final String contextCatalogId;
+    private final String catalogItemId;
 
     public OsgiBrooklynClassLoadingContext(ManagementContext mgmt, String catalogItemId, List<String> bundles) {
         super(mgmt);
         this.bundles = bundles;
-        this.contextCatalogId = catalogItemId;
+        this.catalogItemId = catalogItemId;
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
@@ -71,7 +71,7 @@ public class OsgiBrooklynClassLoadingContext extends AbstractBrooklynClassLoadin
     
     @Override
     public int hashCode() {
-        return Objects.hashCode(super.hashCode(), bundles, contextCatalogId);
+        return Objects.hashCode(super.hashCode(), bundles, catalogItemId);
     }
     
     @Override
@@ -80,7 +80,7 @@ public class OsgiBrooklynClassLoadingContext extends AbstractBrooklynClassLoadin
         if (!(obj instanceof OsgiBrooklynClassLoadingContext)) return false;
 
         OsgiBrooklynClassLoadingContext other = (OsgiBrooklynClassLoadingContext)obj;
-        if (!contextCatalogId.equals(other.contextCatalogId)) return false;
+        if (!catalogItemId.equals(other.catalogItemId)) return false;
         if (!Objects.equal(bundles, other.bundles)) return false;
         return true;
     }
@@ -96,8 +96,8 @@ public class OsgiBrooklynClassLoadingContext extends AbstractBrooklynClassLoadin
         return null;
     }
     
-    public String getContextCatalogId() {
-        return contextCatalogId;
+    public String getCatalogItemId() {
+        return catalogItemId;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/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 a7d8892..60597b5 100644
--- a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
+++ b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
@@ -238,8 +238,8 @@ public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject imple
     public void setEntity(EntityLocal entity) {
         if (destroyed.get()) throw new IllegalStateException("Cannot set entity on a destroyed entity adjunct");
         this.entity = entity;
-        if (getContextCatalogItemId() == null) {
-            setContextCatalogItemId(entity.getContextCatalogItemId());
+        if (entity!=null && getCatalogItemId() == null) {
+            setCatalogItemId(entity.getCatalogItemId());
         }
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/resources/META-INF/services/brooklyn.basic.ApiObjectsFactory$ApiObjectsFactoryInterface
----------------------------------------------------------------------
diff --git a/core/src/main/resources/META-INF/services/brooklyn.basic.ApiObjectsFactory$ApiObjectsFactoryInterface b/core/src/main/resources/META-INF/services/brooklyn.basic.ApiObjectsFactory$ApiObjectsFactoryInterface
deleted file mode 100644
index 007e088..0000000
--- a/core/src/main/resources/META-INF/services/brooklyn.basic.ApiObjectsFactory$ApiObjectsFactoryInterface
+++ /dev/null
@@ -1,19 +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.
-#
-brooklyn.basic.ApiObjectsFactoryImpl

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/core/src/main/resources/META-INF/services/brooklyn.basic.internal.ApiObjectsFactoryInterface
----------------------------------------------------------------------
diff --git a/core/src/main/resources/META-INF/services/brooklyn.basic.internal.ApiObjectsFactoryInterface b/core/src/main/resources/META-INF/services/brooklyn.basic.internal.ApiObjectsFactoryInterface
new file mode 100644
index 0000000..4af251f
--- /dev/null
+++ b/core/src/main/resources/META-INF/services/brooklyn.basic.internal.ApiObjectsFactoryInterface
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+brooklyn.basic.internal.ApiObjectsFactoryImpl

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
index 8bd1073..d03502e 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
@@ -202,7 +202,7 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateSpe
             } else {
                 //TODO migrate to catalog.createSpec
                 spec = resolveCatalogYamlReferenceSpec(mgmt, item, encounteredCatalogTypes);
-                spec.contextCatalogItemId(item.getId());
+                spec.catalogItemId(item.getId());
                 entityResolver.populateSpec(spec);
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/72ac1296/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index 2dfb581..2adad06 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -257,7 +257,7 @@ public class BrooklynComponentTemplateResolver {
             List<Class<?>> additionalInterfaceClazzes = Reflections.getAllInterfaces(type);
             spec = EntitySpec.create(interfaceclazz).impl(type).additionalInterfaces(additionalInterfaceClazzes);
         }
-        spec.contextCatalogItemId(CatalogUtils.getContextCatalogItemIdFromLoader(loader));
+        spec.catalogItemId(CatalogUtils.getCatalogItemIdFromLoader(loader));
         if (template.isPresent() && template.get().getSourceCode()!=null)
             spec.tag(BrooklynTags.newYamlSpecTag(template.get().getSourceCode()));
 
@@ -282,9 +282,7 @@ public class BrooklynComponentTemplateResolver {
         if (childrenObj != null) {
             Set<String> encounteredCatalogTypes = MutableSet.of();
 
-            @SuppressWarnings("unchecked")
             Iterable<Map<String,?>> children = (Iterable<Map<String,?>>)childrenObj;
-
             for (Map<String,?> childAttrs : children) {
                 BrooklynComponentTemplateResolver entityResolver = BrooklynComponentTemplateResolver.Factory.newInstance(loader, childAttrs);
                 BrooklynAssemblyTemplateInstantiator instantiator = new BrooklynAssemblyTemplateInstantiator();