Author: markt
Date: Fri Jul  5 08:13:06 2013
New Revision: 1499928

URL: http://svn.apache.org/r1499928
Log:
More unit tests for BeanNameELResolver
Fix several bugs
 - add missing exception handling to isReadOnly()
 - correct exception handling in setValue()
Modified:
    tomcat/trunk/java/javax/el/BeanNameELResolver.java
    tomcat/trunk/test/javax/el/TestBeanNameELResolver.java
    tomcat/trunk/test/javax/el/TesterBeanNameResolver.java

Modified: tomcat/trunk/java/javax/el/BeanNameELResolver.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/BeanNameELResolver.java?rev=1499928&r1=1499927&r2=1499928&view=diff
==============================================================================
--- tomcat/trunk/java/javax/el/BeanNameELResolver.java (original)
+++ tomcat/trunk/java/javax/el/BeanNameELResolver.java Fri Jul  5 08:13:06 2013
@@ -70,11 +70,21 @@ public class BeanNameELResolver extends 
         String beanName = (String) property;
 
         boolean isResolved = context.isPropertyResolved();
-        if (isReadOnly(context, base, property)) {
+
+        boolean isReadOnly;
+        try {
+            isReadOnly = isReadOnly(context, base, property);
+        } catch (Throwable t) {
+            Util.handleThrowable(t);
+            throw new ELException(t);
+        } finally {
+            context.setPropertyResolved(isResolved);
+        }
+
+        if (isReadOnly) {
             throw new PropertyNotWritableException(Util.message(context,
                     "beanNameELResolver.beanReadOnly", beanName));
         }
-        context.setPropertyResolved(isResolved);
 
         if (beanNameResolver.isNameResolved(beanName) ||
                 beanNameResolver.canCreateBean(beanName)) {
@@ -128,8 +138,15 @@ public class BeanNameELResolver extends 
         String beanName = (String) property;
 
         if (beanNameResolver.isNameResolved(beanName)) {
+            boolean result;
+            try {
+                result = beanNameResolver.isReadOnly(beanName);
+            } catch (Throwable t) {
+                Util.handleThrowable(t);
+                throw new ELException(t);
+            }
             context.setPropertyResolved(true);
-            return beanNameResolver.isReadOnly(beanName);
+            return result;
         }
 
         // Return value undefined

Modified: tomcat/trunk/test/javax/el/TestBeanNameELResolver.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/javax/el/TestBeanNameELResolver.java?rev=1499928&r1=1499927&r2=1499928&view=diff
==============================================================================
--- tomcat/trunk/test/javax/el/TestBeanNameELResolver.java (original)
+++ tomcat/trunk/test/javax/el/TestBeanNameELResolver.java Fri Jul  5 08:13:06 
2013
@@ -347,6 +347,127 @@ public class TestBeanNameELResolver {
     }
 
 
+    /**
+     * Tests that a null context results in an NPE as per EL Javadoc.
+     */
+    @Test(expected=NullPointerException.class)
+    public void testIsReadOnly01() {
+        BeanNameELResolver resolver = createBeanNameELResolver();
+        resolver.isReadOnly(null, new Object(), new Object());
+    }
+
+
+    /**
+     * Tests that a writable bean is reported as writable.
+     */
+    @Test
+    public void testIsReadOnly02() {
+
+        BeanNameELResolver resolver = createBeanNameELResolver();
+        ELContext context =
+                new StandardELContext(ELManager.getExpressionFactory());
+
+        boolean result = resolver.isReadOnly(context, null, BEAN01_NAME);
+
+        Assert.assertFalse(result);
+        Assert.assertTrue(context.isPropertyResolved());
+    }
+
+
+    /**
+     * Tests that a read-only bean is reported as not writable.
+     */
+    @Test
+    public void testIsReadOnly03() {
+
+        BeanNameELResolver resolver = createBeanNameELResolver();
+        ELContext context =
+                new StandardELContext(ELManager.getExpressionFactory());
+
+        boolean result = resolver.isReadOnly(context, null,
+                TesterBeanNameResolver.READ_ONLY_NAME);
+
+        Assert.assertTrue(result);
+        Assert.assertTrue(context.isPropertyResolved());
+    }
+
+
+    /**
+     * Tests that a valid bean is not resolved if base is non-null.
+     */
+    @Test
+    public void testIsReadOnly04() {
+
+        BeanNameELResolver resolver = createBeanNameELResolver();
+        ELContext context =
+                new StandardELContext(ELManager.getExpressionFactory());
+
+        resolver.isReadOnly(context, new Object(), BEAN01_NAME);
+
+        Assert.assertFalse(context.isPropertyResolved());
+    }
+
+
+    /**
+     * Tests that a valid bean is not resolved if property is not a String even
+     * if it can be coerced to a valid bean name.
+     */
+    @Test
+    public void testIsReadOnly05() {
+
+        BeanNameELResolver resolver = createBeanNameELResolver();
+        ELContext context =
+                new StandardELContext(ELManager.getExpressionFactory());
+
+        Object property = new Object() {
+            @Override
+            public String toString() {
+                return BEAN01_NAME;
+            }
+        };
+
+        resolver.isReadOnly(context, null, property);
+
+        Assert.assertFalse(context.isPropertyResolved());
+    }
+
+
+    /**
+     * Beans that don't exist should not resolve
+     */
+    @Test
+    public void testIsReadOnly06() {
+
+        BeanNameELResolver resolver = createBeanNameELResolver();
+        ELContext context =
+                new StandardELContext(ELManager.getExpressionFactory());
+
+        resolver.isReadOnly(context, null, BEAN99_NAME);
+
+        Assert.assertFalse(context.isPropertyResolved());
+    }
+
+
+    /**
+     * Exception during resolution should be wrapped and re-thrown.
+     */
+    @Test
+    public void testIsReadOnly07() {
+        doThrowableTest(TesterBeanNameResolver.EXCEPTION_TRIGGER_NAME,
+                MethodUnderTest.IS_READ_ONLY);
+    }
+
+
+    /**
+     * Throwable during resolution should be wrapped and re-thrown.
+     */
+    @Test
+    public void testIsReadOnly08() {
+        doThrowableTest(TesterBeanNameResolver.THROWABLE_TRIGGER_NAME,
+                MethodUnderTest.IS_READ_ONLY);
+    }
+
+
     private void doThrowableTest(String trigger, MethodUnderTest method) {
         BeanNameELResolver resolver = createBeanNameELResolver();
         ELContext context =
@@ -367,6 +488,10 @@ public class TestBeanNameELResolver {
                     resolver.getType(context, null, trigger);
                     break;
                 }
+                case IS_READ_ONLY: {
+                    resolver.isReadOnly(context, null, trigger);
+                    break;
+                }
                 default: {
                     // Should never happen
                     Assert.fail("Missing case for method");
@@ -431,6 +556,7 @@ public class TestBeanNameELResolver {
     private static enum MethodUnderTest {
         GET_VALUE,
         SET_VALUE,
-        GET_TYPE
+        GET_TYPE,
+        IS_READ_ONLY
     }
 }

Modified: tomcat/trunk/test/javax/el/TesterBeanNameResolver.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/javax/el/TesterBeanNameResolver.java?rev=1499928&r1=1499927&r2=1499928&view=diff
==============================================================================
--- tomcat/trunk/test/javax/el/TesterBeanNameResolver.java (original)
+++ tomcat/trunk/test/javax/el/TesterBeanNameResolver.java Fri Jul  5 08:13:06 
2013
@@ -57,6 +57,7 @@ public class TesterBeanNameResolver exte
 
     @Override
     public boolean canCreateBean(String beanName) {
+        checkTriggers(beanName);
         return allowCreate;
     }
 
@@ -67,6 +68,7 @@ public class TesterBeanNameResolver exte
 
     @Override
     public boolean isReadOnly(String beanName) {
+        checkTriggers(beanName);
         return READ_ONLY_NAME.equals(beanName);
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to