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 2017/04/21 22:55:35 UTC

[16/39] brooklyn-server git commit: Use newClassLoadingContextForCatalogItems where possible.

Use newClassLoadingContextForCatalogItems where possible.

https://github.com/apache/brooklyn-server/pull/338/files#r94623208

Use in

org.apache.brooklyn.util.core.ClassLoaderUtils#load
org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore#getCustomClassLoaderForBrooklynObject
org.apache.brooklyn.core.catalog.internal.JavaCatalogToSpecTransformer#createCatalogSpec

Not doing XmlMementoSerializer as it is calling
  newClassLoadingContext(ManagementContext mgmt, RegisteredType item)
rather than
  newClassLoadingContext(ManagementContext mgmt, CatalogItem<?, ?> item),
and the hierarchy is not available on RegisteredType.


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

Branch: refs/heads/master
Commit: 3257c846dd21d1b1dada9c480ef7f6e68f3bd03c
Parents: 584efcc
Author: Geoff Macartney <ge...@cloudsoftcorp.com>
Authored: Wed Mar 8 12:17:57 2017 +0000
Committer: Geoff Macartney <ge...@cloudsoftcorp.com>
Committed: Thu Apr 20 11:20:36 2017 +0100

----------------------------------------------------------------------
 .../internal/JavaCatalogToSpecTransformer.java  |  2 +-
 .../BrooklynMementoPersisterToObjectStore.java  | 10 ++++--
 .../brooklyn/util/core/ClassLoaderUtils.java    | 36 +++++++++++++-------
 3 files changed, 32 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3257c846/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 4e15d24..a990c2f 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
@@ -81,7 +81,7 @@ public class JavaCatalogToSpecTransformer implements PlanToSpecTransformer {
                 // 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(javaType);
+                type = CatalogUtils.newClassLoadingContextForCatalogItems(mgmt, item.getCatalogItemHierarchy()).loadClass(javaType);
             } catch (Exception e) {
                 Exceptions.propagateIfFatal(e);
                 throw new IllegalStateException("Unable to load old-style java catalog item type " + javaType + " for item " + item, e);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3257c846/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 1be1c2c..d9cafdc 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
@@ -173,7 +173,8 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
         return result;
     }
     
-    @Nullable protected ClassLoader getCustomClassLoaderForBrooklynObject(LookupContext lookupContext, BrooklynObjectType type, String objectId) {
+    @Nullable protected ClassLoader getCustomClassLoaderForBrooklynObject(LookupContext lookupContext,
+                                                                          BrooklynObjectType type, String objectId) {
         BrooklynObject item = lookupContext.peek(type, objectId);
         String catalogItemId = (item == null) ? null : item.getCatalogItemId();
         // TODO enrichers etc aren't yet known -- would need to backtrack to the entity to get them from bundles
@@ -185,10 +186,13 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
         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");
+            LOG.warn("Unable to load catalog item "+catalogItemId
+                +" for custom class loader of " + type + " " + objectId + "; will use default class loader");
             return null;
         } else {
-            return ClassLoaderFromBrooklynClassLoadingContext.of(CatalogUtils.newClassLoadingContext(lookupContext.lookupManagementContext(), catalogItem));
+            return ClassLoaderFromBrooklynClassLoadingContext.of(
+                CatalogUtils.newClassLoadingContextForCatalogItems(lookupContext.lookupManagementContext(),
+                    item.getCatalogItemHierarchy()));
         }
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3257c846/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
index afb45ba..d262969 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
@@ -63,7 +63,8 @@ public class ClassLoaderUtils {
      */
     static final String WHITE_LIST_KEY = "org.apache.brooklyn.classloader.fallback.bundles";
     static final String CLASS_NAME_DELIMITER = ":";
-    private static final String WHITE_LIST_DEFAULT = "org\\.apache\\.brooklyn\\..*:" + OsgiUtils.toOsgiVersion(BrooklynVersion.get());
+    private static final String WHITE_LIST_DEFAULT =
+        "org\\.apache\\.brooklyn\\..*:" + OsgiUtils.toOsgiVersion(BrooklynVersion.get());
 
     // Class.forName gets the class loader from the calling class.
     // We don't have access to the same reflection API so need to pass it explicitly.
@@ -122,7 +123,8 @@ public class ClassLoaderUtils {
      * <ul>
      *   <li>{@code <classname>}, such as {@code com.google.common.net.HostAndPort}
      *   <li>{@code <bunde-symbolicName>:<classname>}, such as {@code com.google.guava:com.google.common.net.HostAndPort}
-     *   <li>{@code <bunde-symbolicName>:<bundle-version>:<classname>}, such as {@code com.google.guava:16.0.1:com.google.common.net.HostAndPort}
+     *   <li>{@code <bunde-symbolicName>:<bundle-version>:<classname>}, such as
+     *   {@code com.google.guava:16.0.1:com.google.common.net.HostAndPort}
      * </ul>
      * 
      * The classloading order is as follows:
@@ -153,7 +155,8 @@ public class ClassLoaderUtils {
         if (cls.isPresent()) {
             return cls.get();
         } else {
-            throw new ClassNotFoundException("Class " + name + " not found on the application class path, nor in the bundle white list.", getReturnException(cls));
+            throw new ClassNotFoundException("Class " + name +
+                " not found on the application class path, nor in the bundle white list.", getReturnException(cls));
         }
     }
 
@@ -161,7 +164,8 @@ public class ClassLoaderUtils {
         try {
             return tryLoadFromBundle(ClassLoaderDispatcher.INSTANCE, symbolicName, version, className).get();
         } catch (IllegalStateException e) {
-            throw new ClassNotFoundException("Class " + className + " could not be loaded from bundle " + toBundleString(symbolicName, version), e);
+            throw new ClassNotFoundException("Class " + className + " could not be loaded from bundle "
+                + toBundleString(symbolicName, version), e);
         }
     }
 
@@ -176,7 +180,8 @@ public class ClassLoaderUtils {
     }
 
     /**
-     * Finds all the resources with the given name. Aborts going through subsequent fallbacks when it finds at least one resource.
+     * Finds all the resources with the given name.
+     * Aborts going through subsequent fallbacks when it finds at least one resource.
      * @see {@link #loadClass(String)} for loading order
      * 
      * @return empty {@link Iterable} when no resources find
@@ -198,7 +203,8 @@ public class ClassLoaderUtils {
         if (looksLikeBundledClassName(name)) {
             String[] arr = name.split(CLASS_NAME_DELIMITER);
             if (arr.length > 3) {
-                throw new IllegalStateException("'" + name + "' doesn't look like a class name and contains too many colons to be parsed as bundle:version:class triple.");
+                throw new IllegalStateException("'" + name +
+                    "' doesn't look like a class name and contains too many colons to be parsed as bundle:version:class triple.");
             } else if (arr.length == 3) {
                 symbolicName = arr[0];
                 version = arr[1];
@@ -208,7 +214,8 @@ public class ClassLoaderUtils {
                 version = null;
                 className = arr[1];
             } else {
-                throw new IllegalStateException("'" + name + "' contains a bundle:version:class delimiter, but only one of those specified");
+                throw new IllegalStateException("'" + name +
+                    "' contains a bundle:version:class delimiter, but only one of those specified");
             }
         } else {
             symbolicName = null;
@@ -247,13 +254,15 @@ public class ClassLoaderUtils {
             if (catalogItemId != null) {
                 CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt, catalogItemId);
                 if (item != null) {
-                    BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(mgmt, item);
+                    BrooklynClassLoadingContext loader =
+                        CatalogUtils.newClassLoadingContextForCatalogItems(mgmt, item.getCatalogItemHierarchy());
                     cls = dispatcher.tryLoadFrom(loader, className);
                     if (cls.isPresent()) {
                         return cls;
                     }
                 } else {
-                    log.warn("Entity " + entity + " refers to non-existent catalog item " + catalogItemId + ". Trying to load class " + name);
+                    log.warn("Entity " + entity + " refers to non-existent catalog item " + catalogItemId +
+                        ". Trying to load class " + name);
                 }
             }
         }
@@ -278,7 +287,8 @@ public class ClassLoaderUtils {
         return Maybe.absentNull();
     }
 
-    protected <T> Maybe<T> tryLoadFromBundle(LoaderDispatcher<T> dispatcher, String symbolicName, String version, String name) {
+    protected <T> Maybe<T> tryLoadFromBundle(LoaderDispatcher<T> dispatcher, String symbolicName, String version,
+                                             String name) {
         Framework framework = getFramework();
         if (framework != null) {
             Maybe<Bundle> bundle = Osgis.bundleFinder(framework)
@@ -286,7 +296,8 @@ public class ClassLoaderUtils {
                 .version(OsgiUtils.toOsgiVersion(version))
                 .find();
             if (bundle.isAbsent()) {
-                throw new IllegalStateException("Bundle " + toBundleString(symbolicName, version) + " not found to load " + name);
+                throw new IllegalStateException("Bundle " + toBundleString(symbolicName, version)
+                    + " not found to load " + name);
             }
             return dispatcher.tryLoadFrom(bundle.get(), name);
         } else {
@@ -364,7 +375,8 @@ public class ClassLoaderUtils {
         String symbolicName = arr[0];
         String version = null;
         if (arr.length > 2) {
-            throw new IllegalStateException("Class loading fallback bundle white list '" + whiteList + "' not in the expected format <symbolic name regex>[:<version regex>].");
+            throw new IllegalStateException("Class loading fallback bundle white list '" + whiteList +
+                "' not in the expected format <symbolic name regex>[:<version regex>].");
         } else if (arr.length == 2) {
             version = arr[1];
         }