Persistence hacks
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/a4930f02 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/a4930f02 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/a4930f02 Branch: refs/heads/master Commit: a4930f02734c80846ae6c7a7469ead9a145ccd5b Parents: c3dc6e8 Author: Svetoslav Neykov <[email protected]> Authored: Wed Jul 6 17:37:19 2016 +0300 Committer: Aled Sage <[email protected]> Committed: Sat Jul 9 10:58:36 2016 +0100 ---------------------------------------------------------------------- .../core/mgmt/persist/XmlMementoSerializer.java | 16 +++++++++++- .../core/mgmt/rebind/RebindIteration.java | 26 +++++++++++++++++--- .../brooklyn/util/core/ClassLoaderUtils.java | 20 +++++++++------ .../src/main/resources/etc/default.catalog.bom | 2 +- 4 files changed, 52 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a4930f02/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java index e9085dc..58df79f 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializer.java @@ -60,6 +60,7 @@ import org.apache.brooklyn.core.mgmt.rebind.dto.BasicLocationMemento; import org.apache.brooklyn.core.mgmt.rebind.dto.BasicPolicyMemento; import org.apache.brooklyn.core.mgmt.rebind.dto.MutableBrooklynMemento; import org.apache.brooklyn.core.sensor.BasicAttributeSensor; +import org.apache.brooklyn.util.core.ClassLoaderUtils; import org.apache.brooklyn.util.core.xstream.XmlSerializer; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.text.Strings; @@ -94,10 +95,23 @@ public class XmlMementoSerializer<T> extends XmlSerializer<T> implements Memento this(classLoader, DeserializingClassRenamesProvider.loadDeserializingClassRenames()); } + private static class CustomClassLoader extends ClassLoader { + private ClassLoaderUtils loader; + private CustomClassLoader(ClassLoader cl) { + loader = new ClassLoaderUtils(cl); + } + + @Override + protected Class<?> findClass(String name) throws ClassNotFoundException { + return loader.loadClass(name); + } + + } + public XmlMementoSerializer(ClassLoader classLoader, Map<String, String> deserializingClassRenames) { super(deserializingClassRenames); this.classLoader = checkNotNull(classLoader, "classLoader"); - xstream.setClassLoader(this.classLoader); + xstream.setClassLoader(new CustomClassLoader(this.classLoader)); // old (deprecated in 070? or earlier) single-file persistence uses this keyword; TODO remove soon in 080 ? xstream.alias("brooklyn", MutableBrooklynMemento.class); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a4930f02/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java index 6c0bd9d..1f1ac2e 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java @@ -91,10 +91,12 @@ import org.apache.brooklyn.core.objs.proxy.InternalPolicyFactory; import org.apache.brooklyn.core.policy.AbstractPolicy; import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.collections.MutableMap; +import org.apache.brooklyn.util.core.ClassLoaderUtils; import org.apache.brooklyn.util.core.flags.FlagUtils; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.javalang.Reflections; +import org.apache.brooklyn.util.javalang.Reflections.ReflectionNotFoundException; import org.apache.brooklyn.util.text.Strings; import org.apache.brooklyn.util.time.Duration; import org.apache.brooklyn.util.time.Time; @@ -956,7 +958,7 @@ public abstract class RebindIteration { } try { - return new LoadedClass<T>((Class<T>)reflections.loadClass(jType), catalogItemId); + return new LoadedClass<T>((Class<T>)loadClass(jType), catalogItemId); } catch (Exception e) { Exceptions.propagateIfFatal(e); LOG.warn("Unable to load "+jType+" using reflections; will try standard context"); @@ -980,11 +982,29 @@ public abstract class RebindIteration { } } + protected Class<?> loadClass(String jType) throws ClassNotFoundException { + try { + return reflections.loadClass(jType); + } catch (Exception e) { + Exceptions.propagateIfFatal(e); + } + return new ClassLoaderUtils(reflections.getClassLoader()).loadClass(jType); + } + + @SuppressWarnings("unchecked") + public <T> Class<? extends T> loadClass(String classname, Class<T> superType) { + try { + return (Class<? extends T>) loadClass(classname); + } catch (ClassNotFoundException e) { + throw Exceptions.propagate(e); + } + } + /** * Constructs a new location, passing to its constructor the location id and all of memento.getFlags(). */ protected Location newLocation(String locationId, String locationType) { - Class<? extends Location> locationClazz = reflections.loadClass(locationType, Location.class); + Class<? extends Location> locationClazz = loadClass(locationType, Location.class); if (InternalFactory.isNewStyle(locationClazz)) { // Not using loationManager.createLocation(LocationSpec) because don't want init() to be called @@ -1110,7 +1130,7 @@ public abstract class RebindIteration { String id = memento.getId(); // catalog item subtypes are internal to brooklyn, not in osgi String itemType = checkNotNull(memento.getType(), "catalog item type of %s must not be null in memento", id); - Class<? extends CatalogItem> clazz = reflections.loadClass(itemType, CatalogItem.class); + Class<? extends CatalogItem> clazz = loadClass(itemType, CatalogItem.class); return invokeConstructor(reflections, clazz, new Object[]{}); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a4930f02/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 644f07a..00fd05f 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 @@ -57,7 +57,7 @@ public class ClassLoaderUtils { // 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. - private final Class<?> callingClass; + private final ClassLoader classLoader; private final Entity entity; private final ManagementContext mgmt; @@ -69,19 +69,25 @@ public class ClassLoaderUtils { } public ClassLoaderUtils(Class<?> callingClass) { - this.callingClass = callingClass; + this.classLoader = callingClass.getClassLoader(); + this.entity = null; + this.mgmt = null; + } + + public ClassLoaderUtils(ClassLoader cl) { + this.classLoader = cl; this.entity = null; this.mgmt = null; } public ClassLoaderUtils(Class<?> callingClass, Entity entity) { - this.callingClass = callingClass; + this.classLoader = callingClass.getClassLoader(); this.entity = entity; this.mgmt = ((EntityInternal)entity).getManagementContext(); } public ClassLoaderUtils(Class<?> callingClass, @Nullable ManagementContext mgmt) { - this.callingClass = callingClass; + this.classLoader = callingClass.getClassLoader(); this.entity = null; this.mgmt = mgmt; } @@ -132,8 +138,8 @@ public class ClassLoaderUtils { } try { - // Used instead of callingClass.getClassLoader() as it could be null (only for bootstrap classes) - return Class.forName(name, true, callingClass.getClassLoader()); + // Used instead of callingClass.getClassLoader().loadClass(...) as it could be null (only for bootstrap classes) + return Class.forName(name, true, classLoader); } catch (ClassNotFoundException e) { } @@ -171,7 +177,7 @@ public class ClassLoaderUtils { } return SystemFrameworkLoader.get().loadClassFromBundle(className, bundle.get()); } else { - return Class.forName(className); + return Class.forName(className, true, classLoader); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a4930f02/karaf/apache-brooklyn/src/main/resources/etc/default.catalog.bom ---------------------------------------------------------------------- diff --git a/karaf/apache-brooklyn/src/main/resources/etc/default.catalog.bom b/karaf/apache-brooklyn/src/main/resources/etc/default.catalog.bom index 8184c6e..e1cfe99 100644 --- a/karaf/apache-brooklyn/src/main/resources/etc/default.catalog.bom +++ b/karaf/apache-brooklyn/src/main/resources/etc/default.catalog.bom @@ -7,7 +7,7 @@ brooklyn.catalog: items: - brooklyn.libraries: - name: org.apache.brooklyn.karaf-init - version: 0.10.0.SNAPSHOT # BROOKLYN_VERSION + version: "0.10.0.SNAPSHOT" # BROOKLYN_VERSION include: classpath://catalog-classes.bom - id: server
