From 68805e5c26702b900c52ec21ed7b21d8239b098f Mon Sep 17 00:00:00 2001 From: Iwao AVE! Date: Thu, 5 Dec 2019 21:38:29 +0900 Subject: [PATCH] DefaultClassResolver should resolve classes in the default package --- src/main/java/ognl/DefaultClassResolver.java | 20 +++++++-- src/test/java/ClassInDefaultPackage.java | 4 ++ .../java/ognl/DefaultClassResolverTest.java | 41 +++++++++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 src/test/java/ClassInDefaultPackage.java create mode 100644 src/test/java/ognl/DefaultClassResolverTest.java diff --git a/src/main/java/ognl/DefaultClassResolver.java b/src/main/java/ognl/DefaultClassResolver.java index 2ba52e15..7ec2d36f 100644 --- a/src/main/java/ognl/DefaultClassResolver.java +++ b/src/main/java/ognl/DefaultClassResolver.java @@ -42,7 +42,7 @@ */ public class DefaultClassResolver extends Object implements ClassResolver { - private final Map classes = new ConcurrentHashMap<>(101); + private final ConcurrentHashMap classes = new ConcurrentHashMap<>(101); public DefaultClassResolver() { @@ -55,8 +55,22 @@ public Class classForName(String className, Map context) throws ClassNotFoundExc if (result != null) { return result; } - result = (className.indexOf('.') == -1) ? toClassForName("java.lang." + className) : toClassForName(className); - classes.put(className, result); + try { + result = toClassForName(className); + } catch (ClassNotFoundException e) { + if (className.indexOf('.') > -1) { + throw e; + } + // The class was not in the default package. + // Try prepending 'java.lang.'. + try { + result = toClassForName("java.lang." + className); + } catch (ClassNotFoundException e2) { + // Report the specified class name as-is. + throw e; + } + } + classes.putIfAbsent(className, result); return result; } diff --git a/src/test/java/ClassInDefaultPackage.java b/src/test/java/ClassInDefaultPackage.java new file mode 100644 index 00000000..87b11e55 --- /dev/null +++ b/src/test/java/ClassInDefaultPackage.java @@ -0,0 +1,4 @@ + +class ClassInDefaultPackage { + public static final int CONST = 99; +} diff --git a/src/test/java/ognl/DefaultClassResolverTest.java b/src/test/java/ognl/DefaultClassResolverTest.java new file mode 100644 index 00000000..34346f01 --- /dev/null +++ b/src/test/java/ognl/DefaultClassResolverTest.java @@ -0,0 +1,41 @@ +package ognl; + +import junit.framework.TestCase; + +public class DefaultClassResolverTest extends TestCase { + + public void testClassInDefaultPackageResolution() throws Exception { + DefaultClassResolver resolver = new DefaultClassResolver(); + OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null, + new DefaultMemberAccess(false)); + assertNotNull(resolver.classForName("ClassInDefaultPackage", context)); + } + + public void testEnsureClassNotFoundException() throws Exception { + DefaultClassResolver resolver = new DefaultClassResolver(); + OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null, + new DefaultMemberAccess(false)); + try { + resolver.classForName("no.such.Class", context); + fail("Expected ClassNotFoundException as the specified class does not exist."); + } catch (Exception e) { + assertEquals(ClassNotFoundException.class, e.getClass()); + assertEquals("no.such.Class", e.getMessage()); + } + } + + public void testEnsureClassNotFoundExceptionReportsSpecifiedName() + throws Exception { + DefaultClassResolver resolver = new DefaultClassResolver(); + OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null, + new DefaultMemberAccess(false)); + try { + resolver.classForName("BogusClass", context); + fail("Expected ClassNotFoundException as the specified class does not exist."); + } catch (Exception e) { + assertEquals(ClassNotFoundException.class, e.getClass()); + assertEquals("BogusClass", e.getMessage()); + } + } + +}