Author: markt Date: Thu Jul 4 19:55:19 2013 New Revision: 1499849 URL: http://svn.apache.org/r1499849 Log: More unit tests for BeanNameELResolver and fix another exception handling problem identified by the new tests. Also fix a problem found with setValue where the context's isResolved property could be incorrectly set to true.
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=1499849&r1=1499848&r2=1499849&view=diff ============================================================================== --- tomcat/trunk/java/javax/el/BeanNameELResolver.java (original) +++ tomcat/trunk/java/javax/el/BeanNameELResolver.java Thu Jul 4 19:55:19 2013 @@ -69,15 +69,22 @@ public class BeanNameELResolver extends String beanName = (String) property; + boolean isResolved = context.isPropertyResolved(); if (isReadOnly(context, base, property)) { throw new PropertyNotWritableException(Util.message(context, "beanNameELResolver.beanReadOnly", beanName)); } + context.setPropertyResolved(isResolved); if (beanNameResolver.isNameResolved(beanName) || beanNameResolver.canCreateBean(beanName)) { - context.setPropertyResolved(true); - beanNameResolver.setBeanValue(beanName, value); + try { + beanNameResolver.setBeanValue(beanName, value); + context.setPropertyResolved(true); + } catch (Throwable t) { + Util.handleThrowable(t); + throw new ELException(t); + } } } Modified: tomcat/trunk/test/javax/el/TestBeanNameELResolver.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/javax/el/TestBeanNameELResolver.java?rev=1499849&r1=1499848&r2=1499849&view=diff ============================================================================== --- tomcat/trunk/test/javax/el/TestBeanNameELResolver.java (original) +++ tomcat/trunk/test/javax/el/TestBeanNameELResolver.java Thu Jul 4 19:55:19 2013 @@ -140,7 +140,8 @@ public class TestBeanNameELResolver { */ @Test public void testGetValue06() { - doGetValueThrowableTest(TesterBeanNameResolver.EXCEPTION_TRIGGER_NAME); + doThrowableTest(TesterBeanNameResolver.EXCEPTION_TRIGGER_NAME, + MethodUnderTest.GET_VALUE); } @@ -149,28 +150,8 @@ public class TestBeanNameELResolver { */ @Test public void testGetValue07() { - doGetValueThrowableTest(TesterBeanNameResolver.THROWABLE_TRIGGER_NAME); - } - - - private void doGetValueThrowableTest(String trigger) { - BeanNameELResolver resolver = createBeanNameELResolver(); - ELContext context = - new StandardELContext(ELManager.getExpressionFactory()); - - ELException elException = null; - try { - resolver.getValue(context, null,trigger); - } catch (ELException e) { - elException = e; - } - - Assert.assertFalse(context.isPropertyResolved()); - Assert.assertNotNull(elException); - - @SuppressWarnings("null") // Can't be null due to assertion above - Throwable cause = elException.getCause(); - Assert.assertNotNull(cause); + doThrowableTest(TesterBeanNameResolver.THROWABLE_TRIGGER_NAME, + MethodUnderTest.GET_VALUE); } @@ -241,6 +222,61 @@ public class TestBeanNameELResolver { /** + * Exception during resolution should be wrapped and re-thrown. + */ + @Test + public void testGetValue08() { + doThrowableTest(TesterBeanNameResolver.EXCEPTION_TRIGGER_NAME, + MethodUnderTest.SET_VALUE); + } + + + /** + * Throwable during resolution should be wrapped and re-thrown. + */ + @Test + public void testGetValue09() { + doThrowableTest(TesterBeanNameResolver.THROWABLE_TRIGGER_NAME, + MethodUnderTest.SET_VALUE); + } + + + private void doThrowableTest(String trigger, MethodUnderTest method) { + BeanNameELResolver resolver = createBeanNameELResolver(); + ELContext context = + new StandardELContext(ELManager.getExpressionFactory()); + + ELException elException = null; + try { + switch (method) { + case GET_VALUE: { + resolver.getValue(context, null, trigger); + break; + } + case SET_VALUE: { + resolver.setValue(context, null, trigger, new Object()); + break; + } + default: { + // Should never happen + Assert.fail("Missing case for method"); + } + } + + } catch (ELException e) { + elException = e; + } + + Assert.assertFalse(context.isPropertyResolved()); + Assert.assertNotNull(elException); + + @SuppressWarnings("null") // Can't be null due to assertion above + Throwable cause = elException.getCause(); + Assert.assertNotNull(cause); + } + + + /** * Tests adding/replacing beans beans */ private void doSetValueCreateReplaceTest(boolean canCreate, @@ -280,4 +316,10 @@ public class TestBeanNameELResolver { Assert.assertEquals(BEAN01, bean); } } + + + private static enum MethodUnderTest { + GET_VALUE, + SET_VALUE + } } Modified: tomcat/trunk/test/javax/el/TesterBeanNameResolver.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/javax/el/TesterBeanNameResolver.java?rev=1499849&r1=1499848&r2=1499849&view=diff ============================================================================== --- tomcat/trunk/test/javax/el/TesterBeanNameResolver.java (original) +++ tomcat/trunk/test/javax/el/TesterBeanNameResolver.java Thu Jul 4 19:55:19 2013 @@ -38,6 +38,7 @@ public class TesterBeanNameResolver exte @Override public void setBeanValue(String beanName, Object value) throws PropertyNotWritableException { + checkTriggers(beanName); if (allowCreate || beans.containsKey(beanName)) { beans.put(beanName, value); } @@ -50,12 +51,7 @@ public class TesterBeanNameResolver exte @Override public Object getBean(String beanName) { - if (EXCEPTION_TRIGGER_NAME.equals(beanName)) { - throw new RuntimeException(); - } - if (THROWABLE_TRIGGER_NAME.equals(beanName)) { - throw new Error(); - } + checkTriggers(beanName); return beans.get(beanName); } @@ -73,4 +69,13 @@ public class TesterBeanNameResolver exte public boolean isReadOnly(String beanName) { return READ_ONLY_NAME.equals(beanName); } + + private void checkTriggers(String beanName) { + if (EXCEPTION_TRIGGER_NAME.equals(beanName)) { + throw new RuntimeException(); + } + if (THROWABLE_TRIGGER_NAME.equals(beanName)) { + throw new Error(); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org