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 d0ce66d1cd support icons on bundles using bundleIconUrl
d0ce66d1cd is described below

commit d0ce66d1cda3c0c99b6d862b1b42bc6a2feafae7
Author: Alex Heneveld <g...@alex.heneveld.org>
AuthorDate: Thu Jun 27 17:21:42 2024 +0100

    support icons on bundles using bundleIconUrl
    
    previously worked from bom files only, now routine is shared with 
catalog.bom file in an archive;
    also sets tags, and searches in the bundle correctly to find the icon.
---
 .../mgmt/ha/BrooklynBomOsgiArchiveInstaller.java   | 57 +++++++++++-----------
 .../mgmt/internal/AbstractManagementContext.java   | 10 +++-
 .../BrooklynBomYamlCatalogBundleResolver.java      | 26 ++++++----
 .../brooklyn/rest/resources/BundleResource.java    |  4 +-
 4 files changed, 57 insertions(+), 40 deletions(-)

diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java
index 011abd316b..e6b89ca141 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java
@@ -389,38 +389,39 @@ public class BrooklynBomOsgiArchiveInstaller {
     private void discoverManifestFromCatalogBom(boolean isCatalogBomRequired) {
         discoveredManifest = new 
BundleMaker(mgmt()).getManifest(zipFile.getFile());
 
-        if (Strings.isNonBlank(bomText)) {
-            discoveredBomVersionedName = 
BasicBrooklynCatalog.getVersionedName(BasicBrooklynCatalog.getCatalogMetadata(bomText),
 false );
-            return;
-        }
-
-        ZipFile zf = null;
-        try {
+        Map<?, ?> catalogMetadata = null;
+        if (Strings.isBlank(bomText)) {
+            ZipFile zf = null;
             try {
-                zf = new ZipFile(zipFile.getFile());
-            } catch (IOException e) {
-                throw new IllegalArgumentException("Invalid ZIP/JAR archive: 
"+e);
-            }
-            ZipEntry bom = zf.getEntry(BasicBrooklynCatalog.CATALOG_BOM);
-            if (bom==null) {
-                bom = zf.getEntry("/"+BasicBrooklynCatalog.CATALOG_BOM);
-            }
-            if (bom==null) {
-                if (isCatalogBomRequired) {
-                    throw new IllegalArgumentException("Archive must contain a 
catalog.bom file in the root");
-                } else {
-                    return;
+                try {
+                    zf = new ZipFile(zipFile.getFile());
+                } catch (IOException e) {
+                    throw new IllegalArgumentException("Invalid ZIP/JAR 
archive: " + e);
                 }
+                ZipEntry bom = zf.getEntry(BasicBrooklynCatalog.CATALOG_BOM);
+                if (bom == null) {
+                    bom = zf.getEntry("/" + BasicBrooklynCatalog.CATALOG_BOM);
+                }
+                if (bom == null) {
+                    if (isCatalogBomRequired) {
+                        throw new IllegalArgumentException("Archive must 
contain a catalog.bom file in the root");
+                    } else {
+                        return;
+                    }
+                }
+                try {
+                    bomText = Streams.readFullyString(zf.getInputStream(bom));
+                } catch (IOException e) {
+                    throw new IllegalArgumentException("Error reading 
catalog.bom from ZIP/JAR archive: " + e);
+                }
+            } finally {
+                Streams.closeQuietly(zf);
             }
-            try {
-                bomText = Streams.readFullyString(zf.getInputStream(bom));
-            } catch (IOException e) {
-                throw new IllegalArgumentException("Error reading catalog.bom 
from ZIP/JAR archive: "+e);
-            }
-            discoveredBomVersionedName = 
BasicBrooklynCatalog.getVersionedName( 
BasicBrooklynCatalog.getCatalogMetadata(bomText), false );
-        } finally {
-            Streams.closeQuietly(zf);
         }
+
+        catalogMetadata = BasicBrooklynCatalog.getCatalogMetadata(bomText);
+        discoveredBomVersionedName = 
BasicBrooklynCatalog.getVersionedName(catalogMetadata, false );
+        
BrooklynBomYamlCatalogBundleResolver.setTagsAndIconUrl(catalogMetadata, 
inferredMetadata);
     }
     
     private void updateManifestFromAllSourceInformation() {
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 7d569dc146..8450b6e425 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
@@ -21,6 +21,7 @@ package org.apache.brooklyn.core.mgmt.internal;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Predicates;
+import org.apache.brooklyn.api.typereg.ManagedBundle;
 import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 import static 
org.apache.brooklyn.core.catalog.internal.CatalogUtils.newClassLoadingContextForCatalogItems;
 
@@ -132,10 +133,15 @@ public abstract class AbstractManagementContext 
implements ManagementContextInte
                         return seqLoader;
                     }
 
-                    return apply(internal.getManagementSupport());
+                    if (internal.getManagementSupport()==null) return null;
+                    return 
apply(internal.getManagementSupport().getManagementContext());
                 }
-                
+
                 if (input instanceof EntityManagementSupport) {
+                    // i think was only used by above, when there is no entity 
bundle; and now goes directly to mgmt context;
+                    // but just in case let's continue to support this, and 
prefer the entity if available
+                    if (((EntityManagementSupport) input).entity instanceof 
EntityInternal)
+                        return apply(((EntityManagementSupport) input).entity);
                     return apply(((EntityManagementSupport) 
input).getManagementContext());
                 }
 
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
index faa51f875c..fbdea2890f 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
@@ -25,6 +25,8 @@ import java.util.function.Supplier;
 import java.util.jar.Attributes;
 import java.util.jar.Manifest;
 import java.util.zip.ZipEntry;
+
+import org.apache.brooklyn.api.typereg.ManagedBundle;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.config.ConfigUtils;
 import org.apache.brooklyn.core.mgmt.BrooklynTags;
@@ -131,15 +133,7 @@ public class BrooklynBomYamlCatalogBundleResolver extends 
AbstractCatalogBundleR
             BasicManagedBundle basicManagedBundle = new 
BasicManagedBundle(vn.getSymbolicName(), vn.getVersionString(),
                     null, BrooklynBomBundleCatalogBundleResolver.FORMAT,
                     null, null, options.getDeleteable(), 
options.getFromInitialCatalog());
-            // if the submitted blueprint contains tags, we set them on the 
bundle, so they can be picked up and used to tag the plan.
-            if( cm.containsKey("tags") && cm.get("tags") instanceof Iterable) {
-                basicManagedBundle.tags().addTags((Iterable<?>)cm.get("tags"));
-            }
-            // Store the bundleIconUrl as an ICON_URL tag
-            Maybe<String> bundleIconUrl = ConfigUtils.getFirstAs(cm, 
String.class, "bundleIconUrl");
-            if (bundleIconUrl.isPresentAndNonNull()) {
-                
basicManagedBundle.tags().addTag(BrooklynTags.newIconUrlTag(bundleIconUrl.get()));
-            }
+            setTagsAndIconUrl(cm, basicManagedBundle);
             result = 
((ManagementContextInternal)mgmt).getOsgiManager().get().installBrooklynBomBundle(
                     basicManagedBundle, InputStreamSource.of("ZIP generated 
for "+vn+": "+bf, bf), options.isStart(), options.isLoadCatalogBom(), 
options.isForceUpdateOfNonSnapshots(),
                     options.isValidateTypes(), 
options.isDeferredStart()).get();
@@ -153,4 +147,18 @@ public class BrooklynBomYamlCatalogBundleResolver extends 
AbstractCatalogBundleR
         
((BasicBrooklynCatalog)mgmt.getCatalog()).uninstallEmptyWrapperBundles();
         return ReferenceWithError.newInstanceWithoutError(result);
     }
+
+    public static void setTagsAndIconUrl(Map<?, ?> properties, ManagedBundle 
managedBundle) {
+        if (properties==null) return;
+
+        // if the submitted blueprint contains tags, we set them on the 
bundle, so they can be picked up and used to tag the plan.
+        if( properties.containsKey("tags") && properties.get("tags") 
instanceof Iterable) {
+            managedBundle.tags().addTags((Iterable<?>) properties.get("tags"));
+        }
+        // Store the bundleIconUrl as an ICON_URL tag
+        Maybe<String> bundleIconUrl = ConfigUtils.getFirstAs(properties, 
String.class, "bundleIconUrl", "bundle_icon_url", "iconUrl", "icon_url");
+        if (bundleIconUrl.isPresentAndNonNull()) {
+            
managedBundle.tags().addTag(BrooklynTags.newIconUrlTag(bundleIconUrl.get()));
+        }
+    }
 }
diff --git 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
index d9dea6693f..e2d7fcffd9 100644
--- 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
+++ 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
@@ -36,6 +36,7 @@ import org.apache.brooklyn.api.objs.EntityAdjunct;
 import org.apache.brooklyn.api.typereg.ManagedBundle;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.mgmt.BrooklynTags;
+import 
org.apache.brooklyn.core.mgmt.classloading.OsgiBrooklynClassLoadingContext;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.ha.OsgiBundleInstallationResult;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
@@ -280,7 +281,8 @@ public class BundleResource extends 
AbstractBrooklynRestResource implements Bund
             // paths (ie non-protocol) and
             // NB, for security, file URL's are NOT served
             MediaType mime = 
WebResourceUtils.getImageMediaTypeFromExtension(Files.getFileExtension(url));
-            Object content = ResourceUtils.create(b).getResourceFromUrl(url);
+            OsgiBrooklynClassLoadingContext cl = new 
OsgiBrooklynClassLoadingContext(mgmt(), null, MutableList.of(b));
+            Object content = ResourceUtils.create(cl).getResourceFromUrl(url);
             return Response.ok(content, mime).build();
         }
 

Reply via email to