You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sv...@apache.org on 2016/07/11 12:45:50 UTC
[4/8] brooklyn-server git commit: Handle wrapped
ClassNotFoundException
Handle wrapped ClassNotFoundException
And try not to wrap it!
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/77357873
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/77357873
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/77357873
Branch: refs/heads/master
Commit: 77357873a1feec996cd6b3f8e98f01e6999c70ea
Parents: 2654305
Author: Aled Sage <al...@gmail.com>
Authored: Thu Jul 7 23:05:38 2016 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Sat Jul 9 10:58:36 2016 +0100
----------------------------------------------------------------------
...ssLoaderFromBrooklynClassLoadingContext.java | 11 ++--
.../brooklyn/util/core/ClassLoaderUtils.java | 23 ++++---
...aderFromBrooklynClassLoadingContextTest.java | 65 ++++++++++++++++++++
3 files changed, 87 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/77357873/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContext.java
index f36e2ac..35d3b05 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContext.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContext.java
@@ -21,6 +21,7 @@ package org.apache.brooklyn.core.mgmt.classloading;
import java.net.URL;
import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
+import org.apache.brooklyn.util.guava.Maybe;
public class ClassLoaderFromBrooklynClassLoadingContext extends ClassLoader {
@@ -36,15 +37,15 @@ public class ClassLoaderFromBrooklynClassLoadingContext extends ClassLoader {
}
@Override
- public Class<?> findClass(String className) throws ClassNotFoundException {
- Class<?> result = clc.loadClass(className);
- if (result!=null) return result;
+ protected Class<?> findClass(String className) throws ClassNotFoundException {
+ Maybe<Class<?>> result = clc.tryLoadClass(className);
+ if (result.isPresent()) return result.get();
// last resort. see comment in XStream CompositeClassLoader
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
if (contextClassLoader != null) {
- result = contextClassLoader.loadClass(className);
- if (result!=null) return result;
+ Class<?> result2 = contextClassLoader.loadClass(className);
+ if (result2 != null) return result2;
}
return null;
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/77357873/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 b46f68d..b6d39e9 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
@@ -172,13 +172,7 @@ public class ClassLoaderUtils {
try {
return loader.loadClass(className);
} catch (IllegalStateException e) {
- ClassNotFoundException cnfe = Exceptions.getFirstThrowableOfType(e, ClassNotFoundException.class);
- NoClassDefFoundError ncdfe = Exceptions.getFirstThrowableOfType(e, NoClassDefFoundError.class);
- if (cnfe == null && ncdfe == null) {
- throw e;
- } else {
- // ignore, fall back to Class.forName(...)
- }
+ propagateIfCauseNotClassNotFound(e);
}
} else {
log.warn("Entity " + entity + " refers to non-existent catalog item " + catalogItemId + ". Trying to load class " + name);
@@ -196,12 +190,16 @@ public class ClassLoaderUtils {
// Note that Class.forName(name, false, classLoader) doesn't seem to like us returning a
// class with a different name from that intended (e.g. stripping off an OSGi prefix).
return classLoader.loadClass(className);
+ } catch (IllegalStateException e) {
+ propagateIfCauseNotClassNotFound(e);
} catch (ClassNotFoundException e) {
}
if (mgmt != null) {
try {
return mgmt.getCatalogClassLoader().loadClass(name);
+ } catch (IllegalStateException e) {
+ propagateIfCauseNotClassNotFound(e);
} catch (ClassNotFoundException e) {
}
}
@@ -214,6 +212,17 @@ public class ClassLoaderUtils {
}
}
+ protected void propagateIfCauseNotClassNotFound(IllegalStateException e) {
+ // TODO loadClass() should not throw IllegalStateException; should throw ClassNotFoundException without wrapping.
+ ClassNotFoundException cnfe = Exceptions.getFirstThrowableOfType(e, ClassNotFoundException.class);
+ NoClassDefFoundError ncdfe = Exceptions.getFirstThrowableOfType(e, NoClassDefFoundError.class);
+ if (cnfe == null && ncdfe == null) {
+ throw e;
+ } else {
+ // ignore, try next way of loading
+ }
+ }
+
public Class<?> loadClass(String symbolicName, @Nullable String version, String className) throws ClassNotFoundException {
Framework framework = getFramework();
if (framework != null) {
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/77357873/core/src/test/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContextTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContextTest.java
new file mode 100644
index 0000000..997ff5c
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContextTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2016 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.brooklyn.core.mgmt.classloading;
+
+import org.apache.brooklyn.api.catalog.CatalogItem;
+import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
+import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
+import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
+import org.apache.brooklyn.entity.stock.BasicApplication;
+import org.apache.brooklyn.test.Asserts;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+public class ClassLoaderFromBrooklynClassLoadingContextTest {
+
+ private LocalManagementContext mgmt;
+ private CatalogItem<?, ?> item;
+ private ClassLoaderFromBrooklynClassLoadingContext loader;
+
+ @BeforeMethod(alwaysRun=true)
+ @SuppressWarnings("deprecation")
+ public void setUp() throws Exception {
+ mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build();
+ item = mgmt.getCatalog().addItem(BasicApplication.class);
+
+ BrooklynClassLoadingContext clc = new OsgiBrooklynClassLoadingContext(mgmt, item.getCatalogItemId(), ImmutableList.<OsgiBundleWithUrl>of());
+ loader = new ClassLoaderFromBrooklynClassLoadingContext(clc);
+ }
+
+ @AfterMethod(alwaysRun=true)
+ public void tearDown() throws Exception {
+ if (mgmt != null) {
+ Entities.destroyAll(mgmt);
+ mgmt = null;
+ }
+ }
+
+ @Test
+ public void testLoadNonExistantClassThrowsClassNotFound() throws Exception {
+ try {
+ loader.loadClass("my.clazz.does.not.Exist");
+ Asserts.shouldHaveFailedPreviously();
+ } catch (ClassNotFoundException e) {
+ // success;
+ }
+ }
+}