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 2015/11/02 17:42:58 UTC

[1/9] incubator-brooklyn git commit: introduce BrooklynTypeRegistry and start migrating Catalog to it

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master c0021ca1b -> 48e4fe3ca


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index e9d22f1..b1044ee 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -29,11 +29,11 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.annotation.Nullable;
 
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.BrooklynCampConstants;
 import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import org.apache.brooklyn.camp.brooklyn.spi.creation.service.CampServiceSpecResolver;
@@ -145,20 +145,20 @@ public class BrooklynComponentTemplateResolver {
         return serviceSpecResolver.accepts(type, loader);
     }
 
-    public <T extends Entity> EntitySpec<T> resolveSpec(Set<String> encounteredCatalogTypes) {
+    public <T extends Entity> EntitySpec<T> resolveSpec(Set<String> encounteredRegisteredTypeIds) {
         if (alreadyBuilt.getAndSet(true))
             throw new IllegalStateException("Spec can only be used once: "+this);
 
-        EntitySpec<?> spec = serviceSpecResolver.resolve(type, loader, encounteredCatalogTypes);
+        EntitySpec<?> spec = serviceSpecResolver.resolve(type, loader, encounteredRegisteredTypeIds);
 
         if (spec == null) {
             // Try to provide some troubleshooting details
             final String msgDetails;
-            CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt, Strings.removeFromStart(type, "catalog:"));
+            RegisteredType item = mgmt.getTypeRegistry().get(Strings.removeFromStart(type, "catalog:"), null, null);
             String proto = Urls.getProtocol(type);
-            if (item != null && encounteredCatalogTypes.contains(item.getSymbolicName())) {
+            if (item != null && encounteredRegisteredTypeIds.contains(item.getSymbolicName())) {
                 msgDetails = "Cycle between catalog items detected, starting from " + type +
-                        ". Other catalog items being resolved up the stack are " + encounteredCatalogTypes +
+                        ". Other catalog items being resolved up the stack are " + encounteredRegisteredTypeIds +
                         ". Tried loading it as a Java class instead but failed.";
             } else if (proto != null) {
                 msgDetails = "The reference " + type + " looks like a URL (running the CAMP Brooklyn assembly-template instantiator) but the protocol " +
@@ -170,7 +170,7 @@ public class BrooklynComponentTemplateResolver {
             throw new IllegalStateException("Unable to create spec for type " + type + ". " + msgDetails);
         }
 
-        populateSpec(spec, encounteredCatalogTypes);
+        populateSpec(spec, encounteredRegisteredTypeIds);
 
         @SuppressWarnings("unchecked")
         EntitySpec<T> typedSpec = (EntitySpec<T>) spec;
@@ -187,7 +187,7 @@ public class BrooklynComponentTemplateResolver {
     }
 
     @SuppressWarnings("unchecked")
-    private <T extends Entity> void populateSpec(EntitySpec<T> spec, Set<String> encounteredCatalogTypes) {
+    private <T extends Entity> void populateSpec(EntitySpec<T> spec, Set<String> encounteredRegisteredTypeIds) {
         String name, source=null, templateId=null, planId=null;
         if (template.isPresent()) {
             name = template.get().getName();
@@ -205,9 +205,9 @@ public class BrooklynComponentTemplateResolver {
             Iterable<Map<String,?>> children = (Iterable<Map<String,?>>)childrenObj;
             for (Map<String,?> childAttrs : children) {
                 BrooklynComponentTemplateResolver entityResolver = BrooklynComponentTemplateResolver.Factory.newInstance(loader, childAttrs);
-                // encounteredCatalogTypes must contain the items currently being loaded (the dependency chain),
-                // but not parent items in this catalog item already resolved.
-                EntitySpec<? extends Entity> childSpec = entityResolver.resolveSpec(encounteredCatalogTypes);
+                // encounteredRegisteredTypeIds must contain the items currently being loaded (the dependency chain),
+                // but not parent items in this type already resolved.
+                EntitySpec<? extends Entity> childSpec = entityResolver.resolveSpec(encounteredRegisteredTypeIds);
                 spec.child(childSpec);
             }
         }
@@ -307,7 +307,7 @@ public class BrooklynComponentTemplateResolver {
         /* TODO find a way to make do without loader here?
          * it is not very nice having to serialize it; but serialization of BLCL is now relatively clean.
          *
-         * it is only used to instantiate classes, and now most things should be registered with catalog;
+         * it is only used to instantiate classes, and now most types should be registered;
          * the notable exception is when one entity in a bundle is creating another in the same bundle,
          * it wants to use his bundle CLC to do that.  but we can set up some unique reference to the entity
          * which can be used to find it from mgmt, rather than pass the loader.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
index a7a7530..181265d 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
@@ -21,8 +21,6 @@ package org.apache.brooklyn.camp.brooklyn.spi.creation;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.brooklyn.api.catalog.BrooklynCatalog;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.EntityInitializer;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
@@ -30,9 +28,10 @@ import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.policy.PolicySpec;
 import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.EnricherSpec;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynYamlTypeInstantiator.InstantiatorFromKey;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 
@@ -108,29 +107,14 @@ public abstract class BrooklynEntityDecorationResolver<DT> {
 
             String policyType = decoLoader.getTypeName().get();
             ManagementContext mgmt = instantiator.loader.getManagementContext();
-            BrooklynCatalog catalog = mgmt.getCatalog();
-            CatalogItem<Policy, PolicySpec<?>> item = getPolicyCatalogItem(catalog, policyType);
+            
+            RegisteredType item = mgmt.getTypeRegistry().get(policyType, BrooklynTypeRegistry.RegisteredTypeKind.SPEC, Policy.class);
             PolicySpec<? extends Policy> spec;
-            if (item != null) {
-                spec = (PolicySpec) catalog.createSpec((CatalogItem) item);
-                spec.configure(decoLoader.getConfigMap());
-            } else {
-                // this pattern of creating a spec could be simplified with a "Configurable" superinterface on *Spec  
-                spec = PolicySpec.create(decoLoader.getType(Policy.class))
-                    .configure( decoLoader.getConfigMap() );
-            }
+            if (item!=null) spec = mgmt.getTypeRegistry().createSpec(item, PolicySpec.class);
+            else spec = PolicySpec.create(decoLoader.getType(Policy.class));
+            spec.configure( decoLoader.getConfigMap() );
             decorations.add(spec);
         }
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        private CatalogItem<Policy, PolicySpec<?>> getPolicyCatalogItem(BrooklynCatalog catalog, String policyType) {
-            if (CatalogUtils.looksLikeVersionedId(policyType)) {
-                String id = CatalogUtils.getIdFromVersionedId(policyType);
-                String version = CatalogUtils.getVersionFromVersionedId(policyType);
-                return (CatalogItem) catalog.getCatalogItem(id, version);
-            } else {
-                return (CatalogItem) catalog.getCatalogItem(policyType, BrooklynCatalog.DEFAULT_VERSION);
-            }
-        }
     }
 
     public static class EnricherSpecResolver extends BrooklynEntityDecorationResolver<EnricherSpec<?>> {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
index ae995e4..cacd201 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
@@ -18,7 +18,6 @@
  */
 package org.apache.brooklyn.camp.brooklyn.spi.creation;
 
-import java.io.StringReader;
 import java.util.Set;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
@@ -27,6 +26,7 @@ import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.camp.CampPlatform;
+import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import org.apache.brooklyn.camp.brooklyn.api.AssemblyTemplateSpecInstantiator;
 import org.apache.brooklyn.camp.spi.AssemblyTemplate;
 import org.apache.brooklyn.camp.spi.instantiate.AssemblyTemplateInstantiator;
@@ -59,7 +59,7 @@ public class CampToSpecTransformer implements PlanToSpecTransformer {
     @Override
     public EntitySpec<? extends Application> createApplicationSpec(String plan) {
         try {
-            CampPlatform camp = CampCatalogUtils.getCampPlatform(mgmt);
+            CampPlatform camp = CampUtils.getCampPlatform(mgmt);
             BrooklynClassLoadingContext loader = JavaBrooklynClassLoadingContext.create(mgmt);
             AssemblyTemplate at = CampUtils.registerDeploymentPlan(plan, loader, camp);
             AssemblyTemplateInstantiator instantiator = CampUtils.getInstantiator(at);
@@ -69,7 +69,7 @@ public class CampToSpecTransformer implements PlanToSpecTransformer {
                 // The unknown instantiator can create the app (Assembly), but not a spec.
                 // Currently, all brooklyn plans should produce the above.
                 if (at.getPlatformComponentTemplates()==null || at.getPlatformComponentTemplates().isEmpty()) {
-                    if (at.getCustomAttributes().containsKey("brooklyn.catalog"))
+                    if (at.getCustomAttributes().containsKey(BrooklynCampReservedKeys.BROOKLYN_CATALOG))
                         throw new IllegalArgumentException("Unrecognized application blueprint format: expected an application, not a brooklyn.catalog");
                     throw new PlanNotRecognizedException("Unrecognized application blueprint format: no services defined");
                 }
@@ -99,6 +99,17 @@ public class CampToSpecTransformer implements PlanToSpecTransformer {
         return (SpecT) CampCatalogUtils.createSpec(mgmt, (CatalogItem)item, encounteredTypes);
     }
 
+    // TODO
+//    @SuppressWarnings({ "unchecked", "rawtypes" })
+//    public <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createCatalogSpec(RegisteredType type, Set<String> encounteredTypes) {
+//        if (encounteredTypes.contains(type.getSymbolicName())) {
+//            throw new IllegalStateException("Already encountered types " + encounteredTypes + " must not contain catalog item being resolver " + type.getSymbolicName());
+//        }
+//
+//        // Not really clear what should happen to the top-level attributes, ignored until a good use case appears.
+//        return (SpecT) CampCatalogUtils.createSpec(mgmt, type, encounteredTypes);
+//    }
+
     @Override
     public void injectManagementContext(ManagementContext mgmt) {
         this.mgmt = mgmt;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java
index 29c015a..8e10c20 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java
@@ -18,13 +18,9 @@
  */
 package org.apache.brooklyn.camp.brooklyn.catalog;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.policy.Policy;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.Entities;
@@ -32,6 +28,10 @@ import org.apache.brooklyn.entity.stock.BasicEntity;
 import org.apache.brooklyn.entity.stock.BasicStartable;
 import org.apache.brooklyn.policy.ha.ServiceRestarter;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
 
 import com.google.common.collect.Iterables;
 
@@ -60,7 +60,7 @@ public class CatalogYamlCombiTest extends AbstractYamlTest {
             "      type: A",
             "      brooklyn.config: { b: 1 }");
 
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem("B", TEST_VERSION);
+        RegisteredType item = mgmt().getTypeRegistry().get("B", TEST_VERSION, null, null);
         Assert.assertNotNull(item);
 
         Entity a = launchEntity("A");
@@ -113,7 +113,7 @@ public class CatalogYamlCombiTest extends AbstractYamlTest {
             "      brooklyn.policies:",
             "      - type: A");
 
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem("A", TEST_VERSION);
+        RegisteredType item = mgmt().getTypeRegistry().get("A", TEST_VERSION, null, null);
         Assert.assertNotNull(item);
 
         Entity b = launchEntity("B", false);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
index 20d0a1d..882332b 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
@@ -27,19 +27,23 @@ import java.util.Collection;
 import java.util.List;
 
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest;
-import org.apache.brooklyn.util.osgi.OsgiTestResources;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.core.test.entity.TestEntityImpl;
+import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.entity.stock.BasicEntity;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.osgi.OsgiTestResources;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -60,8 +64,9 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
             "  item:",
             "    type: "+ BasicEntity.class.getName());
 
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
-        assertTrue(item.getPlanYaml().indexOf("services:")>=0, "expected 'services:' block: "+item+"\n"+item.getPlanYaml());
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
+        String planYaml = RegisteredTypes.getImplementationDataStringForSpec(item);
+        assertTrue(planYaml.indexOf("services:")>=0, "expected 'services:' block: "+item+"\n"+planYaml);
 
         deleteCatalogEntity(symbolicName);
     }
@@ -71,7 +76,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
 
         String symbolicName = "my.catalog.app.id.load";
         addCatalogOSGiEntity(symbolicName);
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
         assertEquals(item.getSymbolicName(), symbolicName);
 
         deleteCatalogEntity(symbolicName);
@@ -93,7 +98,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
             "  - url: " + OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL,
             "  item: " + SIMPLE_ENTITY_TYPE);
 
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
         assertEquals(item.getSymbolicName(), symbolicName);
 
         deleteCatalogEntity(symbolicName);
@@ -116,7 +121,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
             "  - url: " + OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL,
             "  item: " + SIMPLE_ENTITY_TYPE);
 
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
         assertEquals(item.getSymbolicName(), symbolicName);
 
         deleteCatalogEntity(symbolicName);
@@ -140,7 +145,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
             "services:",
             "- type: " + SIMPLE_ENTITY_TYPE);
 
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
         assertEquals(item.getSymbolicName(), symbolicName);
 
         deleteCatalogEntity(symbolicName);
@@ -158,7 +163,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
             "  - " + OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL,
             "  item:",
             "    type: "+ SIMPLE_ENTITY_TYPE);
-        CatalogItem<?, ?> catalogItem = mgmt().getCatalog().getCatalogItem(id, BrooklynCatalog.DEFAULT_VERSION);
+        RegisteredType catalogItem = mgmt().getTypeRegistry().get(id, BrooklynCatalog.DEFAULT_VERSION);
         assertEquals(catalogItem.getVersion(), "0.0.0.SNAPSHOT");
         mgmt().getCatalog().deleteCatalogItem(id, "0.0.0.SNAPSHOT");
     }
@@ -175,7 +180,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
             "  - " + OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL,
             "services:",
             "- type: " + SIMPLE_ENTITY_TYPE);
-        CatalogItem<?, ?> catalogItem = mgmt().getCatalog().getCatalogItem(id, TEST_VERSION);
+        RegisteredType catalogItem = mgmt().getTypeRegistry().get(id, TEST_VERSION);
         assertEquals(catalogItem.getVersion(), TEST_VERSION);
         mgmt().getCatalog().deleteCatalogItem(id, TEST_VERSION);
     }
@@ -213,8 +218,9 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
         String referrerSymbolicName = "my.catalog.app.id.referring";
         addCatalogOSGiEntities(referencedSymbolicName, SIMPLE_ENTITY_TYPE, referrerSymbolicName, ver(referencedSymbolicName));
 
-        CatalogItem<?, ?> referrer = mgmt().getCatalog().getCatalogItem(referrerSymbolicName, TEST_VERSION);
-        Assert.assertTrue(referrer.getPlanYaml().indexOf("services")>=0, "expected services in: "+referrer.getPlanYaml());
+        RegisteredType referrer = mgmt().getTypeRegistry().get(referrerSymbolicName, TEST_VERSION);
+        String planYaml = RegisteredTypes.getImplementationDataStringForSpec(referrer);
+        Assert.assertTrue(planYaml.indexOf("services")>=0, "expected services in: "+planYaml);
         
         String yaml = "name: simple-app-yaml\n" +
                       "location: localhost\n" +
@@ -523,11 +529,12 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
 
         String id = "my.catalog.app.id.create_spec";
         addCatalogOSGiEntity(id);
-        BrooklynCatalog catalog = mgmt().getCatalog();
-        CatalogItem<?, ?> item = catalog.getCatalogItem(id, TEST_VERSION);
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        Object spec = catalog.createSpec((CatalogItem) item);
+        BrooklynTypeRegistry catalog = mgmt().getTypeRegistry();
+        RegisteredType item = catalog.get(id, TEST_VERSION);
+        EntitySpec<?> spec = catalog.createSpec(item, EntitySpec.class);
         Assert.assertNotNull(spec);
+        AbstractBrooklynObjectSpec<?,?> spec2 = catalog.createSpec(item, AbstractBrooklynObjectSpec.class);
+        Assert.assertNotNull(spec2);
     }
     
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
index e5a8457..eebaea5 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
@@ -24,21 +24,22 @@ import static org.testng.Assert.assertNull;
 import java.util.Collection;
 import java.util.List;
 
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationDefinition;
 import org.apache.brooklyn.api.location.LocationSpec;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
-import org.apache.brooklyn.core.catalog.CatalogPredicates;
 import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest;
+import org.apache.brooklyn.core.typereg.RegisteredTypePredicates;
 import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
 import org.apache.brooklyn.util.text.StringFunctions;
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
@@ -51,7 +52,7 @@ public class CatalogYamlLocationTest extends AbstractYamlTest {
 
     @AfterMethod
     public void tearDown() {
-        for (CatalogItem<Location, LocationSpec<?>> ci : mgmt().getCatalog().getCatalogItems(CatalogPredicates.IS_LOCATION)) {
+        for (RegisteredType ci : mgmt().getTypeRegistry().getAll(RegisteredTypePredicates.IS_LOCATION)) {
             mgmt().getCatalog().deleteCatalogItem(ci.getSymbolicName(), ci.getVersion());
         }
     }
@@ -99,16 +100,17 @@ public class CatalogYamlLocationTest extends AbstractYamlTest {
     }
 
     private void assertOsgi(String symbolicName) {
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
-        Collection<CatalogBundle> libs = item.getLibraries();
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
+        Collection<OsgiBundleWithUrl> libs = item.getLibraries();
         assertEquals(libs.size(), 1);
         assertEquals(Iterables.getOnlyElement(libs).getUrl(), Iterables.getOnlyElement(getOsgiLibraries()));
     }
 
-    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @SuppressWarnings({ "rawtypes" })
     private void assertAdded(String symbolicName, String expectedJavaType) {
-        CatalogItem item = mgmt().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
         assertEquals(item.getSymbolicName(), symbolicName);
+        Assert.assertTrue(Location.class.isAssignableFrom(item.getJavaType()), "Expected Location, not "+item.getJavaType());
         assertEquals(countCatalogLocations(), 1);
 
         // Item added to catalog should automatically be available in location registry
@@ -116,7 +118,7 @@ public class CatalogYamlLocationTest extends AbstractYamlTest {
         assertEquals(def.getId(), symbolicName);
         assertEquals(def.getName(), symbolicName);
         
-        LocationSpec spec = (LocationSpec) mgmt().getCatalog().createSpec(item);
+        LocationSpec spec = (LocationSpec) mgmt().getTypeRegistry().createSpec(item, LocationSpec.class);
         assertEquals(spec.getType().getName(), expectedJavaType);
     }
     
@@ -243,6 +245,7 @@ public class CatalogYamlLocationTest extends AbstractYamlTest {
     }
 
     private int countCatalogLocations() {
-        return Iterables.size(mgmt().getCatalog().getCatalogItems(CatalogPredicates.IS_LOCATION));
+        return Iterables.size(mgmt().getTypeRegistry().getAll(RegisteredTypePredicates.IS_LOCATION));
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
index b325c62..9f2a377 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
@@ -33,6 +33,9 @@ import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.spi.Assembly;
 import org.apache.brooklyn.camp.spi.AssemblyTemplate;
 import org.apache.brooklyn.camp.spi.pdp.PdpYamlTest;
@@ -45,12 +48,12 @@ import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.effector.AddChildrenEffector;
 import org.apache.brooklyn.core.effector.Effectors;
 import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;
@@ -127,7 +130,7 @@ public class CampYamlLiteTest {
             .configure(AddChildrenEffector.BLUEPRINT_YAML, childYaml)
             .configure(AddChildrenEffector.EFFECTOR_PARAMETER_DEFS, MutableMap.of("war", (Object)MutableMap.of(
                 "defaultValue", "foo.war"))) ) ;
-        TestApplication app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).addInitializer(newEff), mgmt);
+        TestApplication app = mgmt.getEntityManager().createEntity(EntitySpec.create(TestApplication.class).addInitializer(newEff));
 
         // test adding, with a parameter
         Task<List> task = app.invoke(Effectors.effector(List.class, "add_tomcat").buildAbstract(), MutableMap.of("war", "foo.bar"));
@@ -227,19 +230,20 @@ public class CampYamlLiteTest {
     }
 
     private void assertMgmtHasSampleMyCatalogApp(String symbolicName, String bundleUrl) {
-        CatalogItem<?, ?> item = mgmt.getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
+        RegisteredType item = mgmt.getTypeRegistry().get(symbolicName, BrooklynTypeRegistry.RegisteredTypeKind.SPEC, null);
         assertNotNull(item, "failed to load item with id=" + symbolicName + " from catalog. Entries were: " +
-                Joiner.on(",").join(mgmt.getCatalog().getCatalogItems()));
+                Joiner.on(",").join(mgmt.getTypeRegistry().getAll()));
         assertEquals(item.getSymbolicName(), symbolicName);
 
         // stored as yaml, not java
-        assertNotNull(item.getPlanYaml());
-        Assert.assertTrue(item.getPlanYaml().contains("io.camp.mock:AppServer"));
+        String planYaml = RegisteredTypes.getImplementationDataStringForSpec(item);
+        assertNotNull(planYaml);
+        Assert.assertTrue(planYaml.contains("io.camp.mock:AppServer"));
 
         // and let's check we have libraries
-        Collection<CatalogBundle> libs = item.getLibraries();
+        Collection<OsgiBundleWithUrl> libs = item.getLibraries();
         assertEquals(libs.size(), 1);
-        CatalogBundle bundle = Iterables.getOnlyElement(libs);
+        OsgiBundleWithUrl bundle = Iterables.getOnlyElement(libs);
         assertEquals(bundle.getUrl(), bundleUrl);
 
         // now let's check other things on the item

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/TestAppAssemblyInstantiator.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/TestAppAssemblyInstantiator.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/TestAppAssemblyInstantiator.java
index 422998b..6c0a09a 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/TestAppAssemblyInstantiator.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/TestAppAssemblyInstantiator.java
@@ -56,7 +56,6 @@ public class TestAppAssemblyInstantiator extends BasicAssemblyTemplateInstantiat
         ManagementContext mgmt = ((HasBrooklynManagementContext)platform).getBrooklynManagementContext();
         
         TestApplication app = (TestApplication) mgmt.getEntityManager().createEntity( createApplicationSpec(template, platform, null) );
-        mgmt.getEntityManager().manage(app);
 
         return new TestAppAssembly(app);
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/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 157ba67..f30c7ec 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
@@ -18,13 +18,10 @@
  */
 package org.apache.brooklyn.rest.util;
 
-import static org.apache.brooklyn.rest.util.WebResourceUtils.notFound;
 import static com.google.common.collect.Iterables.transform;
-import groovy.lang.GroovyClassLoader;
+import static org.apache.brooklyn.rest.util.WebResourceUtils.notFound;
 
-import java.io.Serializable;
 import java.lang.reflect.Constructor;
-import java.net.URI;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -34,12 +31,7 @@ import java.util.Set;
 import java.util.concurrent.Future;
 
 import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
 
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.util.collections.MutableSet;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Application;
@@ -55,26 +47,28 @@ import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent;
 import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent.Scope;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.entity.trait.Startable;
+import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument;
 import org.apache.brooklyn.core.objs.BrooklynTypes;
-import org.apache.brooklyn.core.policy.AbstractPolicy;
 import org.apache.brooklyn.enricher.stock.Enrichers;
 import org.apache.brooklyn.entity.stock.BasicApplication;
 import org.apache.brooklyn.rest.domain.ApplicationSpec;
 import org.apache.brooklyn.rest.domain.EntitySpec;
 import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.javalang.Reflections;
 import org.apache.brooklyn.util.net.Urls;
 import org.apache.brooklyn.util.text.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
@@ -210,7 +204,52 @@ public class BrooklynRestResourceUtils {
         return null;
     }
 
-    @SuppressWarnings({ "unchecked", "deprecation" })
+    private class FindItemAndClass {
+        String catalogItemId;
+        Class<? extends Entity> clazz;
+        
+        @SuppressWarnings("unchecked")
+        private FindItemAndClass inferFrom(String type) {
+            BrooklynCatalog catalog = getCatalog();
+            CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt, type);
+            if (item==null) {
+                // although the method was deprecated in 0.7.0, its use here was not warned until 0.9.0;
+                // therefore this behaviour should not be changed until after 0.9.0
+                item = catalog.getCatalogItemForType(type);
+                if (item!=null) {
+                    log.warn("Creating application for requested type `"+type+" using item "+item+"; "
+                        + "the registered type name ("+item.getSymbolicName()+") should be used from the spec instead, "
+                        + "or the type registered under its own name. "
+                        + "Future versions will likely change semantics to attempt a POJO load of the type instead.");
+                }
+            }
+            
+            if (item != null) {
+                return setAs(
+                    catalog.createSpec((CatalogItem<Entity,org.apache.brooklyn.api.entity.EntitySpec<Entity>>)item).getType(),
+                    item.getId());
+            } else {
+                try {
+                    setAs(
+                        (Class<? extends Entity>) catalog.getRootClassLoader().loadClass(type),
+                        null);
+                    log.info("Catalog does not contain item for type {}; loaded class directly instead", type);
+                    return this;
+                } catch (ClassNotFoundException e2) {
+                    log.warn("No catalog item for type {}, and could not load class directly; rethrowing", type);
+                    throw new NoSuchElementException("Unable to find catalog item for type "+type);
+                }
+            }
+        }
+
+        private FindItemAndClass setAs(Class<? extends Entity> clazz, String catalogItemId) {
+            this.clazz = clazz;
+            this.catalogItemId = catalogItemId;
+            return this;
+        }
+    }
+    
+    @SuppressWarnings({ "deprecation" })
     public Application create(ApplicationSpec spec) {
         log.warn("Using deprecated functionality (as of 0.9.0), ApplicationSpec style (pre CAMP plans). " +
                     "Transition to actively supported spec plans.");
@@ -229,88 +268,73 @@ public class BrooklynRestResourceUtils {
         final Application instance;
 
         // Load the class; first try to use the appropriate catalog item; but then allow anything that is on the classpath
-        final Class<? extends Entity> clazz;
-        final String catalogItemId;
+        FindItemAndClass itemAndClass;
         if (Strings.isEmpty(type)) {
-            clazz = BasicApplication.class;
-            catalogItemId = null;
+            itemAndClass = new FindItemAndClass().setAs(BasicApplication.class, null);
         } else {
-            Class<? extends Entity> tempclazz;
-            BrooklynCatalog catalog = getCatalog();
-            CatalogItem<?, ?> item = catalog.getCatalogItemForType(type);
-            if (item != null) {
-                catalogItemId = item.getId();
-                tempclazz = (Class<? extends Entity>) catalog.loadClass(item);
-            } else {
-                catalogItemId = null;
-                try {
-                    tempclazz = (Class<? extends Entity>) catalog.getRootClassLoader().loadClass(type);
-                    log.info("Catalog does not contain item for type {}; loaded class directly instead", type);
-                } catch (ClassNotFoundException e2) {
-                    log.warn("No catalog item for type {}, and could not load class directly; rethrowing", type);
-                    throw new NoSuchElementException("Unable to find catalog item for type "+type);
-                }
-            }
-            clazz = tempclazz;
+            itemAndClass = new FindItemAndClass().inferFrom(type);
         }
-        if (Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.INVOKE_EFFECTOR, null)) {
-
-            try {
-                if (ApplicationBuilder.class.isAssignableFrom(clazz)) {
-                    Constructor<?> constructor = clazz.getConstructor();
-                    ApplicationBuilder appBuilder = (ApplicationBuilder) constructor.newInstance();
-                    if (!Strings.isEmpty(name)) appBuilder.appDisplayName(name);
-                    if (entities.size() > 0)
-                        log.warn("Cannot supply additional entities when using an ApplicationBuilder; ignoring in spec {}", spec);
-
-                    log.info("REST placing '{}' under management", spec.getName());
-                    appBuilder.configure(convertFlagsToKeys(appBuilder.getType(), configO));
-                    configureRenderingMetadata(spec, appBuilder);
-                    instance = appBuilder.manage(mgmt);
-
-                } else if (Application.class.isAssignableFrom(clazz)) {
-                    org.apache.brooklyn.api.entity.EntitySpec<?> coreSpec = toCoreEntitySpec(clazz, name, configO, catalogItemId);
-                    configureRenderingMetadata(spec, coreSpec);
-                    for (EntitySpec entitySpec : entities) {
-                        log.info("REST creating instance for entity {}", entitySpec.getType());
-                        coreSpec.child(toCoreEntitySpec(entitySpec));
-                    }
-
-                    log.info("REST placing '{}' under management", spec.getName() != null ? spec.getName() : spec);
-                    instance = (Application) mgmt.getEntityManager().createEntity(coreSpec);
-
-                } else if (Entity.class.isAssignableFrom(clazz)) {
-                    if (entities.size() > 0)
-                        log.warn("Cannot supply additional entities when using a non-application entity; ignoring in spec {}", spec);
-
-                    org.apache.brooklyn.api.entity.EntitySpec<?> coreSpec = toCoreEntitySpec(BasicApplication.class, name, configO, catalogItemId);
-                    configureRenderingMetadata(spec, coreSpec);
-
-                    coreSpec.child(toCoreEntitySpec(clazz, name, configO, catalogItemId)
-                            .configure(BrooklynCampConstants.PLAN_ID, "soleChildId"));
-                    coreSpec.enricher(Enrichers.builder()
-                            .propagatingAllBut(Attributes.SERVICE_UP, Attributes.SERVICE_NOT_UP_INDICATORS, 
-                                    Attributes.SERVICE_STATE_ACTUAL, Attributes.SERVICE_STATE_EXPECTED, 
-                                    Attributes.SERVICE_PROBLEMS)
-                            .from(new DslComponent(Scope.CHILD, "soleChildId").newTask())
-                            .build());
-
-                    log.info("REST placing '{}' under management", spec.getName());
-                    instance = (Application) mgmt.getEntityManager().createEntity(coreSpec);
-
-                } else {
-                    throw new IllegalArgumentException("Class " + clazz + " must extend one of ApplicationBuilder, Application or Entity");
+        
+        if (!Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.INVOKE_EFFECTOR, null)) {
+            throw WebResourceUtils.unauthorized("User '%s' is not authorized to create application from applicationSpec %s",
+                Entitlements.getEntitlementContext().user(), spec);
+        }
+
+        try {
+            if (ApplicationBuilder.class.isAssignableFrom(itemAndClass.clazz)) {
+                // warning only added in 0.9.0
+                log.warn("Using deprecated ApplicationBuilder "+itemAndClass.clazz+"; callers must migrate to use of Application");
+                Constructor<?> constructor = itemAndClass.clazz.getConstructor();
+                ApplicationBuilder appBuilder = (ApplicationBuilder) constructor.newInstance();
+                if (!Strings.isEmpty(name)) appBuilder.appDisplayName(name);
+                if (entities.size() > 0)
+                    log.warn("Cannot supply additional entities when using an ApplicationBuilder; ignoring in spec {}", spec);
+
+                log.info("REST placing '{}' under management", spec.getName());
+                appBuilder.configure(convertFlagsToKeys(appBuilder.getType(), configO));
+                configureRenderingMetadata(spec, appBuilder);
+                instance = appBuilder.manage(mgmt);
+
+            } else if (Application.class.isAssignableFrom(itemAndClass.clazz)) {
+                org.apache.brooklyn.api.entity.EntitySpec<?> coreSpec = toCoreEntitySpec(itemAndClass.clazz, name, configO, itemAndClass.catalogItemId);
+                configureRenderingMetadata(spec, coreSpec);
+                for (EntitySpec entitySpec : entities) {
+                    log.info("REST creating instance for entity {}", entitySpec.getType());
+                    coreSpec.child(toCoreEntitySpec(entitySpec));
                 }
 
-                return instance;
+                log.info("REST placing '{}' under management", spec.getName() != null ? spec.getName() : spec);
+                instance = (Application) mgmt.getEntityManager().createEntity(coreSpec);
+
+            } else if (Entity.class.isAssignableFrom(itemAndClass.clazz)) {
+                if (entities.size() > 0)
+                    log.warn("Cannot supply additional entities when using a non-application entity; ignoring in spec {}", spec);
+
+                org.apache.brooklyn.api.entity.EntitySpec<?> coreSpec = toCoreEntitySpec(BasicApplication.class, name, configO, itemAndClass.catalogItemId);
+                configureRenderingMetadata(spec, coreSpec);
+
+                coreSpec.child(toCoreEntitySpec(itemAndClass.clazz, name, configO, itemAndClass.catalogItemId)
+                    .configure(BrooklynCampConstants.PLAN_ID, "soleChildId"));
+                coreSpec.enricher(Enrichers.builder()
+                    .propagatingAllBut(Attributes.SERVICE_UP, Attributes.SERVICE_NOT_UP_INDICATORS, 
+                        Attributes.SERVICE_STATE_ACTUAL, Attributes.SERVICE_STATE_EXPECTED, 
+                        Attributes.SERVICE_PROBLEMS)
+                        .from(new DslComponent(Scope.CHILD, "soleChildId").newTask())
+                        .build());
+
+                log.info("REST placing '{}' under management", spec.getName());
+                instance = (Application) mgmt.getEntityManager().createEntity(coreSpec);
 
-            } catch (Exception e) {
-                log.error("REST failed to create application: " + e, e);
-                throw Exceptions.propagate(e);
+            } else {
+                throw new IllegalArgumentException("Class " + itemAndClass.clazz + " must extend one of ApplicationBuilder, Application or Entity");
             }
+
+            return instance;
+
+        } catch (Exception e) {
+            log.error("REST failed to create application: " + e, e);
+            throw Exceptions.propagate(e);
         }
-        throw WebResourceUtils.unauthorized("User '%s' is not authorized to create application from applicationSpec %s",
-                Entitlements.getEntitlementContext().user(), spec);
     }
     
     public Task<?> start(Application app, ApplicationSpec spec) {
@@ -336,37 +360,21 @@ public class BrooklynRestResourceUtils {
         return locations;
     }
 
-    @SuppressWarnings({ "unchecked", "deprecation" })
     private org.apache.brooklyn.api.entity.EntitySpec<? extends Entity> toCoreEntitySpec(org.apache.brooklyn.rest.domain.EntitySpec spec) {
         String type = spec.getType();
         String name = spec.getName();
         Map<String, String> config = (spec.getConfig() == null) ? Maps.<String,String>newLinkedHashMap() : Maps.newLinkedHashMap(spec.getConfig());
 
-        BrooklynCatalog catalog = getCatalog();
-        CatalogItem<?, ?> item = catalog.getCatalogItemForType(type);
-        Class<? extends Entity> tempclazz;
-        final String catalogItemId;
-        if (item != null) {
-            tempclazz = (Class<? extends Entity>) catalog.loadClass(item);
-            catalogItemId = item.getId();
-        } else {
-            catalogItemId = null;
-            try {
-                tempclazz = (Class<? extends Entity>) catalog.getRootClassLoader().loadClass(type);
-                log.info("Catalog does not contain item for type {}; loaded class directly instead", type);
-            } catch (ClassNotFoundException e2) {
-                log.warn("No catalog item for type {}, and could not load class directly; rethrowing", type);
-                throw new NoSuchElementException("Unable to find catalog item for type "+type);
-            }
-        }
-        final Class<? extends Entity> clazz = tempclazz;
+        FindItemAndClass itemAndClass = new FindItemAndClass().inferFrom(type);
+        
+        final Class<? extends Entity> clazz = itemAndClass.clazz;
         org.apache.brooklyn.api.entity.EntitySpec<? extends Entity> result;
         if (clazz.isInterface()) {
             result = org.apache.brooklyn.api.entity.EntitySpec.create(clazz);
         } else {
             result = org.apache.brooklyn.api.entity.EntitySpec.create(Entity.class).impl(clazz).additionalInterfaces(Reflections.getAllInterfaces(clazz));
         }
-        result.catalogItemId(catalogItemId);
+        result.catalogItemId(itemAndClass.catalogItemId);
         if (!Strings.isEmpty(name)) result.displayName(name);
         result.configure( convertFlagsToKeys(result.getType(), config) );
         configureRenderingMetadata(spec, result);
@@ -469,30 +477,6 @@ public class BrooklynRestResourceUtils {
                     Entitlements.getEntitlementContext().user(), entity);
     }
 
-
-    @Deprecated
-    @SuppressWarnings({ "rawtypes" })
-    public Response createCatalogEntryFromGroovyCode(String groovyCode) {
-        ClassLoader parent = getCatalog().getRootClassLoader();
-        @SuppressWarnings("resource")
-        GroovyClassLoader loader = new GroovyClassLoader(parent);
-
-        Class clazz = loader.parseClass(groovyCode);
-
-        if (AbstractEntity.class.isAssignableFrom(clazz)) {
-            CatalogItem<?,?> item = getCatalog().addItem(clazz);
-            log.info("REST created "+item);
-            return Response.created(URI.create("entities/" + clazz.getName())).build();
-
-        } else if (AbstractPolicy.class.isAssignableFrom(clazz)) {
-            CatalogItem<?,?> item = getCatalog().addItem(clazz);
-            log.info("REST created "+item);
-            return Response.created(URI.create("policies/" + clazz.getName())).build();
-        }
-
-        throw WebResourceUtils.preconditionFailed("Unsupported type superclass "+clazz.getSuperclass()+"; expects Entity or Policy");
-    }
-
     @Deprecated
     public static String fixLocation(String locationId) {
         if (locationId.startsWith("/v1/locations/")) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java
index e8f2505..1a74a33 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java
@@ -141,7 +141,7 @@ public class WebResourceUtils {
 
     public static String getPathFromVersionedId(String versionedId) {
         if (CatalogUtils.looksLikeVersionedId(versionedId)) {
-            String symbolicName = CatalogUtils.getIdFromVersionedId(versionedId);
+            String symbolicName = CatalogUtils.getSymbolicNameFromVersionedId(versionedId);
             String version = CatalogUtils.getVersionFromVersionedId(versionedId);
             return Urls.encode(symbolicName) + "/" + Urls.encode(version);
         } else {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
index 2d264f3..020fe19 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
@@ -36,7 +36,6 @@ import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 
 import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityFunctions;
@@ -244,12 +243,12 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
         assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(), "simple-app-yaml");
     }
 
-    @SuppressWarnings("deprecation")
     @Test
     public void testReferenceCatalogEntity() throws Exception {
-        getManagementContext().getCatalog().addItem(BasicEntity.class);
+        getManagementContext().getCatalog().addItems("{ name: "+BasicEntity.class.getName()+", "
+            + "services: [ { type: "+BasicEntity.class.getName()+" } ] }");
 
-        String yaml = "{ name: simple-app-yaml, location: localhost, services: [ { serviceType: " + BasicEntity.class.getName() + " } ] }";
+        String yaml = "{ name: simple-app-yaml, location: localhost, services: [ { type: " + BasicEntity.class.getName() + " } ] }";
 
         ClientResponse response = client().resource("/v1/applications")
                 .entity(yaml, "application/x-yaml")
@@ -335,7 +334,7 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
                 .get(ApplicationSummary.class);
         assertEquals(summary.getStatus(), Status.RUNNING);
 
-        ((EntityLocal)app).sensors().set(Attributes.SERVICE_STATE_ACTUAL, Lifecycle.ON_FIRE);
+        app.sensors().set(Attributes.SERVICE_STATE_ACTUAL, Lifecycle.ON_FIRE);
         try {
             ApplicationSummary summary2 = client().resource("/v1/applications/"+app.getId())
                     .get(ApplicationSummary.class);
@@ -343,7 +342,7 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
             assertEquals(summary2.getStatus(), Status.ERROR);
             
         } finally {
-            ((EntityLocal)app).sensors().set(Attributes.SERVICE_STATE_ACTUAL, origState);
+            app.sensors().set(Attributes.SERVICE_STATE_ACTUAL, origState);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java
index 43e7166..a8748a7 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java
@@ -27,14 +27,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeoutException;
 
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.rest.domain.ApplicationSpec;
 import org.apache.brooklyn.rest.domain.EntitySpec;
@@ -43,6 +37,11 @@ import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
 import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.text.StringEscapes;
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -101,9 +100,9 @@ public class DescendantsTest extends BrooklynRestResourceTest {
         assertEquals(sensors.size(), 0);
 
         long v = 0;
-        ((EntityLocal)application).sensors().set(Sensors.newLongSensor("foo"), v);
+        application.sensors().set(Sensors.newLongSensor("foo"), v);
         for (Entity e: entities)
-            ((EntityLocal)e).sensors().set(Sensors.newLongSensor("foo"), v+=123);
+            e.sensors().set(Sensors.newLongSensor("foo"), v+=123);
         
         sensors = client().resource("/v1/applications/"+application.getApplicationId()+"/descendants/sensor/foo")
             .get(new GenericType<Map<String,Object>>() {});

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ScriptResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ScriptResourceTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ScriptResourceTest.java
index ddb4fe1..23a3e5a 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ScriptResourceTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ScriptResourceTest.java
@@ -20,21 +20,23 @@ package org.apache.brooklyn.rest.resources;
 
 import java.util.Collections;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.apache.brooklyn.api.entity.Application;
+import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.rest.domain.ScriptExecutionSummary;
 import org.apache.brooklyn.rest.testing.mocks.RestMockApp;
+import org.testng.Assert;
+import org.testng.annotations.Test;
 
 public class ScriptResourceTest {
 
     @Test
     public void testGroovy() {
-        RestMockApp app = new RestMockApp();
-        Entities.startManagement(app);
-        ManagementContext mgmt = app.getManagementContext();
+        ManagementContext mgmt = LocalManagementContextForTests.newInstance();
+        Application app = mgmt.getEntityManager().createEntity( EntitySpec.create(Application.class, RestMockApp.class) );
         try {
         
             Entities.start(app, Collections.<Location>emptyList());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/UsageResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/UsageResourceTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/UsageResourceTest.java
index 97793a3..697ae10 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/UsageResourceTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/UsageResourceTest.java
@@ -35,10 +35,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
+import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.location.NoMachinesAvailableException;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.mgmt.internal.LocalUsageManager;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.test.entity.TestApplication;
@@ -46,7 +46,6 @@ import org.apache.brooklyn.entity.software.base.SoftwareProcessEntityTest;
 import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.rest.domain.ApplicationSpec;
-import org.apache.brooklyn.rest.domain.EntitySpec;
 import org.apache.brooklyn.rest.domain.Status;
 import org.apache.brooklyn.rest.domain.TaskSummary;
 import org.apache.brooklyn.rest.domain.UsageStatistic;
@@ -72,7 +71,7 @@ public class UsageResourceTest extends BrooklynRestResourceTest {
     private Calendar testStartTime;
     
     private final ApplicationSpec simpleSpec = ApplicationSpec.builder().name("simple-app").
-            entities(ImmutableSet.of(new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()))).
+            entities(ImmutableSet.of(new org.apache.brooklyn.rest.domain.EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()))).
             locations(ImmutableSet.of("localhost")).
             build();
 
@@ -238,7 +237,7 @@ public class UsageResourceTest extends BrooklynRestResourceTest {
     @Test
     public void testListAndGetMachineUsage() throws Exception {
         Location location = getManagementContext().getLocationManager().createLocation(LocationSpec.create(DynamicLocalhostMachineProvisioningLocation.class));
-        TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class, getManagementContext());
+        TestApplication app = getManagementContext().getEntityManager().createEntity(EntitySpec.create(TestApplication.class));
         SoftwareProcessEntityTest.MyService entity = app.createAndManageChild(org.apache.brooklyn.api.entity.EntitySpec.create(SoftwareProcessEntityTest.MyService.class));
         
         Calendar preStart = new GregorianCalendar();
@@ -264,7 +263,7 @@ public class UsageResourceTest extends BrooklynRestResourceTest {
     @Test
     public void testListMachinesUsageForApp() throws Exception {
         Location location = getManagementContext().getLocationManager().createLocation(LocationSpec.create(DynamicLocalhostMachineProvisioningLocation.class));
-        TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class, getManagementContext());
+        TestApplication app = getManagementContext().getEntityManager().createEntity(EntitySpec.create(TestApplication.class));
         SoftwareProcessEntityTest.MyService entity = app.createAndManageChild(org.apache.brooklyn.api.entity.EntitySpec.create(SoftwareProcessEntityTest.MyService.class));
         String appId = app.getId();
         


[5/9] incubator-brooklyn git commit: more converting CatalogItem access to RegisteredType

Posted by he...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/PoliciesYamlTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/PoliciesYamlTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/PoliciesYamlTest.java
index 9648c51..6bcf49f 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/PoliciesYamlTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/PoliciesYamlTest.java
@@ -53,7 +53,7 @@ public class PoliciesYamlTest extends AbstractYamlTest {
         log.info("App started:");
         Entities.dumpInfo(app);
 
-        Assert.assertEquals(app.getPolicies().size(), 1);
+        Assert.assertEquals(app.policies().size(), 1);
         Policy policy = app.policies().iterator().next();
         Assert.assertTrue(policy instanceof TestPolicy);
         Assert.assertEquals(policy.getConfig(TestPolicy.CONF_NAME), "Name from YAML");
@@ -73,10 +73,10 @@ public class PoliciesYamlTest extends AbstractYamlTest {
         log.info("App started:");
         Entities.dumpInfo(app);
 
-        Assert.assertEquals(app.getPolicies().size(), 0);
+        Assert.assertEquals(app.policies().size(), 0);
         Assert.assertEquals(app.getChildren().size(), 1);
         Entity child = app.getChildren().iterator().next();
-        Assert.assertEquals(child.getPolicies().size(), 1);
+        Assert.assertEquals(child.policies().size(), 1);
         Policy policy = child.policies().iterator().next();
         Assert.assertNotNull(policy);
         Assert.assertTrue(policy instanceof TestPolicy, "policy=" + policy + "; type=" + policy.getClass());
@@ -108,13 +108,13 @@ public class PoliciesYamlTest extends AbstractYamlTest {
         final Entity child = firstEntity.getChildren().iterator().next();
         Assert.assertEquals(child.getChildren().size(), 0);
 
-        Assert.assertEquals(app.getPolicies().size(), 0);
-        Assert.assertEquals(firstEntity.getPolicies().size(), 0);
+        Assert.assertEquals(app.policies().size(), 0);
+        Assert.assertEquals(firstEntity.policies().size(), 0);
         
         Asserts.eventually(new Supplier<Integer>() {
             @Override
             public Integer get() {
-                return child.getPolicies().size();
+                return child.policies().size();
             }
         }, Predicates.<Integer> equalTo(1));
         
@@ -200,7 +200,7 @@ public class PoliciesYamlTest extends AbstractYamlTest {
     }
     
     private Policy getPolicy(Entity entity) {
-        Assert.assertEquals(entity.getPolicies().size(), 1);
+        Assert.assertEquals(entity.policies().size(), 1);
         Policy policy = entity.policies().iterator().next();
         Assert.assertTrue(policy instanceof TestReferencingPolicy);
         return policy;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestEntityWithInitConfig.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestEntityWithInitConfig.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestEntityWithInitConfig.java
index 98892c4..e5fb2f3 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestEntityWithInitConfig.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestEntityWithInitConfig.java
@@ -19,7 +19,6 @@
 package org.apache.brooklyn.camp.brooklyn;
 
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.BasicConfigKey;
@@ -27,7 +26,7 @@ import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.entity.trait.Startable;
 
 @ImplementedBy(TestEntityWithInitConfigImpl.class)
-public interface TestEntityWithInitConfig extends Entity, Startable, EntityLocal, EntityInternal {
+public interface TestEntityWithInitConfig extends Entity, Startable, EntityInternal {
     public static final ConfigKey<Entity> TEST_ENTITY = BasicConfigKey.builder(Entity.class)
             .name("test.entity")
             .build();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestSensorAndEffectorInitializer.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestSensorAndEffectorInitializer.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestSensorAndEffectorInitializer.java
index a73dd8d..91c18ed 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestSensorAndEffectorInitializer.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/TestSensorAndEffectorInitializer.java
@@ -42,7 +42,6 @@ public class TestSensorAndEffectorInitializer implements EntityInitializer {
 
     protected String helloWord() { return "Hello"; }
     
-    @Override
     public void apply(EntityLocal entity) {
         Effector<String> eff = Effectors.effector(String.class, EFFECTOR_SAY_HELLO).parameter(String.class, "name").impl(
             new EffectorBody<String>() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java
index 15626db..a149f18 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java
@@ -332,7 +332,7 @@ public class WindowsYamlLiveTest extends AbstractYamlTest {
             String taskNameRegex = entry.getKey();
             List<String> expectedOuts = entry.getValue();
 
-            Task<?> subTask = findTaskOrSubTask(tasks, TaskPredicates.displayNameMatches(StringPredicates.matchesRegex(taskNameRegex))).get();
+            Task<?> subTask = findTaskOrSubTask(tasks, TaskPredicates.displayNameSatisfies(StringPredicates.matchesRegex(taskNameRegex))).get();
 
             String stdin = getStreamOrFail(subTask, BrooklynTaskTags.STREAM_STDIN);
             String stdout = getStreamOrFail(subTask, BrooklynTaskTags.STREAM_STDOUT);
@@ -352,7 +352,7 @@ public class WindowsYamlLiveTest extends AbstractYamlTest {
         for (Map.Entry<String, Predicate<CharSequence>> entry : taskErrs.entrySet()) {
             String taskNameRegex = entry.getKey();
             Predicate<? super String> errChecker = entry.getValue();
-            Task<?> subTask = findTaskOrSubTask(tasks, TaskPredicates.displayNameMatches(StringPredicates.matchesRegex(taskNameRegex))).get();
+            Task<?> subTask = findTaskOrSubTask(tasks, TaskPredicates.displayNameSatisfies(StringPredicates.matchesRegex(taskNameRegex))).get();
             String msg = "regex="+taskNameRegex+"; task="+subTask;
             assertNotNull(subTask, msg);
             assertTrue(subTask.isDone(), msg);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/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 2d7a117..c426897 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
@@ -20,26 +20,26 @@ package org.apache.brooklyn.camp.brooklyn.catalog;
 
 import static org.testng.Assert.assertTrue;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.BrooklynCatalog;
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.policy.PolicySpec;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
 import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynEntityMatcher;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest;
 import org.apache.brooklyn.core.objs.BrooklynTypes;
+import org.apache.brooklyn.core.typereg.RegisteredTypePredicates;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.text.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
 
 import com.google.common.collect.Iterables;
 
@@ -58,10 +58,10 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest {
         TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/brooklyn/osgi/brooklyn-test-osgi-more-entities_0.1.0.jar");
 
         addCatalogItems(getLocalResource("more-entity-v1-osgi-catalog.yaml"));
-        CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), "more-entity");
+        RegisteredType item = mgmt().getTypeRegistry().get("more-entity");
         Assert.assertNotNull(item);
         Assert.assertEquals(item.getVersion(), "1.0");
-        Assert.assertEquals(item.getCatalogItemType(), CatalogItemType.ENTITY);
+        Assert.assertTrue(RegisteredTypePredicates.IS_ENTITY.apply(item));
         Assert.assertEquals(item.getLibraries().size(), 1);
         
         Entity app = createAndStartApplication("services: [ { type: 'more-entity:1.0' } ]");
@@ -86,7 +86,7 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest {
         
         Assert.assertEquals(moreEntity.getCatalogItemId(), "more-entity:1.0");
         
-        Assert.assertEquals(moreEntity.getPolicies().size(), 1, "wrong policies: "+moreEntity.getPolicies());
+        Assert.assertEquals(moreEntity.policies().size(), 1, "wrong policies: "+moreEntity.policies());
         Policy policy = Iterables.getOnlyElement(moreEntity.policies());
         // it was loaded by yaml w ref to catalog, so should have the simple-policy catalog-id
         Assert.assertEquals(policy.getCatalogItemId(), "simple-policy:1.0");
@@ -105,7 +105,7 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest {
         OsgiVersionMoreEntityTest.assertV2EffectorCall(moreEntity);
         OsgiVersionMoreEntityTest.assertV2MethodCall(moreEntity);
         
-        Assert.assertEquals(moreEntity.getPolicies().size(), 1, "wrong policies: "+moreEntity.getPolicies());
+        Assert.assertEquals(moreEntity.policies().size(), 1, "wrong policies: "+moreEntity.policies());
         Policy policy = Iterables.getOnlyElement(moreEntity.policies());
         // it was loaded from the java so should have the base more-entity catalog id
         Assert.assertEquals(policy.getCatalogItemId(), "more-entity:1.0");
@@ -177,13 +177,13 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest {
         
         log.info("autoscan for osgi found catalog items: "+Strings.join(mgmt().getCatalog().getCatalogItems(), ", "));
 
-        CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), "more-entity");
+        RegisteredType item = mgmt().getTypeRegistry().get("more-entity");
         Assert.assertNotNull(item);
         Assert.assertEquals(item.getVersion(), "2.0.test");
-        Assert.assertEquals(item.getCatalogItemType(), CatalogItemType.ENTITY);
+        Assert.assertTrue(RegisteredTypePredicates.IS_ENTITY.apply(item));
         
         // this refers to the java item, where the libraries are defined
-        item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), "org.apache.brooklyn.test.osgi.entities.more.MoreEntity");
+        item = mgmt().getTypeRegistry().get("org.apache.brooklyn.test.osgi.entities.more.MoreEntity");
         Assert.assertEquals(item.getVersion(), "2.0.test_java");
         Assert.assertEquals(item.getLibraries().size(), 2);
         
@@ -204,13 +204,13 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest {
         
         log.info("autoscan for osgi found catalog items: "+Strings.join(mgmt().getCatalog().getCatalogItems(), ", "));
 
-        CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), "more-policy");
+        RegisteredType item = mgmt().getTypeRegistry().get("more-policy");
         Assert.assertNotNull(item);
         Assert.assertEquals(item.getVersion(), "2.0.test");
-        Assert.assertEquals(item.getCatalogItemType(), CatalogItemType.POLICY);
+        Assert.assertTrue(RegisteredTypePredicates.IS_POLICY.apply(item));
         
         // this refers to the java item, where the libraries are defined
-        item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), "org.apache.brooklyn.test.osgi.entities.more.MorePolicy");
+        item = mgmt().getTypeRegistry().get("org.apache.brooklyn.test.osgi.entities.more.MorePolicy");
         Assert.assertEquals(item.getVersion(), "2.0.test_java");
         Assert.assertEquals(item.getLibraries().size(), 2);
         
@@ -233,27 +233,23 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest {
 
         addCatalogItems(getLocalResource("more-entities-osgi-catalog-scan.yaml"));
 
-        log.info("autoscan for osgi found catalog items: "+Strings.join(mgmt().getCatalog().getCatalogItems(), ", "));
+        log.info("autoscan for osgi found catalog items: "+Strings.join(mgmt().getTypeRegistry().getAll(), ", "));
 
-        BrooklynCatalog catalog = mgmt().getCatalog();
-        Iterable<CatalogItem<Object, Object>> items = catalog.getCatalogItems();
-        for (CatalogItem<Object, Object> item: items) {
-            @SuppressWarnings({ "unchecked", "rawtypes" })
-            Object spec = catalog.createSpec((CatalogItem)item);
-            switch (item.getCatalogItemType()) {
-                case TEMPLATE:
-                case ENTITY:
-                    assertTrue(spec instanceof EntitySpec, "Not an EntitySpec: " + spec);
-                    BrooklynTypes.getDefinedEntityType(((EntitySpec<?>)spec).getType());
-                    break;
-                case POLICY:
-                    assertTrue(spec instanceof PolicySpec, "Not a PolicySpec: " + spec);
-                    BrooklynTypes.getDefinedBrooklynType(((PolicySpec<?>)spec).getType());
-                    break;
-                case LOCATION:
-                    assertTrue(spec instanceof LocationSpec, "Not a LocationSpec: " + spec);
-                    BrooklynTypes.getDefinedBrooklynType(((LocationSpec<?>)spec).getType());
-                    break;
+        BrooklynTypeRegistry types = mgmt().getTypeRegistry();
+        Iterable<RegisteredType> items = types.getAll();
+        for (RegisteredType item: items) {
+            Object spec = types.createSpec(item, null, null);
+            if (Entity.class.isAssignableFrom(item.getJavaType())) {
+                assertTrue(spec instanceof EntitySpec, "Not an EntitySpec: " + spec);
+                BrooklynTypes.getDefinedEntityType(((EntitySpec<?>)spec).getType());
+            } else if (Policy.class.isAssignableFrom(item.getJavaType())) { 
+                assertTrue(spec instanceof PolicySpec, "Not a PolicySpec: " + spec);
+                BrooklynTypes.getDefinedBrooklynType(((PolicySpec<?>)spec).getType());
+            } else if (Location.class.isAssignableFrom(item.getJavaType())) {
+                assertTrue(spec instanceof LocationSpec, "Not a LocationSpec: " + spec);
+                BrooklynTypes.getDefinedBrooklynType(((LocationSpec<?>)spec).getType());
+            } else {
+                Assert.fail("Unexpected type: "+item.getJavaType()+" / "+item);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogXmlOsgiTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogXmlOsgiTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogXmlOsgiTest.java
index 5a2362e..2161fec 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogXmlOsgiTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogXmlOsgiTest.java
@@ -18,11 +18,6 @@
  */
 package org.apache.brooklyn.camp.brooklyn.catalog;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.fail;
-
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.exceptions.PropagatedRuntimeException;
 import org.testng.annotations.Test;
 
 public class CatalogXmlOsgiTest extends AbstractCatalogXmlTest {
@@ -31,19 +26,12 @@ public class CatalogXmlOsgiTest extends AbstractCatalogXmlTest {
         super("classpath://osgi-catalog.xml");
     }
 
-    //OSGi libraries not supported with old-style catalog items
-    //We treat those catalog items just as an alias to the java type they hold.
-    //No loader wrapping their libraries is ever created.
     @Test
     public void testOsgiItem() throws Exception {
-        try {
-            startApp("OsgiApp");
-            fail();
-        } catch (PropagatedRuntimeException e) {
-            ClassNotFoundException ex = Exceptions.getFirstThrowableOfType(e, ClassNotFoundException.class);
-            if (ex == null) throw e;
-            assertEquals(ex.getMessage(), "org.apache.brooklyn.test.osgi.entities.SimpleApplication");
-        }
+        startApp("OsgiApp");
+        // previously OSGi libraries were not supported with old-style catalog items;
+        // now they are (2015-10), even though the XML is not supported,
+        // we may use the same type instantiator from CAMP and elsewhere
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java
index 8e10c20..8ce0023 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlCombiTest.java
@@ -60,7 +60,7 @@ public class CatalogYamlCombiTest extends AbstractYamlTest {
             "      type: A",
             "      brooklyn.config: { b: 1 }");
 
-        RegisteredType item = mgmt().getTypeRegistry().get("B", TEST_VERSION, null, null);
+        RegisteredType item = mgmt().getTypeRegistry().get("B", TEST_VERSION);
         Assert.assertNotNull(item);
 
         Entity a = launchEntity("A");
@@ -113,7 +113,7 @@ public class CatalogYamlCombiTest extends AbstractYamlTest {
             "      brooklyn.policies:",
             "      - type: A");
 
-        RegisteredType item = mgmt().getTypeRegistry().get("A", TEST_VERSION, null, null);
+        RegisteredType item = mgmt().getTypeRegistry().get("A", TEST_VERSION);
         Assert.assertNotNull(item);
 
         Entity b = launchEntity("B", false);
@@ -122,7 +122,7 @@ public class CatalogYamlCombiTest extends AbstractYamlTest {
         
         Assert.assertEquals(Iterables.getOnlyElement(b.getLocations()).getConfig(ConfigKeys.newIntegerConfigKey("z")), (Integer)9);
         
-        Policy p = Iterables.getOnlyElement(b.getPolicies());
+        Policy p = Iterables.getOnlyElement(b.policies());
         Assert.assertTrue(ServiceRestarter.class.isInstance(p), "Wrong type: "+p);
         Assert.assertEquals(p.getConfig(ConfigKeys.newIntegerConfigKey("a")), (Integer)99);
         

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
index 882332b..247f6b4 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
@@ -531,9 +531,9 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
         addCatalogOSGiEntity(id);
         BrooklynTypeRegistry catalog = mgmt().getTypeRegistry();
         RegisteredType item = catalog.get(id, TEST_VERSION);
-        EntitySpec<?> spec = catalog.createSpec(item, EntitySpec.class);
+        EntitySpec<?> spec = catalog.createSpec(item, null, EntitySpec.class);
         Assert.assertNotNull(spec);
-        AbstractBrooklynObjectSpec<?,?> spec2 = catalog.createSpec(item, AbstractBrooklynObjectSpec.class);
+        AbstractBrooklynObjectSpec<?,?> spec2 = catalog.createSpec(item, null, null);
         Assert.assertNotNull(spec2);
     }
     
@@ -613,7 +613,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
                 "  version: " + TEST_VERSION + "pre",
                 "",
                 "services:",
-                "- type: org.apache.brooklyn.entity.stock.BasicEntity");
+                "- type: "+BasicEntity.class.getName());
 
         addCatalogItems(
                 "brooklyn.catalog:",

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
index eebaea5..e13792d 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
@@ -118,7 +118,7 @@ public class CatalogYamlLocationTest extends AbstractYamlTest {
         assertEquals(def.getId(), symbolicName);
         assertEquals(def.getName(), symbolicName);
         
-        LocationSpec spec = (LocationSpec) mgmt().getTypeRegistry().createSpec(item, LocationSpec.class);
+        LocationSpec spec = (LocationSpec) mgmt().getTypeRegistry().createSpec(item, null, LocationSpec.class);
         assertEquals(spec.getType().getName(), expectedJavaType);
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlPolicyTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlPolicyTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlPolicyTest.java
index 062cb47..fbfe630 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlPolicyTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlPolicyTest.java
@@ -20,15 +20,15 @@ package org.apache.brooklyn.camp.brooklyn.catalog;
 
 import static org.testng.Assert.assertEquals;
 
-import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.policy.Policy;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
 import org.apache.brooklyn.core.catalog.CatalogPredicates;
 import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
+import org.testng.annotations.Test;
 
 import com.google.common.collect.Iterables;
 
@@ -43,7 +43,7 @@ public class CatalogYamlPolicyTest extends AbstractYamlTest {
         String symbolicName = "my.catalog.policy.id.load";
         addCatalogOsgiPolicy(symbolicName, SIMPLE_POLICY_TYPE);
 
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
         assertEquals(item.getSymbolicName(), symbolicName);
         assertEquals(countCatalogPolicies(), 1);
 
@@ -57,7 +57,7 @@ public class CatalogYamlPolicyTest extends AbstractYamlTest {
         String symbolicName = "my.catalog.policy.id.load";
         addCatalogOsgiPolicyTopLevelSyntax(symbolicName, SIMPLE_POLICY_TYPE);
 
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
         assertEquals(item.getSymbolicName(), symbolicName);
         assertEquals(countCatalogPolicies(), 1);
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
index 67ef06c..2996685 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
@@ -21,8 +21,8 @@ package org.apache.brooklyn.camp.brooklyn.catalog;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
@@ -41,6 +41,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.sensor.Enricher;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlRebindTest;
 import org.apache.brooklyn.core.BrooklynFeatureEnablement;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
@@ -125,7 +126,7 @@ public class CatalogYamlRebindTest extends AbstractYamlRebindTest {
         runRebindWithCatalogAndApp(RebindWithCatalogTestMode.STRIP_DEPRECATION_AND_ENABLEMENT_FROM_CATALOG_ITEM);
     }
 
-    @SuppressWarnings("unused")
+    @SuppressWarnings({ "unused", "deprecation" })
     protected void runRebindWithCatalogAndApp(RebindWithCatalogTestMode mode) throws Exception {
         String appSymbolicName = "my.catalog.app.id.load";
         String appVersion = "0.1.0";
@@ -170,20 +171,12 @@ public class CatalogYamlRebindTest extends AbstractYamlRebindTest {
         // Depending on test-mode, delete the catalog item, and then rebind
         switch (mode) {
             case DEPRECATE_CATALOG:
-                appItem = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), appSymbolicName+":"+appVersion);
-                appItem.setDeprecated(true);
-                mgmt().getCatalog().persist(appItem);
-                locItem = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), locSymbolicName+":"+locVersion);
-                locItem.setDeprecated(true);
-                mgmt().getCatalog().persist(locItem);
+                CatalogUtils.setDeprecated(mgmt(), appSymbolicName, appVersion, true);
+                CatalogUtils.setDeprecated(mgmt(), locSymbolicName, locVersion, true);
                 break;
             case DISABLE_CATALOG:
-                appItem = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), appSymbolicName+":"+appVersion);
-                appItem.setDisabled(true);
-                mgmt().getCatalog().persist(appItem);
-                locItem = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), locSymbolicName+":"+locVersion);
-                locItem.setDisabled(true);
-                mgmt().getCatalog().persist(locItem);
+                CatalogUtils.setDisabled(mgmt(), appSymbolicName, appVersion, true);
+                CatalogUtils.setDisabled(mgmt(), locSymbolicName, locVersion, true);
                 break;
             case DELETE_CATALOG:
                 mgmt().getCatalog().deleteCatalogItem(appSymbolicName, appVersion);
@@ -198,13 +191,7 @@ public class CatalogYamlRebindTest extends AbstractYamlRebindTest {
                 addCatalogItems(String.format(locCatalogFormat, locVersion));
                 break;
             case STRIP_DEPRECATION_AND_ENABLEMENT_FROM_CATALOG_ITEM:
-                //Make sure that the flags are actually removed from the XML instead of still being there with false values
-                appItem.setDeprecated(true);
-                appItem.setDisabled(true);
-                mgmt().getCatalog().persist(appItem);
-                locItem.setDisabled(true);
-                locItem.setDeprecated(true);
-                mgmt().getCatalog().persist(locItem);
+                // nothing here -- but below we rebind with these fields removed to ensure that we can rebind
                 break;
             case NO_OP:
                 break; // no-op
@@ -244,8 +231,8 @@ public class CatalogYamlRebindTest extends AbstractYamlRebindTest {
         assertFalse(Entities.isManaged(newEntity));
         
         // Ensure catalog item is as expecpted
-        CatalogItem<?, ?> newAppItem = mgmt().getCatalog().getCatalogItem(appSymbolicName, appVersion);
-        CatalogItem<?, ?> newLocItem = mgmt().getCatalog().getCatalogItem(locSymbolicName, locVersion);
+        RegisteredType newAppItem = mgmt().getTypeRegistry().get(appSymbolicName, appVersion);
+        RegisteredType newLocItem = mgmt().getTypeRegistry().get(locSymbolicName, locVersion);
 
         boolean itemDeployable;
         switch (mode) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlTemplateTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlTemplateTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlTemplateTest.java
index bc55be9..c3dbc48 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlTemplateTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlTemplateTest.java
@@ -18,18 +18,17 @@
  */
 package org.apache.brooklyn.camp.brooklyn.catalog;
 
-import static org.testng.Assert.assertEquals;
-
+import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
+import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest;
+import org.apache.brooklyn.core.typereg.RegisteredTypePredicates;
+import org.apache.brooklyn.core.typereg.RegisteredTypes;
+import org.apache.brooklyn.test.support.TestResourceUnavailableException;
+import org.apache.brooklyn.util.osgi.OsgiTestResources;
 import org.testng.Assert;
 import org.testng.TestListenerAdapter;
 import org.testng.TestNG;
 import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
-import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
-import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest;
-import org.apache.brooklyn.util.osgi.OsgiTestResources;
-import org.apache.brooklyn.test.support.TestResourceUnavailableException;
 
 
 public class CatalogYamlTemplateTest extends AbstractYamlTest {
@@ -38,12 +37,13 @@ public class CatalogYamlTemplateTest extends AbstractYamlTest {
 
     @Test
     public void testAddCatalogItem() throws Exception {
-        CatalogItem<?, ?> item = makeItem();
-        assertEquals(item.getCatalogItemType(), CatalogItemType.TEMPLATE);
-        Assert.assertTrue(item.getPlanYaml().indexOf("sample comment")>=0,
-            "YAML did not include original comments; it was:\n"+item.getPlanYaml());
-        Assert.assertFalse(item.getPlanYaml().indexOf("description")>=0,
-            "YAML included metadata which should have been excluded; it was:\n"+item.getPlanYaml());
+        RegisteredType item = makeItem();
+        Assert.assertTrue(RegisteredTypePredicates.IS_APPLICATION.apply(item), "item: "+item);
+        String yaml = RegisteredTypes.getImplementationDataStringForSpec(item);
+        Assert.assertTrue(yaml.indexOf("sample comment")>=0,
+            "YAML did not include original comments; it was:\n"+yaml);
+        Assert.assertFalse(yaml.indexOf("description")>=0,
+            "YAML included metadata which should have been excluded; it was:\n"+yaml);
 
         deleteCatalogEntity("t1");
     }
@@ -53,16 +53,17 @@ public class CatalogYamlTemplateTest extends AbstractYamlTest {
         // this will fail with the Eclipse TestNG plugin -- use the static main instead to run in eclipse!
         // see Yamls.KnownClassVersionException for details
         
-        CatalogItem<?, ?> item = makeItem();
-        Assert.assertTrue(item.getPlanYaml().indexOf("sample comment")>=0,
-            "YAML did not include original comments; it was:\n"+item.getPlanYaml());
-        Assert.assertFalse(item.getPlanYaml().indexOf("description")>=0,
-            "YAML included metadata which should have been excluded; it was:\n"+item.getPlanYaml());
+        RegisteredType item = makeItem();
+        String yaml = RegisteredTypes.getImplementationDataStringForSpec(item);
+        Assert.assertTrue(yaml.indexOf("sample comment")>=0,
+            "YAML did not include original comments; it was:\n"+yaml);
+        Assert.assertFalse(yaml.indexOf("description")>=0,
+            "YAML included metadata which should have been excluded; it was:\n"+yaml);
 
         deleteCatalogEntity("t1");
     }
 
-    private CatalogItem<?, ?> makeItem() {
+    private RegisteredType makeItem() {
         TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_PATH);
         
         addCatalogItems(
@@ -80,8 +81,7 @@ public class CatalogYamlTemplateTest extends AbstractYamlTest {
             "    # this sample comment should be included",
             "    - type: " + SIMPLE_ENTITY_TYPE);
 
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem("t1", TEST_VERSION);
-        return item;
+        return mgmt().getTypeRegistry().get("t1", TEST_VERSION);
     }
 
     // convenience for running in eclipse when the TestNG plugin drags in old version of snake yaml

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlVersioningTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlVersioningTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlVersioningTest.java
index 68f73a8..f92f3a4 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlVersioningTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlVersioningTest.java
@@ -23,30 +23,31 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.BrooklynCatalog;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
-import org.apache.brooklyn.core.catalog.CatalogPredicates;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.typereg.RegisteredTypePredicates;
+import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.entity.stock.BasicApplication;
 import org.apache.brooklyn.entity.stock.BasicEntity;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import com.google.common.base.Predicates;
 import com.google.common.collect.Iterables;
 
 public class CatalogYamlVersioningTest extends AbstractYamlTest {
     
-    private BrooklynCatalog catalog;
+    private BrooklynTypeRegistry types;
     
     @BeforeMethod(alwaysRun = true)
     public void setUp() {
         super.setUp();
-        catalog = mgmt().getCatalog();
+        types = mgmt().getTypeRegistry();
     }
 
     @Test
@@ -86,8 +87,9 @@ public class CatalogYamlVersioningTest extends AbstractYamlTest {
         forceCatalogUpdate();
         String expectedType = "org.apache.brooklyn.entity.stock.BasicApplication";
         addCatalogEntity(symbolicName, version, expectedType);
-        CatalogItem<?, ?> item = catalog.getCatalogItem(symbolicName, version);
-        assertTrue(item.getPlanYaml().contains(expectedType), "Version not updated");
+        RegisteredType item = types.get(symbolicName, version);
+        String yaml = RegisteredTypes.getImplementationDataStringForSpec(item);
+        assertTrue(yaml.contains(expectedType), "Version not updated:\n"+yaml);
     }
     
     @Test
@@ -97,7 +99,7 @@ public class CatalogYamlVersioningTest extends AbstractYamlTest {
         String v2 = "0.2.0";
         addCatalogEntity(symbolicName, v1);
         addCatalogEntity(symbolicName, v2);
-        CatalogItem<?, ?> item = catalog.getCatalogItem(symbolicName, BasicBrooklynCatalog.DEFAULT_VERSION);
+        RegisteredType item = types.get(symbolicName, BasicBrooklynCatalog.DEFAULT_VERSION);
         assertEquals(item.getVersion(), v2);
     }
     
@@ -108,7 +110,7 @@ public class CatalogYamlVersioningTest extends AbstractYamlTest {
         String v2 = "0.2.0-SNAPSHOT";
         addCatalogEntity(symbolicName, v1);
         addCatalogEntity(symbolicName, v2);
-        CatalogItem<?, ?> item = catalog.getCatalogItem(symbolicName, BasicBrooklynCatalog.DEFAULT_VERSION);
+        RegisteredType item = types.get(symbolicName, BasicBrooklynCatalog.DEFAULT_VERSION);
         assertEquals(item.getVersion(), v1);
     }
 
@@ -117,18 +119,28 @@ public class CatalogYamlVersioningTest extends AbstractYamlTest {
         String symbolicName = "sampleId";
         String version = "0.1.0";
         addCatalogEntity(symbolicName, version);
-        assertTrue(catalog.getCatalogItems(CatalogPredicates.symbolicName(Predicates.equalTo(symbolicName))).iterator().hasNext());
-        catalog.deleteCatalogItem(symbolicName, version);
-        assertFalse(catalog.getCatalogItems(CatalogPredicates.symbolicName(Predicates.equalTo(symbolicName))).iterator().hasNext());
+        
+        Iterable<RegisteredType> matches;
+        matches = types.getAll(RegisteredTypePredicates.symbolicName(Predicates.equalTo(symbolicName)));
+        assertTrue(matches.iterator().hasNext());
+        
+        mgmt().getCatalog().deleteCatalogItem(symbolicName, version);
+        matches = types.getAll(RegisteredTypePredicates.symbolicName(Predicates.equalTo(symbolicName)));
+        assertFalse(matches.iterator().hasNext());
     }
     
     @Test
     public void testDeleteDefault() {
         String symbolicName = "sampleId";
         addCatalogEntity(symbolicName, null);
-        assertTrue(catalog.getCatalogItems(CatalogPredicates.symbolicName(Predicates.equalTo(symbolicName))).iterator().hasNext());
-        catalog.deleteCatalogItem(symbolicName, BasicBrooklynCatalog.NO_VERSION);
-        assertFalse(catalog.getCatalogItems(CatalogPredicates.symbolicName(Predicates.equalTo(symbolicName))).iterator().hasNext());
+
+        Iterable<RegisteredType> matches;
+        matches = types.getAll(RegisteredTypePredicates.symbolicName(Predicates.equalTo(symbolicName)));
+        assertTrue(matches.iterator().hasNext());
+        
+        mgmt().getCatalog().deleteCatalogItem(symbolicName, BasicBrooklynCatalog.NO_VERSION);
+        matches = types.getAll(RegisteredTypePredicates.symbolicName(Predicates.equalTo(symbolicName)));
+        assertFalse(matches.iterator().hasNext());
     }
     
     @Test
@@ -138,7 +150,7 @@ public class CatalogYamlVersioningTest extends AbstractYamlTest {
         String v2 = "0.2.0-SNAPSHOT";
         addCatalogEntity(symbolicName, v1);
         addCatalogEntity(symbolicName, v2);
-        Iterable<CatalogItem<Object, Object>> items = catalog.getCatalogItems(CatalogPredicates.symbolicName(Predicates.equalTo(symbolicName)));
+        Iterable<RegisteredType> items = types.getAll(RegisteredTypePredicates.symbolicName(Predicates.equalTo(symbolicName)));
         assertEquals(Iterables.size(items), 2);
     }
     
@@ -200,9 +212,9 @@ public class CatalogYamlVersioningTest extends AbstractYamlTest {
                 "      type: referrent\n" +
                 "      version: 1.1"));
         
-        Iterable<CatalogItem<Object, Object>> items = catalog.getCatalogItems(CatalogPredicates.symbolicName(Predicates.equalTo("referrer")));
+        Iterable<RegisteredType> items = types.getAll(RegisteredTypePredicates.symbolicName(Predicates.equalTo("referrer")));
         Assert.assertEquals(Iterables.size(items), 1, "Wrong number of: "+items);
-        CatalogItem<Object, Object> item = Iterables.getOnlyElement(items);
+        RegisteredType item = Iterables.getOnlyElement(items);
         Assert.assertEquals(item.getVersion(), "1.0");
         
         Entity app = createAndStartApplication(
@@ -227,8 +239,8 @@ public class CatalogYamlVersioningTest extends AbstractYamlTest {
     }
     
     private void assertSingleCatalogItem(String symbolicName, String version) {
-        Iterable<CatalogItem<Object, Object>> items = catalog.getCatalogItems(CatalogPredicates.symbolicName(Predicates.equalTo(symbolicName)));
-        CatalogItem<Object, Object> item = Iterables.getOnlyElement(items);
+        Iterable<RegisteredType> items = types.getAll(RegisteredTypePredicates.symbolicName(Predicates.equalTo(symbolicName)));
+        RegisteredType item = Iterables.getOnlyElement(items);
         assertEquals(item.getSymbolicName(), symbolicName);
         assertEquals(item.getVersion(), version);
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
index 9f2a377..cb0b169 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/test/lite/CampYamlLiteTest.java
@@ -30,6 +30,7 @@ import java.util.Map;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
+import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.Task;
@@ -53,6 +54,7 @@ import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints;
 import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
 import org.apache.brooklyn.util.collections.MutableMap;
@@ -230,7 +232,7 @@ public class CampYamlLiteTest {
     }
 
     private void assertMgmtHasSampleMyCatalogApp(String symbolicName, String bundleUrl) {
-        RegisteredType item = mgmt.getTypeRegistry().get(symbolicName, BrooklynTypeRegistry.RegisteredTypeKind.SPEC, null);
+        RegisteredType item = mgmt.getTypeRegistry().get(symbolicName, RegisteredTypeConstraints.spec(Entity.class));
         assertNotNull(item, "failed to load item with id=" + symbolicName + " from catalog. Entries were: " +
                 Joiner.on(",").join(mgmt.getTypeRegistry().getAll()));
         assertEquals(item.getSymbolicName(), symbolicName);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java
index c2aaebd..601ff71 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java
@@ -152,7 +152,7 @@ public class BrooklynWebConfig {
             "SSL_RSA_WITH_3DES_EDE_CBC_SHA");
 
     public final static boolean hasNoSecurityOptions(ConfigMap config) {
-        return config.submap(ConfigPredicates.startingWith(BASE_NAME_SECURITY)).isEmpty();
+        return config.submap(ConfigPredicates.nameStartsWith(BASE_NAME_SECURITY)).isEmpty();
     }
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java
index a07e684..e4dacc9 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java
@@ -23,7 +23,6 @@ import javax.servlet.ServletContext;
 import javax.ws.rs.core.Context;
 
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.core.config.render.RendererHints;
 import org.apache.brooklyn.core.mgmt.ManagementContextInjectable;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
index c8c004c..699c860 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
@@ -42,9 +42,10 @@ import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.entity.Group;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Sensor;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.core.config.ConstraintViolationException;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.EntityPredicates;
@@ -57,6 +58,7 @@ import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.EntityAndItem;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument;
 import org.apache.brooklyn.core.sensor.Sensors;
+import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints;
 import org.apache.brooklyn.entity.group.AbstractGroup;
 import org.apache.brooklyn.rest.api.ApplicationApi;
 import org.apache.brooklyn.rest.domain.ApplicationSpec;
@@ -73,6 +75,7 @@ import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.exceptions.UserFacingException;
+import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.apache.brooklyn.util.text.Strings;
 import org.codehaus.jackson.JsonNode;
 import org.codehaus.jackson.node.ArrayNode;
@@ -144,8 +147,8 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
             aRoot.put("parentId", entity.getParent().getId());
         }
 
-        if (!entity.getGroups().isEmpty())
-            aRoot.put("groupIds", entitiesIdAsArray(entity.getGroups()));
+        if (!entity.groups().isEmpty())
+            aRoot.put("groupIds", entitiesIdAsArray(entity.groups()));
 
         if (!entity.getChildren().isEmpty())
             aRoot.put("children", entitiesIdAndNameAsArray(entity.getChildren()));
@@ -183,7 +186,7 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
         return node;
     }
 
-    private ArrayNode entitiesIdAsArray(Collection<? extends Entity> entities) {
+    private ArrayNode entitiesIdAsArray(Iterable<? extends Entity> entities) {
         ArrayNode node = mapper().createArrayNode();
         for (Entity entity : entities) {
             if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) {
@@ -398,17 +401,21 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
         }
     }
 
-    private void checkEntityTypeIsValid(String type) {
-        if (CatalogUtils.getCatalogItemOptionalVersion(mgmt(), type) == null) {
+    private void checkSpecTypeIsValid(String type, Class<? extends BrooklynObject> subType) {
+        if (mgmt().getTypeRegistry().get(type, RegisteredTypeConstraints.spec(subType)) == null) {
             try {
                 brooklyn().getCatalogClassLoader().loadClass(type);
             } catch (ClassNotFoundException e) {
                 log.debug("Class not found for type '" + type + "'; reporting 404", e);
                 throw WebResourceUtils.notFound("Undefined type '%s'", type);
             }
-            log.info("Entity type '{}' not defined in catalog but is on classpath; continuing", type);
+            log.info(JavaClassNames.simpleClassName(subType)+" type '{}' not defined in catalog but is on classpath; continuing", type);
         }
     }
+    
+    private void checkEntityTypeIsValid(String type) {
+        checkSpecTypeIsValid(type, Entity.class);
+    }
 
     @SuppressWarnings("deprecation")
     private void checkLocationsAreValid(ApplicationSpec applicationSpec) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
index 38b7815..848701f 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
@@ -34,7 +34,6 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
@@ -42,6 +41,7 @@ import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.policy.PolicySpec;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.catalog.CatalogPredicates;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.CatalogDto;
@@ -49,6 +49,8 @@ import org.apache.brooklyn.core.catalog.internal.CatalogItemComparator;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument;
+import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints;
+import org.apache.brooklyn.core.typereg.RegisteredTypePredicates;
 import org.apache.brooklyn.rest.api.CatalogApi;
 import org.apache.brooklyn.rest.domain.ApiError;
 import org.apache.brooklyn.rest.domain.CatalogEntitySummary;
@@ -146,11 +148,9 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
                 Entitlements.getEntitlementContext().user());
         }
         try {
-            CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), entityId);
+            RegisteredType item = mgmt().getTypeRegistry().get(entityId, RegisteredTypeConstraints.spec(Entity.class));
             if (item==null) {
                 throw WebResourceUtils.notFound("Entity with id '%s' not found", entityId);
-            } else if (item.getCatalogItemType() != CatalogItemType.ENTITY && item.getCatalogItemType() != CatalogItemType.TEMPLATE) {
-                throw WebResourceUtils.preconditionFailed("Item with id '%s' not an entity", entityId);
             }
             brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
         } catch (NoSuchElementException e) {
@@ -170,10 +170,10 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
                 Entitlements.getEntitlementContext().user());
         }
         
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(symbolicName, version);
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, version);
         if (item == null) {
             throw WebResourceUtils.notFound("Entity with id '%s:%s' not found", symbolicName, version);
-        } else if (item.getCatalogItemType() != CatalogItemType.ENTITY && item.getCatalogItemType() != CatalogItemType.TEMPLATE) {
+        } else if (!RegisteredTypePredicates.IS_ENTITY.apply(item) && !RegisteredTypePredicates.IS_APPLICATION.apply(item)) {
             throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not an entity", symbolicName, version);
         } else {
             brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
@@ -187,10 +187,10 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
                 Entitlements.getEntitlementContext().user());
         }
         
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(policyId, version);
+        RegisteredType item = mgmt().getTypeRegistry().get(policyId, version);
         if (item == null) {
             throw WebResourceUtils.notFound("Policy with id '%s:%s' not found", policyId, version);
-        } else if (item.getCatalogItemType() != CatalogItemType.POLICY) {
+        } else if (!RegisteredTypePredicates.IS_POLICY.apply(item)) {
             throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not a policy", policyId, version);
         } else {
             brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
@@ -204,10 +204,10 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
                 Entitlements.getEntitlementContext().user());
         }
         
-        CatalogItem<?, ?> item = mgmt().getCatalog().getCatalogItem(locationId, version);
+        RegisteredType item = mgmt().getTypeRegistry().get(locationId, version);
         if (item == null) {
             throw WebResourceUtils.notFound("Location with id '%s:%s' not found", locationId, version);
-        } else if (item.getCatalogItemType() != CatalogItemType.LOCATION) {
+        } else if (!RegisteredTypePredicates.IS_LOCATION.apply(item)) {
             throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not a location", locationId, version);
         } else {
             brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
@@ -404,8 +404,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
                 Entitlements.getEntitlementContext().user());
         }
 
-        CatalogItem<?,?> result = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), itemId);
-        return getCatalogItemIcon(result);
+        return getCatalogItemIcon( mgmt().getTypeRegistry().get(itemId) );
     }
 
     @Override
@@ -415,8 +414,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
                 Entitlements.getEntitlementContext().user());
         }
         
-        CatalogItem<?,?> result = brooklyn().getCatalog().getCatalogItem(itemId, version);
-        return getCatalogItemIcon(result);
+        return getCatalogItemIcon(mgmt().getTypeRegistry().get(itemId, version));
     }
 
     @Override
@@ -426,33 +424,27 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
         setDeprecated(itemId, deprecated);
     }
     
+    @SuppressWarnings("deprecation")
     @Override
     public void setDeprecated(String itemId, boolean deprecated) {
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, StringAndArgument.of(itemId, "deprecated"))) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify catalog",
                     Entitlements.getEntitlementContext().user());
         }
-        CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), itemId);
-        if (item==null)
-            throw WebResourceUtils.notFound("Catalog item with id '%s' not found", itemId);
-        item.setDeprecated(deprecated);
-        mgmt().getCatalog().persist(item);
+        CatalogUtils.setDeprecated(mgmt(), itemId, deprecated);
     }
 
+    @SuppressWarnings("deprecation")
     @Override
     public void setDisabled(String itemId, boolean disabled) {
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, StringAndArgument.of(itemId, "disabled"))) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify catalog",
                     Entitlements.getEntitlementContext().user());
         }
-        CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), itemId);
-        if (item==null)
-            throw WebResourceUtils.notFound("Catalog item with id '%s' not found", itemId);
-        item.setDisabled(disabled);
-        mgmt().getCatalog().persist(item);
+        CatalogUtils.setDisabled(mgmt(), itemId, disabled);
     }
 
-    private Response getCatalogItemIcon(CatalogItem<?, ?> result) {
+    private Response getCatalogItemIcon(RegisteredType result) {
         String url = result.getIconUrl();
         if (url==null) {
             log.debug("No icon available for "+result+"; returning "+Status.NO_CONTENT);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EffectorResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EffectorResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EffectorResource.java
index fd8dc47..4110d47 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EffectorResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EffectorResource.java
@@ -26,15 +26,8 @@ import java.util.concurrent.TimeoutException;
 import javax.annotation.Nullable;
 import javax.ws.rs.core.Response;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
-
 import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.api.entity.EntityLocal;
+import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument;
@@ -49,6 +42,12 @@ import org.apache.brooklyn.rest.util.WebResourceUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.time.Time;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
 
 @HaHotStateRequired
 public class EffectorResource extends AbstractBrooklynRestResource implements EffectorApi {
@@ -57,7 +56,7 @@ public class EffectorResource extends AbstractBrooklynRestResource implements Ef
 
     @Override
     public List<EffectorSummary> list(final String application, final String entityToken) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
         return FluentIterable
                 .from(entity.getEntityType().getEffectors())
                 .filter(new Predicate<Effector<?>>() {
@@ -79,7 +78,7 @@ public class EffectorResource extends AbstractBrooklynRestResource implements Ef
     @Override
     public Response invoke(String application, String entityToken, String effectorName,
             String timeout, Map<String, Object> parameters) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
 
         // TODO check effectors?
         Maybe<Effector<?>> effector = EffectorUtils.findEffectorDeclared(entity, effectorName);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
index e0e9430..e483d0b 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
@@ -23,10 +23,7 @@ import static com.google.common.collect.Iterables.transform;
 import java.util.List;
 import java.util.Map;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.entity.Entities;
@@ -41,6 +38,8 @@ import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.core.task.ValueResolver;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicates;
@@ -54,7 +53,7 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
 
     @Override
     public List<EntityConfigSummary> list(final String application, final String entityToken) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
         // TODO merge with keys which have values
         return Lists.newArrayList(transform(
                 entity.getEntityType().getConfigKeys(),
@@ -71,7 +70,7 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
     @Override
     public Map<String, Object> batchConfigRead(String application, String entityToken, Boolean raw) {
         // TODO: add test
-        EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        Entity entity = brooklyn().getEntity(application, entityToken);
         Map<ConfigKey<?>, ?> source = ((EntityInternal) entity).config().getBag().getAllConfigAsConfigKeyMap();
         Map<String, Object> result = Maps.newLinkedHashMap();
         for (Map.Entry<ConfigKey<?>, ?> ek : source.entrySet()) {
@@ -93,13 +92,13 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
     }
 
     public Object get(boolean preferJson, String application, String entityToken, String configKeyName, Boolean raw) {
-        EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        Entity entity = brooklyn().getEntity(application, entityToken);
         ConfigKey<?> ck = findConfig(entity, configKeyName);
         Object value = ((EntityInternal)entity).config().getRaw(ck).orNull();
         return resolving(value).preferJson(preferJson).asJerseyOutermostReturnValue(true).raw(raw).context(entity).timeout(ValueResolver.PRETTY_QUICK_WAIT).renderAs(ck).resolve();
     }
 
-    private ConfigKey<?> findConfig(EntityLocal entity, String configKeyName) {
+    private ConfigKey<?> findConfig(Entity entity, String configKeyName) {
         ConfigKey<?> ck = entity.getEntityType().getConfigKey(configKeyName);
         if (ck == null)
             ck = new BasicConfigKey<Object>(Object.class, configKeyName);
@@ -109,7 +108,7 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public void setFromMap(String application, String entityToken, Boolean recurse, Map newValues) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify entity '%s'",
                     Entitlements.getEntitlementContext().user(), entity);
@@ -134,7 +133,7 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public void set(String application, String entityToken, String configName, Boolean recurse, Object newValue) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify entity '%s'",
                     Entitlements.getEntitlementContext().user(), entity);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
index d1290d2..9575236 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
@@ -35,16 +35,13 @@ import javax.ws.rs.core.Response.ResponseBuilder;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriInfo;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.core.mgmt.BrooklynTags;
+import org.apache.brooklyn.core.mgmt.BrooklynTags.NamedStringTag;
 import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
 import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
-import org.apache.brooklyn.core.mgmt.BrooklynTags.NamedStringTag;
 import org.apache.brooklyn.core.mgmt.EntityManagementUtils.CreationResult;
 import org.apache.brooklyn.core.mgmt.entitlement.EntitlementPredicates;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
@@ -61,6 +58,8 @@ import org.apache.brooklyn.rest.util.WebResourceUtils;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.time.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.Collections2;
 import com.google.common.collect.FluentIterable;
@@ -112,7 +111,7 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
 
     @Override
     public Response addChildren(String applicationToken, String entityToken, Boolean start, String timeoutS, String yaml) {
-        final EntityLocal parent = brooklyn().getEntity(applicationToken, entityToken);
+        final Entity parent = brooklyn().getEntity(applicationToken, entityToken);
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, parent)) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify entity '%s'",
                     Entitlements.getEntitlementContext().user(), entityToken);
@@ -159,7 +158,7 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
 
     @Override
     public Response getIcon(String applicationId, String entityId) {
-        EntityLocal entity = brooklyn().getEntity(applicationId, entityId);
+        Entity entity = brooklyn().getEntity(applicationId, entityId);
         String url = entity.getIconUrl();
         if (url == null)
             return Response.status(Status.NO_CONTENT).build();
@@ -186,7 +185,7 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
 
     @Override
     public Response expunge(String application, String entity, boolean release) {
-        EntityLocal entityLocal = brooklyn().getEntity(application, entity);
+        Entity entityLocal = brooklyn().getEntity(application, entity);
         Task<?> task = brooklyn().expunge(entityLocal, release);
         TaskSummary summary = TaskTransformer.FROM_TASK.apply(task);
         return status(ACCEPTED).entity(summary).build();
@@ -206,7 +205,7 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
     @Override
     public List<LocationSummary> getLocations(String application, String entity) {
         List<LocationSummary> result = Lists.newArrayList();
-        EntityLocal e = brooklyn().getEntity(application, entity);
+        Entity e = brooklyn().getEntity(application, entity);
         for (Location l : e.getLocations()) {
             result.add(LocationTransformer.newInstance(mgmt(), l, LocationDetailLevel.NONE));
         }
@@ -215,7 +214,7 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
 
     @Override
     public String getSpec(String applicationToken, String entityToken) {
-        EntityLocal entity = brooklyn().getEntity(applicationToken, entityToken);
+        Entity entity = brooklyn().getEntity(applicationToken, entityToken);
         NamedStringTag spec = BrooklynTags.findFirst(BrooklynTags.YAML_SPEC_KIND, entity.tags().getTags());
         if (spec == null)
             return null;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
index c6bf9e7..9f865b3 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java
@@ -32,8 +32,10 @@ import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationDefinition;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.location.LocationConfigKeys;
+import org.apache.brooklyn.core.typereg.RegisteredTypePredicates;
 import org.apache.brooklyn.rest.api.LocationApi;
 import org.apache.brooklyn.rest.domain.LocationSpec;
 import org.apache.brooklyn.rest.domain.LocationSummary;
@@ -177,7 +179,7 @@ public class LocationResource extends AbstractBrooklynRestResource implements Lo
     }
     
     private int deleteAllVersions(String locationId) {
-        CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), locationId);
+        RegisteredType item = mgmt().getTypeRegistry().get(locationId);
         if (item==null) return 0; 
         brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
         return 1 + deleteAllVersions(locationId);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/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 469eb0c..fe28576 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
@@ -24,7 +24,6 @@ import java.util.Map;
 import javax.ws.rs.core.Response;
 
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
@@ -46,7 +45,7 @@ public class PolicyConfigResource extends AbstractBrooklynRestResource implement
     @Override
     public List<PolicyConfigSummary> list(
             final String application, final String entityToken, final String policyToken) {
-        EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        Entity entity = brooklyn().getEntity(application, entityToken);
         Policy policy = brooklyn().getPolicy(entity, policyToken);
 
         List<PolicyConfigSummary> result = Lists.newArrayList();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/SensorResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/SensorResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/SensorResource.java
index 90e434a..303c0df 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/SensorResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/SensorResource.java
@@ -24,9 +24,7 @@ import static com.google.common.collect.Iterables.transform;
 import java.util.List;
 import java.util.Map;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.api.entity.EntityLocal;
+import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.core.entity.EntityInternal;
@@ -40,6 +38,8 @@ import org.apache.brooklyn.rest.util.WebResourceUtils;
 import org.apache.brooklyn.util.core.task.ValueResolver;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Lists;
@@ -53,7 +53,7 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
     @SuppressWarnings("rawtypes")
     @Override
     public List<SensorSummary> list(final String application, final String entityToken) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
 
         return Lists.newArrayList(transform(filter(entity.getEntityType().getSensors(), AttributeSensor.class),
                 new Function<AttributeSensor, SensorSummary>() {
@@ -66,7 +66,7 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
 
     @Override
     public Map<String, Object> batchSensorRead(final String application, final String entityToken, final Boolean raw) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
         Map<String, Object> sensorMap = Maps.newHashMap();
         @SuppressWarnings("rawtypes")
         Iterable<AttributeSensor> sensors = filter(entity.getEntityType().getSensors(), AttributeSensor.class);
@@ -80,7 +80,7 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
     }
 
     protected Object get(boolean preferJson, String application, String entityToken, String sensorName, Boolean raw) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
         AttributeSensor<?> sensor = findSensor(entity, sensorName);
         Object value = entity.getAttribute(sensor);
         return resolving(value).preferJson(preferJson).asJerseyOutermostReturnValue(true).raw(raw).context(entity).timeout(ValueResolver.PRETTY_QUICK_WAIT).renderAs(sensor).resolve();
@@ -96,7 +96,7 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
         return get(true, application, entityToken, sensorName, raw);
     }
 
-    private AttributeSensor<?> findSensor(EntityLocal entity, String name) {
+    private AttributeSensor<?> findSensor(Entity entity, String name) {
         Sensor<?> s = entity.getEntityType().getSensor(name);
         if (s instanceof AttributeSensor) return (AttributeSensor<?>) s;
         return new BasicAttributeSensor<Object>(Object.class, name);
@@ -105,7 +105,7 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public void setFromMap(String application, String entityToken, Map newValues) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify entity '%s'",
                 Entitlements.getEntitlementContext().user(), entity);
@@ -125,7 +125,7 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public void set(String application, String entityToken, String sensorName, Object newValue) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify entity '%s'",
                 Entitlements.getEntitlementContext().user(), entity);
@@ -139,11 +139,11 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
     
     @Override
     public void delete(String application, String entityToken, String sensorName) {
-        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        final Entity entity = brooklyn().getEntity(application, entityToken);
         AttributeSensor<?> sensor = findSensor(entity, sensorName);
         if (log.isDebugEnabled())
             log.debug("REST user "+Entitlements.getEntitlementContext()+" deleting sensor "+sensorName);
-        ((EntityInternal)entity).removeAttribute(sensor);
+        ((EntityInternal)entity).sensors().remove(sensor);
     }
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
index d0a90ea..a9fa4dc 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
@@ -34,14 +34,7 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.FluentIterable;
-
 import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.mgmt.entitlement.EntitlementContext;
@@ -82,6 +75,11 @@ import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.CountdownTimer;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.FluentIterable;
 
 public class ServerResource extends AbstractBrooklynRestResource implements ServerApi {
 
@@ -156,7 +154,7 @@ public class ServerResource extends AbstractBrooklynRestResource implements Serv
                                     // Don't try to stop an already stopping app. Subsequent stops will complete faster
                                     // cancelling the first stop task.
                                     appState != Lifecycle.STOPPING) {
-                                stoppers.add(Entities.invokeEffector((EntityLocal)app, app, StartableApplication.STOP));
+                                stoppers.add(Entities.invokeEffector(app, app, StartableApplication.STOP));
                             } else {
                                 log.debug("App " + app + " is already stopping, will not stop second time. Will wait for original stop to complete.");
                             }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/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 e3e53f9..4e9895f 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
@@ -64,6 +64,7 @@ public class CatalogTransformer {
         Set<EffectorSummary> effectors = Sets.newTreeSet(SummaryComparators.nameComparator());
 
         try {
+            @SuppressWarnings({ "unchecked", "rawtypes" })
             EntitySpec<?> spec = (EntitySpec<?>) b.getCatalog().createSpec((CatalogItem) item);
             EntityDynamicType typeMap = BrooklynTypes.getDefinedEntityType(spec.getType());
             EntityType type = typeMap.getSnapshot();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java
index a0c4627..a434659 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java
@@ -26,7 +26,6 @@ import javax.annotation.Nullable;
 import org.apache.brooklyn.api.effector.Effector;
 import org.apache.brooklyn.api.effector.ParameterType;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.rest.domain.EffectorSummary;
 import org.apache.brooklyn.rest.domain.EffectorSummary.ParameterSummary;
 import org.apache.brooklyn.rest.util.WebResourceUtils;
@@ -42,7 +41,7 @@ import com.google.common.collect.Iterables;
 
 public class EffectorTransformer {
 
-    public static EffectorSummary effectorSummary(final EntityLocal entity, Effector<?> effector) {
+    public static EffectorSummary effectorSummary(final Entity entity, Effector<?> effector) {
         String applicationUri = "/v1/applications/" + entity.getApplicationId();
         String entityUri = applicationUri + "/entities/" + entity.getId();
         return new EffectorSummary(effector.getName(), effector.getReturnTypeName(),



[9/9] incubator-brooklyn git commit: This closes #993

Posted by he...@apache.org.
This closes #993


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

Branch: refs/heads/master
Commit: 48e4fe3ca0b5a00fbdec10bceec9f21edee25ded
Parents: c0021ca 2530296
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Nov 2 16:42:45 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Nov 2 16:42:45 2015 +0000

----------------------------------------------------------------------
 .../basic/relations/RelationshipType.java       |  38 ---
 .../brooklyn/api/catalog/BrooklynCatalog.java   |  47 +--
 .../brooklyn/api/catalog/CatalogItem.java       |  12 +-
 .../org/apache/brooklyn/api/entity/Entity.java  |   6 +
 .../internal/AbstractBrooklynObjectSpec.java    |  14 +-
 .../apache/brooklyn/api/mgmt/EntityManager.java |   2 +-
 .../brooklyn/api/mgmt/ManagementContext.java    |   4 +
 .../brooklyn/api/objs/BrooklynObject.java       |   3 +-
 .../brooklyn/api/objs/BrooklynObjectType.java   |  30 +-
 .../apache/brooklyn/api/objs/BrooklynType.java  |   3 +
 .../api/relations/RelationshipType.java         |  38 +++
 .../api/typereg/BrooklynTypeRegistry.java       |  68 ++++
 .../brooklyn/api/typereg/OsgiBundleWithUrl.java |  36 +++
 .../brooklyn/api/typereg/RegisteredType.java    |  65 ++++
 .../api/typereg/RegisteredTypeConstraint.java   |  45 +++
 .../catalog/internal/BasicBrooklynCatalog.java  | 141 +++------
 .../core/catalog/internal/CatalogBundleDto.java |   5 +-
 .../internal/CatalogItemDtoAbstract.java        |   2 +-
 .../core/catalog/internal/CatalogUtils.java     |  69 ++++-
 .../internal/JavaCatalogToSpecTransformer.java  |  23 +-
 .../brooklyn/core/entity/AbstractEntity.java    |  26 ++
 .../apache/brooklyn/core/entity/Entities.java   |  27 +-
 .../brooklyn/core/entity/EntityRelations.java   |   3 +-
 .../core/entity/factory/ApplicationBuilder.java |  10 +-
 .../core/location/BasicLocationRegistry.java    |  37 ++-
 .../core/location/CatalogLocationResolver.java  |   6 +-
 .../core/mgmt/EntityManagementUtils.java        |  25 +-
 .../OsgiBrooklynClassLoadingContext.java        |  17 +-
 .../brooklyn/core/mgmt/ha/OsgiManager.java      |  47 +--
 .../internal/AbstractManagementContext.java     |  14 +-
 .../core/mgmt/internal/LocalEntityManager.java  |   1 +
 .../mgmt/internal/ManagementTransitionMode.java |   2 +-
 .../NonDeploymentManagementContext.java         |  12 +-
 .../BrooklynMementoPersisterToObjectStore.java  |  10 +-
 .../core/mgmt/persist/XmlMementoSerializer.java |   3 +-
 .../AbstractBrooklynObjectRebindSupport.java    |   3 +-
 .../mgmt/rebind/RebindContextLookupContext.java |   9 +-
 .../core/mgmt/rebind/RebindIteration.java       |  30 +-
 .../mgmt/rebind/dto/MementosGenerators.java     |   3 +-
 .../relations/AbstractBasicRelationSupport.java |   3 +-
 .../relations/ByObjectBasicRelationSupport.java |   3 +-
 .../core/relations/EmptyRelationSupport.java    |   3 +-
 .../core/relations/RelationshipTypes.java       |   4 +-
 .../brooklyn/core/resolve/ResolveUtils.java     |  87 ------
 .../entity/CatalogEntitySpecResolver.java       |  60 ++--
 .../resolve/entity/JavaEntitySpecResolver.java  |   8 +
 .../core/typereg/BasicBrooklynTypeRegistry.java | 120 +++++++
 .../core/typereg/BasicOsgiBundleWithUrl.java    | 101 ++++++
 .../core/typereg/RegisteredTypeConstraints.java | 156 ++++++++++
 .../core/typereg/RegisteredTypePredicates.java  | 182 +++++++++++
 .../brooklyn/core/typereg/RegisteredTypes.java  | 245 +++++++++++++++
 .../apache/brooklyn/util/core/osgi/Osgis.java   |   2 +-
 .../core/catalog/internal/CatalogDtoTest.java   |   6 +-
 .../core/catalog/internal/CatalogScanTest.java  |   3 +-
 .../core/catalog/internal/CatalogTestUtils.java |  47 ---
 .../catalog/internal/CatalogVersioningTest.java |   2 +-
 .../mgmt/osgi/OsgiVersionMoreEntityTest.java    |  89 +++---
 .../mgmt/persist/XmlMementoSerializerTest.java  |   6 +-
 .../rebind/ActivePartialRebindVersionTest.java  |  22 +-
 .../core/mgmt/rebind/RebindCatalogItemTest.java |   6 +-
 .../core/mgmt/rebind/RebindTestFixture.java     |  22 +-
 .../core/relations/RelationshipTest.java        |   3 +-
 .../typereg/RegisteredTypePredicatesTest.java   | 172 ++++++++++
 .../BrooklynAssemblyTemplateInstantiator.java   |   9 +-
 .../BrooklynComponentTemplateResolver.java      |  24 +-
 .../BrooklynEntityDecorationResolver.java       |  31 +-
 .../spi/creation/CampToSpecTransformer.java     |   8 +-
 .../camp/brooklyn/spi/creation/CampUtils.java   |  53 +++-
 .../lookup/AbstractTemplateBrooklynLookup.java  |  14 +-
 .../lookup/AssemblyTemplateBrooklynLookup.java  |   3 +-
 ...PlatformComponentTemplateBrooklynLookup.java |   3 +-
 .../brooklyn/JavaWebAppsIntegrationTest.java    |   2 +-
 .../camp/brooklyn/PoliciesYamlTest.java         |  14 +-
 .../camp/brooklyn/TestEntityWithInitConfig.java |   3 +-
 .../TestSensorAndEffectorInitializer.java       |   1 -
 .../camp/brooklyn/WindowsYamlLiveTest.java      |   4 +-
 .../CatalogOsgiVersionMoreEntityTest.java       |  72 ++---
 .../brooklyn/catalog/CatalogXmlOsgiTest.java    |  20 +-
 .../brooklyn/catalog/CatalogYamlCombiTest.java  |  16 +-
 .../brooklyn/catalog/CatalogYamlEntityTest.java |  41 ++-
 .../catalog/CatalogYamlLocationTest.java        |  27 +-
 .../brooklyn/catalog/CatalogYamlPolicyTest.java |   8 +-
 .../brooklyn/catalog/CatalogYamlRebindTest.java |  37 +--
 .../catalog/CatalogYamlTemplateTest.java        |  44 +--
 .../catalog/CatalogYamlVersioningTest.java      |  58 ++--
 .../brooklyn/test/lite/CampYamlLiteTest.java    |  22 +-
 .../test/lite/TestAppAssemblyInstantiator.java  |   1 -
 .../apache/brooklyn/rest/BrooklynWebConfig.java |   2 +-
 .../resources/AbstractBrooklynRestResource.java |   1 -
 .../rest/resources/ApplicationResource.java     |  21 +-
 .../rest/resources/CatalogResource.java         |  42 +--
 .../rest/resources/EffectorResource.java        |  19 +-
 .../rest/resources/EntityConfigResource.java    |  17 +-
 .../brooklyn/rest/resources/EntityResource.java |  17 +-
 .../rest/resources/LocationResource.java        |   4 +-
 .../rest/resources/PolicyConfigResource.java    |   3 +-
 .../brooklyn/rest/resources/SensorResource.java |  22 +-
 .../brooklyn/rest/resources/ServerResource.java |  14 +-
 .../rest/transform/CatalogTransformer.java      |   1 +
 .../rest/transform/EffectorTransformer.java     |   3 +-
 .../rest/transform/EntityTransformer.java       |   3 +-
 .../rest/transform/PolicyTransformer.java       |   5 +-
 .../rest/util/BrooklynRestResourceUtils.java    | 310 +++++++++++--------
 .../brooklyn/rest/util/WebResourceUtils.java    |   2 +-
 .../brooklyn/rest/domain/ApplicationTest.java   |   3 +-
 .../rest/resources/ApplicationResourceTest.java |  11 +-
 .../rest/resources/CatalogResetTest.java        |   7 +-
 .../rest/resources/CatalogResourceTest.java     |   8 +-
 .../rest/resources/DescendantsTest.java         |  15 +-
 .../rest/resources/ScriptResourceTest.java      |  12 +-
 .../rest/resources/UsageResourceTest.java       |   9 +-
 .../brooklynnode/DeployBlueprintTest.java       |   3 +-
 .../rest/testing/mocks/CapitalizePolicy.java    |   1 +
 .../util/BrooklynRestResourceUtilsTest.java     |   4 -
 .../guava/IllegalStateExceptionSupplier.java    |  24 +-
 115 files changed, 2273 insertions(+), 1113 deletions(-)
----------------------------------------------------------------------



[6/9] incubator-brooklyn git commit: more converting CatalogItem access to RegisteredType

Posted by he...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java
index 399f9dc..70224aa 100644
--- a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java
+++ b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java
@@ -20,15 +20,10 @@ package org.apache.brooklyn.core.resolve.entity;
 
 import java.util.Set;
 
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider;
+import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,27 +36,25 @@ public class CatalogEntitySpecResolver extends AbstractEntitySpecResolver {
         super(RESOLVER_NAME);
     }
 
+    // in 0.9.0 we've changed this *not* to perform
+    // symbolicName = DeserializingClassRenamesProvider.findMappedName(symbolicName);
+    // in belief that this should only apply to *java* loads TODO-type-registry confirm this
+
     @Override
     protected boolean canResolve(String type, BrooklynClassLoadingContext loader) {
         String localType = getLocalType(type);
-        CatalogItem<Entity, EntitySpec<?>> item = getCatalogItem(mgmt, localType);
-        if (item != null) {
-            try {
-                //Keeps behaviour of previous functionality, but probably should throw instead when using disabled items.
-                checkUsable(item);
-                return true;
-            } catch (IllegalStateException e) {
-                return false;
-            }
-        } else {
-            return false;
-        }
+        RegisteredType item = mgmt.getTypeRegistry().get(localType);
+        if (item==null) return false;
+        //Keeps behaviour of previous functionality, but caller might be interested if item is disabled
+        if (item.isDisabled()) return false;
+        
+        return true;
     }
 
     @Override
     public EntitySpec<?> resolve(String type, BrooklynClassLoadingContext loader, Set<String> parentEncounteredTypes) {
         String localType = getLocalType(type);
-        CatalogItem<Entity, EntitySpec<?>> item = getCatalogItem(mgmt, localType);
+        RegisteredType item = mgmt.getTypeRegistry().get(localType);
 
         if (item == null) return null;
         checkUsable(item);
@@ -69,21 +62,14 @@ public class CatalogEntitySpecResolver extends AbstractEntitySpecResolver {
         //Take the symbolicName part of the catalog item only for recursion detection to prevent
         //cross referencing of different versions. Not interested in non-catalog item types.
         //Prevent catalog items self-referencing even if explicitly different version.
-        boolean nonRecursiveCall = !parentEncounteredTypes.contains(item.getSymbolicName());
-        if (nonRecursiveCall) {
-            // CatalogItem generics are just getting in the way, better get rid of them, we
-            // are casting anyway.
-            @SuppressWarnings({ "rawtypes" })
-            CatalogItem rawItem = item;
-            @SuppressWarnings({ "rawtypes", "unchecked" })
-            AbstractBrooklynObjectSpec rawSpec = EntityManagementUtils.createCatalogSpec(mgmt, rawItem, parentEncounteredTypes);
-            return (EntitySpec<?>) rawSpec;
-        } else {
-            return null;
-        }
+        boolean recursiveCall = parentEncounteredTypes.contains(item.getSymbolicName());
+        if (recursiveCall) return null;
+        return mgmt.getTypeRegistry().createSpec(item, 
+            RegisteredTypeConstraints.alreadyVisited(parentEncounteredTypes), 
+            EntitySpec.class);
     }
 
-    private void checkUsable(CatalogItem<Entity, EntitySpec<?>> item) {
+    private void checkUsable(RegisteredType item) {
         if (item.isDisabled()) {
             throw new IllegalStateException("Illegal use of disabled catalog item "+item.getSymbolicName()+":"+item.getVersion());
         } else if (item.isDeprecated()) {
@@ -91,9 +77,9 @@ public class CatalogEntitySpecResolver extends AbstractEntitySpecResolver {
         }
     }
 
-    protected CatalogItem<Entity,EntitySpec<?>> getCatalogItem(ManagementContext mgmt, String brooklynType) {
-        brooklynType = DeserializingClassRenamesProvider.findMappedName(brooklynType);
-        return CatalogUtils.getCatalogItemOptionalVersion(mgmt, Entity.class,  brooklynType);
-    }
+//    protected CatalogItem<Entity,EntitySpec<?>> getCatalogItem(ManagementContext mgmt, String brooklynType) {
+//        brooklynType = DeserializingClassRenamesProvider.findMappedName(brooklynType);
+//        return CatalogUtils.getCatalogItemOptionalVersion(mgmt, Entity.class,  brooklynType);
+//    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java
index b8ce013..047e11d 100644
--- a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java
+++ b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java
@@ -26,6 +26,7 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
+import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.Reflections;
 
@@ -37,6 +38,13 @@ public class JavaEntitySpecResolver extends AbstractEntitySpecResolver{
     }
 
     @Override
+    protected String getLocalType(String type) {
+        type = super.getLocalType(type);
+        type = DeserializingClassRenamesProvider.findMappedName(type);
+        return type;
+    }
+    
+    @Override
     protected boolean canResolve(String type, BrooklynClassLoadingContext loader) {
         String localType = getLocalType(type);
         Maybe<?> javaType = tryLoadJavaType(localType, loader);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
index 3d418e4..0a9a229 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
@@ -18,22 +18,21 @@
  */
 package org.apache.brooklyn.core.typereg;
 
+import javax.annotation.Nullable;
+
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
-import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.api.typereg.RegisteredTypeConstraint;
+import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.typereg.RegisteredTypes.JavaTypeImplementation;
 import org.apache.brooklyn.core.typereg.RegisteredTypes.RegisteredSpecType;
-import org.apache.brooklyn.core.typereg.RegisteredTypes.TypeImplementation;
-import org.apache.brooklyn.util.collections.MutableList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Iterables;
@@ -49,74 +48,73 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry {
         this.mgmt = mgmt;
     }
     
-    private static final Function<CatalogItem<?,?>,RegisteredType> CI_TO_RT = new Function<CatalogItem<?,?>, RegisteredType>() {
-        @Override
-        public RegisteredType apply(CatalogItem<?, ?> item) {
-            if (item==null) return null;
-            TypeImplementation impl = null;
-            if (item.getPlanYaml()!=null) {
-                impl = new TypeImplementation(null, item.getPlanYaml());
-            }
-            if (item.getJavaType()!=null) {
-                impl = new JavaTypeImplementation(item.getJavaType());
-            }
-            if (impl!=null) {
-                RegisteredSpecType type = new RegisteredSpecType(item.getSymbolicName(), item.getVersion(),
-                    item.getCatalogItemJavaType(), impl);
-                type.bundles = MutableList.<OsgiBundleWithUrl>copyOf(item.getLibraries());
-                type.displayName = item.getDisplayName();
-                type.description = item.getDescription();
-                type.iconUrl = item.getIconUrl();
-                
-                // TODO
-                // disabled, deprecated
-                // javaType, specType, registeredTypeName ...
-                // tags ?
-                return type;
-            }
-            throw new IllegalStateException("Unsupported catalog item "+item+" when trying to create RegisteredType");
-        }
-    };
-    
     public Iterable<RegisteredType> getAll() {
         return getAll(Predicates.alwaysTrue());
     }
     
+    @SuppressWarnings("deprecation")
     @Override
     public Iterable<RegisteredType> getAll(Predicate<? super RegisteredType> filter) {
-        return Iterables.filter(Iterables.transform(mgmt.getCatalog().getCatalogItems(), CI_TO_RT), filter);
+        return Iterables.filter(Iterables.transform(mgmt.getCatalog().getCatalogItems(), RegisteredTypes.CI_TO_RT), filter);
     }
 
+    @SuppressWarnings("deprecation")
     @Override
-    public RegisteredType get(String symbolicNameWithOptionalVersion, RegisteredTypeKind kind, Class<?> parentClass) {
+    public RegisteredType get(String symbolicName, String version, RegisteredTypeConstraint constraint) {
+        if (constraint==null) constraint = RegisteredTypeConstraints.any();
+        if (version==null) version = BrooklynCatalog.DEFAULT_VERSION;
+        
+        // TODO lookup here, using constraints
+        
+        // fallback to catalog
+        CatalogItem<?, ?> item = mgmt.getCatalog().getCatalogItem(symbolicName, version);
+        // TODO apply constraint
+        return RegisteredTypes.CI_TO_RT.apply( item );
+    }
+
+    @Override
+    public RegisteredType get(String symbolicName, String version) {
+        return get(symbolicName, version, null);
+    }
+    
+    @Override
+    public RegisteredType get(String symbolicNameWithOptionalVersion, RegisteredTypeConstraint constraint) {
         if (CatalogUtils.looksLikeVersionedId(symbolicNameWithOptionalVersion)) {
-            String id = CatalogUtils.getSymbolicNameFromVersionedId(symbolicNameWithOptionalVersion);
+            String symbolicName = CatalogUtils.getSymbolicNameFromVersionedId(symbolicNameWithOptionalVersion);
             String version = CatalogUtils.getVersionFromVersionedId(symbolicNameWithOptionalVersion);
-            return get(id, version, kind, parentClass);
+            return get(symbolicName, version, constraint);
         } else {
-            return get(symbolicNameWithOptionalVersion, BrooklynCatalog.DEFAULT_VERSION, kind, parentClass);
+            return get(symbolicNameWithOptionalVersion, BrooklynCatalog.DEFAULT_VERSION, constraint);
         }
     }
 
     @Override
-    public RegisteredType get(String symbolicName, String version, RegisteredTypeKind kind, Class<?> parentClass) {
-        return CI_TO_RT.apply( mgmt.getCatalog().getCatalogItem(symbolicName, version) );
+    public RegisteredType get(String symbolicNameWithOptionalVersion) {
+        return get(symbolicNameWithOptionalVersion, (RegisteredTypeConstraint)null);
     }
 
+    @SuppressWarnings({ "deprecation", "unchecked", "rawtypes" })
     @Override
-    public RegisteredType get(String symbolicName, String version) {
-        return get(symbolicName, version, null, null);
-    }
-
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    @Override
-    public <T extends AbstractBrooklynObjectSpec> T createSpec(RegisteredType type, Class<T> specKind) {
+    public <SpecT extends AbstractBrooklynObjectSpec<?,?>> SpecT createSpec(RegisteredType type, @Nullable RegisteredTypeConstraint constraint, Class<SpecT> specSuperType) {
         if (!(type instanceof RegisteredSpecType)) { 
             throw new IllegalStateException("Cannot create spec from type "+type);
         }
+        if (constraint!=null) {
+            if (constraint.getKind()!=null && constraint.getKind()!=RegisteredTypeKind.SPEC) {
+                throw new IllegalStateException("Cannot create spec with constraint "+constraint);
+            }
+            if (constraint.getEncounteredTypes().contains(type.getSymbolicName())) {
+                // avoid recursive cycle
+                // TODO implement using java if permitted
+            }
+        }
+        constraint = RegisteredTypeConstraints.extendedWithSpecSuperType(constraint, specSuperType);
+
+        // TODO look up in the actual registry
         
-        CatalogItem item = mgmt.getCatalog().getCatalogItem(type.getSymbolicName(), type.getVersion());
-        return (T) mgmt.getCatalog().createSpec(item);
+        // fallback: look up in (legacy) catalog
+        CatalogItem item = (CatalogItem) mgmt.getCatalog().getCatalogItem(type.getSymbolicName(), type.getVersion());
+        return (SpecT) BasicBrooklynCatalog.internalCreateSpecWithTransformers(mgmt, item, constraint.getEncounteredTypes());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
new file mode 100644
index 0000000..7f49335
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.typereg;
+
+import groovy.xml.Entity;
+
+import java.util.Set;
+
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
+import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.objs.BrooklynObjectType;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
+import org.apache.brooklyn.api.typereg.RegisteredTypeConstraint;
+import org.apache.brooklyn.util.collections.MutableSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableSet;
+
+public class RegisteredTypeConstraints {
+
+    private static final Logger log = LoggerFactory.getLogger(RegisteredTypeConstraints.BasicRegisteredTypeConstraint.class);
+    
+    public final static class BasicRegisteredTypeConstraint implements RegisteredTypeConstraint {
+        private RegisteredTypeKind kind;
+        private Class<?> javaSuperType;
+        private Set<String> encounteredTypes;
+        
+        private BasicRegisteredTypeConstraint() {}
+        
+        public BasicRegisteredTypeConstraint(RegisteredTypeConstraint source) {
+            if (source==null) return;
+            
+            this.kind = source.getKind();
+            this.javaSuperType = source.getJavaSuperType();
+            this.encounteredTypes = source.getEncounteredTypes();
+        }
+
+        @Override
+        public RegisteredTypeKind getKind() {
+            return kind;
+        }
+        
+        @Override
+        public Class<?> getJavaSuperType() {
+            if (javaSuperType==null) return Object.class;
+            return javaSuperType;
+        }
+
+        @Override
+        public Set<String> getEncounteredTypes() {
+            if (encounteredTypes==null) return ImmutableSet.of();
+            return ImmutableSet.<String>copyOf(encounteredTypes);
+        }
+        
+        @Override
+        public String toString() {
+            return super.toString()+"["+kind+","+javaSuperType+","+encounteredTypes+"]";
+        }
+    }
+
+    /** returns a constraint which allows anything */
+    public static RegisteredTypeConstraint any() {
+        return new BasicRegisteredTypeConstraint();
+    }
+
+    public static RegisteredTypeConstraint alreadyVisited(Set<String> encounteredTypeSymbolicNames) {
+        BasicRegisteredTypeConstraint result = new BasicRegisteredTypeConstraint();
+        result.encounteredTypes = encounteredTypeSymbolicNames;
+        return result;
+    }
+    public static RegisteredTypeConstraint alreadyVisited(Set<String> encounteredTypeSymbolicNames, String anotherEncounteredType) {
+        BasicRegisteredTypeConstraint result = new BasicRegisteredTypeConstraint();
+        result.encounteredTypes = MutableSet.copyOf(encounteredTypeSymbolicNames);
+        if (anotherEncounteredType!=null) result.encounteredTypes.add(anotherEncounteredType);
+        return result;
+    }
+    
+    private static RegisteredTypeConstraint of(RegisteredTypeKind kind, Class<? extends BrooklynObject> javaSuperType) {
+        BasicRegisteredTypeConstraint result = new BasicRegisteredTypeConstraint();
+        result.kind = kind;
+        result.javaSuperType = javaSuperType;
+        return result;
+    }
+
+    public static RegisteredTypeConstraint spec(Class<? extends BrooklynObject> javaSuperType) {
+        return of(RegisteredTypeKind.SPEC, javaSuperType);
+    }
+
+    public static <T extends AbstractBrooklynObjectSpec<?,?>> RegisteredTypeConstraint extendedWithSpecSuperType(RegisteredTypeConstraint source, Class<T> specSuperType) {
+        Class<?> superType = lookupTargetTypeForSpec(specSuperType);
+        BasicRegisteredTypeConstraint constraint = new BasicRegisteredTypeConstraint(source);
+        if (source==null) source = constraint;
+        if (source.getJavaSuperType()==null || source.getJavaSuperType().isAssignableFrom( superType )) {
+            // the constraint was weaker than present; return the new constraint
+            return constraint;
+        }
+        if (superType.isAssignableFrom( source.getJavaSuperType() )) {
+            // the constraint was already for something more specific; ignore what we've inferred here
+            return source;
+        }
+        // trickier situation; the constraint had a type not compatible with the spec type; log a warning and leave alone
+        // (e.g. caller specified some java super type which is not a super or sub of the spec target type;
+        // this may be because the caller specified a Spec as the type supertype, which is wrong;
+        // or they may have specified an interface along a different hierarchy, which we discouraged
+        // as it will make filtering/indexing more complex)
+        log.warn("Ambiguous spec supertypes ("+specSuperType+" for target "+source.getJavaSuperType()+"); "
+            + "it is recommended that any registered type constraint for a spec be compatible with the spec type");
+        return source;
+    }
+    
+    /** given a spec, returns the class of the item it targets, for instance {@link EntitySpec} for {@link Entity} */
+    private static <T extends AbstractBrooklynObjectSpec<?,?>> Class<? extends BrooklynObject> lookupTargetTypeForSpec(Class<T> specSuperType) {
+        if (specSuperType==null) return BrooklynObject.class;
+        BrooklynObjectType best = null;
+
+        for (BrooklynObjectType t: BrooklynObjectType.values()) {
+            if (t.getSpecType()==null) continue;
+            if (!t.getSpecType().isAssignableFrom(specSuperType)) continue;
+            // on equality, exit immediately
+            if (t.getSpecType().equals(specSuperType)) return t.getInterfaceType();
+            // else pick which is best
+            if (best==null) { best = t; continue; }
+            // if t is more specific, it is better (handles case when e.g. a Policy is a subclass of Entity)
+            if (best.getSpecType().isAssignableFrom(t.getSpecType())) { best = t; continue; }
+        }
+        if (best==null) {
+            log.warn("Unexpected spec supertype ("+specSuperType+"); treating as any "+BrooklynObject.class, new Throwable("Trace for unexpected spec supertype"));
+            return BrooklynObject.class;
+        }
+        // the spec is more specific, but we're not familiar with it here; return the best
+        return best.getInterfaceType();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
index 7c719f2..271add5 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
@@ -20,6 +20,7 @@ package org.apache.brooklyn.core.typereg;
 
 import javax.annotation.Nullable;
 
+import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
@@ -34,37 +35,37 @@ import com.google.common.base.Predicates;
 
 public class RegisteredTypePredicates {
 
-//    public static Predicate<RegisteredType> deprecated(final boolean deprecated) {
-//        return new DeprecatedEqualTo(deprecated);
-//    }
-//
-//    private static class DeprecatedEqualTo implements Predicate<RegisteredType> {
-//        private final boolean deprecated;
-//        
-//        public DeprecatedEqualTo(boolean deprecated) {
-//            this.deprecated = deprecated;
-//        }
-//        @Override
-//        public boolean apply(@Nullable RegisteredType item) {
-//            return (item != null) && item.isDeprecated() == deprecated;
-//        }
-//    }
-//
-//    public static Predicate<RegisteredType> disabled(boolean disabled) {
-//        return new DisabledEqualTo(disabled);
-//    }
-//
-//    private static class DisabledEqualTo implements Predicate<RegisteredType> {
-//        private final boolean disabled;
-//        
-//        public DisabledEqualTo(boolean disabled) {
-//            this.disabled = disabled;
-//        }
-//        @Override
-//        public boolean apply(@Nullable RegisteredType item) {
-//            return (item != null) && item.isDisabled() == disabled;
-//        }
-//    }
+    public static Predicate<RegisteredType> deprecated(final boolean deprecated) {
+        return new DeprecatedEqualTo(deprecated);
+    }
+
+    private static class DeprecatedEqualTo implements Predicate<RegisteredType> {
+        private final boolean deprecated;
+        
+        public DeprecatedEqualTo(boolean deprecated) {
+            this.deprecated = deprecated;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            return (item != null) && item.isDeprecated() == deprecated;
+        }
+    }
+
+    public static Predicate<RegisteredType> disabled(boolean disabled) {
+        return new DisabledEqualTo(disabled);
+    }
+
+    private static class DisabledEqualTo implements Predicate<RegisteredType> {
+        private final boolean disabled;
+        
+        public DisabledEqualTo(boolean disabled) {
+            this.disabled = disabled;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            return (item != null) && item.isDisabled() == disabled;
+        }
+    }
 
     @SuppressWarnings("unused")
     private static final Function<RegisteredType,String> ID_OF_ITEM_TRANSFORMER_ANONYMOUS = new Function<RegisteredType, String>() {
@@ -140,6 +141,10 @@ public class RegisteredTypePredicates {
     }
 
     public static final Predicate<RegisteredType> IS_APPLICATION = javaTypeAssignableFrom(Application.class);
+    // TODO do we need this?  introduced already deprecated in 0.9.0 so can be removed, or enabled
+    @Deprecated
+    public static final Predicate<RegisteredType> IS_TEMPLATE = IS_APPLICATION;
+    
     public static final Predicate<RegisteredType> IS_ENTITY = javaTypeAssignableFrom(Entity.class);
     public static final Predicate<RegisteredType> IS_LOCATION = javaTypeAssignableFrom(Location.class);
     public static final Predicate<RegisteredType> IS_POLICY = javaTypeAssignableFrom(Policy.class);
@@ -161,20 +166,26 @@ public class RegisteredTypePredicates {
         }
     }
  
-//    public static Predicate<RegisteredType> isBestVersion(final ManagementContext mgmt) {
-//        return new IsBestVersion(mgmt);
-//    }
-//    
-//    private static class IsBestVersion implements Predicate<RegisteredType> {
-//        private final ManagementContext mgmt;
-//        
-//        public IsBestVersion(ManagementContext mgmt) {
-//            this.mgmt = mgmt;
-//        }
-//        @Override
-//        public boolean apply(@Nullable RegisteredType item) {
-//            return CatalogUtils.isBestVersion(mgmt, item);
-//        }
-//    }
-    
+    public static Predicate<RegisteredType> isBestVersion(final ManagementContext mgmt) {
+        return new IsBestVersion(mgmt);
+    }
+
+    private static class IsBestVersion implements Predicate<RegisteredType> {
+        private final ManagementContext mgmt;
+
+        public IsBestVersion(ManagementContext mgmt) {
+            this.mgmt = mgmt;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            return isBestVersion(mgmt, item);
+        }
+    }
+ 
+    public static boolean isBestVersion(ManagementContext mgmt, RegisteredType item) {
+        RegisteredType bestVersion = mgmt.getTypeRegistry().get(item.getSymbolicName(), BrooklynCatalog.DEFAULT_VERSION);
+        if (bestVersion==null) return false;
+        return (bestVersion.getVersion().equals(item.getVersion()));
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
index 0668d0a..6013f6d 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
@@ -21,15 +21,56 @@ package org.apache.brooklyn.core.typereg;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.core.plan.PlanToSpecTransformer;
+import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.javalang.JavaClassNames;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
 
 public class RegisteredTypes {
 
+    /** @deprecated since it was introduced in 0.9.0; for backwards compatibility only, may be removed at any point */
+    @Deprecated
+    static final Function<CatalogItem<?,?>,RegisteredType> CI_TO_RT = new Function<CatalogItem<?,?>, RegisteredType>() {
+        @Override
+        public RegisteredType apply(CatalogItem<?, ?> item) {
+            return of(item);
+        }
+    };
+    
+    /** @deprecated since it was introduced in 0.9.0; for backwards compatibility only, may be removed at any point */
+    @Deprecated
+    public static RegisteredType of(CatalogItem<?, ?> item) {
+        if (item==null) return null;
+        TypeImplementation impl = null;
+        if (item.getPlanYaml()!=null) {
+            impl = new TypeImplementation(null, item.getPlanYaml());
+        } else if (item.getJavaType()!=null) {
+            impl = new JavaTypeImplementation(item.getJavaType());
+        } else {
+            throw new IllegalStateException("Unsupported catalog item "+item+" when trying to create RegisteredType");
+        }
+        
+        RegisteredSpecType type = new RegisteredSpecType(item.getSymbolicName(), item.getVersion(),
+            item.getCatalogItemJavaType(), impl);
+        type.bundles = MutableList.<OsgiBundleWithUrl>copyOf(item.getLibraries());
+        type.displayName = item.getDisplayName();
+        type.description = item.getDescription();
+        type.iconUrl = item.getIconUrl();
+        type.disabled = item.isDisabled();
+        type.deprecated = item.isDeprecated();
+
+        // TODO
+        // javaType, specType, registeredTypeName ...
+        // tags ?
+        return type;
+    }
+
     /** Visitor adapter which can be used to ensure all kinds are supported */
     public static abstract class RegisteredTypeKindVisitor<T> {
         public T visit(RegisteredType type) {
@@ -60,6 +101,8 @@ public class RegisteredTypes {
         String displayName;
         String description;
         String iconUrl;
+        boolean deprecated;
+        boolean disabled;
 
         // TODO ensure this is re-populated on rebind
         transient Class<?> javaType;
@@ -106,9 +149,27 @@ public class RegisteredTypes {
         }
         
         @Override
+        public boolean isDisabled() {
+            return disabled;
+        }
+        
+        @Override
+        public boolean isDeprecated() {
+            return deprecated;
+        }
+        
+        @Override
         public Class<?> getJavaType() {
             return javaType;
         }
+        
+        @Override
+        public String toString() {
+            return JavaClassNames.simpleClassName(this)+"["+getId()+
+                (isDisabled() ? ";DISABLED" : "")+
+                (isDeprecated() ? ";deprecated" : "")+
+                "]";
+        }
     }
 
     // TODO
@@ -131,12 +192,12 @@ public class RegisteredTypes {
     }
 
     public static class TypeImplementation {
-        final String kind;
+        final String format;
         final Object data;
         
         public TypeImplementation(String kind, Object data) {
             super();
-            this.kind = kind;
+            this.format = kind;
             this.data = data;
         }
 
@@ -145,8 +206,8 @@ public class RegisteredTypes {
          * but in general we should look to determine the kind as early as possible and use that
          * to retrieve the appropriate such transformer.
          */
-        public String getKind() {
-            return kind;
+        public String getFormat() {
+            return format;
         }
         
         public Object getData() {
@@ -155,18 +216,18 @@ public class RegisteredTypes {
     }
     
     public static class JavaTypeImplementation extends TypeImplementation {
-        public static final String KIND = "java";
+        public static final String FORMAT = "java";
         public JavaTypeImplementation(String javaType) {
-            super(KIND, javaType);
+            super(FORMAT, javaType);
         }
         public String getJavaType() { return (String)getData(); }
     }
     
 //    // TODO remove, unless we want it
 //    public static class CampYamlTypeImplementation extends TypeImplementation {
-//        public static final String KIND = "camp";
+//        public static final String FORMAT = "camp";
 //        public CampYamlTypeImplementation(String javaType) {
-//            super(KIND, javaType);
+//            super(FORMAT, javaType);
 //        }
 //        public String getCampYaml() { return (String)getData(); }
 //    }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java
deleted file mode 100644
index a448418..0000000
--- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.catalog.internal;
-
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
-
-import com.google.common.annotations.Beta;
-
-public class CatalogTestUtils {
-
-    /** creates entity spec with the java type of a catalog item;
-     * would be nice to have this in {@link CatalogUtils},
-     * but the logic for parsing the yaml is buried in camp code,
-     * so it's a little bit hard to make this a first class method.
-     * <p>
-     * (this impl ignores many things, including config and location.)
-     */
-    @Beta
-    public static EntitySpec<?> createEssentialEntitySpec(ManagementContext mgmt, CatalogItem<?, ?> catalogItem) {
-        BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(mgmt, catalogItem);
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        EntitySpec<?> spec = EntitySpec.create( (Class)loader.loadClass(catalogItem.getJavaType()) );
-        spec.catalogItemId(catalogItem.getId());
-        return spec;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java
index b434aa1..118ca39 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java
@@ -18,34 +18,24 @@
  */
 package org.apache.brooklyn.core.mgmt.osgi;
 
-import org.apache.brooklyn.util.osgi.OsgiTestResources;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
 import java.util.List;
 
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.Framework;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.policy.PolicySpec;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.catalog.internal.CatalogEntityItemDto;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemDtoAbstract;
-import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.effector.Effectors;
 import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.objs.proxy.InternalEntityFactory;
@@ -53,14 +43,23 @@ import org.apache.brooklyn.core.objs.proxy.InternalPolicyFactory;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
+import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.core.osgi.OsgiTestBase;
 import org.apache.brooklyn.util.core.osgi.Osgis;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.os.Os;
+import org.apache.brooklyn.util.osgi.OsgiTestResources;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.launch.Framework;
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
-import org.apache.brooklyn.util.core.osgi.OsgiTestBase;
 
 
 /** 
@@ -135,18 +134,18 @@ public class OsgiVersionMoreEntityTest {
         }
     }
     
-    protected CatalogItem<?, ?> addCatalogItemWithTypeAsName(String type, String version, String ...libraries) {
+    protected RegisteredType addCatalogItemWithTypeAsName(String type, String version, String ...libraries) {
         return addCatalogItemWithNameAndType(type, version, type, libraries);
     }
-    protected CatalogItem<?, ?> addCatalogItemWithNameAndType(String symName, String version, String type, String ...libraries) {
+    protected RegisteredType addCatalogItemWithNameAndType(String symName, String version, String type, String ...libraries) {
         return addCatalogItemWithNameAndType(mgmt, symName, version, type, libraries);
     }
 
     @SuppressWarnings("deprecation")
-    static CatalogItem<?, ?> addCatalogItemWithNameAndType(ManagementContext mgmt, String symName, String version, String type, String ...libraries) {
+    static RegisteredType addCatalogItemWithNameAndType(ManagementContext mgmt, String symName, String version, String type, String ...libraries) {
         CatalogEntityItemDto c1 = newCatalogItemWithNameAndType(symName, version, type, libraries);
         mgmt.getCatalog().addItem(c1);
-        CatalogItem<?, ?> c2 = mgmt.getCatalog().getCatalogItem(symName, version);
+        RegisteredType c2 = mgmt.getTypeRegistry().get(symName, version);
         Preconditions.checkNotNull(c2, "Item "+type+":"+version+" was not found after adding it");
         return c2;
     }
@@ -163,12 +162,13 @@ public class OsgiVersionMoreEntityTest {
         return c1;
     }
 
-    protected Entity addItemFromCatalog(CatalogItem<?, ?> c2) {
+    protected Entity addItemFromCatalog(RegisteredType c2) {
         return addItemFromCatalog(mgmt, app, c2);
     }
     
-    public static Entity addItemFromCatalog(ManagementContext mgmt, TestApplication parent, CatalogItem<?, ?> c2) {
-        return parent.createAndManageChild( CatalogTestUtils.createEssentialEntitySpec(mgmt, c2) );
+    @SuppressWarnings("unchecked")
+    public static Entity addItemFromCatalog(ManagementContext mgmt, TestApplication parent, RegisteredType c2) {
+        return parent.createAndManageChild( mgmt.getTypeRegistry().createSpec(c2, null, EntitySpec.class) );
     }
 
     public static void assertV1MethodCall(Entity me) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
@@ -199,7 +199,7 @@ public class OsgiVersionMoreEntityTest {
         return me.invoke(Effectors.effector(String.class, "sayHI").buildAbstract(), ImmutableMap.of("name", "brooklyn")).getUnchecked();
     }
 
-    public static CatalogItem<?, ?> addMoreEntityV1(ManagementContext mgmt, String versionToRegister) {
+    public static RegisteredType addMoreEntityV1(ManagementContext mgmt, String versionToRegister) {
         TestResourceUnavailableException.throwIfResourceUnavailable(OsgiVersionMoreEntityTest.class, BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
         return addCatalogItemWithNameAndType(mgmt,
             OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
@@ -207,7 +207,7 @@ public class OsgiVersionMoreEntityTest {
             OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
             BROOKLYN_TEST_MORE_ENTITIES_V1_URL);
     }
-    public static CatalogItem<?, ?> addMoreEntityV2(ManagementContext mgmt, String versionToRegister) {
+    public static RegisteredType addMoreEntityV2(ManagementContext mgmt, String versionToRegister) {
         TestResourceUnavailableException.throwIfResourceUnavailable(OsgiVersionMoreEntityTest.class, BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
         return addCatalogItemWithNameAndType(mgmt,
             OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
@@ -221,7 +221,7 @@ public class OsgiVersionMoreEntityTest {
     public void testMoreEntitiesV1() throws Exception {
         TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
 
-        CatalogItem<?, ?> c2 = addMoreEntityV1(mgmt, TEST_VERSION);
+        RegisteredType c2 = addMoreEntityV1(mgmt, TEST_VERSION);
         
         // test load and instantiate
         Entity me = addItemFromCatalog(c2);
@@ -231,18 +231,13 @@ public class OsgiVersionMoreEntityTest {
         assertV1EffectorCall(me);
         
         // test adding a child gets the right type; this time by entity parent hierarchy
-        BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(mgmt, c2);
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        Entity me2 = me.addChild(EntitySpec.create( (Class)loader.loadClass(c2.getJavaType()) ));
+        @SuppressWarnings({ "unchecked" })
+        Entity me2 = me.addChild( mgmt.getTypeRegistry().createSpec(c2, null, EntitySpec.class) );
         Assert.assertEquals(me2.getCatalogItemId(), CatalogUtils.getVersionedId(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION));
     }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    protected PolicySpec<?> getPolicySpec(CatalogItem<?, ?> cp) {
-        BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(mgmt, cp);
-        PolicySpec spec = PolicySpec.create( (Class)loader.loadClass(cp.getJavaType()) );
-        spec.catalogItemId(cp.getId());
-        return spec;
+    protected PolicySpec<?> getPolicySpec(RegisteredType cp) {
+        return mgmt.getTypeRegistry().createSpec(cp, null, PolicySpec.class);
     }
 
     @Test
@@ -250,7 +245,7 @@ public class OsgiVersionMoreEntityTest {
         TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
         TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_OSGI_ENTITIES_PATH);
 
-        CatalogItem<?, ?> c2 = addCatalogItemWithTypeAsName(
+        RegisteredType c2 = addCatalogItemWithTypeAsName(
                 OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
                 TEST_VERSION,
                 BROOKLYN_TEST_MORE_ENTITIES_V1_URL);
@@ -258,13 +253,13 @@ public class OsgiVersionMoreEntityTest {
         // test load and instantiate
         Entity me = addItemFromCatalog(c2);
 
-        CatalogItem<?, ?> cp = addCatalogItemWithTypeAsName(
+        RegisteredType cp = addCatalogItemWithTypeAsName(
                 OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_SIMPLE_POLICY,
                 TEST_VERSION,
                 BROOKLYN_TEST_OSGI_ENTITIES_URL);
         me.policies().add(getPolicySpec(cp));
         
-        Assert.assertEquals(me.getPolicies().size(), 1, "Wrong number of policies: "+me.getPolicies());
+        Assert.assertEquals(me.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(me.policies()));
         
         String catalogItemId = Iterables.getOnlyElement( me.policies() ).getCatalogItemId();
         Assert.assertNotNull(catalogItemId);
@@ -277,7 +272,7 @@ public class OsgiVersionMoreEntityTest {
     public void testMoreEntitiesV2FailsWithoutBasicTestOsgiEntitiesBundle() throws Exception {
         TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_MORE_ENTITIES_V2_PATH);
 
-        CatalogItem<?, ?> c2 = addCatalogItemWithTypeAsName(
+        RegisteredType c2 = addCatalogItemWithTypeAsName(
                 OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
                 TEST_VERSION,
                 BROOKLYN_TEST_MORE_ENTITIES_V2_URL);
@@ -299,7 +294,7 @@ public class OsgiVersionMoreEntityTest {
     public void testMoreEntitiesV2() throws Exception {
         TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_MORE_ENTITIES_V2_PATH);
 
-        CatalogItem<?, ?> c2 = addCatalogItemWithTypeAsName(
+        RegisteredType c2 = addCatalogItemWithTypeAsName(
                 OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
                 TEST_VERSION,
                 BROOKLYN_TEST_MORE_ENTITIES_V2_URL,
@@ -311,7 +306,7 @@ public class OsgiVersionMoreEntityTest {
         
         assertV2MethodCall(me);
         assertV2EffectorCall(me);
-        Assert.assertEquals(me.getPolicies().size(), 1, "Wrong number of policies: "+me.getPolicies());
+        Assert.assertEquals(me.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(me.policies()));
         
         String catalogItemId = Iterables.getOnlyElement( me.policies() ).getCatalogItemId();
         Assert.assertNotNull(catalogItemId);
@@ -334,11 +329,11 @@ public class OsgiVersionMoreEntityTest {
                 BROOKLYN_TEST_MORE_ENTITIES_V2_URL, BROOKLYN_TEST_OSGI_ENTITIES_URL);
         
         // test load and instantiate
-        Entity me = addItemFromCatalog( mgmt.getCatalog().getCatalogItem(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION) );
+        Entity me = addItemFromCatalog( mgmt.getTypeRegistry().get(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION) );
         
         assertV2MethodCall(me);
         assertV2EffectorCall(me);
-        Assert.assertEquals(me.getPolicies().size(), 1, "Wrong number of policies: "+me.getPolicies());
+        Assert.assertEquals(me.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(me.policies()));
     }
 
     @Test
@@ -356,7 +351,7 @@ public class OsgiVersionMoreEntityTest {
                 BROOKLYN_TEST_MORE_ENTITIES_V1_URL);
         
         // test load and instantiate
-        Entity me = addItemFromCatalog( mgmt.getCatalog().getCatalogItem(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION) );
+        Entity me = addItemFromCatalog( mgmt.getTypeRegistry().get(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION) );
         /*
          * WARNING - Weird maven-bundle-plugin and OSGi behaviour.  Some caveats:
          * <p>
@@ -383,7 +378,7 @@ public class OsgiVersionMoreEntityTest {
          */
         assertV1MethodCall(me);
         assertV1EffectorCall(me);
-        Assert.assertEquals(me.getPolicies().size(), 0, "Wrong number of policies: "+me.getPolicies());
+        Assert.assertEquals(me.policies().size(), 0, "Wrong number of policies: "+MutableList.copyOf(me.policies()));
     }
 
     @Test
@@ -438,20 +433,20 @@ public class OsgiVersionMoreEntityTest {
 
         // test entity resolution
         
-        Entity v2 = addItemFromCatalog( mgmt.getCatalog().getCatalogItem("v2", TEST_VERSION) );
+        Entity v2 = addItemFromCatalog( mgmt.getTypeRegistry().get("v2", TEST_VERSION) );
         assertV2MethodCall(v2);
         assertV2EffectorCall(v2);
-        Assert.assertEquals(v2.getPolicies().size(), 1, "Wrong number of policies: "+v2.getPolicies());
+        Assert.assertEquals(v2.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(v2.policies()));
 
-        Entity v2_evil = addItemFromCatalog( mgmt.getCatalog().getCatalogItem("v2-evil", TEST_VERSION) );
+        Entity v2_evil = addItemFromCatalog( mgmt.getTypeRegistry().get("v2-evil", TEST_VERSION) );
         assertV2EvilTwinMethodCall(v2_evil);
         assertV2EvilTwinEffectorCall(v2_evil);
-        Assert.assertEquals(v2_evil.getPolicies().size(), 1, "Wrong number of policies: "+v2_evil.getPolicies());
+        Assert.assertEquals(v2_evil.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(v2_evil.policies()));
 
-        Entity v1 = addItemFromCatalog( mgmt.getCatalog().getCatalogItem("v1", TEST_VERSION) );
+        Entity v1 = addItemFromCatalog( mgmt.getTypeRegistry().get("v1", TEST_VERSION) );
         assertV1MethodCall(v1);
         assertV1EffectorCall(v1);
-        Assert.assertEquals(v1.getPolicies().size(), 0, "Wrong number of policies: "+v1.getPolicies());
+        Assert.assertEquals(v1.policies().size(), 0, "Wrong number of policies: "+MutableList.copyOf(v1.policies()));
     }
 
     // TODO versioning (WIP until #92), install both V1 and V2 with version number, and test that both work

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
index 6bd850a..662e78d 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
@@ -43,9 +43,9 @@ import org.apache.brooklyn.api.objs.BrooklynObjectType;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.Feed;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemDtoAbstract;
-import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.location.SimulatedLocation;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest;
@@ -304,11 +304,11 @@ public class XmlMementoSerializerTest {
         TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
         ManagementContext mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build();
         try {
-            CatalogItem<?, ?> ci = OsgiVersionMoreEntityTest.addMoreEntityV1(mgmt, "1.0");
+            RegisteredType ci = OsgiVersionMoreEntityTest.addMoreEntityV1(mgmt, "1.0");
             
             EntitySpec<DynamicCluster> spec = EntitySpec.create(DynamicCluster.class)
                 .configure(DynamicCluster.INITIAL_SIZE, 1)
-                .configure(DynamicCluster.MEMBER_SPEC, CatalogTestUtils.createEssentialEntitySpec(mgmt, ci));
+                .configure(DynamicCluster.MEMBER_SPEC, mgmt.getTypeRegistry().createSpec(ci, null, EntitySpec.class));
     
             serializer.setLookupContext(new LookupContextImpl(mgmt,
                 ImmutableList.<Entity>of(), ImmutableList.<Location>of(), ImmutableList.<Policy>of(),

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java
index f420b43..7781b9b 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java
@@ -18,20 +18,18 @@
  */
 package org.apache.brooklyn.core.mgmt.rebind;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest;
-import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl;
 import org.apache.brooklyn.core.mgmt.rebind.transformer.CompoundTransformer;
 import org.apache.brooklyn.entity.group.DynamicCluster;
 import org.apache.brooklyn.util.collections.MutableList;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
 
 public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp {
 
@@ -54,13 +52,13 @@ public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp {
     
     @Test
     public void testSwitchingVersions() throws Exception {
-        CatalogItem<?, ?> catV1 = OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0");
+        RegisteredType catV1 = OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0");
         Entity childV1 = OsgiVersionMoreEntityTest.addItemFromCatalog(origManagementContext, origApp, catV1);
         
         OsgiVersionMoreEntityTest.assertV1EffectorCall(childV1);
         
         // simply adding to catalog doesn't change
-        CatalogItem<?, ?> catV2 = OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1");
+        RegisteredType catV2 = OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1");
         OsgiVersionMoreEntityTest.assertV1EffectorCall(childV1);
         Entity child2V2 = OsgiVersionMoreEntityTest.addItemFromCatalog(origManagementContext, origApp, catV2);
         OsgiVersionMoreEntityTest.assertV2EffectorCall(child2V2);
@@ -83,8 +81,8 @@ public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp {
 
     @Test
     public void testSwitchingVersionsInCluster() throws Exception {
-        CatalogItem<?, ?> catV1 = OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0");
-        CatalogItem<?, ?> catV2 = OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1");
+        RegisteredType catV1 = OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0");
+        RegisteredType catV2 = OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1");
         
         // could do a yaml test in a downstream project (no camp available here)
 //        CreationResult<List<Entity>, List<String>> clusterR = EntityManagementUtils.addChildren(origApp, 
@@ -94,7 +92,7 @@ public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp {
 //            + "  entitySpec: { type: "+catV1.getId()+" }\n", true);
         DynamicCluster cluster = origApp.createAndManageChild(EntitySpec.create(DynamicCluster.class)
             .configure(DynamicCluster.INITIAL_SIZE, 1)
-            .configure(DynamicCluster.MEMBER_SPEC, CatalogTestUtils.createEssentialEntitySpec(origManagementContext, catV1))
+            .configure(DynamicCluster.MEMBER_SPEC, origManagementContext.getTypeRegistry().createSpec(catV1, null, EntitySpec.class))
             );
         cluster.start(MutableList.of(origApp.newSimulatedLocation()));
         Entity childV1 = MutableList.copyOf(cluster.getChildren()).get(1);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
index 2bea3a2..e336a4f 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
@@ -29,6 +29,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.BrooklynFeatureEnablement;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.CatalogDto;
@@ -44,6 +45,7 @@ import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -262,14 +264,14 @@ public class RebindCatalogItemTest extends RebindTestFixtureWithApp {
         item.setDeprecated(true);
         catalog.persist(item);
         rebindAndAssertCatalogsAreEqual();
-        CatalogItem<?, ?> catalogItemAfterRebind = newManagementContext.getCatalog().getCatalogItem("rebind-yaml-catalog-item-test", TEST_VERSION);
+        RegisteredType catalogItemAfterRebind = newManagementContext.getTypeRegistry().get("rebind-yaml-catalog-item-test", TEST_VERSION);
         assertTrue(catalogItemAfterRebind.isDeprecated(), "Expected item to be deprecated");
     }
 
     protected void deleteItem(ManagementContext mgmt, String symbolicName, String version) {
         mgmt.getCatalog().deleteCatalogItem(symbolicName, version);
         LOG.info("Deleted item from catalog: {}:{}", symbolicName, version);
-        assertCatalogDoesNotContain(mgmt.getCatalog(), symbolicName, version);
+        Assert.assertNull( mgmt.getTypeRegistry().get(symbolicName, version) );
     }
     
     private void rebindAndAssertCatalogsAreEqual() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
index 921ea9e..0135229 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
@@ -317,14 +317,14 @@ public abstract class RebindTestFixture<T extends StartableApplication> {
         assertEquals(actual.getLibraries(), expected.getLibraries());
     }
     
-    protected void assertCatalogContains(BrooklynCatalog catalog, CatalogItem<?, ?> item) {
-        CatalogItem<?, ?> found = catalog.getCatalogItem(item.getSymbolicName(), item.getVersion());
-        assertNotNull(found);
-        assertCatalogItemsEqual(found, item);
-    }
-    
-    protected void assertCatalogDoesNotContain(BrooklynCatalog catalog, String symbolicName, String version) {
-        CatalogItem<?, ?> found = catalog.getCatalogItem(symbolicName, version);
-        assertNull(found);
-    }
+//    protected void assertCatalogContains(BrooklynCatalog catalog, CatalogItem<?, ?> item) {
+//        CatalogItem<?, ?> found = catalog.getCatalogItem(item.getSymbolicName(), item.getVersion());
+//        assertNotNull(found);
+//        assertCatalogItemsEqual(found, item);
+//    }
+//    
+//    protected void assertCatalogDoesNotContain(BrooklynCatalog catalog, String symbolicName, String version) {
+//        CatalogItem<?, ?> found = catalog.getCatalogItem(symbolicName, version);
+//        assertNull(found);
+//    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java b/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java
new file mode 100644
index 0000000..145c056
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.typereg;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+import org.apache.brooklyn.api.catalog.CatalogItem;
+import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder;
+import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
+import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicates;
+
+
+public class RegisteredTypePredicatesTest {
+    private LocalManagementContext mgmt;
+    
+    @BeforeMethod(alwaysRun = true)
+    public void setUp() throws Exception {
+        mgmt = LocalManagementContextForTests.newInstance();
+    }
+    
+    @AfterMethod(alwaysRun = true)
+    public void tearDown() throws Exception {
+        if (mgmt != null) Entities.destroyAll(mgmt);
+    }
+
+    @Test
+    public void testDisplayName() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0")
+                .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity")
+                .displayName("myname")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.displayName(Predicates.equalTo("myname")).apply(item));
+        assertFalse(RegisteredTypePredicates.displayName(Predicates.equalTo("wrongname")).apply(item));
+    }
+    
+    @Test
+    public void testDeprecated() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0")
+                .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.deprecated(false).apply(item));
+        assertFalse(RegisteredTypePredicates.deprecated(true).apply(item));
+        
+        item = deprecateItem(item);
+        
+        assertFalse(RegisteredTypePredicates.deprecated(false).apply(item));
+        assertTrue(RegisteredTypePredicates.deprecated(true).apply(item));
+    }
+    
+    @Test
+    public void testDisabled() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0")
+                .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.disabled(false).apply(item));
+        assertFalse(RegisteredTypePredicates.disabled(true).apply(item));
+        
+        item = disableItem(item);
+        
+        assertFalse(RegisteredTypePredicates.disabled(false).apply(item));
+        assertTrue(RegisteredTypePredicates.disabled(true).apply(item));
+    }
+    
+    @Test
+    public void testIsCatalogItemType() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0")
+                .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.IS_ENTITY.apply(item));
+        assertFalse(RegisteredTypePredicates.IS_LOCATION.apply(item));
+    }
+    
+    @Test
+    public void testSymbolicName() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0")
+                .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.symbolicName(Predicates.equalTo("foo")).apply(item));
+        assertFalse(RegisteredTypePredicates.symbolicName(Predicates.equalTo("wrongname")).apply(item));
+    }
+
+    @Test
+    public void testIsBestVersion() {
+        RegisteredType itemV1 = createItem(CatalogItemBuilder.newEntity("foo", "1.0")
+                .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+        RegisteredType itemV2 = createItem(CatalogItemBuilder.newEntity("foo", "2.0")
+                .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+        RegisteredType itemV3Disabled = createItem(CatalogItemBuilder.newEntity("foo", "3.0")
+                .disabled(true)
+                .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.isBestVersion(mgmt).apply(itemV2));
+        assertFalse(RegisteredTypePredicates.isBestVersion(mgmt).apply(itemV1));
+        assertFalse(RegisteredTypePredicates.isBestVersion(mgmt).apply(itemV3Disabled));
+    }
+
+    @Test
+    public void testEntitledToSee() {
+        // TODO No entitlements configured, so everything allowed - therefore test not thorough enough!
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0")
+                .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.entitledToSee(mgmt).apply(item));
+    }
+
+    // TODO do we need this predicate?
+//    @SuppressWarnings("deprecation")
+//    @Test
+//    public void testJavaType() {
+//        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0")
+//                .javaType("org.apache.brooklyn.entity.stock.BasicEntity")
+//                .build());
+//
+//        assertTrue(RegisteredTypePredicates.javaType(Predicates.equalTo("org.apache.brooklyn.entity.stock.BasicEntity")).apply(item));
+//        assertFalse(RegisteredTypePredicates.javaType(Predicates.equalTo("wrongtype")).apply(item));
+//    }
+
+    @SuppressWarnings("deprecation")
+    protected RegisteredType createItem(CatalogItem<?,?> item) {
+        mgmt.getCatalog().addItem(item);
+        return RegisteredTypes.of(item);
+    }
+    
+    @SuppressWarnings({ "deprecation" })
+    protected <T, SpecT> RegisteredType deprecateItem(RegisteredType orig) {
+        CatalogItem<?,?> item = (CatalogItem<?,?>) mgmt.getCatalog().getCatalogItem(orig.getSymbolicName(), orig.getVersion());
+        item.setDeprecated(true);
+        mgmt.getCatalog().persist(item);
+        return RegisteredTypes.of(item);
+    }
+    
+    @SuppressWarnings({ "deprecation" })
+    protected RegisteredType disableItem(RegisteredType orig) {
+        CatalogItem<?,?> item = (CatalogItem<?,?>) mgmt.getCatalog().getCatalogItem(orig.getSymbolicName(), orig.getVersion());
+        item.setDisabled(true);
+        mgmt.getCatalog().persist(item);
+        return RegisteredTypes.of(item);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index b1044ee..a273c50 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -145,20 +145,20 @@ public class BrooklynComponentTemplateResolver {
         return serviceSpecResolver.accepts(type, loader);
     }
 
-    public <T extends Entity> EntitySpec<T> resolveSpec(Set<String> encounteredRegisteredTypeIds) {
+    public <T extends Entity> EntitySpec<T> resolveSpec(Set<String> encounteredRegisteredTypeSymbolicNames) {
         if (alreadyBuilt.getAndSet(true))
             throw new IllegalStateException("Spec can only be used once: "+this);
 
-        EntitySpec<?> spec = serviceSpecResolver.resolve(type, loader, encounteredRegisteredTypeIds);
+        EntitySpec<?> spec = serviceSpecResolver.resolve(type, loader, encounteredRegisteredTypeSymbolicNames);
 
         if (spec == null) {
             // Try to provide some troubleshooting details
             final String msgDetails;
-            RegisteredType item = mgmt.getTypeRegistry().get(Strings.removeFromStart(type, "catalog:"), null, null);
+            RegisteredType item = mgmt.getTypeRegistry().get(Strings.removeFromStart(type, "catalog:"));
             String proto = Urls.getProtocol(type);
-            if (item != null && encounteredRegisteredTypeIds.contains(item.getSymbolicName())) {
+            if (item != null && encounteredRegisteredTypeSymbolicNames.contains(item.getSymbolicName())) {
                 msgDetails = "Cycle between catalog items detected, starting from " + type +
-                        ". Other catalog items being resolved up the stack are " + encounteredRegisteredTypeIds +
+                        ". Other catalog items being resolved up the stack are " + encounteredRegisteredTypeSymbolicNames +
                         ". Tried loading it as a Java class instead but failed.";
             } else if (proto != null) {
                 msgDetails = "The reference " + type + " looks like a URL (running the CAMP Brooklyn assembly-template instantiator) but the protocol " +
@@ -170,7 +170,7 @@ public class BrooklynComponentTemplateResolver {
             throw new IllegalStateException("Unable to create spec for type " + type + ". " + msgDetails);
         }
 
-        populateSpec(spec, encounteredRegisteredTypeIds);
+        populateSpec(spec, encounteredRegisteredTypeSymbolicNames);
 
         @SuppressWarnings("unchecked")
         EntitySpec<T> typedSpec = (EntitySpec<T>) spec;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
index 181265d..b1d5dce 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
@@ -32,6 +32,7 @@ import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynYamlTypeInstantiator.InstantiatorFromKey;
+import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 
@@ -108,9 +109,9 @@ public abstract class BrooklynEntityDecorationResolver<DT> {
             String policyType = decoLoader.getTypeName().get();
             ManagementContext mgmt = instantiator.loader.getManagementContext();
             
-            RegisteredType item = mgmt.getTypeRegistry().get(policyType, BrooklynTypeRegistry.RegisteredTypeKind.SPEC, Policy.class);
+            RegisteredType item = mgmt.getTypeRegistry().get(policyType, RegisteredTypeConstraints.spec(Policy.class));
             PolicySpec<? extends Policy> spec;
-            if (item!=null) spec = mgmt.getTypeRegistry().createSpec(item, PolicySpec.class);
+            if (item!=null) spec = mgmt.getTypeRegistry().createSpec(item, null, PolicySpec.class);
             else spec = PolicySpec.create(decoLoader.getType(Policy.class));
             spec.configure( decoLoader.getConfigMap() );
             decorations.add(spec);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
index cacd201..35feb65 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
@@ -87,7 +87,7 @@ public class CampToSpecTransformer implements PlanToSpecTransformer {
     @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
     public <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createCatalogSpec(CatalogItem<T, SpecT> item, Set<String> encounteredTypes) {
-        // Ignore old-style java type catalog items
+        // Ignore old-style java type catalog items - there is a different (deprecated) transformer for that
         if (item.getPlanYaml() == null) {
             throw new PlanNotRecognizedException("Old style catalog item " + item + " not supported.");
         }
@@ -99,17 +99,6 @@ public class CampToSpecTransformer implements PlanToSpecTransformer {
         return (SpecT) CampCatalogUtils.createSpec(mgmt, (CatalogItem)item, encounteredTypes);
     }
 
-    // TODO
-//    @SuppressWarnings({ "unchecked", "rawtypes" })
-//    public <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createCatalogSpec(RegisteredType type, Set<String> encounteredTypes) {
-//        if (encounteredTypes.contains(type.getSymbolicName())) {
-//            throw new IllegalStateException("Already encountered types " + encounteredTypes + " must not contain catalog item being resolver " + type.getSymbolicName());
-//        }
-//
-//        // Not really clear what should happen to the top-level attributes, ignored until a good use case appears.
-//        return (SpecT) CampCatalogUtils.createSpec(mgmt, type, encounteredTypes);
-//    }
-
     @Override
     public void injectManagementContext(ManagementContext mgmt) {
         this.mgmt = mgmt;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
index f3050c5..6390425 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
@@ -26,7 +26,6 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.policy.Policy;
@@ -40,16 +39,15 @@ import org.apache.brooklyn.camp.spi.pdp.DeploymentPlan;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
 import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.core.objs.BrooklynObjectInternal.ConfigurationSupportInternal;
 import org.apache.brooklyn.core.resolve.ResolveUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.yaml.Yamls;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 
+//TODO-type-registry
 public class CampUtils {
 
     public static List<EntitySpec<?>> createServiceSpecs(String plan, BrooklynClassLoadingContext loader, Set<String> encounteredTypes) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
index f65abb1..f038e0f 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
@@ -18,16 +18,16 @@
  */
 package org.apache.brooklyn.camp.brooklyn.spi.lookup;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.spi.AbstractResource;
 import org.apache.brooklyn.camp.spi.PlatformRootSummary;
 import org.apache.brooklyn.camp.spi.collection.ResolvableLink;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public abstract class AbstractTemplateBrooklynLookup<T extends AbstractResource>  extends AbstractBrooklynResourceLookup<T> {
 
@@ -39,7 +39,7 @@ public abstract class AbstractTemplateBrooklynLookup<T extends AbstractResource>
 
     @Override
     public T get(String id) {
-        CatalogItem<?,?> item = getCatalogItem(id);
+        RegisteredType item = bmc.getTypeRegistry().get(id);
         if (item==null) {
             log.warn("Could not find item '"+id+"' in Brooklyn catalog; returning null");
             return null;
@@ -47,11 +47,7 @@ public abstract class AbstractTemplateBrooklynLookup<T extends AbstractResource>
         return adapt(item);
     }
 
-    private CatalogItem<?, ?> getCatalogItem(String versionedId) {
-        return CatalogUtils.getCatalogItemOptionalVersion(bmc, versionedId);
-    }
-
-    public abstract T adapt(CatalogItem<?,?> item);
+    public abstract T adapt(RegisteredType item);
 
     protected ResolvableLink<T> newLink(CatalogItem<? extends Entity,EntitySpec<?>> li) {
         return newLink(li.getId(), li.getDisplayName());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
index af0b596..e30d9c6 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
@@ -26,6 +26,7 @@ import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynAssemblyTemplateInstantiator;
 import org.apache.brooklyn.camp.spi.AssemblyTemplate;
 import org.apache.brooklyn.camp.spi.PlatformRootSummary;
@@ -39,7 +40,7 @@ public class AssemblyTemplateBrooklynLookup extends AbstractTemplateBrooklynLook
     }
 
     @Override
-    public AssemblyTemplate adapt(CatalogItem<?,?> item) {
+    public AssemblyTemplate adapt(RegisteredType item) {
         return AssemblyTemplate.builder().
                 name(item.getDisplayName()).
                 id(item.getId()).

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
index 19f5917..d70129a 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
@@ -25,6 +25,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.spi.PlatformComponentTemplate;
 import org.apache.brooklyn.camp.spi.PlatformRootSummary;
 import org.apache.brooklyn.camp.spi.collection.ResolvableLink;
@@ -37,7 +38,7 @@ public class PlatformComponentTemplateBrooklynLookup extends AbstractTemplateBro
     }
 
     @Override
-    public PlatformComponentTemplate adapt(CatalogItem<?,?> item) {
+    public PlatformComponentTemplate adapt(RegisteredType item) {
         return PlatformComponentTemplate.builder().
                 name(item.getDisplayName()).
                 id(item.getId()).

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java
index 6e9e39c..3d991db 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java
@@ -231,7 +231,7 @@ public class JavaWebAppsIntegrationTest {
             Entity cluster = brooklynMgmt.getEntityManager().getEntity(clusterComponent.getId());
             log.info("pc1 - "+clusterComponent+" - "+cluster);
             
-            Assert.assertEquals(cluster.getPolicies().size(), 1);
+            Assert.assertEquals(cluster.policies().size(), 1);
             Policy policy = cluster.policies().iterator().next();
             Assert.assertNotNull(policy);
             Assert.assertTrue(policy instanceof AutoScalerPolicy, "policy="+policy);


[8/9] incubator-brooklyn git commit: type registry code review comments

Posted by he...@apache.org.
type registry code review comments


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

Branch: refs/heads/master
Commit: 25302969df175a92a5e02b9f709964de97809d79
Parents: 50ebfaf
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Nov 2 15:43:40 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Nov 2 15:47:35 2015 +0000

----------------------------------------------------------------------
 .../brooklyn/api/catalog/CatalogItem.java       |  5 +-
 .../api/typereg/BrooklynTypeRegistry.java       |  2 +-
 .../brooklyn/api/typereg/OsgiBundleWithUrl.java |  2 +-
 .../core/catalog/internal/CatalogBundleDto.java |  4 +-
 .../internal/JavaCatalogToSpecTransformer.java  |  5 +-
 .../brooklyn/core/mgmt/ha/OsgiManager.java      |  2 +-
 .../brooklyn/core/resolve/ResolveUtils.java     | 84 --------------------
 .../core/typereg/BasicOsgiBundleWithUrl.java    |  4 +-
 .../core/typereg/RegisteredTypeConstraints.java | 12 ++-
 .../core/typereg/RegisteredTypePredicates.java  |  9 ---
 .../brooklyn/core/typereg/RegisteredTypes.java  |  9 ++-
 .../apache/brooklyn/util/core/osgi/Osgis.java   |  2 +-
 .../camp/brooklyn/spi/creation/CampUtils.java   | 55 ++++++++++++-
 .../brooklyn/catalog/CatalogYamlRebindTest.java |  6 +-
 .../rest/util/BrooklynRestResourceUtils.java    |  8 +-
 15 files changed, 89 insertions(+), 120 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java b/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
index 5d9b5ee..d27436e 100644
--- a/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
+++ b/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
@@ -41,7 +41,7 @@ public interface CatalogItem<T,SpecT> extends BrooklynObject, Rebindable {
     }
     
     public static interface CatalogBundle extends OsgiBundleWithUrl {
-        /** @deprecated since 0.9.0, use {@link #isFullDetailKnown()} */
+        /** @deprecated since 0.9.0, use {@link #isNameResolved()} */
         public boolean isNamed();
     }
 
@@ -70,7 +70,8 @@ public interface CatalogItem<T,SpecT> extends BrooklynObject, Rebindable {
     /** @return The type of the spec e.g. EntitySpec corresponding to {@link #getCatalogItemJavaType()} */
     public Class<SpecT> getSpecType();
     
-    /** @return The underlying java type of the item represented, or null if not known (e.g. if it comes from yaml) */
+    /** @return The underlying java type of the item represented, if not described via a YAML spec.
+     * Normally null (and the type comes from yaml). */
     @Nullable public String getJavaType();
 
     /** @deprecated since 0.7.0. Use {@link #getDisplayName} */

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java b/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
index e13f2e6..3ade1db 100644
--- a/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
+++ b/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
@@ -40,7 +40,7 @@ public interface BrooklynTypeRegistry {
     }
     
     Iterable<RegisteredType> getAll();
-    Iterable<RegisteredType> getAll(Predicate<? super RegisteredType> alwaysTrue);
+    Iterable<RegisteredType> getAll(Predicate<? super RegisteredType> filter);
     
     /** @return The item matching the given given 
      * {@link RegisteredType#getSymbolicName() symbolicName} 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java b/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
index ec3ef40..e8b278b 100644
--- a/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
+++ b/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
@@ -31,6 +31,6 @@ public interface OsgiBundleWithUrl {
     
     /** @return true if we have a name and version for this bundle;
      * false if not, e.g. if we only know the URL and we haven't loaded it yet */
-    public boolean isFullDetailKnown();
+    public boolean isNameResolved();
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
index 51a4757..d3ce7ac 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
@@ -44,12 +44,12 @@ public class CatalogBundleDto implements CatalogBundle {
     }
 
     @Override
-    public boolean isFullDetailKnown() {
+    public boolean isNameResolved() {
         return symbolicName != null && version != null;
     }
     
     @Override
-    public boolean isNamed() { return isFullDetailKnown(); }
+    public boolean isNamed() { return isNameResolved(); }
 
     @Override
     public String getSymbolicName() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java
index 742625a..7df9adf 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java
@@ -44,7 +44,6 @@ import org.slf4j.LoggerFactory;
  * with structure, only a single type.
  */
 public class JavaCatalogToSpecTransformer implements PlanToSpecTransformer {
-    @SuppressWarnings("unused")
     private static final Logger log = LoggerFactory.getLogger(JavaCatalogToSpecTransformer.class);
 
     private ManagementContext mgmt;
@@ -73,8 +72,12 @@ public class JavaCatalogToSpecTransformer implements PlanToSpecTransformer {
     public <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createCatalogSpec(
             CatalogItem<T, SpecT> item, Set<String> encounteredTypes) throws PlanNotRecognizedException {
         if (item.getJavaType() != null) {
+            log.warn("Deprecated functionality (since 0.9.0). Using old-style xml catalog items with java type attribute for " + item);
             Class<?> type;
             try {
+                // java types were deprecated before we added osgi support so this isn't necessary,
+                // but it doesn't hurt (and if we re-instate a class+bundle approach for RegisteredType 
+                // we will want to do this)
                 type = CatalogUtils.newClassLoadingContext(mgmt, item).loadClass(item.getJavaType());
             } catch (Exception e) {
                 Exceptions.propagateIfFatal(e);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
index e906e3a..0e941bd 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
@@ -171,7 +171,7 @@ public class OsgiManager {
     }
 
     public static boolean isBundleNameEqualOrAbsent(CatalogBundle bundle, Bundle b) {
-        return !bundle.isFullDetailKnown() ||
+        return !bundle.isNameResolved() ||
                 (bundle.getSymbolicName().equals(b.getSymbolicName()) &&
                 bundle.getVersion().equals(b.getVersion().toString()));
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/core/src/main/java/org/apache/brooklyn/core/resolve/ResolveUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/resolve/ResolveUtils.java b/core/src/main/java/org/apache/brooklyn/core/resolve/ResolveUtils.java
deleted file mode 100644
index 6ecbe96..0000000
--- a/core/src/main/java/org/apache/brooklyn/core/resolve/ResolveUtils.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.resolve;
-
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.policy.Policy;
-import org.apache.brooklyn.api.policy.PolicySpec;
-import org.apache.brooklyn.api.typereg.RegisteredType;
-import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.core.objs.BrooklynObjectInternal.ConfigurationSupportInternal;
-import org.apache.brooklyn.util.guava.Maybe;
-
-@Deprecated /** @deprecated since 0.9.0 never belonged here, and not used much; new principled TypeRegistry simplifies things */
-// only used for camp
-// TODO-type-registry
-public class ResolveUtils {
-
-    @SuppressWarnings("unchecked")
-    public static PolicySpec<? extends Policy> resolveSpec(
-            String versionedId,
-            BrooklynClassLoadingContext loader,
-            Set<String> encounteredCatalogTypes) {
-        
-        PolicySpec<? extends Policy> spec;
-        RegisteredType item = loader.getManagementContext().getTypeRegistry().get(versionedId);
-        if (item != null && !encounteredCatalogTypes.contains(item.getSymbolicName())) {
-            return loader.getManagementContext().getTypeRegistry().createSpec(item, null, PolicySpec.class);
-        } else {
-            // TODO-type-registry pass the loader in to the above, and allow it to load with the loader
-            spec = PolicySpec.create(loader.loadClass(versionedId, Policy.class));
-        }
-        return spec;
-    }
-
-    public static LocationSpec<?> resolveLocationSpec(
-            String type,
-            Map<String, Object> brooklynConfig,
-            BrooklynClassLoadingContext loader) {
-        Maybe<Class<? extends Location>> javaClass = loader.tryLoadClass(type, Location.class);
-        if (javaClass.isPresent()) {
-            LocationSpec<?> spec = LocationSpec.create(javaClass.get());
-            if (brooklynConfig != null) {
-                spec.configure(brooklynConfig);
-            }
-            return spec;
-        } else {
-            Maybe<Location> loc = loader.getManagementContext().getLocationRegistry().resolve(type, false, brooklynConfig);
-            if (loc.isPresent()) {
-                // TODO extensions?
-                Map<String, Object> locConfig = ((ConfigurationSupportInternal)loc.get().config()).getBag().getAllConfig();
-                Class<? extends Location> locType = loc.get().getClass();
-                Set<Object> locTags = loc.get().tags().getTags();
-                String locDisplayName = loc.get().getDisplayName();
-                return LocationSpec.create(locType)
-                        .configure(locConfig)
-                        .displayName(locDisplayName)
-                        .tags(locTags);
-            } else {
-                throw new IllegalStateException("No class or resolver found for location type "+type);
-            }
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
index c21ca98..1c8cc40 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
@@ -47,14 +47,14 @@ public class BasicOsgiBundleWithUrl implements CatalogBundle, OsgiBundleWithUrl
     }
 
     @Override
-    public boolean isFullDetailKnown() {
+    public boolean isNameResolved() {
         return symbolicName != null && version != null;
     }
     
     @Override
     @Deprecated //see super
     public boolean isNamed() {
-        return isFullDetailKnown();
+        return isNameResolved();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
index 7f49335..9d59343 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
@@ -22,6 +22,8 @@ import groovy.xml.Entity;
 
 import java.util.Set;
 
+import javax.annotation.Nullable;
+
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 import org.apache.brooklyn.api.objs.BrooklynObject;
@@ -38,6 +40,7 @@ public class RegisteredTypeConstraints {
 
     private static final Logger log = LoggerFactory.getLogger(RegisteredTypeConstraints.BasicRegisteredTypeConstraint.class);
     
+    /** Immutable (from caller's perspective) record of a constraint */
     public final static class BasicRegisteredTypeConstraint implements RegisteredTypeConstraint {
         private RegisteredTypeKind kind;
         private Class<?> javaSuperType;
@@ -45,7 +48,7 @@ public class RegisteredTypeConstraints {
         
         private BasicRegisteredTypeConstraint() {}
         
-        public BasicRegisteredTypeConstraint(RegisteredTypeConstraint source) {
+        public BasicRegisteredTypeConstraint(@Nullable RegisteredTypeConstraint source) {
             if (source==null) return;
             
             this.kind = source.getKind();
@@ -83,13 +86,14 @@ public class RegisteredTypeConstraints {
 
     public static RegisteredTypeConstraint alreadyVisited(Set<String> encounteredTypeSymbolicNames) {
         BasicRegisteredTypeConstraint result = new BasicRegisteredTypeConstraint();
-        result.encounteredTypes = encounteredTypeSymbolicNames;
+        result.encounteredTypes = encounteredTypeSymbolicNames == null ? ImmutableSet.<String>of() : ImmutableSet.copyOf(encounteredTypeSymbolicNames);
         return result;
     }
     public static RegisteredTypeConstraint alreadyVisited(Set<String> encounteredTypeSymbolicNames, String anotherEncounteredType) {
         BasicRegisteredTypeConstraint result = new BasicRegisteredTypeConstraint();
-        result.encounteredTypes = MutableSet.copyOf(encounteredTypeSymbolicNames);
-        if (anotherEncounteredType!=null) result.encounteredTypes.add(anotherEncounteredType);
+        MutableSet<String> encounteredTypes = MutableSet.copyOf(encounteredTypeSymbolicNames);
+        encounteredTypes.addIfNotNull(anotherEncounteredType);
+        result.encounteredTypes = encounteredTypes.asUnmodifiable();
         return result;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
index 271add5..3560e47 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
@@ -67,15 +67,6 @@ public class RegisteredTypePredicates {
         }
     }
 
-    @SuppressWarnings("unused")
-    private static final Function<RegisteredType,String> ID_OF_ITEM_TRANSFORMER_ANONYMOUS = new Function<RegisteredType, String>() {
-        @Override @Nullable
-        public String apply(@Nullable RegisteredType input) {
-            if (input==null) return null;
-            return input.getId();
-        }
-    };
-
     public static final Function<RegisteredType,String> ID_OF_ITEM_TRANSFORMER = new IdOfItemTransformer();
     
     private static class IdOfItemTransformer implements Function<RegisteredType,String> {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
index 6013f6d..8cddde2 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
@@ -22,15 +22,15 @@ import java.util.Collection;
 import java.util.List;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 import org.apache.brooklyn.api.typereg.RegisteredType;
-import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.core.plan.PlanToSpecTransformer;
-import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
 
 public class RegisteredTypes {
 
@@ -58,7 +58,7 @@ public class RegisteredTypes {
         
         RegisteredSpecType type = new RegisteredSpecType(item.getSymbolicName(), item.getVersion(),
             item.getCatalogItemJavaType(), impl);
-        type.bundles = MutableList.<OsgiBundleWithUrl>copyOf(item.getLibraries());
+        type.bundles = item.getLibraries()==null ? ImmutableList.<OsgiBundleWithUrl>of() : ImmutableList.<OsgiBundleWithUrl>copyOf(item.getLibraries());
         type.displayName = item.getDisplayName();
         type.description = item.getDescription();
         type.iconUrl = item.getIconUrl();
@@ -76,8 +76,9 @@ public class RegisteredTypes {
         public T visit(RegisteredType type) {
             if (type==null) throw new NullPointerException("Registered type must not be null");
             if (type instanceof RegisteredSpecType) {
-                visitSpec((RegisteredSpecType)type);
+                return visitSpec((RegisteredSpecType)type);
             }
+            // others go here
             throw new IllegalStateException("Unexpected registered type: "+type.getClass());
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java b/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java
index 9b94f57..6d5dc91 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java
@@ -133,7 +133,7 @@ public class Osgis {
         }
 
         public BundleFinder bundle(CatalogBundle bundle) {
-            if (bundle.isFullDetailKnown()) {
+            if (bundle.isNameResolved()) {
                 symbolicName(bundle.getSymbolicName());
                 version(bundle.getVersion());
             }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
index 6390425..bcb18df 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
@@ -26,10 +26,12 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.policy.PolicySpec;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.CampPlatform;
 import org.apache.brooklyn.camp.brooklyn.BrooklynCampConstants;
 import org.apache.brooklyn.camp.brooklyn.api.AssemblyTemplateSpecInstantiator;
@@ -39,8 +41,9 @@ import org.apache.brooklyn.camp.spi.pdp.DeploymentPlan;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
 import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.core.resolve.ResolveUtils;
+import org.apache.brooklyn.core.objs.BrooklynObjectInternal.ConfigurationSupportInternal;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.yaml.Yamls;
 
@@ -106,7 +109,7 @@ public class CampUtils {
         }
 
         String versionedId = (String) checkNotNull(Yamls.getMultinameAttribute(itemMap, "policy_type", "policyType", "type"), "policy type");
-        PolicySpec<? extends Policy> spec = ResolveUtils.resolveSpec(versionedId, loader, encounteredCatalogTypes);
+        PolicySpec<? extends Policy> spec = resolveSpec(versionedId, loader, encounteredCatalogTypes);
         Map<String, Object> brooklynConfig = (Map<String, Object>) itemMap.get("brooklyn.config");
         if (brooklynConfig != null) {
             spec.configure(brooklynConfig);
@@ -139,7 +142,7 @@ public class CampUtils {
 
         String type = (String) checkNotNull(Yamls.getMultinameAttribute(itemMap, "location_type", "locationType", "type"), "location type");
         Map<String, Object> brooklynConfig = (Map<String, Object>) itemMap.get("brooklyn.config");
-        return ResolveUtils.resolveLocationSpec(type, brooklynConfig, loader);
+        return resolveLocationSpec(type, brooklynConfig, loader);
     }
 
     public static DeploymentPlan makePlanFromYaml(ManagementContext mgmt, String yaml) {
@@ -156,4 +159,50 @@ public class CampUtils {
         }
     }
 
+    @SuppressWarnings("unchecked")
+    private static PolicySpec<? extends Policy> resolveSpec(
+            String versionedId,
+            BrooklynClassLoadingContext loader,
+            Set<String> encounteredCatalogTypes) {
+        
+        PolicySpec<? extends Policy> spec;
+        RegisteredType item = loader.getManagementContext().getTypeRegistry().get(versionedId);
+        if (item != null && !encounteredCatalogTypes.contains(item.getSymbolicName())) {
+            return loader.getManagementContext().getTypeRegistry().createSpec(item, null, PolicySpec.class);
+        } else {
+            // TODO-type-registry pass the loader in to the above, and allow it to load with the loader
+            spec = PolicySpec.create(loader.loadClass(versionedId, Policy.class));
+        }
+        return spec;
+    }
+
+    private static LocationSpec<?> resolveLocationSpec(
+            String type,
+            Map<String, Object> brooklynConfig,
+            BrooklynClassLoadingContext loader) {
+        Maybe<Class<? extends Location>> javaClass = loader.tryLoadClass(type, Location.class);
+        if (javaClass.isPresent()) {
+            LocationSpec<?> spec = LocationSpec.create(javaClass.get());
+            if (brooklynConfig != null) {
+                spec.configure(brooklynConfig);
+            }
+            return spec;
+        } else {
+            Maybe<Location> loc = loader.getManagementContext().getLocationRegistry().resolve(type, false, brooklynConfig);
+            if (loc.isPresent()) {
+                // TODO extensions?
+                Map<String, Object> locConfig = ((ConfigurationSupportInternal)loc.get().config()).getBag().getAllConfig();
+                Class<? extends Location> locType = loc.get().getClass();
+                Set<Object> locTags = loc.get().tags().getTags();
+                String locDisplayName = loc.get().getDisplayName();
+                return LocationSpec.create(locType)
+                        .configure(locConfig)
+                        .displayName(locDisplayName)
+                        .tags(locTags);
+            } else {
+                throw new IllegalStateException("No class or resolver found for location type "+type);
+            }
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
index 2996685..989bdb3 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlRebindTest.java
@@ -191,7 +191,11 @@ public class CatalogYamlRebindTest extends AbstractYamlRebindTest {
                 addCatalogItems(String.format(locCatalogFormat, locVersion));
                 break;
             case STRIP_DEPRECATION_AND_ENABLEMENT_FROM_CATALOG_ITEM:
-                // nothing here -- but below we rebind with these fields removed to ensure that we can rebind
+                // set everything false -- then below we rebind with these fields removed to ensure that we can rebind
+                CatalogUtils.setDeprecated(mgmt(), appSymbolicName, appVersion, false);
+                CatalogUtils.setDeprecated(mgmt(), locSymbolicName, locVersion, false);
+                CatalogUtils.setDisabled(mgmt(), appSymbolicName, appVersion, false);
+                CatalogUtils.setDisabled(mgmt(), locSymbolicName, locVersion, false);
                 break;
             case NO_OP:
                 break; // no-op

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25302969/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 2d9054a..e92c5f1 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
@@ -145,7 +145,7 @@ public class BrooklynRestResourceUtils {
     public Entity getEntity(String application, String entity) {
         if (entity==null) return null;
         Application app = application!=null ? getApplication(application) : null;
-        Entity e = (Entity) mgmt.getEntityManager().getEntity(entity);
+        Entity e = mgmt.getEntityManager().getEntity(entity);
         
         if (e!=null) {
             if (!Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.SEE_ENTITY, e)) {
@@ -201,10 +201,10 @@ public class BrooklynRestResourceUtils {
      * an entity matching the given ID or name; returns the first such entity, or null if none found
      **/
     public Entity searchForEntityNamed(Entity root, String entity) {
-        if (root.getId().equals(entity) || entity.equals(root.getDisplayName())) return (Entity) root;
+        if (root.getId().equals(entity) || entity.equals(root.getDisplayName())) return root;
         for (Entity child: root.getChildren()) {
             Entity result = searchForEntityNamed(child, entity);
-            if (result!=null) return (Entity) result;
+            if (result!=null) return result;
         }
         return null;
     }
@@ -393,7 +393,7 @@ public class BrooklynRestResourceUtils {
     }
 
     public Task<?> start(Application app, List<? extends Location> locations) {
-        return Entities.invokeEffector((Entity)app, app, Startable.START,
+        return Entities.invokeEffector(app, app, Startable.START,
                 MutableMap.of("locations", locations));
     }
 


[2/9] incubator-brooklyn git commit: introduce BrooklynTypeRegistry and start migrating Catalog to it

Posted by he...@apache.org.
introduce BrooklynTypeRegistry and start migrating Catalog to it

remove some of the deprecated Catalog methods, and change many lookups to catalog to lookup in the type registry.

NEXT - immediate low-hanging fruit:
* move the TypeReg classes to where they belong
* finish changing lookups in catalog so all reads go through registry
  (but writes still go to catalog)

NEXT - provide new features:
* add TypeReg for Beans, so types can be registered (at least by brooklyn startup code) for relationships, tasks, etc
* new TypeReg REST API, including allowing completion proposals for yaml
* new PlanToSpecTransformer API, and use the TypeImplementation.kind to pick the transformer to use, so we don't try the stupid attempt-load-with-any-transformer

NEXT - clean up:
* persist registered types and REST API and addToCatalog allows defining new (e.g. new relationships)
* get rid of catalog, or at least deprecate it and make all *writes* to TypeRegistry, and it stores things
* optionally, allow interim/multiple TypeRegistry instances to be used when loading catalogs or to resolve deep blueprints


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

Branch: refs/heads/master
Commit: dc968f9d0dab816df6f6993399f0a84ce5e8810c
Parents: 4585e2c
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Oct 29 22:28:14 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Oct 30 02:54:07 2015 +0000

----------------------------------------------------------------------
 .../brooklyn/api/catalog/BrooklynCatalog.java   |  45 ++--
 .../brooklyn/api/catalog/CatalogItem.java       |   9 +-
 .../apache/brooklyn/api/mgmt/EntityManager.java |   2 +-
 .../brooklyn/api/mgmt/ManagementContext.java    |   4 +
 .../api/typereg/BrooklynTypeRegistry.java       |  55 +++++
 .../brooklyn/api/typereg/OsgiBundleWithUrl.java |  36 +++
 .../brooklyn/api/typereg/RegisteredType.java    |  55 +++++
 .../catalog/internal/BasicBrooklynCatalog.java  |  71 +-----
 .../core/catalog/internal/CatalogBundleDto.java |   5 +-
 .../internal/CatalogItemDtoAbstract.java        |   2 +-
 .../core/catalog/internal/CatalogUtils.java     |  22 +-
 .../core/entity/factory/ApplicationBuilder.java |   7 +-
 .../OsgiBrooklynClassLoadingContext.java        |   8 +-
 .../brooklyn/core/mgmt/ha/OsgiManager.java      |  47 ++--
 .../internal/AbstractManagementContext.java     |   9 +
 .../core/mgmt/internal/LocalEntityManager.java  |   1 +
 .../mgmt/internal/ManagementTransitionMode.java |   2 +-
 .../NonDeploymentManagementContext.java         |  12 +-
 .../core/mgmt/rebind/RebindIteration.java       |   2 +-
 .../core/typereg/BasicBrooklynTypeRegistry.java | 122 ++++++++++
 .../core/typereg/BasicOsgiBundleWithUrl.java    | 101 ++++++++
 .../core/typereg/RegisteredTypePredicates.java  | 180 ++++++++++++++
 .../brooklyn/core/typereg/RegisteredTypes.java  | 183 ++++++++++++++
 .../apache/brooklyn/util/core/osgi/Osgis.java   |   2 +-
 .../core/catalog/internal/CatalogDtoTest.java   |   6 +-
 .../core/catalog/internal/CatalogScanTest.java  |   3 +-
 .../catalog/internal/CatalogVersioningTest.java |   2 +-
 .../core/mgmt/rebind/RebindTestFixture.java     |   2 +-
 .../BrooklynAssemblyTemplateInstantiator.java   |   9 +-
 .../BrooklynComponentTemplateResolver.java      |  24 +-
 .../BrooklynEntityDecorationResolver.java       |  30 +--
 .../spi/creation/CampToSpecTransformer.java     |  17 +-
 .../brooklyn/catalog/CatalogYamlCombiTest.java  |  14 +-
 .../brooklyn/catalog/CatalogYamlEntityTest.java |  39 +--
 .../catalog/CatalogYamlLocationTest.java        |  27 +-
 .../brooklyn/test/lite/CampYamlLiteTest.java    |  20 +-
 .../test/lite/TestAppAssemblyInstantiator.java  |   1 -
 .../rest/util/BrooklynRestResourceUtils.java    | 244 +++++++++----------
 .../brooklyn/rest/util/WebResourceUtils.java    |   2 +-
 .../rest/resources/ApplicationResourceTest.java |  11 +-
 .../rest/resources/DescendantsTest.java         |  15 +-
 .../rest/resources/ScriptResourceTest.java      |  12 +-
 .../rest/resources/UsageResourceTest.java       |   9 +-
 43 files changed, 1079 insertions(+), 390 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java b/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java
index 0bc0dfe..da850d7 100644
--- a/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java
+++ b/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java
@@ -23,41 +23,30 @@ import java.util.NoSuchElementException;
 
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Predicate;
 
 public interface BrooklynCatalog {
+    /** 
+     * Version set in catalog when creator does not supply a version, to mean a low priority item;
+     * and used when requesting to indicate the best version.
+     * (See {@link #getCatalogItem(String, String)} for discussion of the best version.)
+     */
     static String DEFAULT_VERSION = "0.0.0_DEFAULT_VERSION";
 
-    /** @return The item with the given {@link CatalogItem#getSymbolicName()
-     * symbolicName}, or null if not found.
-     * @deprecated since 0.7.0 use {@link #getCatalogItem(String, String)};
-     * or see also CatalogUtils getCatalogItemOptionalVersion */
-    @Deprecated
-    CatalogItem<?,?> getCatalogItem(String symbolicName);
-
-    /** @return The item with the given {@link CatalogItem#getSymbolicName()
-     * symbolicName}, or null if not found. */
+    /** @return The item matching the given given 
+     * {@link CatalogItem#getSymbolicName() symbolicName} 
+     * and optionally {@link CatalogItem#getVersion()},
+     * taking the best version if the version is {@link #DEFAULT_VERSION} or null,
+     * returning null if no matches are found. */
     CatalogItem<?,?> getCatalogItem(String symbolicName, String version);
 
-    /** @return Deletes the item with the given
-     *  {@link CatalogItem#getSymbolicName() symbolicName}
-     * @throws NoSuchElementException if not found
-     * @deprecated since 0.7.0 use {@link #deleteCatalogItem(String, String)} */
-    @Deprecated
-    void deleteCatalogItem(String symbolicName);
-
     /** @return Deletes the item with the given {@link CatalogItem#getSymbolicName()
      * symbolicName} and version
      * @throws NoSuchElementException if not found */
     void deleteCatalogItem(String symbolicName, String version);
 
     /** variant of {@link #getCatalogItem(String, String)} which checks (and casts) type for convenience
-     * (returns null if type does not match)
-     * @deprecated since 0.7.0 use {@link #getCatalogItem(Class<T>, String, String)} */
-    @Deprecated
-    <T,SpecT> CatalogItem<T,SpecT> getCatalogItem(Class<T> type, String symbolicName);
-
-    /** variant of {@link #getCatalogItem(String, String)} which checks (and casts) type for convenience
      * (returns null if type does not match) */
     <T,SpecT> CatalogItem<T,SpecT> getCatalogItem(Class<T> type, String symbolicName, String version);
 
@@ -80,14 +69,8 @@ public interface BrooklynCatalog {
     // TODO this should be cached on the item and renamed getSpec(...), else we re-create it too often (every time catalog is listed)
     <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createSpec(CatalogItem<T, SpecT> item);
     
-    /** throws exceptions if any problems 
-     * @deprecated since 0.7.0 use {@link #createSpec(CatalogItem)} */
-    @Deprecated
-    <T,SpecT> Class<? extends T> loadClass(CatalogItem<T,SpecT> item);
-    /** @deprecated since 0.7.0 use {@link #createSpec(CatalogItem)} */
-    @Deprecated
-    <T> Class<? extends T> loadClassByType(String typeName, Class<T> typeClass);
     /** @deprecated since 0.7.0 use {@link #createSpec(CatalogItem)} */
+    // used in one place in BRRU with warnings added in 0.9.0. remove after 0.9. 
     CatalogItem<?,?> getCatalogItemForType(String typeName);
 
     /**
@@ -150,9 +133,11 @@ public interface BrooklynCatalog {
      * so it is recommended to edit the 'manual' catalog DTO if using it to
      * generate a catalog, either adding the appropriate classpath URL or removing this entry.
      *
-     * @deprecated since 0.7.0 Construct catalogs with OSGi bundles instead
+     * @deprecated since 0.7.0 Construct catalogs with OSGi bundles instead.
+     * This is used in a handful of tests which should be rewritten to refer to OSGi bundles.
      */
     @Deprecated
+    @VisibleForTesting
     CatalogItem<?,?> addItem(Class<?> clazz);
 
     void reset(Collection<CatalogItem<?, ?>> entries);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java b/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
index bf806aa..5d9b5ee 100644
--- a/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
+++ b/api/src/main/java/org/apache/brooklyn/api/catalog/CatalogItem.java
@@ -26,6 +26,7 @@ import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
 import org.apache.brooklyn.api.mgmt.rebind.Rebindable;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.CatalogItemMemento;
 import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 
 import com.google.common.annotations.Beta;
 
@@ -39,12 +40,8 @@ public interface CatalogItem<T,SpecT> extends BrooklynObject, Rebindable {
         LOCATION;
     }
     
-    public static interface CatalogBundle {
-        public String getSymbolicName();
-        public String getVersion();
-        public String getUrl();
-
-        /** @return true if the bundle reference contains both name and version*/
+    public static interface CatalogBundle extends OsgiBundleWithUrl {
+        /** @deprecated since 0.9.0, use {@link #isFullDetailKnown()} */
         public boolean isNamed();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/api/src/main/java/org/apache/brooklyn/api/mgmt/EntityManager.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/EntityManager.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/EntityManager.java
index d423c76..fe66a5b 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/EntityManager.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/EntityManager.java
@@ -48,7 +48,7 @@ public interface EntityManager {
     EntityTypeRegistry getEntityTypeRegistry();
     
     /**
-     * Creates a new (unmanaged) entity.
+     * Creates a new entity. Management is started immediately (by this method).
      * 
      * @param spec
      * @return A proxy to the created entity (rather than the actual entity itself).

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java
index f809fb2..cabadee 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java
@@ -34,6 +34,7 @@ import org.apache.brooklyn.api.mgmt.entitlement.EntitlementManager;
 import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityManager;
 import org.apache.brooklyn.api.mgmt.rebind.RebindManager;
 import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.util.guava.Maybe;
 
@@ -206,6 +207,9 @@ public interface ManagementContext {
     /** Record of configured Brooklyn entities (and templates and policies) which can be loaded */
     BrooklynCatalog getCatalog();
 
+    /** Record of configured classes which can be loaded */
+    BrooklynTypeRegistry getTypeRegistry();
+    
     /** Returns the class loader to be used to load items. 
      * Temporary routine while catalog supports classloader-based and OSGi-based classloading. */
     @Beta

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java b/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
new file mode 100644
index 0000000..25f07ab
--- /dev/null
+++ b/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
@@ -0,0 +1,55 @@
+/*
+ * 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.api.typereg;
+
+import javax.annotation.Nullable;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
+
+import com.google.common.base.Predicate;
+
+
+public interface BrooklynTypeRegistry {
+
+    public enum RegisteredTypeKind {
+        /** a registered type which will create an {@link AbstractBrooklynObjectSpec} (e.g. {@link EntitySpec}) 
+         * for the type registered (e.g. the {@link Entity} instance) */
+        SPEC,
+        // TODO
+//        BEAN 
+        
+        // NB: additional kinds should have the Visitor in RegisteredTypes updated
+    }
+    
+    Iterable<RegisteredType> getAll();
+    Iterable<RegisteredType> getAll(Predicate<? super RegisteredType> alwaysTrue);
+    
+    RegisteredType get(String symbolicNameWithOptionalVersion, @Nullable RegisteredTypeKind kind, @Nullable Class<?> requiredSupertype);
+    RegisteredType get(String symbolicName, String version, @Nullable RegisteredTypeKind kind, @Nullable Class<?> requiredSupertype);
+    RegisteredType get(String symbolicName, String version);
+
+    @SuppressWarnings("rawtypes")
+    <T extends AbstractBrooklynObjectSpec> T createSpec(RegisteredType type, @Nullable Class<T> specKind);
+    
+    // TODO when we support beans
+//    <T> T createBean(RegisteredType type, Class<T> superType);
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java b/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
new file mode 100644
index 0000000..ec3ef40
--- /dev/null
+++ b/api/src/main/java/org/apache/brooklyn/api/typereg/OsgiBundleWithUrl.java
@@ -0,0 +1,36 @@
+/*
+ * 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.api.typereg;
+
+import com.google.common.annotations.Beta;
+
+@Beta
+public interface OsgiBundleWithUrl {
+    
+    public String getSymbolicName();
+    public String getVersion();
+    
+    /** where this bundle can be downloaded; typically required unless we are guaranteed the bundle will be manually installed */
+    public String getUrl();
+    
+    /** @return true if we have a name and version for this bundle;
+     * false if not, e.g. if we only know the URL and we haven't loaded it yet */
+    public boolean isFullDetailKnown();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredType.java b/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredType.java
new file mode 100644
index 0000000..5158c34
--- /dev/null
+++ b/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredType.java
@@ -0,0 +1,55 @@
+/*
+ * 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.api.typereg;
+
+import java.util.Collection;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.objs.Identifiable;
+
+public interface RegisteredType extends Identifiable {
+    
+    @Override
+    String getId();
+    
+    String getSymbolicName();
+    String getVersion();
+
+    Collection<OsgiBundleWithUrl> getLibraries();
+
+    String getDisplayName();
+    String getDescription();
+    String getIconUrl();
+
+    /** @return the java type or a supertype thereof that this registered type represents.
+     * <p>
+     * For beans, this is the type that the {@link BrooklynTypeRegistry} will create. 
+     * For specs, this is what the spec that will be created points at 
+     * (e.g. the concrete {@link Entity}, not the {@link EntitySpec});
+     * <p>
+     * In some cases this may return an interface or a super-type of what will actually be created, 
+     * such as if the concrete type is private and callers should know only about a particular public interface,
+     * or if precise type details are unavailable and all that is known at creation is some higher level interface/supertype
+     * (e.g. this may return {@link Entity} even though the spec points at a specific subclass,
+     * for instance because the YAML has not yet been parsed or OSGi bundles downloaded). 
+     */
+    Class<?> getJavaType();
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/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 9850eca..ce168b6 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
@@ -185,14 +185,15 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     }
     
     private String getFixedVersionId(String symbolicName, String version) {
-        if (!DEFAULT_VERSION.equals(version)) {
+        if (version!=null && !DEFAULT_VERSION.equals(version)) {
             return version;
         } else {
-            return getDefaultVersion(symbolicName);
+            return getBestVersion(symbolicName);
         }
     }
 
-    private String getDefaultVersion(String symbolicName) {
+    /** returns best version, as defined by {@link BrooklynCatalog#getCatalogItem(String, String)} */
+    private String getBestVersion(String symbolicName) {
         Iterable<CatalogItem<Object, Object>> versions = getCatalogItems(Predicates.and(
                 CatalogPredicates.disabled(false),
                 CatalogPredicates.symbolicName(Predicates.equalTo(symbolicName))));
@@ -209,12 +210,6 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     }
 
     @Override
-    @Deprecated
-    public CatalogItem<?,?> getCatalogItem(String symbolicName) {
-        return getCatalogItem(symbolicName, DEFAULT_VERSION);
-    }
-    
-    @Override
     public CatalogItem<?,?> getCatalogItem(String symbolicName, String version) {
         if (symbolicName == null) return null;
         checkNotNull(version, "version");
@@ -224,14 +219,6 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     }
     
     @Override
-    @Deprecated
-    public void deleteCatalogItem(String id) {
-        //Delete only if installed through the
-        //deprecated methods. Don't support DEFAULT_VERSION for delete.
-        deleteCatalogItem(id, NO_VERSION);
-    }
-
-    @Override
     public void deleteCatalogItem(String symbolicName, String version) {
         log.debug("Deleting manual catalog item from "+mgmt+": "+symbolicName + ":" + version);
         checkNotNull(symbolicName, "id");
@@ -263,12 +250,6 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
 
     }
 
-    @Override
-    @Deprecated
-    public <T,SpecT> CatalogItem<T,SpecT> getCatalogItem(Class<T> type, String id) {
-        return getCatalogItem(type, id, DEFAULT_VERSION);
-    }
-    
     @SuppressWarnings("unchecked")
     @Override
     public <T,SpecT> CatalogItem<T,SpecT> getCatalogItem(Class<T> type, String id, String version) {
@@ -315,46 +296,16 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         @SuppressWarnings("unchecked")
         CatalogItemDo<T,SpecT> loadedItem = (CatalogItemDo<T, SpecT>) getCatalogItemDo(item.getSymbolicName(), item.getVersion());
         if (loadedItem == null) throw new RuntimeException(item+" not in catalog; cannot create spec");
-        Class<SpecT> specType = loadedItem.getSpecType();
-        if (specType==null) return null;
+        if (loadedItem.getSpecType()==null) return null;
 
-        if (loadedItem.getPlanYaml() != null) {
-            SpecT yamlSpec = EntityManagementUtils.createCatalogSpec(mgmt, loadedItem);
-            if (yamlSpec != null) {
-                return yamlSpec;
-            }
+        SpecT spec = EntityManagementUtils.createCatalogSpec(mgmt, loadedItem);
+        if (spec != null) {
+            return spec;
         }
 
         throw new IllegalStateException("No known mechanism to create instance of "+item);
     }
 
-    @SuppressWarnings("unchecked")
-    @Override
-    /** @deprecated since 0.7.0 use {@link #createSpec(CatalogItem)} */
-    @Deprecated
-    public <T,SpecT> Class<? extends T> loadClass(CatalogItem<T,SpecT> item) {
-        if (log.isDebugEnabled())
-            log.debug("Loading class for catalog item " + item);
-        checkNotNull(item);
-        CatalogItemDo<?,?> loadedItem = getCatalogItemDo(item.getSymbolicName(), item.getVersion());
-        if (loadedItem==null) throw new NoSuchElementException("Unable to load '"+item.getId()+"' to instantiate it");
-        return (Class<? extends T>) loadedItem.getJavaClass();
-    }
-    
-    @SuppressWarnings("unchecked")
-    @Override
-    /** @deprecated since 0.7.0 use {@link #createSpec(CatalogItem)} */
-    @Deprecated
-    public <T> Class<? extends T> loadClassByType(String typeName, Class<T> typeClass) {
-        final CatalogItem<?,?> resultI = getCatalogItemForType(typeName);
-
-        if (resultI == null) {
-            throw new NoSuchElementException("Unable to find catalog item for type "+typeName);
-        }
-
-        return (Class<? extends T>) loadClass(resultI);
-    }
-
     @Deprecated /** @deprecated since 0.7.0 only used by other deprecated items */ 
     private <T,SpecT> CatalogItemDtoAbstract<T,SpecT> getAbstractCatalogItem(CatalogItem<T,SpecT> item) {
         while (item instanceof CatalogItemDo) item = ((CatalogItemDo<T,SpecT>)item).itemDto;
@@ -507,13 +458,13 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         if (Strings.isBlank(symbolicName)) {
             if (Strings.isNonBlank(id)) {
                 if (CatalogUtils.looksLikeVersionedId(id)) {
-                    symbolicName = CatalogUtils.getIdFromVersionedId(id);
+                    symbolicName = CatalogUtils.getSymbolicNameFromVersionedId(id);
                 } else {
                     symbolicName = id;
                 }
             } else if (Strings.isNonBlank(name)) {
                 if (CatalogUtils.looksLikeVersionedId(name)) {
-                    symbolicName = CatalogUtils.getIdFromVersionedId(name);
+                    symbolicName = CatalogUtils.getSymbolicNameFromVersionedId(name);
                 } else {
                     symbolicName = name;
                 }
@@ -741,7 +692,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
             String version = null;
             if (CatalogUtils.looksLikeVersionedId(type)) {
                 version = CatalogUtils.getVersionFromVersionedId(type);
-                type = CatalogUtils.getIdFromVersionedId(type);
+                type = CatalogUtils.getSymbolicNameFromVersionedId(type);
             }
             if (type!=null && key!=null) {
                 for (CatalogItemDtoAbstract<?,?> candidate: itemsDefinedSoFar) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
index 60472ae..51a4757 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java
@@ -44,9 +44,12 @@ public class CatalogBundleDto implements CatalogBundle {
     }
 
     @Override
-    public boolean isNamed() {
+    public boolean isFullDetailKnown() {
         return symbolicName != null && version != null;
     }
+    
+    @Override
+    public boolean isNamed() { return isFullDetailKnown(); }
 
     @Override
     public String getSymbolicName() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/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 6262508..414b3e6 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
@@ -411,7 +411,7 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
                     url = inlineRef;
                 } else if (CatalogUtils.looksLikeVersionedId(inlineRef)) {
                     //looks like a name+version ref
-                    name = CatalogUtils.getIdFromVersionedId(inlineRef);
+                    name = CatalogUtils.getSymbolicNameFromVersionedId(inlineRef);
                     version = CatalogUtils.getVersionFromVersionedId(inlineRef);
                     url = null;
                 } else {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/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 1da2957..4561046 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
@@ -22,14 +22,14 @@ import java.util.Collection;
 
 import javax.annotation.Nullable;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.BrooklynLogging;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
 import org.apache.brooklyn.core.entity.EntityInternal;
@@ -44,6 +44,8 @@ import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Time;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Joiner;
@@ -63,6 +65,10 @@ public class CatalogUtils {
         return newClassLoadingContext(mgmt, item.getId(), item.getLibraries());
     }
     
+    public static BrooklynClassLoadingContext newClassLoadingContext(ManagementContext mgmt, RegisteredType item) {
+        return newClassLoadingContext(mgmt, item.getId(), item.getLibraries());
+    }
+    
     public static BrooklynClassLoadingContext getClassLoadingContext(Entity entity) {
         ManagementContext mgmt = ((EntityInternal)entity).getManagementContext();
         String catId = entity.getCatalogItemId();
@@ -75,7 +81,7 @@ public class CatalogUtils {
         return newClassLoadingContext(mgmt, cat);
     }
 
-    public static BrooklynClassLoadingContext newClassLoadingContext(@Nullable ManagementContext mgmt, String catalogItemId, Collection<CatalogBundle> libraries) {
+    public static BrooklynClassLoadingContext newClassLoadingContext(@Nullable ManagementContext mgmt, String catalogItemId, Collection<? extends OsgiBundleWithUrl> libraries) {
         BrooklynClassLoadingContextSequential result = new BrooklynClassLoadingContextSequential(mgmt);
 
         if (libraries!=null && !libraries.isEmpty()) {
@@ -193,7 +199,13 @@ public class CatalogUtils {
         return true;
     }
 
+    /** @deprecated since 0.9.0 use {@link #getSymbolicNameFromVersionedId(String)} */
+    @Deprecated
     public static String getIdFromVersionedId(String versionedId) {
+        return getSymbolicNameFromVersionedId(versionedId);
+    }
+    
+    public static String getSymbolicNameFromVersionedId(String versionedId) {
         if (versionedId == null) return null;
         int versionDelimiterPos = versionedId.lastIndexOf(VERSION_DELIMITER);
         if (versionDelimiterPos != -1) {
@@ -224,7 +236,7 @@ public class CatalogUtils {
     public static CatalogItem<?, ?> getCatalogItemOptionalVersion(ManagementContext mgmt, String versionedId) {
         if (versionedId == null) return null;
         if (looksLikeVersionedId(versionedId)) {
-            String id = getIdFromVersionedId(versionedId);
+            String id = getSymbolicNameFromVersionedId(versionedId);
             String version = getVersionFromVersionedId(versionedId);
             return mgmt.getCatalog().getCatalogItem(id, version);
         } else {
@@ -240,7 +252,7 @@ public class CatalogUtils {
 
     public static <T,SpecT> CatalogItem<T, SpecT> getCatalogItemOptionalVersion(ManagementContext mgmt, Class<T> type, String versionedId) {
         if (looksLikeVersionedId(versionedId)) {
-            String id = getIdFromVersionedId(versionedId);
+            String id = getSymbolicNameFromVersionedId(versionedId);
             String version = getVersionFromVersionedId(versionedId);
             return mgmt.getCatalog().getCatalogItem(type, id, version);
         } else {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java b/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java
index 2d3ee08..f8167a0 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java
@@ -88,11 +88,7 @@ public abstract class ApplicationBuilder {
     }
 
     @SuppressWarnings("unchecked")
-    @Beta
-    /** @deprecated since 0.7.0 the management context should normally be passed in;
-     * for TestApplication also see TestApplication.Factory.newManagedInstanceForTests() */ 
-    @Deprecated
-    public static <T extends StartableApplication> T newManagedApp(EntitySpec<T> spec) {
+    private static <T extends StartableApplication> T newManagedApp(EntitySpec<T> spec) {
         return (T) new ApplicationBuilder(spec) {
             @Override protected void doBuild() {
             }
@@ -109,6 +105,7 @@ public abstract class ApplicationBuilder {
         }
     }
 
+    /** @deprecated class can be removed; users of this convenience method can now simply do mgmt.getEntityManager().createEntity(spec) */ 
     @SuppressWarnings("unchecked")
     @Beta
     public static <T extends StartableApplication> T newManagedApp(EntitySpec<T> spec, ManagementContext managementContext) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java
index fa12aa2..74f3de1 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java
@@ -23,8 +23,8 @@ import java.util.Collection;
 import java.util.Collections;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.ha.OsgiManager;
@@ -37,16 +37,16 @@ public class OsgiBrooklynClassLoadingContext extends AbstractBrooklynClassLoadin
 
     private final String catalogItemId;
     private boolean hasBundles = false;
-    private transient Collection<CatalogBundle> _bundles;
+    private transient Collection<? extends OsgiBundleWithUrl> _bundles;
 
-    public OsgiBrooklynClassLoadingContext(ManagementContext mgmt, String catalogItemId, Collection<CatalogBundle> bundles) {
+    public OsgiBrooklynClassLoadingContext(ManagementContext mgmt, String catalogItemId, Collection<? extends OsgiBundleWithUrl> bundles) {
         super(mgmt);
         this._bundles = bundles;
         this.hasBundles = bundles!=null && !bundles.isEmpty();
         this.catalogItemId = catalogItemId;
     }
 
-    public Collection<CatalogBundle> getBundles() {
+    public Collection<? extends OsgiBundleWithUrl> getBundles() {
         if (_bundles!=null || !hasBundles) return _bundles;
         CatalogItem<?, ?> cat = CatalogUtils.getCatalogItemOptionalVersion(mgmt, catalogItemId);
         if (cat==null) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
index 2afb17c..e906e3a 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
@@ -29,12 +29,9 @@ import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.osgi.framework.Bundle;
-import org.osgi.framework.launch.Framework;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.BrooklynVersion;
 import org.apache.brooklyn.core.server.BrooklynServerConfig;
@@ -50,9 +47,13 @@ import org.apache.brooklyn.util.os.Os.DeletionResult;
 import org.apache.brooklyn.util.repeat.Repeater;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.launch.Framework;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 public class OsgiManager {
 
@@ -170,20 +171,20 @@ public class OsgiManager {
     }
 
     public static boolean isBundleNameEqualOrAbsent(CatalogBundle bundle, Bundle b) {
-        return !bundle.isNamed() ||
+        return !bundle.isFullDetailKnown() ||
                 (bundle.getSymbolicName().equals(b.getSymbolicName()) &&
                 bundle.getVersion().equals(b.getVersion().toString()));
     }
 
-    public <T> Maybe<Class<T>> tryResolveClass(String type, CatalogBundle... catalogBundles) {
-        return tryResolveClass(type, Arrays.asList(catalogBundles));
+    public <T> Maybe<Class<T>> tryResolveClass(String type, OsgiBundleWithUrl... osgiBundles) {
+        return tryResolveClass(type, Arrays.asList(osgiBundles));
     }
-    public <T> Maybe<Class<T>> tryResolveClass(String type, Iterable<CatalogBundle> catalogBundles) {
-        Map<CatalogBundle,Throwable> bundleProblems = MutableMap.of();
+    public <T> Maybe<Class<T>> tryResolveClass(String type, Iterable<? extends OsgiBundleWithUrl> osgiBundles) {
+        Map<OsgiBundleWithUrl,Throwable> bundleProblems = MutableMap.of();
         Set<String> extraMessages = MutableSet.of();
-        for (CatalogBundle catalogBundle: catalogBundles) {
+        for (OsgiBundleWithUrl osgiBundle: osgiBundles) {
             try {
-                Maybe<Bundle> bundle = findBundle(catalogBundle);
+                Maybe<Bundle> bundle = findBundle(osgiBundle);
                 if (bundle.isPresent()) {
                     Bundle b = bundle.get();
                     Class<T> clazz;
@@ -200,13 +201,13 @@ public class OsgiManager {
                     }
                     return Maybe.of(clazz);
                 } else {
-                    bundleProblems.put(catalogBundle, ((Maybe.Absent<?>)bundle).getException());
+                    bundleProblems.put(osgiBundle, ((Maybe.Absent<?>)bundle).getException());
                 }
                 
             } catch (Exception e) {
                 // should come from classloading now; name formatting or missing bundle errors will be caught above 
                 Exceptions.propagateIfFatal(e);
-                bundleProblems.put(catalogBundle, e);
+                bundleProblems.put(osgiBundle, e);
 
                 Throwable cause = e.getCause();
                 if (cause != null && cause.getMessage().contains("Unresolved constraint in bundle")) {
@@ -217,7 +218,7 @@ public class OsgiManager {
                         extraMessages.add("Your development environment may not have created necessary files. Doing a maven build then retrying may fix the issue.");
                     }
                     if (!extraMessages.isEmpty()) log.warn(Strings.join(extraMessages, " "));
-                    log.warn("Unresolved constraint resolving OSGi bundle "+catalogBundle+" to load "+type+": "+cause.getMessage());
+                    log.warn("Unresolved constraint resolving OSGi bundle "+osgiBundle+" to load "+type+": "+cause.getMessage());
                     if (log.isDebugEnabled()) log.debug("Trace for OSGi resolution failure", e);
                 }
             }
@@ -235,7 +236,7 @@ public class OsgiManager {
         }
     }
 
-    public Maybe<Bundle> findBundle(CatalogBundle catalogBundle) {
+    public Maybe<Bundle> findBundle(OsgiBundleWithUrl catalogBundle) {
         //Either fail at install time when the user supplied name:version is different
         //from the one reported from the bundle
         //or
@@ -256,10 +257,10 @@ public class OsgiManager {
     /**
      * Iterates through catalogBundles until one contains a resource with the given name.
      */
-    public URL getResource(String name, Iterable<CatalogBundle> catalogBundles) {
-        for (CatalogBundle catalogBundle: catalogBundles) {
+    public URL getResource(String name, Iterable<? extends OsgiBundleWithUrl> osgiBundles) {
+        for (OsgiBundleWithUrl osgiBundle: osgiBundles) {
             try {
-                Maybe<Bundle> bundle = findBundle(catalogBundle);
+                Maybe<Bundle> bundle = findBundle(osgiBundle);
                 if (bundle.isPresent()) {
                     URL result = bundle.get().getResource(name);
                     if (result!=null) return result;
@@ -272,11 +273,11 @@ public class OsgiManager {
     }
 
     /**
-     * @return An iterable of all resources matching name in catalogBundles.
+     * @return URL's to all resources matching the given name (using {@link Bundle#getResources(String)} in the referenced osgi bundles.
      */
-    public Iterable<URL> getResources(String name, Iterable<CatalogBundle> catalogBundles) {
-        List<URL> resources = Lists.newArrayList();
-        for (CatalogBundle catalogBundle : catalogBundles) {
+    public Iterable<URL> getResources(String name, Iterable<? extends OsgiBundleWithUrl> osgiBundles) {
+        Set<URL> resources = Sets.newLinkedHashSet();
+        for (OsgiBundleWithUrl catalogBundle : osgiBundles) {
             try {
                 Maybe<Bundle> bundle = findBundle(catalogBundle);
                 if (bundle.isPresent()) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
index 01b507f..284b357 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
@@ -48,6 +48,7 @@ import org.apache.brooklyn.api.mgmt.entitlement.EntitlementManager;
 import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityManager;
 import org.apache.brooklyn.api.mgmt.rebind.RebindManager;
 import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.CatalogInitialization;
@@ -69,6 +70,7 @@ import org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContex
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl;
 import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl;
+import org.apache.brooklyn.core.typereg.BasicBrooklynTypeRegistry;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;
@@ -151,6 +153,7 @@ public abstract class AbstractManagementContext implements ManagementContextInte
     protected BrooklynProperties configMap;
     protected BasicLocationRegistry locationRegistry;
     protected final BasicBrooklynCatalog catalog;
+    protected final BrooklynTypeRegistry typeRegistry;
     protected ClassLoader baseClassLoader;
     protected Iterable<URL> baseClassPathForScanning;
 
@@ -189,6 +192,7 @@ public abstract class AbstractManagementContext implements ManagementContextInte
         DataGrid datagrid = datagridFactory.newDataGrid(this);
 
         this.catalog = new BasicBrooklynCatalog(this);
+        this.typeRegistry = new BasicBrooklynTypeRegistry(this);
         
         this.storage = new BrooklynStorageImpl(datagrid);
         this.rebindManager = new RebindManagerImpl(this); // TODO leaking "this" reference; yuck
@@ -385,6 +389,11 @@ public abstract class AbstractManagementContext implements ManagementContextInte
     }
     
     @Override
+    public BrooklynTypeRegistry getTypeRegistry() {
+        return typeRegistry;
+    }
+    
+    @Override
     public ClassLoader getCatalogClassLoader() {
         // catalog does not have to be initialized
         return catalog.getRootClassLoader();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalEntityManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalEntityManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalEntityManager.java
index 7d3b705..aaa12d5 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalEntityManager.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalEntityManager.java
@@ -394,6 +394,7 @@ public class LocalEntityManager implements EntityManagerInternal {
 
     @Override
     public void unmanage(final Entity e) {
+        // TODO don't want to guess; should we inspect state of e ?  or maybe it doesn't matter ?
         unmanage(e, ManagementTransitionMode.guessing(BrooklynObjectManagementMode.MANAGED_PRIMARY, BrooklynObjectManagementMode.NONEXISTENT));
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/ManagementTransitionMode.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/ManagementTransitionMode.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/ManagementTransitionMode.java
index f076c3a..08f111b 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/ManagementTransitionMode.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/ManagementTransitionMode.java
@@ -44,7 +44,7 @@ public class ManagementTransitionMode {
         return new ManagementTransitionMode(Preconditions.checkNotNull(modeBefore, "modeBefore"), Preconditions.checkNotNull(modeAfter, "modeAfter"));
     }
 
-    @Deprecated /** @deprecated marking places where we aren't sure */
+    @Deprecated /** @deprecated since 0.9.0 - used to mark places where we aren't sure, remove once we are satisfied */
     public static ManagementTransitionMode guessing(BrooklynObjectManagementMode modeBefore, BrooklynObjectManagementMode modeAfter) {
         return transitioning(modeBefore, modeAfter);
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
index 5223cf8..68172bb 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
@@ -29,8 +29,6 @@ import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.effector.Effector;
 import org.apache.brooklyn.api.entity.Application;
@@ -59,12 +57,12 @@ import org.apache.brooklyn.api.mgmt.rebind.RebindManager;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoRawData;
 import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.core.catalog.internal.CatalogInitialization;
 import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.core.internal.storage.BrooklynStorage;
-import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.ha.OsgiManager;
 import org.apache.brooklyn.core.mgmt.usage.UsageManager;
 import org.apache.brooklyn.core.objs.proxy.InternalEntityFactory;
@@ -72,6 +70,8 @@ import org.apache.brooklyn.core.objs.proxy.InternalLocationFactory;
 import org.apache.brooklyn.core.objs.proxy.InternalPolicyFactory;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.time.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Objects;
 
@@ -329,6 +329,12 @@ public class NonDeploymentManagementContext implements ManagementContextInternal
         checkInitialManagementContextReal();
         return initialManagementContext.getCatalog();
     }
+
+    @Override
+    public BrooklynTypeRegistry getTypeRegistry() {
+        checkInitialManagementContextReal();
+        return initialManagementContext.getTypeRegistry();
+    }
     
     @Override
     public ClassLoader getCatalogClassLoader() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
index 7b00ff8..2279e8c 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
@@ -932,7 +932,7 @@ public abstract class RebindIteration {
                         // This is a dangling reference to the catalog item (which will have been logged by lookupCatalogItem).
                         // Try loading as any version.
                         if (CatalogUtils.looksLikeVersionedId(catalogItemId)) {
-                            String symbolicName = CatalogUtils.getIdFromVersionedId(catalogItemId);
+                            String symbolicName = CatalogUtils.getSymbolicNameFromVersionedId(catalogItemId);
                             catalogItem = rebindContext.lookup().lookupCatalogItem(symbolicName);
                             
                             if (catalogItem != null) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
new file mode 100644
index 0000000..3d418e4
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.typereg;
+
+import org.apache.brooklyn.api.catalog.BrooklynCatalog;
+import org.apache.brooklyn.api.catalog.CatalogItem;
+import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
+import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
+import org.apache.brooklyn.core.typereg.RegisteredTypes.JavaTypeImplementation;
+import org.apache.brooklyn.core.typereg.RegisteredTypes.RegisteredSpecType;
+import org.apache.brooklyn.core.typereg.RegisteredTypes.TypeImplementation;
+import org.apache.brooklyn.util.collections.MutableList;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Iterables;
+
+public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry {
+
+    @SuppressWarnings("unused")
+    private static final Logger log = LoggerFactory.getLogger(BasicBrooklynTypeRegistry.class);
+    
+    private ManagementContext mgmt;
+
+    public BasicBrooklynTypeRegistry(ManagementContext mgmt) {
+        this.mgmt = mgmt;
+    }
+    
+    private static final Function<CatalogItem<?,?>,RegisteredType> CI_TO_RT = new Function<CatalogItem<?,?>, RegisteredType>() {
+        @Override
+        public RegisteredType apply(CatalogItem<?, ?> item) {
+            if (item==null) return null;
+            TypeImplementation impl = null;
+            if (item.getPlanYaml()!=null) {
+                impl = new TypeImplementation(null, item.getPlanYaml());
+            }
+            if (item.getJavaType()!=null) {
+                impl = new JavaTypeImplementation(item.getJavaType());
+            }
+            if (impl!=null) {
+                RegisteredSpecType type = new RegisteredSpecType(item.getSymbolicName(), item.getVersion(),
+                    item.getCatalogItemJavaType(), impl);
+                type.bundles = MutableList.<OsgiBundleWithUrl>copyOf(item.getLibraries());
+                type.displayName = item.getDisplayName();
+                type.description = item.getDescription();
+                type.iconUrl = item.getIconUrl();
+                
+                // TODO
+                // disabled, deprecated
+                // javaType, specType, registeredTypeName ...
+                // tags ?
+                return type;
+            }
+            throw new IllegalStateException("Unsupported catalog item "+item+" when trying to create RegisteredType");
+        }
+    };
+    
+    public Iterable<RegisteredType> getAll() {
+        return getAll(Predicates.alwaysTrue());
+    }
+    
+    @Override
+    public Iterable<RegisteredType> getAll(Predicate<? super RegisteredType> filter) {
+        return Iterables.filter(Iterables.transform(mgmt.getCatalog().getCatalogItems(), CI_TO_RT), filter);
+    }
+
+    @Override
+    public RegisteredType get(String symbolicNameWithOptionalVersion, RegisteredTypeKind kind, Class<?> parentClass) {
+        if (CatalogUtils.looksLikeVersionedId(symbolicNameWithOptionalVersion)) {
+            String id = CatalogUtils.getSymbolicNameFromVersionedId(symbolicNameWithOptionalVersion);
+            String version = CatalogUtils.getVersionFromVersionedId(symbolicNameWithOptionalVersion);
+            return get(id, version, kind, parentClass);
+        } else {
+            return get(symbolicNameWithOptionalVersion, BrooklynCatalog.DEFAULT_VERSION, kind, parentClass);
+        }
+    }
+
+    @Override
+    public RegisteredType get(String symbolicName, String version, RegisteredTypeKind kind, Class<?> parentClass) {
+        return CI_TO_RT.apply( mgmt.getCatalog().getCatalogItem(symbolicName, version) );
+    }
+
+    @Override
+    public RegisteredType get(String symbolicName, String version) {
+        return get(symbolicName, version, null, null);
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @Override
+    public <T extends AbstractBrooklynObjectSpec> T createSpec(RegisteredType type, Class<T> specKind) {
+        if (!(type instanceof RegisteredSpecType)) { 
+            throw new IllegalStateException("Cannot create spec from type "+type);
+        }
+        
+        CatalogItem item = mgmt.getCatalog().getCatalogItem(type.getSymbolicName(), type.getVersion());
+        return (T) mgmt.getCatalog().createSpec(item);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
new file mode 100644
index 0000000..c21ca98
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.typereg;
+
+import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
+
+public class BasicOsgiBundleWithUrl implements CatalogBundle, OsgiBundleWithUrl {
+    private String symbolicName;
+    private String version;
+    private String url;
+
+    // for deserializing (not sure if needed?)
+    @SuppressWarnings("unused")
+    private BasicOsgiBundleWithUrl() {}
+
+    public BasicOsgiBundleWithUrl(String name, String version, String url) {
+        if (name == null && version == null) {
+            Preconditions.checkNotNull(url, "url to an OSGi bundle is required");
+        } else {
+            Preconditions.checkNotNull(name, "both name and version are required");
+            Preconditions.checkNotNull(version, "both name and version are required");
+        }
+
+        this.symbolicName = name;
+        this.version = version;
+        this.url = url;
+    }
+
+    @Override
+    public boolean isFullDetailKnown() {
+        return symbolicName != null && version != null;
+    }
+    
+    @Override
+    @Deprecated //see super
+    public boolean isNamed() {
+        return isFullDetailKnown();
+    }
+
+    @Override
+    public String getSymbolicName() {
+        return symbolicName;
+    }
+
+    @Override
+    public String getVersion() {
+        return version;
+    }
+
+    @Override
+    public String getUrl() {
+        return url;
+    }
+
+    @Override
+    public String toString() {
+        return Objects.toStringHelper(this)
+                .add("symbolicName", symbolicName)
+                .add("version", version)
+                .add("url", url)
+                .toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(symbolicName, version, url);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+        if (obj == null) return false;
+        if (getClass() != obj.getClass()) return false;
+        OsgiBundleWithUrl other = (OsgiBundleWithUrl) obj;
+        if (!Objects.equal(symbolicName, other.getSymbolicName())) return false;
+        if (!Objects.equal(version, other.getVersion())) return false;
+        if (!Objects.equal(url, other.getUrl())) return false;
+        return true;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
new file mode 100644
index 0000000..7c719f2
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.typereg;
+
+import javax.annotation.Nullable;
+
+import org.apache.brooklyn.api.entity.Application;
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.location.Location;
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.policy.Policy;
+import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+
+public class RegisteredTypePredicates {
+
+//    public static Predicate<RegisteredType> deprecated(final boolean deprecated) {
+//        return new DeprecatedEqualTo(deprecated);
+//    }
+//
+//    private static class DeprecatedEqualTo implements Predicate<RegisteredType> {
+//        private final boolean deprecated;
+//        
+//        public DeprecatedEqualTo(boolean deprecated) {
+//            this.deprecated = deprecated;
+//        }
+//        @Override
+//        public boolean apply(@Nullable RegisteredType item) {
+//            return (item != null) && item.isDeprecated() == deprecated;
+//        }
+//    }
+//
+//    public static Predicate<RegisteredType> disabled(boolean disabled) {
+//        return new DisabledEqualTo(disabled);
+//    }
+//
+//    private static class DisabledEqualTo implements Predicate<RegisteredType> {
+//        private final boolean disabled;
+//        
+//        public DisabledEqualTo(boolean disabled) {
+//            this.disabled = disabled;
+//        }
+//        @Override
+//        public boolean apply(@Nullable RegisteredType item) {
+//            return (item != null) && item.isDisabled() == disabled;
+//        }
+//    }
+
+    @SuppressWarnings("unused")
+    private static final Function<RegisteredType,String> ID_OF_ITEM_TRANSFORMER_ANONYMOUS = new Function<RegisteredType, String>() {
+        @Override @Nullable
+        public String apply(@Nullable RegisteredType input) {
+            if (input==null) return null;
+            return input.getId();
+        }
+    };
+
+    public static final Function<RegisteredType,String> ID_OF_ITEM_TRANSFORMER = new IdOfItemTransformer();
+    
+    private static class IdOfItemTransformer implements Function<RegisteredType,String> {
+        @Override @Nullable
+        public String apply(@Nullable RegisteredType input) {
+            if (input==null) return null;
+            return input.getId();
+        }
+    };
+
+    public static Predicate<RegisteredType> displayName(final Predicate<? super String> filter) {
+        return new DisplayNameMatches(filter);
+    }
+
+    private static class DisplayNameMatches implements Predicate<RegisteredType> {
+        private final Predicate<? super String> filter;
+        
+        public DisplayNameMatches(Predicate<? super String> filter) {
+            this.filter = filter;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            return (item != null) && filter.apply(item.getDisplayName());
+        }
+    }
+
+    public static Predicate<RegisteredType> symbolicName(final Predicate<? super String> filter) {
+        return new SymbolicNameMatches(filter);
+    }
+    
+    private static class SymbolicNameMatches implements Predicate<RegisteredType> {
+        private final Predicate<? super String> filter;
+        
+        public SymbolicNameMatches(Predicate<? super String> filter) {
+            this.filter = filter;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            return (item != null) && filter.apply(item.getSymbolicName());
+        }
+    }
+
+    public static <T> Predicate<RegisteredType> javaType(final Predicate<Class<T>> filter) {
+        return new JavaTypeMatches(filter);
+    }
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public static Predicate<RegisteredType> javaTypeAssignableFrom(final Class<?> filter) {
+        return javaType((Predicate)Predicates.assignableFrom(filter));
+    }
+    
+    private static class JavaTypeMatches implements Predicate<RegisteredType> {
+        private final Predicate<Class<?>> filter;
+        
+        @SuppressWarnings({ "rawtypes", "unchecked" })
+        private <T> JavaTypeMatches(Predicate filter) {
+            this.filter = filter;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            if (item==null) return false;
+            return (item != null) && filter.apply(item.getJavaType());
+        }
+    }
+
+    public static final Predicate<RegisteredType> IS_APPLICATION = javaTypeAssignableFrom(Application.class);
+    public static final Predicate<RegisteredType> IS_ENTITY = javaTypeAssignableFrom(Entity.class);
+    public static final Predicate<RegisteredType> IS_LOCATION = javaTypeAssignableFrom(Location.class);
+    public static final Predicate<RegisteredType> IS_POLICY = javaTypeAssignableFrom(Policy.class);
+
+    public static Predicate<RegisteredType> entitledToSee(final ManagementContext mgmt) {
+        return new EntitledToSee(mgmt);
+    }
+    
+    private static class EntitledToSee implements Predicate<RegisteredType> {
+        private final ManagementContext mgmt;
+        
+        public EntitledToSee(ManagementContext mgmt) {
+            this.mgmt = mgmt;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            return (item != null) && 
+                    Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, item.getId());
+        }
+    }
+ 
+//    public static Predicate<RegisteredType> isBestVersion(final ManagementContext mgmt) {
+//        return new IsBestVersion(mgmt);
+//    }
+//    
+//    private static class IsBestVersion implements Predicate<RegisteredType> {
+//        private final ManagementContext mgmt;
+//        
+//        public IsBestVersion(ManagementContext mgmt) {
+//            this.mgmt = mgmt;
+//        }
+//        @Override
+//        public boolean apply(@Nullable RegisteredType item) {
+//            return CatalogUtils.isBestVersion(mgmt, item);
+//        }
+//    }
+    
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
new file mode 100644
index 0000000..0668d0a
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.typereg;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
+import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
+import org.apache.brooklyn.core.plan.PlanToSpecTransformer;
+
+import com.google.common.annotations.Beta;
+
+public class RegisteredTypes {
+
+    /** Visitor adapter which can be used to ensure all kinds are supported */
+    public static abstract class RegisteredTypeKindVisitor<T> {
+        public T visit(RegisteredType type) {
+            if (type==null) throw new NullPointerException("Registered type must not be null");
+            if (type instanceof RegisteredSpecType) {
+                visitSpec((RegisteredSpecType)type);
+            }
+            throw new IllegalStateException("Unexpected registered type: "+type.getClass());
+        }
+
+        protected abstract T visitSpec(RegisteredSpecType type);
+        
+        // TODO beans, others
+    }
+    
+    public static RegisteredTypeKind getKindOf(RegisteredType type) {
+        return new RegisteredTypeKindVisitor<RegisteredTypeKind>() {
+            @Override protected RegisteredTypeKind visitSpec(RegisteredSpecType type) { return RegisteredTypeKind.SPEC; }
+        }.visit(type);
+    }
+    
+    public abstract static class AbstractRegisteredType implements RegisteredType {
+
+        final String symbolicName;
+        final String version;
+        
+        List<OsgiBundleWithUrl> bundles;
+        String displayName;
+        String description;
+        String iconUrl;
+
+        // TODO ensure this is re-populated on rebind
+        transient Class<?> javaType;
+        
+        public AbstractRegisteredType(String symbolicName, String version, Class<?> javaType) {
+            this.symbolicName = symbolicName;
+            this.version = version;
+            this.javaType = javaType;
+        }
+
+        @Override
+        public String getId() {
+            return symbolicName + (version!=null ? ":"+version : "");
+        }
+
+        @Override
+        public String getSymbolicName() {
+            return symbolicName;
+        }
+
+        @Override
+        public String getVersion() {
+            return version;
+        }
+        
+        @Override
+        public Collection<OsgiBundleWithUrl> getLibraries() {
+            return bundles;
+        }
+
+        @Override
+        public String getDisplayName() {
+            return displayName;
+        }
+
+        @Override
+        public String getDescription() {
+            return description;
+        }
+
+        @Override
+        public String getIconUrl() {
+            return iconUrl;
+        }
+        
+        @Override
+        public Class<?> getJavaType() {
+            return javaType;
+        }
+    }
+
+    // TODO
+//    public static class RegisteredBeanType extends AbstractRegisteredType {
+//        
+//    }
+    
+    public static class RegisteredSpecType extends AbstractRegisteredType {
+
+        private TypeImplementation impl;
+        
+        public RegisteredSpecType(String symbolicName, String version, Class<?> javaType, TypeImplementation impl) {
+            super(symbolicName, version, javaType);
+            this.impl = impl;
+        }
+
+        public TypeImplementation getImplementation() {
+            return impl;
+        }
+    }
+
+    public static class TypeImplementation {
+        final String kind;
+        final Object data;
+        
+        public TypeImplementation(String kind, Object data) {
+            super();
+            this.kind = kind;
+            this.data = data;
+        }
+
+        /** details of the implementation, if known;
+         * this may be null if the relevant {@link PlanToSpecTransformer} was not declared when created,
+         * but in general we should look to determine the kind as early as possible and use that
+         * to retrieve the appropriate such transformer.
+         */
+        public String getKind() {
+            return kind;
+        }
+        
+        public Object getData() {
+            return data;
+        }
+    }
+    
+    public static class JavaTypeImplementation extends TypeImplementation {
+        public static final String KIND = "java";
+        public JavaTypeImplementation(String javaType) {
+            super(KIND, javaType);
+        }
+        public String getJavaType() { return (String)getData(); }
+    }
+    
+//    // TODO remove, unless we want it
+//    public static class CampYamlTypeImplementation extends TypeImplementation {
+//        public static final String KIND = "camp";
+//        public CampYamlTypeImplementation(String javaType) {
+//            super(KIND, javaType);
+//        }
+//        public String getCampYaml() { return (String)getData(); }
+//    }
+
+    /** returns the implementation data for a spec if it is a string (e.g. plan yaml or java class name); else false */
+    @Beta
+    public static String getImplementationDataStringForSpec(RegisteredType item) {
+        if (!(item instanceof RegisteredSpecType)) return null;
+        Object data = ((RegisteredSpecType)item).getImplementation().getData();
+        if (data instanceof String) return (String) data;
+        return null;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java b/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java
index 006604d..9b94f57 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java
@@ -133,7 +133,7 @@ public class Osgis {
         }
 
         public BundleFinder bundle(CatalogBundle bundle) {
-            if (bundle.isNamed()) {
+            if (bundle.isFullDetailKnown()) {
                 symbolicName(bundle.getSymbolicName());
                 version(bundle.getVersion());
             }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java
index 0b72c90..dc3662c 100644
--- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoTest.java
@@ -147,11 +147,11 @@ public class CatalogDtoTest {
         String version = "0.1.2";
         String versionedId = CatalogUtils.getVersionedId(id, version);
         
-        Assert.assertNull(CatalogUtils.getIdFromVersionedId(null));
+        Assert.assertNull(CatalogUtils.getSymbolicNameFromVersionedId(null));
         Assert.assertNull(CatalogUtils.getVersionFromVersionedId(null));
-        Assert.assertNull(CatalogUtils.getIdFromVersionedId(id));
+        Assert.assertNull(CatalogUtils.getSymbolicNameFromVersionedId(id));
         Assert.assertNull(CatalogUtils.getVersionFromVersionedId(version));
-        Assert.assertEquals(CatalogUtils.getIdFromVersionedId(versionedId), id);
+        Assert.assertEquals(CatalogUtils.getSymbolicNameFromVersionedId(versionedId), id);
         Assert.assertEquals(CatalogUtils.getVersionFromVersionedId(versionedId), version);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java
index 7a4fecb..da5ca53 100644
--- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogScanTest.java
@@ -121,7 +121,8 @@ public class CatalogScanTest {
         
         Assert.assertEquals(s1.getDescription(), "Some silly app test");
         
-        Class<? extends Application> app = c.loadClass(s1);
+        @SuppressWarnings({ "unchecked", "rawtypes" })
+        Class<?> app = c.createSpec((CatalogItem)s1).getType();
         Assert.assertEquals(MySillyAppTemplate.class, app);
         
         String xml = ((BasicBrooklynCatalog)c).toXmlString();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogVersioningTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogVersioningTest.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogVersioningTest.java
index e7eeba9..0ca2171 100644
--- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogVersioningTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogVersioningTest.java
@@ -71,7 +71,7 @@ public class CatalogVersioningTest {
             Assert.assertFalse(CatalogUtils.looksLikeVersionedId(versionedId));
         } else {
             Assert.assertTrue(CatalogUtils.looksLikeVersionedId(versionedId));
-            Assert.assertEquals(CatalogUtils.getIdFromVersionedId(versionedId), id);
+            Assert.assertEquals(CatalogUtils.getSymbolicNameFromVersionedId(versionedId), id);
             Assert.assertEquals(CatalogUtils.getVersionFromVersionedId(versionedId), version);
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
index c9acdf3..921ea9e 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
@@ -289,7 +289,7 @@ public abstract class RebindTestFixture<T extends StartableApplication> {
         assertEquals(actualIds.size(), Iterables.size(actual.getCatalogItems()), "id keyset size != size of catalog. Are there duplicates in the catalog?");
         assertEquals(actualIds, expectedIds);
         for (String versionedId : actualIds) {
-            String id = CatalogUtils.getIdFromVersionedId(versionedId);
+            String id = CatalogUtils.getSymbolicNameFromVersionedId(versionedId);
             String version = CatalogUtils.getVersionFromVersionedId(versionedId);
             assertCatalogItemsEqual(actual.getCatalogItem(id, version), expected.getCatalogItem(id, version));
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/dc968f9d/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
index 1876e99..3368df2 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
@@ -32,7 +32,6 @@ import org.apache.brooklyn.camp.spi.AssemblyTemplate;
 import org.apache.brooklyn.camp.spi.AssemblyTemplate.Builder;
 import org.apache.brooklyn.camp.spi.PlatformComponentTemplate;
 import org.apache.brooklyn.camp.spi.collection.ResolvableLink;
-import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
 import org.apache.brooklyn.core.mgmt.EntityManagementUtils.CreationResult;
 import org.apache.brooklyn.core.mgmt.HasBrooklynManagementContext;
@@ -74,8 +73,8 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateSpe
     public List<EntitySpec<?>> createServiceSpecs(
             AssemblyTemplate template,
             CampPlatform platform, BrooklynClassLoadingContext itemLoader,
-            Set<String> encounteredCatalogTypes) {
-        return buildTemplateServicesAsSpecs(itemLoader, template, platform, encounteredCatalogTypes);
+            Set<String> encounteredRegisteredTypeIds) {
+        return buildTemplateServicesAsSpecs(itemLoader, template, platform, encounteredRegisteredTypeIds);
     }
 
     @Override
@@ -125,13 +124,13 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateSpe
         return EntityManagementUtils.canPromoteWrappedApplication(app);
     }
 
-    private List<EntitySpec<?>> buildTemplateServicesAsSpecs(BrooklynClassLoadingContext loader, AssemblyTemplate template, CampPlatform platform, Set<String> encounteredCatalogTypes) {
+    private List<EntitySpec<?>> buildTemplateServicesAsSpecs(BrooklynClassLoadingContext loader, AssemblyTemplate template, CampPlatform platform, Set<String> encounteredRegisteredTypeIds) {
         List<EntitySpec<?>> result = Lists.newArrayList();
 
         for (ResolvableLink<PlatformComponentTemplate> ctl: template.getPlatformComponentTemplates().links()) {
             PlatformComponentTemplate appChildComponentTemplate = ctl.resolve();
             BrooklynComponentTemplateResolver entityResolver = BrooklynComponentTemplateResolver.Factory.newInstance(loader, appChildComponentTemplate);
-            EntitySpec<?> spec = entityResolver.resolveSpec(encounteredCatalogTypes);
+            EntitySpec<?> spec = entityResolver.resolveSpec(encounteredRegisteredTypeIds);
             result.add(spec);
         }
         return result;


[4/9] incubator-brooklyn git commit: more converting CatalogItem access to RegisteredType

Posted by he...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EntityTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EntityTransformer.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EntityTransformer.java
index 7bd36f6..4e6e15b 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EntityTransformer.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/EntityTransformer.java
@@ -28,7 +28,6 @@ import java.util.Map;
 import org.apache.brooklyn.api.catalog.CatalogConfig;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.render.RendererHints;
 import org.apache.brooklyn.rest.domain.EntityConfigSummary;
@@ -104,7 +103,7 @@ public class EntityTransformer {
     /** generates a representation for a given config key, 
      * with label inferred from annoation in the entity class,
      * and links pointing to the entity and the applicaiton */
-    public static EntityConfigSummary entityConfigSummary(EntityLocal entity, ConfigKey<?> config) {
+    public static EntityConfigSummary entityConfigSummary(Entity entity, ConfigKey<?> config) {
       /*
        * following code nearly there to get the @CatalogConfig annotation
        * in the class and use that to populate a label

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/PolicyTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/PolicyTransformer.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/PolicyTransformer.java
index 39bc783..b29e010 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/PolicyTransformer.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/transform/PolicyTransformer.java
@@ -22,7 +22,6 @@ import java.net.URI;
 import java.util.Map;
 
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.policy.Policies;
@@ -56,7 +55,7 @@ public class PolicyTransformer {
         return new PolicySummary(policy.getId(), policy.getDisplayName(), policy.getCatalogItemId(), ApplicationTransformer.statusFromLifecycle(Policies.getPolicyStatus(policy)), links);
     }
 
-    public static PolicyConfigSummary policyConfigSummary(BrooklynRestResourceUtils utils, ApplicationSummary application, EntityLocal entity, Policy policy, ConfigKey<?> config) {
+    public static PolicyConfigSummary policyConfigSummary(BrooklynRestResourceUtils utils, ApplicationSummary application, Entity entity, Policy policy, ConfigKey<?> config) {
         PolicyConfigSummary summary = policyConfigSummary(utils, entity, policy, config);
 //        TODO
 //        if (!entity.getApplicationId().equals(application.getInstance().getId()))
@@ -64,7 +63,7 @@ public class PolicyTransformer {
         return summary;
     }
 
-    public static PolicyConfigSummary policyConfigSummary(BrooklynRestResourceUtils utils, EntityLocal entity, Policy policy, ConfigKey<?> config) {
+    public static PolicyConfigSummary policyConfigSummary(BrooklynRestResourceUtils utils, Entity entity, Policy policy, ConfigKey<?> config) {
         String applicationUri = "/v1/applications/" + entity.getApplicationId();
         String entityUri = applicationUri + "/entities/" + entity.getId();
         String policyUri = entityUri + "/policies/" + policy.getId();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/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 f30c7ec..2d9054a 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
@@ -23,6 +23,7 @@ import static org.apache.brooklyn.rest.util.WebResourceUtils.notFound;
 
 import java.lang.reflect.Constructor;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -36,26 +37,28 @@ import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationRegistry;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.policy.Policy;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.BrooklynCampConstants;
 import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent;
 import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent.Scope;
 import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.catalog.CatalogPredicates;
+import org.apache.brooklyn.core.catalog.internal.CatalogItemComparator;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityInternal;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument;
 import org.apache.brooklyn.core.objs.BrooklynTypes;
+import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.enricher.stock.Enrichers;
 import org.apache.brooklyn.entity.stock.BasicApplication;
 import org.apache.brooklyn.rest.domain.ApplicationSpec;
@@ -73,7 +76,9 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -137,10 +142,10 @@ public class BrooklynRestResourceUtils {
      * in which case names will be searched recursively (and the application is required). 
      * 
      * @throws 404 or 412 (unless input is null in which case output is null) */
-    public EntityLocal getEntity(String application, String entity) {
+    public Entity getEntity(String application, String entity) {
         if (entity==null) return null;
         Application app = application!=null ? getApplication(application) : null;
-        EntityLocal e = (EntityLocal) mgmt.getEntityManager().getEntity(entity);
+        Entity e = (Entity) mgmt.getEntityManager().getEntity(entity);
         
         if (e!=null) {
             if (!Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.SEE_ENTITY, e)) {
@@ -195,11 +200,11 @@ public class BrooklynRestResourceUtils {
     /** walks the hierarchy (depth-first) at root (often an Application) looking for
      * an entity matching the given ID or name; returns the first such entity, or null if none found
      **/
-    public EntityLocal searchForEntityNamed(Entity root, String entity) {
-        if (root.getId().equals(entity) || entity.equals(root.getDisplayName())) return (EntityLocal) root;
+    public Entity searchForEntityNamed(Entity root, String entity) {
+        if (root.getId().equals(entity) || entity.equals(root.getDisplayName())) return (Entity) root;
         for (Entity child: root.getChildren()) {
             Entity result = searchForEntityNamed(child, entity);
-            if (result!=null) return (EntityLocal) result;
+            if (result!=null) return (Entity) result;
         }
         return null;
     }
@@ -208,14 +213,16 @@ public class BrooklynRestResourceUtils {
         String catalogItemId;
         Class<? extends Entity> clazz;
         
-        @SuppressWarnings("unchecked")
+        @SuppressWarnings({ "unchecked" })
         private FindItemAndClass inferFrom(String type) {
-            BrooklynCatalog catalog = getCatalog();
-            CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt, type);
+            RegisteredType item = mgmt.getTypeRegistry().get(type);
             if (item==null) {
-                // although the method was deprecated in 0.7.0, its use here was not warned until 0.9.0;
-                // therefore this behaviour should not be changed until after 0.9.0
-                item = catalog.getCatalogItemForType(type);
+                // deprecated attempt to load an item not in the type registry
+                
+                // although the method called was deprecated in 0.7.0, its use here was not warned until 0.9.0;
+                // therefore this behaviour should not be changed until after 0.9.0;
+                // at which point it should try a pojo load (see below)
+                item = getCatalogItemForType(type);
                 if (item!=null) {
                     log.warn("Creating application for requested type `"+type+" using item "+item+"; "
                         + "the registered type name ("+item.getSymbolicName()+") should be used from the spec instead, "
@@ -226,12 +233,12 @@ public class BrooklynRestResourceUtils {
             
             if (item != null) {
                 return setAs(
-                    catalog.createSpec((CatalogItem<Entity,org.apache.brooklyn.api.entity.EntitySpec<Entity>>)item).getType(),
+                    mgmt.getTypeRegistry().createSpec(item, null, org.apache.brooklyn.api.entity.EntitySpec.class).getType(),
                     item.getId());
             } else {
                 try {
                     setAs(
-                        (Class<? extends Entity>) catalog.getRootClassLoader().loadClass(type),
+                        (Class<? extends Entity>) getCatalog().getRootClassLoader().loadClass(type),
                         null);
                     log.info("Catalog does not contain item for type {}; loaded class directly instead", type);
                     return this;
@@ -247,6 +254,50 @@ public class BrooklynRestResourceUtils {
             this.catalogItemId = catalogItemId;
             return this;
         }
+        
+        @Deprecated // see caller
+        private RegisteredType getCatalogItemForType(String typeName) {
+            final RegisteredType resultI;
+            if (CatalogUtils.looksLikeVersionedId(typeName)) {
+                //All catalog identifiers of the form xxxx:yyyy are composed of symbolicName+version.
+                //No javaType is allowed as part of the identifier.
+                resultI = mgmt.getTypeRegistry().get(typeName);
+            } else {
+                //Usually for catalog items with javaType (that is items from catalog.xml)
+                //the symbolicName and javaType match because symbolicName (was ID)
+                //is not specified explicitly. But could be the case that there is an item
+                //whose symbolicName is explicitly set to be different from the javaType.
+                //Note that in the XML the attribute is called registeredTypeName.
+                Iterable<CatalogItem<Object,Object>> resultL = mgmt.getCatalog().getCatalogItems(CatalogPredicates.javaType(Predicates.equalTo(typeName)));
+                if (!Iterables.isEmpty(resultL)) {
+                    //Push newer versions in front of the list (not that there should
+                    //be more than one considering the items are coming from catalog.xml).
+                    resultI = RegisteredTypes.of(sortVersionsDesc(resultL).iterator().next());
+                    if (log.isDebugEnabled() && Iterables.size(resultL)>1) {
+                        log.debug("Found "+Iterables.size(resultL)+" matches in catalog for type "+typeName+"; returning the result with preferred version, "+resultI);
+                    }
+                } else {
+                    //As a last resort try searching for items with the same symbolicName supposedly
+                    //different from the javaType.
+                    resultI = mgmt.getTypeRegistry().get(typeName, BrooklynCatalog.DEFAULT_VERSION);
+                    if (resultI != null) {
+                        if (resultI.getJavaType() == null) {
+                            //Catalog items scanned from the classpath (using reflection and annotations) now
+                            //get yaml spec rather than a java type. Can't use those when creating apps from
+                            //the legacy app spec format.
+                            log.warn("Unable to find catalog item for type "+typeName +
+                                    ". There is an existing catalog item with ID " + resultI.getId() +
+                                    " but it doesn't define a class type.");
+                            return null;
+                        }
+                    }
+                }
+            }
+            return resultI;
+        }
+        private <T,SpecT> Collection<CatalogItem<T,SpecT>> sortVersionsDesc(Iterable<CatalogItem<T,SpecT>> versions) {
+            return ImmutableSortedSet.orderedBy(CatalogItemComparator.<T,SpecT>getInstance()).addAll(versions).build();
+        }
     }
     
     @SuppressWarnings({ "deprecation" })
@@ -281,11 +332,11 @@ public class BrooklynRestResourceUtils {
         }
 
         try {
-            if (ApplicationBuilder.class.isAssignableFrom(itemAndClass.clazz)) {
+            if (org.apache.brooklyn.core.entity.factory.ApplicationBuilder.class.isAssignableFrom(itemAndClass.clazz)) {
                 // warning only added in 0.9.0
                 log.warn("Using deprecated ApplicationBuilder "+itemAndClass.clazz+"; callers must migrate to use of Application");
                 Constructor<?> constructor = itemAndClass.clazz.getConstructor();
-                ApplicationBuilder appBuilder = (ApplicationBuilder) constructor.newInstance();
+                org.apache.brooklyn.core.entity.factory.ApplicationBuilder appBuilder = (org.apache.brooklyn.core.entity.factory.ApplicationBuilder) constructor.newInstance();
                 if (!Strings.isEmpty(name)) appBuilder.appDisplayName(name);
                 if (entities.size() > 0)
                     log.warn("Cannot supply additional entities when using an ApplicationBuilder; ignoring in spec {}", spec);
@@ -342,7 +393,7 @@ public class BrooklynRestResourceUtils {
     }
 
     public Task<?> start(Application app, List<? extends Location> locations) {
-        return Entities.invokeEffector((EntityLocal)app, app, Startable.START,
+        return Entities.invokeEffector((Entity)app, app, Startable.START,
                 MutableMap.of("locations", locations));
     }
 
@@ -381,7 +432,8 @@ public class BrooklynRestResourceUtils {
         return result;
     }
     
-    protected void configureRenderingMetadata(ApplicationSpec spec, ApplicationBuilder appBuilder) {
+    @SuppressWarnings("deprecation")
+    protected void configureRenderingMetadata(ApplicationSpec spec, org.apache.brooklyn.core.entity.factory.ApplicationBuilder appBuilder) {
         appBuilder.configure(getRenderingConfigurationFor(spec.getType()));
     }
 
@@ -395,7 +447,7 @@ public class BrooklynRestResourceUtils {
 
     protected Map<?, ?> getRenderingConfigurationFor(String catalogId) {
         MutableMap<Object, Object> result = MutableMap.of();
-        CatalogItem<?,?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt, catalogId);
+        RegisteredType item = mgmt.getTypeRegistry().get(catalogId);
         if (item==null) return result;
         
         result.addIfNotNull("iconUrl", item.getIconUrl());
@@ -527,7 +579,7 @@ public class BrooklynRestResourceUtils {
     
     public Iterable<Entity> descendantsOfAnyType(String application, String entity) {
         List<Entity> result = Lists.newArrayList();
-        EntityLocal e = getEntity(application, entity);
+        Entity e = getEntity(application, entity);
         gatherAllDescendants(e, result);
         return result;
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java
index c992ec2..7e9c910 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java
@@ -27,7 +27,6 @@ import java.io.IOException;
 import java.net.URI;
 import java.util.Map;
 
-import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
@@ -84,7 +83,7 @@ public class ApplicationTest {
         ManagementContext mgmt = LocalManagementContextForTests.newInstance();
         try {
             TestApplication app = mgmt.getEntityManager().createEntity(org.apache.brooklyn.api.entity.EntitySpec.create(TestApplication.class));
-            TestApplication e2 = app.addChild(org.apache.brooklyn.api.entity.EntitySpec.create(TestApplication.class));
+            app.addChild(org.apache.brooklyn.api.entity.EntitySpec.create(TestApplication.class));
             Asserts.assertEqualsIgnoringOrder(mgmt.getApplications(), ImmutableList.of(app));
         } finally {
             Entities.destroyAll(mgmt);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResetTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResetTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResetTest.java
index 6adfdb5..0b5daf5 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResetTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResetTest.java
@@ -27,6 +27,7 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.core.test.TestHttpRequestHandler;
 import org.apache.brooklyn.core.test.TestHttpServer;
 import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
@@ -104,9 +105,9 @@ public class CatalogResetTest extends BrooklynRestResourceTest {
     }
     
     private void assertItems() {
-        BrooklynCatalog catalog = getManagementContext().getCatalog();
-        assertNotNull(catalog.getCatalogItem("org.apache.brooklyn.entity.stock.BasicApplication", BrooklynCatalog.DEFAULT_VERSION));
-        assertNotNull(catalog.getCatalogItem("org.apache.brooklyn.test.osgi.entities.SimpleApplication", BrooklynCatalog.DEFAULT_VERSION));
+        BrooklynTypeRegistry types = getManagementContext().getTypeRegistry();
+        assertNotNull(types.get("org.apache.brooklyn.entity.stock.BasicApplication", BrooklynCatalog.DEFAULT_VERSION));
+        assertNotNull(types.get("org.apache.brooklyn.test.osgi.entities.SimpleApplication", BrooklynCatalog.DEFAULT_VERSION));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResourceTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResourceTest.java
index 3ce0e56..3883ce8 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResourceTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/CatalogResourceTest.java
@@ -33,8 +33,8 @@ import java.util.Set;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest;
 import org.apache.brooklyn.policy.autoscaling.AutoScalerPolicy;
@@ -113,9 +113,9 @@ public class CatalogResourceTest extends BrooklynRestResourceTest {
         assertEquals(entityItem.getVersion(), TEST_VERSION);
 
         // and internally let's check we have libraries
-        CatalogItem<?, ?> item = getManagementContext().getCatalog().getCatalogItem(symbolicName, TEST_VERSION);
+        RegisteredType item = getManagementContext().getTypeRegistry().get(symbolicName, TEST_VERSION);
         Assert.assertNotNull(item);
-        Collection<CatalogBundle> libs = item.getLibraries();
+        Collection<OsgiBundleWithUrl> libs = item.getLibraries();
         assertEquals(libs.size(), 1);
         assertEquals(Iterables.getOnlyElement(libs).getUrl(), bundleUrl);
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/test/java/org/apache/brooklyn/rest/test/entity/brooklynnode/DeployBlueprintTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/test/entity/brooklynnode/DeployBlueprintTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/test/entity/brooklynnode/DeployBlueprintTest.java
index 980e844..2ab62a9 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/test/entity/brooklynnode/DeployBlueprintTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/test/entity/brooklynnode/DeployBlueprintTest.java
@@ -24,7 +24,6 @@ import java.net.URI;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.EntityManager;
 import org.apache.brooklyn.entity.brooklynnode.BrooklynNode;
@@ -63,7 +62,7 @@ public class DeployBlueprintTest extends BrooklynRestApiLauncherTestFixture {
         EntitySpec<BrooklynNode> spec = EntitySpec.create(BrooklynNode.class);
         EntityManager mgr = getManagementContextFromJettyServerAttributes(server).getEntityManager();
         BrooklynNode node = mgr.createEntity(spec);
-        ((EntityLocal)node).sensors().set(BrooklynNode.WEB_CONSOLE_URI, webConsoleUri);
+        node.sensors().set(BrooklynNode.WEB_CONSOLE_URI, webConsoleUri);
         mgr.manage(node);
         Map<String, String> params = ImmutableMap.of(DeployBlueprintEffector.BLUEPRINT_CAMP_PLAN.getName(), "{ services: [ serviceType: \"java:"+BasicApplication.class.getName()+"\" ] }");
         String id = node.invoke(BrooklynNode.DEPLOY_BLUEPRINT, params).getUnchecked();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/test/java/org/apache/brooklyn/rest/testing/mocks/CapitalizePolicy.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/testing/mocks/CapitalizePolicy.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/testing/mocks/CapitalizePolicy.java
index 412ab7e..7d80a6f 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/testing/mocks/CapitalizePolicy.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/testing/mocks/CapitalizePolicy.java
@@ -21,6 +21,7 @@ package org.apache.brooklyn.rest.testing.mocks;
 import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.core.policy.AbstractPolicy;
 
+@SuppressWarnings("deprecation")
 public class CapitalizePolicy extends AbstractPolicy {
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/rest-server/src/test/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java
index 0c7e849..48908e3 100644
--- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java
+++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtilsTest.java
@@ -27,24 +27,20 @@ import java.util.Map;
 import org.apache.brooklyn.api.catalog.Catalog;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder;
 import org.apache.brooklyn.core.catalog.internal.CatalogTemplateItemDto;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.entity.AbstractApplication;
-import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.objs.proxy.EntityProxy;
 import org.apache.brooklyn.core.policy.AbstractPolicy;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.core.test.entity.TestEntity;
-import org.apache.brooklyn.core.test.entity.TestEntityImpl;
 import org.apache.brooklyn.entity.stock.BasicEntity;
 import org.apache.brooklyn.rest.domain.ApplicationSpec;
 import org.apache.brooklyn.rest.domain.EntitySpec;
-import org.apache.brooklyn.util.collections.MutableMap;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/utils/common/src/main/java/org/apache/brooklyn/util/guava/IllegalStateExceptionSupplier.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/guava/IllegalStateExceptionSupplier.java b/utils/common/src/main/java/org/apache/brooklyn/util/guava/IllegalStateExceptionSupplier.java
index deaba53..a79a8c9 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/guava/IllegalStateExceptionSupplier.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/guava/IllegalStateExceptionSupplier.java
@@ -18,26 +18,38 @@
  */
 package org.apache.brooklyn.util.guava;
 
+import org.apache.brooklyn.util.exceptions.Exceptions;
+
 import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
 
 public class IllegalStateExceptionSupplier implements Supplier<RuntimeException> {
 
     public static final IllegalStateExceptionSupplier EMPTY_EXCEPTION = new IllegalStateExceptionSupplier();
     
-    protected final String message;
+    protected final Supplier<String> message;
     protected final Throwable cause;
     
-    public IllegalStateExceptionSupplier() { this(null, null); }
+    public IllegalStateExceptionSupplier() { this((Supplier<String>)null, null); }
     public IllegalStateExceptionSupplier(String message) { this(message, null); }
-    public IllegalStateExceptionSupplier(Throwable cause) { this(cause!=null ? cause.getMessage() : null, cause); }
-    public IllegalStateExceptionSupplier(String message, Throwable cause) { 
+    public IllegalStateExceptionSupplier(Throwable cause) { this(new CollapseTextSupplier(cause), cause); }
+    public IllegalStateExceptionSupplier(String message, Throwable cause) { this(Suppliers.ofInstance(message), cause); } 
+    public IllegalStateExceptionSupplier(Supplier<String> message, Throwable cause) { 
         this.message = message;
         this.cause = cause;
     }
-    
+
+    private static class CollapseTextSupplier implements Supplier<String> {
+        final Throwable cause;
+        CollapseTextSupplier(Throwable cause) { this.cause = cause; }
+        @Override
+        public String get() {
+            return Exceptions.collapseText(cause);
+        }
+    }
     @Override
     public RuntimeException get() {
-        return new IllegalStateException(message, cause);
+        return new IllegalStateException(message==null ? null : message.get(), cause);
     }
 
 }


[3/9] incubator-brooklyn git commit: fix package name of RelationshipType

Posted by he...@apache.org.
fix package name of RelationshipType


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

Branch: refs/heads/master
Commit: 4585e2c496a528fe83bcbf2b76bf41603c4fda7c
Parents: 6d00890
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Oct 30 02:50:34 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Oct 30 02:54:07 2015 +0000

----------------------------------------------------------------------
 .../basic/relations/RelationshipType.java       | 38 --------------------
 .../brooklyn/api/objs/BrooklynObject.java       |  3 +-
 .../api/relations/RelationshipType.java         | 38 ++++++++++++++++++++
 .../brooklyn/core/entity/EntityRelations.java   |  3 +-
 .../AbstractBrooklynObjectRebindSupport.java    |  3 +-
 .../mgmt/rebind/dto/MementosGenerators.java     |  3 +-
 .../relations/AbstractBasicRelationSupport.java |  3 +-
 .../relations/ByObjectBasicRelationSupport.java |  3 +-
 .../core/relations/EmptyRelationSupport.java    |  3 +-
 .../core/relations/RelationshipTypes.java       |  4 +--
 .../core/relations/RelationshipTest.java        |  3 +-
 11 files changed, 48 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/api/src/main/java/brooklyn/basic/relations/RelationshipType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/basic/relations/RelationshipType.java b/api/src/main/java/brooklyn/basic/relations/RelationshipType.java
deleted file mode 100644
index f7d6abb..0000000
--- a/api/src/main/java/brooklyn/basic/relations/RelationshipType.java
+++ /dev/null
@@ -1,38 +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.relations;
-
-import brooklyn.basic.relations.RelationshipType;
-
-
-public interface RelationshipType<SourceType,TargetType> {
-
-    public String getRelationshipTypeName();
-    public Class<SourceType> getSourceType();
-    public Class<TargetType> getTargetType();
-    
-    public String getSourceName();
-    public String getSourceNamePlural();
-
-    public String getTargetName();
-    public String getTargetNamePlural();
-
-    public RelationshipType<TargetType,SourceType> getInverseRelationshipType();
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java b/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java
index f388bd6..b42bc58 100644
--- a/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java
+++ b/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java
@@ -28,14 +28,13 @@ import org.apache.brooklyn.api.entity.Group;
 import org.apache.brooklyn.api.mgmt.SubscriptionContext;
 import org.apache.brooklyn.api.mgmt.SubscriptionHandle;
 import org.apache.brooklyn.api.mgmt.SubscriptionManager;
+import org.apache.brooklyn.api.relations.RelationshipType;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
 
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableMap;
 
-import brooklyn.basic.relations.RelationshipType;
-
 /**
  * Super-type of entity, location, policy and enricher.
  */

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/api/src/main/java/org/apache/brooklyn/api/relations/RelationshipType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/relations/RelationshipType.java b/api/src/main/java/org/apache/brooklyn/api/relations/RelationshipType.java
new file mode 100644
index 0000000..54162f2
--- /dev/null
+++ b/api/src/main/java/org/apache/brooklyn/api/relations/RelationshipType.java
@@ -0,0 +1,38 @@
+/*
+ * 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.api.relations;
+
+import org.apache.brooklyn.api.relations.RelationshipType;
+
+
+public interface RelationshipType<SourceType,TargetType> {
+
+    public String getRelationshipTypeName();
+    public Class<SourceType> getSourceType();
+    public Class<TargetType> getTargetType();
+    
+    public String getSourceName();
+    public String getSourceNamePlural();
+
+    public String getTargetName();
+    public String getTargetNamePlural();
+
+    public RelationshipType<TargetType,SourceType> getInverseRelationshipType();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java b/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java
index 6203f22..d29b80c 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java
@@ -28,6 +28,7 @@ import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.objs.BrooklynObject.RelationSupport;
 import org.apache.brooklyn.api.policy.Policy;
+import org.apache.brooklyn.api.relations.RelationshipType;
 import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
 import org.apache.brooklyn.core.relations.AbstractBasicRelationSupport;
 import org.apache.brooklyn.core.relations.RelationshipTypes;
@@ -35,8 +36,6 @@ import org.apache.brooklyn.util.collections.MutableMap;
 
 import com.google.common.annotations.Beta;
 
-import brooklyn.basic.relations.RelationshipType;
-
 /** TODO these relations are not used yet; see issue where this is introduced and email thread */
 @Beta
 public class EntityRelations<T extends BrooklynObject> {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java
index 8c5abdf..114a455 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java
@@ -26,6 +26,7 @@ import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.Memento;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.objs.EntityAdjunct;
+import org.apache.brooklyn.api.relations.RelationshipType;
 import org.apache.brooklyn.core.entity.EntityRelations;
 import org.apache.brooklyn.core.mgmt.rebind.dto.MementosGenerators;
 import org.apache.brooklyn.core.objs.AbstractBrooklynObject;
@@ -34,8 +35,6 @@ import org.apache.brooklyn.util.text.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.basic.relations.RelationshipType;
-
 public abstract class AbstractBrooklynObjectRebindSupport<T extends Memento> implements RebindSupport<T> {
 
     private static final Logger LOG = LoggerFactory.getLogger(AbstractBrooklynObjectRebindSupport.class);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
index f0c08a6..934a8e8 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
@@ -43,6 +43,7 @@ import org.apache.brooklyn.api.mgmt.rebind.mementos.PolicyMemento;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.objs.EntityAdjunct;
 import org.apache.brooklyn.api.policy.Policy;
+import org.apache.brooklyn.api.relations.RelationshipType;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.AttributeSensor.SensorPersistenceMode;
 import org.apache.brooklyn.api.sensor.Enricher;
@@ -68,8 +69,6 @@ import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Sets;
 
-import brooklyn.basic.relations.RelationshipType;
-
 public class MementosGenerators {
 
     private MementosGenerators() {}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java b/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java
index a76d349..14cde82 100644
--- a/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java
+++ b/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java
@@ -21,11 +21,10 @@ package org.apache.brooklyn.core.relations;
 import java.util.Set;
 
 import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.relations.RelationshipType;
 import org.apache.brooklyn.core.entity.EntityRelations;
 import org.apache.brooklyn.core.objs.BrooklynObjectInternal.RelationSupportInternal;
 
-import brooklyn.basic.relations.RelationshipType;
-
 /** This abstract impl delegates to {@link EntityRelations} for all changes, routing through a local backing store.
  * This allows us to make the changes in both directions simultaneously when a relationship is bi-directional,
  * and should facilitate changing a backing datastore or remote instances when that is supported.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/core/src/main/java/org/apache/brooklyn/core/relations/ByObjectBasicRelationSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/relations/ByObjectBasicRelationSupport.java b/core/src/main/java/org/apache/brooklyn/core/relations/ByObjectBasicRelationSupport.java
index 5e065c0..7c78e97 100644
--- a/core/src/main/java/org/apache/brooklyn/core/relations/ByObjectBasicRelationSupport.java
+++ b/core/src/main/java/org/apache/brooklyn/core/relations/ByObjectBasicRelationSupport.java
@@ -24,6 +24,7 @@ import java.util.Set;
 
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.objs.BrooklynObject.RelationSupport;
+import org.apache.brooklyn.api.relations.RelationshipType;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.collections.MutableSet;
 
@@ -31,8 +32,6 @@ import com.google.common.base.Supplier;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
 
-import brooklyn.basic.relations.RelationshipType;
-
 public class ByObjectBasicRelationSupport<SourceType extends BrooklynObject> extends AbstractBasicRelationSupport<SourceType> {
 
     DataForBasicRelations<SourceType> data;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/core/src/main/java/org/apache/brooklyn/core/relations/EmptyRelationSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/relations/EmptyRelationSupport.java b/core/src/main/java/org/apache/brooklyn/core/relations/EmptyRelationSupport.java
index e1e721d..947f4bd 100644
--- a/core/src/main/java/org/apache/brooklyn/core/relations/EmptyRelationSupport.java
+++ b/core/src/main/java/org/apache/brooklyn/core/relations/EmptyRelationSupport.java
@@ -23,10 +23,9 @@ import java.util.Set;
 
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.objs.BrooklynObject.RelationSupport;
+import org.apache.brooklyn.api.relations.RelationshipType;
 import org.apache.brooklyn.core.objs.BrooklynObjectInternal.RelationSupportInternal;
 
-import brooklyn.basic.relations.RelationshipType;
-
 public final class EmptyRelationSupport<SourceType extends BrooklynObject> implements RelationSupportInternal<SourceType> {
 
     final SourceType source;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/core/src/main/java/org/apache/brooklyn/core/relations/RelationshipTypes.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/relations/RelationshipTypes.java b/core/src/main/java/org/apache/brooklyn/core/relations/RelationshipTypes.java
index b358039..1768e46 100644
--- a/core/src/main/java/org/apache/brooklyn/core/relations/RelationshipTypes.java
+++ b/core/src/main/java/org/apache/brooklyn/core/relations/RelationshipTypes.java
@@ -18,9 +18,9 @@
  */
 package org.apache.brooklyn.core.relations;
 
-import com.google.common.base.Objects;
+import org.apache.brooklyn.api.relations.RelationshipType;
 
-import brooklyn.basic.relations.RelationshipType;
+import com.google.common.base.Objects;
 
 public class RelationshipTypes {
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4585e2c4/core/src/test/java/org/apache/brooklyn/core/relations/RelationshipTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/relations/RelationshipTest.java b/core/src/test/java/org/apache/brooklyn/core/relations/RelationshipTest.java
index 5d73652..5f1c2bc 100644
--- a/core/src/test/java/org/apache/brooklyn/core/relations/RelationshipTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/relations/RelationshipTest.java
@@ -19,12 +19,11 @@
 package org.apache.brooklyn.core.relations;
 
 import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.relations.RelationshipType;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import brooklyn.basic.relations.RelationshipType;
-
 @Test
 public class RelationshipTest {
 


[7/9] incubator-brooklyn git commit: more converting CatalogItem access to RegisteredType

Posted by he...@apache.org.
more converting CatalogItem access to RegisteredType

use JavaCatalogToSpecTransformer to transform java types,
introduce RegisteredTypeConstraints,
start to clean up / migrate createSpec calls,
deprecated syntax updated


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

Branch: refs/heads/master
Commit: 50ebfafbc0e186c3ad65593504b7566014f240a3
Parents: dc968f9
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Oct 30 13:38:33 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Nov 2 08:01:12 2015 +0000

----------------------------------------------------------------------
 .../brooklyn/api/catalog/BrooklynCatalog.java   |   4 -
 .../org/apache/brooklyn/api/entity/Entity.java  |   6 +
 .../internal/AbstractBrooklynObjectSpec.java    |  14 +-
 .../brooklyn/api/objs/BrooklynObjectType.java   |  30 +++-
 .../apache/brooklyn/api/objs/BrooklynType.java  |   3 +
 .../api/typereg/BrooklynTypeRegistry.java       |  23 ++-
 .../brooklyn/api/typereg/RegisteredType.java    |  10 ++
 .../api/typereg/RegisteredTypeConstraint.java   |  45 +++++
 .../catalog/internal/BasicBrooklynCatalog.java  |  80 ++++-----
 .../core/catalog/internal/CatalogUtils.java     |  47 ++++-
 .../internal/JavaCatalogToSpecTransformer.java  |  22 ++-
 .../brooklyn/core/entity/AbstractEntity.java    |  26 +++
 .../apache/brooklyn/core/entity/Entities.java   |  27 ++-
 .../core/entity/factory/ApplicationBuilder.java |   3 +-
 .../core/location/BasicLocationRegistry.java    |  37 ++--
 .../core/location/CatalogLocationResolver.java  |   6 +-
 .../core/mgmt/EntityManagementUtils.java        |  25 ++-
 .../OsgiBrooklynClassLoadingContext.java        |   9 +-
 .../internal/AbstractManagementContext.java     |   5 +-
 .../BrooklynMementoPersisterToObjectStore.java  |  10 +-
 .../core/mgmt/persist/XmlMementoSerializer.java |   3 +-
 .../mgmt/rebind/RebindContextLookupContext.java |   9 +-
 .../core/mgmt/rebind/RebindIteration.java       |  28 +--
 .../brooklyn/core/resolve/ResolveUtils.java     |  21 +--
 .../entity/CatalogEntitySpecResolver.java       |  60 +++----
 .../resolve/entity/JavaEntitySpecResolver.java  |   8 +
 .../core/typereg/BasicBrooklynTypeRegistry.java |  98 ++++++-----
 .../core/typereg/RegisteredTypeConstraints.java | 152 ++++++++++++++++
 .../core/typereg/RegisteredTypePredicates.java  | 105 ++++++-----
 .../brooklyn/core/typereg/RegisteredTypes.java  |  77 ++++++++-
 .../core/catalog/internal/CatalogTestUtils.java |  47 -----
 .../mgmt/osgi/OsgiVersionMoreEntityTest.java    |  89 +++++-----
 .../mgmt/persist/XmlMementoSerializerTest.java  |   6 +-
 .../rebind/ActivePartialRebindVersionTest.java  |  22 ++-
 .../core/mgmt/rebind/RebindCatalogItemTest.java |   6 +-
 .../core/mgmt/rebind/RebindTestFixture.java     |  20 +--
 .../typereg/RegisteredTypePredicatesTest.java   | 172 +++++++++++++++++++
 .../BrooklynComponentTemplateResolver.java      |  12 +-
 .../BrooklynEntityDecorationResolver.java       |   5 +-
 .../spi/creation/CampToSpecTransformer.java     |  13 +-
 .../camp/brooklyn/spi/creation/CampUtils.java   |   4 +-
 .../lookup/AbstractTemplateBrooklynLookup.java  |  14 +-
 .../lookup/AssemblyTemplateBrooklynLookup.java  |   3 +-
 ...PlatformComponentTemplateBrooklynLookup.java |   3 +-
 .../brooklyn/JavaWebAppsIntegrationTest.java    |   2 +-
 .../camp/brooklyn/PoliciesYamlTest.java         |  14 +-
 .../camp/brooklyn/TestEntityWithInitConfig.java |   3 +-
 .../TestSensorAndEffectorInitializer.java       |   1 -
 .../camp/brooklyn/WindowsYamlLiveTest.java      |   4 +-
 .../CatalogOsgiVersionMoreEntityTest.java       |  72 ++++----
 .../brooklyn/catalog/CatalogXmlOsgiTest.java    |  20 +--
 .../brooklyn/catalog/CatalogYamlCombiTest.java  |   6 +-
 .../brooklyn/catalog/CatalogYamlEntityTest.java |   6 +-
 .../catalog/CatalogYamlLocationTest.java        |   2 +-
 .../brooklyn/catalog/CatalogYamlPolicyTest.java |   8 +-
 .../brooklyn/catalog/CatalogYamlRebindTest.java |  33 ++--
 .../catalog/CatalogYamlTemplateTest.java        |  44 ++---
 .../catalog/CatalogYamlVersioningTest.java      |  58 ++++---
 .../brooklyn/test/lite/CampYamlLiteTest.java    |   4 +-
 .../apache/brooklyn/rest/BrooklynWebConfig.java |   2 +-
 .../resources/AbstractBrooklynRestResource.java |   1 -
 .../rest/resources/ApplicationResource.java     |  21 ++-
 .../rest/resources/CatalogResource.java         |  42 ++---
 .../rest/resources/EffectorResource.java        |  19 +-
 .../rest/resources/EntityConfigResource.java    |  17 +-
 .../brooklyn/rest/resources/EntityResource.java |  17 +-
 .../rest/resources/LocationResource.java        |   4 +-
 .../rest/resources/PolicyConfigResource.java    |   3 +-
 .../brooklyn/rest/resources/SensorResource.java |  22 +--
 .../brooklyn/rest/resources/ServerResource.java |  14 +-
 .../rest/transform/CatalogTransformer.java      |   1 +
 .../rest/transform/EffectorTransformer.java     |   3 +-
 .../rest/transform/EntityTransformer.java       |   3 +-
 .../rest/transform/PolicyTransformer.java       |   5 +-
 .../rest/util/BrooklynRestResourceUtils.java    |  94 +++++++---
 .../brooklyn/rest/domain/ApplicationTest.java   |   3 +-
 .../rest/resources/CatalogResetTest.java        |   7 +-
 .../rest/resources/CatalogResourceTest.java     |   8 +-
 .../brooklynnode/DeployBlueprintTest.java       |   3 +-
 .../rest/testing/mocks/CapitalizePolicy.java    |   1 +
 .../util/BrooklynRestResourceUtilsTest.java     |   4 -
 .../guava/IllegalStateExceptionSupplier.java    |  24 ++-
 82 files changed, 1257 insertions(+), 747 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java b/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java
index da850d7..b47d4b1 100644
--- a/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java
+++ b/api/src/main/java/org/apache/brooklyn/api/catalog/BrooklynCatalog.java
@@ -68,10 +68,6 @@ public interface BrooklynCatalog {
     /** creates a spec for the given catalog item, throwing exceptions if any problems */
     // TODO this should be cached on the item and renamed getSpec(...), else we re-create it too often (every time catalog is listed)
     <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createSpec(CatalogItem<T, SpecT> item);
-    
-    /** @deprecated since 0.7.0 use {@link #createSpec(CatalogItem)} */
-    // used in one place in BRRU with warnings added in 0.9.0. remove after 0.9. 
-    CatalogItem<?,?> getCatalogItemForType(String typeName);
 
     /**
      * Adds an item (represented in yaml) to the catalog.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java b/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java
index 3bca701..14d3c23 100644
--- a/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java
+++ b/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java
@@ -363,6 +363,9 @@ public interface Entity extends BrooklynObject {
          */
         Iterator<T> iterator();
         
+        int size();
+        boolean isEmpty();
+        
         /**
          * Adds an instance.
          */
@@ -432,5 +435,8 @@ public interface Entity extends BrooklynObject {
          */
         @Override
         Iterator<Group> iterator();
+        
+        int size();
+        boolean isEmpty();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java b/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java
index 91aa869..7e8a022 100644
--- a/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java
+++ b/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java
@@ -29,7 +29,7 @@ import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 
-public abstract class AbstractBrooklynObjectSpec<T,K extends AbstractBrooklynObjectSpec<T,K>> implements Serializable {
+public abstract class AbstractBrooklynObjectSpec<T,SpecT extends AbstractBrooklynObjectSpec<T,SpecT>> implements Serializable {
 
     private static final long serialVersionUID = 3010955277740333030L;
     
@@ -45,8 +45,8 @@ public abstract class AbstractBrooklynObjectSpec<T,K extends AbstractBrooklynObj
     }
     
     @SuppressWarnings("unchecked")
-    protected K self() {
-        return (K) this;
+    protected SpecT self() {
+        return (SpecT) this;
     }
 
     @Override
@@ -56,23 +56,23 @@ public abstract class AbstractBrooklynObjectSpec<T,K extends AbstractBrooklynObj
 
     protected abstract void checkValidType(Class<? extends T> type);
     
-    public K displayName(String val) {
+    public SpecT displayName(String val) {
         displayName = val;
         return self();
     }
     
-    public K catalogItemId(String val) {
+    public SpecT catalogItemId(String val) {
         catalogItemId = val;
         return self();
     }
     
-    public K tag(Object tag) {
+    public SpecT tag(Object tag) {
         tags.add(tag);
         return self();
     }
 
     /** adds the given tags */
-    public K tags(Iterable<Object> tagsToAdd) {
+    public SpecT tags(Iterable<Object> tagsToAdd) {
         Iterables.addAll(this.tags, tagsToAdd);
         return self();
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObjectType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObjectType.java b/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObjectType.java
index f6cd057..e0ef84c 100644
--- a/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObjectType.java
+++ b/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObjectType.java
@@ -20,9 +20,14 @@ package org.apache.brooklyn.api.objs;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 import org.apache.brooklyn.api.location.Location;
+import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.policy.Policy;
+import org.apache.brooklyn.api.policy.PolicySpec;
 import org.apache.brooklyn.api.sensor.Enricher;
+import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Feed;
 
 import com.google.common.annotations.Beta;
@@ -30,19 +35,22 @@ import com.google.common.base.CaseFormat;
 
 @Beta
 public enum BrooklynObjectType {
-    ENTITY(Entity.class, "entities"),
-    LOCATION(Location.class, "locations"),
-    POLICY(Policy.class, "policies"),
-    ENRICHER(Enricher.class, "enrichers"),
-    FEED(Feed.class, "feeds"),
-    CATALOG_ITEM(CatalogItem.class, "catalog"),
-    UNKNOWN(null, "unknown");
+    // these are correctly type-checked by i can't tell how to get java not to warn!
+    @SuppressWarnings("unchecked") ENTITY(Entity.class, EntitySpec.class, "entities"),
+    @SuppressWarnings("unchecked") LOCATION(Location.class, LocationSpec.class, "locations"),
+    @SuppressWarnings("unchecked") POLICY(Policy.class, PolicySpec.class, "policies"),
+    @SuppressWarnings("unchecked") ENRICHER(Enricher.class, EnricherSpec.class, "enrichers"),
+    FEED(Feed.class, null, "feeds"),
+    CATALOG_ITEM(CatalogItem.class, null, "catalog"),
+    UNKNOWN(null, null, "unknown");
     
-    private Class<? extends BrooklynObject> interfaceType;
+    private final Class<? extends BrooklynObject> interfaceType;
+    private final Class<? extends AbstractBrooklynObjectSpec<?,?>> specType;
     private final String subPathName;
     
-    BrooklynObjectType(Class<? extends BrooklynObject> interfaceType, String subPathName) {
+    <T extends BrooklynObject,K extends AbstractBrooklynObjectSpec<T,K>> BrooklynObjectType(Class<T> interfaceType, Class<K> specType, String subPathName) {
         this.interfaceType = interfaceType;
+        this.specType = specType;
         this.subPathName = subPathName;
     }
     public String toCamelCase() {
@@ -57,6 +65,10 @@ public enum BrooklynObjectType {
         return interfaceType;
     }
     
+    public Class<? extends AbstractBrooklynObjectSpec<?, ?>> getSpecType() {
+        return specType;
+    }
+    
     public static BrooklynObjectType of(BrooklynObject instance) {
         for (BrooklynObjectType t: values()) {
             if (t.getInterfaceType()!=null && t.getInterfaceType().isInstance(instance))

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynType.java b/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynType.java
index f16b1d9..72d0be9 100644
--- a/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynType.java
+++ b/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynType.java
@@ -30,6 +30,9 @@ import org.apache.brooklyn.config.ConfigKey;
  * were added or removed on-the-fly then those changes will be included in subsequent
  * snapshots. Therefore instances of a given class could have different {@link BrooklynType}s.
  */
+// TODO rename as BrooklynObjectSignature or BrooklynObjectMetadata;
+// or (perhaps better and easier to retire deprecated usage, if that is required?)
+// introduce new mechanism for storing accessing this information
 public interface BrooklynType extends Serializable {
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java b/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
index 25f07ab..e13f2e6 100644
--- a/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
+++ b/api/src/main/java/org/apache/brooklyn/api/typereg/BrooklynTypeRegistry.java
@@ -42,14 +42,27 @@ public interface BrooklynTypeRegistry {
     Iterable<RegisteredType> getAll();
     Iterable<RegisteredType> getAll(Predicate<? super RegisteredType> alwaysTrue);
     
-    RegisteredType get(String symbolicNameWithOptionalVersion, @Nullable RegisteredTypeKind kind, @Nullable Class<?> requiredSupertype);
-    RegisteredType get(String symbolicName, String version, @Nullable RegisteredTypeKind kind, @Nullable Class<?> requiredSupertype);
+    /** @return The item matching the given given 
+     * {@link RegisteredType#getSymbolicName() symbolicName} 
+     * and optionally {@link RegisteredType#getVersion()},
+     * filtered for the optionally supplied {@link RegisteredTypeConstraint}, 
+     * taking the best version if the version is null or a default marker,
+     * returning null if no matches are found. */
+    RegisteredType get(String symbolicName, String version, @Nullable RegisteredTypeConstraint constraint);
+    /** as {@link #get(String, String, RegisteredTypeConstraint)} with no constraints */
     RegisteredType get(String symbolicName, String version);
+    /** as {@link #get(String, String, RegisteredTypeConstraint)} but allows <code>"name:version"</code> 
+     * (the {@link RegisteredType#getId()}) in addition to the unversioned name,
+     * using a default marker if no version can be inferred */
+    RegisteredType get(String symbolicNameWithOptionalVersion, @Nullable RegisteredTypeConstraint constraint);
+    /** as {@link #get(String, RegisteredTypeConstraint)} but with no constraints */
+    RegisteredType get(String symbolicNameWithOptionalVersion);
 
-    @SuppressWarnings("rawtypes")
-    <T extends AbstractBrooklynObjectSpec> T createSpec(RegisteredType type, @Nullable Class<T> specKind);
+    // NB the seemingly more correct generics <T,SpecT extends AbstractBrooklynObjectSpec<T,SpecT>> 
+    // cause compile errors, not in Eclipse, but in maven (?) 
+    <SpecT extends AbstractBrooklynObjectSpec<?,?>> SpecT createSpec(RegisteredType type, @Nullable RegisteredTypeConstraint optionalConstraint, Class<SpecT> optionalSpecSuperType);
     
     // TODO when we support beans
-//    <T> T createBean(RegisteredType type, Class<T> superType);
+//    <T> T createBean(RegisteredType type, @Nullable RegisteredTypeConstraint optionalConstraint, Class<T> optionalResultSuperType);
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredType.java b/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredType.java
index 5158c34..6ffa09c 100644
--- a/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredType.java
+++ b/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredType.java
@@ -51,5 +51,15 @@ public interface RegisteredType extends Identifiable {
      * for instance because the YAML has not yet been parsed or OSGi bundles downloaded). 
      */
     Class<?> getJavaType();
+
+    /**
+     * @return True if the item has been deprecated (i.e. its use is discouraged)
+     */
+    boolean isDeprecated();
+    
+    /**
+     * @return True if the item has been disabled (i.e. its use is forbidden, except for pre-existing apps)
+     */
+    boolean isDisabled();
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredTypeConstraint.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredTypeConstraint.java b/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredTypeConstraint.java
new file mode 100644
index 0000000..b55d546
--- /dev/null
+++ b/api/src/main/java/org/apache/brooklyn/api/typereg/RegisteredTypeConstraint.java
@@ -0,0 +1,45 @@
+/*
+ * 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.api.typereg;
+
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
+
+public interface RegisteredTypeConstraint {
+    
+    /** The kind required, if specified. */
+    @Nullable public RegisteredTypeKind getKind();
+    
+    /** A java super-type or interface that should be filtered for; 
+     * for specs, this refers to the target type, not the spec 
+     * (eg {@link Entity} not {@link EntitySpec}). 
+     * If nothing is specified, this returns {@link Object}'s class. */
+    @Nonnull public Class<?> getJavaSuperType();
+    
+    /** encountered types, so that during resolution, 
+     * if we have already attempted to resolve a given type,
+     * the instantiator can avoid recursive cycles */
+    public Set<String> getEncounteredTypes();
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/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 ce168b6..c176a42 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
@@ -25,6 +25,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.Set;
 
 import javax.annotation.Nullable;
 
@@ -39,11 +40,13 @@ import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.core.catalog.CatalogPredicates;
 import org.apache.brooklyn.core.catalog.internal.CatalogClasspathDo.CatalogScanningModes;
 import org.apache.brooklyn.core.location.BasicLocationRegistry;
-import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
 import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.core.plan.PlanToSpecFactory;
+import org.apache.brooklyn.core.plan.PlanToSpecTransformer;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
@@ -298,13 +301,37 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         if (loadedItem == null) throw new RuntimeException(item+" not in catalog; cannot create spec");
         if (loadedItem.getSpecType()==null) return null;
 
-        SpecT spec = EntityManagementUtils.createCatalogSpec(mgmt, loadedItem);
+        SpecT spec = internalCreateSpecWithTransformers(mgmt, loadedItem, MutableSet.<String>of());
         if (spec != null) {
             return spec;
         }
 
         throw new IllegalStateException("No known mechanism to create instance of "+item);
     }
+    
+    /** @deprecated since introduction in 0.9.0, only used for backwards compatibility, can be removed any time;
+     * uses the type-creation info on the item */
+    @Deprecated 
+    public static <T,SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT internalCreateSpecWithTransformers(ManagementContext mgmt, final CatalogItem<T, SpecT> item, final Set<String> encounteredTypes) {
+        // deprecated lookup
+        if (encounteredTypes.contains(item.getSymbolicName())) {
+            throw new IllegalStateException("Type being resolved '"+item.getSymbolicName()+"' has already been encountered in " + encounteredTypes + "; recursive cycle detected");
+        }
+        return PlanToSpecFactory.attemptWithLoaders(mgmt, new Function<PlanToSpecTransformer, SpecT>() {
+            @Override
+            public SpecT apply(PlanToSpecTransformer input) {
+                return input.createCatalogSpec(item, encounteredTypes);
+            }
+        }).get();
+    }
+
+    /**
+     * as internalCreateSpecFromItemWithTransformers, but marking contexts where the creation is being attempted
+     * @deprecated since introduction in 0.9.0, only used for backwards compatibility, can be removed any time */
+    @Deprecated
+    public static <T,SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT internalCreateSpecAttempting(ManagementContext mgmt, final CatalogItem<T, SpecT> item, final Set<String> encounteredTypes) {
+        return internalCreateSpecWithTransformers(mgmt, item, encounteredTypes);
+    }
 
     @Deprecated /** @deprecated since 0.7.0 only used by other deprecated items */ 
     private <T,SpecT> CatalogItemDtoAbstract<T,SpecT> getAbstractCatalogItem(CatalogItem<T,SpecT> item) {
@@ -620,7 +647,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         
         public PlanInterpreterGuessingType(@Nullable String id, Object item, String itemYaml, @Nullable CatalogItemType optionalCiType, 
                 Collection<CatalogBundle> libraryBundles, List<CatalogItemDtoAbstract<?,?>> itemsDefinedSoFar) {
-            // ID is useful to prevent recursive references (currently for entities only)
+            // ID is useful to prevent recursive references (possibly only supported for entities?)
             this.id = id;
             
             if (item instanceof String) {
@@ -717,7 +744,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
                     .libraries(libraryBundles)
                     .build();
                 @SuppressWarnings("unchecked")
-                Object spec = EntityManagementUtils.createCatalogSpec(mgmt, itemToAttempt);
+                Object spec = internalCreateSpecAttempting(mgmt, itemToAttempt, MutableSet.<String>of());
                 if (spec!=null) {
                     catalogItemType = candidateCiType;
                     planYaml = candidateYaml;
@@ -755,7 +782,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
                             .libraries(libraryBundles)
                             .build();
                     @SuppressWarnings("unchecked")
-                    Object cutdownSpec = EntityManagementUtils.createCatalogSpec(mgmt, itemToAttempt);
+                    Object cutdownSpec = internalCreateSpecAttempting(mgmt, itemToAttempt, MutableSet.<String>of());
                     if (cutdownSpec!=null) {
                         catalogItemType = candidateCiType;
                         planYaml = candidateYaml;
@@ -1027,47 +1054,4 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
             serializer = new CatalogXmlSerializer();
     }
 
-    @Override
-    @Deprecated
-    public CatalogItem<?,?> getCatalogItemForType(String typeName) {
-        final CatalogItem<?,?> resultI;
-        final BrooklynCatalog catalog = mgmt.getCatalog();
-        if (CatalogUtils.looksLikeVersionedId(typeName)) {
-            //All catalog identifiers of the form xxxx:yyyy are composed of symbolicName+version.
-            //No javaType is allowed as part of the identifier.
-            resultI = CatalogUtils.getCatalogItemOptionalVersion(mgmt, typeName);
-        } else {
-            //Usually for catalog items with javaType (that is items from catalog.xml)
-            //the symbolicName and javaType match because symbolicName (was ID)
-            //is not specified explicitly. But could be the case that there is an item
-            //whose symbolicName is explicitly set to be different from the javaType.
-            //Note that in the XML the attribute is called registeredTypeName.
-            Iterable<CatalogItem<Object,Object>> resultL = catalog.getCatalogItems(CatalogPredicates.javaType(Predicates.equalTo(typeName)));
-            if (!Iterables.isEmpty(resultL)) {
-                //Push newer versions in front of the list (not that there should
-                //be more than one considering the items are coming from catalog.xml).
-                resultI = sortVersionsDesc(resultL).iterator().next();
-                if (log.isDebugEnabled() && Iterables.size(resultL)>1) {
-                    log.debug("Found "+Iterables.size(resultL)+" matches in catalog for type "+typeName+"; returning the result with preferred version, "+resultI);
-                }
-            } else {
-                //As a last resort try searching for items with the same symbolicName supposedly
-                //different from the javaType.
-                resultI = catalog.getCatalogItem(typeName, BrooklynCatalog.DEFAULT_VERSION);
-                if (resultI != null) {
-                    if (resultI.getJavaType() == null) {
-                        //Catalog items scanned from the classpath (using reflection and annotations) now
-                        //get yaml spec rather than a java type. Can't use those when creating apps from
-                        //the legacy app spec format.
-                        log.warn("Unable to find catalog item for type "+typeName +
-                                ". There is an existing catalog item with ID " + resultI.getId() +
-                                " but it doesn't define a class type.");
-                        return null;
-                    }
-                }
-            }
-        }
-        return resultI;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/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 4561046..db4b72a 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
@@ -28,6 +28,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.BrooklynLogging;
@@ -41,12 +42,14 @@ import org.apache.brooklyn.core.mgmt.ha.OsgiManager;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl.RebindTracker;
 import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
+import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Time;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.api.client.util.Preconditions;
 import com.google.common.annotations.Beta;
 import com.google.common.base.Joiner;
 import com.google.common.base.Stopwatch;
@@ -73,7 +76,7 @@ public class CatalogUtils {
         ManagementContext mgmt = ((EntityInternal)entity).getManagementContext();
         String catId = entity.getCatalogItemId();
         if (Strings.isBlank(catId)) return JavaBrooklynClassLoadingContext.create(mgmt);
-        CatalogItem<?, ?> cat = getCatalogItemOptionalVersion(mgmt, catId);
+        RegisteredType cat = mgmt.getTypeRegistry().get(catId, RegisteredTypeConstraints.spec(Entity.class));
         if (cat==null) {
             log.warn("Cannot load "+catId+" to get classloader for "+entity+"; will try with standard loader, but might fail subsequently");
             return JavaBrooklynClassLoadingContext.create(mgmt);
@@ -200,6 +203,7 @@ public class CatalogUtils {
     }
 
     /** @deprecated since 0.9.0 use {@link #getSymbolicNameFromVersionedId(String)} */
+    // all uses removed
     @Deprecated
     public static String getIdFromVersionedId(String versionedId) {
         return getSymbolicNameFromVersionedId(versionedId);
@@ -230,9 +234,8 @@ public class CatalogUtils {
         return id + VERSION_DELIMITER + version;
     }
 
-    //TODO Don't really like this, but it's better to have it here than on the interface to keep the API's 
-    //surface minimal. Could instead have the interface methods accept VerionedId object and have the helpers
-    //construct it as needed.
+    /** @deprecated since 0.9.0 use {@link BrooklynTypeRegistry#get(String, org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind, Class)} */
+    // only a handful of items remaining, and those require a CatalogItem
     public static CatalogItem<?, ?> getCatalogItemOptionalVersion(ManagementContext mgmt, String versionedId) {
         if (versionedId == null) return null;
         if (looksLikeVersionedId(versionedId)) {
@@ -245,11 +248,13 @@ public class CatalogUtils {
     }
 
     public static boolean isBestVersion(ManagementContext mgmt, CatalogItem<?,?> item) {
-        CatalogItem<?, ?> bestVersion = getCatalogItemOptionalVersion(mgmt, item.getSymbolicName());
+        RegisteredType bestVersion = mgmt.getTypeRegistry().get(item.getSymbolicName(), BrooklynCatalog.DEFAULT_VERSION, null);
         if (bestVersion==null) return false;
         return (bestVersion.getVersion().equals(item.getVersion()));
     }
 
+    /** @deprecated since 0.9.0 use {@link BrooklynTypeRegistry#get(String, org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind, Class)} */
+    // only a handful of items remaining, and those require a CatalogItem
     public static <T,SpecT> CatalogItem<T, SpecT> getCatalogItemOptionalVersion(ManagementContext mgmt, Class<T> type, String versionedId) {
         if (looksLikeVersionedId(versionedId)) {
             String id = getSymbolicNameFromVersionedId(versionedId);
@@ -260,4 +265,36 @@ public class CatalogUtils {
         }
     }
 
+    /** @deprecated since it was introduced in 0.9.0; TBD where this should live */
+    public static void setDeprecated(ManagementContext mgmt, String symbolicNameAndOptionalVersion, boolean newValue) {
+        RegisteredType item = mgmt.getTypeRegistry().get(symbolicNameAndOptionalVersion);
+        Preconditions.checkNotNull(item, "No such item: "+symbolicNameAndOptionalVersion);
+        setDeprecated(mgmt, item.getSymbolicName(), item.getVersion(), newValue);
+    }
+    
+    /** @deprecated since it was introduced in 0.9.0; TBD where this should live */
+    public static void setDisabled(ManagementContext mgmt, String symbolicNameAndOptionalVersion, boolean newValue) {
+        RegisteredType item = mgmt.getTypeRegistry().get(symbolicNameAndOptionalVersion);
+        Preconditions.checkNotNull(item, "No such item: "+symbolicNameAndOptionalVersion);
+        setDisabled(mgmt, item.getSymbolicName(), item.getVersion(), newValue);
+    }
+    
+    /** @deprecated since it was introduced in 0.9.0; TBD where this should live */
+    @Deprecated
+    public static void setDeprecated(ManagementContext mgmt, String symbolicName, String version, boolean newValue) {
+        CatalogItem<?, ?> item = mgmt.getCatalog().getCatalogItem(symbolicName, version);
+        Preconditions.checkNotNull(item, "No such item: "+symbolicName+" v "+version);
+        item.setDeprecated(newValue);
+        mgmt.getCatalog().persist(item);
+    }
+
+    /** @deprecated since it was introduced in 0.9.0; TBD where this should live */
+    @Deprecated
+    public static void setDisabled(ManagementContext mgmt, String symbolicName, String version, boolean newValue) {
+        CatalogItem<?, ?> item = mgmt.getCatalog().getCatalogItem(symbolicName, version);
+        Preconditions.checkNotNull(item, "No such item: "+symbolicName+" v "+version);
+        item.setDisabled(newValue);
+        mgmt.getCatalog().persist(item);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java
index a6a8e3a..742625a 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/JavaCatalogToSpecTransformer.java
@@ -28,18 +28,23 @@ import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.policy.PolicySpec;
-import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.plan.PlanNotRecognizedException;
 import org.apache.brooklyn.core.plan.PlanToSpecTransformer;
+import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Old-style catalog items (can be defined in catalog.xml only) don't have structure, only a single type, so
- * they are loaded as a simple java type, only taking the class name from the catalog item instead of the
- * type value in the YAML. Classpath entries in the item are also used (through the catalog root classloader).
+ * Instantiates classes from a registered type which simply
+ * defines the java class name and OSGi bundles to use.
+ * <p>
+ * This is used where a {@link RegisteredType} is defined simply with the name of a java class
+ * (no YAML etc); and for legacy old-style (c0.7.0) catalog items (defined in catalog.xml only)
+ * with structure, only a single type.
  */
 public class JavaCatalogToSpecTransformer implements PlanToSpecTransformer {
+    @SuppressWarnings("unused")
     private static final Logger log = LoggerFactory.getLogger(JavaCatalogToSpecTransformer.class);
 
     private ManagementContext mgmt;
@@ -51,7 +56,7 @@ public class JavaCatalogToSpecTransformer implements PlanToSpecTransformer {
 
     @Override
     public String getShortDescription() {
-        return "Deprecated java-type catalog items transformer";
+        return "Java type instantiator";
     }
 
     @Override
@@ -68,11 +73,11 @@ public class JavaCatalogToSpecTransformer implements PlanToSpecTransformer {
     public <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createCatalogSpec(
             CatalogItem<T, SpecT> item, Set<String> encounteredTypes) throws PlanNotRecognizedException {
         if (item.getJavaType() != null) {
-            log.warn("Deprecated functionality (since 0.9.0). Using old-style xml catalog items with java type attribute for " + item);
             Class<?> type;
             try {
-                type = mgmt.getCatalogClassLoader().loadClass(item.getJavaType());
-            } catch (ClassNotFoundException e) {
+                type = CatalogUtils.newClassLoadingContext(mgmt, item).loadClass(item.getJavaType());
+            } catch (Exception e) {
+                Exceptions.propagateIfFatal(e);
                 throw new IllegalStateException("Unable to load old-style java catalog item type " + item.getJavaType() + " for item " + item, e);
             }
             AbstractBrooklynObjectSpec<?,?> spec;
@@ -87,6 +92,7 @@ public class JavaCatalogToSpecTransformer implements PlanToSpecTransformer {
             } else {
                 throw new IllegalStateException("Catalog item " + item + " java type " + item.getJavaType() + " is not a Brooklyn supported object.");
             }
+            spec.catalogItemId(item.getCatalogItemId());
             @SuppressWarnings("unchecked")
             SpecT untypedSpc = (SpecT) spec;
             return untypedSpc;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
index c75c908..09b362d 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java
@@ -715,6 +715,14 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
         public Iterator<Group> iterator() { 
             return asList().iterator();
         }
+        @Override
+        public int size() {
+            return asList().size();
+        }
+        @Override
+        public boolean isEmpty() {
+            return asList().isEmpty();
+        }
         
         protected List<Group> asList() { 
             return ImmutableList.copyOf(groupsInternal);
@@ -1598,6 +1606,15 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
             return asList().iterator();
         }
 
+        @Override
+        public int size() {
+            return policiesInternal.size();
+        }
+        @Override
+        public boolean isEmpty() {
+            return policiesInternal.isEmpty();
+        }
+        
         protected List<Policy> asList() {
             return ImmutableList.<Policy>copyOf(policiesInternal);
         }
@@ -1661,6 +1678,15 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
             return asList().iterator();
         }
 
+        @Override
+        public int size() {
+            return enrichersInternal.size();
+        }
+        @Override
+        public boolean isEmpty() {
+            return enrichersInternal.isEmpty();
+        }
+        
         protected List<Enricher> asList() {
             return ImmutableList.<Enricher>copyOf(enrichersInternal);
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
index 0120fd7..8b10676 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
@@ -42,7 +42,6 @@ import java.util.concurrent.atomic.AtomicReference;
 import org.apache.brooklyn.api.effector.Effector;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.entity.Group;
 import org.apache.brooklyn.api.entity.drivers.EntityDriver;
@@ -170,7 +169,7 @@ public class Entities {
      *
      * @return {@link ParallelTask} containing results from each invocation
      */
-    public static <T> Task<List<T>> invokeEffectorList(EntityLocal callingEntity, Iterable<? extends Entity> entitiesToCall,
+    public static <T> Task<List<T>> invokeEffectorList(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
             final Effector<T> effector, final Map<String,?> parameters) {
         // formulation is complicated, but it is building up a list of tasks, without blocking on them initially,
         // but ensuring that when the parallel task is gotten it does block on all of them
@@ -194,25 +193,25 @@ public class Entities {
         return DynamicTasks.queueIfPossible(invoke).orSubmitAsync(callingEntity).asTask();
     }
 
-    public static <T> Task<List<T>> invokeEffectorListWithMap(EntityLocal callingEntity, Iterable<? extends Entity> entitiesToCall,
+    public static <T> Task<List<T>> invokeEffectorListWithMap(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
             final Effector<T> effector, final Map<String,?> parameters) {
         return invokeEffectorList(callingEntity, entitiesToCall, effector, parameters);
     }
 
     @SuppressWarnings("unchecked")
-    public static <T> Task<List<T>> invokeEffectorListWithArgs(EntityLocal callingEntity, Iterable<? extends Entity> entitiesToCall,
+    public static <T> Task<List<T>> invokeEffectorListWithArgs(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
             final Effector<T> effector, Object ...args) {
         return invokeEffectorListWithMap(callingEntity, entitiesToCall, effector,
                 // putting into a map, unnecessarily, as it ends up being the array again...
                 EffectorUtils.prepareArgsForEffectorAsMapFromArray(effector, args));
     }
 
-    public static <T> Task<List<T>> invokeEffectorList(EntityLocal callingEntity, Iterable<? extends Entity> entitiesToCall,
+    public static <T> Task<List<T>> invokeEffectorList(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
             final Effector<T> effector) {
         return invokeEffectorList(callingEntity, entitiesToCall, effector, Collections.<String,Object>emptyMap());
     }
 
-    public static <T> Task<T> invokeEffector(EntityLocal callingEntity, Entity entityToCall,
+    public static <T> Task<T> invokeEffector(Entity callingEntity, Entity entityToCall,
             final Effector<T> effector, final Map<String,?> parameters) {
         Task<T> t = Effectors.invocation(entityToCall, effector, parameters).asTask();
         TaskTags.markInessential(t);
@@ -231,19 +230,19 @@ public class Entities {
     }
 
     @SuppressWarnings("unchecked")
-    public static <T> Task<T> invokeEffectorWithArgs(EntityLocal callingEntity, Entity entityToCall,
+    public static <T> Task<T> invokeEffectorWithArgs(Entity callingEntity, Entity entityToCall,
             final Effector<T> effector, Object ...args) {
         return invokeEffector(callingEntity, entityToCall, effector,
                 EffectorUtils.prepareArgsForEffectorAsMapFromArray(effector, args));
     }
 
-    public static <T> Task<T> invokeEffector(EntityLocal callingEntity, Entity entityToCall,
+    public static <T> Task<T> invokeEffector(Entity callingEntity, Entity entityToCall,
             final Effector<T> effector) {
         return invokeEffector(callingEntity, entityToCall, effector, Collections.<String,Object>emptyMap());
     }
 
     /** Invokes in parallel if multiple, but otherwise invokes the item directly. */
-    public static Task<?> invokeEffector(EntityLocal callingEntity, Iterable<? extends Entity> entitiesToCall,
+    public static Task<?> invokeEffector(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
             final Effector<?> effector, final Map<String,?> parameters) {
         if (Iterables.size(entitiesToCall)==1)
             return invokeEffector(callingEntity, entitiesToCall.iterator().next(), effector, parameters);
@@ -252,7 +251,7 @@ public class Entities {
     }
 
     /** Invokes in parallel if multiple, but otherwise invokes the item directly. */
-    public static Task<?> invokeEffector(EntityLocal callingEntity, Iterable<? extends Entity> entitiesToCall,
+    public static Task<?> invokeEffector(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
             final Effector<?> effector) {
         return invokeEffector(callingEntity, entitiesToCall, effector, Collections.<String,Object>emptyMap());
     }
@@ -376,14 +375,14 @@ public class Entities {
             out.append(currentIndentation+tab+tab+"Members: "+members.toString()+"\n");
         }
 
-        if (!e.getPolicies().isEmpty()) {
+        if (!e.policies().isEmpty()) {
             out.append(currentIndentation+tab+tab+"Policies:\n");
             for (Policy policy : e.policies()) {
                 dumpInfo(policy, out, currentIndentation+tab+tab+tab, tab);
             }
         }
 
-        if (!e.getEnrichers().isEmpty()) {
+        if (!e.enrichers().isEmpty()) {
             out.append(currentIndentation+tab+tab+"Enrichers:\n");
             for (Enricher enricher : e.enrichers()) {
                 dumpInfo(enricher, out, currentIndentation+tab+tab+tab, tab);
@@ -699,7 +698,7 @@ public class Entities {
             log.warn("Using deprecated discouraged mechanism to start management -- Entities.start(Application, Locations) -- caller should create and use the preferred management context");
             startManagement(e);
         }
-        if (e instanceof Startable) Entities.invokeEffector((EntityLocal)e, e, Startable.START,
+        if (e instanceof Startable) Entities.invokeEffector(e, e, Startable.START,
                 MutableMap.of("locations", locations)).getUnchecked();
     }
 
@@ -714,7 +713,7 @@ public class Entities {
                 unmanage(e);
                 log.debug("destroyed and unmanaged read-only copy of "+e);
             } else {
-                if (e instanceof Startable) Entities.invokeEffector((EntityLocal)e, e, Startable.STOP).getUnchecked();
+                if (e instanceof Startable) Entities.invokeEffector(e, e, Startable.STOP).getUnchecked();
                 
                 // if destroying gracefully we might also want to do this (currently gets done by GC after unmanage,
                 // which is good enough for leaks, but not sure if that's ideal for subscriptions etc)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java b/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java
index f8167a0..66f4795 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/factory/ApplicationBuilder.java
@@ -217,7 +217,8 @@ public abstract class ApplicationBuilder {
             this.managementContext = managementContext;
             this.app = managementContext.getEntityManager().createEntity(appSpec);
             doBuild();
-            Entities.startManagement(app, managementContext);
+            // not needed with 0.9.0 (TODO - remove when confirmed)
+//            Entities.startManagement(app, managementContext);
             managed = true;
             return app;
         } finally {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java b/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
index 573da76..202ecf4 100644
--- a/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
+++ b/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
@@ -38,12 +38,14 @@ import org.apache.brooklyn.api.location.LocationRegistry;
 import org.apache.brooklyn.api.location.LocationResolver;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.config.ConfigMap;
-import org.apache.brooklyn.core.catalog.CatalogPredicates;
 import org.apache.brooklyn.core.config.ConfigPredicates;
 import org.apache.brooklyn.core.config.ConfigUtils;
 import org.apache.brooklyn.core.location.internal.LocationInternal;
 import org.apache.brooklyn.core.mgmt.internal.LocalLocationManager;
+import org.apache.brooklyn.core.typereg.RegisteredTypePredicates;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.config.ConfigBag;
@@ -72,8 +74,8 @@ import com.google.common.collect.Sets;
  * <p>
  * Any location item added to the catalog must therefore be registered here.
  * Whenever an item is added to the catalog, it will automatically call 
- * {@link #updateDefinedLocation(CatalogItem)}. Similarly, when a location
- * is deleted from the catalog it will call {@link #removeDefinedLocation(CatalogItem)}.
+ * {@link #updateDefinedLocation(RegisteredType)}. Similarly, when a location
+ * is deleted from the catalog it will call {@link #removeDefinedLocation(RegisteredType)}.
  * <p>
  * However, the location item in the catalog has an unparsed blob of YAML, which contains
  * important things like the type and the config of the location. This is only parsed when 
@@ -86,8 +88,8 @@ import com.google.common.collect.Sets;
  * <ol>
  *   <li>Call {@link BrooklynCatalog#addItems(String)}
  *     <ol>
- *       <li>This automatically calls {@link #updateDefinedLocation(CatalogItem)}
- *       <li>A LocationDefinition is creating, using as its id the {@link CatalogItem#getSymbolicName()}.
+ *       <li>This automatically calls {@link #updateDefinedLocation(RegisteredType)}
+ *       <li>A LocationDefinition is creating, using as its id the {@link RegisteredType#getSymbolicName()}.
  *           The definition's spec is {@code brooklyn.catalog:<symbolicName>:<version>},
  *     </ol>
  *   <li>A blueprint can reference the catalog item using its symbolic name, 
@@ -100,8 +102,8 @@ import com.google.common.collect.Sets;
  *           found for it.
  *       <li>This uses the {@link CatalogLocationResolver}, because the spec starts with {@code brooklyn.catalog:}.
  *       <li>This resolver extracts from the spec the <symobolicName>:<version>, and looks up the 
- *           catalog item using {@link BrooklynCatalog#getCatalogItem(String, String)}.
- *       <li>It then creates a {@link LocationSpec} by calling {@link BrooklynCatalog#createSpec(CatalogItem)}.
+ *           location item using the {@link BrooklynTypeRegistry}.
+ *       <li>It then creates a {@link LocationSpec} by calling {@link BrooklynTypeRegistry#createSpec(RegisteredType)}.
  *         <ol>
  *           <li>This first tries to use the type (that is in the YAML) as a simple Java class.
  *           <li>If that fails, it will resolve the type using {@link #resolve(String, Boolean, Map)}, which
@@ -113,7 +115,7 @@ import com.google.common.collect.Sets;
  *     </ol>
  * </ol>
  * 
- * There is no concept of a location version in this registry. The version
+ * TODO There is no concept of a location version in this registry. The version
  * in the catalog is generally ignored.
  */
 @SuppressWarnings({"rawtypes","unchecked"})
@@ -222,6 +224,21 @@ public class BasicLocationRegistry implements LocationRegistry {
         updateDefinedLocation(locDefinition);
     }
 
+    /**
+     * Converts the given item from the catalog into a LocationDefinition, and adds it
+     * to the registry (overwriting anything already registered with the id
+     * {@link RegisteredType#getId()}.
+     */
+    public void updateDefinedLocation(RegisteredType item) {
+        String id = item.getId();
+        String symbolicName = item.getSymbolicName();
+        String spec = CatalogLocationResolver.NAME + ":" + id;
+        Map<String, Object> config = ImmutableMap.<String, Object>of();
+        BasicLocationDefinition locDefinition = new BasicLocationDefinition(symbolicName, symbolicName, spec, config);
+        
+        updateDefinedLocation(locDefinition);
+    }
+
     public void removeDefinedLocation(CatalogItem<Location, LocationSpec<?>> item) {
         removeDefinedLocation(item.getSymbolicName());
     }
@@ -244,7 +261,7 @@ public class BasicLocationRegistry implements LocationRegistry {
             // we need ability/format for persisting named locations, and better support for adding+saving via REST/GUI)
             int count = 0; 
             String NAMED_LOCATION_PREFIX = "brooklyn.location.named.";
-            ConfigMap namedLocationProps = mgmt.getConfig().submap(ConfigPredicates.startingWith(NAMED_LOCATION_PREFIX));
+            ConfigMap namedLocationProps = mgmt.getConfig().submap(ConfigPredicates.nameStartsWith(NAMED_LOCATION_PREFIX));
             for (String k: namedLocationProps.asMapWithStringKeys().keySet()) {
                 String name = k.substring(NAMED_LOCATION_PREFIX.length());
                 // If has a dot, then is a sub-property of a named location (e.g. brooklyn.location.named.prod1.user=bob)
@@ -271,7 +288,7 @@ public class BasicLocationRegistry implements LocationRegistry {
                 definedLocations.putAll(oldDefined);
             }
             
-            for (CatalogItem<Location, LocationSpec<?>> item : mgmt.getCatalog().getCatalogItems(CatalogPredicates.IS_LOCATION)) {
+            for (RegisteredType item: mgmt.getTypeRegistry().getAll(RegisteredTypePredicates.IS_LOCATION)) {
                 updateDefinedLocation(item);
                 count++;
             }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/location/CatalogLocationResolver.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/location/CatalogLocationResolver.java b/core/src/main/java/org/apache/brooklyn/core/location/CatalogLocationResolver.java
index db4c0d5..5db14b7 100644
--- a/core/src/main/java/org/apache/brooklyn/core/location/CatalogLocationResolver.java
+++ b/core/src/main/java/org/apache/brooklyn/core/location/CatalogLocationResolver.java
@@ -28,7 +28,7 @@ import org.apache.brooklyn.api.location.LocationRegistry;
 import org.apache.brooklyn.api.location.LocationResolver;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,14 +53,14 @@ public class CatalogLocationResolver implements LocationResolver {
     @SuppressWarnings({ "rawtypes", "unchecked" })
     public Location newLocationFromString(Map locationFlags, String spec, LocationRegistry registry) {
         String id = spec.substring(NAME.length()+1);
-        CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(managementContext, id);
+        RegisteredType item = managementContext.getTypeRegistry().get(id);
         if (item.isDisabled()) {
             throw new IllegalStateException("Illegal use of disabled catalog item "+item.getSymbolicName()+":"+item.getVersion());
         } else if (item.isDeprecated()) {
             log.warn("Use of deprecated catalog item "+item.getSymbolicName()+":"+item.getVersion());
         }
         
-        LocationSpec origLocSpec = (LocationSpec) managementContext.getCatalog().createSpec((CatalogItem)item);
+        LocationSpec origLocSpec = (LocationSpec) managementContext.getTypeRegistry().createSpec(item, null, LocationSpec.class);
         LocationSpec locSpec = LocationSpec.create(origLocSpec)
                 .configure(locationFlags);
         return managementContext.getLocationManager().createLocation(locSpec);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/mgmt/EntityManagementUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/EntityManagementUtils.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/EntityManagementUtils.java
index 889f74f..9c4ebc1 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/EntityManagementUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/EntityManagementUtils.java
@@ -28,12 +28,12 @@ import javax.annotation.Nullable;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.effector.Effectors;
 import org.apache.brooklyn.core.entity.Entities;
@@ -89,6 +89,7 @@ public class EntityManagementUtils {
     }
     
     public static EntitySpec<? extends Application> createEntitySpecForApplication(ManagementContext mgmt, final String plan) {
+        // TODO-type-registry
         return PlanToSpecFactory.attemptWithLoaders(mgmt, new Function<PlanToSpecTransformer, EntitySpec<? extends Application>>() {
             @Override
             public EntitySpec<? extends Application> apply(PlanToSpecTransformer input) {
@@ -97,20 +98,16 @@ public class EntityManagementUtils {
         }).get();
     }
 
+    @Deprecated /** @deprecated since 0.9.0; use {@link BrooklynTypeRegistry#createSpec(RegisteredType, org.apache.brooklyn.api.typereg.RegisteredTypeConstraint, Class)} */
+    // not used in Brooklyn
     public static <T,SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createCatalogSpec(ManagementContext mgmt, CatalogItem<T, SpecT> item) {
         return createCatalogSpec(mgmt, item, ImmutableSet.<String>of());
     }
 
+    @Deprecated /** @deprecated since 0.9.0; use {@link BrooklynTypeRegistry#createSpec(RegisteredType, org.apache.brooklyn.api.typereg.RegisteredTypeConstraint, Class)} */
+    // not used in Brooklyn
     public static <T,SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createCatalogSpec(ManagementContext mgmt, final CatalogItem<T, SpecT> item, final Set<String> encounteredTypes) {
-        if (encounteredTypes.contains(item.getSymbolicName())) {
-            throw new IllegalStateException("Already encountered types " + encounteredTypes + " must not contain catalog item being resolver " + item.getSymbolicName());
-        }
-        return PlanToSpecFactory.attemptWithLoaders(mgmt, new Function<PlanToSpecTransformer, SpecT>() {
-            @Override
-            public SpecT apply(PlanToSpecTransformer input) {
-                return input.createCatalogSpec(item, encounteredTypes);
-            }
-        }).get();
+        return BasicBrooklynCatalog.internalCreateSpecWithTransformers(mgmt, item, encounteredTypes);
     }
 
     /** container for operation which creates something and which wants to return both
@@ -145,21 +142,21 @@ public class EntityManagementUtils {
     }
 
     public static <T extends Application> CreationResult<T,Void> start(T app) {
-        Task<Void> task = Entities.invokeEffector((EntityLocal)app, app, Startable.START,
+        Task<Void> task = Entities.invokeEffector(app, app, Startable.START,
             // locations already set in the entities themselves;
             // TODO make it so that this arg does not have to be supplied to START !
             MutableMap.of("locations", MutableList.of()));
         return CreationResult.of(app, task);
     }
     
-    public static CreationResult<List<Entity>, List<String>> addChildren(final EntityLocal parent, String yaml, Boolean start) {
+    public static CreationResult<List<Entity>, List<String>> addChildren(final Entity parent, String yaml, Boolean start) {
         if (Boolean.FALSE.equals(start))
             return CreationResult.of(addChildrenUnstarted(parent, yaml), null);
         return addChildrenStarting(parent, yaml);
     }
     
     /** adds entities from the given yaml, under the given parent; but does not start them */
-    public static List<Entity> addChildrenUnstarted(final EntityLocal parent, String yaml) {
+    public static List<Entity> addChildrenUnstarted(final Entity parent, String yaml) {
         log.debug("Creating child of "+parent+" from yaml:\n{}", yaml);
 
         ManagementContext mgmt = parent.getApplication().getManagementContext();
@@ -193,7 +190,7 @@ public class EntityManagementUtils {
         return children;
     }
 
-    public static CreationResult<List<Entity>,List<String>> addChildrenStarting(final EntityLocal parent, String yaml) {
+    public static CreationResult<List<Entity>,List<String>> addChildrenStarting(final Entity parent, String yaml) {
         final List<Entity> children = addChildrenUnstarted(parent, yaml);
         String childrenCountString;
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java
index 74f3de1..524f7b5 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/OsgiBrooklynClassLoadingContext.java
@@ -22,10 +22,9 @@ import java.net.URL;
 import java.util.Collection;
 import java.util.Collections;
 
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.ha.OsgiManager;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
@@ -48,11 +47,11 @@ public class OsgiBrooklynClassLoadingContext extends AbstractBrooklynClassLoadin
 
     public Collection<? extends OsgiBundleWithUrl> getBundles() {
         if (_bundles!=null || !hasBundles) return _bundles;
-        CatalogItem<?, ?> cat = CatalogUtils.getCatalogItemOptionalVersion(mgmt, catalogItemId);
-        if (cat==null) {
+        RegisteredType item = mgmt.getTypeRegistry().get(catalogItemId);
+        if (item==null) {
             throw new IllegalStateException("Catalog item not found for "+catalogItemId+"; cannot create loading context");
         }
-        _bundles = cat.getLibraries();
+        _bundles = item.getLibraries();
         return _bundles;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
index 284b357..cba394c 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java
@@ -33,7 +33,6 @@ import java.util.concurrent.atomic.AtomicLong;
 import javax.annotation.Nullable;
 
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.effector.Effector;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.drivers.EntityDriverManager;
@@ -49,6 +48,7 @@ import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityManager;
 import org.apache.brooklyn.api.mgmt.rebind.RebindManager;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.CatalogInitialization;
@@ -127,7 +127,8 @@ public abstract class AbstractManagementContext implements ManagementContextInte
                 if (input instanceof EntityInternal) {
                     EntityInternal internal = (EntityInternal)input;
                     if (internal.getCatalogItemId() != null) {
-                        CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(internal.getManagementContext(), internal.getCatalogItemId());
+                        RegisteredType item = internal.getManagementContext().getTypeRegistry().get(internal.getCatalogItemId());
+
                         if (item != null) {
                             return CatalogUtils.newClassLoadingContext(internal.getManagementContext(), item);
                         } else {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
index 10f349a..adbb01f 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
@@ -35,9 +35,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import javax.annotation.Nullable;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.mgmt.rebind.PersistenceExceptionHandler;
 import org.apache.brooklyn.api.mgmt.rebind.RebindExceptionHandler;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMemento;
@@ -48,6 +45,7 @@ import org.apache.brooklyn.api.mgmt.rebind.mementos.CatalogItemMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.Memento;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.objs.BrooklynObjectType;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
@@ -56,7 +54,6 @@ import org.apache.brooklyn.core.mgmt.classloading.ClassLoaderFromBrooklynClassLo
 import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore.StoreObjectAccessor;
 import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore.StoreObjectAccessorWithLock;
 import org.apache.brooklyn.core.mgmt.rebind.PeriodicDeltaChangeListener;
-import org.apache.brooklyn.core.mgmt.rebind.PersisterDeltaImpl;
 import org.apache.brooklyn.core.mgmt.rebind.dto.BrooklynMementoImpl;
 import org.apache.brooklyn.core.mgmt.rebind.dto.BrooklynMementoManifestImpl;
 import org.apache.brooklyn.util.collections.MutableMap;
@@ -66,9 +63,10 @@ import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.Beta;
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 import com.google.common.base.Stopwatch;
 import com.google.common.collect.ImmutableSet;
@@ -176,7 +174,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
         }
         // See RebindIteration.BrooklynObjectInstantiator.load(), for handling where catalog item is missing;
         // similar logic here.
-        CatalogItem<?, ?> catalogItem = CatalogUtils.getCatalogItemOptionalVersion(lookupContext.lookupManagementContext(), catalogItemId);
+        RegisteredType catalogItem = lookupContext.lookupManagementContext().getTypeRegistry().get(catalogItemId);
         if (catalogItem == null) {
             // TODO do we need to only log once, rather than risk log.warn too often? I think this only happens on rebind, so ok.
             LOG.warn("Unable to load catalog item "+catalogItemId+" for custom class loader of "+type+" "+objectId+"; will use default class loader");

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java
index 3d2ecef..98b5aa2 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java
@@ -40,6 +40,7 @@ import org.apache.brooklyn.api.objs.Identifiable;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.Feed;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.catalog.internal.CatalogBundleDto;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.config.BasicConfigKey;
@@ -439,7 +440,7 @@ public class XmlMementoSerializer<T> extends XmlSerializer<T> implements Memento
             try {
                 if (Strings.isNonBlank(catalogItemId)) {
                     if (lookupContext==null) throw new NullPointerException("lookupContext required to load catalog item "+catalogItemId);
-                    CatalogItem<?, ?> cat = CatalogUtils.getCatalogItemOptionalVersion(lookupContext.lookupManagementContext(), catalogItemId);
+                    RegisteredType cat = lookupContext.lookupManagementContext().getTypeRegistry().get(catalogItemId);
                     if (cat==null) throw new NoSuchElementException("catalog item: "+catalogItemId);
                     BrooklynClassLoadingContext clcNew = CatalogUtils.newClassLoadingContext(lookupContext.lookupManagementContext(), cat);
                     pushXstreamCustomClassLoader(clcNew);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindContextLookupContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindContextLookupContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindContextLookupContext.java
index 1faaa1c..eb55784 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindContextLookupContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindContextLookupContext.java
@@ -18,12 +18,8 @@
  */
 package org.apache.brooklyn.core.mgmt.rebind;
 
-import java.util.NoSuchElementException;
-
 import javax.annotation.Nullable;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
@@ -37,6 +33,8 @@ import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.Feed;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** Looks in {@link RebindContext} <i>and</i> {@link ManagementContext} to find entities, locations, etc. */
 public class RebindContextLookupContext implements LookupContext {
@@ -115,10 +113,13 @@ public class RebindContextLookupContext implements LookupContext {
         return result;
     }
 
+    @SuppressWarnings("deprecation")
     @Override
     public CatalogItem<?, ?> lookupCatalogItem(String id) {
         CatalogItem<?, ?> result = rebindContext.getCatalogItem(id);
         if (result == null) {
+            // TODO-type-registry
+//          result = managementContext.getTypeRegistry().get(id, null, null);
             result = CatalogUtils.getCatalogItemOptionalVersion(managementContext, id);
         }
         if (result == null) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
index 2279e8c..3655886 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
@@ -30,8 +30,6 @@ import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Application;
@@ -43,6 +41,7 @@ import org.apache.brooklyn.api.mgmt.rebind.RebindExceptionHandler;
 import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoManifest;
+import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoManifest.EntityMementoManifest;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoRawData;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.CatalogItemMemento;
@@ -53,12 +52,13 @@ import org.apache.brooklyn.api.mgmt.rebind.mementos.LocationMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.Memento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.PolicyMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.TreeNode;
-import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoManifest.EntityMementoManifest;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.objs.BrooklynObjectType;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.Feed;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.BrooklynFeatureEnablement;
 import org.apache.brooklyn.core.BrooklynLogging;
 import org.apache.brooklyn.core.BrooklynLogging.LoggingLevel;
@@ -98,6 +98,8 @@ import org.apache.brooklyn.util.javalang.Reflections;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -787,12 +789,13 @@ public abstract class RebindIteration {
             EntityMementoManifest ptr = entityManifest;
             while (ptr != null) {
                 if (ptr.getCatalogItemId() != null) {
-                    CatalogItem<?, ?> catalogItem = CatalogUtils.getCatalogItemOptionalVersion(managementContext, ptr.getCatalogItemId());
-                    if (catalogItem != null) {
-                        return catalogItem.getId();
+                    RegisteredType type = managementContext.getTypeRegistry().get(ptr.getCatalogItemId());
+                    if (type != null) {
+                        return type.getId();
                     } else {
                         //Couldn't find a catalog item with this id, but return it anyway and
                         //let the caller deal with the error.
+                        //TODO under what circumstances is this permitted?
                         return ptr.getCatalogItemId();
                     }
                 }
@@ -807,13 +810,13 @@ public abstract class RebindIteration {
             //The current convention is to set catalog item IDs to the java type (for both plain java or CAMP plan) they represent.
             //This will be applicable only the first time the store is rebinded, while the catalog items don't have the default
             //version appended to their IDs, but then we will have catalogItemId set on entities so not neede further anyways.
-            BrooklynCatalog catalog = managementContext.getCatalog();
+            BrooklynTypeRegistry types = managementContext.getTypeRegistry();
             ptr = entityManifest;
             while (ptr != null) {
-                CatalogItem<?, ?> catalogItem = catalog.getCatalogItem(ptr.getType(), BrooklynCatalog.DEFAULT_VERSION);
-                if (catalogItem != null) {
-                    LOG.debug("Inferred catalog item ID "+catalogItem.getId()+" for "+entityManifest+" from ancestor "+ptr);
-                    return catalogItem.getId();
+                RegisteredType t = types.get(ptr.getType(), BrooklynCatalog.DEFAULT_VERSION);
+                if (t != null) {
+                    LOG.debug("Inferred catalog item ID "+t.getId()+" for "+entityManifest+" from ancestor "+ptr);
+                    return t.getId();
                 }
                 if (ptr.getParent() != null) {
                     ptr = entityIdToManifest.get(ptr.getParent());
@@ -827,7 +830,8 @@ public abstract class RebindIteration {
             if (JavaBrooklynClassLoadingContext.create(managementContext).tryLoadClass(entityManifest.getType()).isPresent())
                 return null;
 
-            for (CatalogItem<?, ?> item : catalog.getCatalogItems()) {
+            // TODO get to the point when we can deprecate this behaviour!:
+            for (RegisteredType item : types.getAll()) {
                 BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(managementContext, item);
                 boolean canLoadClass = loader.tryLoadClass(entityManifest.getType()).isPresent();
                 if (canLoadClass) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/resolve/ResolveUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/resolve/ResolveUtils.java b/core/src/main/java/org/apache/brooklyn/core/resolve/ResolveUtils.java
index c3fc85f..6ecbe96 100644
--- a/core/src/main/java/org/apache/brooklyn/core/resolve/ResolveUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/core/resolve/ResolveUtils.java
@@ -21,18 +21,18 @@ package org.apache.brooklyn.core.resolve;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.policy.PolicySpec;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
 import org.apache.brooklyn.core.objs.BrooklynObjectInternal.ConfigurationSupportInternal;
 import org.apache.brooklyn.util.guava.Maybe;
 
+@Deprecated /** @deprecated since 0.9.0 never belonged here, and not used much; new principled TypeRegistry simplifies things */
+// only used for camp
+// TODO-type-registry
 public class ResolveUtils {
 
     @SuppressWarnings("unchecked")
@@ -40,16 +40,13 @@ public class ResolveUtils {
             String versionedId,
             BrooklynClassLoadingContext loader,
             Set<String> encounteredCatalogTypes) {
+        
         PolicySpec<? extends Policy> spec;
-        CatalogItem<?, ?> policyItem = CatalogUtils.getCatalogItemOptionalVersion(loader.getManagementContext(), versionedId);
-        if (policyItem != null && !encounteredCatalogTypes.contains(policyItem.getSymbolicName())) {
-            if (policyItem.getCatalogItemType() != CatalogItemType.POLICY) {
-                throw new IllegalStateException("Non-policy catalog item in policy context: " + policyItem);
-            }
-            @SuppressWarnings("rawtypes")
-            CatalogItem rawItem = policyItem;
-            spec = (PolicySpec<? extends Policy>) EntityManagementUtils.createCatalogSpec(loader.getManagementContext(), rawItem, encounteredCatalogTypes);
+        RegisteredType item = loader.getManagementContext().getTypeRegistry().get(versionedId);
+        if (item != null && !encounteredCatalogTypes.contains(item.getSymbolicName())) {
+            return loader.getManagementContext().getTypeRegistry().createSpec(item, null, PolicySpec.class);
         } else {
+            // TODO-type-registry pass the loader in to the above, and allow it to load with the loader
             spec = PolicySpec.create(loader.loadClass(versionedId, Policy.class));
         }
         return spec;