This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git


The following commit(s) were added to refs/heads/master by this push:
     new 17d95d612d add child tags at start of list, in front of parent tags
17d95d612d is described below

commit 17d95d612de7d369a3fd27c56c55acd8294e7e3b
Author: Alex Heneveld <[email protected]>
AuthorDate: Tue Dec 6 09:28:07 2022 +0000

    add child tags at start of list, in front of parent tags
    
    this causes the right icon to be found by findFirst (and any other things 
that use findFirst)
---
 .../api/internal/AbstractBrooklynObjectSpec.java   |  8 +++++
 .../apache/brooklyn/api/objs/BrooklynObject.java   |  3 +-
 .../creation/BrooklynEntityDecorationResolver.java | 11 +++++--
 .../brooklyn/camp/brooklyn/EntitiesYamlTest.java   | 37 ++++++++++++++++++++++
 .../catalog/internal/CatalogItemDtoAbstract.java   | 14 ++++++++
 .../brooklyn/core/objs/AbstractBrooklynObject.java | 13 ++++++++
 6 files changed, 83 insertions(+), 3 deletions(-)

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 20b50d9069..cb8679614d 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
@@ -218,6 +218,14 @@ public abstract class AbstractBrooklynObjectSpec<T, SpecT 
extends AbstractBrookl
         return self();
     }
 
+    public SpecT tagsAddAtStart(Iterable<? extends Object> tagsToAdd) {
+        MutableSet<Object> oldTags = MutableSet.copyOf(this.tags);
+        tags.clear();
+        Iterables.addAll(this.tags, tagsToAdd);
+        Iterables.addAll(this.tags, oldTags);
+        return self();
+    }
+
     /**
      * replaces tags with the given
      */
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 95afe9ee9a..e44f74be1f 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
@@ -120,7 +120,8 @@ public interface BrooklynObject extends Identifiable, 
Configurable {
         boolean addTag(@Nonnull Object tag);
         
         boolean addTags(@Nonnull Iterable<?> tags);
-        
+        boolean addTagsAtStart(@Nonnull Iterable<?> tags);
+
         boolean removeTag(@Nonnull Object tag);
     }
     
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 7da9d97840..256ba697b0 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
@@ -276,13 +276,20 @@ public abstract class 
BrooklynEntityDecorationResolver<DT> {
 
         @Override
         public void decorate(EntitySpec<?> entitySpec, ConfigBag attrs, 
Set<String> encounteredRegisteredTypeIds) {
+            /* 2022-12 we now add tags at the start, so children tags get 
found before parent tags;
+             * this causes eg icons to resolve correctly (not take parent 
icons), and in general a cleaner tags list
+             * (might be nice eventually to have a dedicated field for 
iconUrl, like we do on registered types,
+             * but this seems worth doing as well, and is sufficient to solve 
the problem of parent icons)
+             */
+
             Iterable<Object> decorationAttributeJsonValue = 
getDecorationAttributeJsonValue(attrs);
             if (decorationAttributeJsonValue != null) {
-                entitySpec.tagsAdd(decorationAttributeJsonValue);
+                entitySpec.tagsAddAtStart(decorationAttributeJsonValue);
             }
+
             String iconUrl = attrs.get(BrooklynConfigKeys.ICON_URL);
             if (iconUrl!=null) {
-                
entitySpec.tagsAdd(MutableList.of(BrooklynTags.newIconUrlTag(iconUrl)));
+                
entitySpec.tagsAddAtStart(MutableList.of(BrooklynTags.newIconUrlTag(iconUrl)));
             }
         }
 
diff --git 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EntitiesYamlTest.java
 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EntitiesYamlTest.java
index 5ff1a707e8..4220131ac9 100644
--- 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EntitiesYamlTest.java
+++ 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EntitiesYamlTest.java
@@ -20,6 +20,8 @@ package org.apache.brooklyn.camp.brooklyn;
 
 import org.apache.brooklyn.api.entity.EntityInitializer;
 import 
org.apache.brooklyn.camp.brooklyn.TestSensorAndEffectorInitializerBase.*;
+import org.apache.brooklyn.core.mgmt.BrooklynTags;
+import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
@@ -1271,4 +1273,39 @@ public class EntitiesYamlTest extends AbstractYamlTest {
         Assert.assertEquals(camp.platformComponentTemplates().links().size(), 
0);
         Assert.assertEquals(camp.platformComponents().links().size(), 0);
     }
+
+    public void testIconUrlInheritance() throws Exception {
+        addCatalogItems(
+                "brooklyn.catalog:",
+                "  itemType: entity",
+                "  items:",
+
+                "  - id: parent",
+                "    item:",
+                "      type: " + TestEntity.class.getName(),
+                "      name: Parent",
+                "      iconUrl: http://parent/";,
+
+                "  - id: child",
+                "    item:",
+                "      type: parent",
+                "      name: Child",
+                "      iconUrl: http://child/";,
+
+                "  - id: grandchild",
+                "    item:",
+                "      type: child",
+                "      name: Grandchild");
+
+
+
+        Entity app = createAndStartApplication(
+                "services:",
+                "- type: grandchild");
+
+        Entity child = Iterables.getOnlyElement(app.getChildren());
+        Asserts.assertEquals(RegisteredTypes.getIconUrl(child), 
"http://child/";);
+        Asserts.assertEquals(child.getDisplayName(), "Grandchild");
+    }
+
 }
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 7292bc4076..b361162490 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
@@ -35,6 +35,7 @@ import org.apache.brooklyn.core.objs.AbstractBrooklynObject;
 import org.apache.brooklyn.core.relations.EmptyRelationSupport;
 import org.apache.brooklyn.core.typereg.RegisteredTypeNaming;
 import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.flags.FlagUtils;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.apache.brooklyn.util.http.auth.Credentials;
@@ -314,6 +315,19 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> 
extends AbstractBrooklynO
             return result;
         }
 
+        @Override
+        public boolean addTagsAtStart(Iterable<?> newTags) {
+            boolean result;
+            synchronized (tags) {
+                MutableSet<Object> oldTags = MutableSet.copyOf(tags);
+                tags.clear();
+                Iterables.addAll(tags, newTags);
+                result = Iterables.addAll(tags, oldTags);
+            }
+            onTagsChanged();
+            return result;
+        }
+
         @Override
         public boolean removeTag(Object tag) {
             boolean result;
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 a725633776..a2d6897cc9 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
@@ -295,6 +295,19 @@ public abstract class AbstractBrooklynObject implements 
BrooklynObjectInternal {
             return result;
         }
 
+        @Override
+        public boolean addTagsAtStart(Iterable<?> newTags) {
+            boolean result;
+            synchronized (tags) {
+                MutableSet<Object> oldTags = MutableSet.copyOf(tags);
+                tags.clear();
+                Iterables.addAll(tags, newTags);
+                result = Iterables.addAll(tags, oldTags);
+            }
+            onTagsChanged();
+            return result;
+        }
+
         @Override
         public boolean removeTag(Object tag) {
             boolean result;

Reply via email to