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

[09/18] incubator-brooklyn git commit: Catalog versioning - groundwork for returning the latest version if no version specified

Catalog versioning - groundwork for returning the latest version if no version specified


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

Branch: refs/heads/master
Commit: 415619a3c2e230c6c700159ad97a001b584da9d7
Parents: 5661ac4
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Mon Nov 10 18:56:39 2014 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Nov 13 11:49:52 2014 +0200

----------------------------------------------------------------------
 .../java/brooklyn/catalog/BrooklynCatalog.java  |  3 +-
 .../catalog/internal/BasicBrooklynCatalog.java  | 40 +++++++++++++++++---
 .../internal/CatalogItemDtoAbstract.java        |  2 +-
 .../internal/CatalogItemVersionComparator.java  | 16 ++++++++
 .../brooklyn/catalog/internal/CatalogUtils.java | 32 +++++++++++++++-
 .../catalog/internal/CatalogDtoTest.java        |  2 +-
 .../entity/rebind/RebindTestFixture.java        |  3 +-
 .../BrooklynComponentTemplateResolver.java      |  5 +--
 .../BrooklynEntityDecorationResolver.java       |  8 ++--
 .../lookup/AbstractTemplateBrooklynLookup.java  |  9 +----
 .../camp/brooklyn/AbstractYamlTest.java         |  2 +-
 .../rest/resources/ApplicationResource.java     |  3 +-
 .../rest/resources/CatalogResource.java         | 22 ++++++-----
 .../rest/util/BrooklynRestResourceUtils.java    |  3 +-
 .../rest/resources/CatalogResourceTest.java     |  2 +-
 15 files changed, 112 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java b/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java
index ce0d928..cac3038 100644
--- a/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java
+++ b/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java
@@ -24,6 +24,7 @@ import java.util.NoSuchElementException;
 import com.google.common.base.Predicate;
 
 public interface BrooklynCatalog {
+    static String DEFAULT_VERSION = "0.0.0_DEFAULT_VERSION";
 
     /** @return The item with the given {@link brooklyn.catalog.CatalogItem#getSymbolicName()
      * symbolicName}, or null if not found.
@@ -47,7 +48,7 @@ public interface BrooklynCatalog {
      * @throws NoSuchElementException if not found */
     void deleteCatalogItem(String symbolicName, String version);
 
-    /** variant of {@link #getCatalogItem(String)} which checks (and casts) type for convenience
+    /** 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

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
index 43da70f..f74e24c 100644
--- a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
+++ b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
@@ -68,6 +68,7 @@ import com.google.common.base.Predicates;
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Iterables;
 
 public class BasicBrooklynCatalog implements BrooklynCatalog {
@@ -168,7 +169,13 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     }
 
     protected CatalogItemDo<?,?> getCatalogItemDo(String symbolicName, String version) {
-        String versionedId = CatalogUtils.getVersionedId(symbolicName, version);
+        String fixedVersionId = getFixedVersionId(symbolicName, version);
+        if (fixedVersionId == null) {
+            //no items with symbolicName exist
+            return null;
+        }
+
+        String versionedId = CatalogUtils.getVersionedId(symbolicName, fixedVersionId);
         CatalogItemDo<?, ?> item = null;
         //TODO should remove "manual additions" bucket; just have one map a la osgi
         if (manualAdditionsCatalog!=null) item = manualAdditionsCatalog.getIdCache().get(versionedId);
@@ -176,10 +183,28 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         return item;
     }
     
+    private String getFixedVersionId(String symbolicName, String version) {
+        if (!DEFAULT_VERSION.equals(version)) {
+            return version;
+        } else {
+            return getDefaultVersion(symbolicName);
+        }
+    }
+
+    private String getDefaultVersion(String symbolicName) {
+        Iterable<CatalogItem<Object, Object>> versions = getCatalogItems(CatalogPredicates.symbolicName(Predicates.equalTo(symbolicName)));
+        ImmutableSortedSet<CatalogItem<?, ?>> orderedVersions = ImmutableSortedSet.orderedBy(new CatalogItemVersionComparator()).addAll(versions).build();
+        if (!orderedVersions.isEmpty()) {
+            return orderedVersions.iterator().next().getVersion();
+        } else {
+            return null;
+        }
+    }
+
     @Override
     @Deprecated
     public CatalogItem<?,?> getCatalogItem(String id) {
-        return getCatalogItem(id, NO_VERSION);
+        return getCatalogItem(id, DEFAULT_VERSION);
     }
     
     @Override
@@ -194,6 +219,8 @@ 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);
     }
 
@@ -201,7 +228,10 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     public void deleteCatalogItem(String id, String version) {
         log.debug("Deleting manual catalog item from "+mgmt+": "+id + ":" + version);
         checkNotNull(id, "id");
-        checkNotNull(id, "version");
+        checkNotNull(version, "version");
+        if (DEFAULT_VERSION.equals(version)) {
+            throw new IllegalStateException("Deleting items with unspecified version (argument DEFAULT_VERSION) not supported.");
+        }
         CatalogItem<?, ?> item = getCatalogItem(id, version);
         CatalogItemDtoAbstract<?,?> itemDto = getAbstractCatalogItem(item);
         if (itemDto == null) {
@@ -224,7 +254,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     @Override
     @Deprecated
     public <T,SpecT> CatalogItem<T,SpecT> getCatalogItem(Class<T> type, String id) {
-        return getCatalogItem(type, id, NO_VERSION);
+        return getCatalogItem(type, id, DEFAULT_VERSION);
     }
     
     @SuppressWarnings("unchecked")
@@ -417,7 +447,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         symbolicName = (String) catalog.getMaybe("symbolicName").orNull();
         if (Strings.isBlank(symbolicName)) {
             symbolicName = (String) catalog.getMaybe("id").orNull();
-            if (Strings.isNonBlank(symbolicName) && symbolicName.indexOf(CatalogUtils.VERSION_DELIMITER) != -1) {
+            if (Strings.isNonBlank(symbolicName) && CatalogUtils.looksLikeVersionedId(symbolicName)) {
                 symbolicName = CatalogUtils.getIdFromVersionedId(symbolicName);
                 version = CatalogUtils.getVersionFromVersionedId(symbolicName);
             }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
index f834f15..f10aee1 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
@@ -325,7 +325,7 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
                     name = null;
                     version = null;
                     url = inlineRef;
-                } else if (inlineRef.indexOf(CatalogUtils.VERSION_DELIMITER) != -1) {
+                } else if (CatalogUtils.looksLikeVersionedId(inlineRef)) {
                     //looks like a name+version ref
                     name = CatalogUtils.getIdFromVersionedId(inlineRef);
                     version = CatalogUtils.getVersionFromVersionedId(inlineRef);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/core/src/main/java/brooklyn/catalog/internal/CatalogItemVersionComparator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemVersionComparator.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemVersionComparator.java
new file mode 100644
index 0000000..3e279a4
--- /dev/null
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemVersionComparator.java
@@ -0,0 +1,16 @@
+package brooklyn.catalog.internal;
+
+import java.util.Comparator;
+
+import brooklyn.catalog.CatalogItem;
+
+public class CatalogItemVersionComparator implements Comparator<CatalogItem<?, ?>> {
+
+    protected CatalogItemVersionComparator() {}
+
+    @Override
+    public int compare(CatalogItem<?, ?> o1, CatalogItem<?, ?> o2) {
+        return -o1.getVersion().compareTo(o2.getVersion());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java b/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
index 25c8d8d..849075f 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogUtils.java
@@ -27,6 +27,7 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.basic.BrooklynObject;
 import brooklyn.basic.BrooklynObjectInternal;
+import brooklyn.catalog.BrooklynCatalog;
 import brooklyn.catalog.CatalogItem;
 import brooklyn.catalog.CatalogItem.CatalogBundle;
 import brooklyn.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
@@ -141,9 +142,13 @@ public class CatalogUtils {
             log.debug(message, args);
     }
 
+    public static boolean looksLikeVersionedId(String versionedId) {
+        return versionedId.indexOf(VERSION_DELIMITER) != -1;
+    }
+
     public static String getIdFromVersionedId(String versionedId) {
         if (versionedId == null) return null;
-        int versionDelimiterPos = versionedId.lastIndexOf(CatalogUtils.VERSION_DELIMITER);
+        int versionDelimiterPos = versionedId.lastIndexOf(VERSION_DELIMITER);
         if (versionDelimiterPos != -1) {
             return versionedId.substring(0, versionDelimiterPos);
         } else {
@@ -153,7 +158,7 @@ public class CatalogUtils {
 
     public static String getVersionFromVersionedId(String versionedId) {
         if (versionedId == null) return null;
-        int versionDelimiterPos = versionedId.lastIndexOf(CatalogUtils.VERSION_DELIMITER);
+        int versionDelimiterPos = versionedId.lastIndexOf(VERSION_DELIMITER);
         if (versionDelimiterPos != -1) {
             return versionedId.substring(versionDelimiterPos+1);
         } else {
@@ -165,4 +170,27 @@ 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.
+    public static CatalogItem<?, ?> getCatalogItemOptionalVersion(ManagementContext mgmt, String versionedId) {
+        if (looksLikeVersionedId(versionedId)) {
+            String id = getIdFromVersionedId(versionedId);
+            String version = getVersionFromVersionedId(versionedId);
+            return mgmt.getCatalog().getCatalogItem(id, version);
+        } else {
+            return mgmt.getCatalog().getCatalogItem(versionedId, BrooklynCatalog.DEFAULT_VERSION);
+        }
+    }
+
+    public static <T,SpecT> CatalogItem<T, SpecT> getCatalogItemOptionalVersion(ManagementContext mgmt, Class<T> type, String versionedId) {
+        if (looksLikeVersionedId(versionedId)) {
+            String id = getIdFromVersionedId(versionedId);
+            String version = getVersionFromVersionedId(versionedId);
+            return mgmt.getCatalog().getCatalogItem(type, id, version);
+        } else {
+            return mgmt.getCatalog().getCatalogItem(type, versionedId, BrooklynCatalog.DEFAULT_VERSION);
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/core/src/test/java/brooklyn/catalog/internal/CatalogDtoTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/catalog/internal/CatalogDtoTest.java b/core/src/test/java/brooklyn/catalog/internal/CatalogDtoTest.java
index 07585b2..8ab75d5 100644
--- a/core/src/test/java/brooklyn/catalog/internal/CatalogDtoTest.java
+++ b/core/src/test/java/brooklyn/catalog/internal/CatalogDtoTest.java
@@ -135,7 +135,7 @@ public class CatalogDtoTest {
     public void testVersionedIdSplitter() {
         String id = "simple.id";
         String version = "0.1.2";
-        String versionedId = id + CatalogUtils.VERSION_DELIMITER + version;
+        String versionedId = CatalogUtils.getVersionedId(id, version);
         
         Assert.assertNull(CatalogUtils.getIdFromVersionedId(null));
         Assert.assertNull(CatalogUtils.getVersionFromVersionedId(null));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java b/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java
index f97fb85..2b221d1 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RebindTestFixture.java
@@ -35,6 +35,7 @@ import brooklyn.catalog.CatalogItem;
 import brooklyn.catalog.internal.CatalogUtils;
 import brooklyn.config.BrooklynProperties;
 import brooklyn.entity.basic.Entities;
+import brooklyn.entity.basic.EntityFunctions;
 import brooklyn.entity.basic.StartableApplication;
 import brooklyn.entity.rebind.persister.BrooklynMementoPersisterToObjectStore;
 import brooklyn.entity.rebind.persister.FileBasedObjectStore;
@@ -53,6 +54,7 @@ import brooklyn.util.time.Duration;
 
 import com.google.api.client.util.Sets;
 import com.google.common.annotations.Beta;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
@@ -181,7 +183,6 @@ public abstract class RebindTestFixture<T extends StartableApplication> {
         return rebind(checkSerializable, false);
     }
 
-    @SuppressWarnings("unchecked")
     protected T rebind(boolean checkSerializable, boolean terminateOrigManagementContext) throws Exception {
         return rebind(checkSerializable, terminateOrigManagementContext, (File)null);
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index b384d98..e641b50 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -191,10 +191,7 @@ public class BrooklynComponentTemplateResolver {
     public CatalogItem<Entity,EntitySpec<?>> getCatalogItem() {
         String type = getBrooklynType();
         if (type != null) {
-            BrooklynCatalog catalog = loader.getManagementContext().getCatalog();
-            return catalog.getCatalogItem(Entity.class,
-                    CatalogUtils.getIdFromVersionedId(type),
-                    CatalogUtils.getVersionFromVersionedId(type));
+            return CatalogUtils.getCatalogItemOptionalVersion(loader.getManagementContext(), Entity.class,  type);
         } else {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
index 13c6454..8fd080b 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
@@ -122,12 +122,12 @@ public abstract class BrooklynEntityDecorationResolver<DT> {
             decorations.add(spec);
         }
         private CatalogItem<?, ?> getPolicyCatalogItem(BrooklynCatalog catalog, String policyType) {
-            String id = CatalogUtils.getIdFromVersionedId(policyType);
-            String version = CatalogUtils.getVersionFromVersionedId(policyType);
-            if (id != null) {
+            if (CatalogUtils.looksLikeVersionedId(policyType)) {
+                String id = CatalogUtils.getIdFromVersionedId(policyType);
+                String version = CatalogUtils.getVersionFromVersionedId(policyType);
                 return catalog.getCatalogItem(id, version);
             } else {
-                return catalog.getCatalogItem(policyType);
+                return catalog.getCatalogItem(policyType, BrooklynCatalog.DEFAULT_VERSION);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
index c329193..54a3214 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
@@ -25,6 +25,7 @@ import io.brooklyn.camp.spi.collection.ResolvableLink;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.catalog.BrooklynCatalog;
 import brooklyn.catalog.CatalogItem;
 import brooklyn.catalog.internal.CatalogUtils;
 import brooklyn.entity.Entity;
@@ -50,13 +51,7 @@ public abstract class AbstractTemplateBrooklynLookup<T extends AbstractResource>
     }
 
     private CatalogItem<?, ?> getCatalogItem(String versionedId) {
-        String id = CatalogUtils.getIdFromVersionedId(versionedId);
-        String version = CatalogUtils.getVersionFromVersionedId(versionedId);
-        if (id != null) {
-            return bmc.getCatalog().getCatalogItem(id, version);
-        } else {
-            return bmc.getCatalog().getCatalogItem(id);
-        }
+        return CatalogUtils.getCatalogItemOptionalVersion(bmc, versionedId);
     }
 
     public abstract T adapt(CatalogItem<?,?> item);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/AbstractYamlTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/AbstractYamlTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/AbstractYamlTest.java
index fd856ca..aa1922c 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/AbstractYamlTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/AbstractYamlTest.java
@@ -153,7 +153,7 @@ public abstract class AbstractYamlTest {
     }
 
     protected String ver(String id) {
-        return id + CatalogUtils.VERSION_DELIMITER + TEST_VERSION;
+        return CatalogUtils.getVersionedId(id, TEST_VERSION);
     }
 
     public void forceCatalogUpdate() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/usage/rest-server/src/main/java/brooklyn/rest/resources/ApplicationResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/ApplicationResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/ApplicationResource.java
index 6b9be05..9511ebe 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/ApplicationResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/ApplicationResource.java
@@ -44,6 +44,7 @@ import org.codehaus.jackson.node.ObjectNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.catalog.internal.CatalogUtils;
 import brooklyn.entity.Application;
 import brooklyn.entity.Entity;
 import brooklyn.entity.Group;
@@ -384,7 +385,7 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
     }
 
     private void checkEntityTypeIsValid(String type) {
-        if (brooklyn().getCatalog().getCatalogItem(type) == null) {
+        if (CatalogUtils.getCatalogItemOptionalVersion(mgmt(), type) == null) {
             try {
                 brooklyn().getCatalog().getRootClassLoader().loadClass(type);
             } catch (ClassNotFoundException e) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java
index c874e14..188825f 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java
@@ -22,6 +22,7 @@ import java.io.InputStream;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.Set;
 
 import javax.annotation.Nullable;
@@ -33,6 +34,7 @@ import javax.ws.rs.core.Response.Status;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.catalog.BrooklynCatalog;
 import brooklyn.catalog.CatalogItem;
 import brooklyn.catalog.CatalogPredicates;
 import brooklyn.catalog.internal.BasicBrooklynCatalog;
@@ -126,20 +128,20 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
     @Override
     @Deprecated
     public void deleteEntity(String entityId) throws Exception {
-        CatalogItem<?,?> result = brooklyn().getCatalog().getCatalogItem(entityId);
-        if (result==null) {
+        try {
+            brooklyn().getCatalog().deleteCatalogItem(entityId);
+        } catch (NoSuchElementException e) {
             throw WebResourceUtils.notFound("Entity with id '%s' not found", entityId);
         }
-        brooklyn().getCatalog().deleteCatalogItem(entityId);
     }
 
     @Override
     public void deleteEntity(String entityId, String version) throws Exception {
-      CatalogItem<?,?> result = brooklyn().getCatalog().getCatalogItem(entityId, version);
-      if (result==null) {
-        throw WebResourceUtils.notFound("Entity with id '%s' not found", entityId);
+      try {
+          brooklyn().getCatalog().deleteCatalogItem(entityId, version);
+      } catch (NoSuchElementException e) {
+          throw WebResourceUtils.notFound("Entity with id '%s:%s' not found", entityId, version);
       }
-      brooklyn().getCatalog().deleteCatalogItem(entityId, version);
     }
 
     @Override
@@ -160,7 +162,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
         //Or we could provide asEntity/asPolicy cast methods on the CataloItem doing a safety check internally
         @SuppressWarnings("unchecked")
         CatalogItem<? extends Entity,EntitySpec<?>> result =
-                (CatalogItem<? extends Entity,EntitySpec<?>>) brooklyn().getCatalog().getCatalogItem(entityId);
+                (CatalogItem<? extends Entity,EntitySpec<?>>) brooklyn().getCatalog().getCatalogItem(entityId, BrooklynCatalog.DEFAULT_VERSION);
 
         if (result==null) {
             throw WebResourceUtils.notFound("Entity with id '%s' not found", entityId);
@@ -203,7 +205,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
     public CatalogItemSummary getPolicy(String policyId) {
         @SuppressWarnings("unchecked")
         CatalogItem<? extends Policy, PolicySpec<?>> result =
-                (CatalogItem<? extends Policy, PolicySpec<?>>) brooklyn().getCatalog().getCatalogItem(policyId);
+                (CatalogItem<? extends Policy, PolicySpec<?>>) brooklyn().getCatalog().getCatalogItem(policyId, BrooklynCatalog.DEFAULT_VERSION);
 
         if (result==null) {
             throw WebResourceUtils.notFound("Policy with id '%s' not found", policyId);
@@ -243,7 +245,7 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
     @Override
     @Deprecated
     public Response getIcon(String itemId) {
-        CatalogItem<?,?> result = brooklyn().getCatalog().getCatalogItem(itemId);
+        CatalogItem<?,?> result = brooklyn().getCatalog().getCatalogItem(itemId, BrooklynCatalog.DEFAULT_VERSION);
         return getCatalogItemIcon(result);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java b/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java
index 52f9df8..67519ec 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/util/BrooklynRestResourceUtils.java
@@ -41,6 +41,7 @@ import org.slf4j.LoggerFactory;
 import brooklyn.basic.BrooklynTypes;
 import brooklyn.catalog.BrooklynCatalog;
 import brooklyn.catalog.CatalogItem;
+import brooklyn.catalog.internal.CatalogUtils;
 import brooklyn.config.ConfigKey;
 import brooklyn.enricher.Enrichers;
 import brooklyn.entity.Application;
@@ -366,7 +367,7 @@ public class BrooklynRestResourceUtils {
 
     protected Map<?, ?> getRenderingConfigurationFor(String catalogId) {
         MutableMap<Object, Object> result = MutableMap.of();
-        CatalogItem<?,?> item = mgmt.getCatalog().getCatalogItem(catalogId);
+        CatalogItem<?,?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt, catalogId);
         if (item==null) return result;
         
         result.addIfNotNull("iconUrl", item.getIconUrl());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/415619a3/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java b/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
index a610cda..5eae763 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
@@ -265,6 +265,6 @@ public class CatalogResourceTest extends BrooklynRestResourceTest {
   }
   
   private static String ver(String id) {
-      return id + CatalogUtils.VERSION_DELIMITER + TEST_VERSION;
+      return CatalogUtils.getVersionedId(id, TEST_VERSION);
   }
 }