Repository: brooklyn-server
Updated Branches:
  refs/heads/master f07b6f06a -> e247841dd


change handling of icon url storage

previously we'd set iconUrl from a flag in AbstractEntity, but that field was 
never persisted.
now:
* that field is removed (since it wasn't persisted this shouldn't affect rebind)
* iconUrl is done by looking up the catalog item if nothing special is found on 
the object (usual path)
* if a special iconUrl is wanted on an instance, it should be set as a tag; 
this means it's persisted, and it can be done for any brooklyn object


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

Branch: refs/heads/master
Commit: 40fdfaf200885fcad119dbcca55e9aa27c82a993
Parents: 00d8789
Author: Alex Heneveld <[email protected]>
Authored: Fri Apr 28 15:57:45 2017 +0100
Committer: Alex Heneveld <[email protected]>
Committed: Tue May 2 11:43:47 2017 +0100

----------------------------------------------------------------------
 .../org/apache/brooklyn/api/entity/Entity.java  |  5 ++++
 .../internal/AbstractBrooklynObjectSpec.java    |  6 ++--
 .../BrooklynEntityDecorationResolver.java       | 31 ++++++++++----------
 .../spi/creation/BrooklynEntityMatcher.java     |  4 +++
 .../brooklyn/spi/creation/CampResolver.java     |  3 --
 .../core/catalog/internal/CatalogItemDo.java    |  5 ++++
 .../brooklyn/core/entity/AbstractEntity.java    | 15 ++++------
 .../core/entity/BrooklynConfigKeys.java         |  2 ++
 .../apache/brooklyn/core/mgmt/BrooklynTags.java |  5 ++++
 .../core/objs/AbstractBrooklynObject.java       |  1 +
 .../core/objs/BrooklynObjectInternal.java       |  3 ++
 .../brooklyn/core/typereg/RegisteredTypes.java  | 17 +++++++++++
 .../rest/resources/ApplicationResource.java     |  2 +-
 .../brooklyn/rest/resources/EntityResource.java |  2 +-
 .../rest/util/BrooklynRestResourceUtils.java    |  4 +--
 15 files changed, 71 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/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 b8e13b7..da9169e 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
@@ -38,6 +38,7 @@ import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Feed;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEvent;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
 import org.apache.brooklyn.util.guava.Maybe;
@@ -78,7 +79,11 @@ public interface Entity extends BrooklynObject {
     
     /** 
      * A URL pointing to an image which can be used to represent this entity.
+     * @deprecated since 0.12.0 look up the {@link RegisteredType} and use its
+     * {@link RegisteredType#getIconUrl()} or use conveniences such as 
+     * <code>RegisteredTypes.getIconUrl()</code>.
      */
+    @Deprecated
     @Nullable String getIconUrl();
     
     /**

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/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 adbb48b..b53722d 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
@@ -195,14 +195,14 @@ public abstract class AbstractBrooklynObjectSpec<T, SpecT 
extends AbstractBrookl
     /**
      * adds the given tags
      */
-    public SpecT tags(Iterable<Object> tagsToAdd) {
+    public SpecT tags(Iterable<? extends Object> tagsToAdd) {
         return tagsAdd(tagsToAdd);
     }
 
     /**
      * adds the given tags
      */
-    public SpecT tagsAdd(Iterable<Object> tagsToAdd) {
+    public SpecT tagsAdd(Iterable<? extends Object> tagsToAdd) {
         Iterables.addAll(this.tags, tagsToAdd);
         return self();
     }
@@ -210,7 +210,7 @@ public abstract class AbstractBrooklynObjectSpec<T, SpecT 
extends AbstractBrookl
     /**
      * replaces tags with the given
      */
-    public SpecT tagsReplace(Iterable<Object> tagsToReplace) {
+    public SpecT tagsReplace(Iterable<? extends Object> tagsToReplace) {
         this.tags.clear();
         Iterables.addAll(this.tags, tagsToReplace);
         return self();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
----------------------------------------------------------------------
diff --git 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
index ca47f7e..181fa67 100644
--- 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
+++ 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
@@ -18,18 +18,12 @@
  */
 package org.apache.brooklyn.camp.brooklyn.spi.creation;
 
-import java.io.Serializable;
+import static com.google.common.base.Preconditions.checkArgument;
+
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-
-import com.google.common.collect.Iterables;
-import com.sun.org.apache.xpath.internal.operations.Bool;
 import org.apache.brooklyn.api.entity.EntityInitializer;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
@@ -41,8 +35,7 @@ import org.apache.brooklyn.api.sensor.EnricherSpec;
 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.camp.brooklyn.spi.dsl.DslAccessible;
-import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.BrooklynDslCommon;
+import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
 import org.apache.brooklyn.core.mgmt.BrooklynTags;
 import org.apache.brooklyn.core.objs.BasicSpecParameter;
 import org.apache.brooklyn.core.typereg.RegisteredTypeLoadingContexts;
@@ -52,9 +45,11 @@ import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.task.DeferredSupplier;
 import org.apache.brooklyn.util.guava.Maybe;
 
-import javax.annotation.Nullable;
-
-import static com.google.common.base.Preconditions.checkArgument;
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 
 /**
  * Pattern for resolving "decorations" on service specs / entity specs, such 
as policies, enrichers, etc.
@@ -254,6 +249,10 @@ public abstract class BrooklynEntityDecorationResolver<DT> 
{
             if (decorationAttributeJsonValue != null) {
                 entitySpec.tagsAdd(decorationAttributeJsonValue);
             }
+            String iconUrl = attrs.get(BrooklynConfigKeys.ICON_URL);
+            if (iconUrl!=null) {
+                
entitySpec.tagsAdd(MutableList.of(BrooklynTags.newIconUrlTag(iconUrl)));
+            }
         }
 
         @Override
@@ -269,13 +268,15 @@ public abstract class 
BrooklynEntityDecorationResolver<DT> {
             } else if (!(brooklynTags instanceof List)) {
                 throw new 
IllegalArgumentException(BrooklynCampReservedKeys.BROOKLYN_TAGS + " should be a 
List of String elements. You supplied " + brooklynTags);
             } else {
-                checkArgument(Iterables.all((List) brooklynTags, new 
Predicate() {
+                checkArgument(Iterables.all((List<?>) brooklynTags, new 
Predicate<Object>() {
                     @Override
                     public boolean apply(Object input) {
                         return !(input instanceof DeferredSupplier);
                     }
                 }), BrooklynCampReservedKeys.BROOKLYN_TAGS + " should not 
contain DeferredSupplier. A DeferredSupplier is made when using 
$brooklyn:attributeWhenReady. You supplied " + brooklynTags);
-                return (List)brooklynTags;
+                @SuppressWarnings("unchecked")
+                List<Object> result = (List<Object>)brooklynTags;
+                return result;
             }
         }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
----------------------------------------------------------------------
diff --git 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
index 091e760..3b6e04b 100644
--- 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
+++ 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
@@ -30,6 +30,7 @@ import 
org.apache.brooklyn.camp.spi.pdp.AssemblyTemplateConstructor;
 import org.apache.brooklyn.camp.spi.pdp.Service;
 import org.apache.brooklyn.camp.spi.resolve.PdpMatcher;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
+import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
 import 
org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContext;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.exceptions.UserFacingException;
@@ -113,6 +114,9 @@ public class BrooklynEntityMatcher implements PdpMatcher {
         Object locations = attrs.remove("locations");
         if (locations!=null)
             builder.customAttribute("locations", locations);
+        Object iconUrl = attrs.remove(BrooklynConfigKeys.ICON_URL.getName());
+        if (iconUrl!=null)
+            builder.customAttribute(BrooklynConfigKeys.ICON_URL.getName(), 
iconUrl);
 
         MutableMap<Object, Object> brooklynFlags = MutableMap.of();
         Object origBrooklynFlags = 
attrs.remove(BrooklynCampReservedKeys.BROOKLYN_FLAGS);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
----------------------------------------------------------------------
diff --git 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
index 9ec8fd8..f68ffad 100644
--- 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
+++ 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
@@ -116,9 +116,6 @@ class CampResolver {
         }
 
         spec.stackCatalogItemId(item.getId());
-        if (!spec.getFlags().containsKey("iconUrl") && 
item.getIconUrl()!=null) {
-            spec.configure("iconUrl", item.getIconUrl());
-        }
 
         if (spec instanceof EntitySpec) {
             String name = spec.getDisplayName();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java
 
b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java
index c263e59..90697fe 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java
@@ -50,6 +50,11 @@ public class CatalogItemDo<T,SpecT> implements 
CatalogItem<T,SpecT>, BrooklynObj
         return itemDto;
     }
     
+    @Override
+    public ManagementContext getManagementContext() {
+        return catalog==null ? null : catalog.mgmt;
+    }
+    
     /**
      * @throws UnsupportedOperationException; Config not supported for catalog 
item. See {@link #getPlanYaml()}.
      */

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/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 bbc57ec..6c15afc 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
@@ -30,7 +30,6 @@ import java.util.Set;
 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.EntityType;
 import org.apache.brooklyn.api.entity.Group;
@@ -92,6 +91,7 @@ import org.apache.brooklyn.core.sensor.AttributeMap;
 import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.BasicNotificationSensor;
 import org.apache.brooklyn.core.sensor.Sensors;
+import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.collections.MutableSet;
@@ -222,7 +222,6 @@ public abstract class AbstractEntity extends 
AbstractBrooklynObject implements E
     private Reference<List<Location>> locations = new 
BasicReference<List<Location>>(ImmutableList.<Location>of()); // dups removed 
in addLocations
     private Reference<Long> creationTimeUtc = new 
BasicReference<Long>(System.currentTimeMillis());
     private Reference<String> displayName = new BasicReference<String>();
-    private Reference<String> iconUrl = new BasicReference<String>();
 
     private Collection<AbstractPolicy> policiesInternal = 
Lists.newCopyOnWriteArrayList();
     private Collection<AbstractEnricher> enrichersInternal = 
Lists.newCopyOnWriteArrayList();
@@ -384,8 +383,9 @@ public abstract class AbstractEntity extends 
AbstractBrooklynObject implements E
             displayNameAutoGenerated = true;
         }
 
-        if (flags.get("iconUrl") != null) {
-            iconUrl.set((String) flags.remove("iconUrl"));
+        if (flags.get(BrooklynConfigKeys.ICON_URL.getName()) != null) {
+            // shouldn't be used; CAMP parser leaves it as a top-level 
attribute which is converted to a tag
+            tags().addTag(BrooklynTags.newIconUrlTag((String) 
flags.remove(BrooklynConfigKeys.ICON_URL.getName())));
         }
         
         // allow config keys, and fields, to be set from these flags if they 
have a SetFromFlag annotation
@@ -514,7 +514,6 @@ public abstract class AbstractEntity extends 
AbstractBrooklynObject implements E
             AttributeMap oldAttribs = attributesInternal;
             long oldCreationTimeUtc = creationTimeUtc.get();
             String oldDisplayName = displayName.get();
-            String oldIconUrl = iconUrl.get();
 
             parent = 
managementContext.getStorage().getReference(getId()+"-parent");
             groupsInternal = 
SetFromLiveMap.create(managementContext.getStorage().<Group,Boolean>getMap(getId()+"-groups"));
@@ -522,7 +521,6 @@ public abstract class AbstractEntity extends 
AbstractBrooklynObject implements E
             locations = 
managementContext.getStorage().getNonConcurrentList(getId()+"-locations");
             creationTimeUtc = 
managementContext.getStorage().getReference(getId()+"-creationTime");
             displayName = 
managementContext.getStorage().getReference(getId()+"-displayName");
-            iconUrl = 
managementContext.getStorage().getReference(getId()+"-iconUrl");
 
             // Only override stored defaults if we have actual values. We 
might be in setManagementContext
             // because we are reconstituting an existing entity in a new 
brooklyn management-node (in which
@@ -540,7 +538,6 @@ public abstract class AbstractEntity extends 
AbstractBrooklynObject implements E
             } else {
                 displayNameAutoGenerated = false;
             }
-            if (iconUrl.isNull()) iconUrl.set(oldIconUrl);
 
             configsInternal = new EntityConfigMap(this, 
managementContext.getStorage().<ConfigKey<?>, Object>getMap(getId()+"-config"));
             if (!oldConfig.isEmpty()) {
@@ -572,9 +569,9 @@ public abstract class AbstractEntity extends 
AbstractBrooklynObject implements E
         return displayName.get();
     }
     
-    @Override
+    @Override @Deprecated
     public String getIconUrl() {
-        return iconUrl.get();
+        return RegisteredTypes.getIconUrl(this);
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java 
b/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
index 40baf65..0ae50d2 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
@@ -246,6 +246,8 @@ public class BrooklynConfigKeys {
             
.runtimeInheritance(BasicConfigInheritance.NOT_REINHERITED_ELSE_DEEP_MERGE)
             .build();
 
+    public static final ConfigKey<String> ICON_URL = 
newStringConfigKey("iconUrl");
+
     private BrooklynConfigKeys() {}
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
index 7f8b0c8..c8248f1 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
@@ -38,6 +38,7 @@ public class BrooklynTags {
     public static final String YAML_SPEC_KIND = "yaml_spec";
     public static final String NOTES_KIND = "notes";
     public static final String OWNER_ENTITY_ID = "owner_entity_id";
+    public static final String ICON_URL = "icon_url";
 
     public static class NamedStringTag implements Serializable {
         private static final long serialVersionUID = 7932098757009051348L;
@@ -134,6 +135,10 @@ public class BrooklynTags {
         return new NamedStringTag(OWNER_ENTITY_ID, ownerId);
     }
 
+    public static NamedStringTag newIconUrlTag(String iconUrl) {
+        return new NamedStringTag(ICON_URL, iconUrl);
+    }
+
     public static TraitsTag newTraitsTag(List<Class<?>> interfaces) {
         return new TraitsTag(interfaces);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java 
b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java
index 9ba5a61..3d7b552 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java
@@ -170,6 +170,7 @@ public abstract class AbstractBrooklynObject implements 
BrooklynObjectInternal {
         this.managementContext = managementContext;
     }
 
+    @Override
     public ManagementContext getManagementContext() {
         return managementContext;
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java 
b/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java
index 44ed3b8..6ad42f4 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java
@@ -21,6 +21,7 @@ package org.apache.brooklyn.core.objs;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
 import org.apache.brooklyn.api.mgmt.rebind.Rebindable;
 import org.apache.brooklyn.api.objs.BrooklynObject;
@@ -51,6 +52,8 @@ public interface BrooklynObjectInternal extends 
BrooklynObject, Rebindable {
     @Override
     RebindSupport<?> getRebindSupport();
     
+    ManagementContext getManagementContext();
+    
     @Override
     ConfigurationSupportInternal config();
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/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 cfc7ec4..b3886bd 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
@@ -31,6 +31,7 @@ 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.objs.BrooklynObject;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.RegisteredType.TypeImplementationPlan;
@@ -38,6 +39,8 @@ import 
org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.mgmt.BrooklynTags;
+import org.apache.brooklyn.core.mgmt.BrooklynTags.NamedStringTag;
 import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
 import 
org.apache.brooklyn.core.typereg.JavaClassNameTypePlanTransformer.JavaClassNameTypeImplementationPlan;
 import org.apache.brooklyn.util.exceptions.Exceptions;
@@ -453,4 +456,18 @@ public class RegisteredTypes {
         return Maybe.of(object);
     }
 
+    public static String getIconUrl(BrooklynObject object) {
+        if (object==null) return null;
+        
+        NamedStringTag fromTag = BrooklynTags.findFirst(BrooklynTags.ICON_URL, 
object.tags().getTags());
+        if (fromTag!=null) return fromTag.getContents();
+        
+        ManagementContext mgmt = 
((BrooklynObjectInternal)object).getManagementContext();
+        if (mgmt==null) return null;
+        BrooklynTypeRegistry registry = mgmt.getTypeRegistry();
+        if (registry==null) return null;
+        RegisteredType item = registry.get( object.getCatalogItemId() );
+        if (item==null) return null;
+        return item.getIconUrl();
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
----------------------------------------------------------------------
diff --git 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
index 4aec34b..5d8dfb6 100644
--- 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
+++ 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
@@ -107,7 +107,7 @@ public class ApplicationResource extends 
AbstractBrooklynRestResource implements
 
         Lifecycle serviceState = 
entity.getAttribute(Attributes.SERVICE_STATE_ACTUAL);
 
-        String iconUrl = entity.getIconUrl();
+        String iconUrl = RegisteredTypes.getIconUrl(entity);
         if (iconUrl!=null) {
             if (brooklyn().isUrlServerSideAndSafe(iconUrl))
                 // route to server if it is a server-side url

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
----------------------------------------------------------------------
diff --git 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
index efc8838..e914d1e 100644
--- 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
+++ 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
@@ -155,7 +155,7 @@ public class EntityResource extends 
AbstractBrooklynRestResource implements Enti
     @Override
     public Response getIcon(String applicationId, String entityId) {
         Entity entity = brooklyn().getEntity(applicationId, entityId);
-        String url = entity.getIconUrl();
+        String url = RegisteredTypes.getIconUrl(entity);
         if (url == null)
             return Response.status(Status.NO_CONTENT).build();
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/40fdfaf2/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java
----------------------------------------------------------------------
diff --git 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java
 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java
index 6645c5c..d9eb7ee 100644
--- 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java
+++ 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java
@@ -65,9 +65,9 @@ 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.javalang.coerce.PrimitiveStringTypeCoercions;
 import org.apache.brooklyn.util.net.Urls;
 import org.apache.brooklyn.util.text.Strings;
 import org.slf4j.Logger;
@@ -552,7 +552,7 @@ public class BrooklynRestResourceUtils {
             }
         }
         
-        if (TypeCoercions.isPrimitiveOrBoxer(value.getClass())) return value;
+        if (PrimitiveStringTypeCoercions.isPrimitiveOrBoxer(value.getClass())) 
return value;
         return value.toString();
     }
 

Reply via email to