BROOKLYN-304: avoid json err serializing ClassLoader Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/04711a5d Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/04711a5d Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/04711a5d
Branch: refs/heads/master Commit: 04711a5d66906e496c0894769219fc35c408ed34 Parents: db16acb Author: Aled Sage <aled.s...@gmail.com> Authored: Thu Nov 10 14:14:32 2016 +0000 Committer: Aled Sage <aled.s...@gmail.com> Committed: Thu Nov 10 14:15:12 2016 +0000 ---------------------------------------------------------------------- .../util/core/json/BidiSerialization.java | 19 +++++++++++++++++++ .../core/json/BrooklynObjectsJsonMapper.java | 1 + .../base/ShellEnvironmentSerializerTest.java | 4 ++-- 3 files changed, 22 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/04711a5d/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java b/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java index 74a5cf4..8601904 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java @@ -273,4 +273,23 @@ public class BidiSerialization { return mgmt.getExecutionManager().getTask((String) values.get("id")); } } + + /** + * Serializes a classloader to just tell us about its type; cannot deserialize it again though! + * + * See https://issues.apache.org/jira/browse/BROOKLYN-304 - this new behaviour is better than the + * {@link OutOfMemoryError} we used to get. + */ + public static class ClassLoaderSerialization extends AbstractWithManagementContextSerialization<ClassLoader> { + public ClassLoaderSerialization(ManagementContext mgmt) { + super(ClassLoader.class, mgmt); + } + @Override + public void customWriteBody(ClassLoader value, JsonGenerator jgen, SerializerProvider provider) throws IOException { + } + @Override + protected ClassLoader customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException { + return null; + } + } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/04711a5d/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java b/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java index f6c5bee..37601a5 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java @@ -40,6 +40,7 @@ public class BrooklynObjectsJsonMapper { new BidiSerialization.EnricherSerialization(mgmt).install(mapperModule); new BidiSerialization.FeedSerialization(mgmt).install(mapperModule); new BidiSerialization.TaskSerialization(mgmt).install(mapperModule); + new BidiSerialization.ClassLoaderSerialization(mgmt).install(mapperModule); mapper.registerModule(new GuavaModule()).registerModule(mapperModule); return mapper; http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/04711a5d/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java index 5328ee5..4820b37 100644 --- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java +++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java @@ -61,9 +61,9 @@ public class ShellEnvironmentSerializerTest extends BrooklynAppUnitTestSupport { assertSerialize(ImmutableList.of(app), "[" + appExpected + "]"); assertSerialize(ImmutableMap.of("app", app), "{\"app\":" + appExpected + "}"); assertSerialize(mgmt, "{\"type\":\"org.apache.brooklyn.api.mgmt.ManagementContext\"}"); - // TODO Fails with java.lang.OutOfMemoryError: GC overhead limit exceeded // https://issues.apache.org/jira/browse/BROOKLYN-304 - // assertSerialize(getClass().getClassLoader(), "???"); + assertSerialize(getClass().getClassLoader(), "{\"type\":\""+getClass().getClassLoader().getClass().getCanonicalName()+"\"}"); + assertSerialize(getClass(), "class "+getClass().getName()); } private void assertSerialize(Object actual, String expected) {